@likec4/diagram 1.8.1 → 1.12.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 (114) hide show
  1. package/package.json +21 -45
  2. package/src/LikeC4CustomColors.props.ts +5 -0
  3. package/src/LikeC4CustomColors.tsx +37 -0
  4. package/src/LikeC4Diagram.css.ts +1 -1
  5. package/src/LikeC4Diagram.props.ts +43 -95
  6. package/src/LikeC4Diagram.tsx +21 -2
  7. package/src/LikeC4ModelProvider.tsx +49 -0
  8. package/src/StaticLikeC4Diagram.tsx +1 -0
  9. package/src/globals.css.ts +2 -3
  10. package/src/hooks/index.ts +1 -0
  11. package/src/hooks/useMantinePortalProps.ts +8 -0
  12. package/src/hooks/useXYFlow.ts +1 -2
  13. package/src/index.ts +3 -0
  14. package/src/likec4model/LikeC4ModelContext.ts +4 -0
  15. package/src/likec4model/index.ts +1 -0
  16. package/src/likec4model/useLikeC4Model.ts +55 -0
  17. package/src/mantine/EnsureMantine.tsx +1 -0
  18. package/src/state/DiagramContext.tsx +1 -0
  19. package/src/state/diagram-to-xyflow.ts +2 -3
  20. package/src/state/diagramStore.ts +185 -66
  21. package/src/{theme.css.ts → theme-vars.ts} +11 -4
  22. package/src/ui/DiagramTitlePanel.css.ts +2 -3
  23. package/src/ui/DiagramTitlePanel.tsx +17 -1
  24. package/src/ui/DynamicViewWalkthrough.css.ts +28 -2
  25. package/src/ui/DynamicViewWalkthrough.tsx +97 -52
  26. package/src/ui/OptionsPanel.css.ts +1 -2
  27. package/src/ui/OptionsPanel.tsx +1 -1
  28. package/src/ui/notation/NotationPanel.css.ts +2 -3
  29. package/src/ui/notation/NotationPanel.tsx +11 -12
  30. package/src/ui/options/NodeOptions.tsx +1 -1
  31. package/src/ui/top-left/ChangeAutoLayoutButton.tsx +20 -32
  32. package/src/ui/top-left/TopLeftPanel.tsx +128 -117
  33. package/src/ui/top-left/_shared.ts +7 -6
  34. package/src/ui/top-left/styles.css.ts +17 -8
  35. package/src/utils/vector.ts +57 -0
  36. package/src/xyflow/FitviewOnDiagramChange.tsx +5 -4
  37. package/src/xyflow/SelectEdgesOnNodeFocus.tsx +7 -5
  38. package/src/xyflow/XYFlow.tsx +10 -11
  39. package/src/xyflow/XYFlowEvents.tsx +59 -60
  40. package/src/xyflow/XYFlowInner.tsx +5 -5
  41. package/src/xyflow/edges/EdgeLabel.tsx +185 -0
  42. package/src/xyflow/edges/RelationshipEdge.tsx +170 -137
  43. package/src/xyflow/edges/RelationshipsDropdownMenu.css.ts +60 -0
  44. package/src/xyflow/edges/RelationshipsDropdownMenu.tsx +214 -0
  45. package/src/xyflow/edges/edges.css.ts +75 -7
  46. package/src/xyflow/nodes/compound/CompoundNode.css.ts +1 -2
  47. package/src/xyflow/nodes/compound/CompoundNode.tsx +4 -4
  48. package/src/xyflow/nodes/element/ElementLink.css.ts +1 -1
  49. package/src/xyflow/nodes/element/ElementLink.tsx +3 -8
  50. package/src/xyflow/nodes/element/ElementNode.tsx +47 -4
  51. package/src/xyflow/nodes/element/element.css.ts +1 -2
  52. package/src/xyflow/types.ts +1 -24
  53. package/src/xyflow/useLayoutConstraints.ts +10 -6
  54. package/src/xyflow/utils.ts +1 -1
  55. package/dist/LikeC4Diagram.css.d.ts +0 -4
  56. package/dist/LikeC4Diagram.d.ts +0 -4
  57. package/dist/LikeC4Diagram.props.d.ts +0 -185
  58. package/dist/StaticLikeC4Diagram.d.ts +0 -4
  59. package/dist/globals.css.d.ts +0 -1
  60. package/dist/hooks/index.d.ts +0 -4
  61. package/dist/hooks/useDiagramState.d.ts +0 -6
  62. package/dist/hooks/useSetState.d.ts +0 -3
  63. package/dist/hooks/useUpdateEffect.d.ts +0 -5
  64. package/dist/hooks/useXYFlow.d.ts +0 -267
  65. package/dist/index.d.ts +0 -9
  66. package/dist/index.mjs +0 -3651
  67. package/dist/mantine/EnsureMantine.d.ts +0 -5
  68. package/dist/mantine.css.d.ts +0 -3
  69. package/dist/state/DiagramContext.d.ts +0 -1189
  70. package/dist/state/diagram-to-xyflow.d.ts +0 -12
  71. package/dist/state/diagramStore.d.ts +0 -1268
  72. package/dist/style.css +0 -2139
  73. package/dist/theme.css.d.ts +0 -63
  74. package/dist/ui/DiagramTitlePanel.css.d.ts +0 -4
  75. package/dist/ui/DiagramTitlePanel.d.ts +0 -1
  76. package/dist/ui/DynamicViewWalkthrough.css.d.ts +0 -3
  77. package/dist/ui/DynamicViewWalkthrough.d.ts +0 -1
  78. package/dist/ui/OptionsPanel.css.d.ts +0 -1
  79. package/dist/ui/OptionsPanel.d.ts +0 -1
  80. package/dist/ui/notation/NotationPanel.css.d.ts +0 -6
  81. package/dist/ui/notation/NotationPanel.d.ts +0 -1
  82. package/dist/ui/notation/index.d.ts +0 -1
  83. package/dist/ui/options/EdgeOptions.d.ts +0 -19
  84. package/dist/ui/options/NodeOptions.d.ts +0 -19
  85. package/dist/ui/top-left/ChangeAutoLayoutButton.d.ts +0 -3
  86. package/dist/ui/top-left/TopLeftPanel.d.ts +0 -4
  87. package/dist/ui/top-left/_shared.d.ts +0 -5
  88. package/dist/ui/top-left/styles.css.d.ts +0 -3
  89. package/dist/xyflow/EdgeMarkers.d.ts +0 -12
  90. package/dist/xyflow/FitviewOnDiagramChange.d.ts +0 -4
  91. package/dist/xyflow/SelectEdgesOnNodeFocus.d.ts +0 -1
  92. package/dist/xyflow/XYFlow.d.ts +0 -9
  93. package/dist/xyflow/XYFlowBackground.d.ts +0 -11
  94. package/dist/xyflow/XYFlowEvents.d.ts +0 -161
  95. package/dist/xyflow/XYFlowInner.d.ts +0 -10
  96. package/dist/xyflow/const.d.ts +0 -7
  97. package/dist/xyflow/edges/RelationshipEdge.d.ts +0 -32
  98. package/dist/xyflow/edges/edges.css.d.ts +0 -12
  99. package/dist/xyflow/edges/utils.d.ts +0 -17
  100. package/dist/xyflow/nodes/compound/CompoundNode.css.d.ts +0 -11
  101. package/dist/xyflow/nodes/compound/CompoundNode.d.ts +0 -6
  102. package/dist/xyflow/nodes/compound/index.d.ts +0 -1
  103. package/dist/xyflow/nodes/element/ElementLink.css.d.ts +0 -3
  104. package/dist/xyflow/nodes/element/ElementLink.d.ts +0 -7
  105. package/dist/xyflow/nodes/element/ElementNode.d.ts +0 -6
  106. package/dist/xyflow/nodes/element/ElementShapeSvg.d.ts +0 -18
  107. package/dist/xyflow/nodes/element/element.css.d.ts +0 -19
  108. package/dist/xyflow/nodes/element/index.d.ts +0 -1
  109. package/dist/xyflow/nodes/shared/NavigateToBtn.d.ts +0 -5
  110. package/dist/xyflow/types.d.ts +0 -50
  111. package/dist/xyflow/useLayoutConstraints.d.ts +0 -9
  112. package/dist/xyflow/utils.d.ts +0 -18
  113. package/src/mantine.css.ts +0 -7
  114. package/src/reset.d.ts +0 -2
