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.
Files changed (143) hide show
  1. package/dist/__app__/src/App.jsx +1 -1
  2. package/dist/__app__/src/components/view-page/ExportDiagram.jsx +72 -0
  3. package/dist/__app__/src/components/view-page/ViewActionsToolbar.jsx +38 -12
  4. package/dist/cli/index.js +51 -51
  5. package/package.json +6 -6
  6. package/dist/@likec4/diagrams/cjs/components/EmbeddedDiagram.js +0 -83
  7. package/dist/@likec4/diagrams/cjs/components/FullscreenDiagramBrowser.js +0 -50
  8. package/dist/@likec4/diagrams/cjs/components/index.js +0 -49
  9. package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/CloseButton.js +0 -44
  10. package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/FullscreenDiagram.js +0 -110
  11. package/dist/@likec4/diagrams/cjs/components/primitives/fullscreen/FullscreenDiagramTitle.js +0 -39
  12. package/dist/@likec4/diagrams/cjs/components/primitives/index.js +0 -38
  13. package/dist/@likec4/diagrams/cjs/components/primitives/responsive/ResponsiveDiagram.js +0 -56
  14. package/dist/@likec4/diagrams/cjs/components/types.js +0 -1
  15. package/dist/@likec4/diagrams/cjs/diagram/Diagram.js +0 -326
  16. package/dist/@likec4/diagrams/cjs/diagram/Edges.js +0 -121
  17. package/dist/@likec4/diagrams/cjs/diagram/Nodes.js +0 -204
  18. package/dist/@likec4/diagrams/cjs/diagram/icons/BrainIcon.js +0 -25
  19. package/dist/@likec4/diagrams/cjs/diagram/icons/ExternalLink.js +0 -82
  20. package/dist/@likec4/diagrams/cjs/diagram/icons/index.js +0 -27
  21. package/dist/@likec4/diagrams/cjs/diagram/index.js +0 -27
  22. package/dist/@likec4/diagrams/cjs/diagram/shapes/Browser.js +0 -67
  23. package/dist/@likec4/diagrams/cjs/diagram/shapes/Compound.js +0 -55
  24. package/dist/@likec4/diagrams/cjs/diagram/shapes/Cylinder.js +0 -71
  25. package/dist/@likec4/diagrams/cjs/diagram/shapes/Edge.js +0 -62
  26. package/dist/@likec4/diagrams/cjs/diagram/shapes/Mobile.js +0 -45
  27. package/dist/@likec4/diagrams/cjs/diagram/shapes/NodeIcon.js +0 -38
  28. package/dist/@likec4/diagrams/cjs/diagram/shapes/NodeLabel.js +0 -62
  29. package/dist/@likec4/diagrams/cjs/diagram/shapes/Person.js +0 -48
  30. package/dist/@likec4/diagrams/cjs/diagram/shapes/Queue.js +0 -72
  31. package/dist/@likec4/diagrams/cjs/diagram/shapes/Rectangle.js +0 -30
  32. package/dist/@likec4/diagrams/cjs/diagram/shapes/index.js +0 -54
  33. package/dist/@likec4/diagrams/cjs/diagram/shapes/types.js +0 -1
  34. package/dist/@likec4/diagrams/cjs/diagram/shapes/utils.js +0 -19
  35. package/dist/@likec4/diagrams/cjs/diagram/springs.js +0 -61
  36. package/dist/@likec4/diagrams/cjs/diagram/state/atoms.js +0 -63
  37. package/dist/@likec4/diagrams/cjs/diagram/state/gestures.js +0 -26
  38. package/dist/@likec4/diagrams/cjs/diagram/state/hooks.js +0 -36
  39. package/dist/@likec4/diagrams/cjs/diagram/state/index.js +0 -38
  40. package/dist/@likec4/diagrams/cjs/diagram/state/provider.js +0 -18
  41. package/dist/@likec4/diagrams/cjs/diagram/types.js +0 -1
  42. package/dist/@likec4/diagrams/cjs/hooks/index.js +0 -49
  43. package/dist/@likec4/diagrams/cjs/hooks/useDarkMode.js +0 -11
  44. package/dist/@likec4/diagrams/cjs/hooks/useDiagramApi.js +0 -27
  45. package/dist/@likec4/diagrams/cjs/hooks/useImageLoader.js +0 -68
  46. package/dist/@likec4/diagrams/cjs/hooks/useViewIdFromHash.js +0 -93
  47. package/dist/@likec4/diagrams/cjs/index.js +0 -51
  48. package/dist/@likec4/diagrams/cjs/konva-html.js +0 -93
  49. package/dist/@likec4/diagrams/cjs/konva-portal.js +0 -50
  50. package/dist/@likec4/diagrams/cjs/konva.js +0 -102
  51. package/dist/@likec4/diagrams/cjs/likec4.js +0 -91
  52. package/dist/@likec4/diagrams/components/EmbeddedDiagram.mjs +0 -77
  53. package/dist/@likec4/diagrams/components/FullscreenDiagramBrowser.mjs +0 -52
  54. package/dist/@likec4/diagrams/components/index.mjs +0 -4
  55. package/dist/@likec4/diagrams/components/primitives/fullscreen/CloseButton.mjs +0 -43
  56. package/dist/@likec4/diagrams/components/primitives/fullscreen/FullscreenDiagram.mjs +0 -116
  57. package/dist/@likec4/diagrams/components/primitives/fullscreen/FullscreenDiagramTitle.mjs +0 -32
  58. package/dist/@likec4/diagrams/components/primitives/index.mjs +0 -3
  59. package/dist/@likec4/diagrams/components/primitives/responsive/ResponsiveDiagram.mjs +0 -42
  60. package/dist/@likec4/diagrams/components/types.mjs +0 -0
  61. package/dist/@likec4/diagrams/diagram/Diagram.mjs +0 -307
  62. package/dist/@likec4/diagrams/diagram/Edges.mjs +0 -117
  63. package/dist/@likec4/diagrams/diagram/Nodes.mjs +0 -178
  64. package/dist/@likec4/diagrams/diagram/icons/BrainIcon.mjs +0 -20
  65. package/dist/@likec4/diagrams/diagram/icons/ExternalLink.mjs +0 -90
  66. package/dist/@likec4/diagrams/diagram/icons/index.mjs +0 -2
  67. package/dist/@likec4/diagrams/diagram/index.mjs +0 -2
  68. package/dist/@likec4/diagrams/diagram/shapes/Browser.mjs +0 -49
  69. package/dist/@likec4/diagrams/diagram/shapes/Compound.mjs +0 -48
  70. package/dist/@likec4/diagrams/diagram/shapes/Cylinder.mjs +0 -57
  71. package/dist/@likec4/diagrams/diagram/shapes/Edge.mjs +0 -63
  72. package/dist/@likec4/diagrams/diagram/shapes/Mobile.mjs +0 -33
  73. package/dist/@likec4/diagrams/diagram/shapes/NodeIcon.mjs +0 -28
  74. package/dist/@likec4/diagrams/diagram/shapes/NodeLabel.mjs +0 -59
  75. package/dist/@likec4/diagrams/diagram/shapes/Person.mjs +0 -42
  76. package/dist/@likec4/diagrams/diagram/shapes/Queue.mjs +0 -58
  77. package/dist/@likec4/diagrams/diagram/shapes/Rectangle.mjs +0 -20
  78. package/dist/@likec4/diagrams/diagram/shapes/index.mjs +0 -7
  79. package/dist/@likec4/diagrams/diagram/shapes/types.mjs +0 -0
  80. package/dist/@likec4/diagrams/diagram/shapes/utils.mjs +0 -12
  81. package/dist/@likec4/diagrams/diagram/springs.mjs +0 -57
  82. package/dist/@likec4/diagrams/diagram/state/atoms.mjs +0 -71
  83. package/dist/@likec4/diagrams/diagram/state/gestures.mjs +0 -19
  84. package/dist/@likec4/diagrams/diagram/state/hooks.mjs +0 -28
  85. package/dist/@likec4/diagrams/diagram/state/index.mjs +0 -3
  86. package/dist/@likec4/diagrams/diagram/state/provider.mjs +0 -7
  87. package/dist/@likec4/diagrams/diagram/types.mjs +0 -0
  88. package/dist/@likec4/diagrams/esm/components/EmbeddedDiagram.js +0 -77
  89. package/dist/@likec4/diagrams/esm/components/FullscreenDiagramBrowser.js +0 -52
  90. package/dist/@likec4/diagrams/esm/components/index.js +0 -4
  91. package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/CloseButton.js +0 -43
  92. package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/FullscreenDiagram.js +0 -116
  93. package/dist/@likec4/diagrams/esm/components/primitives/fullscreen/FullscreenDiagramTitle.js +0 -32
  94. package/dist/@likec4/diagrams/esm/components/primitives/index.js +0 -3
  95. package/dist/@likec4/diagrams/esm/components/primitives/responsive/ResponsiveDiagram.js +0 -42
  96. package/dist/@likec4/diagrams/esm/components/types.js +0 -0
  97. package/dist/@likec4/diagrams/esm/diagram/Diagram.js +0 -307
  98. package/dist/@likec4/diagrams/esm/diagram/Edges.js +0 -117
  99. package/dist/@likec4/diagrams/esm/diagram/Nodes.js +0 -178
  100. package/dist/@likec4/diagrams/esm/diagram/icons/BrainIcon.js +0 -20
  101. package/dist/@likec4/diagrams/esm/diagram/icons/ExternalLink.js +0 -90
  102. package/dist/@likec4/diagrams/esm/diagram/icons/index.js +0 -2
  103. package/dist/@likec4/diagrams/esm/diagram/index.js +0 -2
  104. package/dist/@likec4/diagrams/esm/diagram/shapes/Browser.js +0 -49
  105. package/dist/@likec4/diagrams/esm/diagram/shapes/Compound.js +0 -48
  106. package/dist/@likec4/diagrams/esm/diagram/shapes/Cylinder.js +0 -57
  107. package/dist/@likec4/diagrams/esm/diagram/shapes/Edge.js +0 -63
  108. package/dist/@likec4/diagrams/esm/diagram/shapes/Mobile.js +0 -33
  109. package/dist/@likec4/diagrams/esm/diagram/shapes/NodeIcon.js +0 -28
  110. package/dist/@likec4/diagrams/esm/diagram/shapes/NodeLabel.js +0 -59
  111. package/dist/@likec4/diagrams/esm/diagram/shapes/Person.js +0 -42
  112. package/dist/@likec4/diagrams/esm/diagram/shapes/Queue.js +0 -58
  113. package/dist/@likec4/diagrams/esm/diagram/shapes/Rectangle.js +0 -20
  114. package/dist/@likec4/diagrams/esm/diagram/shapes/index.js +0 -7
  115. package/dist/@likec4/diagrams/esm/diagram/shapes/types.js +0 -0
  116. package/dist/@likec4/diagrams/esm/diagram/shapes/utils.js +0 -12
  117. package/dist/@likec4/diagrams/esm/diagram/springs.js +0 -57
  118. package/dist/@likec4/diagrams/esm/diagram/state/atoms.js +0 -71
  119. package/dist/@likec4/diagrams/esm/diagram/state/gestures.js +0 -19
  120. package/dist/@likec4/diagrams/esm/diagram/state/hooks.js +0 -28
  121. package/dist/@likec4/diagrams/esm/diagram/state/index.js +0 -3
  122. package/dist/@likec4/diagrams/esm/diagram/state/provider.js +0 -7
  123. package/dist/@likec4/diagrams/esm/diagram/types.js +0 -0
  124. package/dist/@likec4/diagrams/esm/hooks/index.js +0 -4
  125. package/dist/@likec4/diagrams/esm/hooks/useDarkMode.js +0 -5
  126. package/dist/@likec4/diagrams/esm/hooks/useDiagramApi.js +0 -27
  127. package/dist/@likec4/diagrams/esm/hooks/useImageLoader.js +0 -64
  128. package/dist/@likec4/diagrams/esm/hooks/useViewIdFromHash.js +0 -87
  129. package/dist/@likec4/diagrams/esm/index.js +0 -4
  130. package/dist/@likec4/diagrams/esm/konva-html.js +0 -74
  131. package/dist/@likec4/diagrams/esm/konva-portal.js +0 -34
  132. package/dist/@likec4/diagrams/esm/konva.js +0 -22
  133. package/dist/@likec4/diagrams/esm/likec4.js +0 -54
  134. package/dist/@likec4/diagrams/hooks/index.mjs +0 -4
  135. package/dist/@likec4/diagrams/hooks/useDarkMode.mjs +0 -5
  136. package/dist/@likec4/diagrams/hooks/useDiagramApi.mjs +0 -27
  137. package/dist/@likec4/diagrams/hooks/useImageLoader.mjs +0 -64
  138. package/dist/@likec4/diagrams/hooks/useViewIdFromHash.mjs +0 -87
  139. package/dist/@likec4/diagrams/index.mjs +0 -4
  140. package/dist/@likec4/diagrams/konva-html.mjs +0 -74
  141. package/dist/@likec4/diagrams/konva-portal.mjs +0 -34
  142. package/dist/@likec4/diagrams/konva.mjs +0 -33
  143. package/dist/@likec4/diagrams/likec4.mjs +0 -54
@@ -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='iris' panelBackground='translucent' appearance={r.params?.theme} radius='small'>
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 { ThemePanelToggle } from '../ThemePanelToggle';
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 = ({ diagramApi, children }) => (<DropdownMenu.Root>
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 .d2</DropdownMenu.Item>
32
- <DropdownMenu.Item>Export as .mmd</DropdownMenu.Item>
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 = ({ diagramApi, diagram }) => {
44
- return (<Flex position='fixed' top='0' right='0' p='2' gap={'3'} justify='end'>
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 diagramApi={diagramApi}>
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
- <ThemePanelToggle />
85
+ {exportTo === 'png' && (<ExportDiagram key={'export-diagram-png'} diagram={diagram} onCompleted={() => setExportTo(null)}/>)}
86
+ {/* <ThemePanelToggle /> */}
61
87
  </Flex>);
62
88
  };