//@ts-check import React from "https://esm.sh/preact@10.11.3/compat"; /// import {html} from "https://esm.sh/htm@3.1.1/preact"; /** @typedef {({children}:{children:React.ReactNode})=>JSX.Element} BasicElement */ export function Button({children, icon, light, disabled, inactive}) { const [LightGet, LightSet] = React.useState(light); const [FlashGet, FlashSet] = React.useState(0); const handleClick =()=> { if(inactive||disabled){ return; } LightSet(!LightGet); FlashSet(FlashGet+1); }; return html` `; } /** @type {BasicElement} */ export function Chart({children}) { const inset = 20 const size = 1/6; /** @type {Record} */ const rulesXMapping = { "125": [size*0.0, true ], "250": [size*1.0, true ], "500": [size*2.0, true ], "1000": [size*3.0, true ], "2000": [size*4.0, true ], "3000": [size*4.5, false], "4000": [size*5.0, true ], "6000": [size*5.5, false], "8000": [size*6.0, true ] }; const rulesX = Object.entries(rulesXMapping).map(([label, [position, normal]])=> { return html` ${label} `; }); const rulesY = []; const rulesYMin = -10; const rulesYMax = 120; for(let db = rulesYMin; db <= rulesYMax; db+=10) { const percent = ((db-rulesYMin) / (rulesYMax-rulesYMin))*100; rulesY.push(html` `); } return html`
Frequency in Hz Hearing Level (dbHL)
${ rulesX } ${ rulesY }
${ children }
`; } /** @type {Record} */ const Glyph = { Arrow:({children})=> html` `, //style="transform: translate(50%, 50%) rotate(-15deg) scale(0.5);" X: ({children})=> html` ${children}`, O: ({children})=> html` ${children}` }; /** @type {({right, response, x, y}:{right:boolean, response?:boolean, x:string|number, y:string|number})=>JSX.Element} */ export function Mark({right, response, x, y}) { return html` <${ right ? Glyph.O : Glyph.X }> ${ !response && html`<${Glyph.Arrow}/>` } `; }