diff --git a/packages/components/src/components/SquiggleChart.tsx b/packages/components/src/components/SquiggleChart.tsx index cd480e69..f9f2b368 100644 --- a/packages/components/src/components/SquiggleChart.tsx +++ b/packages/components/src/components/SquiggleChart.tsx @@ -60,29 +60,30 @@ export interface SquiggleChartProps { const defaultOnChange = () => {}; -export const SquiggleChart: React.FC = React.memo(({ - code = "", - environment, - onChange = defaultOnChange, // defaultOnChange must be constant, don't move its definition here - height = 200, - bindings = defaultBindings, - jsImports = defaultImports, - showSummary = false, - width, - showTypes = false, - showControls = false, - logX = false, - expY = false, - diagramStart = 0, - diagramStop = 10, - diagramCount = 100, - tickFormat, - minX, - maxX, - color, - title, - distributionChartActions, -}) => { +export const SquiggleChart: React.FC = React.memo( + ({ + code = "", + environment, + onChange = defaultOnChange, // defaultOnChange must be constant, don't move its definition here + height = 200, + bindings = defaultBindings, + jsImports = defaultImports, + showSummary = false, + width, + showTypes = false, + showControls = false, + logX = false, + expY = false, + diagramStart = 0, + diagramStop = 10, + diagramCount = 100, + tickFormat, + minX, + maxX, + color, + title, + distributionChartActions, + }) => { const result = useSquiggle({ code, bindings, diff --git a/packages/components/src/components/SquigglePlayground.tsx b/packages/components/src/components/SquigglePlayground.tsx index 301d8892..534be721 100644 --- a/packages/components/src/components/SquigglePlayground.tsx +++ b/packages/components/src/components/SquigglePlayground.tsx @@ -18,7 +18,7 @@ import clsx from "clsx"; import { defaultBindings, environment } from "@quri/squiggle-lang"; -import { SquiggleChart } from "./SquiggleChart"; +import { SquiggleChart, SquiggleChartProps } from "./SquiggleChart"; import { CodeEditor } from "./CodeEditor"; import { JsonEditor } from "./JsonEditor"; import { ErrorAlert, SuccessAlert } from "./Alert"; @@ -27,28 +27,16 @@ import { Toggle } from "./ui/Toggle"; import { Checkbox } from "./ui/Checkbox"; import { StyledTab } from "./ui/StyledTab"; -interface PlaygroundProps { +type PlaygroundProps = SquiggleChartProps & { /** The initial squiggle string to put in the playground */ defaultCode?: string; /** How many pixels high is the playground */ - height?: number; - /** Whether to show the types of outputs in the playground */ - showTypes?: boolean; - /** Whether to show the log scale controls in the playground */ - showControls?: boolean; - /** Whether to show the summary table in the playground */ - showSummary?: boolean; - /** Whether to log the x coordinate on distribution charts */ - logX?: boolean; - /** Whether to exp the y coordinate on distribution charts */ - expY?: boolean; - /** If code is set, component becomes controlled */ - code?: string; onCodeChange?(expr: string): void; + /* When settings change */ onSettingsChange?(settings: any): void; /** Should we show the editor? */ showEditor?: boolean; -} +}; const schema = yup.object({}).shape({ sampleCount: yup @@ -82,6 +70,12 @@ const schema = yup.object({}).shape({ showEditor: yup.boolean().required(), logX: yup.boolean().required(), expY: yup.boolean().required(), + tickFormat: yup.string().default(".9~s"), + title: yup.string(), + color: yup.string().default("#739ECC").required(), + minX: yup.number(), + maxX: yup.number(), + distributionChartActions: yup.boolean(), showSettingsPage: yup.boolean().default(false), diagramStart: yup.number().required().positive().integer().default(0).min(0), diagramStop: yup.number().required().positive().integer().default(10).min(0), @@ -114,7 +108,7 @@ function InputItem({ }: { name: Path; label: string; - type: "number"; + type: "number" | "text" | "color"; register: UseFormRegister; }) { return ( @@ -122,7 +116,7 @@ function InputItem({
{label}
@@ -202,6 +196,11 @@ const ViewSettings: React.FC<{ register: UseFormRegister }> = ({ name="expY" label="Show y scale exponentially" /> + }> = ({ name="showSummary" label="Show summary statistics" /> + + + + + @@ -385,6 +414,12 @@ export const SquigglePlayground: FC = ({ showSummary = false, logX = false, expY = false, + title, + minX, + maxX, + color = "#739ECC", + tickFormat = ".9~s", + distributionChartActions, code: controlledCode, onCodeChange, onSettingsChange, @@ -408,6 +443,12 @@ export const SquigglePlayground: FC = ({ showControls, logX, expY, + title, + minX, + maxX, + color, + tickFormat, + distributionChartActions, showSummary, showEditor, leftSizePercent: 50, @@ -440,15 +481,7 @@ export const SquigglePlayground: FC = ({ @@ -496,6 +529,7 @@ export const SquigglePlayground: FC = ({ const withoutEditor =
{tabs}
; + console.log(vars); return ( diff --git a/packages/components/src/lib/distributionSpecBuilder.ts b/packages/components/src/lib/distributionSpecBuilder.ts index b40a973d..4286dbdb 100644 --- a/packages/components/src/lib/distributionSpecBuilder.ts +++ b/packages/components/src/lib/distributionSpecBuilder.ts @@ -114,11 +114,11 @@ export function buildVegaSpec( } = specOptions; let xScale = logX ? logXScale : linearXScale; - if (minX !== undefined) { + if (minX !== undefined && Number.isFinite(minX)) { xScale = { ...xScale, domainMin: minX }; } - if (maxX !== undefined) { + if (maxX !== undefined && Number.isFinite(maxX)) { xScale = { ...xScale, domainMax: maxX }; } diff --git a/packages/components/src/stories/SquiggleChart.stories.mdx b/packages/components/src/stories/SquiggleChart.stories.mdx index 2483c985..2febfb6f 100644 --- a/packages/components/src/stories/SquiggleChart.stories.mdx +++ b/packages/components/src/stories/SquiggleChart.stories.mdx @@ -3,7 +3,7 @@ import { Canvas, Meta, Story, Props } from "@storybook/addon-docs"; -export const Template = SquiggleChart; +export const Template = (props) => ; /* We have to hardcode a width here, because otherwise some interaction with Storybook creates an infinite loop with the internal width