collapsible tree
This commit is contained in:
parent
8a2269b7d0
commit
afbc1e1455
|
@ -43,7 +43,7 @@ interface VariableBoxProps {
|
|||
showTypes: boolean;
|
||||
}
|
||||
|
||||
export const VariableBox: React.FC<VariableBoxProps> = ({
|
||||
const VariableBox: React.FC<VariableBoxProps> = ({
|
||||
name,
|
||||
heading = "Error",
|
||||
children,
|
||||
|
@ -51,13 +51,11 @@ export const VariableBox: React.FC<VariableBoxProps> = ({
|
|||
}) => {
|
||||
const [isCollapsed, setIsCollapsed] = useState(false);
|
||||
return (
|
||||
<motion.div
|
||||
layout="position"
|
||||
transition={{ type: "spring", bounce: 0, duration: 0.2 }}
|
||||
>
|
||||
<motion.div layout transition={{ type: "tween" }}>
|
||||
{name || showTypes ? (
|
||||
<motion.header
|
||||
layout="position"
|
||||
transition={{ type: "tween" }}
|
||||
className="inline-flex space-x-1 text-slate-500 font-mono text-sm cursor-pointer"
|
||||
onClick={() => setIsCollapsed(!isCollapsed)}
|
||||
>
|
||||
|
@ -69,12 +67,35 @@ export const VariableBox: React.FC<VariableBoxProps> = ({
|
|||
</motion.header>
|
||||
) : null}
|
||||
{isCollapsed ? null : (
|
||||
<motion.div layout="position">{children}</motion.div>
|
||||
<motion.div layout="position" transition={{ type: "tween" }}>
|
||||
{children}
|
||||
</motion.div>
|
||||
)}
|
||||
</motion.div>
|
||||
);
|
||||
};
|
||||
|
||||
const VariableList: React.FC<{
|
||||
name?: string;
|
||||
heading: string;
|
||||
showTypes: boolean;
|
||||
children: React.ReactNode;
|
||||
}> = ({ name, heading, showTypes, children }) => (
|
||||
<VariableBox name={name} heading={heading} showTypes={showTypes}>
|
||||
<motion.div
|
||||
layout="position"
|
||||
transition={{ type: "tween" }}
|
||||
className={clsx(
|
||||
"space-y-3",
|
||||
name ? "border-l pl-4" : null,
|
||||
name || showTypes ? "pt-1 mt-1" : null
|
||||
)}
|
||||
>
|
||||
<LayoutGroup>{children}</LayoutGroup>
|
||||
</motion.div>
|
||||
</VariableBox>
|
||||
);
|
||||
|
||||
export interface SquiggleItemProps {
|
||||
/** The output of squiggle's run */
|
||||
expression: squiggleExpression;
|
||||
|
@ -217,15 +238,7 @@ export const SquiggleItem: React.FC<SquiggleItemProps> = ({
|
|||
}
|
||||
case "module": {
|
||||
return (
|
||||
<VariableBox name={name} heading="Module" showTypes={showTypes}>
|
||||
<div
|
||||
className={clsx(
|
||||
"space-y-3",
|
||||
name ? "border-l pl-4" : null,
|
||||
name || showTypes ? "pt-1 mt-1" : null
|
||||
)}
|
||||
>
|
||||
<LayoutGroup>
|
||||
<VariableList name={name} heading="Module" showTypes={showTypes}>
|
||||
{Object.entries(expression.value)
|
||||
.filter(([key, r]) => key !== "Math")
|
||||
.map(([key, r]) => (
|
||||
|
@ -241,22 +254,12 @@ export const SquiggleItem: React.FC<SquiggleItemProps> = ({
|
|||
environment={environment}
|
||||
/>
|
||||
))}
|
||||
</LayoutGroup>
|
||||
</div>
|
||||
</VariableBox>
|
||||
</VariableList>
|
||||
);
|
||||
}
|
||||
case "record":
|
||||
return (
|
||||
<VariableBox name={name} heading="Record" showTypes={showTypes}>
|
||||
<div
|
||||
className={clsx(
|
||||
"space-y-3",
|
||||
name ? "border-l pl-4" : null,
|
||||
name || showTypes ? "pt-1 mt-1" : null
|
||||
)}
|
||||
>
|
||||
<LayoutGroup>
|
||||
<VariableList name={name} heading="Record" showTypes={showTypes}>
|
||||
{Object.entries(expression.value).map(([key, r]) => (
|
||||
<SquiggleItem
|
||||
key={key}
|
||||
|
@ -270,21 +273,11 @@ export const SquiggleItem: React.FC<SquiggleItemProps> = ({
|
|||
environment={environment}
|
||||
/>
|
||||
))}
|
||||
</LayoutGroup>
|
||||
</div>
|
||||
</VariableBox>
|
||||
</VariableList>
|
||||
);
|
||||
case "array":
|
||||
return (
|
||||
<VariableBox name={name} heading="Array" showTypes={showTypes}>
|
||||
<div
|
||||
className={clsx(
|
||||
"space-y-3",
|
||||
name ? "border-l pl-4" : null,
|
||||
name || showTypes ? "pt-1 mt-1" : null
|
||||
)}
|
||||
>
|
||||
<LayoutGroup>
|
||||
<VariableList name={name} heading="Array" showTypes={showTypes}>
|
||||
{expression.value.map((r, i) => (
|
||||
<SquiggleItem
|
||||
key={i}
|
||||
|
@ -298,9 +291,7 @@ export const SquiggleItem: React.FC<SquiggleItemProps> = ({
|
|||
environment={environment}
|
||||
/>
|
||||
))}
|
||||
</LayoutGroup>
|
||||
</div>
|
||||
</VariableBox>
|
||||
</VariableList>
|
||||
);
|
||||
default: {
|
||||
return (
|
||||
|
|
Loading…
Reference in New Issue
Block a user