widget.jsx

1.1 kB · jsx · 32 lines

1import { useMemo, useState } from 'react';2import { ready, ink } from '../../lib/mrly.js';3import { Row, Slider } from '../../lib/app.jsx';4import { Grid } from '../../lib/draw.jsx';5import { embed } from '../../lib/widget.jsx';67const m = await ready();89const STEPS = 127;1011export const run = (number) => {12  const grid = m.eca_seed(number, STEPS);13  let live = 0;14  for (const bit of grid.types) live += bit;15  return { grid: { width: grid.width, height: grid.height, types: grid.types }, live };16};1718export function rule() {19  const [number, setNumber] = useState(90);20  const seen = useMemo(() => run(number), [number]);21  return (22    <>23      <Grid grid={seen.grid} on={ink.yellow} role="img" aria-label={`Rule ${number} from one live cell, ${seen.grid.height} generations`} />24      <Row>25        <Slider label="rule" value={number} min={0} max={255} onChange={setNumber} />26      </Row>27      <p className="sub">{`rule ${number} from one live cell, ${seen.grid.height} generations on ${seen.grid.width} cells, ${seen.live} of them live`}</p>28    </>29  );30}3132embed('wolfram', { rule });