@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
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useReducer } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { Link as LinkIcon } from "lucide-react";
5
+ import { getElementWorldBounds } from "@oh-just-another/scene";
6
+ import { useDiagramOptional } from "../core/hooks.js";
7
+ import { useQuietViewport } from "../core/use-quiet-viewport.js";
8
+ import { usePortalContainer } from "../core/portal-container.js";
9
+ import { BADGE_ICON } from "../core/constants.js";
10
+ /**
11
+ * Persistent link badges. Every element carrying a (safe) `href` shows a
12
+ * small chip anchored to its top-right corner, so links are discoverable
13
+ * without hovering — the hover popup and Cmd/Ctrl-click remain the detail /
14
+ * open affordances. Clicking the badge opens the link via `editor.openLink`
15
+ * (scheme already validated by `elementLink`). Also shown in read-only mode:
16
+ * following links is a viewing feature, not an edit.
17
+ *
18
+ * Positions are computed from world bounds + viewport on every editor
19
+ * change, so badges track pan / zoom / move. Portaled to the overlay
20
+ * container like the hover popup.
21
+ */
22
+ export const LinkBadges = () => {
23
+ const editor = useDiagramOptional();
24
+ const [, bump] = useReducer((x) => x + 1, 0);
25
+ const portalContainer = usePortalContainer();
26
+ const quiet = useQuietViewport(editor);
27
+ useEffect(() => {
28
+ if (!editor)
29
+ return undefined;
30
+ return editor.on("change", () => {
31
+ bump();
32
+ });
33
+ }, [editor]);
34
+ if (!editor || !quiet)
35
+ return null;
36
+ const host = editor.hostElement;
37
+ if (!host)
38
+ return null;
39
+ const v = editor.scene.viewport;
40
+ const hostRect = host.getBoundingClientRect();
41
+ const badges = [];
42
+ for (const shape of editor.scene.elements.values()) {
43
+ const href = editor.elementLink(shape.id);
44
+ if (!href)
45
+ continue;
46
+ const b = getElementWorldBounds(shape);
47
+ badges.push({
48
+ id: shape.id,
49
+ href,
50
+ x: (b.x + b.width - v.pan.x) * v.zoom + hostRect.left,
51
+ y: (b.y - v.pan.y) * v.zoom + hostRect.top,
52
+ });
53
+ }
54
+ if (badges.length === 0)
55
+ return null;
56
+ return createPortal(_jsx(_Fragment, { children: badges.map((badge) => (_jsx("button", { type: "button", className: "du-link-badge", style: { position: "fixed", left: badge.x, top: badge.y }, title: badge.href, "aria-label": `Open link ${badge.href}`, onClick: () => {
57
+ editor.openLink(badge.href);
58
+ }, children: _jsx(LinkIcon, { ...BADGE_ICON, "aria-hidden": true }) }, badge.id))) }), portalContainer);
59
+ };
60
+ //# sourceMappingURL=link-badges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-badges.js","sourceRoot":"","sources":["../../src/overlays/link-badges.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,OAAO,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC9B,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAiC,CAAC;IACtD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAyD,EAAE,CAAC;IACxE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI;YACJ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;YACrD,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG;SAC3C,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,YAAY,CACjB,4BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,iBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,eAAe,EACzB,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,EACzD,KAAK,EAAE,KAAK,CAAC,IAAI,gBACL,aAAa,KAAK,CAAC,IAAI,EAAE,EACrC,OAAO,EAAE,GAAG,EAAE;gBACZ,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC,YAED,KAAC,QAAQ,OAAK,UAAU,wBAAgB,IAVnC,KAAK,CAAC,EAAE,CAWN,CACV,CAAC,GACD,EACH,eAAe,CAChB,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-caption-editor.d.ts","sourceRoot":"","sources":["../../src/overlays/link-caption-editor.tsx"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,0CAgF7B,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect, useReducer, useRef, useState } from "react";
3
3
  import { createPortal } from "react-dom";
