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