widget.jsx
1.0 kB · jsx · 32 lines
1import { useMemo, useState } from 'react';2import { ready, ink } from '../../lib/mrly.js';3import { Row, Slider, Stats, Stat } from '../../lib/app.jsx';4import { Grid } from '../../lib/draw.jsx';5import { embed } from '../../lib/widget.jsx';67const m = await ready();89const TOP = 3;1011export function sieve() {12 const [level, setLevel] = useState(2);13 const seen = useMemo(() => ({14 grid: m.wallis_grid('odd', 3, level),15 read: JSON.parse(m.wallis_read('odd', 3, level, 2)),16 }), [level]);17 return (18 <>19 <Grid grid={seen.grid} on={ink.blue} role="img" aria-label="The plane Wallis sieve, the surviving squares inked and every dropped centre left as ground" />20 <Row>21 <Slider label="level" value={level} min={1} max={TOP} onChange={setLevel} />22 </Row>23 <Stats>24 <Stat label="side">{seen.read.side}</Stat>25 <Stat label="cells">{seen.read.cells}</Stat>26 <Stat label="area">{seen.read.ratio.toFixed(6)}</Stat>27 </Stats>28 </>29 );30}3132embed('wallis', { sieve });