4
- import { useDiagramOptional } from "./hooks.js";
5
- import { usePortalContainer } from "./portal-container.js";
4
+ import { useDiagramOptional } from "../core/hooks.js";
5
+ import { usePortalContainer } from "../core/portal-container.js";
6
6
  /**
7
7
  * Inline editor for a link's caption. Opens on double-click of a link
8
8
  * (state layer sets `editor.editingLinkCaption`). Renders a small multiline
@@ -60,7 +60,7 @@ export const LinkCaptionEditor = () => {
60
60
  left: sx,
61
61
  top: sy,
62
62
  transform: "translate(-50%, -50%)",
63
- zIndex: 1602,
63
+ zIndex: "calc(var(--du-z-popover) + 2)",
64
64
  }, onChange: (e) => {
65
65
  setValue(e.target.value);
66
66
  }, onBlur: commit, onKeyDown: (e) => {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-caption-editor.js","sourceRoot":"","sources":["../../src/overlays/link-caption-editor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-hover-popup.d.ts","sourceRoot":"","sources":["../../src/overlays/link-hover-popup.tsx"],"names":[],"mappings":"AAwBA,eAAO,MAAM,cAAc,0CAyF1B,CAAC"}
@@ -2,9 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useReducer, useRef, useState } from "react";
3
3
  import { createPortal } from "react-dom";
4
4
  import { ExternalLink } from "lucide-react";
5
- import { useDiagramOptional } from "./hooks.js";
6
- import { useDismissTimer } from "./use-dismiss-timer.js";
7
- import { usePortalContainer } from "./portal-container.js";
5
+ import { useDiagramOptional } from "../core/hooks.js";
6
+ import { useDismissTimer } from "../utils/use-dismiss-timer.js";
7
+ import { usePortalContainer } from "../core/portal-container.js";
8
+ import { BADGE_ICON } from "../core/constants.js";
8
9
  /**
9
10
  * Hover link popup. When the pointer is over an element that carries a
10
11
  * (safe) `href`, a small chip appears above it showing the URL and an
@@ -88,6 +89,6 @@ export const LinkHoverPopup = () => {
88
89
  }, children: _jsxs("a", { className: "du-link-popup-url", href: hover.href, title: hover.href, onClick: (ev) => {
89
90
  ev.preventDefault();
90
91
  editor.openLink(hover.href);
91
- }, children: [_jsx("span", { className: "du-link-popup-text", children: display }), _jsx(ExternalLink, { size: 13, strokeWidth: 1.75, "aria-hidden": true })] }) }), portalContainer);
92
+ }, children: [_jsx("span", { className: "du-link-popup-text", children: display }), _jsx(ExternalLink, { ...BADGE_ICON, "aria-hidden": true })] }) }), portalContainer);
92
93
  };
93
94
  //# sourceMappingURL=link-hover-popup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-hover-popup.js","sourceRoot":"","sources":["../../src/overlays/link-hover-popup.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-dialog.d.ts","sourceRoot":"","sources":["../../src/overlays/merge-dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EAIL,KAAK,WAAW,EAEhB,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,6BAA6B,CAAC;AAGrC;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;IACpE,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;CAChC;AAED,eAAO,MAAM,WAAW,GAAI,wEAOzB,gBAAgB,4CA4ElB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useState } from "react";
3
+ import { mergeBranchHeads, resolveConflict, } from "@oh-just-another/versioning";
4
+ import { Modal } from "../primitives/modal.js";
5
+ export const MergeDialog = ({ store, sourceVersionId, targetVersionId, onApply, onCancel, style, }) => {
6
+ const report = useMemo(() => mergeBranchHeads(store, sourceVersionId, targetVersionId), [store, sourceVersionId, targetVersionId]);
7
+ const [picks, setPicks] = useState(new Map());
8
+ const pickFor = (c) => picks.get(conflictKey(c)) ?? defaultPick(c);
9
+ const setPick = (c, pick) => {
10
+ const next = new Map(picks);
11
+ next.set(conflictKey(c), pick);
12
+ setPicks(next);
13
+ };
14
+ const onApplyClick = () => {
15
+ let merged = report.mergedScene;
16
+ for (const c of report.conflicts) {
17
+ const pick = pickFor(c);
18
+ if (pick === "both")
19
+ continue; // host handles duplication
20
+ merged = resolveConflict(merged, c, pick);
21
+ }
22
+ onApply(merged);
23
+ };
24
+ return (_jsxs(Modal, { open: true, onClose: onCancel, title: "Merge branches", style: {
25
+ width: 480,
26
+ maxHeight: "80vh",
27
+ display: "flex",
28
+ flexDirection: "column",
29
+ ...style,
30
+ }, children: [_jsxs("header", { className: "du-modal-header", style: { flexDirection: "column", alignItems: "stretch" }, children: [_jsx("h2", { className: "du-modal-title", children: "Merge branches" }), _jsxs("p", { className: "du-modal-subtitle", children: ["Auto-applied ", report.applied.length, " change", report.applied.length === 1 ? "" : "s", ".", " ", report.conflicts.length, " conflict", report.conflicts.length === 1 ? "" : "s", " need resolution."] })] }), _jsx("div", { className: "du-modal-body", style: { flex: 1, overflowY: "auto" }, children: report.conflicts.length === 0 ? (_jsx("p", { className: "du-modal-subtitle", children: "No conflicts \u2014 ready to apply." })) : (report.conflicts.map((c) => (_jsx(ConflictRow, { conflict: c, pick: pickFor(c), onPick: (p) => {
31
+ setPick(c, p);
32
+ } }, conflictKey(c))))) }), _jsxs("footer", { className: "du-modal-footer", children: [_jsx("button", { type: "button", className: "du-button", onClick: onCancel, children: "Cancel" }), _jsx("button", { type: "button", className: "du-button du-button-primary", onClick: onApplyClick, children: "Apply" })] })] }));
33
+ };
34
+ const ConflictRow = ({ conflict, pick, onPick, }) => (_jsxs("div", { className: "du-merge-conflict", children: [_jsxs("div", { className: "du-merge-conflict-title", children: [conflict.kind, " \u2022 ", String(conflict.id)] }), _jsx("div", { className: "du-merge-conflict-picks", children: ["source", "target", "both"].map((side) => (_jsxs("label", { className: "du-merge-conflict-pick", children: [_jsx("input", { type: "radio", checked: pick === side, onChange: () => {
35
+ onPick(side);
36
+ }, name: `pick-${String(conflict.id)}` }), side] }, side))) })] }));
37
+ const conflictKey = (c) => `${c.kind}:${String(c.id)}`;
38
+ const defaultPick = (c) => c.source !== null ? "source" : c.target !== null ? "target" : "source";
39
+ //# sourceMappingURL=merge-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-dialog.js","sourceRoot":"","sources":["../../src/overlays/merge-dialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-overlay.d.ts","sourceRoot":"","sources":["../../src/overlays/search-overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,OAAO,CAAC;AAMf;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa,QAAO,YAAY,GAAG,IA2J/C,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useMemo, useRef, useState, } from "react";
3
3
  import { defaultActionRegistry, searchScene } from "@oh-just-another/state";
4
- import { useDiagramOptional, useScene } from "./hooks.js";
5
- import { SEARCH_ZOOM_PADDING_PX } from "./constants.js";
4
+ import { useDiagramOptional, useScene } from "../core/hooks.js";
5
+ import { SEARCH_ZOOM_PADDING_PX } from "../core/constants.js";
6
6
  /**
7
7
  * Text-search overlay (`⌘F`). A slim floating bar over the canvas: type a
8
8
  * substring and it finds every text shape / frame name / edge label that
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-overlay.js","sourceRoot":"","sources":["../../src/overlays/search-overlay.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const StickyReactions: () => import("react").ReactPortal | null;
2
+ //# sourceMappingURL=sticky-reactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sticky-reactions.d.ts","sourceRoot":"","sources":["../../src/overlays/sticky-reactions.tsx"],"names":[],"mappings":"AAwCA,eAAO,MAAM,eAAe,0CAyG3B,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useReducer, useState } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { getElementWorldBounds, isSticky } from "@oh-just-another/scene";
5
+ import { stickyReactionPillRects, stickyReactionAddRect, STICKY_REACTION_FONT_SIZE, STICKY_REACTION_MIN_ZOOM, } from "@oh-just-another/renderer-core";
6
+ import { useDiagramOptional } from "../core/hooks.js";
7
+ import { useQuietViewport } from "../core/use-quiet-viewport.js";
8
+ import { usePortalContainer } from "../core/portal-container.js";
9
+ import { EMOJI_QUICK_PICKS } from "../core/constants.js";
10
+ /**
11
+ * Sticky reactions, interaction half. The pills AND the "+" button are
12
+ * painted by the CANVAS renderer (single visual source that tracks the
13
+ * shape 1:1 while dragging; pills also reach PNG / SVG exports); this
14
+ * overlay only lays TRANSPARENT click zones over the same rects (shared
15
+ * geometry via `stickyReactionPillRects` / `stickyReactionAddRect`) and
16
+ * hosts the DOM emoji picker the "+" zone opens. Clicking a pill toggles
17
+ * YOUR reaction — adds it if you haven't reacted, removes it if you
18
+ * have; counters grow only through other collaborators. Reaction state
19
+ * lives on the element (`StickyElement.reactions`), so it syncs through
20
+ * the normal scene channel. Hidden in read-only mode (reacting mutates
21
+ * the scene) and while the viewport is moving.
22
+ */
23
+ /** Hidden 2D context measuring pill labels with the renderer's pill font. */
24
+ let measureCtx;
25
+ const pillMeasure = (text) => {
26
+ if (measureCtx === undefined) {
27
+ measureCtx =
28
+ typeof document === "undefined" ? null : document.createElement("canvas").getContext("2d");
29
+ }
30
+ if (!measureCtx)
31
+ return text.length * STICKY_REACTION_FONT_SIZE * 0.6;
32
+ measureCtx.font = `${String(STICKY_REACTION_FONT_SIZE)}px system-ui, sans-serif`;
33
+ return measureCtx.measureText(text).width;
34
+ };
35
+ export const StickyReactions = () => {
36
+ const editor = useDiagramOptional();
37
+ const [, bump] = useReducer((x) => x + 1, 0);
38
+ const [pickerFor, setPickerFor] = useState(null);
39
+ const portalContainer = usePortalContainer();
40
+ const quiet = useQuietViewport(editor);
41
+ useEffect(() => {
42
+ if (!editor)
43
+ return undefined;
44
+ return editor.on("change", () => {
45
+ bump();
46
+ });
47
+ }, [editor]);
48
+ if (!editor || editor.readOnly || !quiet)
49
+ return null;
50
+ const host = editor.hostElement;
51
+ if (!host)
52
+ return null;
53
+ const v = editor.scene.viewport;
54
+ // Below the min zoom the canvas hides the reaction chrome entirely —
55
+ // no zones to click.
56
+ if (v.zoom < STICKY_REACTION_MIN_ZOOM)
57
+ return null;
58
+ const hostRect = host.getBoundingClientRect();
59
+ const stickies = [];
60
+ for (const shape of editor.scene.elements.values()) {
61
+ if (isSticky(shape))
62
+ stickies.push(shape);
63
+ }
64
+ if (stickies.length === 0)
65
+ return null;
66
+ return createPortal(_jsx(_Fragment, { children: stickies.map((shape) => {
67
+ const b = getElementWorldBounds(shape);
68
+ const scaleX = shape.width > 0 ? b.width / shape.width : 1;
69
+ const scaleY = shape.height > 0 ? b.height / shape.height : 1;
70
+ const toScreenX = (localX) => (b.x + localX * scaleX - v.pan.x) * v.zoom + hostRect.left;
71
+ const toScreenY = (localY) => (b.y + localY * scaleY - v.pan.y) * v.zoom + hostRect.top;
72
+ const pills = stickyReactionPillRects(shape, pillMeasure, v.zoom);
73
+ const add = stickyReactionAddRect(shape, pillMeasure, v.zoom);
74
+ return (_jsxs("div", { children: [pills.map((pill) => (_jsx("button", { type: "button", className: "du-sticky-reaction-hit", style: {
75
+ left: toScreenX(pill.x),
76
+ top: toScreenY(pill.y),
77
+ width: pill.width * scaleX * v.zoom,
78
+ height: pill.height * scaleY * v.zoom,
79
+ }, title: `Toggle ${pill.glyph} reaction`, "aria-label": `Toggle ${pill.glyph} reaction`, onClick: () => {
80
+ editor.toggleStickyReaction(shape.id, pill.glyph);
81
+ } }, pill.glyph))), _jsxs("div", { className: "du-sticky-reactions", style: { left: toScreenX(add.x), top: toScreenY(add.y) }, children: [_jsx("button", { type: "button", className: "du-sticky-reaction-hit", style: {
82
+ left: toScreenX(add.x),
83
+ top: toScreenY(add.y),
84
+ width: add.width * scaleX * v.zoom,
85
+ height: add.height * scaleY * v.zoom,
86
+ }, title: "Add emoji reaction", "aria-label": "Add emoji reaction", onClick: () => {
87
+ setPickerFor((cur) => (cur === shape.id ? null : shape.id));
88
+ } }), pickerFor === shape.id ? (_jsx("div", { className: "du-sticky-reaction-picker", role: "menu", "aria-label": "Pick a reaction", children: EMOJI_QUICK_PICKS.map((glyph) => (_jsx("button", { type: "button", className: "du-sel-emoji-item", "aria-label": `React with ${glyph}`, onClick: () => {
89
+ editor.toggleStickyReaction(shape.id, glyph);
90
+ setPickerFor(null);
91
+ }, children: glyph }, glyph))) })) : null] })] }, shape.id));
92
+ }) }), portalContainer);
93
+ };
94
+ //# sourceMappingURL=sticky-reactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sticky-reactions.js","sourceRoot":"","sources":["../../src/overlays/sticky-reactions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-editor-overlay.d.ts","sourceRoot":"","sources":["../../src/overlays/text-editor-overlay.tsx"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,sDAoI7B,CAAC"}
@@ -1,7 +1,15 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect, useLayoutEffect, useReducer, useRef } from "react";
3
- import { getElement } from "@oh-just-another/scene";
4
- import { useDiagramOptional } from "./hooks.js";
3
+ import { getElement, isText } from "@oh-just-another/scene";
4
+ import { useDiagramOptional } from "../core/hooks.js";
5
+ /** Flat edited text: the element's own for text shapes, its label's otherwise. */
6
+ const editedTextOf = (shape) => {
7
+ if (shape === undefined)
8
+ return "";
9
+ if (isText(shape))
10
+ return shape.text;
11
+ return shape.label?.text ?? "";
12
+ };
5
13
  /**
6
14
  * Invisible keystroke/IME sink for in-canvas text editing. The caret and
7
15
  * selection are drawn on the canvas by the renderer (the editor's
@@ -41,7 +49,7 @@ export const TextEditorOverlay = () => {
41
49
  if (!editor || !editingId || !ta)
42
50
  return;
43
51
  const shape = getElement(editor.scene, editingId);
44
- const text = shape?.type === "text" ? shape.text : "";
52
+ const text = editedTextOf(shape);
45
53
  if (ta.value !== text)
46
54
  ta.value = text;
47
55
  const sel = editor.editingTextSelection;
@@ -52,7 +60,7 @@ export const TextEditorOverlay = () => {
52
60
  if (!editor || !editingId)
53
61
  return null;
54
62
  const shape = getElement(editor.scene, editingId);
55
- if (shape?.type !== "text")
63
+ if (shape === undefined || (!isText(shape) && shape.label === undefined))
56
64
  return null;
57
65
  // Park the sink at the text's screen position so the IME candidate
58
66
  // window appears near the caret. It's invisible and click-through.
@@ -60,7 +68,7 @@ export const TextEditorOverlay = () => {
60
68
  const left = (shape.position.x - vp.pan.x) * vp.zoom;
61
69
  const top = (shape.position.y - vp.pan.y) * vp.zoom;
62
70
  const dirOf = (ta) => ta.selectionDirection === "backward" ? "backward" : "forward";
63
- return (_jsx("textarea", { ref: ref, defaultValue: shape.text,
71
+ return (_jsx("textarea", { ref: ref, defaultValue: editedTextOf(shape),
64
72
  // `onInput` covers typing, paste, cut, delete and IME end — read
65
73
  // the textarea's authoritative value + caret and push them live.
66
74
  onInput: (ev) => {
@@ -76,6 +84,30 @@ export const TextEditorOverlay = () => {
76
84
  ev.preventDefault();
77
85
  ev.stopPropagation();
78
86
  editor.commitTextEdit();
87
+ return;
88
+ }
89
+ // Select-all handled explicitly: the native path raced the
90
+ // editor→textarea selection mirror (a caret-blink re-render could
91
+ // restore the pre-Cmd+A selection before `onSelect` fired), which
92
+ // made Cmd+A intermittently need a second press. Setting both the
93
+ // textarea range and the editor selection synchronously removes
94
+ // the race.
95
+ if (ev.key.toLowerCase() === "a" && (ev.metaKey || ev.ctrlKey)) {
96
+ ev.preventDefault();
97
+ ev.stopPropagation();
98
+ const ta = ev.currentTarget;
99
+ const len = ta.value.length;
100
+ ta.setSelectionRange(0, len, "forward");
101
+ editor.setEditingSelection(0, len, "forward");
102
+ return;
103
+ }
104
+ // Tab / Shift+Tab change list nesting for the caret's paragraphs
105
+ // (no-op on plain paragraphs beyond clamping at level 0). Always
106
+ // swallowed so the textarea never tabs focus away mid-edit.
107
+ if (ev.key === "Tab") {
108
+ ev.preventDefault();
109
+ ev.stopPropagation();
110
+ editor.indentParagraphs([editingId], ev.shiftKey ? -1 : 1);
79
111
  }
80
112
  }, onBlur: () => {
81
113
  // A click inside the text repositions the caret (canvas handles
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-editor-overlay.js","sourceRoot":"","sources":["../../src/overlays/text-editor-overlay.tsx"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ import { type CSSProperties } from "react";
5
5
  * highlights the pin). Resolved threads render dimmed. Hosts that want
6
6
  * a different layout can compose their own from `useAnnotations` +
7
7
  * `editor.setSelectedAnnotation`.
8
+ *
9
+ * Renders as a static side-panel card (`du-side-panel du-side-panel-static`).
8
10
  */
