:root{--siteMaxWidth: 1400px;--sitePadding: 2rem;--coreFont: "Satoshi", -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;--displayFont: "Boska", "Times New Roman", Georgia, Garamond, Times, serif;--monoFont: "JetBrains Mono", Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;--clrPrimary: oklch(100% 0 0);--clrDetail: oklch(41.23% 0 0);--pianoTrimWidth: .5rem;--pianoSidePadding: 6.5rem;--clrPianoShadow: oklch(from var(--clrPianoBg) calc(l - .05) c h);--clrFelt: oklch(64.91% .226964 22.09);--keyWhiteWidth: 3.5rem;--clrKeyWhite: oklch(96.9% .0053 106.5);--clrKeyWhiteShadow: oklch(from var(--clrKeyWhite) calc(l - .05) c h);--clrKeyWhiteBorder: oklch(from var(--clrKeyWhite) calc(l - .7) calc(c + .01) calc(h + 1) );--keyBlackWidth: calc(var(--keyWhiteWidth) * .6);--keyBlackHeight: calc(var(--keyWhiteWidth) * 3.7);--clrKeyBlack: oklch(7.06% .0145 82.32);--clrKeyBlackShine: oklch(25.65% .004 84.58)}[data-theme=light]{--clrText: black;--clrBg: oklch(96% 0 0);--clrBgLight: oklch(86.51% 0 0);--clrBorder: oklch(58.77% 0 0);--clrPianoBg: oklch(100% 0 0);--clrScroll: oklch(from var(--clrBg) calc(l - .05) c h)}[data-theme=dark]{--clrText: white;--clrBg: oklch(17.44% .0081 285.53);--clrBgLight: oklch(22.73% .0081 285.53);--clrBorder: #3b3b3b;--clrPianoBg: oklch(25.18% .0064 34.3);--clrScroll: oklch(from var(--clrBg) calc(l - .05) c h)}*{margin:0;padding:0;box-sizing:border-box}html{font-family:var(--coreFont);font-size:62.5%;color:var(--clrText);background-color:var(--clrBg);scroll-behavior:smooth}@media (prefers-reduced-motion: reduce){html{scroll-behavior:auto}}body{font-size:1.6rem}#app{display:flex;flex-direction:column;align-items:stretch;min-height:100dvh;padding:0 var(--sitePadding)}nav{display:flex;align-items:center;justify-content:space-between;gap:2rem;padding:2rem 0;font-family:var(--displayFont)}#nav-logo{display:flex;align-items:center;gap:2rem;font-size:3rem}#nav-logo img{width:4rem;height:4rem}#nav-controls{display:flex;align-items:center;gap:2rem}#nav-controls>button{display:flex;align-items:center;justify-content:center}#nav-controls>button svg{width:2rem;height:2rem}main{flex-grow:1;padding:4rem 0}footer{padding:2rem 0;color:var(--clrDetail);text-align:center}footer a{opacity:.5}footer a:hover,footer a:focus-visible{opacity:1}h1,h2,h3,h4,h5,h6{font-family:var(--displayFont);font-weight:500}button{display:block;border:none;outline:none;background:none}a{text-decoration:none;color:inherit}img,svg{display:block;max-width:100%}button:not(:disabled){cursor:pointer}ul,ol{list-style:none}dialog{margin:auto;padding:2rem;width:80rem;font-family:var(--coreFont);color:var(--clrText);background:var(--clrBgLight);border:1px solid var(--clrBorder);border-radius:.4rem;outline:none;overflow:auto;scrollbar-width:thin;scrollbar-color:var(--clrBg) var(--clrBgLight)}dialog::backdrop{background-color:#000000b3}dialog[open]{animation:slidefade .2s ease forwards}dialog[open]::backdrop{animation:fade .2s ease forwards}.dialog-header{display:flex;justify-content:space-between;gap:2rem;padding-bottom:2rem}.dialog-header button svg{width:2rem;height:2rem}.dialog-content{display:flex;flex-direction:column;gap:2rem}details[open] summary{color:var(--clrPrimary)}summary h3{display:inline-block}summary{cursor:pointer}.limited-width{max-width:var(--siteMaxWidth);width:100%;margin:0 auto}.link{color:var(--clrPrimary);text-decoration:underline}.detail{color:var(--clrDetail)}.noselect{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}#piano{position:relative;margin:0 auto;padding:var(--pianoTrimWidth) var(--pianoTrimWidth) 1rem var(--pianoTrimWidth);max-width:fit-content;background-color:var(--clrPianoBg);background-image:url(/assets/noise.png);background-size:96px 96px;background-repeat:repeat;border-radius:4rem 4rem 2rem 2rem}#piano:before{position:absolute;content:"";top:0;right:0;bottom:-3rem;left:0;background-color:var(--clrPianoShadow);background-image:url(/assets/noise.png);background-size:96px 96px;background-repeat:repeat;border-radius:4rem 4rem 2rem 2rem;z-index:-1;box-shadow:0 2rem 2rem -1rem #0003}#soundbar{display:flex;align-items:center;justify-content:center;height:4rem;background-color:oklch(from var(--clrPianoBg) calc(l - .02) c h);background-image:url("data:image/svg+xml,%3Csvg width='8' height='8' viewBox='0 0 8 8' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='4' r='2.5' fill='rgba(0,0,0,0.2)'/%3E%3C/svg%3E");background-size:3px 3px;border:.1rem solid oklch(from var(--clrPianoBg) calc(l - .05) c h);border-radius:calc(4rem - var(--pianoTrimWidth)) calc(4rem - var(--pianoTrimWidth)) 0 0;box-shadow:0 0 .1rem #000}#piano h1{font-size:4rem;font-family:var(--displayFont);font-weight:500;color:var(--clrPianoBg);text-align:center;line-height:1}#piano-header{padding:0 var(--pianoSidePadding)}#control-board{position:relative;display:flex;align-items:center;justify-content:center;gap:1rem;padding:2rem 0;color:var(--clrText);text-align:center}#transpose-controls{position:absolute;left:0;display:flex;gap:2rem;text-align:center}#transpose-controls:after{content:"";position:absolute;left:2rem;right:2rem;bottom:-1.5rem;height:1rem;border:.2rem solid var(--clrText);border-top:none}#transpose-controls label{position:absolute;left:50%;bottom:-2rem;transform:translate(-50%);padding:0 .25rem;font-size:1rem;background-color:var(--clrPianoBg);z-index:1}@property --buttonGlow{syntax: "<color>"; inherits: false; initial-value: #111;}@property --buttonDark{syntax: "<color>"; inherits: false; initial-value: #111;}.transpose-control{--buttonGlow: #111;--buttonDark: #111;--glow: oklch(from var(--clrPrimary) 1 c h);--darker: oklch(from var(--clrPrimary) .3 c h);position:relative;width:4rem;height:4rem;border-radius:999rem;padding:.4rem;background:conic-gradient(var(--buttonGlow),var(--buttonDark),var(--buttonGlow),var(--buttonDark),var(--buttonGlow));transition:--buttonGlow .1s ease,--buttonDark .1s ease}.transpose-control:has(button:active),.transpose-control:has(button:focus-visible){--buttonGlow: var(--glow);--buttonDark: var(--darker)}.transpose-control button{width:100%;height:100%;border-radius:999rem;vertical-align:middle;background-color:var(--clrPianoBg);background-image:url(/assets/noise.png);background-size:96px 96px;background-repeat:repeat}#display{padding:.5rem 5rem;width:25rem;font-family:var(--monoFont);font-size:1.2rem;line-height:1.2;font-weight:100;background-color:#111;border-radius:.4rem}#display svg{width:1.2em;height:1.2em}#screen{display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;padding:1ch;height:10ch;text-align:start;color:#fff;text-shadow:0 0 .5rem white;background-color:oklch(from var(--clrPrimary) .7 c h);box-shadow:inset 0 0 2rem oklch(from var(--clrPrimary) 1 c h / .6);overflow:hidden}#screen-content{display:flex;flex-direction:column-reverse;white-space:wrap;word-break:break-all;overflow:hidden auto;scrollbar-width:thin;scrollbar-color:var(--clrPrimary) transparent;overflow-anchor:none}#screen-settings{display:flex;align-items:center;justify-content:space-between;gap:1em}.setting{display:flex;align-items:center;gap:.5em}#piano-bottom{display:flex}.piano-side{flex-shrink:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:2rem;width:var(--pianoSidePadding);font-size:1rem;text-align:center;overflow:hidden}#volume-label{display:flex;align-items:center;justify-content:center;flex-direction:column;gap:1rem}#volume-track{position:relative;height:10rem;width:2rem;border-radius:999rem;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:none;background-color:oklch(from var(--clrPianoBg) calc(l - .1) c h);border:.2rem solid oklch(from var(--clrPianoBg) calc(l - .02) c h);box-shadow:inset 0 .2rem .2rem oklch(from var(--clrPianoBg) calc(l - .3) c h)}#volume-track:active{cursor:grabbing}#volume-track:before{content:"";position:absolute;left:50%;top:50%;width:20%;height:90%;transform:translate(-50%,-50%);background-color:oklch(from var(--clrPianoBg) calc(l - .3) c h);box-shadow:inset 0 .2rem .2rem #0000004d}#volume-thumb{position:absolute;bottom:0;left:50%;display:block;width:2rem;height:3rem;border-radius:999rem;transform:translate(-50%);background-color:oklch(from var(--clrPianoBg) calc(l + .02) c h);background-image:url(/assets/noise.png);background-size:96px 96px;background-repeat:repeat;box-shadow:inset 0 -.2rem .1rem -.1rem oklch(from var(--clrPianoBg) calc(l + .15) c h),inset 0 .6rem .1rem -.5rem oklch(from var(--clrPianoBg) calc(l - .02) c h),0 .2rem .2rem -.1rem #0003}#piano-keys-container{overflow:hidden}#piano-keys-container:before{display:block;content:"";height:2rem;background:linear-gradient(to top,var(--clrPianoShadow) 70%,transparent)}#piano-keys{position:relative;display:flex;background-color:var(--keyBlackShine);overflow-x:scroll;scrollbar-color:var(--clrPianoShadow) transparent;touch-action:none;-webkit-user-drag:none}.key{flex-shrink:0;display:flex;flex-direction:column;align-items:stretch;font-family:var(--monoFont);font-weight:100;line-height:1.2;overflow:hidden}.key:focus-visible .key-core{background:oklch(from var(--clrPrimary) calc(l + .1) calc(c - .05) h / .6)}.key-core{flex-grow:1;display:flex;align-items:flex-end;justify-content:center;padding:1.5rem 0}.key-white{width:var(--keyWhiteWidth);height:calc(var(--keyWhiteWidth) * 6);color:oklch(from var(--clrKeyWhite) calc(l - .2) c h);background-color:var(--clrKeyWhiteShadow);border-top:.3rem solid var(--clrFelt);border-right:1px solid var(--clrKeyWhiteBorder);border-left:1px solid var(--clrKeyWhiteBorder);transition:clip-path .05s ease-in}.key-white .key-core{border-radius:0 0 .4rem .4rem;background:linear-gradient(to bottom,var(--clrKeyWhiteShadow),var(--clrKeyWhite) 2rem);box-shadow:0 .2rem .2rem oklch(from var(--clrKeyWhiteBorder) l c h / .1)}.key-white .key-bottom{height:5%;transition:height .05s ease-in;z-index:-1}.key-white.playing .key-core{background:oklch(from var(--clrKeyWhite) calc(l - .05) c h)}.key-white.playing .key-bottom{height:2%}.right-L{clip-path:polygon(0 0,calc(100% - (var(--keyBlackWidth) / 2)) 0,calc(100% - (var(--keyBlackWidth) / 2)) var(--keyBlackHeight),100% var(--keyBlackHeight),100% 100%,0 100%)}.right-L.playing{clip-path:polygon(0 0,calc(100% - (var(--keyBlackWidth) / 2)) 0,calc(100% - (var(--keyBlackWidth) / 2)) calc(var(--keyBlackHeight) + 2%),100% calc(var(--keyBlackHeight) + 2%),100% 100%,0 100%)}.double-L{clip-path:polygon(calc(var(--keyBlackWidth) / 2) 0,calc(100% - (var(--keyBlackWidth) / 2)) 0,calc(100% - (var(--keyBlackWidth) / 2)) var(--keyBlackHeight),100% var(--keyBlackHeight),100% 100%,0 100%,0 var(--keyBlackHeight),calc(var(--keyBlackWidth) / 2) var(--keyBlackHeight))}.double-L.playing{clip-path:polygon(calc(var(--keyBlackWidth) / 2) 0,calc(100% - (var(--keyBlackWidth) / 2)) 0,calc(100% - (var(--keyBlackWidth) / 2)) calc(var(--keyBlackHeight) + 2%),100% calc(var(--keyBlackHeight) + 2%),100% 100%,0 100%,0 calc(var(--keyBlackHeight) + 2%),calc(var(--keyBlackWidth) / 2) calc(var(--keyBlackHeight) + 2%))}.left-L{clip-path:polygon(calc(var(--keyBlackWidth) / 2) 0,100% 0,100% 100%,0 100%,0 var(--keyBlackHeight),calc(var(--keyBlackWidth) / 2) var(--keyBlackHeight))}.left-L.playing{clip-path:polygon(calc(var(--keyBlackWidth) / 2) 0,100% 0,100% 100%,0 100%,0 calc(var(--keyBlackHeight) + 2%),calc(var(--keyBlackWidth) / 2) calc(var(--keyBlackHeight) + 2%))}.key-black{position:absolute;top:0;gap:1%;width:var(--keyBlackWidth);height:var(--keyBlackHeight);color:oklch(from var(--clrKeyBlack) calc(l + .5) c h);background-color:var(--clrKeyBlack);z-index:1}.key-black .key-core{background:linear-gradient(to bottom,var(--clrKeyBlack),var(--clrKeyBlackShine) 2rem);border-radius:0 0 1rem 1rem;box-shadow:inset 0 -.6rem .1rem -.5rem oklch(from var(--clrKeyBlackShine) calc(l + .7) c h);transition:box-shadow .05s ease-in}.key-black.playing .key-core{box-shadow:inset 0 -.6rem .1rem -.5rem oklch(from var(--clrKeyBlackShine) calc(l + .7) c h / .4)}.key-black .key-bottom{height:10%;background-color:var(--clrKeyBlackShine);border-radius:50% 50% 0 0;box-shadow:inset 0 .55rem .1rem -.5rem oklch(from var(--clrKeyBlackShine) calc(l + .7) c h / .9);transition:height .05s ease-in}.key-black.playing .key-bottom{height:5%;box-shadow:inset 0 .55rem .1rem -.5rem oklch(from var(--clrKeyBlackShine) calc(l + .7) c h / .4)}@keyframes slidefade{0%{transform:translateY(40%);opacity:0}to{transform:unset;opacity:1}}@media only screen and (max-width: 768px){#display{width:100%}#transpose-controls{position:relative}#control-board{flex-direction:column}}@font-face{font-family:Satoshi;src:url(/fonts/satoshi/Satoshi-Light.woff2) format("woff2"),url(/fonts/satoshi/Satoshi-Light.woff) format("woff");font-weight:300;font-display:swap;font-style:normal}@font-face{font-family:Satoshi;src:url(/fonts/satoshi/Satoshi-LightItalic.woff2) format("woff2"),url(/fonts/satoshi/Satoshi-LightItalic.woff) format("woff");font-weight:300;font-display:swap;font-style:italic}@font-face{font-family:Satoshi;src:url(/fonts/satoshi/Satoshi-Regular.woff2) format("woff2"),url(/fonts/satoshi/Satoshi-Regular.woff) format("woff");font-weight:400;font-display:swap;font-style:normal}@font-face{font-family:Satoshi;src:url(/fonts/satoshi/Satoshi-Italic.woff2) format("woff2"),url(/fonts/satoshi/Satoshi-Italic.woff) format("woff");font-weight:400;font-display:swap;font-style:italic}@font-face{font-family:Satoshi;src:url(/fonts/satoshi/Satoshi-Medium.woff2) format("woff2"),url(/fonts/satoshi/Satoshi-Medium.woff) format("woff");font-weight:500;font-display:swap;font-style:normal}@font-face{font-family:Satoshi;src:url(/fonts/satoshi/Satoshi-MediumItalic.woff2) format("woff2"),url(/fonts/satoshi/Satoshi-MediumItalic.woff) format("woff");font-weight:500;font-display:swap;font-style:italic}@font-face{font-family:Satoshi;src:url(/fonts/satoshi/Satoshi-Bold.woff2) format("woff2"),url(/fonts/satoshi/Satoshi-Bold.woff) format("woff");font-weight:700;font-display:swap;font-style:normal}@font-face{font-family:Satoshi;src:url(/fonts/satoshi/Satoshi-BoldItalic.woff2) format("woff2"),url(/fonts/satoshi/Satoshi-BoldItalic.woff) format("woff");font-weight:700;font-display:swap;font-style:italic}@font-face{font-family:Satoshi;src:url(/fonts/satoshi/Satoshi-Black.woff2) format("woff2"),url(/fonts/satoshi/Satoshi-Black.woff) format("woff");font-weight:900;font-display:swap;font-style:normal}@font-face{font-family:Satoshi;src:url(/fonts/satoshi/Satoshi-BlackItalic.woff2) format("woff2"),url(/fonts/satoshi/Satoshi-BlackItalic.woff) format("woff");font-weight:900;font-display:swap;font-style:italic}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-Thin.woff2) format("woff2");font-weight:100;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-ThinItalic.woff2) format("woff2");font-weight:100;font-style:italic;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-ExtraLight.woff2) format("woff2");font-weight:200;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-ExtraLightItalic.woff2) format("woff2");font-weight:200;font-style:italic;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-Light.woff2) format("woff2");font-weight:300;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-LightItalic.woff2) format("woff2");font-weight:300;font-style:italic;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-Italic.woff2) format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2) format("woff2");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-MediumItalic.woff2) format("woff2");font-weight:500;font-style:italic;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2) format("woff2");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-SemiBoldItalic.woff2) format("woff2");font-weight:600;font-style:italic;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-Bold.woff2) format("woff2");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-BoldItalic.woff2) format("woff2");font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-ExtraBold.woff2) format("woff2");font-weight:800;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono/JetBrainsMono-ExtraBoldItalic.woff2) format("woff2");font-weight:800;font-style:italic;font-display:swap}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-Extralight.woff2) format("woff2"),url(/fonts/boska/Boska-Extralight.woff) format("woff");font-weight:200;font-display:swap;font-style:normal}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-ExtralightItalic.woff2) format("woff2"),url(/fonts/boska/Boska-ExtralightItalic.woff) format("woff");font-weight:200;font-display:swap;font-style:italic}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-Light.woff2) format("woff2"),url(/fonts/boska/Boska-Light.woff) format("woff");font-weight:300;font-display:swap;font-style:normal}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-LightItalic.woff2) format("woff2"),url(/fonts/boska/Boska-LightItalic.woff) format("woff");font-weight:300;font-display:swap;font-style:italic}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-Regular.woff2) format("woff2"),url(/fonts/boska/Boska-Regular.woff) format("woff");font-weight:400;font-display:swap;font-style:normal}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-Italic.woff2) format("woff2"),url(/fonts/boska/Boska-Italic.woff) format("woff");font-weight:400;font-display:swap;font-style:italic}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-Medium.woff2) format("woff2"),url(/fonts/boska/Boska-Medium.woff) format("woff");font-weight:500;font-display:swap;font-style:normal}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-MediumItalic.woff2) format("woff2"),url(/fonts/boska/Boska-MediumItalic.woff) format("woff");font-weight:500;font-display:swap;font-style:italic}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-Bold.woff2) format("woff2"),url(/fonts/boska/Boska-Bold.woff) format("woff");font-weight:700;font-display:swap;font-style:normal}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-BoldItalic.woff2) format("woff2"),url(/fonts/boska/Boska-BoldItalic.woff) format("woff");font-weight:700;font-display:swap;font-style:italic}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-Black.woff2) format("woff2"),url(/fonts/boska/Boska-Black.woff) format("woff");font-weight:900;font-display:swap;font-style:normal}@font-face{font-family:Boska;src:url(/fonts/boska/Boska-BlackItalic.woff2) format("woff2"),url(/fonts/boska/Boska-BlackItalic.woff) format("woff");font-weight:900;font-display:swap;font-style:italic}