@@ -1,4 +1,5 @@
1
- import { Box, Button, ButtonGroup } from '@mantine/core'
1
+ import { nonNullable } from '@likec4/core'
2
+ import { Badge, Box, Button, ButtonGroup } from '@mantine/core'
2
3
  import { useHotkeys } from '@mantine/hooks'
3
4
  import {
4
5
  IconPlayerPlayFilled,
@@ -7,8 +8,9 @@ import {
7
8
  IconPlayerStopFilled
8
9
  } from '@tabler/icons-react'
9
10
  import clsx from 'clsx'
10
- import { isNullish, isNumber } from 'remeda'
11
- import { useDiagramState, useXYStore } from '../hooks'
11
+ import { AnimatePresence, m } from 'framer-motion'
12
+ import { first, isNonNull, isTruthy } from 'remeda'
13
+ import { useDiagramState, useDiagramStoreApi, useXYStore } from '../hooks'
12
14
  import * as css from './DynamicViewWalkthrough.css'
13
15
 
14
16
  export function DynamicViewWalkthrough() {
@@ -16,16 +18,19 @@ export function DynamicViewWalkthrough() {
16
18
  const {
17
19
  nextDynamicStep,
18
20
  stopDynamicView,
19
- activeDynamicViewStep,
20
- hasNextSteps
21
+ isActive,
22
+ isParallel,
23
+ hasNext,
24
+ hasPrevious
21
25
  } = useDiagramState(s => ({
22
26
  nextDynamicStep: s.nextDynamicStep,
23
- stopDynamicView: s.stopDynamicView,
24
- activeDynamicViewStep: s.activeDynamicViewStep,
25
- hasNextSteps: (s.activeDynamicViewStep ?? 1) < s.view.edges.length
27
+ stopDynamicView: s.stopWalkthrough,
28
+ isActive: isNonNull(s.activeWalkthrough),
29
+ isParallel: isTruthy(s.activeWalkthrough?.parallelPrefix),
30
+ hasNext: s.activeWalkthrough?.hasNext ?? false,
31
+ hasPrevious: s.activeWalkthrough?.hasPrevious ?? false
26
32
  }))
27
-
28
- const isActive = isNumber(activeDynamicViewStep)
33
+ const diagramApi = useDiagramStoreApi()
29
34
 
30
35
  useHotkeys(
31
36
  isActive
@@ -49,58 +54,98 @@ export function DynamicViewWalkthrough() {
49
54
  radius: isMobile ? 'lg' : 'xl'
50
55
  }
51
56
 
57
+ const startWalkthrough = (e: React.MouseEvent) => {
58
+ e.stopPropagation()
59
+ const {
60
+ xyedges,
61
+ activateWalkthrough
62
+ } = diagramApi.getState()
63
+ const firstEdge = nonNullable(first(xyedges), 'expected at least one edge')
64
+ activateWalkthrough(firstEdge.data.edge.id)
65
+ }
66
+
52
67
  const nextStep = (increment = 1) => (e: React.MouseEvent) => {
53
68
  e.stopPropagation()
54
69
  nextDynamicStep(increment)
55
70
  }
56
71
 
57
72
  return (
58
- <Box
59
- className={clsx('react-flow__panel', css.container)}
60
- onClick={(e) => e.stopPropagation()}
61
- onDoubleClick={(e) => e.stopPropagation()}
62
- >
63
- {isNullish(activeDynamicViewStep)
64
- && (
65
- <Button
66
- {...buttonProps}
67
- className={clsx(css.buttons, css.btn)}
68
- rightSection={<IconPlayerPlayFilled />}
69
- onClick={nextStep()}
70
- px={'xl'}>
71
- Start
72
- </Button>
73
+ <AnimatePresence>
74
+ {isParallel && (
75
+ <Box
76
+ layout
77
+ key={'parallel-frame'}
78
+ component={m.div}
79
+ initial={{ opacity: 0 }}
80
+ animate={{ opacity: 1 }}
81
+ exit={{ opacity: 0 }}
82
+ className={clsx('react-flow__panel', css.parallelStateFrame)}
83
+ />
84
+ )}
85
+ <Box
86
+ className={clsx('react-flow__panel', css.container)}
87
+ onClick={(e) => e.stopPropagation()}
88
+ onDoubleClick={(e) => e.stopPropagation()}
89
+ >
90
+ {!isActive
91
+ && (
92
+ <Button
93
+ {...buttonProps}
94
+ className={clsx(css.buttons, css.btn)}
95
+ rightSection={<IconPlayerPlayFilled />}
96
+ onClick={startWalkthrough}
97
+ px={'xl'}>
98
+ Start
99
+ </Button>
100
+ )}
101
+ {isParallel && (
102
+ <Badge
103
+ key={'parallel-badge'}
104
+ component={m.div}
105
+ initial={{ opacity: 0.05, transform: 'translateY(20px)' }}
106
+ animate={{ opacity: 1, transform: 'translateY(0)' }}
107
+ exit={{
108
+ opacity: 0,
109
+ transform: 'translateY(20px)'
110
+ }}
111
+ variant="gradient"
112
+ size={isMobile ? 'xs' : 'md'}
113
+ gradient={{ from: 'red', to: 'orange', deg: 90 }}
114
+ radius={'sm'}>
115
+ parallel
116
+ </Badge>
73
117
  )}
74
- {isNumber(activeDynamicViewStep) && (
75
- <ButtonGroup className={css.buttons}>
76
- <Button
77
- {...buttonProps}
78
- pl={'lg'}
79
- disabled={activeDynamicViewStep === 1}
80
- onClick={nextStep(-1)}>
81
- <IconPlayerSkipBackFilled />
82
- </Button>
118
+ {isActive && (
119
+ <ButtonGroup className={css.buttons}>
120
+ <Button
121
+ {...buttonProps}
122
+ pl={'lg'}
123
+ disabled={!hasPrevious}
124
+ onClick={nextStep(-1)}>
125
+ <IconPlayerSkipBackFilled />
126
+ </Button>
83
127
 
84
- <Button
85
- {...buttonProps}
86
- px={hasNextSteps ? 'md' : 'xl'}
87
- onClick={e => {
88
- e.stopPropagation()
89
- stopDynamicView()
90
- }}>
91
- {hasNextSteps && <IconPlayerStopFilled />}
92
- {!hasNextSteps && 'End'}
93
- </Button>
94
- {hasNextSteps && (
95
128
  <Button
96
129
  {...buttonProps}
97
- pr={'lg'}
98
- onClick={nextStep()}>
99
- <IconPlayerSkipForwardFilled />
130
+ px={hasNext ? 'md' : 'xl'}
131
+ onClick={e => {
132
+ e.stopPropagation()
133
+ stopDynamicView()
134
+ }}>
135
+ {hasNext && <IconPlayerStopFilled />}
136
+ {!hasNext && 'End'}
100
137
  </Button>
101
- )}
102
- </ButtonGroup>
103
- )}
104
- </Box>
138
+ {hasNext && (
139
+ <Button
140
+ {...buttonProps}
141
+ pr={'lg'}
142
+ onClick={nextStep()}>
143
+ <IconPlayerSkipForwardFilled />
144
+ </Button>
145
+ )}
146
+ </ButtonGroup>
147
+ )}
148
+ </Box>
149
+ </AnimatePresence>
105
150
  )
106
151
  }
@@ -1,6 +1,5 @@
1
1
  import { fallbackVar, style } from '@vanilla-extract/css'
2
- import { mantine } from '../mantine.css'
3
- import { vars } from '../theme.css'
2
+ import { mantine, vars } from '../theme-vars'
4
3
 
5
4
  export const panel = style({
6
5
  top: fallbackVar(vars.optionsPanel.top, '1rem'),
@@ -11,7 +11,7 @@ import * as styles from './OptionsPanel.css'
11
11
  export default function OptionsPanel() {
12
12
  const { isFocused, viewId } = useDiagramState(s => ({
13
13
  viewId: s.view.id,
14
- isFocused: s.focusedNodeId !== null || s.activeDynamicViewStep !== null
14
+ isFocused: s.focusedNodeId !== null || s.activeWalkthrough !== null
15
15
  }))
16
16
  const [selected, setSelected] = useState<{
17
17
  nodes: string[]
@@ -1,7 +1,6 @@
1
- import { fallbackVar, globalStyle, style } from '@vanilla-extract/css'
1
+ import { fallbackVar, style } from '@vanilla-extract/css'
2
2
  import { calc } from '@vanilla-extract/css-utils'
3
- import { mantine, whereDark } from '../../mantine.css'
4
- import { vars } from '../../theme.css'
3
+ import { mantine, vars, whereDark } from '../../theme-vars'
5
4
  import { stokeFillMix } from '../../xyflow/nodes/element/element.css'
6
5
 
7
6
  export const container = style({
@@ -23,7 +23,8 @@ import { AnimatePresence, m } from 'framer-motion'
23
23
  import { useState } from 'react'
24
24
  import { ceil, isNonNullish, isNullish } from 'remeda'
25
25
  import { type DiagramState, useDiagramState, useDiagramStoreApi } from '../../hooks/useDiagramState'
26
- import { vars } from '../../theme.css'
26
+ import { useMantinePortalProps } from '../../hooks/useMantinePortalProps'
27
+ import { vars } from '../../theme-vars'
27
28
  import { ElementShapeSvg } from '../../xyflow/nodes/element/ElementShapeSvg'
28
29
  import * as css from './NotationPanel.css'
29
30
 
@@ -120,8 +121,7 @@ const selector = (s: DiagramState) => ({
120
121
  id: s.view.id,
121
122
  notations: s.view.notation?.elements ?? [],
122
123
  height: s.xystore.getState().height,
123
- isVisible: isNullish(s.focusedNodeId ?? s.activeDynamicViewStep),
124
- target: s.getContainer()
124
+ isVisible: isNullish(s.focusedNodeId ?? s.activeWalkthrough)
125
125
  })
126
126
 
127
127
  export function NotationPanel() {
@@ -129,19 +129,18 @@ export function NotationPanel() {
129
129
  id,
130
130
  notations,
131
131
  isVisible,
132
- height,
133
- target
132
+ height
134
133
  } = useDiagramState(selector)
135
134
  const [isCollapsed, setCollapsed] = useLocalStorage({
136
- key: 'notation-panel-collapsed',
135
+ key: 'notation-webview-collapsed',
137
136
  defaultValue: true
138
137
  })
139
138
  const hasNotations = notations.length > 0
140
- const portalProps = target ? { portalProps: { target } } : { withinPortal: false }
139
+ const portalProps = useMantinePortalProps()
141
140
 
142
141
  return (
143
142
  <AnimatePresence>
144
- {!hasNotations && (
143
+ {!hasNotations && isVisible && (
145
144
  <m.div
146
145
  key={'empty'}
147
146
  initial={{ opacity: 0.75, translateX: '50%' }}
@@ -151,9 +150,9 @@ export function NotationPanel() {
151
150
  opacity: 0.6
152
151
  }}
153
152
  className={clsx('react-flow__panel', css.container)}>
154
- <Tooltip label="Diagram has no notations" color="orange" {...portalProps}>
153
+ <Tooltip label="View has no notations" color="orange" {...portalProps}>
155
154
  <ThemeIcon
156
- size={'xl'}
155
+ size={'lg'}
157
156
  variant="light"
158
157
  color="orange"
159
158
  radius={'md'}
@@ -176,7 +175,7 @@ export function NotationPanel() {
176
175
  >
177
176
  <Tooltip label="Show notation" color="dark" fz={'xs'} {...portalProps}>
178
177
  <ActionIcon
179
- size={'xl'}
178
+ size={'lg'}
180
179
  variant="light"
181
180
  color="gray"
182
181
  radius={'md'}
@@ -236,7 +235,7 @@ export function NotationPanel() {
236
235
  <ScrollAreaAutosize
237
236
  viewportProps={{
238
237
  style: {
239
- maxHeight: height > 50 ? `min(40vh, ${height - 20}px)` : '40vh'
238
+ maxHeight: `min(40vh, ${Math.max(height - 60, 50)}px)`
240
239
  }
241
240
  }}>
242
241
  <Stack gap={0}>
@@ -92,7 +92,7 @@ export const NodeOptions = memo<{ selectedNodeIds: string[] }>(({ selectedNodeId
92
92
  return (
93
93
  <Stack gap={'xs'}>
94
94
  <Group wrap="nowrap" align="flex-start">
95
- <Box flex={1}>
95
+ <Box flex={1} miw={0}>
96
96
  <Text fz={rem(9)} fw={'500'} c={'dimmed'}>
97
97
  ELEMENT{rest.length > 0 ? 'S' : ``}
98
98
  </Text>
@@ -10,31 +10,20 @@ import {
10
10
  PopoverTarget,
11
11
  Stack,
12
12
  Text,
13
- Tooltip as MantineTooltip,
14
13
  TooltipGroup
15
14
  } from '@mantine/core'
16
15
  import { IconArrowBigDownLines, IconLayoutDashboard } from '@tabler/icons-react'
17
16
  import { useState } from 'react'
18
17
  import { useDiagramState, useDiagramStoreApi } from '../../hooks/useDiagramState'
18
+ import { ActionIcon, Tooltip } from './_shared'
19
19
  import * as css from './styles.css'
20
20
 
21
- const ActionIcon = MantineActionIcon.withProps({
21
+ const DirectionActionIcon = MantineActionIcon.withProps({
22
22
  size: 'md',
23
23
  variant: 'subtle',
24
24
  color: 'gray'
25
25
  })
26
26
 
27
- const Tooltip = MantineTooltip.withProps({
28
- color: 'gray',
29
- fz: 'xs',
30
- position: 'right',
31
- openDelay: 300,
32
- label: '',
33
- children: null,
34
- offset: 5,
35
- transitionProps: { transition: 'fade', duration: 200 }
36
- })
37
-
38
27
  export const ChangeAutoLayoutButton = (props: PopoverProps) => {
39
28
  const store = useDiagramStoreApi()
40
29
  const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null)
@@ -69,17 +58,16 @@ export const ChangeAutoLayoutButton = (props: PopoverProps) => {
69
58
  }}
70
59
  {...props}>
71
60
  <PopoverTarget>
72
- <MantineActionIcon
73
- className="action-icon"
74
- variant="light"
75
- color="gray">
76
- <IconLayoutDashboard stroke={1.3} />
77
- </MantineActionIcon>
61
+ <Tooltip label="Change Auto Layout">
62
+ <ActionIcon>
63
+ <IconLayoutDashboard />
64
+ </ActionIcon>
65
+ </Tooltip>
78
66
  </PopoverTarget>
79
67
  <PopoverDropdown className="likec4-top-left-panel" p={8} pt={4}>
80
68
  <Box pos={'relative'} ref={setRootRef}>
81
69
  <FloatingIndicator
82
- target={controlsRefs[autoLayout]}
70
+ target={controlsRefs[autoLayout.direction]}
83
71
  parent={rootRef}
84
72
  className={css.autolayoutIndicator}
85
73
  />
@@ -89,38 +77,38 @@ export const ChangeAutoLayoutButton = (props: PopoverProps) => {
89
77
  <TooltipGroup openDelay={100}>
90
78
  <Stack align="center" gap={1}>
91
79
  <Tooltip label="Top to Bottom">
92
- <ActionIcon
80
+ <DirectionActionIcon
93
81
  className={css.autolayoutIcon}
94
82
  ref={setControlRef('TB')}
95
83
  onClick={setAutoLayout('TB')}>
96
- <IconArrowBigDownLines stroke={1.3} />
97
- </ActionIcon>
84
+ <IconArrowBigDownLines />
85
+ </DirectionActionIcon>
98
86
  </Tooltip>
99
87
  <Group gap={30}>
100
88
  <Tooltip label="Left to Right">
101
- <ActionIcon
89
+ <DirectionActionIcon
102
90
  className={css.autolayoutIcon}
103
91
  ref={setControlRef('LR')}
104
92
  onClick={setAutoLayout('LR')}>
105
- <IconArrowBigDownLines stroke={1.3} style={{ rotate: '270deg' }} />
106
- </ActionIcon>
93
+ <IconArrowBigDownLines style={{ rotate: '270deg' }} />
94
+ </DirectionActionIcon>
107
95
  </Tooltip>
108
96
  <Tooltip label="Right to Left">
109
- <ActionIcon
97
+ <DirectionActionIcon
110
98
  className={css.autolayoutIcon}
111
99
  ref={setControlRef('RL')}
112
100
  onClick={setAutoLayout('RL')}>
113
- <IconArrowBigDownLines stroke={1.3} style={{ rotate: '90deg' }} />
114
- </ActionIcon>
101
+ <IconArrowBigDownLines style={{ rotate: '90deg' }} />
102
+ </DirectionActionIcon>
115
103
  </Tooltip>
116
104
  </Group>
117
105
  <Tooltip label="Bottom to Top">
118
- <ActionIcon
106
+ <DirectionActionIcon
119
107
  className={css.autolayoutIcon}
120
108
  ref={setControlRef('BT')}
121
109
  onClick={setAutoLayout('BT')}>
122
- <IconArrowBigDownLines stroke={1.3} style={{ rotate: '180deg' }} />
123
- </ActionIcon>
110
+ <IconArrowBigDownLines style={{ rotate: '180deg' }} />
111
+ </DirectionActionIcon>
124
112
  </Tooltip>
125
113
  </Stack>
126
114
  </TooltipGroup>