@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.
- package/CHANGELOG.md +132 -0
- package/README.md +3 -3
- package/dist/.tsbuildinfo +1 -1
- package/dist/color/color-palette.d.ts.map +1 -0
- package/dist/color/color-palette.js.map +1 -0
- package/dist/color/color-swatch-picker.d.ts.map +1 -0
- package/dist/{color-swatch-picker.js → color/color-swatch-picker.js} +4 -3
- package/dist/color/color-swatch-picker.js.map +1 -0
- package/dist/{constants.d.ts → core/constants.d.ts} +66 -14
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/{constants.js → core/constants.js} +99 -14
- package/dist/core/constants.js.map +1 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/portal-container.d.ts.map +1 -0
- package/dist/core/portal-container.js.map +1 -0
- package/dist/core/use-fullscreen.d.ts +14 -0
- package/dist/core/use-fullscreen.d.ts.map +1 -0
- package/dist/core/use-fullscreen.js +38 -0
- package/dist/core/use-fullscreen.js.map +1 -0
- package/dist/core/use-quiet-gesture.d.ts +11 -0
- package/dist/core/use-quiet-gesture.d.ts.map +1 -0
- package/dist/core/use-quiet-gesture.js +61 -0
- package/dist/core/use-quiet-gesture.js.map +1 -0
- package/dist/core/use-quiet-viewport.d.ts +10 -0
- package/dist/core/use-quiet-viewport.d.ts.map +1 -0
- package/dist/core/use-quiet-viewport.js +40 -0
- package/dist/core/use-quiet-viewport.js.map +1 -0
- package/dist/index.d.ts +55 -50
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +55 -50
- package/dist/index.js.map +1 -1
- package/dist/layout/diagram-bars.d.ts.map +1 -0
- package/dist/layout/diagram-bars.js.map +1 -0
- package/dist/layout/diagram-canvas.d.ts.map +1 -0
- package/dist/layout/diagram-canvas.js.map +1 -0
- package/dist/layout/diagram-root.d.ts.map +1 -0
- package/dist/{diagram-root.js → layout/diagram-root.js} +2 -2
- package/dist/layout/diagram-root.js.map +1 -0
- package/dist/{sidebar.d.ts → layout/sidebar.d.ts} +1 -0
- package/dist/layout/sidebar.d.ts.map +1 -0
- package/dist/layout/sidebar.js +38 -0
- package/dist/layout/sidebar.js.map +1 -0
- package/dist/layout/ui-layer.d.ts.map +1 -0
- package/dist/layout/ui-layer.js.map +1 -0
- package/dist/menus/command-palette.d.ts.map +1 -0
- package/dist/{command-palette.js → menus/command-palette.js} +2 -2
- package/dist/menus/command-palette.js.map +1 -0
- package/dist/menus/context-menu-controller.d.ts.map +1 -0
- package/dist/menus/context-menu-controller.js.map +1 -0
- package/dist/{context-menu.d.ts → menus/context-menu.d.ts} +12 -0
- package/dist/menus/context-menu.d.ts.map +1 -0
- package/dist/menus/context-menu.js +617 -0
- package/dist/menus/context-menu.js.map +1 -0
- package/dist/menus/link-drop-shape-menu.d.ts.map +1 -0
- package/dist/{link-drop-shape-menu.js → menus/link-drop-shape-menu.js} +4 -4
- package/dist/menus/link-drop-shape-menu.js.map +1 -0
- package/dist/{main-menu.d.ts → menus/main-menu.d.ts} +45 -2
- package/dist/menus/main-menu.d.ts.map +1 -0
- package/dist/menus/main-menu.js +260 -0
- package/dist/menus/main-menu.js.map +1 -0
- package/dist/overlays/file-drop-overlay.d.ts +15 -0
- package/dist/overlays/file-drop-overlay.d.ts.map +1 -0
- package/dist/overlays/file-drop-overlay.js +27 -0
- package/dist/overlays/file-drop-overlay.js.map +1 -0
- package/dist/overlays/frame-name-editor-overlay.d.ts.map +1 -0
- package/dist/{frame-name-editor-overlay.js → overlays/frame-name-editor-overlay.js} +1 -1
- package/dist/overlays/frame-name-editor-overlay.js.map +1 -0
- package/dist/overlays/help-button.d.ts.map +1 -0
- package/dist/{help-button.js → overlays/help-button.js} +3 -4
- package/dist/overlays/help-button.js.map +1 -0
- package/dist/overlays/help-dialog.d.ts.map +1 -0
- package/dist/{help-dialog.js → overlays/help-dialog.js} +4 -24
- package/dist/overlays/help-dialog.js.map +1 -0
- package/dist/overlays/link-badges.d.ts +14 -0
- package/dist/overlays/link-badges.d.ts.map +1 -0
- package/dist/overlays/link-badges.js +60 -0
- package/dist/overlays/link-badges.js.map +1 -0
- package/dist/overlays/link-caption-editor.d.ts.map +1 -0
- package/dist/{link-caption-editor.js → overlays/link-caption-editor.js} +3 -3
- package/dist/overlays/link-caption-editor.js.map +1 -0
- package/dist/overlays/link-hover-popup.d.ts.map +1 -0
- package/dist/{link-hover-popup.js → overlays/link-hover-popup.js} +5 -4
- package/dist/overlays/link-hover-popup.js.map +1 -0
- package/dist/overlays/merge-dialog.d.ts.map +1 -0
- package/dist/overlays/merge-dialog.js +39 -0
- package/dist/overlays/merge-dialog.js.map +1 -0
- package/dist/overlays/search-overlay.d.ts.map +1 -0
- package/dist/{search-overlay.js → overlays/search-overlay.js} +2 -2
- package/dist/overlays/search-overlay.js.map +1 -0
- package/dist/overlays/sticky-reactions.d.ts +2 -0
- package/dist/overlays/sticky-reactions.d.ts.map +1 -0
- package/dist/overlays/sticky-reactions.js +94 -0
- package/dist/overlays/sticky-reactions.js.map +1 -0
- package/dist/overlays/text-editor-overlay.d.ts.map +1 -0
- package/dist/{text-editor-overlay.js → overlays/text-editor-overlay.js} +37 -5
- package/dist/overlays/text-editor-overlay.js.map +1 -0
- package/dist/{comments-panel.d.ts → panels/comments-panel.d.ts} +4 -1
- package/dist/panels/comments-panel.d.ts.map +1 -0
- package/dist/panels/comments-panel.js +51 -0
- package/dist/panels/comments-panel.js.map +1 -0
- package/dist/panels/control-sets.d.ts +42 -0
- package/dist/panels/control-sets.d.ts.map +1 -0
- package/dist/panels/control-sets.js +63 -0
- package/dist/panels/control-sets.js.map +1 -0
- package/dist/panels/diff-panel.d.ts.map +1 -0
- package/dist/panels/diff-panel.js.map +1 -0
- package/dist/panels/drawing-panel.d.ts.map +1 -0
- package/dist/{drawing-panel.js → panels/drawing-panel.js} +3 -3
- package/dist/panels/drawing-panel.js.map +1 -0
- package/dist/panels/edge-style-panel.d.ts.map +1 -0
- package/dist/{edge-style-panel.js → panels/edge-style-panel.js} +1 -1
- package/dist/panels/edge-style-panel.js.map +1 -0
- package/dist/panels/frame-panel.d.ts.map +1 -0
- package/dist/{frame-panel.js → panels/frame-panel.js} +1 -1
- package/dist/panels/frame-panel.js.map +1 -0
- package/dist/{layer-panel.d.ts → panels/layer-panel.d.ts} +5 -1
- package/dist/panels/layer-panel.d.ts.map +1 -0
- package/dist/panels/layer-panel.js +52 -0
- package/dist/panels/layer-panel.js.map +1 -0
- package/dist/panels/library-panel.d.ts.map +1 -0
- package/dist/{library-panel.js → panels/library-panel.js} +4 -5
- package/dist/panels/library-panel.js.map +1 -0
- package/dist/panels/property-panel.d.ts.map +1 -0
- package/dist/panels/property-panel.js +1492 -0
- package/dist/panels/property-panel.js.map +1 -0
- package/dist/panels/selection-floating-panel.d.ts.map +1 -0
- package/dist/{selection-floating-panel.js → panels/selection-floating-panel.js} +24 -13
- package/dist/panels/selection-floating-panel.js.map +1 -0
- package/dist/panels/stats-panel.d.ts.map +1 -0
- package/dist/{stats-panel.js → panels/stats-panel.js} +1 -1
- package/dist/panels/stats-panel.js.map +1 -0
- package/dist/primitives/bottom-sheet.d.ts.map +1 -0
- package/dist/{bottom-sheet.js → primitives/bottom-sheet.js} +9 -22
- package/dist/primitives/bottom-sheet.js.map +1 -0
- package/dist/primitives/button-group.d.ts.map +1 -0
- package/dist/primitives/button-group.js.map +1 -0
- package/dist/primitives/css-var.d.ts +8 -0
- package/dist/primitives/css-var.d.ts.map +1 -0
- package/dist/primitives/css-var.js +11 -0
- package/dist/primitives/css-var.js.map +1 -0
- package/dist/primitives/float-panel.d.ts +35 -0
- package/dist/primitives/float-panel.d.ts.map +1 -0
- package/dist/primitives/float-panel.js +42 -0
- package/dist/primitives/float-panel.js.map +1 -0
- package/dist/primitives/icon-button.d.ts.map +1 -0
- package/dist/primitives/icon-button.js.map +1 -0
- package/dist/primitives/markdown.d.ts.map +1 -0
- package/dist/primitives/markdown.js.map +1 -0
- package/dist/primitives/modal.d.ts.map +1 -0
- package/dist/{modal.js → primitives/modal.js} +11 -9
- package/dist/primitives/modal.js.map +1 -0
- package/dist/{popover.d.ts → primitives/popover.d.ts} +1 -1
- package/dist/primitives/popover.d.ts.map +1 -0
- package/dist/{popover.js → primitives/popover.js} +7 -18
- package/dist/primitives/popover.js.map +1 -0
- package/dist/primitives/segmented-control.d.ts.map +1 -0
- package/dist/primitives/segmented-control.js.map +1 -0
- package/dist/primitives/slider.d.ts.map +1 -0
- package/dist/primitives/slider.js.map +1 -0
- package/dist/primitives/switch.d.ts +24 -0
- package/dist/primitives/switch.d.ts.map +1 -0
- package/dist/primitives/switch.js +17 -0
- package/dist/primitives/switch.js.map +1 -0
- package/dist/primitives/toast.d.ts.map +1 -0
- package/dist/{toast.js → primitives/toast.js} +12 -33
- package/dist/primitives/toast.js.map +1 -0
- package/dist/primitives/tooltip.d.ts.map +1 -0
- package/dist/{tooltip.js → primitives/tooltip.js} +3 -3
- package/dist/primitives/tooltip.js.map +1 -0
- package/dist/{palette.d.ts → toolbar/palette.d.ts} +6 -1
- package/dist/toolbar/palette.d.ts.map +1 -0
- package/dist/{palette.js → toolbar/palette.js} +39 -5
- package/dist/toolbar/palette.js.map +1 -0
- package/dist/{toolbar.d.ts → toolbar/toolbar.d.ts} +9 -0
- package/dist/toolbar/toolbar.d.ts.map +1 -0
- package/dist/{toolbar.js → toolbar/toolbar.js} +132 -62
- package/dist/toolbar/toolbar.js.map +1 -0
- package/dist/utils/format-time.d.ts.map +1 -0
- package/dist/utils/format-time.js.map +1 -0
- package/dist/utils/use-dismiss-timer.d.ts.map +1 -0
- package/dist/utils/use-dismiss-timer.js.map +1 -0
- package/dist/widgets/minimap.d.ts.map +1 -0
- package/dist/{minimap.js → widgets/minimap.js} +50 -36
- package/dist/widgets/minimap.js.map +1 -0
- package/dist/widgets/reset-to-content-button.d.ts +11 -0
- package/dist/widgets/reset-to-content-button.d.ts.map +1 -0
- package/dist/{reset-to-content-button.js → widgets/reset-to-content-button.js} +8 -9
- package/dist/widgets/reset-to-content-button.js.map +1 -0
- package/dist/widgets/versioning.d.ts.map +1 -0
- package/dist/{versioning.js → widgets/versioning.js} +3 -3
- package/dist/widgets/versioning.js.map +1 -0
- package/dist/widgets/zen-mode.d.ts.map +1 -0
- package/dist/widgets/zen-mode.js.map +1 -0
- package/package.json +9 -9
- package/src/styles.css +1596 -258
- package/dist/bottom-sheet.d.ts.map +0 -1
- package/dist/bottom-sheet.js.map +0 -1
- package/dist/button-group.d.ts.map +0 -1
- package/dist/button-group.js.map +0 -1
- package/dist/color-palette.d.ts.map +0 -1
- package/dist/color-palette.js.map +0 -1
- package/dist/color-swatch-picker.d.ts.map +0 -1
- package/dist/color-swatch-picker.js.map +0 -1
- package/dist/command-palette.d.ts.map +0 -1
- package/dist/command-palette.js.map +0 -1
- package/dist/comments-panel.d.ts.map +0 -1
- package/dist/comments-panel.js +0 -142
- package/dist/comments-panel.js.map +0 -1
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/context-menu-controller.d.ts.map +0 -1
- package/dist/context-menu-controller.js.map +0 -1
- package/dist/context-menu.d.ts.map +0 -1
- package/dist/context-menu.js +0 -368
- package/dist/context-menu.js.map +0 -1
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js.map +0 -1
- package/dist/diagram-bars.d.ts.map +0 -1
- package/dist/diagram-bars.js.map +0 -1
- package/dist/diagram-canvas.d.ts.map +0 -1
- package/dist/diagram-canvas.js.map +0 -1
- package/dist/diagram-root.d.ts.map +0 -1
- package/dist/diagram-root.js.map +0 -1
- package/dist/diff-panel.d.ts.map +0 -1
- package/dist/diff-panel.js.map +0 -1
- package/dist/drawing-panel.d.ts.map +0 -1
- package/dist/drawing-panel.js.map +0 -1
- package/dist/edge-style-panel.d.ts.map +0 -1
- package/dist/edge-style-panel.js.map +0 -1
- package/dist/format-time.d.ts.map +0 -1
- package/dist/format-time.js.map +0 -1
- package/dist/frame-name-editor-overlay.d.ts.map +0 -1
- package/dist/frame-name-editor-overlay.js.map +0 -1
- package/dist/frame-panel.d.ts.map +0 -1
- package/dist/frame-panel.js.map +0 -1
- package/dist/help-button.d.ts.map +0 -1
- package/dist/help-button.js.map +0 -1
- package/dist/help-dialog.d.ts.map +0 -1
- package/dist/help-dialog.js.map +0 -1
- package/dist/hooks.d.ts.map +0 -1
- package/dist/hooks.js.map +0 -1
- package/dist/icon-button.d.ts.map +0 -1
- package/dist/icon-button.js.map +0 -1
- package/dist/layer-panel.d.ts.map +0 -1
- package/dist/layer-panel.js +0 -117
- package/dist/layer-panel.js.map +0 -1
- package/dist/library-panel.d.ts.map +0 -1
- package/dist/library-panel.js.map +0 -1
- package/dist/link-caption-editor.d.ts.map +0 -1
- package/dist/link-caption-editor.js.map +0 -1
- package/dist/link-drop-shape-menu.d.ts.map +0 -1
- package/dist/link-drop-shape-menu.js.map +0 -1
- package/dist/link-hover-popup.d.ts.map +0 -1
- package/dist/link-hover-popup.js.map +0 -1
- package/dist/main-menu.d.ts.map +0 -1
- package/dist/main-menu.js +0 -249
- package/dist/main-menu.js.map +0 -1
- package/dist/markdown.d.ts.map +0 -1
- package/dist/markdown.js.map +0 -1
- package/dist/merge-dialog.d.ts.map +0 -1
- package/dist/merge-dialog.js +0 -50
- package/dist/merge-dialog.js.map +0 -1
- package/dist/minimap.d.ts.map +0 -1
- package/dist/minimap.js.map +0 -1
- package/dist/modal.d.ts.map +0 -1
- package/dist/modal.js.map +0 -1
- package/dist/palette.d.ts.map +0 -1
- package/dist/palette.js.map +0 -1
- package/dist/popover.d.ts.map +0 -1
- package/dist/popover.js.map +0 -1
- package/dist/portal-container.d.ts.map +0 -1
- package/dist/portal-container.js.map +0 -1
- package/dist/property-panel.d.ts.map +0 -1
- package/dist/property-panel.js +0 -917
- package/dist/property-panel.js.map +0 -1
- package/dist/reset-to-content-button.d.ts +0 -10
- package/dist/reset-to-content-button.d.ts.map +0 -1
- package/dist/reset-to-content-button.js.map +0 -1
- package/dist/search-overlay.d.ts.map +0 -1
- package/dist/search-overlay.js.map +0 -1
- package/dist/segmented-control.d.ts.map +0 -1
- package/dist/segmented-control.js.map +0 -1
- package/dist/selection-floating-panel.d.ts.map +0 -1
- package/dist/selection-floating-panel.js.map +0 -1
- package/dist/sidebar.d.ts.map +0 -1
- package/dist/sidebar.js +0 -68
- package/dist/sidebar.js.map +0 -1
- package/dist/slider.d.ts.map +0 -1
- package/dist/slider.js.map +0 -1
- package/dist/stats-panel.d.ts.map +0 -1
- package/dist/stats-panel.js.map +0 -1
- package/dist/text-editor-overlay.d.ts.map +0 -1
- package/dist/text-editor-overlay.js.map +0 -1
- package/dist/toast.d.ts.map +0 -1
- package/dist/toast.js.map +0 -1
- package/dist/toolbar.d.ts.map +0 -1
- package/dist/toolbar.js.map +0 -1
- package/dist/tooltip.d.ts.map +0 -1
- package/dist/tooltip.js.map +0 -1
- package/dist/ui-layer.d.ts.map +0 -1
- package/dist/ui-layer.js.map +0 -1
- package/dist/use-dismiss-timer.d.ts.map +0 -1
- package/dist/use-dismiss-timer.js.map +0 -1
- package/dist/versioning.d.ts.map +0 -1
- package/dist/versioning.js.map +0 -1
- package/dist/zen-mode.d.ts.map +0 -1
- package/dist/zen-mode.js.map +0 -1
- /package/dist/{color-palette.d.ts → color/color-palette.d.ts} +0 -0
- /package/dist/{color-palette.js → color/color-palette.js} +0 -0
- /package/dist/{color-swatch-picker.d.ts → color/color-swatch-picker.d.ts} +0 -0
- /package/dist/{context.d.ts → core/context.d.ts} +0 -0
- /package/dist/{context.js → core/context.js} +0 -0
- /package/dist/{hooks.d.ts → core/hooks.d.ts} +0 -0
- /package/dist/{hooks.js → core/hooks.js} +0 -0
- /package/dist/{portal-container.d.ts → core/portal-container.d.ts} +0 -0
- /package/dist/{portal-container.js → core/portal-container.js} +0 -0
- /package/dist/{diagram-bars.d.ts → layout/diagram-bars.d.ts} +0 -0
- /package/dist/{diagram-bars.js → layout/diagram-bars.js} +0 -0
- /package/dist/{diagram-canvas.d.ts → layout/diagram-canvas.d.ts} +0 -0
- /package/dist/{diagram-canvas.js → layout/diagram-canvas.js} +0 -0
- /package/dist/{diagram-root.d.ts → layout/diagram-root.d.ts} +0 -0
- /package/dist/{ui-layer.d.ts → layout/ui-layer.d.ts} +0 -0
- /package/dist/{ui-layer.js → layout/ui-layer.js} +0 -0
- /package/dist/{command-palette.d.ts → menus/command-palette.d.ts} +0 -0
- /package/dist/{context-menu-controller.d.ts → menus/context-menu-controller.d.ts} +0 -0
- /package/dist/{context-menu-controller.js → menus/context-menu-controller.js} +0 -0
- /package/dist/{link-drop-shape-menu.d.ts → menus/link-drop-shape-menu.d.ts} +0 -0
- /package/dist/{frame-name-editor-overlay.d.ts → overlays/frame-name-editor-overlay.d.ts} +0 -0
- /package/dist/{help-button.d.ts → overlays/help-button.d.ts} +0 -0
- /package/dist/{help-dialog.d.ts → overlays/help-dialog.d.ts} +0 -0
- /package/dist/{link-caption-editor.d.ts → overlays/link-caption-editor.d.ts} +0 -0
- /package/dist/{link-hover-popup.d.ts → overlays/link-hover-popup.d.ts} +0 -0
- /package/dist/{merge-dialog.d.ts → overlays/merge-dialog.d.ts} +0 -0
- /package/dist/{search-overlay.d.ts → overlays/search-overlay.d.ts} +0 -0
- /package/dist/{text-editor-overlay.d.ts → overlays/text-editor-overlay.d.ts} +0 -0
- /package/dist/{diff-panel.d.ts → panels/diff-panel.d.ts} +0 -0
- /package/dist/{diff-panel.js → panels/diff-panel.js} +0 -0
- /package/dist/{drawing-panel.d.ts → panels/drawing-panel.d.ts} +0 -0
- /package/dist/{edge-style-panel.d.ts → panels/edge-style-panel.d.ts} +0 -0
- /package/dist/{frame-panel.d.ts → panels/frame-panel.d.ts} +0 -0
- /package/dist/{library-panel.d.ts → panels/library-panel.d.ts} +0 -0
- /package/dist/{property-panel.d.ts → panels/property-panel.d.ts} +0 -0
- /package/dist/{selection-floating-panel.d.ts → panels/selection-floating-panel.d.ts} +0 -0
- /package/dist/{stats-panel.d.ts → panels/stats-panel.d.ts} +0 -0
- /package/dist/{bottom-sheet.d.ts → primitives/bottom-sheet.d.ts} +0 -0
- /package/dist/{button-group.d.ts → primitives/button-group.d.ts} +0 -0
- /package/dist/{button-group.js → primitives/button-group.js} +0 -0
- /package/dist/{icon-button.d.ts → primitives/icon-button.d.ts} +0 -0
- /package/dist/{icon-button.js → primitives/icon-button.js} +0 -0
- /package/dist/{markdown.d.ts → primitives/markdown.d.ts} +0 -0
- /package/dist/{markdown.js → primitives/markdown.js} +0 -0
- /package/dist/{modal.d.ts → primitives/modal.d.ts} +0 -0
- /package/dist/{segmented-control.d.ts → primitives/segmented-control.d.ts} +0 -0
- /package/dist/{segmented-control.js → primitives/segmented-control.js} +0 -0
- /package/dist/{slider.d.ts → primitives/slider.d.ts} +0 -0
- /package/dist/{slider.js → primitives/slider.js} +0 -0
- /package/dist/{toast.d.ts → primitives/toast.d.ts} +0 -0
- /package/dist/{tooltip.d.ts → primitives/tooltip.d.ts} +0 -0
- /package/dist/{format-time.d.ts → utils/format-time.d.ts} +0 -0
- /package/dist/{format-time.js → utils/format-time.js} +0 -0
- /package/dist/{use-dismiss-timer.d.ts → utils/use-dismiss-timer.d.ts} +0 -0
- /package/dist/{use-dismiss-timer.js → utils/use-dismiss-timer.js} +0 -0
- /package/dist/{minimap.d.ts → widgets/minimap.d.ts} +0 -0
- /package/dist/{versioning.d.ts → widgets/versioning.d.ts} +0 -0
- /package/dist/{zen-mode.d.ts → widgets/zen-mode.d.ts} +0 -0
- /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":"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"}
|
|
@@ -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 "
|
|
5
|
-
import { usePortalContainer } from "
|
|
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:
|
|
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 "
|
|
6
|
-
import { useDismissTimer } from "
|
|
7
|
-
import { usePortalContainer } from "
|
|
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, {
|
|
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 "
|
|
5
|
-
import { SEARCH_ZOOM_PADDING_PX } from "
|
|
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":";AAAA,OAAO,EACL,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GAIT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAyB,MAAM,wBAAwB,CAAC;AAEnG,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAwB,EAAE;IACrD,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,qBAAqB,CAAC,OAAO,CAAC;YAC5B,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;YAChC,OAAO,EAAE,GAAG,EAAE;gBACZ,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;SACF,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,qBAAqB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EACrD,CAAC,KAAK,EAAE,KAAK,CAAC,CACf,CAAC;IAEF,uEAAuE;IACvE,0EAA0E;IAC1E,2EAA2E;IAC3E,0BAA0B;IAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAe,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAY,CAAC,CAAC;QACxC,CAAC;QACD,2EAA2E;QAC3E,2EAA2E;QAC3E,MAAM,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAElC,oEAAoE;IACpE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,SAAS,CAAC,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,GAAG,qBAAqB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,OAAO,GAAG,EAAE;YACV,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,2EAA2E;QAC3E,0EAA0E;QAC1E,kEAAkE;QAClE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,SAAS,CAAC,CAAC,CAAC,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,KAAa,EAAQ,EAAE;QACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,EAAsB,EAAQ,EAAE;QAClD,IAAI,EAAE,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACxB,EAAE,CAAC,cAAc,EAAE,CAAC;YACpB,EAAE,CAAC,eAAe,EAAE,CAAC;YACrB,KAAK,EAAE,CAAC;QACV,CAAC;aAAM,IAAI,EAAE,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YAC9B,EAAE,CAAC,cAAc,EAAE,CAAC;YACpB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,EAAE,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YAClC,EAAE,CAAC,cAAc,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,CAAC,CAAC;QACV,CAAC;aAAM,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAChC,EAAE,CAAC,cAAc,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACX,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;YACZ,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;IAE3D,OAAO,CACL,eAAK,KAAK,EAAE,SAAS,EAAE,IAAI,EAAC,QAAQ,aAClC,gBACE,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;oBACd,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACzB,SAAS,CAAC,CAAC,CAAC,CAAC;gBACf,CAAC,EACD,SAAS,EAAE,UAAU,EACrB,WAAW,EAAC,uBAAkB,gBACnB,sBAAsB,EACjC,KAAK,EAAE,WAAW,GAClB,EACF,eAAM,KAAK,EAAE,aAAa,eAAY,QAAQ,YAC3C,OAAO,GACH,EACP,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,gBAAgB,gBACf,gBAAgB,EAC3B,KAAK,EAAC,yBAAe,EACrB,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAC9B,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACX,CAAC,EACD,KAAK,EAAE,gBAAgB,uBAGhB,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,gBAAgB,gBACf,YAAY,EACvB,KAAK,EAAC,eAAU,EAChB,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAC9B,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,CAAC,CAAC,CAAC,CAAC;gBACV,CAAC,EACD,KAAK,EAAE,gBAAgB,uBAGhB,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,gBAAgB,gBACf,cAAc,EACzB,KAAK,EAAC,aAAa,EACnB,OAAO,EAAE,KAAK,EACd,KAAK,EAAE,gBAAgB,uBAGhB,IACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,SAAS,GAAkB;IAC/B,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,kBAAkB;IAC7B,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,uBAAuB;IACnC,MAAM,EAAE,+BAA+B;IACvC,SAAS,EAAE,6BAA6B;IACxC,KAAK,EAAE,gBAAgB;IACvB,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,MAAM;CACtB,CAAC;AACF,MAAM,WAAW,GAAkB;IACjC,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,aAAa;IACzB,KAAK,EAAE,SAAS;CACjB,CAAC;AACF,MAAM,aAAa,GAAkB;IACnC,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,sBAAsB;IAC7B,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,OAAO;IAClB,UAAU,EAAE,QAAQ;CACrB,CAAC;AACF,MAAM,gBAAgB,GAAkB;IACtC,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;CACX,CAAC"}
|
|
@@ -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 "
|
|
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
|
|
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
|
|
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
|
|
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"}
|