diff --git a/src/components/Gradient/Gradient.tsx b/src/components/Gradient/Gradient.tsx new file mode 100644 index 0000000..c753ed8 --- /dev/null +++ b/src/components/Gradient/Gradient.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { Box, SxProps } from '@mui/material'; + +interface Props { + sx?: SxProps; +} + +export const Gradient = ({ sx }: Props) => { + return ( + + ); +}; diff --git a/src/components/ItemControls/NodeControls/NodeSettings/NodeSettings.tsx b/src/components/ItemControls/NodeControls/NodeSettings/NodeSettings.tsx index f51aa5c..762fd48 100644 --- a/src/components/ItemControls/NodeControls/NodeSettings/NodeSettings.tsx +++ b/src/components/ItemControls/NodeControls/NodeSettings/NodeSettings.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Slider, Box } from '@mui/material'; +import { Slider, Box, TextField } from '@mui/material'; import { Node } from 'src/types'; import { MarkdownEditor } from 'src/components/MarkdownEditor/MarkdownEditor'; import { DeleteButton } from '../../components/DeleteButton'; @@ -15,13 +15,22 @@ export const NodeSettings = ({ node, onUpdate, onDelete }: Props) => { return ( <>
- { + onChange={(e) => { + const text = e.target.value as string; if (node.label !== text) onUpdate({ label: text }); }} />
+
+ { + if (node.description !== text) onUpdate({ description: text }); + }} + /> +
{node.label && (
void; readOnly?: boolean; height?: number; @@ -55,7 +55,7 @@ export const MarkdownEditor = ({ > {children} + {contentSize.height >= MAX_LABEL_HEIGHT - 10 && ( + + + + + + )} ); diff --git a/src/components/SceneLayers/Nodes/Node/LabelTypes/MarkdownLabel.tsx b/src/components/SceneLayers/Nodes/Node/LabelTypes/MarkdownLabel.tsx deleted file mode 100644 index 8d0f8a9..0000000 --- a/src/components/SceneLayers/Nodes/Node/LabelTypes/MarkdownLabel.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; -import { Box } from '@mui/material'; -import { MarkdownEditor } from 'src/components/MarkdownEditor/MarkdownEditor'; - -interface Props { - label: string; -} - -export const MarkdownLabel = ({ label }: Props) => { - return ( - - - - ); -}; diff --git a/src/components/SceneLayers/Nodes/Node/Node.tsx b/src/components/SceneLayers/Nodes/Node/Node.tsx index bd6141e..e190d0b 100644 --- a/src/components/SceneLayers/Nodes/Node/Node.tsx +++ b/src/components/SceneLayers/Nodes/Node/Node.tsx @@ -1,11 +1,11 @@ import React, { useMemo } from 'react'; -import { Box } from '@mui/material'; +import { Box, Typography, useTheme } from '@mui/material'; import { Node as NodeI, TileOriginEnum } from 'src/types'; import { useTileSize } from 'src/hooks/useTileSize'; import { useGetTilePosition } from 'src/hooks/useGetTilePosition'; import { useIcon } from 'src/hooks/useIcon'; +import { MarkdownEditor } from 'src/components/MarkdownEditor/MarkdownEditor'; import { LabelContainer } from './LabelContainer'; -import { MarkdownLabel } from './LabelTypes/MarkdownLabel'; interface Props { node: NodeI; @@ -13,6 +13,7 @@ interface Props { } export const Node = ({ node, order }: Props) => { + const theme = useTheme(); const { projectedTileSize } = useTileSize(); const { getTilePosition } = useGetTilePosition(); const { iconComponent } = useIcon(node.icon); @@ -24,11 +25,12 @@ export const Node = ({ node, order }: Props) => { }); }, [node.tile, getTilePosition]); - const label = useMemo(() => { - if (node.label === undefined || node.label === '


') return null; + const description = useMemo(() => { + if (node.description === undefined || node.description === '


') + return null; - return node.label; - }, [node.label]); + return node.description; + }, [node.description]); return ( { top: position.y }} > - {label && ( + {(node.label || description) && ( { }} /> - + {node.label} + {description && ( + + + + )} )} diff --git a/src/types/scene.ts b/src/types/scene.ts index 6f42ff6..3ae1f56 100644 --- a/src/types/scene.ts +++ b/src/types/scene.ts @@ -29,7 +29,8 @@ export interface Node { id: string; type: SceneItemTypeEnum.NODE; icon: string; - label: string; + label?: string; + description?: string; labelHeight: number; tile: Coords; isSelected: boolean; diff --git a/src/utils/inputs.ts b/src/utils/inputs.ts index 932aeef..a28df46 100644 --- a/src/utils/inputs.ts +++ b/src/utils/inputs.ts @@ -40,6 +40,7 @@ export const nodeInputToNode = (nodeInput: NodeInput): Node => { type: SceneItemTypeEnum.NODE, id: nodeInput.id, label: nodeInput.label ?? NODE_DEFAULTS.label, + description: nodeInput.description, labelHeight: nodeInput.labelHeight ?? NODE_DEFAULTS.labelHeight, icon: nodeInput.icon, tile: nodeInput.tile, @@ -215,6 +216,7 @@ export const nodeToNodeInput = (node: Node): NodeInput => { id: node.id, tile: node.tile, label: node.label, + description: node.description, labelHeight: node.labelHeight, icon: node.icon }; diff --git a/src/validation/sceneItems.ts b/src/validation/sceneItems.ts index a1ba394..fa65066 100644 --- a/src/validation/sceneItems.ts +++ b/src/validation/sceneItems.ts @@ -17,6 +17,7 @@ export const iconInput = z.object({ export const nodeInput = z.object({ id: z.string(), label: z.string().optional(), + description: z.string().optional(), labelHeight: z.number().optional(), icon: z.string(), tile: coords