9
11
  export interface CommentsPanelProps {
10
12
  readonly style?: CSSProperties;
@@ -14,7 +16,8 @@ export declare const CommentsPanel: ({ style, className }: CommentsPanelProps) =
14
16
  /**
15
17
  * Floating thread view for the focused annotation. Renders nothing
16
18
  * when no annotation is open. Drop it as a sibling of `<DiagramSurface>`
17
- * inside `<DiagramRoot>` so it can position itself over the canvas.
19
+ * inside `<DiagramRoot>` so it can position itself over the canvas
20
+ * (top-right, `--du-bar-inset` from the edges; width `--du-thread-w`).
18
21
  *
19
22
  * Composes from `useAnnotations` + `useSelectedAnnotation`; hosts that
20
23
  * want a different layout (modal, side-panel, etc.) can rebuild it.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-panel.d.ts","sourceRoot":"","sources":["../../src/panels/comments-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AASrD;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,aAAa,GAAI,sBAAsB,kBAAkB,4CA6CrE,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,eAAe,GAAI,sBAAsB,oBAAoB,mDA4GzE,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { ChevronDown, X } from "lucide-react";
4
+ import { useAnnotations, useDiagramOptional, useSelectedAnnotation } from "../core/hooks.js";
5
+ import { formatTime } from "../utils/format-time.js";
6
+ import { Markdown } from "../primitives/markdown.js";
7
+ import { CONTROL_ICON } from "../core/constants.js";
8
+ const glyph = CONTROL_ICON;
9
+ export const CommentsPanel = ({ style, className }) => {
10
+ const editor = useDiagramOptional();
11
+ const annotations = useAnnotations();
12
+ const selectedId = useSelectedAnnotation();
13
+ return (_jsxs("aside", { className: `du-side-panel du-side-panel-static${className ? ` ${className}` : ""}`, style: style, children: [_jsx("header", { className: "du-side-panel-header", children: _jsxs("span", { className: "du-side-panel-title", children: ["Comments (", annotations.length, ")"] }) }), _jsx("div", { className: "du-side-panel-body du-side-panel-body-flush du-panel-list", children: annotations.length === 0 ? (_jsx("div", { className: "du-panel-empty", children: "No comments yet. Right-click on the canvas to add one." })) : (annotations.map((ann) => {
14
+ const first = ann.thread[0];
15
+ const isOpen = ann.id === selectedId;
16
+ return (_jsxs("button", { type: "button", onClick: () => editor?.setSelectedAnnotation(ann.id), "aria-current": isOpen ? "true" : undefined, className: `du-panel-row du-panel-row-stack${isOpen ? " is-active" : ""}${ann.resolved ? " is-muted" : ""}`, children: [_jsxs("span", { className: "du-panel-row-meta", children: [_jsx("strong", { children: first?.authorName ?? "—" }), ann.thread.length > 1 ? _jsxs("span", { children: ["+", ann.thread.length - 1] }) : null, ann.resolved ? _jsx("span", { className: "du-panel-row-meta-end", children: "resolved" }) : null] }), _jsx("span", { className: "du-panel-row-label is-muted", children: first?.body ?? "(empty)" })] }, ann.id));
17
+ })) })] }));
18
+ };
19
+ export const CommentsPopover = ({ style, className }) => {
20
+ const editor = useDiagramOptional();
21
+ const annotations = useAnnotations();
22
+ const selectedId = useSelectedAnnotation();
23
+ const [draft, setDraft] = useState("");
24
+ if (!editor || !selectedId)
25
+ return null;
26
+ const ann = annotations.find((a) => a.id === selectedId);
27
+ if (!ann)
28
+ return null;
29
+ const submit = () => {
30
+ const body = draft.trim();
31
+ if (!body)
32
+ return;
33
+ editor.addComment(ann.id, body);
34
+ setDraft("");
35
+ };
36
+ return (_jsxs("div", { className: `du-thread${className ? ` ${className}` : ""}`, role: "dialog", "aria-label": "Annotation thread", style: style, children: [_jsxs("header", { className: "du-thread-header", children: [_jsx("span", { className: "du-thread-status", children: ann.resolved ? "Resolved" : "Open" }), _jsx("button", { type: "button", onClick: () => {
37
+ editor.toggleAnnotationResolved(ann.id);
38
+ }, className: "du-button", children: ann.resolved ? "Reopen" : "Resolve" }), _jsx("button", { type: "button", onClick: () => {
39
+ editor.removeAnnotation(ann.id);
40
+ }, className: "du-icon-button du-icon-button-flat", "aria-label": "Delete thread", title: "Delete thread", children: _jsx(X, { ...glyph }) }), _jsx("button", { type: "button", onClick: () => {
41
+ editor.setSelectedAnnotation(null);
42
+ }, className: "du-icon-button du-icon-button-flat", "aria-label": "Close", title: "Close", children: _jsx(ChevronDown, { ...glyph }) })] }), _jsx("div", { className: "du-thread-body", children: ann.thread.length === 0 ? (_jsx("div", { className: "du-panel-empty", children: "No comments yet." })) : (ann.thread.map((c) => (_jsxs("div", { className: "du-thread-item", children: [_jsx("button", { type: "button", onClick: () => {
43
+ editor.removeComment(ann.id, c.id);
44
+ }, "aria-label": "Delete comment", title: "Delete comment", className: "du-icon-button du-icon-button-flat du-thread-item-remove", children: _jsx(X, { ...glyph }) }), _jsxs("div", { className: "du-thread-item-meta", children: [_jsx("strong", { children: c.authorName }), " ", formatTime(c.createdAt)] }), _jsx("div", { className: "du-thread-item-body", children: _jsx(Markdown, { text: c.body }) })] }, c.id)))) }), _jsxs("form", { onSubmit: (ev) => {
45
+ ev.preventDefault();
46
+ submit();
47
+ }, className: "du-thread-form", children: [_jsx("input", { type: "text", value: draft, onChange: (ev) => {
48
+ setDraft(ev.target.value);
49
+ }, placeholder: "Reply\u2026", "aria-label": "Reply", className: "du-panel-input" }), _jsx("button", { type: "submit", className: "du-button du-button-primary", disabled: !draft.trim(), children: "Send" })] })] }));
50
+ };
51
+ //# sourceMappingURL=comments-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments-panel.js","sourceRoot":"","sources":["../../src/panels/comments-panel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Selection-toolbar control sets.
3
+ *
4
+ * Every element type declares the ordered controls it offers, once for a
5
+ * single selection and once for a multi-selection (the "multi" set is the
6
+ * single set minus what makes no sense for several elements — hyperlink,
7
+ * list type, per-file image actions …). A selection of ≥2 elements shows the
8
+ * INTERSECTION of the members' multi sets, so two shapes get the full shape
9
+ * set, a shape + a text share the text-carrier controls, and a shape + a
10
+ * frame share nothing but the tail. Separators are kept where the first
11
+ * member had them and collapse when their cluster empties.
12
+ *
13
+ * The model is deliberately free of React: entries carry an id (the
14
+ * intersection key) and an opaque payload the panel turns into a control.
15
+ */
16
+ /** Cluster separator marker. */
17
+ export declare const SEPARATOR: "separator";
18
+ export interface ControlEntry<T> {
19
+ readonly id: string;
20
+ readonly payload: T;
21
+ }
22
+ export type ControlSetEntry<T> = ControlEntry<T> | typeof SEPARATOR;
23
+ /** One element's contribution: always-visible row + overflow (mobile ⋮ sheet). */
24
+ export interface ControlSet<T> {
25
+ readonly primary: readonly ControlSetEntry<T>[];
26
+ readonly overflow: readonly ControlSetEntry<T>[];
27
+ }
28
+ export type ControlMode = "single" | "multi";
29
+ /**
30
+ * Drop separators that would not sit between two controls: leading,
31
+ * trailing, and runs of several in a row.
32
+ */
33
+ export declare const collapseSeparators: <T>(entries: readonly ControlSetEntry<T>[]) => ControlSetEntry<T>[];
34
+ /**
35
+ * Intersect control sets by entry id, keeping the first set's order, row
36
+ * placement and payloads. The primary / overflow split is a layout concern
37
+ * (what the mobile sheet hides), so an id counts as shared wherever the
38
+ * other sets carry it. A single set is returned as is (separators
39
+ * collapsed); an empty input yields empty rows.
40
+ */
41
+ export declare const intersectControlSets: <T>(sets: readonly ControlSet<T>[]) => ControlSet<T>;
42
+ //# sourceMappingURL=control-sets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-sets.d.ts","sourceRoot":"","sources":["../../src/panels/control-sets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,gCAAgC;AAChC,eAAO,MAAM,SAAS,EAAG,WAAoB,CAAC;AAE9C,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,SAAS,CAAC;AAEpE,kFAAkF;AAClF,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;CAClD;AAED,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAQ7C;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAClC,SAAS,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,KACrC,eAAe,CAAC,CAAC,CAAC,EAYpB,CAAC;AAQF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,MAAM,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,KAAG,UAAU,CAAC,CAAC,CAQpF,CAAC"}