Files
strudel/packages/react/dist/index.cjs.js
T
2022-06-30 16:49:24 +02:00

4 lines
10 KiB
JavaScript

"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var a=require("react"),ae=require("react-codemirror6"),y=require("@codemirror/view"),F=require("@codemirror/state"),re=require("@codemirror/lang-javascript"),c=require("@codemirror/highlight"),ne=require("react-hook-inview"),se=require("@strudel.cycles/eval"),ce=require("@strudel.cycles/core/util.mjs"),p=require("@strudel.cycles/tone"),j=require("@strudel.cycles/core"),v=require("@strudel.cycles/midi");function le(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var f=le(a);const ie="#abb2bf",ue="#7d8799",de="#ffffff",fe="#21252b",W="rgba(0, 0, 0, 0.5)",ge="transparent",P="#353a42",me="rgba(128, 203, 196, 0.5)",O="#ffcc00",be=y.EditorView.theme({"&":{color:"#ffffff",backgroundColor:ge,fontSize:"15px","z-index":11},".cm-content":{caretColor:O,lineHeight:"22px"},".cm-line":{background:"#2C323699"},"&.cm-focused .cm-cursor":{backgroundColor:O,width:"3px"},"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:me},".cm-panels":{backgroundColor:fe,color:"#ffffff"},".cm-panels.cm-panels-top":{borderBottom:"2px solid black"},".cm-panels.cm-panels-bottom":{borderTop:"2px solid black"},".cm-searchMatch":{backgroundColor:"#72a1ff59",outline:"1px solid #457dff"},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:"#6199ff2f"},".cm-activeLine":{backgroundColor:W},".cm-selectionMatch":{backgroundColor:"#aafe661a"},"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bad0f847",outline:"1px solid #515a6b"},".cm-gutters":{background:"transparent",color:"#676e95",border:"none"},".cm-activeLineGutter":{backgroundColor:W},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none",color:"#ddd"},".cm-tooltip":{border:"none",backgroundColor:P},".cm-tooltip .cm-tooltip-arrow:before":{borderTopColor:"transparent",borderBottomColor:"transparent"},".cm-tooltip .cm-tooltip-arrow:after":{borderTopColor:P,borderBottomColor:P},".cm-tooltip-autocomplete":{"& > ul > li[aria-selected]":{backgroundColor:W,color:ie}}},{dark:!0}),pe=c.HighlightStyle.define([{tag:c.tags.keyword,color:"#c792ea"},{tag:c.tags.operator,color:"#89ddff"},{tag:c.tags.special(c.tags.variableName),color:"#eeffff"},{tag:c.tags.typeName,color:"#f07178"},{tag:c.tags.atom,color:"#f78c6c"},{tag:c.tags.number,color:"#ff5370"},{tag:c.tags.definition(c.tags.variableName),color:"#82aaff"},{tag:c.tags.string,color:"#c3e88d"},{tag:c.tags.special(c.tags.string),color:"#f07178"},{tag:c.tags.comment,color:ue},{tag:c.tags.variableName,color:"#f07178"},{tag:c.tags.tagName,color:"#ff5370"},{tag:c.tags.bracket,color:"#a2a1a4"},{tag:c.tags.meta,color:"#ffcb6b"},{tag:c.tags.attributeName,color:"#c792ea"},{tag:c.tags.propertyName,color:"#c792ea"},{tag:c.tags.className,color:"#decb6b"},{tag:c.tags.invalid,color:de}]),he=[be,pe],V=F.StateEffect.define(),ve=F.StateField.define({create(){return y.Decoration.none},update(e,o){try{for(let n of o.effects)if(n.is(V))if(n.value){const i=y.Decoration.mark({attributes:{style:"background-color: #FFCA2880"}});e=y.Decoration.set([i.range(0,o.newDoc.length)])}else e=y.Decoration.set([]);return e}catch(n){return console.warn("flash error",n),e}},provide:e=>y.EditorView.decorations.from(e)}),ye=e=>{e.dispatch({effects:V.of(!0)}),setTimeout(()=>{e.dispatch({effects:V.of(!1)})},200)},B=F.StateEffect.define(),Ce=F.StateField.define({create(){return y.Decoration.none},update(e,o){try{for(let n of o.effects)n.is(B)&&(e=y.Decoration.set(n.value.flatMap(i=>(i.context.locations||[]).map(({start:g,end:l})=>{const u=i.context.color||"#FFCA28";let m=o.newDoc.line(g.line).from+g.column,r=o.newDoc.line(l.line).from+l.column;const s=o.newDoc.length;return m>s||r>s?void 0:y.Decoration.mark({attributes:{style:`outline: 1px solid ${u}`}}).range(m,r)})).filter(Boolean),!0));return e}catch{return e}},provide:e=>y.EditorView.decorations.from(e)});function Q({value:e,onChange:o,onViewChanged:n,onCursor:i,options:g,editorDidMount:l}){return f.default.createElement(f.default.Fragment,null,f.default.createElement(ae.CodeMirror,{onViewChange:n,style:{display:"flex",flexDirection:"column",flex:"1 0 auto"},value:e,onChange:o,extensions:[re.javascript(),he,Ce,ve]}))}function U(e){const{onEvent:o,onQuery:n,onSchedule:i,ready:g=!0,onDraw:l}=e,[u,m]=a.useState(!1),r=1,s=()=>Math.floor(p.Tone.getTransport().seconds/r),C=(b=s())=>{const k=new j.TimeSpan(b,b+1),D=n?.(new j.State(k))||[];i?.(D,b);const H=k.begin.valueOf();p.Tone.getTransport().cancel(H);const N=(b+1)*r-.5,R=Math.max(p.Tone.getTransport().seconds,N)+.1;p.Tone.getTransport().schedule(()=>{C(b+1)},R),D?.filter(h=>h.part.begin.equals(h.whole?.begin)).forEach(h=>{p.Tone.getTransport().schedule(M=>{o(M,h,p.Tone.getContext().currentTime),p.Tone.Draw.schedule(()=>{l?.(M,h)},M)},h.part.begin.valueOf())})};a.useEffect(()=>{g&&C()},[o,i,n,l,g]);const S=async()=>{m(!0),await p.Tone.start(),p.Tone.getTransport().start("+0.1")},w=()=>{p.Tone.getTransport().pause(),m(!1)};return{start:S,stop:w,onEvent:o,started:u,setStarted:m,toggle:()=>u?w():S(),query:C,activeCycle:s}}function G(e){return a.useEffect(()=>(window.addEventListener("message",e),()=>window.removeEventListener("message",e)),[e]),a.useCallback(o=>window.postMessage(o,"*"),[])}let we=()=>Math.floor((1+Math.random())*65536).toString(16).substring(1);const ke=e=>encodeURIComponent(btoa(e));function J({tune:e,defaultSynth:o,autolink:n=!0,onEvent:i,onDraw:g}){const l=a.useMemo(()=>we(),[]),[u,m]=a.useState(e),[r,s]=a.useState(),[C,S]=a.useState(""),[w,T]=a.useState(),[b,k]=a.useState(!1),[D,H]=a.useState(""),[N,R]=a.useState(),h=a.useMemo(()=>u!==r||w,[u,r,w]),M=a.useCallback(d=>S(t=>t+`${t?`
`:""}${d}`),[]),X=a.useMemo(()=>{if(r&&!r.includes("strudel disable-highlighting"))return(d,t)=>g?.(d,t,r)},[r,g]),Y=a.useMemo(()=>r&&r.includes("strudel hide-header"),[r]),x=U({onDraw:X,onEvent:a.useCallback((d,t,ee)=>{try{i?.(t),t.context.logs?.length&&t.context.logs.forEach(M);const{onTrigger:_,velocity:te}=t.context;if(_)_(d,t,ee,1);else if(o){const oe=ce.getPlayableNoteValue(t);o.triggerAttackRelease(oe,t.duration.valueOf(),d,te)}else throw new Error("no defaultSynth passed to useRepl.")}catch(_){console.warn(_),_.message="unplayable event: "+_?.message,M(_.message)}},[i,M,o]),onQuery:a.useCallback(d=>{try{return N?.query(d)||[]}catch(t){return console.warn(t),t.message="query error: "+t.message,T(t),[]}},[N]),onSchedule:a.useCallback((d,t)=>Z(d,t),[]),ready:!!N&&!!r}),L=G(({data:{from:d,type:t}})=>{t==="start"&&d!==l&&(x.setStarted(!1),s(void 0))}),z=a.useCallback(async(d=u)=>{if(r&&!h){T(void 0),x.start();return}try{k(!0);const t=await se.evaluate(d);x.start(),L({type:"start",from:l}),R(()=>t.pattern),n&&(window.location.hash="#"+encodeURIComponent(btoa(u))),H(ke(u)),T(void 0),s(d),k(!1)}catch(t){t.message="evaluation error: "+t.message,console.warn(t),T(t)}},[r,h,u,x,n,l,L]),Z=(d,t)=>{d.length};return{hideHeader:Y,pending:b,code:u,setCode:m,pattern:N,error:w,cycle:x,setPattern:R,dirty:h,log:C,togglePlay:()=>{x.started?x.stop():z()},setActiveCode:s,activateCode:z,activeCode:r,pushLog:M,hash:D}}function A(...e){return e.filter(Boolean).join(" ")}let q=[],I;function K({view:e,pattern:o,active:n}){a.useEffect(()=>{if(e)if(o&&n){let g=function(){try{const l=p.Tone.getTransport().seconds,m=[Math.max(I||l,l-1/10),l+1/60];I=l+1/60,q=q.filter(s=>s.whole.end>l);const r=o.queryArc(...m).filter(s=>s.hasOnset());q=q.concat(r),e.dispatch({effects:B.of(q)})}catch{e.dispatch({effects:B.of([])})}i=requestAnimationFrame(g)},i=requestAnimationFrame(g);return()=>{cancelAnimationFrame(i)}}else q=[],e.dispatch({effects:B.of([])})},[o,n,e])}const Me="_container_10e1g_1",Ee="_header_10e1g_5",Te="_buttons_10e1g_9",xe="_button_10e1g_9",_e="_buttonDisabled_10e1g_17",Se="_error_10e1g_21",De="_body_10e1g_25";var E={container:Me,header:Ee,buttons:Te,button:xe,buttonDisabled:_e,error:Se,body:De};function $({type:e}){return f.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",className:"sc-h-5 sc-w-5",viewBox:"0 0 20 20",fill:"currentColor"},{refresh:f.default.createElement("path",{fillRule:"evenodd",d:"M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z",clipRule:"evenodd"}),play:f.default.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z",clipRule:"evenodd"}),pause:f.default.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zM7 8a1 1 0 012 0v4a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v4a1 1 0 102 0V8a1 1 0 00-1-1z",clipRule:"evenodd"})}[e])}function Ne({tune:e,defaultSynth:o,hideOutsideView:n=!1}){const{code:i,setCode:g,pattern:l,activateCode:u,error:m,cycle:r,dirty:s,togglePlay:C}=J({tune:e,defaultSynth:o,autolink:!1}),[S,w]=a.useState(),[T,b]=ne.useInView({threshold:.01}),k=a.useRef(),D=a.useMemo(()=>((b||!n)&&(k.current=!0),b||k.current),[b,n]);return K({view:S,pattern:l,active:r.started}),f.default.createElement("div",{className:E.container,ref:T},f.default.createElement("div",{className:E.header},f.default.createElement("div",{className:E.buttons},f.default.createElement("button",{className:A(E.button,r.started?"sc-animate-pulse":""),onClick:()=>C()},f.default.createElement($,{type:r.started?"pause":"play"})),f.default.createElement("button",{className:A(s?E.button:E.buttonDisabled),onClick:()=>u()},f.default.createElement($,{type:"refresh"}))),m&&f.default.createElement("div",{className:E.error},m.message)),f.default.createElement("div",{className:E.body},D&&f.default.createElement(Q,{value:i,onChange:g,onViewChanged:w})))}function qe(e){const{ready:o,connected:n,disconnected:i}=e,[g,l]=a.useState(!0),[u,m]=a.useState(v.WebMidi?.outputs||[]);return a.useEffect(()=>{v.enableWebMidi().then(()=>{v.WebMidi.addListener("connected",s=>{m([...v.WebMidi.outputs]),n?.(v.WebMidi,s)}),v.WebMidi.addListener("disconnected",s=>{m([...v.WebMidi.outputs]),i?.(v.WebMidi,s)}),o?.(v.WebMidi),l(!1)}).catch(s=>{if(s){console.error(s),console.warn("Web Midi could not be enabled..");return}})},[o,n,i,u]),{loading:g,outputs:u,outputByName:s=>v.WebMidi.getOutputByName(s)}}exports.CodeMirror=Q;exports.MiniRepl=Ne;exports.cx=A;exports.flash=ye;exports.useCycle=U;exports.useHighlighting=K;exports.usePostMessage=G;exports.useRepl=J;exports.useWebMidi=qe;