likec4 0.41.0 → 0.42.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/dist/__app__/src/App.jsx +1 -1
- package/dist/__app__/src/components/view-page/ExportDiagram.jsx +72 -0
- package/dist/__app__/src/components/view-page/ViewActionsToolbar.jsx +38 -12
- package/dist/cli/index.js +51 -51
- package/package.json +6 -6
- package/dist/@likec4/diagrams/cjs/components/EmbeddedDiagram.js +0 -83
- package/dist/@likec4/diagrams/cjs/components/FullscreenDiagramBrowser.js +0 -50
- package/dist/@likec4/diagrams/cjs/components/index.js +0 -49
- package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/CloseButton.js +0 -44
- package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/FullscreenDiagram.js +0 -110
- package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/FullscreenDiagramTitle.js +0 -39
- package/dist/@likec4/diagrams/cjs/components/primitives/index.js +0 -38
- package/dist/@likec4/diagrams/cjs/components/primitives/responsive/ResponsiveDiagram.js +0 -56
- package/dist/@likec4/diagrams/cjs/components/types.js +0 -1
- package/dist/@likec4/diagrams/cjs/diagram/Diagram.js +0 -326
- package/dist/@likec4/diagrams/cjs/diagram/Edges.js +0 -121
- package/dist/@likec4/diagrams/cjs/diagram/Nodes.js +0 -204
- package/dist/@likec4/diagrams/cjs/diagram/icons/BrainIcon.js +0 -25
- package/dist/@likec4/diagrams/cjs/diagram/icons/ExternalLink.js +0 -82
- package/dist/@likec4/diagrams/cjs/diagram/icons/index.js +0 -27
- package/dist/@likec4/diagrams/cjs/diagram/index.js +0 -27
- package/dist/@likec4/diagrams/cjs/diagram/shapes/Browser.js +0 -67
- package/dist/@likec4/diagrams/cjs/diagram/shapes/Compound.js +0 -55
- package/dist/@likec4/diagrams/cjs/diagram/shapes/Cylinder.js +0 -71
- package/dist/@likec4/diagrams/cjs/diagram/shapes/Edge.js +0 -62
- package/dist/@likec4/diagrams/cjs/diagram/shapes/Mobile.js +0 -45
- package/dist/@likec4/diagrams/cjs/diagram/shapes/NodeIcon.js +0 -38
- package/dist/@likec4/diagrams/cjs/diagram/shapes/NodeLabel.js +0 -62
- package/dist/@likec4/diagrams/cjs/diagram/shapes/Person.js +0 -48
- package/dist/@likec4/diagrams/cjs/diagram/shapes/Queue.js +0 -72
- package/dist/@likec4/diagrams/cjs/diagram/shapes/Rectangle.js +0 -30
- package/dist/@likec4/diagrams/cjs/diagram/shapes/index.js +0 -54
- package/dist/@likec4/diagrams/cjs/diagram/shapes/types.js +0 -1
- package/dist/@likec4/diagrams/cjs/diagram/shapes/utils.js +0 -19
- package/dist/@likec4/diagrams/cjs/diagram/springs.js +0 -61
- package/dist/@likec4/diagrams/cjs/diagram/state/atoms.js +0 -63
- package/dist/@likec4/diagrams/cjs/diagram/state/gestures.js +0 -26
- package/dist/@likec4/diagrams/cjs/diagram/state/hooks.js +0 -36
- package/dist/@likec4/diagrams/cjs/diagram/state/index.js +0 -38
- package/dist/@likec4/diagrams/cjs/diagram/state/provider.js +0 -18
- package/dist/@likec4/diagrams/cjs/diagram/types.js +0 -1
- package/dist/@likec4/diagrams/cjs/hooks/index.js +0 -49
- package/dist/@likec4/diagrams/cjs/hooks/useDarkMode.js +0 -11
- package/dist/@likec4/diagrams/cjs/hooks/useDiagramApi.js +0 -27
- package/dist/@likec4/diagrams/cjs/hooks/useImageLoader.js +0 -68
- package/dist/@likec4/diagrams/cjs/hooks/useViewIdFromHash.js +0 -93
- package/dist/@likec4/diagrams/cjs/index.js +0 -51
- package/dist/@likec4/diagrams/cjs/konva-html.js +0 -93
- package/dist/@likec4/diagrams/cjs/konva-portal.js +0 -50
- package/dist/@likec4/diagrams/cjs/konva.js +0 -102
- package/dist/@likec4/diagrams/cjs/likec4.js +0 -91
- package/dist/@likec4/diagrams/components/EmbeddedDiagram.mjs +0 -77
- package/dist/@likec4/diagrams/components/FullscreenDiagramBrowser.mjs +0 -52
- package/dist/@likec4/diagrams/components/index.mjs +0 -4
- package/dist/@likec4/diagrams/components/primitives/fullscreen/CloseButton.mjs +0 -43
- package/dist/@likec4/diagrams/components/primitives/fullscreen/FullscreenDiagram.mjs +0 -116
- package/dist/@likec4/diagrams/components/primitives/fullscreen/FullscreenDiagramTitle.mjs +0 -32
- package/dist/@likec4/diagrams/components/primitives/index.mjs +0 -3
- package/dist/@likec4/diagrams/components/primitives/responsive/ResponsiveDiagram.mjs +0 -42
- package/dist/@likec4/diagrams/components/types.mjs +0 -0
- package/dist/@likec4/diagrams/diagram/Diagram.mjs +0 -307
- package/dist/@likec4/diagrams/diagram/Edges.mjs +0 -117
- package/dist/@likec4/diagrams/diagram/Nodes.mjs +0 -178
- package/dist/@likec4/diagrams/diagram/icons/BrainIcon.mjs +0 -20
- package/dist/@likec4/diagrams/diagram/icons/ExternalLink.mjs +0 -90
- package/dist/@likec4/diagrams/diagram/icons/index.mjs +0 -2
- package/dist/@likec4/diagrams/diagram/index.mjs +0 -2
- package/dist/@likec4/diagrams/diagram/shapes/Browser.mjs +0 -49
- package/dist/@likec4/diagrams/diagram/shapes/Compound.mjs +0 -48
- package/dist/@likec4/diagrams/diagram/shapes/Cylinder.mjs +0 -57
- package/dist/@likec4/diagrams/diagram/shapes/Edge.mjs +0 -63
- package/dist/@likec4/diagrams/diagram/shapes/Mobile.mjs +0 -33
- package/dist/@likec4/diagrams/diagram/shapes/NodeIcon.mjs +0 -28
- package/dist/@likec4/diagrams/diagram/shapes/NodeLabel.mjs +0 -59
- package/dist/@likec4/diagrams/diagram/shapes/Person.mjs +0 -42
- package/dist/@likec4/diagrams/diagram/shapes/Queue.mjs +0 -58
- package/dist/@likec4/diagrams/diagram/shapes/Rectangle.mjs +0 -20
- package/dist/@likec4/diagrams/diagram/shapes/index.mjs +0 -7
- package/dist/@likec4/diagrams/diagram/shapes/types.mjs +0 -0
- package/dist/@likec4/diagrams/diagram/shapes/utils.mjs +0 -12
- package/dist/@likec4/diagrams/diagram/springs.mjs +0 -57
- package/dist/@likec4/diagrams/diagram/state/atoms.mjs +0 -71
- package/dist/@likec4/diagrams/diagram/state/gestures.mjs +0 -19
- package/dist/@likec4/diagrams/diagram/state/hooks.mjs +0 -28
- package/dist/@likec4/diagrams/diagram/state/index.mjs +0 -3
- package/dist/@likec4/diagrams/diagram/state/provider.mjs +0 -7
- package/dist/@likec4/diagrams/diagram/types.mjs +0 -0
- package/dist/@likec4/diagrams/esm/components/EmbeddedDiagram.js +0 -77
- package/dist/@likec4/diagrams/esm/components/FullscreenDiagramBrowser.js +0 -52
- package/dist/@likec4/diagrams/esm/components/index.js +0 -4
- package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/CloseButton.js +0 -43
- package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/FullscreenDiagram.js +0 -116
- package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/FullscreenDiagramTitle.js +0 -32
- package/dist/@likec4/diagrams/esm/components/primitives/index.js +0 -3
- package/dist/@likec4/diagrams/esm/components/primitives/responsive/ResponsiveDiagram.js +0 -42
- package/dist/@likec4/diagrams/esm/components/types.js +0 -0
- package/dist/@likec4/diagrams/esm/diagram/Diagram.js +0 -307
- package/dist/@likec4/diagrams/esm/diagram/Edges.js +0 -117
- package/dist/@likec4/diagrams/esm/diagram/Nodes.js +0 -178
- package/dist/@likec4/diagrams/esm/diagram/icons/BrainIcon.js +0 -20
- package/dist/@likec4/diagrams/esm/diagram/icons/ExternalLink.js +0 -90
- package/dist/@likec4/diagrams/esm/diagram/icons/index.js +0 -2
- package/dist/@likec4/diagrams/esm/diagram/index.js +0 -2
- package/dist/@likec4/diagrams/esm/diagram/shapes/Browser.js +0 -49
- package/dist/@likec4/diagrams/esm/diagram/shapes/Compound.js +0 -48
- package/dist/@likec4/diagrams/esm/diagram/shapes/Cylinder.js +0 -57
- package/dist/@likec4/diagrams/esm/diagram/shapes/Edge.js +0 -63
- package/dist/@likec4/diagrams/esm/diagram/shapes/Mobile.js +0 -33
- package/dist/@likec4/diagrams/esm/diagram/shapes/NodeIcon.js +0 -28
- package/dist/@likec4/diagrams/esm/diagram/shapes/NodeLabel.js +0 -59
- package/dist/@likec4/diagrams/esm/diagram/shapes/Person.js +0 -42
- package/dist/@likec4/diagrams/esm/diagram/shapes/Queue.js +0 -58
- package/dist/@likec4/diagrams/esm/diagram/shapes/Rectangle.js +0 -20
- package/dist/@likec4/diagrams/esm/diagram/shapes/index.js +0 -7
- package/dist/@likec4/diagrams/esm/diagram/shapes/types.js +0 -0
- package/dist/@likec4/diagrams/esm/diagram/shapes/utils.js +0 -12
- package/dist/@likec4/diagrams/esm/diagram/springs.js +0 -57
- package/dist/@likec4/diagrams/esm/diagram/state/atoms.js +0 -71
- package/dist/@likec4/diagrams/esm/diagram/state/gestures.js +0 -19
- package/dist/@likec4/diagrams/esm/diagram/state/hooks.js +0 -28
- package/dist/@likec4/diagrams/esm/diagram/state/index.js +0 -3
- package/dist/@likec4/diagrams/esm/diagram/state/provider.js +0 -7
- package/dist/@likec4/diagrams/esm/diagram/types.js +0 -0
- package/dist/@likec4/diagrams/esm/hooks/index.js +0 -4
- package/dist/@likec4/diagrams/esm/hooks/useDarkMode.js +0 -5
- package/dist/@likec4/diagrams/esm/hooks/useDiagramApi.js +0 -27
- package/dist/@likec4/diagrams/esm/hooks/useImageLoader.js +0 -64
- package/dist/@likec4/diagrams/esm/hooks/useViewIdFromHash.js +0 -87
- package/dist/@likec4/diagrams/esm/index.js +0 -4
- package/dist/@likec4/diagrams/esm/konva-html.js +0 -74
- package/dist/@likec4/diagrams/esm/konva-portal.js +0 -34
- package/dist/@likec4/diagrams/esm/konva.js +0 -22
- package/dist/@likec4/diagrams/esm/likec4.js +0 -54
- package/dist/@likec4/diagrams/hooks/index.mjs +0 -4
- package/dist/@likec4/diagrams/hooks/useDarkMode.mjs +0 -5
- package/dist/@likec4/diagrams/hooks/useDiagramApi.mjs +0 -27
- package/dist/@likec4/diagrams/hooks/useImageLoader.mjs +0 -64
- package/dist/@likec4/diagrams/hooks/useViewIdFromHash.mjs +0 -87
- package/dist/@likec4/diagrams/index.mjs +0 -4
- package/dist/@likec4/diagrams/konva-html.mjs +0 -74
- package/dist/@likec4/diagrams/konva-portal.mjs +0 -34
- package/dist/@likec4/diagrams/konva.mjs +0 -33
- package/dist/@likec4/diagrams/likec4.mjs +0 -54
package/dist/__app__/src/App.jsx
CHANGED
|
@@ -6,7 +6,7 @@ import { useRoute } from './router';
|
|
|
6
6
|
import { Theme } from '@radix-ui/themes';
|
|
7
7
|
const Routes = () => {
|
|
8
8
|
const r = useRoute();
|
|
9
|
-
return (<Theme accentColor='
|
|
9
|
+
return (<Theme hasBackground={r.route !== 'export'} accentColor='indigo' radius='small' appearance={r.params?.theme}>
|
|
10
10
|
{r.route === 'index' && <IndexPage key='index'/>}
|
|
11
11
|
{r.route === 'view' && <ViewPage key='view' viewId={r.params.viewId} showUI={r.showUI}/>}
|
|
12
12
|
{r.route === 'export' && (<ExportPage key='export' viewId={r.params.viewId} padding={r.params.padding}/>)}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Diagram, useDiagramApi } from '@likec4/diagrams';
|
|
2
|
+
import { Box, Portal } from '@radix-ui/themes';
|
|
3
|
+
import { useDebouncedEffect } from '@react-hookz/web/esm';
|
|
4
|
+
import { memo } from 'react';
|
|
5
|
+
function downloadBlob(blob, name) {
|
|
6
|
+
// Convert your blob into a Blob URL (a special url that points to an object in the browser's memory)
|
|
7
|
+
const blobUrl = URL.createObjectURL(blob);
|
|
8
|
+
// Create a link element
|
|
9
|
+
const link = document.createElement('a');
|
|
10
|
+
link.style.display = 'none';
|
|
11
|
+
// Set link's href to point to the Blob URL
|
|
12
|
+
link.href = blobUrl;
|
|
13
|
+
link.download = name;
|
|
14
|
+
// Click handler that releases the object URL after the element has been clicked
|
|
15
|
+
// This is required for one-off downloads of the blob content
|
|
16
|
+
const clickHandler = () => {
|
|
17
|
+
setTimeout(() => {
|
|
18
|
+
URL.revokeObjectURL(blobUrl);
|
|
19
|
+
removeEventListener('click', clickHandler);
|
|
20
|
+
document.body.removeChild(link);
|
|
21
|
+
}, 200);
|
|
22
|
+
};
|
|
23
|
+
link.addEventListener('click', clickHandler, false);
|
|
24
|
+
// Append link to the body
|
|
25
|
+
document.body.appendChild(link);
|
|
26
|
+
// Dispatch click event on the link
|
|
27
|
+
link.dispatchEvent(new MouseEvent('click', {
|
|
28
|
+
bubbles: true,
|
|
29
|
+
cancelable: true,
|
|
30
|
+
view: window
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
const ExportDiagram = memo(({ diagram, onCompleted }) => {
|
|
34
|
+
const id = diagram.id;
|
|
35
|
+
const [ref, diagramApi] = useDiagramApi();
|
|
36
|
+
const padding = 20;
|
|
37
|
+
const width = diagram.width + padding * 2;
|
|
38
|
+
const height = diagram.height + padding * 2;
|
|
39
|
+
// To avoid flickering and double rendering
|
|
40
|
+
useDebouncedEffect(() => {
|
|
41
|
+
void diagramApi.stage
|
|
42
|
+
.toBlob({
|
|
43
|
+
pixelRatio: 2,
|
|
44
|
+
mimeType: 'image/png',
|
|
45
|
+
callback(blob) {
|
|
46
|
+
if (blob) {
|
|
47
|
+
downloadBlob(blob, `${diagram.id}.png`);
|
|
48
|
+
}
|
|
49
|
+
onCompleted();
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
.catch(err => {
|
|
53
|
+
onCompleted();
|
|
54
|
+
// Show error after 100ms to avoid blocking the UI
|
|
55
|
+
setTimeout(() => {
|
|
56
|
+
window.alert(err);
|
|
57
|
+
}, 100);
|
|
58
|
+
});
|
|
59
|
+
}, [id], 400);
|
|
60
|
+
return (<Portal>
|
|
61
|
+
<Box position={'fixed'} style={{
|
|
62
|
+
top: 0,
|
|
63
|
+
left: 0,
|
|
64
|
+
width,
|
|
65
|
+
height,
|
|
66
|
+
transform: `translateY(${-height}px)`
|
|
67
|
+
}}>
|
|
68
|
+
<Diagram ref={ref} animate={false} pannable={false} zoomable={false} diagram={diagram} padding={padding} width={width} height={height}/>
|
|
69
|
+
</Box>
|
|
70
|
+
</Portal>);
|
|
71
|
+
});
|
|
72
|
+
export default ExportDiagram;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { CaretDownIcon, Share1Icon as ShareIcon } from '@radix-ui/react-icons';
|
|
2
|
-
import { Button, Dialog, DropdownMenu, Flex, Text } from '@radix-ui/themes';
|
|
3
|
-
import {
|
|
2
|
+
import { Button, Dialog, DropdownMenu, Flex, IconButton, Separator, Text } from '@radix-ui/themes';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
// import { ThemePanelToggle } from '../ThemePanelToggle'
|
|
5
|
+
import ExportDiagram from './ExportDiagram';
|
|
4
6
|
import { ShareDialog } from './ShareDialog';
|
|
5
|
-
const ExportMenu = ({
|
|
7
|
+
const ExportMenu = ({ onExport, children }) => (<DropdownMenu.Root>
|
|
6
8
|
<DropdownMenu.Trigger>{children}</DropdownMenu.Trigger>
|
|
7
9
|
<DropdownMenu.Content>
|
|
8
10
|
<DropdownMenu.Label>
|
|
@@ -10,8 +12,12 @@ const ExportMenu = ({ diagramApi, children }) => (<DropdownMenu.Root>
|
|
|
10
12
|
</DropdownMenu.Label>
|
|
11
13
|
<DropdownMenu.Group>
|
|
12
14
|
<DropdownMenu.Item onClick={_ => {
|
|
15
|
+
onExport('png');
|
|
13
16
|
// const { boundingBox } = diagramApi.diagramView()
|
|
14
|
-
console.log('Serialized: ', diagramApi.stage.toObject())
|
|
17
|
+
// console.log('Serialized: ', diagramApi.stage.toObject())
|
|
18
|
+
// const k = new KonvaCore.Canvas({
|
|
19
|
+
// height: diagramApi.
|
|
20
|
+
// })
|
|
15
21
|
// diagramApi.stage().toBlob({
|
|
16
22
|
// ...boundingBox,
|
|
17
23
|
// callback(blob) {
|
|
@@ -27,21 +33,40 @@ const ExportMenu = ({ diagramApi, children }) => (<DropdownMenu.Root>
|
|
|
27
33
|
}}>
|
|
28
34
|
Export as .png
|
|
29
35
|
</DropdownMenu.Item>
|
|
30
|
-
<DropdownMenu.Item>Export as .dot</DropdownMenu.Item>
|
|
31
|
-
<DropdownMenu.Item>Export as .
|
|
32
|
-
<DropdownMenu.Item>Export as .
|
|
36
|
+
<DropdownMenu.Item disabled>Export as .dot</DropdownMenu.Item>
|
|
37
|
+
<DropdownMenu.Item disabled>Export as .mmd</DropdownMenu.Item>
|
|
38
|
+
<DropdownMenu.Item disabled>Export as .d2</DropdownMenu.Item>
|
|
33
39
|
</DropdownMenu.Group>
|
|
34
40
|
<DropdownMenu.Separator />
|
|
35
41
|
<DropdownMenu.Label>
|
|
36
42
|
<Text weight='medium'>All views</Text>
|
|
37
43
|
</DropdownMenu.Label>
|
|
38
44
|
<DropdownMenu.Group>
|
|
39
|
-
<DropdownMenu.Item>Download as ZIP</DropdownMenu.Item>
|
|
45
|
+
<DropdownMenu.Item disabled>Download as ZIP</DropdownMenu.Item>
|
|
40
46
|
</DropdownMenu.Group>
|
|
41
47
|
</DropdownMenu.Content>
|
|
42
48
|
</DropdownMenu.Root>);
|
|
43
|
-
export const ViewActionsToolbar = ({
|
|
44
|
-
|
|
49
|
+
export const ViewActionsToolbar = ({ diagram }) => {
|
|
50
|
+
const [exportTo, setExportTo] = useState(null);
|
|
51
|
+
return (<Flex position='fixed' top='0' right='0' p='2' gap={'3'} justify='end' align='center'>
|
|
52
|
+
<Flex display={{
|
|
53
|
+
initial: 'none',
|
|
54
|
+
md: 'flex'
|
|
55
|
+
}} gap='3' align='center'>
|
|
56
|
+
<Button variant='solid' size='1'>
|
|
57
|
+
React
|
|
58
|
+
</Button>
|
|
59
|
+
<Button variant='ghost' size='1'>
|
|
60
|
+
Graphviz
|
|
61
|
+
</Button>
|
|
62
|
+
<Button variant='ghost' size='1'>
|
|
63
|
+
Mermaid
|
|
64
|
+
</Button>
|
|
65
|
+
<IconButton variant='ghost' size='1'>
|
|
66
|
+
<CaretDownIcon />
|
|
67
|
+
</IconButton>
|
|
68
|
+
<Separator orientation='vertical'/>
|
|
69
|
+
</Flex>
|
|
45
70
|
<Dialog.Root>
|
|
46
71
|
<Dialog.Trigger>
|
|
47
72
|
<Button variant='solid'>
|
|
@@ -51,12 +76,13 @@ export const ViewActionsToolbar = ({ diagramApi, diagram }) => {
|
|
|
51
76
|
</Dialog.Trigger>
|
|
52
77
|
<ShareDialog diagram={diagram}/>
|
|
53
78
|
</Dialog.Root>
|
|
54
|
-
<ExportMenu
|
|
79
|
+
<ExportMenu onExport={setExportTo}>
|
|
55
80
|
<Button variant='soft' color='gray'>
|
|
56
81
|
<Text>Export</Text>
|
|
57
82
|
<CaretDownIcon />
|
|
58
83
|
</Button>
|
|
59
84
|
</ExportMenu>
|
|
60
|
-
<
|
|
85
|
+
{exportTo === 'png' && (<ExportDiagram key={'export-diagram-png'} diagram={diagram} onCompleted={() => setExportTo(null)}/>)}
|
|
86
|
+
{/* <ThemePanelToggle /> */}
|
|
61
87
|
</Flex>);
|
|
62
88
|
};
|