bit crusher effect.
",
- "name": "crush",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "between 1 (for drastic reduction in bit-depth) to 16 (for barely no reduction).
",
- "name": "depth"
- }
- ],
- "examples": [
- "s(\",hh*3,jvbass*2\").fast(2).crush(\"<16 8 7 6 5 4 3 2>\").osc()"
- ],
- "longname": "crush",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000015",
- "___s": true
- },
- {
- "comment": "/**\n * fake-resampling for lowering the sample rate\n *\n * @name coarse\n * @param {number | Pattern} factor 1 for original 2 for half, 3 for a third and so on.\n * @example\n * s(\"xmas\").coarse(\"<1 4 8 16 32>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 213,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "fake-resampling for lowering the sample rate
",
- "name": "coarse",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "1 for original 2 for half, 3 for a third and so on.
",
- "name": "factor"
- }
- ],
- "examples": [
- "s(\"xmas\").coarse(\"<1 4 8 16 32>\").osc()"
- ],
- "longname": "coarse",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000016",
- "___s": true
- },
- {
- "comment": "/**\n * choose the channel the pattern is sent to in superdirt\n *\n * @name channel\n * @param {number | Pattern} channel channel number\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 228,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "choose the channel the pattern is sent to in superdirt
",
- "name": "channel",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "channel number
",
- "name": "channel"
- }
- ],
- "longname": "channel",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000017",
- "___s": true
- },
- {
- "comment": "/**\n * In the style of classic drum-machines, `cut` will stop a playing sample as soon as another samples with in same cutgroup is to be played. An example would be an open hi-hat followed by a closed one, essentially muting the open.\n *\n * @name cut\n * @param {number | Pattern} group cut group number\n * @example\n * s(\"bd sax\").cut(1).osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 236,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "In the style of classic drum-machines, cut will stop a playing sample as soon as another samples with in same cutgroup is to be played. An example would be an open hi-hat followed by a closed one, essentially muting the open.
",
- "name": "cut",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "cut group number
",
- "name": "group"
- }
- ],
- "examples": [
- "s(\"bd sax\").cut(1).osc()"
- ],
- "longname": "cut",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000018",
- "___s": true
- },
- {
- "comment": "/**\n * Applies the cutoff frequency of the low-pass filter.\n *\n * @name cutoff\n * @param {number | Pattern} frequency audible between 0 and 20000\n * @example\n * s(\"bd,hh*2,<~ sd>\").fast(2).cutoff(\"<4000 2000 1000 500 200 100>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 250,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Applies the cutoff frequency of the low-pass filter.
",
- "name": "cutoff",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "audible between 0 and 20000
",
- "name": "frequency"
- }
- ],
- "examples": [
- "s(\"bd,hh*2,<~ sd>\").fast(2).cutoff(\"<4000 2000 1000 500 200 100>\").osc()"
- ],
- "longname": "cutoff",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000019",
- "___s": true
- },
- {
- "comment": "/**\n * Applies the cutoff frequency of the high-pass filter.\n *\n * @name hcutoff\n * @param {number | Pattern} frequency audible between 0 and 20000\n * @example\n * s(\"bd,hh*2,<~ sd>\").fast(2).hcutoff(\"<4000 2000 1000 500 200 100>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 261,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Applies the cutoff frequency of the high-pass filter.
",
- "name": "hcutoff",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "audible between 0 and 20000
",
- "name": "frequency"
- }
- ],
- "examples": [
- "s(\"bd,hh*2,<~ sd>\").fast(2).hcutoff(\"<4000 2000 1000 500 200 100>\").osc()"
- ],
- "longname": "hcutoff",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000020",
- "___s": true
- },
- {
- "comment": "/**\n * Applies the cutoff frequency of the high-pass filter.\n *\n * @name hresonance\n * @param {number | Pattern} q resonance factor between 0 and 1\n * @example\n * s(\"bd,hh*2,<~ sd>\").fast(2).hcutoff(2000).hresonance(\"<0 .2 .4 .6>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 276,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Applies the cutoff frequency of the high-pass filter.
",
- "name": "hresonance",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "resonance factor between 0 and 1
",
- "name": "q"
- }
- ],
- "examples": [
- "s(\"bd,hh*2,<~ sd>\").fast(2).hcutoff(2000).hresonance(\"<0 .2 .4 .6>\").osc()"
- ],
- "longname": "hresonance",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000021",
- "___s": true
- },
- {
- "comment": "/**\n * Applies the cutoff frequency of the low-pass filter.\n *\n * @name resonance\n * @param {number | Pattern} q resonance factor between 0 and 1\n * @example\n * s(\"bd,hh*2,<~ sd>\").fast(2).cutoff(2000).resonance(\"<0 .2 .4 .6>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 291,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Applies the cutoff frequency of the low-pass filter.
",
- "name": "resonance",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "resonance factor between 0 and 1
",
- "name": "q"
- }
- ],
- "examples": [
- "s(\"bd,hh*2,<~ sd>\").fast(2).cutoff(2000).resonance(\"<0 .2 .4 .6>\").osc()"
- ],
- "longname": "resonance",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000022",
- "___s": true
- },
- {
- "comment": "/**\n * Set detune of oscillators. Works only with some synths, see tidal doc\n *\n * @name djf\n * @param {number | Pattern} cutoff below 0.5 is low pass filter, above is high pass filter\n * @example\n * n(\"0 3 7 [10,24]\").s('superzow').octave(3).djf(\"<.5 .25 .5 .75>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 302,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Set detune of oscillators. Works only with some synths, see tidal doc
",
- "name": "djf",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "below 0.5 is low pass filter, above is high pass filter
",
- "name": "cutoff"
- }
- ],
- "examples": [
- "n(\"0 3 7 [10,24]\").s('superzow').octave(3).djf(\"<.5 .25 .5 .75>\").osc()"
- ],
- "longname": "djf",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000023",
- "___s": true
- },
- {
- "comment": "/**\n * Set detune of oscillators. Works only with some synths, see tidal doc\n *\n * @name detune\n * @param {number | Pattern} amount between 0 and 1\n * @example\n * n(\"0 3 7\").s('superzow').octave(3).detune(\"<0 .25 .5 1 2>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 340,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Set detune of oscillators. Works only with some synths, see tidal doc
",
- "name": "detune",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "between 0 and 1
",
- "name": "amount"
- }
- ],
- "examples": [
- "n(\"0 3 7\").s('superzow').octave(3).detune(\"<0 .25 .5 1 2>\").osc()"
- ],
- "longname": "detune",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000024",
- "___s": true
- },
- {
- "comment": "/**\n * Set dryness of reverb. See {@link room} and {@link size} for more information about reverb.\n *\n * @name dry\n * @param {number | Pattern} dry 0 = wet, 1 = dry\n * @example\n * n(\"[0,3,7](3,8)\").s(\"superpiano\").room(.7).dry(\"<0 .5 .75 1>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 350,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Set dryness of reverb. See {@link room} and {@link size} for more information about reverb.
",
- "name": "dry",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "0 = wet, 1 = dry
",
- "name": "dry"
- }
- ],
- "examples": [
- "n(\"[0,3,7](3,8)\").s(\"superpiano\").room(.7).dry(\"<0 .5 .75 1>\").osc()"
- ],
- "longname": "dry",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000025",
- "___s": true
- },
- {
- "comment": "/**\n * Set frequency of sound.\n *\n * @name freq\n * @param {number | Pattern} frequency in Hz. the audible range is between 20 and 20000 Hz\n * @example\n * freq(\"220 110 440 110\").s(\"superzow\").osc()\n * @example\n * freq(\"110\".mulOut(\".5 1.5 .6 [2 3]\")).s(\"superzow\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 385,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Set frequency of sound.
",
- "name": "freq",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "in Hz. the audible range is between 20 and 20000 Hz
",
- "name": "frequency"
- }
- ],
- "examples": [
- "freq(\"220 110 440 110\").s(\"superzow\").osc()",
- "freq(\"110\".mulOut(\".5 1.5 .6 [2 3]\")).s(\"superzow\").osc()"
- ],
- "longname": "freq",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000026",
- "___s": true
- },
- {
- "comment": "/**\n * Emulation of a Leslie speaker: speakers rotating in a wooden amplified cabinet.\n *\n * @name leslie\n * @param {number | Pattern} wet between 0 and 1\n * @example\n * n(\"0,4,7\").s(\"supersquare\").leslie(\"<0 .4 .6 1>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 408,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Emulation of a Leslie speaker: speakers rotating in a wooden amplified cabinet.
",
- "name": "leslie",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "between 0 and 1
",
- "name": "wet"
- }
- ],
- "examples": [
- "n(\"0,4,7\").s(\"supersquare\").leslie(\"<0 .4 .6 1>\").osc()"
- ],
- "longname": "leslie",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000027",
- "___s": true
- },
- {
- "comment": "/**\n * Rate of modulation / rotation for leslie effect\n *\n * @name lrate\n * @param {number | Pattern} rate 6.7 for fast, 0.7 for slow\n * @example\n * n(\"0,4,7\").s(\"supersquare\").leslie(1).lrate(\"<1 2 4 8>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 418,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Rate of modulation / rotation for leslie effect
",
- "name": "lrate",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "6.7 for fast, 0.7 for slow
",
- "name": "rate"
- }
- ],
- "examples": [
- "n(\"0,4,7\").s(\"supersquare\").leslie(1).lrate(\"<1 2 4 8>\").osc()"
- ],
- "longname": "lrate",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000028",
- "___s": true
- },
- {
- "comment": "/**\n * Physical size of the cabinet in meters. Be careful, it might be slightly larger than your computer. Affects the Doppler amount (pitch warble)\n *\n * @name lsize\n * @param {number | Pattern} meters somewhere between 0 and 1\n * @example\n * n(\"0,4,7\").s(\"supersquare\").leslie(1).lrate(2).lsize(\"<.1 .5 1>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 429,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Physical size of the cabinet in meters. Be careful, it might be slightly larger than your computer. Affects the Doppler amount (pitch warble)
",
- "name": "lsize",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "somewhere between 0 and 1
",
- "name": "meters"
- }
- ],
- "examples": [
- "n(\"0,4,7\").s(\"supersquare\").leslie(1).lrate(2).lsize(\"<.1 .5 1>\").osc()"
- ],
- "longname": "lsize",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000029",
- "___s": true
- },
- {
- "comment": "/**\n * Sets the default octave of a synth.\n *\n * @name octave\n * @param {number | Pattern} octave octave number\n * @example\n * n(\"0,4,7\").s('supersquare').octave(\"<3 4 5 6>\").osc()\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 464,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Sets the default octave of a synth.
",
- "name": "octave",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "octave number
",
- "name": "octave"
- }
- ],
- "examples": [
- "n(\"0,4,7\").s('supersquare').octave(\"<3 4 5 6>\").osc()"
- ],
- "longname": "octave",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000030",
- "___s": true
- },
- {
- "comment": "/**\n * a pattern of numbers. An `orbit` is a global parameter context for patterns. Patterns with the same orbit will share hardware output bus offset and global effects, e.g. reverb and delay. The maximum number of orbits is specified in the superdirt startup, numbers higher than maximum will wrap around.\n *\n * @name orbit\n * @param {number | Pattern} number\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 476,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "a pattern of numbers. An orbit is a global parameter context for patterns. Patterns with the same orbit will share hardware output bus offset and global effects, e.g. reverb and delay. The maximum number of orbits is specified in the superdirt startup, numbers higher than maximum will wrap around.
",
- "name": "orbit",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "name": "number"
- }
- ],
- "longname": "orbit",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000031",
- "___s": true
- },
- {
- "comment": "/**\n * Sets position in stereo.\n *\n * @name pan\n * @param {number | Pattern} pan between 0 and 1, from left to right (assuming stereo), once round a circle (assuming multichannel)\n * @example\n * s(\"[bd hh]*2\").pan(\"<.5 1 .5 0>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 490,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Sets position in stereo.
",
- "name": "pan",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "between 0 and 1, from left to right (assuming stereo), once round a circle (assuming multichannel)
",
- "name": "pan"
- }
- ],
- "examples": [
- "s(\"[bd hh]*2\").pan(\"<.5 1 .5 0>\").osc()"
- ],
- "longname": "pan",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000032",
- "___s": true
- },
- {
- "comment": "/**\n * Sets the level of reverb.\n *\n * @name room\n * @param {number | Pattern} level between 0 and 1\n * @example\n * s(\"bd sd\").room(\"<0 .2 .4 .6 .8 1>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 557,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Sets the level of reverb.
",
- "name": "room",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "between 0 and 1
",
- "name": "level"
- }
- ],
- "examples": [
- "s(\"bd sd\").room(\"<0 .2 .4 .6 .8 1>\").osc()"
- ],
- "longname": "room",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000033",
- "___s": true
- },
- {
- "comment": "/**\n * Sets the room size of the reverb, see {@link room}.\n *\n * @name size\n * @param {number | Pattern} size between 0 and 1\n * @example\n * s(\"bd sd\").room(.8).size(\"<0 .2 .4 .6 .8 1>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 567,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Sets the room size of the reverb, see {@link room}.
",
- "name": "size",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "between 0 and 1
",
- "name": "size"
- }
- ],
- "examples": [
- "s(\"bd sd\").room(.8).size(\"<0 .2 .4 .6 .8 1>\").osc()"
- ],
- "longname": "size",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000034",
- "___s": true
- },
- {
- "comment": "/**\n * Wave shaping distortion. CAUTION: it might get loud\n *\n * @name shape\n * @param {number | Pattern} distortion between 0 and 1\n * @example\n * s(\"bd sd\").shape(\"<0 .2 .4 .6 .8 1>\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 588,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Wave shaping distortion. CAUTION: it might get loud
",
- "name": "shape",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "between 0 and 1
",
- "name": "distortion"
- }
- ],
- "examples": [
- "s(\"bd sd\").shape(\"<0 .2 .4 .6 .8 1>\").osc()"
- ],
- "longname": "shape",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000035",
- "___s": true
- },
- {
- "comment": "/**\n * Changes the speed of sample playback, i.e. a cheap way of changing pitch.\n *\n * @name speed\n * @param {number | Pattern} speed -inf to inf, negative numbers play the sample backwards.\n * @example\n * s(\"bd\").speed(\"<1 2 4 1 -2 -4>\").osc()\n * @example\n * speed(\"1 1.5*2 [2 1.1]\").s(\"sax\").cut(1).osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 602,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Changes the speed of sample playback, i.e. a cheap way of changing pitch.
",
- "name": "speed",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "inf to inf, negative numbers play the sample backwards.
",
- "name": "speed"
- }
- ],
- "examples": [
- "s(\"bd\").speed(\"<1 2 4 1 -2 -4>\").osc()",
- "speed(\"1 1.5*2 [2 1.1]\").s(\"sax\").cut(1).osc()"
- ],
- "longname": "speed",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000036",
- "___s": true
- },
- {
- "comment": "/**\n * Used in conjunction with {@link speed}, accepts values of \"r\" (rate, default behavior), \"c\" (cycles), or \"s\" (seconds). Using `unit \"c\"` means `speed` will be interpreted in units of cycles, e.g. `speed \"1\"` means samples will be stretched to fill a cycle. Using `unit \"s\"` means the playback speed will be adjusted so that the duration is the number of seconds specified by `speed`.\n *\n * @name unit\n * @param {number | string | Pattern} unit see description above\n * @example\n * speed(\"1 2 .5 3\").s(\"bd\").unit(\"c\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 618,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Used in conjunction with {@link speed}, accepts values of "r" (rate, default behavior), "c" (cycles), or "s" (seconds). Using unit "c" means speed will be interpreted in units of cycles, e.g. speed "1" means samples will be stretched to fill a cycle. Using unit "s" means the playback speed will be adjusted so that the duration is the number of seconds specified by speed.
",
- "name": "unit",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "string",
- "Pattern"
- ]
- },
- "description": "see description above
",
- "name": "unit"
- }
- ],
- "examples": [
- "speed(\"1 2 .5 3\").s(\"bd\").unit(\"c\").osc()"
- ],
- "longname": "unit",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000037",
- "___s": true
- },
- {
- "comment": "/**\n * Made by Calum Gunn. Reminiscent of some weird mixture of filter, ring-modulator and pitch-shifter. The SuperCollider manual defines Squiz as:\n *\n * \"A simplistic pitch-raising algorithm. It's not meant to sound natural; its sound is reminiscent of some weird mixture of filter, ring-modulator and pitch-shifter, depending on the input. The algorithm works by cutting the signal into fragments (delimited by upwards-going zero-crossings) and squeezing those fragments in the time domain (i.e. simply playing them back faster than they came in), leaving silences inbetween. All the parameters apart from memlen can be modulated.\"\n *\n * @name squiz\n * @param {number | Pattern} squiz Try passing multiples of 2 to it - 2, 4, 8 etc.\n * @example\n * squiz(\"2 4/2 6 [8 16]\").s(\"bd\").osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 632,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Made by Calum Gunn. Reminiscent of some weird mixture of filter, ring-modulator and pitch-shifter. The SuperCollider manual defines Squiz as:
\n"A simplistic pitch-raising algorithm. It's not meant to sound natural; its sound is reminiscent of some weird mixture of filter, ring-modulator and pitch-shifter, depending on the input. The algorithm works by cutting the signal into fragments (delimited by upwards-going zero-crossings) and squeezing those fragments in the time domain (i.e. simply playing them back faster than they came in), leaving silences inbetween. All the parameters apart from memlen can be modulated."
",
- "name": "squiz",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "Try passing multiples of 2 to it - 2, 4, 8 etc.
",
- "name": "squiz"
- }
- ],
- "examples": [
- "squiz(\"2 4/2 6 [8 16]\").s(\"bd\").osc()"
- ],
- "longname": "squiz",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000038",
- "___s": true
- },
- {
- "comment": "/**\n *\n * Formant filter to make things sound like vowels.\n *\n * @name vowel\n * @param {string | Pattern} vowel You can use a e i o u. Use a rest (~) to override the effect\n * @example\n * vowel(\"a e i [o u]\").slow(2)\n * .n(\"<[0,7]!4 [2,7]!4>\")\n * .s('supersquare').osc()\n *\n */",
- "meta": {
- "filename": "controls.mjs",
- "lineno": 651,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Formant filter to make things sound like vowels.
",
- "name": "vowel",
- "params": [
- {
- "type": {
- "names": [
- "string",
- "Pattern"
- ]
- },
- "description": "You can use a e i o u. Use a rest (~) to override the effect
",
- "name": "vowel"
- }
- ],
- "examples": [
- "vowel(\"a e i [o u]\").slow(2)\n.n(\"<[0,7]!4 [2,7]!4>\")\n.s('supersquare').osc()"
- ],
- "longname": "vowel",
- "kind": "member",
- "scope": "global",
- "___id": "T000002R000039",
- "___s": true
- },
- {
- "comment": "/**\n * Intended for a debugging, drawLine renders the pattern as a string, where each character represents the same time span.\n * Should only be used with single characters as values, otherwise the character slots will be messed up.\n * Character legend:\n *\n * - \"|\" cycle separator\n * - \"-\" hold previous value\n * - \".\" silence\n *\n * @param {Pattern} pattern the pattern to use\n * @param {number} chars max number of characters (approximately)\n * @returns string\n * @example\n * const line = drawLine(\"0 [1 2 3]\", 10); // |0--123|0--123\n * console.log(line);\n */",
- "meta": {
- "range": [
- 1414,
- 2784
- ],
- "filename": "drawLine.mjs",
- "lineno": 25,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100000596",
- "name": "drawLine",
- "type": "FunctionDeclaration",
- "paramnames": [
- "pat",
- "chars"
- ]
- },
- "vars": {
- "cycle": "drawLine~cycle",
- "pos": "drawLine~pos",
- "lines": "drawLine~lines",
- "emptyLine": "drawLine~emptyLine",
- "haps": "drawLine~haps",
- "durations": "drawLine~durations",
- "": null,
- "charFraction": "drawLine~charFraction",
- "totalSlots": "drawLine~totalSlots",
- "i": "drawLine~i",
- "undefined": null,
- "matches": "drawLine~matches",
- "missingLines": "drawLine~missingLines"
- }
- },
- "description": "Intended for a debugging, drawLine renders the pattern as a string, where each character represents the same time span.\nShould only be used with single characters as values, otherwise the character slots will be messed up.\nCharacter legend:
\n\n- "|" cycle separator
\n- "-" hold previous value
\n- "." silence
\n
",
- "params": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- },
- "description": "the pattern to use
",
- "name": "pattern"
- },
- {
- "type": {
- "names": [
- "number"
- ]
- },
- "description": "max number of characters (approximately)
",
- "name": "chars"
- }
- ],
- "returns": [
- {
- "description": "string
"
- }
- ],
- "examples": [
- "const line = drawLine(\"0 [1 2 3]\", 10); // |0--123|0--123\nconsole.log(line);"
- ],
- "name": "drawLine",
- "longname": "drawLine",
- "kind": "function",
- "scope": "global",
- "___id": "T000002R000046",
- "___s": true
- },
- {
- "comment": "/**\n * Changes the structure of the pattern to form an euclidean rhythm.\n * Euclidian rhythms are rhythms obtained using the greatest common divisor of two numbers.\n * They were described in 2004 by Godfried Toussaint, a canadian computer scientist.\n * Euclidian rhythms are really useful for computer/algorithmic music because they can accurately\n * describe a large number of rhythms used in the most important music world traditions.\n *\n * @memberof Pattern\n * @param {number} pulses the number of onsets / beats\n * @param {number} steps the number of steps to fill\n * @param {number} rotation (optional) offset in steps\n * @returns Pattern\n * @example // The Cuban tresillo pattern.\n * \"c3\".euclid(3,8)\n * @example // A thirteenth century Persian rhythm called Khafif-e-ramal.\n * \"c3\".euclid(2,5)\n * @example // The archetypal pattern of the Cumbia from Colombia, as well as a Calypso rhythm from Trinidad.\n * \"c3\".euclid(3,4)\n * @example // Another thirteenth century Persian rhythm by the name of Khafif-e-ramal, as well as a Rumanian folk-dance rhythm.\n * \"c3\".euclid(3,5,2)\n * @example // A Ruchenitza rhythm used in a Bulgarian folk-dance.\n * \"c3\".euclid(3,7)\n * @example // The Cuban tresillo pattern.\n * \"c3\".euclid(3,8)\n * @example // Another Ruchenitza Bulgarian folk-dance rhythm.\n * \"c3\".euclid(4,7)\n * @example // The Aksak rhythm of Turkey.\n * \"c3\".euclid(4,9)\n * @example // The metric pattern used by Frank Zappa in his piece titled Outside Now.\n * \"c3\".euclid(4,11)\n * @example // Yields the York-Samai pattern, a popular Arab rhythm.\n * \"c3\".euclid(5,6)\n * @example // The Nawakhat pattern, another popular Arab rhythm.\n * \"c3\".euclid(5,7)\n * @example // The Cuban cinquillo pattern.\n * \"c3\".euclid(5,8)\n * @example // A popular Arab rhythm called Agsag-Samai.\n * \"c3\".euclid(5,9)\n * @example // The metric pattern used by Moussorgsky in Pictures at an Exhibition.\n * \"c3\".euclid(5,11)\n * @example // The Venda clapping pattern of a South African children’s song.\n * \"c3\".euclid(5,12)\n * @example // The Bossa-Nova rhythm necklace of Brazil.\n * \"c3\".euclid(5,16)\n * @example // A typical rhythm played on the Bendir (frame drum).\n * \"c3\".euclid(7,8)\n * @example // A common West African bell pattern.\n * \"c3\".euclid(7,12)\n * @example // A Samba rhythm necklace from Brazil.\n * \"c3\".euclid(7,16,14)\n * @example // A rhythm necklace used in the Central African Republic.\n * \"c3\".euclid(9,16)\n * @example // A rhythm necklace of the Aka Pygmies of Central Africa.\n * \"c3\".euclid(11,24,14)\n * @example // Another rhythm necklace of the Aka Pygmies of the upper Sangha.\n * \"c3\".euclid(13,24,5)\n */",
- "meta": {
- "range": [
- 3722,
- 3846
- ],
- "filename": "euclid.mjs",
- "lineno": 77,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100000894",
- "name": "Pattern.prototype.euclid",
- "type": "FunctionExpression",
- "paramnames": [
- "pulses",
- "steps",
- "rotation"
- ]
- }
- },
- "description": "Changes the structure of the pattern to form an euclidean rhythm.\nEuclidian rhythms are rhythms obtained using the greatest common divisor of two numbers.\nThey were described in 2004 by Godfried Toussaint, a canadian computer scientist.\nEuclidian rhythms are really useful for computer/algorithmic music because they can accurately\ndescribe a large number of rhythms used in the most important music world traditions.
",
- "memberof": "Pattern",
- "params": [
- {
- "type": {
- "names": [
- "number"
- ]
- },
- "description": "the number of onsets / beats
",
- "name": "pulses"
- },
- {
- "type": {
- "names": [
- "number"
- ]
- },
- "description": "the number of steps to fill
",
- "name": "steps"
- },
- {
- "type": {
- "names": [
- "number"
- ]
- },
- "description": "(optional) offset in steps
",
- "name": "rotation"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "examples": [
- "// The Cuban tresillo pattern.\n\"c3\".euclid(3,8)",
- "// A thirteenth century Persian rhythm called Khafif-e-ramal.\n\"c3\".euclid(2,5)",
- "// The archetypal pattern of the Cumbia from Colombia, as well as a Calypso rhythm from Trinidad.\n\"c3\".euclid(3,4)",
- "// Another thirteenth century Persian rhythm by the name of Khafif-e-ramal, as well as a Rumanian folk-dance rhythm.\n\"c3\".euclid(3,5,2)",
- "// A Ruchenitza rhythm used in a Bulgarian folk-dance.\n\"c3\".euclid(3,7)",
- "// The Cuban tresillo pattern.\n\"c3\".euclid(3,8)",
- "// Another Ruchenitza Bulgarian folk-dance rhythm.\n\"c3\".euclid(4,7)",
- "// The Aksak rhythm of Turkey.\n\"c3\".euclid(4,9)",
- "// The metric pattern used by Frank Zappa in his piece titled Outside Now.\n\"c3\".euclid(4,11)",
- "// Yields the York-Samai pattern, a popular Arab rhythm.\n\"c3\".euclid(5,6)",
- "// The Nawakhat pattern, another popular Arab rhythm.\n\"c3\".euclid(5,7)",
- "// The Cuban cinquillo pattern.\n\"c3\".euclid(5,8)",
- "// A popular Arab rhythm called Agsag-Samai.\n\"c3\".euclid(5,9)",
- "// The metric pattern used by Moussorgsky in Pictures at an Exhibition.\n\"c3\".euclid(5,11)",
- "// The Venda clapping pattern of a South African children’s song.\n\"c3\".euclid(5,12)",
- "// The Bossa-Nova rhythm necklace of Brazil.\n\"c3\".euclid(5,16)",
- "// A typical rhythm played on the Bendir (frame drum).\n\"c3\".euclid(7,8)",
- "// A common West African bell pattern.\n\"c3\".euclid(7,12)",
- "// A Samba rhythm necklace from Brazil.\n\"c3\".euclid(7,16,14)",
- "// A rhythm necklace used in the Central African Republic.\n\"c3\".euclid(9,16)",
- "// A rhythm necklace of the Aka Pygmies of Central Africa.\n\"c3\".euclid(11,24,14)",
- "// Another rhythm necklace of the Aka Pygmies of the upper Sangha.\n\"c3\".euclid(13,24,5)"
- ],
- "name": "euclid",
- "longname": "Pattern#euclid",
- "kind": "function",
- "scope": "instance",
- "___id": "T000002R000070",
- "___s": true
- },
- {
- "comment": "/**\n * Similar to {@link Pattern#euclid}, but each pulse is held until the next pulse, so there will be no gaps.\n */",
- "meta": {
- "range": [
- 3966,
- 4337
- ],
- "filename": "euclid.mjs",
- "lineno": 84,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100000918",
- "name": "Pattern.prototype.euclidLegato",
- "type": "FunctionExpression",
- "paramnames": [
- "pulses",
- "steps",
- "rotation"
- ]
- },
- "vars": {
- "bin_pat": "Pattern#euclidLegato~bin_pat",
- "firstOne": "Pattern#euclidLegato~firstOne",
- "gapless": "Pattern#euclidLegato~gapless",
- "": null
- }
- },
- "description": "Similar to {@link Pattern#euclid}, but each pulse is held until the next pulse, so there will be no gaps.
",
- "name": "euclidLegato",
- "longname": "Pattern#euclidLegato",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000071",
- "___s": true
- },
- {
- "comment": "/** @class Class representing a pattern. */",
- "meta": {
- "range": [
- 1178,
- 31915
- ],
- "filename": "pattern.mjs",
- "lineno": 17,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005731",
- "name": "exports.Pattern",
- "type": "ClassDeclaration"
- }
- },
- "name": "Pattern",
- "longname": "Pattern",
- "kind": "class",
- "classdesc": "Class representing a pattern.
",
- "scope": "global",
- "description": "Create a pattern. As an end user, you will most likely not create a Pattern directly.
",
- "memberof": "Pattern",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "description": "The function that maps a {@link State} to an array of {@link Hap}.
",
- "name": "query"
- }
- ],
- "___id": "T000002R000531",
- "___s": true
- },
- {
- "comment": "/**\n * query haps insude the tiven time span\n *\n * @param {Fraction | number} begin from time\n * @param {Fraction | number} end to time\n * @returns Hap[]\n * @example\n * const pattern = sequence('a', ['b', 'c']);\n * const haps = pattern.queryArc(0, 1);\n */",
- "meta": {
- "range": [
- 1737,
- 1823
- ],
- "filename": "pattern.mjs",
- "lineno": 37,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005746",
- "name": "Pattern#queryArc",
- "type": "MethodDefinition",
- "paramnames": [
- "begin",
- "end"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "query haps insude the tiven time span
",
- "params": [
- {
- "type": {
- "names": [
- "Fraction",
- "number"
- ]
- },
- "description": "from time
",
- "name": "begin"
- },
- {
- "type": {
- "names": [
- "Fraction",
- "number"
- ]
- },
- "description": "to time
",
- "name": "end"
- }
- ],
- "returns": [
- {
- "description": "Hap[]
"
- }
- ],
- "examples": [
- "const pattern = sequence('a', ['b', 'c']);\nconst haps = pattern.queryArc(0, 1);"
- ],
- "name": "queryArc",
- "longname": "Pattern#queryArc",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000533",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern, with queries split at cycle boundaries. This makes\n * some calculations easier to express, as all haps are then constrained to\n * happen within a cycle.\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 2046,
- 2247
- ],
- "filename": "pattern.mjs",
- "lineno": 47,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005763",
- "name": "Pattern#_splitQueries",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern, with queries split at cycle boundaries. This makes\nsome calculations easier to express, as all haps are then constrained to\nhappen within a cycle.
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_splitQueries",
- "longname": "Pattern#_splitQueries",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000534",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern, where the given function is applied to the query\n * timespan before passing it to the original pattern.\n * @param {Function} func the function to apply\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 2469,
- 2563
- ],
- "filename": "pattern.mjs",
- "lineno": 61,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005803",
- "name": "Pattern#withQuerySpan",
- "type": "MethodDefinition",
- "paramnames": [
- "func"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern, where the given function is applied to the query\ntimespan before passing it to the original pattern.
",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "description": "the function to apply
",
- "name": "func"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "withQuerySpan",
- "longname": "Pattern#withQuerySpan",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000537",
- "___s": true
- },
- {
- "comment": "/**\n * As with {@link Pattern#withQuerySpan}, but the function is applied to both the\n * begin and end time of the query timespan.\n * @param {Function} func the function to apply\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 2782,
- 2901
- ],
- "filename": "pattern.mjs",
- "lineno": 71,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005822",
- "name": "Pattern#withQueryTime",
- "type": "MethodDefinition",
- "paramnames": [
- "func"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "As with {@link Pattern#withQuerySpan}, but the function is applied to both the\nbegin and end time of the query timespan.
",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "description": "the function to apply
",
- "name": "func"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "withQueryTime",
- "longname": "Pattern#withQueryTime",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000538",
- "___s": true
- },
- {
- "comment": "/**\n * Similar to {@link Pattern#withQuerySpan}, but the function is applied to the timespans\n * of all haps returned by pattern queries (both `part` timespans, and where\n * present, `whole` timespans).\n * @param {Function} func\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 3172,
- 3282
- ],
- "filename": "pattern.mjs",
- "lineno": 82,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005847",
- "name": "Pattern#withHapSpan",
- "type": "MethodDefinition",
- "paramnames": [
- "func"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Similar to {@link Pattern#withQuerySpan}, but the function is applied to the timespans\nof all haps returned by pattern queries (both part timespans, and where\npresent, whole timespans).
",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "name": "func"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "withHapSpan",
- "longname": "Pattern#withHapSpan",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000539",
- "___s": true
- },
- {
- "comment": "/**\n * As with {@link Pattern#withHapSpan}, but the function is applied to both the\n * begin and end time of the hap timespans.\n * @param {Function} func the function to apply\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 3498,
- 3581
- ],
- "filename": "pattern.mjs",
- "lineno": 92,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005872",
- "name": "Pattern#withHapTime",
- "type": "MethodDefinition",
- "paramnames": [
- "func"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "As with {@link Pattern#withHapSpan}, but the function is applied to both the\nbegin and end time of the hap timespans.
",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "description": "the function to apply
",
- "name": "func"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "withHapTime",
- "longname": "Pattern#withHapTime",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000540",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern with the given function applied to the list of haps returned by every query.\n * @param {Function} func\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 3751,
- 3832
- ],
- "filename": "pattern.mjs",
- "lineno": 101,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005889",
- "name": "Pattern#_withHaps",
- "type": "MethodDefinition",
- "paramnames": [
- "func"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern with the given function applied to the list of haps returned by every query.
",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "name": "func"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_withHaps",
- "longname": "Pattern#_withHaps",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000541",
- "___s": true
- },
- {
- "comment": "/**\n * As with {@link Pattern#_withHaps}, but applies the function to every hap, rather than every list of haps.\n * @param {Function} func\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 4009,
- 4082
- ],
- "filename": "pattern.mjs",
- "lineno": 110,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005906",
- "name": "Pattern#_withHap",
- "type": "MethodDefinition",
- "paramnames": [
- "func"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "As with {@link Pattern#_withHaps}, but applies the function to every hap, rather than every list of haps.
",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "name": "func"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_withHap",
- "longname": "Pattern#_withHap",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000542",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern with the context field set to every hap set to the given value.\n * @param {*} context\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 4235,
- 4321
- ],
- "filename": "pattern.mjs",
- "lineno": 119,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005923",
- "name": "Pattern#_setContext",
- "type": "MethodDefinition",
- "paramnames": [
- "context"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern with the context field set to every hap set to the given value.
",
- "params": [
- {
- "type": {
- "names": [
- "*"
- ]
- },
- "name": "context"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_setContext",
- "longname": "Pattern#_setContext",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000543",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern with the given function applied to the context field of every hap.\n * @param {Function} func\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 4481,
- 4575
- ],
- "filename": "pattern.mjs",
- "lineno": 128,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005940",
- "name": "Pattern#_withContext",
- "type": "MethodDefinition",
- "paramnames": [
- "func"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern with the given function applied to the context field of every hap.
",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "name": "func"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_withContext",
- "longname": "Pattern#_withContext",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000544",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern with the context field of every hap set to an empty object.\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 4700,
- 4776
- ],
- "filename": "pattern.mjs",
- "lineno": 136,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005961",
- "name": "Pattern#_stripContext",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern with the context field of every hap set to an empty object.
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_stripContext",
- "longname": "Pattern#_stripContext",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000545",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern with the given location information added to the\n * context of every hap.\n * @param {Number} start\n * @param {Number} end\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 4969,
- 5321
- ],
- "filename": "pattern.mjs",
- "lineno": 147,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100005977",
- "name": "Pattern#withLocation",
- "type": "MethodDefinition",
- "paramnames": [
- "start",
- "end"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern with the given location information added to the\ncontext of every hap.
",
- "params": [
- {
- "type": {
- "names": [
- "Number"
- ]
- },
- "name": "start"
- },
- {
- "type": {
- "names": [
- "Number"
- ]
- },
- "name": "end"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "withLocation",
- "longname": "Pattern#withLocation",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000546",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern, with the function applied to the value of\n * each hap. It has the alias {@link Pattern#fmap}.\n * @param {Function} func\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 6336,
- 6445
- ],
- "filename": "pattern.mjs",
- "lineno": 190,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006189",
- "name": "Pattern#withValue",
- "type": "MethodDefinition",
- "paramnames": [
- "func"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern, with the function applied to the value of\neach hap. It has the alias {@link Pattern#fmap}.
",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "name": "func"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "withValue",
- "longname": "Pattern#withValue",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000580",
- "___s": true
- },
- {
- "comment": "/**\n * see {@link Pattern#withValue}\n */",
- "meta": {
- "range": [
- 6496,
- 6545
- ],
- "filename": "pattern.mjs",
- "lineno": 197,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006214",
- "name": "Pattern#fmap",
- "type": "MethodDefinition",
- "paramnames": [
- "func"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "see {@link Pattern#withValue}
",
- "name": "fmap",
- "longname": "Pattern#fmap",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000581",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new Pattern, which only returns haps that meet the given test.\n * @param {Function} hap_test - a function which returns false for haps to be removed from the pattern\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 6766,
- 6864
- ],
- "filename": "pattern.mjs",
- "lineno": 206,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006225",
- "name": "Pattern#_filterHaps",
- "type": "MethodDefinition",
- "paramnames": [
- "hap_test"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new Pattern, which only returns haps that meet the given test.
",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "description": "a function which returns false for haps to be removed from the pattern
",
- "name": "hap_test"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_filterHaps",
- "longname": "Pattern#_filterHaps",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000582",
- "___s": true
- },
- {
- "comment": "/**\n * As with {@link Pattern#_filterHaps}, but the function is applied to values\n * inside haps.\n * @param {Function} value_test\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 7034,
- 7158
- ],
- "filename": "pattern.mjs",
- "lineno": 216,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006244",
- "name": "Pattern#_filterValues",
- "type": "MethodDefinition",
- "paramnames": [
- "value_test"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "As with {@link Pattern#_filterHaps}, but the function is applied to values\ninside haps.
",
- "params": [
- {
- "type": {
- "names": [
- "function"
- ]
- },
- "name": "value_test"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_filterValues",
- "longname": "Pattern#_filterValues",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000583",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern, with haps containing undefined values removed from\n * query results.\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 7295,
- 7378
- ],
- "filename": "pattern.mjs",
- "lineno": 225,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006269",
- "name": "Pattern#_removeUndefineds",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern, with haps containing undefined values removed from\nquery results.
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_removeUndefineds",
- "longname": "Pattern#_removeUndefineds",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000584",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern, with all haps without onsets filtered out. A hap\n * with an onset is one with a `whole` timespan that begins at the same time\n * as its `part` timespan.\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 7601,
- 7867
- ],
- "filename": "pattern.mjs",
- "lineno": 235,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006283",
- "name": "Pattern#onsetsOnly",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern, with all haps without onsets filtered out. A hap\nwith an onset is one with a whole timespan that begins at the same time\nas its part timespan.
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "onsetsOnly",
- "longname": "Pattern#onsetsOnly",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000585",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern, with 'continuous' haps (those without 'whole'\n * timespans) removed from query results.\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 8023,
- 8158
- ],
- "filename": "pattern.mjs",
- "lineno": 247,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006298",
- "name": "Pattern#discreteOnly",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern, with 'continuous' haps (those without 'whole'\ntimespans) removed from query results.
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "discreteOnly",
- "longname": "Pattern#discreteOnly",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000586",
- "___s": true
- },
- {
- "comment": "/**\n * When this method is called on a pattern of functions, it matches its haps\n * with those in the given pattern of values. A new pattern is returned, with\n * each matching value applied to the corresponding function.\n *\n * In this `appBoth` variant, where timespans of the function and value haps\n * are not the same but do intersect, the resulting hap has a timespan of the\n * intersection. This applies to both the part and the whole timespan.\n * @param {Pattern} pat_val\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 9601,
- 9882
- ],
- "filename": "pattern.mjs",
- "lineno": 290,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006419",
- "name": "Pattern#appBoth",
- "type": "MethodDefinition",
- "paramnames": [
- "pat_val"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "When this method is called on a pattern of functions, it matches its haps\nwith those in the given pattern of values. A new pattern is returned, with\neach matching value applied to the corresponding function.
\nIn this appBoth variant, where timespans of the function and value haps\nare not the same but do intersect, the resulting hap has a timespan of the\nintersection. This applies to both the part and the whole timespan.
",
- "params": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- },
- "name": "pat_val"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "appBoth",
- "longname": "Pattern#appBoth",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000594",
- "___s": true
- },
- {
- "comment": "/**\n * As with {@link Pattern#appBoth}, but the `whole` timespan is not the intersection,\n * but the timespan from the function of patterns that this method is called\n * on. In practice, this means that the pattern structure, including onsets,\n * are preserved from the pattern of functions (often referred to as the left\n * hand or inner pattern).\n * @param {Pattern} pat_val\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 10305,
- 11049
- ],
- "filename": "pattern.mjs",
- "lineno": 310,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006455",
- "name": "Pattern#appLeft",
- "type": "MethodDefinition",
- "paramnames": [
- "pat_val"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "As with {@link Pattern#appBoth}, but the whole timespan is not the intersection,\nbut the timespan from the function of patterns that this method is called\non. In practice, this means that the pattern structure, including onsets,\nare preserved from the pattern of functions (often referred to as the left\nhand or inner pattern).
",
- "params": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- },
- "name": "pat_val"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "appLeft",
- "longname": "Pattern#appLeft",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000596",
- "___s": true
- },
- {
- "comment": "/**\n * As with {@link Pattern#appLeft}, but `whole` timespans are instead taken from the\n * pattern of values, i.e. structure is preserved from the right hand/outer\n * pattern.\n * @param {Pattern} pat_val\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 11296,
- 12041
- ],
- "filename": "pattern.mjs",
- "lineno": 340,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006565",
- "name": "Pattern#appRight",
- "type": "MethodDefinition",
- "paramnames": [
- "pat_val"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "As with {@link Pattern#appLeft}, but whole timespans are instead taken from the\npattern of values, i.e. structure is preserved from the right hand/outer\npattern.
",
- "params": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- },
- "name": "pat_val"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "appRight",
- "longname": "Pattern#appRight",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000608",
- "___s": true
- },
- {
- "comment": "/**\n * Queries the pattern for the first cycle, returning Haps. Mainly of use when\n * debugging a pattern.\n * @param {Boolean} with_context - set to true, otherwise the context field\n * will be stripped from the resulting haps.\n * @returns [Hap]\n */",
- "meta": {
- "range": [
- 12309,
- 12508
- ],
- "filename": "pattern.mjs",
- "lineno": 370,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006675",
- "name": "Pattern#firstCycle",
- "type": "MethodDefinition",
- "paramnames": [
- "with_context"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Queries the pattern for the first cycle, returning Haps. Mainly of use when\ndebugging a pattern.
",
- "params": [
- {
- "type": {
- "names": [
- "Boolean"
- ]
- },
- "description": "set to true, otherwise the context field\nwill be stripped from the resulting haps.
",
- "name": "with_context",
- "defaultvalue": false
- }
- ],
- "returns": [
- {
- "description": "[Hap]
"
- }
- ],
- "name": "firstCycle",
- "longname": "Pattern#firstCycle",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000620",
- "___s": true
- },
- {
- "comment": "/**\n * Accessor for a list of values returned by querying the first cycle.\n */",
- "meta": {
- "range": [
- 12597,
- 12680
- ],
- "filename": "pattern.mjs",
- "lineno": 381,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006712",
- "name": "Pattern#_firstCycleValues",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Accessor for a list of values returned by querying the first cycle.
",
- "name": "_firstCycleValues",
- "longname": "Pattern#_firstCycleValues",
- "kind": "member",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000623",
- "___s": true
- },
- {
- "comment": "/**\n * More human-readable version of the {@link Pattern#_firstCycleValues} accessor.\n */",
- "meta": {
- "range": [
- 12780,
- 12944
- ],
- "filename": "pattern.mjs",
- "lineno": 388,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006729",
- "name": "Pattern#_showFirstCycle",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "More human-readable version of the {@link Pattern#_firstCycleValues} accessor.
",
- "name": "_showFirstCycle",
- "longname": "Pattern#_showFirstCycle",
- "kind": "member",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000624",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern, which returns haps sorted in temporal order. Mainly\n * of use when comparing two patterns for equality, in tests.\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 13126,
- 13401
- ],
- "filename": "pattern.mjs",
- "lineno": 399,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100006767",
- "name": "Pattern#_sortHapsByPart",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern, which returns haps sorted in temporal order. Mainly\nof use when comparing two patterns for equality, in tests.
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_sortHapsByPart",
- "longname": "Pattern#_sortHapsByPart",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000625",
- "___s": true
- },
- {
- "comment": "/**\n * Assumes a numerical pattern. Returns a new pattern with all values rounded\n * to the nearest integer.\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 15309,
- 15378
- ],
- "filename": "pattern.mjs",
- "lineno": 472,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100007154",
- "name": "Pattern#round",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Assumes a numerical pattern. Returns a new pattern with all values rounded\nto the nearest integer.
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "round",
- "longname": "Pattern#round",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000644",
- "___s": true
- },
- {
- "comment": "/**\n * Assumes a numerical pattern. Returns a new pattern with all values set to\n * their mathematical floor. E.g. `3.7` replaced with to `3`, and `-4.2`\n * replaced with `-5`.\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 15595,
- 15664
- ],
- "filename": "pattern.mjs",
- "lineno": 482,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100007173",
- "name": "Pattern#floor",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Assumes a numerical pattern. Returns a new pattern with all values set to\ntheir mathematical floor. E.g. 3.7 replaced with to 3, and -4.2\nreplaced with -5.
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "floor",
- "longname": "Pattern#floor",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000645",
- "___s": true
- },
- {
- "comment": "/**\n * Assumes a numerical pattern. Returns a new pattern with all values set to\n * their mathematical ceiling. E.g. `3.2` replaced with `4`, and `-4.2`\n * replaced with `-4`.\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 15880,
- 15947
- ],
- "filename": "pattern.mjs",
- "lineno": 492,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100007192",
- "name": "Pattern#ceil",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Assumes a numerical pattern. Returns a new pattern with all values set to\ntheir mathematical ceiling. E.g. 3.2 replaced with 4, and -4.2\nreplaced with -4.
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "ceil",
- "longname": "Pattern#ceil",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000646",
- "___s": true
- },
- {
- "comment": "/**\n * Assumes a numerical pattern, containing unipolar values in the range 0 ..\n * 1. Returns a new pattern with values scaled to the bipolar range -1 .. 1\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 16142,
- 16200
- ],
- "filename": "pattern.mjs",
- "lineno": 501,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100007211",
- "name": "Pattern#_toBipolar",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Assumes a numerical pattern, containing unipolar values in the range 0 ..
\n\n- Returns a new pattern with values scaled to the bipolar range -1 .. 1
\n
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_toBipolar",
- "longname": "Pattern#_toBipolar",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000647",
- "___s": true
- },
- {
- "comment": "/**\n * Assumes a numerical pattern, containing bipolar values in the range -1 ..\n * 1. Returns a new pattern with values scaled to the unipolar range 0 .. 1\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 16395,
- 16457
- ],
- "filename": "pattern.mjs",
- "lineno": 510,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100007227",
- "name": "Pattern#_fromBipolar",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Assumes a numerical pattern, containing bipolar values in the range -1 ..
\n\n- Returns a new pattern with values scaled to the unipolar range 0 .. 1
\n
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "_fromBipolar",
- "longname": "Pattern#_fromBipolar",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000648",
- "___s": true
- },
- {
- "comment": "/**\n * Assumes a numerical pattern, containing unipolar values in the range 0 ..\n * 1. Returns a new pattern with values scaled to the given min/max range.\n * @param {Number} min\n * @param {Number} max\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 16701,
- 16763
- ],
- "filename": "pattern.mjs",
- "lineno": 521,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100007243",
- "name": "Pattern#range",
- "type": "MethodDefinition",
- "paramnames": [
- "min",
- "max"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Assumes a numerical pattern, containing unipolar values in the range 0 ..
\n\n- Returns a new pattern with values scaled to the given min/max range.
\n
",
- "params": [
- {
- "type": {
- "names": [
- "Number"
- ]
- },
- "name": "min"
- },
- {
- "type": {
- "names": [
- "Number"
- ]
- },
- "name": "max"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "range",
- "longname": "Pattern#range",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000649",
- "___s": true
- },
- {
- "comment": "/**\n * Assumes a numerical pattern, containing unipolar values in the range 0 ..\n * 1. Returns a new pattern with values scaled to the given min/max range,\n * following an exponential curve.\n * @param {Number} min\n * @param {Number} max\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 17044,
- 17134
- ],
- "filename": "pattern.mjs",
- "lineno": 533,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100007261",
- "name": "Pattern#rangex",
- "type": "MethodDefinition",
- "paramnames": [
- "min",
- "max"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Assumes a numerical pattern, containing unipolar values in the range 0 ..
\n\n- Returns a new pattern with values scaled to the given min/max range,\nfollowing an exponential curve.
\n
",
- "params": [
- {
- "type": {
- "names": [
- "Number"
- ]
- },
- "name": "min"
- },
- {
- "type": {
- "names": [
- "Number"
- ]
- },
- "name": "max"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "rangex",
- "longname": "Pattern#rangex",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000650",
- "___s": true
- },
- {
- "comment": "/**\n * Assumes a numerical pattern, containing bipolar values in the range -1 ..\n * 1. Returns a new pattern with values scaled to the given min/max range.\n * @param {Number} min\n * @param {Number} max\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 17378,
- 17448
- ],
- "filename": "pattern.mjs",
- "lineno": 544,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100007288",
- "name": "Pattern#range2",
- "type": "MethodDefinition",
- "paramnames": [
- "min",
- "max"
- ]
- },
- "vars": {
- "": null
- }
- },
- "description": "Assumes a numerical pattern, containing bipolar values in the range -1 ..
\n\n- Returns a new pattern with values scaled to the given min/max range.
\n
",
- "params": [
- {
- "type": {
- "names": [
- "Number"
- ]
- },
- "name": "min"
- },
- {
- "type": {
- "names": [
- "Number"
- ]
- },
- "name": "max"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "range2",
- "longname": "Pattern#range2",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000651",
- "___s": true
- },
- {
- "comment": "/**\n *\n * @param {...any} funcs\n * @returns Pattern\n * @example\n * \"<[0 1 2 0]!2 [2 3 4 ~]!2 [[4 5] [4 3] 2 [0 ~]]!2 [0 -3 0 ~]!2>\"\n * .layer(\n * x=>x,\n * x=>x.add(7).late(2),\n * x=>x.add(14).late(4),\n * x=>x.add(21).late(6),\n * )\n * .slow(3)\n * .scale('C2 major')\n * .tone((await piano()).toDestination())\n */",
- "meta": {
- "range": [
- 21980,
- 22055
- ],
- "filename": "pattern.mjs",
- "lineno": 700,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100007825",
- "name": "Pattern#layer",
- "type": "MethodDefinition",
- "paramnames": [
- "funcs"
- ]
- },
- "vars": {
- "": null
- }
- },
- "params": [
- {
- "type": {
- "names": [
- "any"
- ]
- },
- "variable": true,
- "name": "funcs"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "examples": [
- "\"<[0 1 2 0]!2 [2 3 4 ~]!2 [[4 5] [4 3] 2 [0 ~]]!2 [0 -3 0 ~]!2>\"\n.layer(\n x=>x,\n x=>x.add(7).late(2),\n x=>x.add(14).late(4),\n x=>x.add(21).late(6),\n)\n.slow(3)\n.scale('C2 major')\n.tone((await piano()).toDestination())"
- ],
- "name": "layer",
- "longname": "Pattern#layer",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "___id": "T000002R000683",
- "___s": true
- },
- {
- "comment": "/**\n * Speed up a pattern by the given factor.\n *\n * @name fast\n * @memberof Pattern\n * @param {number | Pattern} factor speed up factor\n * @returns Pattern\n * @example\n * seq(e5, b4, d5, c5).fast(2)\n */",
- "meta": {
- "filename": "pattern.mjs",
- "lineno": 750,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Speed up a pattern by the given factor.
",
- "name": "fast",
- "memberof": "Pattern",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "speed up factor
",
- "name": "factor"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "examples": [
- "seq(e5, b4, d5, c5).fast(2)"
- ],
- "scope": "static",
- "longname": "Pattern.fast",
- "kind": "member",
- "___id": "T000002R000700",
- "___s": true
- },
- {
- "comment": "/**\n * Slow down a pattern over the given number of cycles.\n *\n * @name slow\n * @memberof Pattern\n * @param {number | Pattern} factor slow down factor\n * @returns Pattern\n * @example\n * seq(e5, b4, d5, c5).slow(2)\n */",
- "meta": {
- "filename": "pattern.mjs",
- "lineno": 765,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {}
- },
- "description": "Slow down a pattern over the given number of cycles.
",
- "name": "slow",
- "memberof": "Pattern",
- "params": [
- {
- "type": {
- "names": [
- "number",
- "Pattern"
- ]
- },
- "description": "slow down factor
",
- "name": "factor"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "examples": [
- "seq(e5, b4, d5, c5).slow(2)"
- ],
- "scope": "static",
- "longname": "Pattern.slow",
- "kind": "member",
- "___id": "T000002R000703",
- "___s": true
- },
- {
- "comment": "/**\n * Returns a new pattern where every other cycle is played once, twice as\n * fast, and offset in time by one quarter of a cycle. Creates a kind of\n * breakbeat feel.\n * @returns Pattern\n */",
- "meta": {
- "range": [
- 28139,
- 28235
- ],
- "filename": "pattern.mjs",
- "lineno": 919,
- "columnno": 2,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100008779",
- "name": "Pattern#brak",
- "type": "MethodDefinition",
- "paramnames": []
- },
- "vars": {
- "": null
- }
- },
- "description": "Returns a new pattern where every other cycle is played once, twice as\nfast, and offset in time by one quarter of a cycle. Creates a kind of\nbreakbeat feel.
",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "name": "brak",
- "longname": "Pattern#brak",
- "kind": "function",
- "memberof": "Pattern",
- "scope": "instance",
- "params": [],
- "___id": "T000002R000750",
- "___s": true
- },
- {
- "comment": "/** A discrete value that repeats once per cycle:\n *\n * @param {any} value - The value to repeat\n * @returns {Pattern}\n * @example\n * pure('e4')\n */",
- "meta": {
- "range": [
- 35996,
- 36200
- ],
- "filename": "pattern.mjs",
- "lineno": 1217,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100010127",
- "name": "exports.pure",
- "type": "FunctionDeclaration",
- "paramnames": [
- "value"
- ]
- }
- },
- "description": "A discrete value that repeats once per cycle:
",
- "params": [
- {
- "type": {
- "names": [
- "any"
- ]
- },
- "description": "The value to repeat
",
- "name": "value"
- }
- ],
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "examples": [
- "pure('e4')"
- ],
- "name": "pure",
- "longname": "pure",
- "kind": "function",
- "scope": "global",
- "___id": "T000002R000868",
- "___s": true
- },
- {
- "comment": "/** The given items are played at the same time at the same length:\n *\n * @param {...any} items - The items to stack\n * @return {Pattern}\n * @example\n * stack(g3, b3, [e4, d4])\n */",
- "meta": {
- "range": [
- 36713,
- 36986
- ],
- "filename": "pattern.mjs",
- "lineno": 1244,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100010188",
- "name": "exports.stack",
- "type": "FunctionDeclaration",
- "paramnames": [
- "pats"
- ]
- }
- },
- "description": "The given items are played at the same time at the same length:
",
- "params": [
- {
- "type": {
- "names": [
- "any"
- ]
- },
- "variable": true,
- "description": "The items to stack
",
- "name": "items"
- }
- ],
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "examples": [
- "stack(g3, b3, [e4, d4])"
- ],
- "name": "stack",
- "longname": "stack",
- "kind": "function",
- "scope": "global",
- "___id": "T000002R000875",
- "___s": true
- },
- {
- "comment": "/** Concatenation: combines a list of patterns, switching between them successively, one per cycle:\n *\n * synonyms: {@link cat}\n *\n * @param {...any} items - The items to concatenate\n * @return {Pattern}\n * @example\n * slowcat(e5, b4, [d5, c5])\n *\n */",
- "meta": {
- "range": [
- 37240,
- 38151
- ],
- "filename": "pattern.mjs",
- "lineno": 1261,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100010238",
- "name": "exports.slowcat",
- "type": "FunctionDeclaration",
- "paramnames": [
- "pats"
- ]
- }
- },
- "description": "Concatenation: combines a list of patterns, switching between them successively, one per cycle:
\nsynonyms: {@link cat}
",
- "params": [
- {
- "type": {
- "names": [
- "any"
- ]
- },
- "variable": true,
- "description": "The items to concatenate
",
- "name": "items"
- }
- ],
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "examples": [
- "slowcat(e5, b4, [d5, c5])"
- ],
- "name": "slowcat",
- "longname": "slowcat",
- "kind": "function",
- "scope": "global",
- "___id": "T000002R000879",
- "___s": true
- },
- {
- "comment": "/** Concatenation: combines a list of patterns, switching between them successively, one per cycle. Unlike slowcat, this version will skip cycles.\n * @param {...any} items - The items to concatenate\n * @return {Pattern}\n */",
- "meta": {
- "range": [
- 38377,
- 38649
- ],
- "filename": "pattern.mjs",
- "lineno": 1286,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100010365",
- "name": "exports.slowcatPrime",
- "type": "FunctionDeclaration",
- "paramnames": [
- "pats"
- ]
- }
- },
- "description": "Concatenation: combines a list of patterns, switching between them successively, one per cycle. Unlike slowcat, this version will skip cycles.
",
- "params": [
- {
- "type": {
- "names": [
- "any"
- ]
- },
- "variable": true,
- "description": "The items to concatenate
",
- "name": "items"
- }
- ],
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "name": "slowcatPrime",
- "longname": "slowcatPrime",
- "kind": "function",
- "scope": "global",
- "___id": "T000002R000887",
- "___s": true
- },
- {
- "comment": "/** Concatenation: as with {@link slowcat}, but squashes a cycle from each pattern into one cycle\n *\n * Synonyms: {@link seq}, {@link sequence}\n *\n * @param {...any} items - The items to concatenate\n * @return {Pattern}\n * @example\n * fastcat(e5, b4, [d5, c5])\n * // sequence(e5, b4, [d5, c5])\n * // seq(e5, b4, [d5, c5])\n */",
- "meta": {
- "range": [
- 38977,
- 39059
- ],
- "filename": "pattern.mjs",
- "lineno": 1307,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100010420",
- "name": "exports.fastcat",
- "type": "FunctionDeclaration",
- "paramnames": [
- "pats"
- ]
- }
- },
- "description": "Concatenation: as with {@link slowcat}, but squashes a cycle from each pattern into one cycle
\nSynonyms: {@link seq}, {@link sequence}
",
- "params": [
- {
- "type": {
- "names": [
- "any"
- ]
- },
- "variable": true,
- "description": "The items to concatenate
",
- "name": "items"
- }
- ],
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "examples": [
- "fastcat(e5, b4, [d5, c5])\n// sequence(e5, b4, [d5, c5])\n// seq(e5, b4, [d5, c5])"
- ],
- "name": "fastcat",
- "longname": "fastcat",
- "kind": "function",
- "scope": "global",
- "___id": "T000002R000893",
- "___s": true
- },
- {
- "comment": "/** See {@link slowcat} */",
- "meta": {
- "range": [
- 39088,
- 39147
- ],
- "filename": "pattern.mjs",
- "lineno": 1312,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100010437",
- "name": "exports.cat",
- "type": "FunctionDeclaration",
- "paramnames": [
- "pats"
- ]
- }
- },
- "description": "See {@link slowcat}
",
- "name": "cat",
- "longname": "cat",
- "kind": "function",
- "scope": "global",
- "___id": "T000002R000895",
- "___s": true
- },
- {
- "comment": "/** Like {@link fastcat}, but where each step has a temporal weight:\n * @param {...Array} items - The items to concatenate\n * @return {Pattern}\n * @example\n * timeCat([3,e3],[1, g3])\n */",
- "meta": {
- "range": [
- 39336,
- 39695
- ],
- "filename": "pattern.mjs",
- "lineno": 1322,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100010448",
- "name": "exports.timeCat",
- "type": "FunctionDeclaration",
- "paramnames": [
- "timepats"
- ]
- }
- },
- "description": "Like {@link fastcat}, but where each step has a temporal weight:
",
- "params": [
- {
- "type": {
- "names": [
- "Array"
- ]
- },
- "variable": true,
- "description": "The items to concatenate
",
- "name": "items"
- }
- ],
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "examples": [
- "timeCat([3,e3],[1, g3])"
- ],
- "name": "timeCat",
- "longname": "timeCat",
- "kind": "function",
- "scope": "global",
- "___id": "T000002R000897",
- "___s": true
- },
- {
- "comment": "/** See {@link fastcat} */",
- "meta": {
- "range": [
- 39724,
- 39788
- ],
- "filename": "pattern.mjs",
- "lineno": 1335,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100010534",
- "name": "exports.sequence",
- "type": "FunctionDeclaration",
- "paramnames": [
- "pats"
- ]
- }
- },
- "description": "See {@link fastcat}
",
- "name": "sequence",
- "longname": "sequence",
- "kind": "function",
- "scope": "global",
- "___id": "T000002R000904",
- "___s": true
- },
- {
- "comment": "/** See {@link fastcat} */",
- "meta": {
- "range": [
- 39817,
- 39876
- ],
- "filename": "pattern.mjs",
- "lineno": 1340,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100010545",
- "name": "exports.seq",
- "type": "FunctionDeclaration",
- "paramnames": [
- "pats"
- ]
- }
- },
- "description": "See {@link fastcat}
",
- "name": "seq",
- "longname": "seq",
- "kind": "function",
- "scope": "global",
- "___id": "T000002R000906",
- "___s": true
- },
- {
- "comment": "/**\n * A sawtooth signal between 0 and 1.\n *\n * @return {Pattern}\n * @example\n * \"c3 [eb3,g3] g2 [g3,bb3]\".legato(saw.slow(4))\n * @example\n * saw.range(0,8).segment(8).scale('C major').slow(4)\n *\n */",
- "meta": {
- "range": [
- 1558,
- 1598
- ],
- "filename": "signal.mjs",
- "lineno": 35,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100011947",
- "name": "exports.saw",
- "type": "VariableDeclaration"
- }
- },
- "description": "A sawtooth signal between 0 and 1.
",
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "examples": [
- "\"c3 [eb3,g3] g2 [g3,bb3]\".legato(saw.slow(4))",
- "saw.range(0,8).segment(8).scale('C major').slow(4)"
- ],
- "name": "saw",
- "longname": "saw",
- "kind": "constant",
- "scope": "global",
- "___id": "T000002R001036",
- "___s": true
- },
- {
- "comment": "/**\n * A sine signal between 0 and 1.\n *\n * @return {Pattern}\n * @example\n * sine.segment(16).range(0,15).slow(2).scale('C minor')\n *\n */",
- "meta": {
- "range": [
- 1841,
- 1882
- ],
- "filename": "signal.mjs",
- "lineno": 48,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100011985",
- "name": "exports.sine",
- "type": "VariableDeclaration"
- }
- },
- "description": "A sine signal between 0 and 1.
",
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "examples": [
- "sine.segment(16).range(0,15).slow(2).scale('C minor')"
- ],
- "name": "sine",
- "longname": "sine",
- "kind": "constant",
- "scope": "global",
- "___id": "T000002R001042",
- "___s": true
- },
- {
- "comment": "/**\n * A cosine signal between 0 and 1.\n *\n * @return {Pattern}\n * @example\n * stack(sine,cosine).segment(16).range(0,15).slow(2).scale('C minor')\n *\n */",
- "meta": {
- "range": [
- 2040,
- 2094
- ],
- "filename": "signal.mjs",
- "lineno": 59,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100011993",
- "name": "exports.cosine",
- "type": "VariableDeclaration"
- }
- },
- "description": "A cosine signal between 0 and 1.
",
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "examples": [
- "stack(sine,cosine).segment(16).range(0,15).slow(2).scale('C minor')"
- ],
- "name": "cosine",
- "longname": "cosine",
- "kind": "constant",
- "scope": "global",
- "___id": "T000002R001044",
- "___s": true
- },
- {
- "comment": "/**\n * A square signal between 0 and 1.\n *\n * @return {Pattern}\n * @example\n * square.segment(2).range(0,7).scale('C minor')\n *\n */",
- "meta": {
- "range": [
- 2287,
- 2348
- ],
- "filename": "signal.mjs",
- "lineno": 71,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100012023",
- "name": "exports.square",
- "type": "VariableDeclaration"
- }
- },
- "description": "A square signal between 0 and 1.
",
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "examples": [
- "square.segment(2).range(0,7).scale('C minor')"
- ],
- "name": "square",
- "longname": "square",
- "kind": "constant",
- "scope": "global",
- "___id": "T000002R001048",
- "___s": true
- },
- {
- "comment": "/**\n * A triangle signal between 0 and 1.\n *\n * @return {Pattern}\n * @example\n * triangle.segment(2).range(0,7).scale('C minor')\n *\n */",
- "meta": {
- "range": [
- 2531,
- 2569
- ],
- "filename": "signal.mjs",
- "lineno": 82,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/core",
- "code": {
- "id": "astnode100012048",
- "name": "exports.tri",
- "type": "VariableDeclaration"
- }
- },
- "description": "A triangle signal between 0 and 1.
",
- "returns": [
- {
- "type": {
- "names": [
- "Pattern"
- ]
- }
- }
- ],
- "examples": [
- "triangle.segment(2).range(0,7).scale('C minor')"
- ],
- "name": "tri",
- "longname": "tri",
- "kind": "constant",
- "scope": "global",
- "___id": "T000002R001052",
- "___s": true
- },
- {
- "comment": "/**\n *\n * Sends each hap as an OSC message, which can be picked up by SuperCollider or any other OSC-enabled software.\n *\n * @name osc\n * @memberof Pattern\n * @returns Pattern\n */",
- "meta": {
- "filename": "osc.mjs",
- "lineno": 15,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/osc",
- "code": {}
- },
- "description": "Sends each hap as an OSC message, which can be picked up by SuperCollider or any other OSC-enabled software.
",
- "name": "osc",
- "memberof": "Pattern",
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "scope": "static",
- "longname": "Pattern.osc",
- "kind": "member",
- "___id": "T000002R002650",
- "___s": true
- },
- {
- "comment": "/**\n * Change the pitch of each value by the given amount. Expects numbers or note strings as values.\n * The amount can be given as a number of semitones or as a string in interval short notation.\n * If you don't care about enharmonic correctness, just use numbers. Otherwise, pass the interval of\n * the form: ST where S is the degree number and T the type of interval with\n *\n * - M = major\n * - m = minor\n * - P = perfect\n * - A = augmented\n * - d = diminished\n *\n * Examples intervals:\n *\n * - 1P = unison\n * - 3M = major third\n * - 3m = minor third\n * - 4P = perfect fourth\n * - 4A = augmented fourth\n * - 5P = perfect fifth\n * - 5d = diminished fifth\n *\n * @param {string | number} amount Either number of semitones or interval string.\n * @returns Pattern\n * @memberof Pattern\n * @name transpose\n * @example\n * \"c2 c3\".fast(2).transpose(\"<0 -2 5 3>\".slow(2)).transpose(0)\n * @example\n * \"c2 c3\".fast(2).transpose(\"<1P -2M 4P 3m>\".slow(2)).transpose(0)\n */",
- "meta": {
- "filename": "tonal.mjs",
- "lineno": 46,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/tonal",
- "code": {}
- },
- "description": "Change the pitch of each value by the given amount. Expects numbers or note strings as values.\nThe amount can be given as a number of semitones or as a string in interval short notation.\nIf you don't care about enharmonic correctness, just use numbers. Otherwise, pass the interval of\nthe form: ST where S is the degree number and T the type of interval with
\n\n- M = major
\n- m = minor
\n- P = perfect
\n- A = augmented
\n- d = diminished
\n
\nExamples intervals:
\n\n- 1P = unison
\n- 3M = major third
\n- 3m = minor third
\n- 4P = perfect fourth
\n- 4A = augmented fourth
\n- 5P = perfect fifth
\n- 5d = diminished fifth
\n
",
- "params": [
- {
- "type": {
- "names": [
- "string",
- "number"
- ]
- },
- "description": "Either number of semitones or interval string.
",
- "name": "amount"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "memberof": "Pattern",
- "name": "transpose",
- "examples": [
- "\"c2 c3\".fast(2).transpose(\"<0 -2 5 3>\".slow(2)).transpose(0)",
- "\"c2 c3\".fast(2).transpose(\"<1P -2M 4P 3m>\".slow(2)).transpose(0)"
- ],
- "scope": "static",
- "longname": "Pattern.transpose",
- "kind": "member",
- "___id": "T000002R003717",
- "___s": true
- },
- {
- "comment": "/**\n * Transposes notes inside the scale by the number of steps.\n * Expected to be called on a Pattern which already has a {@link Pattern#scale}\n *\n * @memberof Pattern\n * @name scaleTranspose\n * @param {offset} offset number of steps inside the scale\n * @returns Pattern\n * @example\n * \"-8 [2,4,6]\"\n * .scale('C4 bebop major')\n * .scaleTranspose(\"<0 -1 -2 -3 -4 -5 -6 -4>\")\n */",
- "meta": {
- "filename": "tonal.mjs",
- "lineno": 99,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/tonal",
- "code": {}
- },
- "description": "Transposes notes inside the scale by the number of steps.\nExpected to be called on a Pattern which already has a {@link Pattern#scale}
",
- "memberof": "Pattern",
- "name": "scaleTranspose",
- "params": [
- {
- "type": {
- "names": [
- "offset"
- ]
- },
- "description": "number of steps inside the scale
",
- "name": "offset"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "examples": [
- "\"-8 [2,4,6]\"\n.scale('C4 bebop major')\n.scaleTranspose(\"<0 -1 -2 -3 -4 -5 -6 -4>\")"
- ],
- "scope": "static",
- "longname": "Pattern.scaleTranspose",
- "kind": "member",
- "___id": "T000002R003721",
- "___s": true
- },
- {
- "comment": "/**\n * Turns numbers into notes in the scale (zero indexed). Also sets scale for other scale operations, like {@link Pattern#scaleTranspose}.\n *\n * The scale name has the form \"TO? N\" wher\n *\n * - T = Tonic\n * - O = Octave (optional, defaults to 3)\n * - N = Name of scale, available names can be found [here](https://github.com/tonaljs/tonal/blob/main/packages/scale-type/data.ts).\n *\n * @memberof Pattern\n * @name scale\n * @param {string} scale Name of scale\n * @returns Pattern\n * @example \n * \"0 2 4 6 4 2\"\n * .scale(seq('C2 major', 'C2 minor').slow(2))\n */",
- "meta": {
- "filename": "tonal.mjs",
- "lineno": 125,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/tonal",
- "code": {}
- },
- "description": "Turns numbers into notes in the scale (zero indexed). Also sets scale for other scale operations, like {@link Pattern#scaleTranspose}.
\nThe scale name has the form "TO? N" wher
\n\n- T = Tonic
\n- O = Octave (optional, defaults to 3)
\n- N = Name of scale, available names can be found here.
\n
",
- "memberof": "Pattern",
- "name": "scale",
- "params": [
- {
- "type": {
- "names": [
- "string"
- ]
- },
- "description": "Name of scale
",
- "name": "scale"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "examples": [
- "\"0 2 4 6 4 2\"\n.scale(seq('C2 major', 'C2 minor').slow(2))"
- ],
- "scope": "static",
- "longname": "Pattern.scale",
- "kind": "member",
- "___id": "T000002R003723",
- "___s": true
- },
- {
- "comment": "/**\n * Turns chord symbols into voicings, using the smoothest voice leading possible.\n * Uses [chord-voicings package](https://github.com/felixroos/chord-voicings#chord-voicings).\n *\n * @name voicings\n * @memberof Pattern\n * @param {range} range note range for possible voicings (optional, defaults to `['F3', 'A4']`)\n * @returns Pattern\n * @example\n * stack(\"\".voicings(), \"\")\n */",
- "meta": {
- "filename": "voicings.mjs",
- "lineno": 34,
- "columnno": 0,
- "path": "/home/felix/projects/strudel/packages/tonal",
- "code": {}
- },
- "description": "Turns chord symbols into voicings, using the smoothest voice leading possible.\nUses chord-voicings package.
",
- "name": "voicings",
- "memberof": "Pattern",
- "params": [
- {
- "type": {
- "names": [
- "range"
- ]
- },
- "description": "note range for possible voicings (optional, defaults to ['F3', 'A4'])
",
- "name": "range"
- }
- ],
- "returns": [
- {
- "description": "Pattern
"
- }
- ],
- "examples": [
- "stack(\"\".voicings(), \"\")"
- ],
- "scope": "static",
- "longname": "Pattern.voicings",
- "kind": "member",
- "___id": "T000002R003748",
- "___s": true
- },
- {
- "kind": "package",
- "longname": "package:undefined",
- "files": [
- "/home/felix/projects/strudel/packages/core/controls.mjs",
- "/home/felix/projects/strudel/packages/core/drawLine.mjs",
- "/home/felix/projects/strudel/packages/core/euclid.mjs",
- "/home/felix/projects/strudel/packages/core/fraction.mjs",
- "/home/felix/projects/strudel/packages/core/gist.js",
- "/home/felix/projects/strudel/packages/core/hap.mjs",
- "/home/felix/projects/strudel/packages/core/index.mjs",
- "/home/felix/projects/strudel/packages/core/out/scripts/linenumber.js",
- "/home/felix/projects/strudel/packages/core/out/scripts/prettify/lang-css.js",
- "/home/felix/projects/strudel/packages/core/out/scripts/prettify/prettify.js",
- "/home/felix/projects/strudel/packages/core/pattern.mjs",
- "/home/felix/projects/strudel/packages/core/signal.mjs",
- "/home/felix/projects/strudel/packages/core/speak.mjs",
- "/home/felix/projects/strudel/packages/core/state.mjs",
- "/home/felix/projects/strudel/packages/core/test/drawLine.test.mjs",
- "/home/felix/projects/strudel/packages/core/test/fraction.test.mjs",
- "/home/felix/projects/strudel/packages/core/test/pattern.test.mjs",
- "/home/felix/projects/strudel/packages/core/test/util.test.mjs",
- "/home/felix/projects/strudel/packages/core/test/value.test.mjs",
- "/home/felix/projects/strudel/packages/core/timespan.mjs",
- "/home/felix/projects/strudel/packages/core/util.mjs",
- "/home/felix/projects/strudel/packages/core/value.mjs",
- "/home/felix/projects/strudel/packages/embed/embed.js",
- "/home/felix/projects/strudel/packages/eval/evaluate.mjs",
- "/home/felix/projects/strudel/packages/eval/index.mjs",
- "/home/felix/projects/strudel/packages/eval/shapeshifter.mjs",
- "/home/felix/projects/strudel/packages/eval/test/evaluate.test.mjs",
- "/home/felix/projects/strudel/packages/eval/test/shapeshifter.test.mjs",
- "/home/felix/projects/strudel/packages/midi/index.mjs",
- "/home/felix/projects/strudel/packages/midi/midi.mjs",
- "/home/felix/projects/strudel/packages/mini/index.mjs",
- "/home/felix/projects/strudel/packages/mini/krill-parser.js",
- "/home/felix/projects/strudel/packages/mini/mini.mjs",
- "/home/felix/projects/strudel/packages/mini/test/mini.test.mjs",
- "/home/felix/projects/strudel/packages/osc/osc.mjs",
- "/home/felix/projects/strudel/packages/osc/server.js",
- "/home/felix/projects/strudel/packages/osc/tidal-sniffer.js",
- "/home/felix/projects/strudel/packages/react/dist/index.cjs.js",
- "/home/felix/projects/strudel/packages/react/dist/index.es.js",
- "/home/felix/projects/strudel/packages/react/postcss.config.js",
- "/home/felix/projects/strudel/packages/react/src/App.jsx",
- "/home/felix/projects/strudel/packages/react/src/components/CodeMirror6.jsx",
- "/home/felix/projects/strudel/packages/react/src/components/MiniRepl.jsx",
- "/home/felix/projects/strudel/packages/react/src/cx.js",
- "/home/felix/projects/strudel/packages/react/src/hooks/useCycle.mjs",
- "/home/felix/projects/strudel/packages/react/src/hooks/useHighlighting.mjs",
- "/home/felix/projects/strudel/packages/react/src/hooks/usePostMessage.mjs",
- "/home/felix/projects/strudel/packages/react/src/hooks/useRepl.mjs",
- "/home/felix/projects/strudel/packages/react/src/hooks/useWebMidi.mjs",
- "/home/felix/projects/strudel/packages/react/src/index.js",
- "/home/felix/projects/strudel/packages/react/src/main.jsx",
- "/home/felix/projects/strudel/packages/react/src/themes/material-palenight.js",
- "/home/felix/projects/strudel/packages/react/tailwind.config.js",
- "/home/felix/projects/strudel/packages/react/vite.config.js",
- "/home/felix/projects/strudel/packages/serial/serial.mjs",
- "/home/felix/projects/strudel/packages/tonal/index.mjs",
- "/home/felix/projects/strudel/packages/tonal/test/tonal.test.mjs",
- "/home/felix/projects/strudel/packages/tonal/tonal.mjs",
- "/home/felix/projects/strudel/packages/tonal/voicings.mjs",
- "/home/felix/projects/strudel/packages/tone/draw.mjs",
- "/home/felix/projects/strudel/packages/tone/index.mjs",
- "/home/felix/projects/strudel/packages/tone/pianoroll.mjs",
- "/home/felix/projects/strudel/packages/tone/test/tone.test.mjs",
- "/home/felix/projects/strudel/packages/tone/tone.mjs",
- "/home/felix/projects/strudel/packages/tone/ui.mjs",
- "/home/felix/projects/strudel/packages/webaudio/clockworker.mjs",
- "/home/felix/projects/strudel/packages/webaudio/index.mjs",
- "/home/felix/projects/strudel/packages/webaudio/scheduler.mjs",
- "/home/felix/projects/strudel/packages/webaudio/webaudio.mjs",
- "/home/felix/projects/strudel/packages/xen/index.mjs",
- "/home/felix/projects/strudel/packages/xen/test/xen.test.mjs",
- "/home/felix/projects/strudel/packages/xen/tune.mjs",
- "/home/felix/projects/strudel/packages/xen/tunejs.js",
- "/home/felix/projects/strudel/packages/xen/xen.mjs"
- ],
- "___id": "T000002R014017",
- "___s": true
- }
- ]
-}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 0d4ff7b1..a4c5eaf8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2255,6 +2255,10 @@
"resolved": "packages/webaudio",
"link": true
},
+ "node_modules/@strudel.cycles/webdirt": {
+ "resolved": "packages/webdirt",
+ "link": true
+ },
"node_modules/@strudel.cycles/xen": {
"resolved": "packages/xen",
"link": true
@@ -10815,6 +10819,11 @@
"defaults": "^1.0.3"
}
},
+ "node_modules/WebDirt": {
+ "version": "1.0.0",
+ "resolved": "git+ssh://git@github.com/dktr0/WebDirt.git#425dc8fd023440d9c61ffdb8642e44e2710faea0",
+ "license": "ISC"
+ },
"node_modules/webidl-conversions": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
@@ -11271,7 +11280,7 @@
},
"packages/eval": {
"name": "@strudel.cycles/eval",
- "version": "0.1.0",
+ "version": "0.1.1",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@strudel.cycles/core": "^0.1.0",
@@ -11298,22 +11307,22 @@
},
"packages/midi": {
"name": "@strudel.cycles/midi",
- "version": "0.1.0",
+ "version": "0.1.1",
"license": "AGPL-3.0-or-later",
"dependencies": {
- "@strudel.cycles/tone": "^0.1.0",
+ "@strudel.cycles/tone": "^0.1.1",
"tone": "^14.7.77",
"webmidi": "^2.5.2"
}
},
"packages/mini": {
"name": "@strudel.cycles/mini",
- "version": "0.1.0",
+ "version": "0.1.1",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@strudel.cycles/core": "^0.1.0",
- "@strudel.cycles/eval": "^0.1.0",
- "@strudel.cycles/tone": "^0.1.0"
+ "@strudel.cycles/eval": "^0.1.1",
+ "@strudel.cycles/tone": "^0.1.1"
}
},
"packages/osc": {
@@ -11326,14 +11335,14 @@
},
"packages/react": {
"name": "@strudel.cycles/react",
- "version": "0.1.1",
+ "version": "0.1.2",
"license": "AGPL-3.0-or-later",
"peer": true,
"dependencies": {
"@codemirror/lang-javascript": "^0.19.0",
"@strudel.cycles/core": "*",
- "@strudel.cycles/eval": "^0.1.0",
- "@strudel.cycles/tone": "^0.1.0",
+ "@strudel.cycles/eval": "^0.1.1",
+ "@strudel.cycles/tone": "^0.1.1",
"react-codemirror6": "^1.1.0",
"react-hook-inview": "^4.5.0"
},
@@ -11407,7 +11416,7 @@
},
"packages/tonal": {
"name": "@strudel.cycles/tonal",
- "version": "0.1.0",
+ "version": "0.1.1",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@strudel.cycles/core": "^0.1.0",
@@ -11432,7 +11441,7 @@
},
"packages/tone": {
"name": "@strudel.cycles/tone",
- "version": "0.1.0",
+ "version": "0.1.1",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@strudel.cycles/core": "^0.1.0",
@@ -11443,15 +11452,24 @@
},
"packages/webaudio": {
"name": "@strudel.cycles/webaudio",
- "version": "0.1.0",
+ "version": "0.1.1",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@strudel.cycles/core": "^0.1.0"
}
},
+ "packages/webdirt": {
+ "name": "@strudel.cycles/webdirt",
+ "version": "0.1.0",
+ "license": "AGPL-3.0-or-later",
+ "dependencies": {
+ "@strudel.cycles/core": "^0.1.0",
+ "WebDirt": "github:dktr0/WebDirt"
+ }
+ },
"packages/xen": {
"name": "@strudel.cycles/xen",
- "version": "0.1.0",
+ "version": "0.1.1",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@strudel.cycles/core": "^0.1.0"
@@ -13281,7 +13299,7 @@
"@strudel.cycles/midi": {
"version": "file:packages/midi",
"requires": {
- "@strudel.cycles/tone": "^0.1.0",
+ "@strudel.cycles/tone": "^0.1.1",
"tone": "^14.7.77",
"webmidi": "^2.5.2"
}
@@ -13290,8 +13308,8 @@
"version": "file:packages/mini",
"requires": {
"@strudel.cycles/core": "^0.1.0",
- "@strudel.cycles/eval": "^0.1.0",
- "@strudel.cycles/tone": "^0.1.0"
+ "@strudel.cycles/eval": "^0.1.1",
+ "@strudel.cycles/tone": "^0.1.1"
}
},
"@strudel.cycles/osc": {
@@ -13305,8 +13323,8 @@
"requires": {
"@codemirror/lang-javascript": "^0.19.0",
"@strudel.cycles/core": "*",
- "@strudel.cycles/eval": "^0.1.0",
- "@strudel.cycles/tone": "^0.1.0",
+ "@strudel.cycles/eval": "^0.1.1",
+ "@strudel.cycles/tone": "^0.1.1",
"@types/react": "^17.0.2",
"@types/react-dom": "^17.0.2",
"@vitejs/plugin-react": "^1.3.0",
@@ -13401,6 +13419,13 @@
"@strudel.cycles/core": "^0.1.0"
}
},
+ "@strudel.cycles/webdirt": {
+ "version": "file:packages/webdirt",
+ "requires": {
+ "@strudel.cycles/core": "^0.1.0",
+ "WebDirt": "github:dktr0/WebDirt"
+ }
+ },
"@strudel.cycles/xen": {
"version": "file:packages/xen",
"requires": {
@@ -18362,8 +18387,8 @@
"requires": {
"@codemirror/lang-javascript": "^0.19.0",
"@strudel.cycles/core": "*",
- "@strudel.cycles/eval": "^0.1.0",
- "@strudel.cycles/tone": "^0.1.0",
+ "@strudel.cycles/eval": "^0.1.1",
+ "@strudel.cycles/tone": "^0.1.1",
"@types/react": "^17.0.2",
"@types/react-dom": "^17.0.2",
"@vitejs/plugin-react": "^1.3.0",
@@ -20004,6 +20029,10 @@
"defaults": "^1.0.3"
}
},
+ "WebDirt": {
+ "version": "git+ssh://git@github.com/dktr0/WebDirt.git#425dc8fd023440d9c61ffdb8642e44e2710faea0",
+ "from": "WebDirt@github:dktr0/WebDirt"
+ },
"webidl-conversions": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
diff --git a/package.json b/package.json
index df264d03..f4a1f1be 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
"scripts": {
"test": "npm run test --workspaces --if-present && cd repl && npm run test",
"bootstrap": "lerna bootstrap",
- "setup": "npm i && npm run bootstrap && cd repl && npm i",
+ "setup": "npm i && npm run bootstrap && cd repl && npm i && cd ../tutorial && npm i",
"repl": "cd repl && npm run dev",
"osc": "cd packages/osc && npm run server",
"build": "rm -rf out && cd repl && npm run build && cd ../tutorial && npm run build",
diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs
index e59d4cc7..7b8cfc8c 100644
--- a/packages/core/controls.mjs
+++ b/packages/core/controls.mjs
@@ -760,4 +760,13 @@ generic_params.forEach(([type, name, description]) => {
Pattern.prototype[name] = _setter(controls[name]);
});
+// create custom param
+controls.createParam = (name) => {
+ Pattern.prototype[name] = _setter(controls[name]);
+ return (...pats) => _name(name, ...pats);
+};
+
+controls.createParams = (...names) =>
+ names.reduce((acc, name) => Object.assign(acc, { [name]: createParam(name) }), {});
+
export default controls;
diff --git a/packages/core/package-lock.json b/packages/core/package-lock.json
index 100781f5..3426c161 100644
--- a/packages/core/package-lock.json
+++ b/packages/core/package-lock.json
@@ -6,8 +6,8 @@
"packages": {
"": {
"name": "@strudel.cycles/core",
- "version": "0.0.3",
- "license": "GPL-3.0-or-later",
+ "version": "0.1.0",
+ "license": "AGPL-3.0-or-later",
"dependencies": {
"bjork": "^0.0.1",
"fraction.js": "^4.2.0"
diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs
index 41ff5b7f..29558f46 100644
--- a/packages/core/pattern.mjs
+++ b/packages/core/pattern.mjs
@@ -1049,6 +1049,9 @@ export class Pattern {
.unit('c')
.slow(factor);
}
+ onTrigger(onTrigger) {
+ return this._withHap((hap) => hap.setContext({ ...hap.context, onTrigger }));
+ }
}
// TODO - adopt value.mjs fully..
diff --git a/packages/eval/README.md b/packages/eval/README.md
index 6b11cb84..a65558b0 100644
--- a/packages/eval/README.md
+++ b/packages/eval/README.md
@@ -15,9 +15,11 @@ npm i @strudel.cycles/eval --save
```js
import { evaluate, extend } from '@strudel.cycles/eval';
-import * as strudel from '@strudel.cycles/core';
-extend(strudel); // add strudel to eval scope
+evalScope(
+ import('@strudel.cycles/core'),
+ // import other strudel packages here
+); // add strudel to eval scope
async function run(code) {
const { pattern } = await evaluate(code);
diff --git a/packages/eval/package-lock.json b/packages/eval/package-lock.json
index 9dcd5027..bedeb9aa 100644
--- a/packages/eval/package-lock.json
+++ b/packages/eval/package-lock.json
@@ -6,8 +6,8 @@
"packages": {
"": {
"name": "@strudel.cycles/eval",
- "version": "0.0.3",
- "license": "GPL-3.0-or-later",
+ "version": "0.1.1",
+ "license": "AGPL-3.0-or-later",
"dependencies": {
"estraverse": "^5.3.0",
"shift-ast": "^6.1.0",
diff --git a/packages/midi/package-lock.json b/packages/midi/package-lock.json
index ccb23eaf..181c8a39 100644
--- a/packages/midi/package-lock.json
+++ b/packages/midi/package-lock.json
@@ -6,8 +6,8 @@
"packages": {
"": {
"name": "@strudel.cycles/midi",
- "version": "0.0.4",
- "license": "GPL-3.0-or-later",
+ "version": "0.1.1",
+ "license": "AGPL-3.0-or-later",
"dependencies": {
"tone": "^14.7.77",
"webmidi": "^2.5.2"
diff --git a/packages/osc/osc.mjs b/packages/osc/osc.mjs
index e3b12823..72eb4e7f 100644
--- a/packages/osc/osc.mjs
+++ b/packages/osc/osc.mjs
@@ -22,13 +22,15 @@ let startedAt = -1;
*/
Pattern.prototype.osc = function () {
return this._withHap((hap) => {
- const onTrigger = (time, hap, currentTime, cps, cycle, delta) => {
+ const onTrigger = (time, hap, currentTime, cps) => {
+ const cycle = hap.wholeOrPart().begin.valueOf();
+ const delta = hap.duration.valueOf();
// time should be audio time of onset
// currentTime should be current time of audio context (slightly before time)
if (startedAt < 0) {
startedAt = Date.now() - currentTime * 1000;
}
- const controls = Object.assign({}, { cps: cps, cycle: cycle, delta: delta }, hap.value);
+ const controls = Object.assign({}, { cps, cycle, delta }, hap.value);
const keyvals = Object.entries(controls).flat();
const ts = Math.floor(startedAt + (time + latency) * 1000);
const message = new OSC.Message('/dirt/play', ...keyvals);
diff --git a/packages/osc/package-lock.json b/packages/osc/package-lock.json
index a9ea9620..31d931c0 100644
--- a/packages/osc/package-lock.json
+++ b/packages/osc/package-lock.json
@@ -6,8 +6,8 @@
"packages": {
"": {
"name": "@strudel.cycles/osc",
- "version": "0.0.1",
- "license": "GPL-3.0-or-later",
+ "version": "0.1.0",
+ "license": "AGPL-3.0-or-later",
"dependencies": {
"osc-js": "^2.3.2"
}
diff --git a/packages/react/dist/index.cjs.js b/packages/react/dist/index.cjs.js
index f296723f..284fa75f 100644
--- a/packages/react/dist/index.cjs.js
+++ b/packages/react/dist/index.cjs.js
@@ -1,3 +1,3 @@
-"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var o=require("react"),te=require("react-codemirror6"),D=require("@codemirror/view"),I=require("@codemirror/state"),oe=require("@codemirror/lang-javascript"),s=require("@codemirror/highlight"),ae=require("react-hook-inview"),re=require("@strudel.cycles/eval"),ne=require("@strudel.cycles/core/util.mjs"),p=require("@strudel.cycles/tone"),z=require("@strudel.cycles/core"),v=require("@strudel.cycles/midi");function se(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var f=se(o);const ce="#abb2bf",le="#7d8799",ie="#ffffff",ue="#21252b",P="rgba(0, 0, 0, 0.5)",de="transparent",W="#353a42",fe="rgba(128, 203, 196, 0.2)",F="#ffcc00",ge=D.EditorView.theme({"&":{color:"#ffffff",backgroundColor:de,fontSize:"15px","z-index":11},".cm-content":{caretColor:F,lineHeight:"22px"},".cm-line":{background:"#2C323699"},"&.cm-focused .cm-cursor":{borderLeftColor:F},"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:fe},".cm-panels":{backgroundColor:ue,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:P},".cm-selectionMatch":{backgroundColor:"#aafe661a"},"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bad0f847",outline:"1px solid #515a6b"},".cm-gutters":{background:"#2C323699",color:"#676e95",border:"none"},".cm-activeLineGutter":{backgroundColor:P},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none",color:"#ddd"},".cm-tooltip":{border:"none",backgroundColor:W},".cm-tooltip .cm-tooltip-arrow:before":{borderTopColor:"transparent",borderBottomColor:"transparent"},".cm-tooltip .cm-tooltip-arrow:after":{borderTopColor:W,borderBottomColor:W},".cm-tooltip-autocomplete":{"& > ul > li[aria-selected]":{backgroundColor:P,color:ce}}},{dark:!0}),me=s.HighlightStyle.define([{tag:s.tags.keyword,color:"#c792ea"},{tag:s.tags.operator,color:"#89ddff"},{tag:s.tags.special(s.tags.variableName),color:"#eeffff"},{tag:s.tags.typeName,color:"#f07178"},{tag:s.tags.atom,color:"#f78c6c"},{tag:s.tags.number,color:"#ff5370"},{tag:s.tags.definition(s.tags.variableName),color:"#82aaff"},{tag:s.tags.string,color:"#c3e88d"},{tag:s.tags.special(s.tags.string),color:"#f07178"},{tag:s.tags.comment,color:le},{tag:s.tags.variableName,color:"#f07178"},{tag:s.tags.tagName,color:"#ff5370"},{tag:s.tags.bracket,color:"#a2a1a4"},{tag:s.tags.meta,color:"#ffcb6b"},{tag:s.tags.attributeName,color:"#c792ea"},{tag:s.tags.propertyName,color:"#c792ea"},{tag:s.tags.className,color:"#decb6b"},{tag:s.tags.invalid,color:ie}]),be=[ge,me],B=I.StateEffect.define(),pe=I.StateField.define({create(){return D.Decoration.none},update(e,a){try{for(let l of a.effects)l.is(B)&&(e=D.Decoration.set(l.value.flatMap(u=>(u.context.locations||[]).map(({start:g,end:c})=>{const i=u.context.color||"#FFCA28";let m=a.newDoc.line(g.line).from+g.column,n=a.newDoc.line(c.line).from+c.column;const r=a.newDoc.length;return m>r||n>r?void 0:D.Decoration.mark({attributes:{style:`outline: 1px solid ${i}`}}).range(m,n)})).filter(Boolean),!0));return e}catch{return e}},provide:e=>D.EditorView.decorations.from(e)});function $({value:e,onChange:a,onViewChanged:l,onCursor:u,options:g,editorDidMount:c}){return f.default.createElement(f.default.Fragment,null,f.default.createElement(te.CodeMirror,{onViewChange:l,style:{display:"flex",flexDirection:"column",flex:"1 0 auto"},value:e,onChange:a,extensions:[oe.javascript(),be,pe]}))}function Q(e){const{onEvent:a,onQuery:l,onSchedule:u,ready:g=!0,onDraw:c}=e,[i,m]=o.useState(!1),n=1,r=()=>Math.floor(p.Tone.getTransport().seconds/n),y=(b=r())=>{const w=new z.TimeSpan(b,b+1),S=l?.(new z.State(w))||[];u?.(S,b);const H=w.begin.valueOf();p.Tone.getTransport().cancel(H);const N=(b+1)*n-.5,R=Math.max(p.Tone.getTransport().seconds,N)+.1;p.Tone.getTransport().schedule(()=>{y(b+1)},R),S?.filter(h=>h.part.begin.equals(h.whole?.begin)).forEach(h=>{p.Tone.getTransport().schedule(M=>{a(M,h,p.Tone.getContext().currentTime),p.Tone.Draw.schedule(()=>{c?.(M,h)},M)},h.part.begin.valueOf())})};o.useEffect(()=>{g&&y()},[a,u,l,c,g]);const x=async()=>{m(!0),await p.Tone.start(),p.Tone.getTransport().start("+0.1")},C=()=>{p.Tone.getTransport().pause(),m(!1)};return{start:x,stop:C,onEvent:a,started:i,setStarted:m,toggle:()=>i?C():x(),query:y,activeCycle:r}}function U(e){return o.useEffect(()=>(window.addEventListener("message",e),()=>window.removeEventListener("message",e)),[e]),o.useCallback(a=>window.postMessage(a,"*"),[])}let he=()=>Math.floor((1+Math.random())*65536).toString(16).substring(1);const ve=e=>encodeURIComponent(btoa(e));function G({tune:e,defaultSynth:a,autolink:l=!0,onEvent:u,onDraw:g}){const c=o.useMemo(()=>he(),[]),[i,m]=o.useState(e),[n,r]=o.useState(),[y,x]=o.useState(""),[C,E]=o.useState(),[b,w]=o.useState(!1),[S,H]=o.useState(""),[N,R]=o.useState(),h=o.useMemo(()=>i!==n||C,[i,n,C]),M=o.useCallback(d=>x(t=>t+`${t?`
+"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var o=require("react"),te=require("react-codemirror6"),D=require("@codemirror/view"),I=require("@codemirror/state"),oe=require("@codemirror/lang-javascript"),s=require("@codemirror/highlight"),ae=require("react-hook-inview"),re=require("@strudel.cycles/eval"),ne=require("@strudel.cycles/core/util.mjs"),p=require("@strudel.cycles/tone"),z=require("@strudel.cycles/core"),v=require("@strudel.cycles/midi");function se(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var g=se(o);const ce="#abb2bf",le="#7d8799",ie="#ffffff",ue="#21252b",P="rgba(0, 0, 0, 0.5)",de="transparent",W="#353a42",ge="rgba(128, 203, 196, 0.5)",F="#ffcc00",fe=D.EditorView.theme({"&":{color:"#ffffff",backgroundColor:de,fontSize:"15px","z-index":11},".cm-content":{caretColor:F,lineHeight:"22px"},".cm-line":{background:"#2C323699"},"&.cm-focused .cm-cursor":{backgroundColor:F,width:"3px"},"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:ge},".cm-panels":{backgroundColor:ue,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:P},".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:P},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none",color:"#ddd"},".cm-tooltip":{border:"none",backgroundColor:W},".cm-tooltip .cm-tooltip-arrow:before":{borderTopColor:"transparent",borderBottomColor:"transparent"},".cm-tooltip .cm-tooltip-arrow:after":{borderTopColor:W,borderBottomColor:W},".cm-tooltip-autocomplete":{"& > ul > li[aria-selected]":{backgroundColor:P,color:ce}}},{dark:!0}),me=s.HighlightStyle.define([{tag:s.tags.keyword,color:"#c792ea"},{tag:s.tags.operator,color:"#89ddff"},{tag:s.tags.special(s.tags.variableName),color:"#eeffff"},{tag:s.tags.typeName,color:"#f07178"},{tag:s.tags.atom,color:"#f78c6c"},{tag:s.tags.number,color:"#ff5370"},{tag:s.tags.definition(s.tags.variableName),color:"#82aaff"},{tag:s.tags.string,color:"#c3e88d"},{tag:s.tags.special(s.tags.string),color:"#f07178"},{tag:s.tags.comment,color:le},{tag:s.tags.variableName,color:"#f07178"},{tag:s.tags.tagName,color:"#ff5370"},{tag:s.tags.bracket,color:"#a2a1a4"},{tag:s.tags.meta,color:"#ffcb6b"},{tag:s.tags.attributeName,color:"#c792ea"},{tag:s.tags.propertyName,color:"#c792ea"},{tag:s.tags.className,color:"#decb6b"},{tag:s.tags.invalid,color:ie}]),be=[fe,me],B=I.StateEffect.define(),pe=I.StateField.define({create(){return D.Decoration.none},update(e,a){try{for(let l of a.effects)l.is(B)&&(e=D.Decoration.set(l.value.flatMap(u=>(u.context.locations||[]).map(({start:f,end:c})=>{const i=u.context.color||"#FFCA28";let m=a.newDoc.line(f.line).from+f.column,n=a.newDoc.line(c.line).from+c.column;const r=a.newDoc.length;return m>r||n>r?void 0:D.Decoration.mark({attributes:{style:`outline: 1px solid ${i}`}}).range(m,n)})).filter(Boolean),!0));return e}catch{return e}},provide:e=>D.EditorView.decorations.from(e)});function $({value:e,onChange:a,onViewChanged:l,onCursor:u,options:f,editorDidMount:c}){return g.default.createElement(g.default.Fragment,null,g.default.createElement(te.CodeMirror,{onViewChange:l,style:{display:"flex",flexDirection:"column",flex:"1 0 auto"},value:e,onChange:a,extensions:[oe.javascript(),be,pe]}))}function Q(e){const{onEvent:a,onQuery:l,onSchedule:u,ready:f=!0,onDraw:c}=e,[i,m]=o.useState(!1),n=1,r=()=>Math.floor(p.Tone.getTransport().seconds/n),y=(b=r())=>{const w=new z.TimeSpan(b,b+1),S=l?.(new z.State(w))||[];u?.(S,b);const H=w.begin.valueOf();p.Tone.getTransport().cancel(H);const N=(b+1)*n-.5,R=Math.max(p.Tone.getTransport().seconds,N)+.1;p.Tone.getTransport().schedule(()=>{y(b+1)},R),S?.filter(h=>h.part.begin.equals(h.whole?.begin)).forEach(h=>{p.Tone.getTransport().schedule(k=>{a(k,h,p.Tone.getContext().currentTime),p.Tone.Draw.schedule(()=>{c?.(k,h)},k)},h.part.begin.valueOf())})};o.useEffect(()=>{f&&y()},[a,u,l,c,f]);const _=async()=>{m(!0),await p.Tone.start(),p.Tone.getTransport().start("+0.1")},C=()=>{p.Tone.getTransport().pause(),m(!1)};return{start:_,stop:C,onEvent:a,started:i,setStarted:m,toggle:()=>i?C():_(),query:y,activeCycle:r}}function U(e){return o.useEffect(()=>(window.addEventListener("message",e),()=>window.removeEventListener("message",e)),[e]),o.useCallback(a=>window.postMessage(a,"*"),[])}let he=()=>Math.floor((1+Math.random())*65536).toString(16).substring(1);const ve=e=>encodeURIComponent(btoa(e));function G({tune:e,defaultSynth:a,autolink:l=!0,onEvent:u,onDraw:f}){const c=o.useMemo(()=>he(),[]),[i,m]=o.useState(e),[n,r]=o.useState(),[y,_]=o.useState(""),[C,E]=o.useState(),[b,w]=o.useState(!1),[S,H]=o.useState(""),[N,R]=o.useState(),h=o.useMemo(()=>i!==n||C,[i,n,C]),k=o.useCallback(d=>_(t=>t+`${t?`
-`:""}${d}`),[]),K=o.useMemo(()=>{if(n&&!n.includes("strudel disable-highlighting"))return(d,t)=>g?.(d,t,n)},[n,g]),T=Q({onDraw:K,onEvent:o.useCallback((d,t,Y)=>{try{u?.(t),t.context.logs?.length&&t.context.logs.forEach(M);const{onTrigger:_,velocity:Z}=t.context;if(_)_(d,t,Y,1,t.wholeOrPart().begin.valueOf(),t.duration.valueOf());else if(a){const ee=ne.getPlayableNoteValue(t);a.triggerAttackRelease(ee,t.duration.valueOf(),d,Z)}else throw new Error("no defaultSynth passed to useRepl.")}catch(_){console.warn(_),_.message="unplayable event: "+_?.message,M(_.message)}},[u,M,a]),onQuery:o.useCallback(d=>{try{return N?.query(d)||[]}catch(t){return console.warn(t),t.message="query error: "+t.message,E(t),[]}},[N]),onSchedule:o.useCallback((d,t)=>X(d,t),[]),ready:!!N&&!!n}),V=U(({data:{from:d,type:t}})=>{t==="start"&&d!==c&&(T.setStarted(!1),r(void 0))}),A=o.useCallback(async(d=i)=>{if(n&&!h){E(void 0),T.start();return}try{w(!0);const t=await re.evaluate(d);T.start(),V({type:"start",from:c}),R(()=>t.pattern),l&&(window.location.hash="#"+encodeURIComponent(btoa(i))),H(ve(i)),E(void 0),r(d),w(!1)}catch(t){t.message="evaluation error: "+t.message,console.warn(t),E(t)}},[n,h,i,T,l,c,V]),X=(d,t)=>{d.length};return{pending:b,code:i,setCode:m,pattern:N,error:C,cycle:T,setPattern:R,dirty:h,log:y,togglePlay:()=>{T.started?T.stop():A()},setActiveCode:r,activateCode:A,activeCode:n,pushLog:M,hash:S}}function L(...e){return e.filter(Boolean).join(" ")}let q=[],O;function J({view:e,pattern:a,active:l}){o.useEffect(()=>{if(e)if(a&&l){let g=function(){try{const c=p.Tone.getTransport().seconds,m=[Math.max(O||c,c-1/10),c+1/60];O=c+1/60,q=q.filter(r=>r.whole.end>c);const n=a.queryArc(...m).filter(r=>r.hasOnset());q=q.concat(n),e.dispatch({effects:B.of(q)})}catch{e.dispatch({effects:B.of([])})}u=requestAnimationFrame(g)},u=requestAnimationFrame(g);return()=>{cancelAnimationFrame(u)}}else q=[],e.dispatch({effects:B.of([])})},[a,l,e])}const ye="_container_10e1g_1",Ce="_header_10e1g_5",we="_buttons_10e1g_9",Me="_button_10e1g_9",ke="_buttonDisabled_10e1g_17",Ee="_error_10e1g_21",Te="_body_10e1g_25";var k={container:ye,header:Ce,buttons:we,button:Me,buttonDisabled:ke,error:Ee,body:Te};function j({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 _e({tune:e,defaultSynth:a,hideOutsideView:l=!1}){const{code:u,setCode:g,pattern:c,activateCode:i,error:m,cycle:n,dirty:r,togglePlay:y}=G({tune:e,defaultSynth:a,autolink:!1}),[x,C]=o.useState(),[E,b]=ae.useInView({threshold:.01}),w=o.useRef(),S=o.useMemo(()=>((b||!l)&&(w.current=!0),b||w.current),[b,l]);return J({view:x,pattern:c,active:n.started}),f.default.createElement("div",{className:k.container,ref:E},f.default.createElement("div",{className:k.header},f.default.createElement("div",{className:k.buttons},f.default.createElement("button",{className:L(k.button,n.started?"sc-animate-pulse":""),onClick:()=>y()},f.default.createElement(j,{type:n.started?"pause":"play"})),f.default.createElement("button",{className:L(r?k.button:k.buttonDisabled),onClick:()=>i()},f.default.createElement(j,{type:"refresh"}))),m&&f.default.createElement("div",{className:k.error},m.message)),f.default.createElement("div",{className:k.body},S&&f.default.createElement($,{value:u,onChange:g,onViewChanged:C})))}function xe(e){const{ready:a,connected:l,disconnected:u}=e,[g,c]=o.useState(!0),[i,m]=o.useState(v.WebMidi?.outputs||[]);return o.useEffect(()=>{v.enableWebMidi().then(()=>{v.WebMidi.addListener("connected",r=>{m([...v.WebMidi.outputs]),l?.(v.WebMidi,r)}),v.WebMidi.addListener("disconnected",r=>{m([...v.WebMidi.outputs]),u?.(v.WebMidi,r)}),a?.(v.WebMidi),c(!1)}).catch(r=>{if(r){console.error(r),console.warn("Web Midi could not be enabled..");return}})},[a,l,u,i]),{loading:g,outputs:i,outputByName:r=>v.WebMidi.getOutputByName(r)}}exports.CodeMirror=$;exports.MiniRepl=_e;exports.cx=L;exports.useCycle=Q;exports.useHighlighting=J;exports.usePostMessage=U;exports.useRepl=G;exports.useWebMidi=xe;
+`:""}${d}`),[]),K=o.useMemo(()=>{if(n&&!n.includes("strudel disable-highlighting"))return(d,t)=>f?.(d,t,n)},[n,f]),T=Q({onDraw:K,onEvent:o.useCallback((d,t,Y)=>{try{u?.(t),t.context.logs?.length&&t.context.logs.forEach(k);const{onTrigger:x,velocity:Z}=t.context;if(x)x(d,t,Y,1,t.wholeOrPart().begin.valueOf(),t.duration.valueOf());else if(a){const ee=ne.getPlayableNoteValue(t);a.triggerAttackRelease(ee,t.duration.valueOf(),d,Z)}else throw new Error("no defaultSynth passed to useRepl.")}catch(x){console.warn(x),x.message="unplayable event: "+x?.message,k(x.message)}},[u,k,a]),onQuery:o.useCallback(d=>{try{return N?.query(d)||[]}catch(t){return console.warn(t),t.message="query error: "+t.message,E(t),[]}},[N]),onSchedule:o.useCallback((d,t)=>X(d,t),[]),ready:!!N&&!!n}),A=U(({data:{from:d,type:t}})=>{t==="start"&&d!==c&&(T.setStarted(!1),r(void 0))}),L=o.useCallback(async(d=i)=>{if(n&&!h){E(void 0),T.start();return}try{w(!0);const t=await re.evaluate(d);T.start(),A({type:"start",from:c}),R(()=>t.pattern),l&&(window.location.hash="#"+encodeURIComponent(btoa(i))),H(ve(i)),E(void 0),r(d),w(!1)}catch(t){t.message="evaluation error: "+t.message,console.warn(t),E(t)}},[n,h,i,T,l,c,A]),X=(d,t)=>{d.length};return{pending:b,code:i,setCode:m,pattern:N,error:C,cycle:T,setPattern:R,dirty:h,log:y,togglePlay:()=>{T.started?T.stop():L()},setActiveCode:r,activateCode:L,activeCode:n,pushLog:k,hash:S}}function V(...e){return e.filter(Boolean).join(" ")}let q=[],O;function J({view:e,pattern:a,active:l}){o.useEffect(()=>{if(e)if(a&&l){let f=function(){try{const c=p.Tone.getTransport().seconds,m=[Math.max(O||c,c-1/10),c+1/60];O=c+1/60,q=q.filter(r=>r.whole.end>c);const n=a.queryArc(...m).filter(r=>r.hasOnset());q=q.concat(n),e.dispatch({effects:B.of(q)})}catch{e.dispatch({effects:B.of([])})}u=requestAnimationFrame(f)},u=requestAnimationFrame(f);return()=>{cancelAnimationFrame(u)}}else q=[],e.dispatch({effects:B.of([])})},[a,l,e])}const ye="_container_10e1g_1",Ce="_header_10e1g_5",we="_buttons_10e1g_9",ke="_button_10e1g_9",Me="_buttonDisabled_10e1g_17",Ee="_error_10e1g_21",Te="_body_10e1g_25";var M={container:ye,header:Ce,buttons:we,button:ke,buttonDisabled:Me,error:Ee,body:Te};function j({type:e}){return g.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:g.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:g.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:g.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 xe({tune:e,defaultSynth:a,hideOutsideView:l=!1}){const{code:u,setCode:f,pattern:c,activateCode:i,error:m,cycle:n,dirty:r,togglePlay:y}=G({tune:e,defaultSynth:a,autolink:!1}),[_,C]=o.useState(),[E,b]=ae.useInView({threshold:.01}),w=o.useRef(),S=o.useMemo(()=>((b||!l)&&(w.current=!0),b||w.current),[b,l]);return J({view:_,pattern:c,active:n.started}),g.default.createElement("div",{className:M.container,ref:E},g.default.createElement("div",{className:M.header},g.default.createElement("div",{className:M.buttons},g.default.createElement("button",{className:V(M.button,n.started?"sc-animate-pulse":""),onClick:()=>y()},g.default.createElement(j,{type:n.started?"pause":"play"})),g.default.createElement("button",{className:V(r?M.button:M.buttonDisabled),onClick:()=>i()},g.default.createElement(j,{type:"refresh"}))),m&&g.default.createElement("div",{className:M.error},m.message)),g.default.createElement("div",{className:M.body},S&&g.default.createElement($,{value:u,onChange:f,onViewChanged:C})))}function _e(e){const{ready:a,connected:l,disconnected:u}=e,[f,c]=o.useState(!0),[i,m]=o.useState(v.WebMidi?.outputs||[]);return o.useEffect(()=>{v.enableWebMidi().then(()=>{v.WebMidi.addListener("connected",r=>{m([...v.WebMidi.outputs]),l?.(v.WebMidi,r)}),v.WebMidi.addListener("disconnected",r=>{m([...v.WebMidi.outputs]),u?.(v.WebMidi,r)}),a?.(v.WebMidi),c(!1)}).catch(r=>{if(r){console.error(r),console.warn("Web Midi could not be enabled..");return}})},[a,l,u,i]),{loading:f,outputs:i,outputByName:r=>v.WebMidi.getOutputByName(r)}}exports.CodeMirror=$;exports.MiniRepl=xe;exports.cx=V;exports.useCycle=Q;exports.useHighlighting=J;exports.usePostMessage=U;exports.useRepl=G;exports.useWebMidi=_e;
diff --git a/packages/react/dist/index.es.js b/packages/react/dist/index.es.js
index 66c39d0d..77ae32c9 100644
--- a/packages/react/dist/index.es.js
+++ b/packages/react/dist/index.es.js
@@ -26,7 +26,7 @@ const ivory = '#abb2bf',
// background = '#292d3e',
background = 'transparent',
tooltipBackground = '#353a42',
- selection = 'rgba(128, 203, 196, 0.2)',
+ selection = 'rgba(128, 203, 196, 0.5)',
cursor = '#ffcc00';
/// The editor theme styles for Material Palenight.
@@ -50,7 +50,8 @@ const materialPalenightTheme = EditorView.theme(
},
// done
'&.cm-focused .cm-cursor': {
- borderLeftColor: cursor,
+ backgroundColor: cursor,
+ width: '3px',
},
'&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {
@@ -80,7 +81,7 @@ const materialPalenightTheme = EditorView.theme(
// done
'.cm-gutters': {
- background: '#2C323699',
+ background: 'transparent',
color: '#676e95',
border: 'none',
},
diff --git a/packages/react/package-lock.json b/packages/react/package-lock.json
new file mode 100644
index 00000000..aafcf807
--- /dev/null
+++ b/packages/react/package-lock.json
@@ -0,0 +1,3984 @@
+{
+ "name": "@strudel.cycles/react",
+ "version": "0.1.2",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@strudel.cycles/react",
+ "version": "0.1.2",
+ "license": "AGPL-3.0-or-later",
+ "dependencies": {
+ "@codemirror/lang-javascript": "^0.19.0",
+ "react-codemirror6": "^1.1.0",
+ "react-hook-inview": "^4.5.0"
+ },
+ "devDependencies": {
+ "@types/react": "^17.0.2",
+ "@types/react-dom": "^17.0.2",
+ "@vitejs/plugin-react": "^1.3.0",
+ "autoprefixer": "^10.4.7",
+ "postcss": "^8.4.13",
+ "react": "^17.0.2",
+ "react-dom": "^17.0.2",
+ "tailwindcss": "^3.0.24",
+ "vite": "^2.9.9"
+ },
+ "peerDependencies": {
+ "react": "^17.0.2",
+ "react-dom": "^17.0.2"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
+ "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.18.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz",
+ "integrity": "sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.18.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz",
+ "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.18.2",
+ "@babel/helper-compilation-targets": "^7.18.2",
+ "@babel/helper-module-transforms": "^7.18.0",
+ "@babel/helpers": "^7.18.2",
+ "@babel/parser": "^7.18.5",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.18.5",
+ "@babel/types": "^7.18.4",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz",
+ "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.2",
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
+ "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz",
+ "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.17.10",
+ "@babel/helper-validator-option": "^7.16.7",
+ "browserslist": "^4.20.2",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz",
+ "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
+ "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.16.7",
+ "@babel/types": "^7.17.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
+ "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz",
+ "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-simple-access": "^7.17.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.18.0",
+ "@babel/types": "^7.18.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz",
+ "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz",
+ "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
+ "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+ "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
+ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz",
+ "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.18.2",
+ "@babel/types": "^7.18.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz",
+ "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.18.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
+ "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz",
+ "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz",
+ "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/plugin-syntax-jsx": "^7.17.12",
+ "@babel/types": "^7.17.12"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz",
+ "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.17.12.tgz",
+ "integrity": "sha512-7S9G2B44EnYOx74mue02t1uD8ckWZ/ee6Uz/qfdzc35uWHX5NgRy9i+iJSb2LFRgMd+QV9zNcStQaazzzZ3n3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.16.7.tgz",
+ "integrity": "sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+ "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
+ "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/parser": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.18.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz",
+ "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.18.2",
+ "@babel/helper-environment-visitor": "^7.18.2",
+ "@babel/helper-function-name": "^7.17.9",
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/parser": "^7.18.5",
+ "@babel/types": "^7.18.4",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.18.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz",
+ "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@codemirror/autocomplete": {
+ "version": "0.19.15",
+ "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.19.15.tgz",
+ "integrity": "sha512-GQWzvvuXxNUyaEk+5gawbAD8s51/v2Chb++nx0e2eGWrphWk42isBtzOMdc3DxrxrZtPZ55q2ldNp+6G8KJLIQ==",
+ "dependencies": {
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/state": "^0.19.4",
+ "@codemirror/text": "^0.19.2",
+ "@codemirror/tooltip": "^0.19.12",
+ "@codemirror/view": "^0.19.0",
+ "@lezer/common": "^0.15.0"
+ }
+ },
+ "node_modules/@codemirror/closebrackets": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/closebrackets/-/closebrackets-0.19.2.tgz",
+ "integrity": "sha512-ClMPzPcPP0eQiDcVjtVPl6OLxgdtZSYDazsvT0AKl70V1OJva0eHgl4/6kCW3RZ0pb2n34i9nJz4eXCmK+TYDA==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/autocomplete",
+ "dependencies": {
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/rangeset": "^0.19.0",
+ "@codemirror/state": "^0.19.2",
+ "@codemirror/text": "^0.19.0",
+ "@codemirror/view": "^0.19.44"
+ }
+ },
+ "node_modules/@codemirror/commands": {
+ "version": "0.19.8",
+ "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-0.19.8.tgz",
+ "integrity": "sha512-65LIMSGUGGpY3oH6mzV46YWRrgao6NmfJ+AuC7jNz3K5NPnH6GCV1H5I6SwOFyVbkiygGyd0EFwrWqywTBD1aw==",
+ "dependencies": {
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/matchbrackets": "^0.19.0",
+ "@codemirror/state": "^0.19.2",
+ "@codemirror/text": "^0.19.6",
+ "@codemirror/view": "^0.19.22",
+ "@lezer/common": "^0.15.0"
+ }
+ },
+ "node_modules/@codemirror/comment": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/comment/-/comment-0.19.1.tgz",
+ "integrity": "sha512-uGKteBuVWAC6fW+Yt8u27DOnXMT/xV4Ekk2Z5mRsiADCZDqYvryrJd6PLL5+8t64BVyocwQwNfz1UswYS2CtFQ==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/commands",
+ "dependencies": {
+ "@codemirror/state": "^0.19.9",
+ "@codemirror/text": "^0.19.0",
+ "@codemirror/view": "^0.19.0"
+ }
+ },
+ "node_modules/@codemirror/fold": {
+ "version": "0.19.4",
+ "resolved": "https://registry.npmjs.org/@codemirror/fold/-/fold-0.19.4.tgz",
+ "integrity": "sha512-0SNSkRSOa6gymD6GauHa3sxiysjPhUC0SRVyTlvL52o0gz9GHdc8kNqNQskm3fBtGGOiSriGwF/kAsajRiGhVw==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/language",
+ "dependencies": {
+ "@codemirror/gutter": "^0.19.0",
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/rangeset": "^0.19.0",
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.22"
+ }
+ },
+ "node_modules/@codemirror/gutter": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@codemirror/gutter/-/gutter-0.19.9.tgz",
+ "integrity": "sha512-PFrtmilahin1g6uL27aG5tM/rqR9DZzZYZsIrCXA5Uc2OFTFqx4owuhoU9hqfYxHp5ovfvBwQ+txFzqS4vog6Q==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/view",
+ "dependencies": {
+ "@codemirror/rangeset": "^0.19.0",
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.23"
+ }
+ },
+ "node_modules/@codemirror/highlight": {
+ "version": "0.19.8",
+ "resolved": "https://registry.npmjs.org/@codemirror/highlight/-/highlight-0.19.8.tgz",
+ "integrity": "sha512-v/lzuHjrYR8MN2mEJcUD6fHSTXXli9C1XGYpr+ElV6fLBIUhMTNKR3qThp611xuWfXfwDxeL7ppcbkM/MzPV3A==",
+ "deprecated": "As of 0.20.0, this package has been split between @lezer/highlight and @codemirror/language",
+ "dependencies": {
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/rangeset": "^0.19.0",
+ "@codemirror/state": "^0.19.3",
+ "@codemirror/view": "^0.19.39",
+ "@lezer/common": "^0.15.0",
+ "style-mod": "^4.0.0"
+ }
+ },
+ "node_modules/@codemirror/history": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/history/-/history-0.19.2.tgz",
+ "integrity": "sha512-unhP4t3N2smzmHoo/Yio6ueWi+il8gm9VKrvi6wlcdGH5fOfVDNkmjHQ495SiR+EdOG35+3iNebSPYww0vN7ow==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/commands",
+ "dependencies": {
+ "@codemirror/state": "^0.19.2",
+ "@codemirror/view": "^0.19.0"
+ }
+ },
+ "node_modules/@codemirror/lang-javascript": {
+ "version": "0.19.7",
+ "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-0.19.7.tgz",
+ "integrity": "sha512-DL9f3JLqOEHH9cIwEqqjnP5bkjdVXeECksLtV+/MbPm+l4H+AG+PkwZaJQ2oR1GfPZKh8MVSIE94aGWNkJP8WQ==",
+ "dependencies": {
+ "@codemirror/autocomplete": "^0.19.0",
+ "@codemirror/highlight": "^0.19.7",
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/lint": "^0.19.0",
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.0",
+ "@lezer/javascript": "^0.15.1"
+ }
+ },
+ "node_modules/@codemirror/language": {
+ "version": "0.19.10",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-0.19.10.tgz",
+ "integrity": "sha512-yA0DZ3RYn2CqAAGW62VrU8c4YxscMQn45y/I9sjBlqB1e2OTQLg4CCkMBuMSLXk4xaqjlsgazeOQWaJQOKfV8Q==",
+ "dependencies": {
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/text": "^0.19.0",
+ "@codemirror/view": "^0.19.0",
+ "@lezer/common": "^0.15.5",
+ "@lezer/lr": "^0.15.0"
+ }
+ },
+ "node_modules/@codemirror/lint": {
+ "version": "0.19.6",
+ "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-0.19.6.tgz",
+ "integrity": "sha512-Pbw1Y5kHVs2J+itQ0uez3dI4qY9ApYVap7eNfV81x1/3/BXgBkKfadaw0gqJ4h4FDG7OnJwb0VbPsjJQllHjaA==",
+ "dependencies": {
+ "@codemirror/gutter": "^0.19.4",
+ "@codemirror/panel": "^0.19.0",
+ "@codemirror/rangeset": "^0.19.1",
+ "@codemirror/state": "^0.19.4",
+ "@codemirror/tooltip": "^0.19.16",
+ "@codemirror/view": "^0.19.22",
+ "crelt": "^1.0.5"
+ }
+ },
+ "node_modules/@codemirror/matchbrackets": {
+ "version": "0.19.4",
+ "resolved": "https://registry.npmjs.org/@codemirror/matchbrackets/-/matchbrackets-0.19.4.tgz",
+ "integrity": "sha512-VFkaOKPNudAA5sGP1zikRHCEKU0hjYmkKpr04pybUpQvfTvNJXlReCyP0rvH/1iEwAGPL990ZTT+QrLdu4MeEA==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/language",
+ "dependencies": {
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.0",
+ "@lezer/common": "^0.15.0"
+ }
+ },
+ "node_modules/@codemirror/panel": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/panel/-/panel-0.19.1.tgz",
+ "integrity": "sha512-sYeOCMA3KRYxZYJYn5PNlt9yNsjy3zTNTrbYSfVgjgL9QomIVgOJWPO5hZ2sTN8lufO6lw0vTBsIPL9MSidmBg==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/view",
+ "dependencies": {
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.0"
+ }
+ },
+ "node_modules/@codemirror/rangeset": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@codemirror/rangeset/-/rangeset-0.19.9.tgz",
+ "integrity": "sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/state",
+ "dependencies": {
+ "@codemirror/state": "^0.19.0"
+ }
+ },
+ "node_modules/@codemirror/rectangular-selection": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/rectangular-selection/-/rectangular-selection-0.19.2.tgz",
+ "integrity": "sha512-AXK/p5eGwFJ9GJcLfntqN4dgY+XiIF7eHfXNQJX5HhQLSped2wJE6WuC1rMEaOlcpOqlb9mrNi/ZdUjSIj9mbA==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/view",
+ "dependencies": {
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/text": "^0.19.4",
+ "@codemirror/view": "^0.19.48"
+ }
+ },
+ "node_modules/@codemirror/search": {
+ "version": "0.19.10",
+ "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-0.19.10.tgz",
+ "integrity": "sha512-qjubm69HJixPBWzI6HeEghTWOOD8NXiHOTRNvdizqs8xWRuFChq9zkjD3XiAJ7GXSTzCuQJnAP9DBBGCLq4ZIA==",
+ "dependencies": {
+ "@codemirror/panel": "^0.19.0",
+ "@codemirror/rangeset": "^0.19.0",
+ "@codemirror/state": "^0.19.3",
+ "@codemirror/text": "^0.19.0",
+ "@codemirror/view": "^0.19.34",
+ "crelt": "^1.0.5"
+ }
+ },
+ "node_modules/@codemirror/state": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.19.9.tgz",
+ "integrity": "sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==",
+ "dependencies": {
+ "@codemirror/text": "^0.19.0"
+ }
+ },
+ "node_modules/@codemirror/text": {
+ "version": "0.19.6",
+ "resolved": "https://registry.npmjs.org/@codemirror/text/-/text-0.19.6.tgz",
+ "integrity": "sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/state"
+ },
+ "node_modules/@codemirror/tooltip": {
+ "version": "0.19.16",
+ "resolved": "https://registry.npmjs.org/@codemirror/tooltip/-/tooltip-0.19.16.tgz",
+ "integrity": "sha512-zxKDHryUV5/RS45AQL+wOeN+i7/l81wK56OMnUPoTSzCWNITfxHn7BToDsjtrRKbzHqUxKYmBnn/4hPjpZ4WJQ==",
+ "deprecated": "As of 0.20.0, this package has been merged into @codemirror/view",
+ "dependencies": {
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.0"
+ }
+ },
+ "node_modules/@codemirror/view": {
+ "version": "0.19.48",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.19.48.tgz",
+ "integrity": "sha512-0eg7D2Nz4S8/caetCTz61rK0tkHI17V/d15Jy0kLOT8dTLGGNJUponDnW28h2B6bERmPlVHKh8MJIr5OCp1nGw==",
+ "dependencies": {
+ "@codemirror/rangeset": "^0.19.5",
+ "@codemirror/state": "^0.19.3",
+ "@codemirror/text": "^0.19.0",
+ "style-mod": "^4.0.0",
+ "w3c-keyname": "^2.2.4"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
+ "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz",
+ "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
+ "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
+ "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@lezer/common": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz",
+ "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig=="
+ },
+ "node_modules/@lezer/javascript": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-0.15.3.tgz",
+ "integrity": "sha512-8jA2NpOfpWwSPZxRhd9BxK2ZPvGd7nLE3LFTJ5AbMhXAzMHeMjneV6GEVd7dAIee85dtap0jdb6bgOSO0+lfwA==",
+ "dependencies": {
+ "@lezer/lr": "^0.15.0"
+ }
+ },
+ "node_modules/@lezer/lr": {
+ "version": "0.15.8",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz",
+ "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==",
+ "dependencies": {
+ "@lezer/common": "^0.15.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
+ "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+ "dev": true,
+ "dependencies": {
+ "estree-walker": "^2.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "17.0.45",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "17.0.17",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "^17"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-1.3.2.tgz",
+ "integrity": "sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.17.10",
+ "@babel/plugin-transform-react-jsx": "^7.17.3",
+ "@babel/plugin-transform-react-jsx-development": "^7.16.7",
+ "@babel/plugin-transform-react-jsx-self": "^7.16.7",
+ "@babel/plugin-transform-react-jsx-source": "^7.16.7",
+ "@rollup/pluginutils": "^4.2.1",
+ "react-refresh": "^0.13.0",
+ "resolve": "^1.22.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-node": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+ "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.0.0",
+ "acorn-walk": "^7.0.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.7",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
+ "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.20.3",
+ "caniuse-lite": "^1.0.30001335",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.20.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz",
+ "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001349",
+ "electron-to-chromium": "^1.4.147",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.5",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001354",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001354.tgz",
+ "integrity": "sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/crelt": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz",
+ "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA=="
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
+ "dev": true
+ },
+ "node_modules/detective": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
+ "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
+ "dev": true,
+ "dependencies": {
+ "acorn-node": "^1.8.2",
+ "defined": "^1.0.0",
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "detective": "bin/detective.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.156",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.156.tgz",
+ "integrity": "sha512-/Wj5NC7E0wHaMCdqxWz9B0lv7CcycDTiHyXCtbbu3pXM9TV2AOp8BtMqkVuqvJNdEvltBG6LxT2Q+BxY4LUCIA==",
+ "dev": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.43.tgz",
+ "integrity": "sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "esbuild-android-64": "0.14.43",
+ "esbuild-android-arm64": "0.14.43",
+ "esbuild-darwin-64": "0.14.43",
+ "esbuild-darwin-arm64": "0.14.43",
+ "esbuild-freebsd-64": "0.14.43",
+ "esbuild-freebsd-arm64": "0.14.43",
+ "esbuild-linux-32": "0.14.43",
+ "esbuild-linux-64": "0.14.43",
+ "esbuild-linux-arm": "0.14.43",
+ "esbuild-linux-arm64": "0.14.43",
+ "esbuild-linux-mips64le": "0.14.43",
+ "esbuild-linux-ppc64le": "0.14.43",
+ "esbuild-linux-riscv64": "0.14.43",
+ "esbuild-linux-s390x": "0.14.43",
+ "esbuild-netbsd-64": "0.14.43",
+ "esbuild-openbsd-64": "0.14.43",
+ "esbuild-sunos-64": "0.14.43",
+ "esbuild-windows-32": "0.14.43",
+ "esbuild-windows-64": "0.14.43",
+ "esbuild-windows-arm64": "0.14.43"
+ }
+ },
+ "node_modules/esbuild-android-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.43.tgz",
+ "integrity": "sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-android-arm64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.43.tgz",
+ "integrity": "sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-darwin-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.43.tgz",
+ "integrity": "sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-darwin-arm64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.43.tgz",
+ "integrity": "sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-freebsd-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.43.tgz",
+ "integrity": "sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-freebsd-arm64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.43.tgz",
+ "integrity": "sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-32": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.43.tgz",
+ "integrity": "sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.43.tgz",
+ "integrity": "sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-arm": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.43.tgz",
+ "integrity": "sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-arm64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.43.tgz",
+ "integrity": "sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-mips64le": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.43.tgz",
+ "integrity": "sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-ppc64le": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.43.tgz",
+ "integrity": "sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-riscv64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.43.tgz",
+ "integrity": "sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-linux-s390x": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.43.tgz",
+ "integrity": "sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-netbsd-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.43.tgz",
+ "integrity": "sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-openbsd-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.43.tgz",
+ "integrity": "sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-sunos-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.43.tgz",
+ "integrity": "sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-32": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.43.tgz",
+ "integrity": "sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.43.tgz",
+ "integrity": "sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/esbuild-windows-arm64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.43.tgz",
+ "integrity": "sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/infusion"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
+ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
+ "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+ "dev": true
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
+ "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
+ "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
+ "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "dev": true,
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
+ "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.6"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react": {
+ "version": "17.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-codemirror6": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/react-codemirror6/-/react-codemirror6-1.1.0.tgz",
+ "integrity": "sha512-xoXBMrnD4ZikGc3pJSXvjcy8HXuFHMOID1CTf3oJZzfh25MtkLaJxSd3gBz/hqy3rqlGXJH3BMVYDsFsfnHwQQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.14.8",
+ "@codemirror/autocomplete": "^0.19.15",
+ "@codemirror/closebrackets": "^0.19.1",
+ "@codemirror/commands": "^0.19.8",
+ "@codemirror/comment": "^0.19.1",
+ "@codemirror/fold": "^0.19.3",
+ "@codemirror/gutter": "^0.19.9",
+ "@codemirror/highlight": "^0.19.8",
+ "@codemirror/history": "^0.19.2",
+ "@codemirror/language": "^0.19.10",
+ "@codemirror/lint": "^0.19.6",
+ "@codemirror/matchbrackets": "^0.19.4",
+ "@codemirror/rectangular-selection": "^0.19.2",
+ "@codemirror/search": "^0.19.9",
+ "@codemirror/state": "^0.19.9",
+ "@codemirror/view": "^0.19.48"
+ },
+ "peerDependencies": {
+ "react": "^17.0.2",
+ "react-dom": "^17.0.2"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "17.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "scheduler": "^0.20.2"
+ },
+ "peerDependencies": {
+ "react": "17.0.2"
+ }
+ },
+ "node_modules/react-hook-inview": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/react-hook-inview/-/react-hook-inview-4.5.0.tgz",
+ "integrity": "sha512-Hm61BK32/K2Cc3bjBe2bQkndHbQP6NhHvWVX7zYitaitB6T28uUV+wlgxbXU9twxUt7+17HyHq6aezpMUCijQQ==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz",
+ "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.9",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ },
+ "node_modules/resolve": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+ "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.8.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.75.6",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz",
+ "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/style-mod": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz",
+ "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw=="
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.3.tgz",
+ "integrity": "sha512-PRJNYdSIthrb8hjmAyymEyEN8Yo61TMXpzyFUpxULeeyRn3Y3gpvuw6FlRTKrJvK7thSGKRnhT36VovVx4WeMA==",
+ "dev": true,
+ "dependencies": {
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "color-name": "^1.1.4",
+ "detective": "^5.2.1",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.11",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "lilconfig": "^2.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.14",
+ "postcss-import": "^14.1.0",
+ "postcss-js": "^4.0.0",
+ "postcss-load-config": "^3.1.4",
+ "postcss-nested": "5.0.6",
+ "postcss-selector-parser": "^6.0.10",
+ "postcss-value-parser": "^4.2.0",
+ "quick-lru": "^5.1.1",
+ "resolve": "^1.22.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=12.13.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/vite": {
+ "version": "2.9.12",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.12.tgz",
+ "integrity": "sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.14.27",
+ "postcss": "^8.4.13",
+ "resolve": "^1.22.0",
+ "rollup": "^2.59.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": ">=12.2.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "less": "*",
+ "sass": "*",
+ "stylus": "*"
+ },
+ "peerDependenciesMeta": {
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/w3c-keyname": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz",
+ "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw=="
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ }
+ },
+ "dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
+ "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.16.7"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.18.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz",
+ "integrity": "sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.18.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz",
+ "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==",
+ "dev": true,
+ "requires": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.18.2",
+ "@babel/helper-compilation-targets": "^7.18.2",
+ "@babel/helper-module-transforms": "^7.18.0",
+ "@babel/helpers": "^7.18.2",
+ "@babel/parser": "^7.18.5",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.18.5",
+ "@babel/types": "^7.18.4",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz",
+ "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.2",
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "jsesc": "^2.5.1"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
+ "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ }
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz",
+ "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.17.10",
+ "@babel/helper-validator-option": "^7.16.7",
+ "browserslist": "^4.20.2",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz",
+ "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==",
+ "dev": true
+ },
+ "@babel/helper-function-name": {
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
+ "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.16.7",
+ "@babel/types": "^7.17.0"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
+ "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz",
+ "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-simple-access": "^7.17.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.18.0",
+ "@babel/types": "^7.18.0"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz",
+ "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==",
+ "dev": true
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz",
+ "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.2"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
+ "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+ "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
+ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz",
+ "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.18.2",
+ "@babel/types": "^7.18.2"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz",
+ "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.18.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
+ "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
+ "dev": true
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz",
+ "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-react-jsx": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz",
+ "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/plugin-syntax-jsx": "^7.17.12",
+ "@babel/types": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-development": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz",
+ "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-transform-react-jsx": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-self": {
+ "version": "7.17.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.17.12.tgz",
+ "integrity": "sha512-7S9G2B44EnYOx74mue02t1uD8ckWZ/ee6Uz/qfdzc35uWHX5NgRy9i+iJSb2LFRgMd+QV9zNcStQaazzzZ3n3Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.17.12"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-source": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.16.7.tgz",
+ "integrity": "sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
+ "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/template": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
+ "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/parser": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.18.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz",
+ "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.18.2",
+ "@babel/helper-environment-visitor": "^7.18.2",
+ "@babel/helper-function-name": "^7.17.9",
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/parser": "^7.18.5",
+ "@babel/types": "^7.18.4",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.18.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz",
+ "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@codemirror/autocomplete": {
+ "version": "0.19.15",
+ "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.19.15.tgz",
+ "integrity": "sha512-GQWzvvuXxNUyaEk+5gawbAD8s51/v2Chb++nx0e2eGWrphWk42isBtzOMdc3DxrxrZtPZ55q2ldNp+6G8KJLIQ==",
+ "requires": {
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/state": "^0.19.4",
+ "@codemirror/text": "^0.19.2",
+ "@codemirror/tooltip": "^0.19.12",
+ "@codemirror/view": "^0.19.0",
+ "@lezer/common": "^0.15.0"
+ }
+ },
+ "@codemirror/closebrackets": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/closebrackets/-/closebrackets-0.19.2.tgz",
+ "integrity": "sha512-ClMPzPcPP0eQiDcVjtVPl6OLxgdtZSYDazsvT0AKl70V1OJva0eHgl4/6kCW3RZ0pb2n34i9nJz4eXCmK+TYDA==",
+ "requires": {
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/rangeset": "^0.19.0",
+ "@codemirror/state": "^0.19.2",
+ "@codemirror/text": "^0.19.0",
+ "@codemirror/view": "^0.19.44"
+ }
+ },
+ "@codemirror/commands": {
+ "version": "0.19.8",
+ "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-0.19.8.tgz",
+ "integrity": "sha512-65LIMSGUGGpY3oH6mzV46YWRrgao6NmfJ+AuC7jNz3K5NPnH6GCV1H5I6SwOFyVbkiygGyd0EFwrWqywTBD1aw==",
+ "requires": {
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/matchbrackets": "^0.19.0",
+ "@codemirror/state": "^0.19.2",
+ "@codemirror/text": "^0.19.6",
+ "@codemirror/view": "^0.19.22",
+ "@lezer/common": "^0.15.0"
+ }
+ },
+ "@codemirror/comment": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/comment/-/comment-0.19.1.tgz",
+ "integrity": "sha512-uGKteBuVWAC6fW+Yt8u27DOnXMT/xV4Ekk2Z5mRsiADCZDqYvryrJd6PLL5+8t64BVyocwQwNfz1UswYS2CtFQ==",
+ "requires": {
+ "@codemirror/state": "^0.19.9",
+ "@codemirror/text": "^0.19.0",
+ "@codemirror/view": "^0.19.0"
+ }
+ },
+ "@codemirror/fold": {
+ "version": "0.19.4",
+ "resolved": "https://registry.npmjs.org/@codemirror/fold/-/fold-0.19.4.tgz",
+ "integrity": "sha512-0SNSkRSOa6gymD6GauHa3sxiysjPhUC0SRVyTlvL52o0gz9GHdc8kNqNQskm3fBtGGOiSriGwF/kAsajRiGhVw==",
+ "requires": {
+ "@codemirror/gutter": "^0.19.0",
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/rangeset": "^0.19.0",
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.22"
+ }
+ },
+ "@codemirror/gutter": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@codemirror/gutter/-/gutter-0.19.9.tgz",
+ "integrity": "sha512-PFrtmilahin1g6uL27aG5tM/rqR9DZzZYZsIrCXA5Uc2OFTFqx4owuhoU9hqfYxHp5ovfvBwQ+txFzqS4vog6Q==",
+ "requires": {
+ "@codemirror/rangeset": "^0.19.0",
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.23"
+ }
+ },
+ "@codemirror/highlight": {
+ "version": "0.19.8",
+ "resolved": "https://registry.npmjs.org/@codemirror/highlight/-/highlight-0.19.8.tgz",
+ "integrity": "sha512-v/lzuHjrYR8MN2mEJcUD6fHSTXXli9C1XGYpr+ElV6fLBIUhMTNKR3qThp611xuWfXfwDxeL7ppcbkM/MzPV3A==",
+ "requires": {
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/rangeset": "^0.19.0",
+ "@codemirror/state": "^0.19.3",
+ "@codemirror/view": "^0.19.39",
+ "@lezer/common": "^0.15.0",
+ "style-mod": "^4.0.0"
+ }
+ },
+ "@codemirror/history": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/history/-/history-0.19.2.tgz",
+ "integrity": "sha512-unhP4t3N2smzmHoo/Yio6ueWi+il8gm9VKrvi6wlcdGH5fOfVDNkmjHQ495SiR+EdOG35+3iNebSPYww0vN7ow==",
+ "requires": {
+ "@codemirror/state": "^0.19.2",
+ "@codemirror/view": "^0.19.0"
+ }
+ },
+ "@codemirror/lang-javascript": {
+ "version": "0.19.7",
+ "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-0.19.7.tgz",
+ "integrity": "sha512-DL9f3JLqOEHH9cIwEqqjnP5bkjdVXeECksLtV+/MbPm+l4H+AG+PkwZaJQ2oR1GfPZKh8MVSIE94aGWNkJP8WQ==",
+ "requires": {
+ "@codemirror/autocomplete": "^0.19.0",
+ "@codemirror/highlight": "^0.19.7",
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/lint": "^0.19.0",
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.0",
+ "@lezer/javascript": "^0.15.1"
+ }
+ },
+ "@codemirror/language": {
+ "version": "0.19.10",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-0.19.10.tgz",
+ "integrity": "sha512-yA0DZ3RYn2CqAAGW62VrU8c4YxscMQn45y/I9sjBlqB1e2OTQLg4CCkMBuMSLXk4xaqjlsgazeOQWaJQOKfV8Q==",
+ "requires": {
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/text": "^0.19.0",
+ "@codemirror/view": "^0.19.0",
+ "@lezer/common": "^0.15.5",
+ "@lezer/lr": "^0.15.0"
+ }
+ },
+ "@codemirror/lint": {
+ "version": "0.19.6",
+ "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-0.19.6.tgz",
+ "integrity": "sha512-Pbw1Y5kHVs2J+itQ0uez3dI4qY9ApYVap7eNfV81x1/3/BXgBkKfadaw0gqJ4h4FDG7OnJwb0VbPsjJQllHjaA==",
+ "requires": {
+ "@codemirror/gutter": "^0.19.4",
+ "@codemirror/panel": "^0.19.0",
+ "@codemirror/rangeset": "^0.19.1",
+ "@codemirror/state": "^0.19.4",
+ "@codemirror/tooltip": "^0.19.16",
+ "@codemirror/view": "^0.19.22",
+ "crelt": "^1.0.5"
+ }
+ },
+ "@codemirror/matchbrackets": {
+ "version": "0.19.4",
+ "resolved": "https://registry.npmjs.org/@codemirror/matchbrackets/-/matchbrackets-0.19.4.tgz",
+ "integrity": "sha512-VFkaOKPNudAA5sGP1zikRHCEKU0hjYmkKpr04pybUpQvfTvNJXlReCyP0rvH/1iEwAGPL990ZTT+QrLdu4MeEA==",
+ "requires": {
+ "@codemirror/language": "^0.19.0",
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.0",
+ "@lezer/common": "^0.15.0"
+ }
+ },
+ "@codemirror/panel": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/panel/-/panel-0.19.1.tgz",
+ "integrity": "sha512-sYeOCMA3KRYxZYJYn5PNlt9yNsjy3zTNTrbYSfVgjgL9QomIVgOJWPO5hZ2sTN8lufO6lw0vTBsIPL9MSidmBg==",
+ "requires": {
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.0"
+ }
+ },
+ "@codemirror/rangeset": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@codemirror/rangeset/-/rangeset-0.19.9.tgz",
+ "integrity": "sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ==",
+ "requires": {
+ "@codemirror/state": "^0.19.0"
+ }
+ },
+ "@codemirror/rectangular-selection": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/rectangular-selection/-/rectangular-selection-0.19.2.tgz",
+ "integrity": "sha512-AXK/p5eGwFJ9GJcLfntqN4dgY+XiIF7eHfXNQJX5HhQLSped2wJE6WuC1rMEaOlcpOqlb9mrNi/ZdUjSIj9mbA==",
+ "requires": {
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/text": "^0.19.4",
+ "@codemirror/view": "^0.19.48"
+ }
+ },
+ "@codemirror/search": {
+ "version": "0.19.10",
+ "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-0.19.10.tgz",
+ "integrity": "sha512-qjubm69HJixPBWzI6HeEghTWOOD8NXiHOTRNvdizqs8xWRuFChq9zkjD3XiAJ7GXSTzCuQJnAP9DBBGCLq4ZIA==",
+ "requires": {
+ "@codemirror/panel": "^0.19.0",
+ "@codemirror/rangeset": "^0.19.0",
+ "@codemirror/state": "^0.19.3",
+ "@codemirror/text": "^0.19.0",
+ "@codemirror/view": "^0.19.34",
+ "crelt": "^1.0.5"
+ }
+ },
+ "@codemirror/state": {
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.19.9.tgz",
+ "integrity": "sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==",
+ "requires": {
+ "@codemirror/text": "^0.19.0"
+ }
+ },
+ "@codemirror/text": {
+ "version": "0.19.6",
+ "resolved": "https://registry.npmjs.org/@codemirror/text/-/text-0.19.6.tgz",
+ "integrity": "sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA=="
+ },
+ "@codemirror/tooltip": {
+ "version": "0.19.16",
+ "resolved": "https://registry.npmjs.org/@codemirror/tooltip/-/tooltip-0.19.16.tgz",
+ "integrity": "sha512-zxKDHryUV5/RS45AQL+wOeN+i7/l81wK56OMnUPoTSzCWNITfxHn7BToDsjtrRKbzHqUxKYmBnn/4hPjpZ4WJQ==",
+ "requires": {
+ "@codemirror/state": "^0.19.0",
+ "@codemirror/view": "^0.19.0"
+ }
+ },
+ "@codemirror/view": {
+ "version": "0.19.48",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.19.48.tgz",
+ "integrity": "sha512-0eg7D2Nz4S8/caetCTz61rK0tkHI17V/d15Jy0kLOT8dTLGGNJUponDnW28h2B6bERmPlVHKh8MJIr5OCp1nGw==",
+ "requires": {
+ "@codemirror/rangeset": "^0.19.5",
+ "@codemirror/state": "^0.19.3",
+ "@codemirror/text": "^0.19.0",
+ "style-mod": "^4.0.0",
+ "w3c-keyname": "^2.2.4"
+ }
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
+ "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
+ "dev": true
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz",
+ "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
+ "dev": true
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
+ "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==",
+ "dev": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
+ "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@lezer/common": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz",
+ "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig=="
+ },
+ "@lezer/javascript": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-0.15.3.tgz",
+ "integrity": "sha512-8jA2NpOfpWwSPZxRhd9BxK2ZPvGd7nLE3LFTJ5AbMhXAzMHeMjneV6GEVd7dAIee85dtap0jdb6bgOSO0+lfwA==",
+ "requires": {
+ "@lezer/lr": "^0.15.0"
+ }
+ },
+ "@lezer/lr": {
+ "version": "0.15.8",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz",
+ "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==",
+ "requires": {
+ "@lezer/common": "^0.15.0"
+ }
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@rollup/pluginutils": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
+ "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+ "dev": true,
+ "requires": {
+ "estree-walker": "^2.0.1",
+ "picomatch": "^2.2.2"
+ }
+ },
+ "@types/react": {
+ "version": "17.0.45",
+ "dev": true,
+ "requires": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-dom": {
+ "version": "17.0.17",
+ "dev": true,
+ "requires": {
+ "@types/react": "^17"
+ }
+ },
+ "@vitejs/plugin-react": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-1.3.2.tgz",
+ "integrity": "sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.17.10",
+ "@babel/plugin-transform-react-jsx": "^7.17.3",
+ "@babel/plugin-transform-react-jsx-development": "^7.16.7",
+ "@babel/plugin-transform-react-jsx-self": "^7.16.7",
+ "@babel/plugin-transform-react-jsx-source": "^7.16.7",
+ "@rollup/pluginutils": "^4.2.1",
+ "react-refresh": "^0.13.0",
+ "resolve": "^1.22.0"
+ }
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "acorn-node": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+ "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.0.0",
+ "acorn-walk": "^7.0.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "10.4.7",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
+ "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.20.3",
+ "caniuse-lite": "^1.0.30001335",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browserslist": {
+ "version": "4.20.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz",
+ "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001349",
+ "electron-to-chromium": "^1.4.147",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.5",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001354",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001354.tgz",
+ "integrity": "sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "crelt": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz",
+ "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA=="
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
+ "dev": true
+ },
+ "detective": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
+ "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.8.2",
+ "defined": "^1.0.0",
+ "minimist": "^1.2.6"
+ }
+ },
+ "didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.4.156",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.156.tgz",
+ "integrity": "sha512-/Wj5NC7E0wHaMCdqxWz9B0lv7CcycDTiHyXCtbbu3pXM9TV2AOp8BtMqkVuqvJNdEvltBG6LxT2Q+BxY4LUCIA==",
+ "dev": true
+ },
+ "esbuild": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.43.tgz",
+ "integrity": "sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA==",
+ "dev": true,
+ "requires": {
+ "esbuild-android-64": "0.14.43",
+ "esbuild-android-arm64": "0.14.43",
+ "esbuild-darwin-64": "0.14.43",
+ "esbuild-darwin-arm64": "0.14.43",
+ "esbuild-freebsd-64": "0.14.43",
+ "esbuild-freebsd-arm64": "0.14.43",
+ "esbuild-linux-32": "0.14.43",
+ "esbuild-linux-64": "0.14.43",
+ "esbuild-linux-arm": "0.14.43",
+ "esbuild-linux-arm64": "0.14.43",
+ "esbuild-linux-mips64le": "0.14.43",
+ "esbuild-linux-ppc64le": "0.14.43",
+ "esbuild-linux-riscv64": "0.14.43",
+ "esbuild-linux-s390x": "0.14.43",
+ "esbuild-netbsd-64": "0.14.43",
+ "esbuild-openbsd-64": "0.14.43",
+ "esbuild-sunos-64": "0.14.43",
+ "esbuild-windows-32": "0.14.43",
+ "esbuild-windows-64": "0.14.43",
+ "esbuild-windows-arm64": "0.14.43"
+ }
+ },
+ "esbuild-android-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.43.tgz",
+ "integrity": "sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-android-arm64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.43.tgz",
+ "integrity": "sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-darwin-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.43.tgz",
+ "integrity": "sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-darwin-arm64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.43.tgz",
+ "integrity": "sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-freebsd-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.43.tgz",
+ "integrity": "sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-freebsd-arm64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.43.tgz",
+ "integrity": "sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-32": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.43.tgz",
+ "integrity": "sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.43.tgz",
+ "integrity": "sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-arm": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.43.tgz",
+ "integrity": "sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-arm64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.43.tgz",
+ "integrity": "sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-mips64le": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.43.tgz",
+ "integrity": "sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-ppc64le": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.43.tgz",
+ "integrity": "sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-riscv64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.43.tgz",
+ "integrity": "sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-linux-s390x": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.43.tgz",
+ "integrity": "sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-netbsd-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.43.tgz",
+ "integrity": "sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-openbsd-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.43.tgz",
+ "integrity": "sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-sunos-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.43.tgz",
+ "integrity": "sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-32": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.43.tgz",
+ "integrity": "sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.43.tgz",
+ "integrity": "sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild-windows-arm64": {
+ "version": "0.14.43",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.43.tgz",
+ "integrity": "sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==",
+ "dev": true,
+ "optional": true
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ },
+ "estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
+ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+ "dev": true
+ },
+ "lilconfig": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
+ "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
+ "dev": true
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true
+ },
+ "node-releases": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
+ "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true
+ },
+ "object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "8.4.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+ "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "dev": true,
+ "requires": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "postcss-import": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
+ "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ }
+ },
+ "postcss-js": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
+ "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
+ "dev": true,
+ "requires": {
+ "camelcase-css": "^2.0.1"
+ }
+ },
+ "postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "dev": true,
+ "requires": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ }
+ },
+ "postcss-nested": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
+ "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.6"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true
+ },
+ "quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true
+ },
+ "react": {
+ "version": "17.0.2",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "react-codemirror6": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/react-codemirror6/-/react-codemirror6-1.1.0.tgz",
+ "integrity": "sha512-xoXBMrnD4ZikGc3pJSXvjcy8HXuFHMOID1CTf3oJZzfh25MtkLaJxSd3gBz/hqy3rqlGXJH3BMVYDsFsfnHwQQ==",
+ "requires": {
+ "@babel/runtime": "^7.14.8",
+ "@codemirror/autocomplete": "^0.19.15",
+ "@codemirror/closebrackets": "^0.19.1",
+ "@codemirror/commands": "^0.19.8",
+ "@codemirror/comment": "^0.19.1",
+ "@codemirror/fold": "^0.19.3",
+ "@codemirror/gutter": "^0.19.9",
+ "@codemirror/highlight": "^0.19.8",
+ "@codemirror/history": "^0.19.2",
+ "@codemirror/language": "^0.19.10",
+ "@codemirror/lint": "^0.19.6",
+ "@codemirror/matchbrackets": "^0.19.4",
+ "@codemirror/rectangular-selection": "^0.19.2",
+ "@codemirror/search": "^0.19.9",
+ "@codemirror/state": "^0.19.9",
+ "@codemirror/view": "^0.19.48"
+ }
+ },
+ "react-dom": {
+ "version": "17.0.2",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "scheduler": "^0.20.2"
+ }
+ },
+ "react-hook-inview": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/react-hook-inview/-/react-hook-inview-4.5.0.tgz",
+ "integrity": "sha512-Hm61BK32/K2Cc3bjBe2bQkndHbQP6NhHvWVX7zYitaitB6T28uUV+wlgxbXU9twxUt7+17HyHq6aezpMUCijQQ==",
+ "requires": {}
+ },
+ "react-refresh": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz",
+ "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==",
+ "dev": true
+ },
+ "read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "requires": {
+ "pify": "^2.3.0"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.9",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ },
+ "resolve": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+ "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.8.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
+ "rollup": {
+ "version": "2.75.6",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz",
+ "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==",
+ "dev": true,
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true
+ },
+ "style-mod": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz",
+ "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw=="
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
+ "tailwindcss": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.3.tgz",
+ "integrity": "sha512-PRJNYdSIthrb8hjmAyymEyEN8Yo61TMXpzyFUpxULeeyRn3Y3gpvuw6FlRTKrJvK7thSGKRnhT36VovVx4WeMA==",
+ "dev": true,
+ "requires": {
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "color-name": "^1.1.4",
+ "detective": "^5.2.1",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.11",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "lilconfig": "^2.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.14",
+ "postcss-import": "^14.1.0",
+ "postcss-js": "^4.0.0",
+ "postcss-load-config": "^3.1.4",
+ "postcss-nested": "5.0.6",
+ "postcss-selector-parser": "^6.0.10",
+ "postcss-value-parser": "^4.2.0",
+ "quick-lru": "^5.1.1",
+ "resolve": "^1.22.0"
+ },
+ "dependencies": {
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "vite": {
+ "version": "2.9.12",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.12.tgz",
+ "integrity": "sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.14.27",
+ "fsevents": "~2.3.2",
+ "postcss": "^8.4.13",
+ "resolve": "^1.22.0",
+ "rollup": "^2.59.0"
+ }
+ },
+ "w3c-keyname": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz",
+ "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw=="
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true
+ },
+ "yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true
+ }
+ }
+}
diff --git a/packages/react/src/hooks/useRepl.mjs b/packages/react/src/hooks/useRepl.mjs
index 8db4bb0c..99e697ee 100644
--- a/packages/react/src/hooks/useRepl.mjs
+++ b/packages/react/src/hooks/useRepl.mjs
@@ -57,14 +57,7 @@ function useRepl({ tune, defaultSynth, autolink = true, onEvent, onDraw: onDrawP
/* console.warn('no instrument chosen', event);
throw new Error(`no instrument chosen for ${JSON.stringify(event)}`); */
} else {
- onTrigger(
- time,
- event,
- currentTime,
- 1 /* cps */,
- event.wholeOrPart().begin.valueOf(),
- event.duration.valueOf(),
- );
+ onTrigger(time, event, currentTime, 1 /* cps */);
}
} catch (err) {
console.warn(err);
diff --git a/packages/react/src/themes/material-palenight.js b/packages/react/src/themes/material-palenight.js
index 5ee559c9..59117ec5 100644
--- a/packages/react/src/themes/material-palenight.js
+++ b/packages/react/src/themes/material-palenight.js
@@ -16,7 +16,7 @@ const ivory = '#abb2bf',
// background = '#292d3e',
background = 'transparent',
tooltipBackground = '#353a42',
- selection = 'rgba(128, 203, 196, 0.2)',
+ selection = 'rgba(128, 203, 196, 0.5)',
cursor = '#ffcc00';
/// The editor theme styles for Material Palenight.
@@ -40,7 +40,8 @@ export const materialPalenightTheme = EditorView.theme(
},
// done
'&.cm-focused .cm-cursor': {
- borderLeftColor: cursor,
+ backgroundColor: cursor,
+ width: '3px',
},
'&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {
@@ -70,7 +71,7 @@ export const materialPalenightTheme = EditorView.theme(
// done
'.cm-gutters': {
- background: '#2C323699',
+ background: 'transparent',
color: '#676e95',
border: 'none',
},
diff --git a/packages/tonal/package-lock.json b/packages/tonal/package-lock.json
index 9daf5c46..ec776af9 100644
--- a/packages/tonal/package-lock.json
+++ b/packages/tonal/package-lock.json
@@ -6,8 +6,8 @@
"packages": {
"": {
"name": "@strudel.cycles/tonal",
- "version": "0.0.3",
- "license": "GPL-3.0-or-later",
+ "version": "0.1.1",
+ "license": "AGPL-3.0-or-later",
"dependencies": {
"@tonaljs/tonal": "^4.6.5",
"webmidi": "^3.0.15"
diff --git a/packages/tone/draw.mjs b/packages/tone/draw.mjs
index d894c547..c0af49b2 100644
--- a/packages/tone/draw.mjs
+++ b/packages/tone/draw.mjs
@@ -20,7 +20,7 @@ export const getDrawContext = (id = 'test-canvas') => {
return canvas.getContext('2d');
};
-Pattern.prototype.draw = function (callback, cycleSpan, lookaheadCycles = 1) {
+Pattern.prototype.draw = function (callback, { from, to, onQuery }) {
if (window.strudelAnimation) {
cancelAnimationFrame(window.strudelAnimation);
}
@@ -29,19 +29,22 @@ Pattern.prototype.draw = function (callback, cycleSpan, lookaheadCycles = 1) {
events = [];
const animate = (time) => {
const t = Tone.getTransport().seconds;
- if (cycleSpan) {
- const currentCycle = Math.floor(t / cycleSpan);
+ if (from !== undefined && to !== undefined) {
+ const currentCycle = Math.floor(t);
if (cycle !== currentCycle) {
cycle = currentCycle;
- const begin = currentCycle * cycleSpan;
- const end = (currentCycle + lookaheadCycles) * cycleSpan;
- events = this._asNumber(true) // true = silent error
- .query(new State(new TimeSpan(begin, end)))
- .filter(Boolean)
- .filter((event) => event.part.begin.equals(event.whole.begin));
+ const begin = currentCycle + from;
+ const end = currentCycle + to;
+ setTimeout(() => {
+ events = this._asNumber(true) // true = silent error
+ .query(new State(new TimeSpan(begin, end)))
+ .filter(Boolean)
+ .filter((event) => event.part.begin.equals(event.whole.begin));
+ onQuery?.(events);
+ }, 0);
}
}
- callback(ctx, events, t, cycleSpan, time);
+ callback(ctx, events, t, time);
window.strudelAnimation = requestAnimationFrame(animate);
};
requestAnimationFrame(animate);
diff --git a/packages/tone/package-lock.json b/packages/tone/package-lock.json
index 61ffeaa4..59333f9c 100644
--- a/packages/tone/package-lock.json
+++ b/packages/tone/package-lock.json
@@ -6,8 +6,8 @@
"packages": {
"": {
"name": "@strudel.cycles/tone",
- "version": "0.0.4",
- "license": "GPL-3.0-or-later",
+ "version": "0.1.1",
+ "license": "AGPL-3.0-or-later",
"dependencies": {
"@tonejs/piano": "^0.2.1",
"chord-voicings": "^0.0.1",
diff --git a/packages/tone/pianoroll.mjs b/packages/tone/pianoroll.mjs
index dfb5e5cb..4035b14e 100644
--- a/packages/tone/pianoroll.mjs
+++ b/packages/tone/pianoroll.mjs
@@ -6,39 +6,126 @@ This program is free software: you can redistribute it and/or modify it under th
import { Pattern } from '@strudel.cycles/core';
+const scale = (normalized, min, max) => normalized * (max - min) + min;
+
Pattern.prototype.pianoroll = function ({
- timeframe = 10,
+ cycles = 4,
+ playhead = 0.5,
+ overscan = 1,
+ flipTime = 0,
+ flipValues = 0,
+ hideNegative = false,
inactive = '#C9E597',
active = '#FFCA28',
- background = '#2A3236',
+ // background = '#2A3236',
+ background = 'transparent',
+ minMidi = 10,
maxMidi = 90,
- minMidi = 0,
+ autorange = 0,
+ timeframe: timeframeProp,
+ fold = 0,
+ vertical = 0,
} = {}) {
- const w = window.innerWidth;
- const h = window.innerHeight;
- const midiRange = maxMidi - minMidi + 1;
- const height = h / midiRange;
+ const ctx = getDrawContext();
+ const w = ctx.canvas.width;
+ const h = ctx.canvas.height;
+ let from = -cycles * playhead;
+ let to = cycles * (1 - playhead);
+
+ if (timeframeProp) {
+ console.warn('timeframe is deprecated! use from/to instead');
+ from = 0;
+ to = timeframeProp;
+ }
+ if (!autorange && fold) {
+ console.warn('disabling autorange has no effect when fold is enabled');
+ }
+ const timeAxis = vertical ? h : w;
+ const valueAxis = vertical ? w : h;
+ let timeRange = vertical ? [timeAxis, 0] : [0, timeAxis]; // pixel range for time
+ const timeExtent = to - from; // number of seconds that fit inside the canvas frame
+ const valueRange = vertical ? [0, valueAxis] : [valueAxis, 0]; // pixel range for values
+ let valueExtent = maxMidi - minMidi + 1; // number of "slots" for values, overwritten if autorange true
+ let barThickness = valueAxis / valueExtent; // pixels per value, overwritten if autorange true
+ let foldValues = [];
+ flipTime && timeRange.reverse();
+ flipValues && valueRange.reverse();
+
+ const playheadPosition = scale(-from / timeExtent, ...timeRange);
this.draw(
(ctx, events, t) => {
ctx.fillStyle = background;
ctx.clearRect(0, 0, w, h);
ctx.fillRect(0, 0, w, h);
- events.forEach((event) => {
- const isActive = event.whole.begin <= t && event.whole.end >= t;
+ const inFrame = (event) =>
+ (!hideNegative || event.whole.begin >= 0) && event.whole.begin <= t + to && event.whole.end >= t + from;
+ events.filter(inFrame).forEach((event) => {
+ const isActive = event.whole.begin <= t && event.whole.end > t;
ctx.fillStyle = event.context?.color || inactive;
ctx.strokeStyle = event.context?.color || active;
ctx.globalAlpha = event.context.velocity ?? 1;
- const x = Math.round((event.whole.begin / timeframe) * w);
- const width = Math.round(((event.whole.end - event.whole.begin) / timeframe) * w);
- const y = Math.round(h - ((Number(event.value) - minMidi) / midiRange) * h);
- const offset = (t / timeframe) * w;
- const margin = 0;
- const coords = [x - offset + margin + 1, y + 1, width - 2, height - 2];
+ ctx.beginPath();
+ if (vertical) {
+ ctx.moveTo(0, playheadPosition);
+ ctx.lineTo(valueAxis, playheadPosition);
+ } else {
+ ctx.moveTo(playheadPosition, 0);
+ ctx.lineTo(playheadPosition, valueAxis);
+ }
+ ctx.stroke();
+ const timePx = scale((event.whole.begin - (flipTime ? to : from)) / timeExtent, ...timeRange);
+ let durationPx = scale(event.duration / timeExtent, 0, timeAxis);
+
+ const valuePx = scale(
+ fold ? foldValues.indexOf(event.value) / foldValues.length : (Number(event.value) - minMidi) / valueExtent,
+ ...valueRange,
+ );
+ let margin = 0;
+ const offset = scale(t / timeExtent, ...timeRange);
+ let coords;
+ if (vertical) {
+ coords = [
+ valuePx + 1 - (flipValues ? barThickness : 0), // x
+ timeAxis - offset + timePx + margin + 1 - (flipTime ? 0 : durationPx), // y
+ barThickness - 2, // width
+ durationPx - 2, // height
+ ];
+ } else {
+ coords = [
+ timePx - offset + margin + 1 - (flipTime ? durationPx : 0), // x
+ valuePx + 1 - (flipValues ? 0 : barThickness), // y
+ durationPx - 2, // widith
+ barThickness - 2, // height
+ ];
+ }
isActive ? ctx.strokeRect(...coords) : ctx.fillRect(...coords);
});
},
- timeframe,
- 2, // lookaheadCycles
+ {
+ from: from - overscan,
+ to: to + overscan,
+ onQuery: (events) => {
+ const getValue = (e) => Number(e.value);
+ const { min, max, values } = events.reduce(
+ ({ min, max, values }, e) => {
+ const v = getValue(e);
+ return {
+ min: v < min ? v : min,
+ max: v > max ? v : max,
+ values: values.includes(v) ? values : [...values, v],
+ };
+ },
+ { min: Infinity, max: -Infinity, values: [] },
+ );
+ if (autorange) {
+ minMidi = min;
+ maxMidi = max;
+ valueExtent = maxMidi - minMidi + 1;
+ }
+ foldValues = values.sort((a, b) => a - b);
+ barThickness = fold ? valueAxis / foldValues.length : valueAxis / valueExtent;
+ },
+ },
);
return this;
};
diff --git a/packages/webaudio/scheduler.mjs b/packages/webaudio/scheduler.mjs
index dac8c409..e4719307 100644
--- a/packages/webaudio/scheduler.mjs
+++ b/packages/webaudio/scheduler.mjs
@@ -10,18 +10,20 @@ import { State, TimeSpan } from '@strudel.cycles/core';
export class Scheduler {
worker;
pattern;
- constructor({ audioContext, interval = 0.2, onEvent }) {
+ constructor({ audioContext, interval = 0.2, onEvent, latency = 0.2 }) {
this.worker = new ClockWorker(
audioContext,
(begin, end) => {
- this.pattern.query(new State(new TimeSpan(begin, end))).forEach((e) => {
+ this.pattern.query(new State(new TimeSpan(begin + latency, end + latency))).forEach((e) => {
if (!e.part.begin.equals(e.whole.begin)) {
return;
}
+ if (e.context.onTrigger) {
+ // TODO: kill first param, as it's contained in e
+ e.context.onTrigger(e.whole.begin, e, audioContext.currentTime, 1 /* cps */);
+ }
if (onEvent) {
onEvent?.(e);
- } else {
- console.warn('unplayable event: no audio node nor onEvent callback', e);
}
});
},
diff --git a/packages/webdirt/README.md b/packages/webdirt/README.md
new file mode 100644
index 00000000..26faed99
--- /dev/null
+++ b/packages/webdirt/README.md
@@ -0,0 +1,11 @@
+# @strudel.cycles/webdirt
+
+This package adds [webdirt](https://github.com/dktr0/WebDirt) support to strudel!
+
+## Dev Notes
+
+Add default samples to repl:
+
+1. move samples to `repl/public` folder. the samples folder is expected to have subfolders, with samples in it. the subfolders will be the names of the samples.
+2. run `./makeSampleMap.sh ../../repl/public/EmuSP12 > ../../repl/public/EmuSP12.json`
+3. adapt `loadWebDirt` in App.jsx + MiniRepl.jsx to use the generated json file
diff --git a/packages/webdirt/index.mjs b/packages/webdirt/index.mjs
new file mode 100644
index 00000000..46a6887f
--- /dev/null
+++ b/packages/webdirt/index.mjs
@@ -0,0 +1,2 @@
+export * from './webdirt.mjs';
+export * from './sampler.mjs';
diff --git a/packages/webdirt/makeSampleMap.sh b/packages/webdirt/makeSampleMap.sh
new file mode 100755
index 00000000..7b399b6e
--- /dev/null
+++ b/packages/webdirt/makeSampleMap.sh
@@ -0,0 +1,32 @@
+#/bin/sh
+printf "{\n"
+dircount=0
+# for d in $searchRoot/*; do
+find $1 -mindepth 1 -maxdepth 1 -iname "*" | sort | while read d; do
+ if [ -d "$d" ]
+ then
+ if [ $dircount -ne 0 ]
+ then
+ printf ",\n"
+ fi
+ (( dircount++ ))
+ dirname=`basename $d`
+ printf "\"%s\": [" "$dirname"
+ search2=$searchRoot/$dirname/*.WAV
+ filecount=0
+ find "$d" -iname "*.wav" | sort | while read f; do
+ # for f in $search2; do
+ filename=$(printf %q "$f")
+ basename=${f##*/}
+ if [[ ${basename:0:1} != "." ]]; then
+ if [ $filecount -ne 0 ]; then
+ printf ","
+ fi
+ (( filecount++ ))
+ printf "\"%s/%s\"" "$dirname" "$basename"
+ fi
+ done
+ printf "]"
+ fi
+done
+printf "\n}\n"
diff --git a/packages/webdirt/package-lock.json b/packages/webdirt/package-lock.json
new file mode 100644
index 00000000..db873ab6
--- /dev/null
+++ b/packages/webdirt/package-lock.json
@@ -0,0 +1,28 @@
+{
+ "name": "@strudel.cycles/webdirt",
+ "version": "0.1.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@strudel.cycles/webdirt",
+ "version": "0.1.0",
+ "license": "AGPL-3.0-or-later",
+ "dependencies": {
+ "WebDirt": "github:dktr0/WebDirt"
+ }
+ },
+ "node_modules/WebDirt": {
+ "name": "webdirt",
+ "version": "1.0.0",
+ "resolved": "git+ssh://git@github.com/dktr0/WebDirt.git#425dc8fd023440d9c61ffdb8642e44e2710faea0",
+ "license": "ISC"
+ }
+ },
+ "dependencies": {
+ "WebDirt": {
+ "version": "git+ssh://git@github.com/dktr0/WebDirt.git#425dc8fd023440d9c61ffdb8642e44e2710faea0",
+ "from": "WebDirt@github:dktr0/WebDirt"
+ }
+ }
+}
diff --git a/packages/webdirt/package.json b/packages/webdirt/package.json
new file mode 100644
index 00000000..62cb55bc
--- /dev/null
+++ b/packages/webdirt/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "@strudel.cycles/webdirt",
+ "version": "0.1.0",
+ "description": "WebDirt integration for Strudel",
+ "main": "index.mjs",
+ "type": "module",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/tidalcycles/strudel.git"
+ },
+ "keywords": [
+ "tidalcycles",
+ "strudel",
+ "pattern",
+ "livecoding",
+ "algorave"
+ ],
+ "author": "Felix Roos ",
+ "license": "AGPL-3.0-or-later",
+ "bugs": {
+ "url": "https://github.com/tidalcycles/strudel/issues"
+ },
+ "homepage": "https://github.com/tidalcycles/strudel#readme",
+ "dependencies": {
+ "@strudel.cycles/core": "^0.1.0",
+ "WebDirt": "github:dktr0/WebDirt"
+ }
+}
diff --git a/packages/webdirt/sampler.mjs b/packages/webdirt/sampler.mjs
new file mode 100644
index 00000000..39a15fea
--- /dev/null
+++ b/packages/webdirt/sampler.mjs
@@ -0,0 +1,112 @@
+const bufferCache = {}; // string: Promise
+const loadCache = {}; // string: Promise
+
+export const loadBuffer = (url, ac) => {
+ if (!loadCache[url]) {
+ loadCache[url] = fetch(url)
+ .then((res) => res.arrayBuffer())
+ .then(async (res) => {
+ const decoded = await ac.decodeAudioData(res);
+ bufferCache[url] = decoded;
+ return decoded;
+ });
+ }
+ return loadCache[url];
+};
+
+export const getLoadedBuffer = (url) => {
+ return bufferCache[url];
+};
+
+/* export const playBuffer = (buffer, time = ac.currentTime, destination = ac.destination) => {
+ const src = ac.createBufferSource();
+ src.buffer = buffer;
+ src.connect(destination);
+ src.start(time);
+};
+
+export const playSample = async (url) => playBuffer(await loadBuffer(url)); */
+
+// https://estuary.mcmaster.ca/samples/resources.json
+// Array<{ "url":string, "bank": string, "n": number}>
+// ritchse/tidal-drum-machines/tree/main/machines/AkaiLinn
+const githubCache = {};
+let sampleCache = { current: undefined };
+export const loadGithubSamples = async (path, nameFn) => {
+ const storageKey = 'loadGithubSamples ' + path;
+ const stored = localStorage.getItem(storageKey);
+ if (stored) {
+ console.log('[sampler]: loaded sample list from localstorage', path);
+ githubCache[path] = JSON.parse(stored);
+ }
+ if (githubCache[path]) {
+ sampleCache.current = githubCache[path];
+ return githubCache[path];
+ }
+ console.log('[sampler]: fetching sample list from github', path);
+ try {
+ const [user, repo, ...folders] = path.split('/');
+ const baseUrl = `https://api.github.com/repos/${user}/${repo}/contents`;
+ const banks = await fetch(`${baseUrl}/${folders.join('/')}`).then((res) => res.json());
+ // fetch each subfolder
+ githubCache[path] = (
+ await Promise.all(
+ banks.map(async ({ name, path }) => ({
+ name,
+ content: await fetch(`${baseUrl}/${path}`)
+ .then((res) => res.json())
+ .catch((err) => {
+ console.error('could not load path', err);
+ }),
+ })),
+ )
+ )
+ .filter(({ content }) => !!content)
+ .reduce(
+ (acc, { name, content }) => ({
+ ...acc,
+ [nameFn?.(name) || name]: content.map(({ download_url }) => download_url),
+ }),
+ {},
+ );
+ } catch (err) {
+ console.error('[sampler]: failed to fetch sample list from github', err);
+ return;
+ }
+ sampleCache.current = githubCache[path];
+ localStorage.setItem(storageKey, JSON.stringify(sampleCache.current));
+ console.log('[sampler]: loaded samples:', sampleCache.current);
+ return githubCache[path];
+};
+
+/**
+ * load the given sample map for webdirt
+ *
+ * @example
+ * loadSamples({
+ * bd: '808bd/BD0000.WAV',
+ * sd: ['808sd/SD0000.WAV','808sd/SD0010.WAV','808sd/SD0050.WAV']
+ * }, 'https://raw.githubusercontent.com/tidalcycles/Dirt-Samples/master/');
+ * s("bd ").n(2).webdirt()
+ *
+ */
+
+export const samples = (sampleMap, baseUrl = '') => {
+ sampleCache.current = {
+ ...sampleCache.current,
+ ...Object.fromEntries(
+ Object.entries(sampleMap).map(([key, value]) => [
+ key,
+ (typeof value === 'string' ? [value] : value).map((v) =>
+ (baseUrl + v).replace('github:', 'https://raw.githubusercontent.com/'),
+ ),
+ ]),
+ ),
+ };
+};
+
+export const resetLoadedSamples = () => {
+ sampleCache.current = undefined;
+};
+
+export const getLoadedSamples = () => sampleCache.current;
diff --git a/packages/webdirt/webdirt.mjs b/packages/webdirt/webdirt.mjs
new file mode 100644
index 00000000..36637818
--- /dev/null
+++ b/packages/webdirt/webdirt.mjs
@@ -0,0 +1,98 @@
+import * as strudel from '@strudel.cycles/core';
+const { Pattern } = strudel;
+import * as WebDirt from 'WebDirt';
+import { getLoadedSamples, loadBuffer, getLoadedBuffer } from './sampler.mjs';
+
+let webDirt;
+
+/*
+example config:
+{
+ sampleMapUrl: 'EmuSP12.json',
+ sampleFolder: 'EmuSP12',
+}
+*/
+export function loadWebDirt(config) {
+ webDirt = new WebDirt.WebDirt(config);
+ webDirt.initializeWebAudio();
+}
+
+/**
+ *
+ * Uses [webdirt](https://github.com/dktr0/WebDirt) as output.
+ *
+ *
+ * show supported Webdirt controls
+ *
+ * - s :: String, -- name of sample bank
+ * - n :: Int, -- number of sample within a bank
+ * - {@link gain} :: Number, -- clamped from 0 to 2; 1 is default and full-scale
+ * - overgain :: Number, -- additional gain added to gain to go past clamp at 2
+ * - {@link pan} :: Number, -- range: 0 to 1
+ * - nudge :: Number, -- nudge the time of the sample forwards/backwards in seconds
+ * - {@link speed} :: Number, -- speed / pitch of the sample
+ * - {@link unit} :: String
+ * - note :: Number, -- pitch offset in semitones
+ * - {@link begin} :: Number, -- cut from sample start, normalized
+ * - {@link end} :: Number, -- cut from sample end, normalized
+ * - {@link cut} :: Int, -- samples with same cut number will interupt each other
+ * - {@link cutoff} :: Number, -- lowpass filter frequency
+ * - {@link resonance} :: Number, -- lowpass filter resonance
+ * - {@link hcutoff} :: Number, -- highpass filter frequency
+ * - {@link hresonance} :: Number, -- highpass filter resonance
+ * - {@link bandf} :: Number, -- bandpass filter frequency
+ * - {@link bandq} :: Number, -- bandpass filter resonance
+ * - {@link vowel} :: String, -- name of vowel ('a' | 'e' | 'i' | 'o' | 'u')
+ * - delay :: Number, -- delay wet/dry mix
+ * - delaytime :: Number, -- delay time in seconds
+ * - delayfeedback :: Number, -- delay feedback
+ * - {@link loop} :: Number, -- loop sample n times (relative to sample length)
+ * - {@link crush} :: Number, -- bitcrusher (currently not working)
+ * - {@link coarse} :: Number, -- coarse effect (currently not working)
+ * - {@link shape} :: Number, -- (currently not working)
+
+ *
+ *
+ *
+ * @name webdirt
+ * @memberof Pattern
+ * @returns Pattern
+ * @example
+ * s("bd*2 hh sd hh").n("<0 1>").webdirt()
+ */
+Pattern.prototype.webdirt = function () {
+ // create a WebDirt object and initialize Web Audio context
+ return this._withHap((hap) => {
+ const onTrigger = async (time, e, currentTime) => {
+ if (!webDirt) {
+ throw new Error('WebDirt not initialized!');
+ }
+ const deadline = time - currentTime;
+ const { s, n = 0, ...rest } = e.value || {};
+ if (!s) {
+ console.warn('Pattern.webdirt: no "s" was set!');
+ }
+ const samples = getLoadedSamples();
+ if (!samples?.[s]) {
+ // try default samples
+ webDirt.playSample({ s, n, ...rest }, deadline);
+ return;
+ }
+ if (!samples?.[s]) {
+ console.warn(`Pattern.webdirt: sample "${s}" not found in loaded samples`, samples);
+ } else {
+ const bank = samples[s];
+ const sampleUrl = bank[n % bank.length];
+ const buffer = getLoadedBuffer(sampleUrl);
+ if (!buffer) {
+ console.log(`Pattern.webdirt: load ${s}:${n} from ${sampleUrl}`);
+ loadBuffer(sampleUrl, webDirt.ac);
+ } else {
+ const msg = { buffer: { buffer }, ...rest };
+ webDirt.playSample(msg, deadline);
+ }
+ }
+ };
+ return hap.setContext({ ...hap.context, onTrigger });
+ });
+};
diff --git a/repl/public/EmuSP12.json b/repl/public/EmuSP12.json
new file mode 100644
index 00000000..69746bed
--- /dev/null
+++ b/repl/public/EmuSP12.json
@@ -0,0 +1,16 @@
+{
+"bd": ["bd/Bassdrum-01.wav","bd/Bassdrum-02.wav","bd/Bassdrum-03.wav","bd/Bassdrum-04.wav","bd/Bassdrum-05.wav","bd/Bassdrum-06.wav","bd/Bassdrum-07.wav","bd/Bassdrum-08.wav","bd/Bassdrum-09.wav","bd/Bassdrum-10.wav","bd/Bassdrum-11.wav","bd/Bassdrum-12.wav","bd/Bassdrum-13.wav","bd/Bassdrum-14.wav"],
+"cb": ["cb/Cowbell.wav"],
+"cp": ["cp/Clap.wav"],
+"cr": ["cr/Crash.wav"],
+"hh": ["hh/Hat Closed-01.wav","hh/Hat Closed-02.wav"],
+"ht": ["ht/Tom H-01.wav","ht/Tom H-02.wav","ht/Tom H-03.wav","ht/Tom H-04.wav","ht/Tom H-05.wav","ht/Tom H-06.wav"],
+"lt": ["lt/Tom L-01.wav","lt/Tom L-02.wav","lt/Tom L-03.wav","lt/Tom L-04.wav","lt/Tom L-05.wav","lt/Tom L-06.wav"],
+"misc": ["misc/Metal-01.wav","misc/Metal-02.wav","misc/Metal-03.wav","misc/Scratch.wav","misc/Shot-01.wav","misc/Shot-02.wav","misc/Shot-03.wav"],
+"mt": ["mt/Tom M-01.wav","mt/Tom M-02.wav","mt/Tom M-03.wav","mt/Tom M-05.wav"],
+"oh": ["oh/Hhopen1.wav"],
+"perc": ["perc/Blow1.wav"],
+"rd": ["rd/Ride.wav"],
+"rim": ["rim/zRim Shot-01.wav","rim/zRim Shot-02.wav"],
+"sd": ["sd/Snaredrum-01.wav","sd/Snaredrum-02.wav","sd/Snaredrum-03.wav","sd/Snaredrum-04.wav","sd/Snaredrum-05.wav","sd/Snaredrum-06.wav","sd/Snaredrum-07.wav","sd/Snaredrum-08.wav","sd/Snaredrum-09.wav","sd/Snaredrum-10.wav","sd/Snaredrum-11.wav","sd/Snaredrum-12.wav","sd/Snaredrum-13.wav","sd/Snaredrum-14.wav","sd/Snaredrum-15.wav","sd/Snaredrum-16.wav","sd/Snaredrum-17.wav","sd/Snaredrum-18.wav","sd/Snaredrum-19.wav","sd/Snaredrum-20.wav","sd/Snaredrum-21.wav"]
+}
diff --git a/repl/public/EmuSP12/bd/Bassdrum-01.wav b/repl/public/EmuSP12/bd/Bassdrum-01.wav
new file mode 100644
index 00000000..48e93676
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-01.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-02.wav b/repl/public/EmuSP12/bd/Bassdrum-02.wav
new file mode 100644
index 00000000..52cd0afc
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-02.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-03.wav b/repl/public/EmuSP12/bd/Bassdrum-03.wav
new file mode 100644
index 00000000..5c524ad7
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-03.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-04.wav b/repl/public/EmuSP12/bd/Bassdrum-04.wav
new file mode 100644
index 00000000..9f9365d4
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-04.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-05.wav b/repl/public/EmuSP12/bd/Bassdrum-05.wav
new file mode 100644
index 00000000..a4c80945
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-05.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-06.wav b/repl/public/EmuSP12/bd/Bassdrum-06.wav
new file mode 100644
index 00000000..283d2f76
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-06.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-07.wav b/repl/public/EmuSP12/bd/Bassdrum-07.wav
new file mode 100644
index 00000000..24f26186
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-07.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-08.wav b/repl/public/EmuSP12/bd/Bassdrum-08.wav
new file mode 100644
index 00000000..51661252
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-08.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-09.wav b/repl/public/EmuSP12/bd/Bassdrum-09.wav
new file mode 100644
index 00000000..3c6487c3
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-09.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-10.wav b/repl/public/EmuSP12/bd/Bassdrum-10.wav
new file mode 100644
index 00000000..34a9b924
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-10.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-11.wav b/repl/public/EmuSP12/bd/Bassdrum-11.wav
new file mode 100644
index 00000000..256555c2
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-11.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-12.wav b/repl/public/EmuSP12/bd/Bassdrum-12.wav
new file mode 100644
index 00000000..8c29f046
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-12.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-13.wav b/repl/public/EmuSP12/bd/Bassdrum-13.wav
new file mode 100644
index 00000000..a0291102
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-13.wav differ
diff --git a/repl/public/EmuSP12/bd/Bassdrum-14.wav b/repl/public/EmuSP12/bd/Bassdrum-14.wav
new file mode 100644
index 00000000..eecea2f1
Binary files /dev/null and b/repl/public/EmuSP12/bd/Bassdrum-14.wav differ
diff --git a/repl/public/EmuSP12/cb/Cowbell.wav b/repl/public/EmuSP12/cb/Cowbell.wav
new file mode 100644
index 00000000..470763c6
Binary files /dev/null and b/repl/public/EmuSP12/cb/Cowbell.wav differ
diff --git a/repl/public/EmuSP12/cp/Clap.wav b/repl/public/EmuSP12/cp/Clap.wav
new file mode 100644
index 00000000..27517d79
Binary files /dev/null and b/repl/public/EmuSP12/cp/Clap.wav differ
diff --git a/repl/public/EmuSP12/cr/Crash.wav b/repl/public/EmuSP12/cr/Crash.wav
new file mode 100644
index 00000000..6d1e2939
Binary files /dev/null and b/repl/public/EmuSP12/cr/Crash.wav differ
diff --git a/repl/public/EmuSP12/hh/Hat Closed-01.wav b/repl/public/EmuSP12/hh/Hat Closed-01.wav
new file mode 100644
index 00000000..1f18ccac
Binary files /dev/null and b/repl/public/EmuSP12/hh/Hat Closed-01.wav differ
diff --git a/repl/public/EmuSP12/hh/Hat Closed-02.wav b/repl/public/EmuSP12/hh/Hat Closed-02.wav
new file mode 100644
index 00000000..cc40c03f
Binary files /dev/null and b/repl/public/EmuSP12/hh/Hat Closed-02.wav differ
diff --git a/repl/public/EmuSP12/ht/Tom H-01.wav b/repl/public/EmuSP12/ht/Tom H-01.wav
new file mode 100644
index 00000000..82706785
Binary files /dev/null and b/repl/public/EmuSP12/ht/Tom H-01.wav differ
diff --git a/repl/public/EmuSP12/ht/Tom H-02.wav b/repl/public/EmuSP12/ht/Tom H-02.wav
new file mode 100644
index 00000000..9cfe221c
Binary files /dev/null and b/repl/public/EmuSP12/ht/Tom H-02.wav differ
diff --git a/repl/public/EmuSP12/ht/Tom H-03.wav b/repl/public/EmuSP12/ht/Tom H-03.wav
new file mode 100644
index 00000000..a6eef5cd
Binary files /dev/null and b/repl/public/EmuSP12/ht/Tom H-03.wav differ
diff --git a/repl/public/EmuSP12/ht/Tom H-04.wav b/repl/public/EmuSP12/ht/Tom H-04.wav
new file mode 100644
index 00000000..8c38b3b1
Binary files /dev/null and b/repl/public/EmuSP12/ht/Tom H-04.wav differ
diff --git a/repl/public/EmuSP12/ht/Tom H-05.wav b/repl/public/EmuSP12/ht/Tom H-05.wav
new file mode 100644
index 00000000..2e0899d2
Binary files /dev/null and b/repl/public/EmuSP12/ht/Tom H-05.wav differ
diff --git a/repl/public/EmuSP12/ht/Tom H-06.wav b/repl/public/EmuSP12/ht/Tom H-06.wav
new file mode 100644
index 00000000..9dccec23
Binary files /dev/null and b/repl/public/EmuSP12/ht/Tom H-06.wav differ
diff --git a/repl/public/EmuSP12/lt/Tom L-01.wav b/repl/public/EmuSP12/lt/Tom L-01.wav
new file mode 100644
index 00000000..cfa4067f
Binary files /dev/null and b/repl/public/EmuSP12/lt/Tom L-01.wav differ
diff --git a/repl/public/EmuSP12/lt/Tom L-02.wav b/repl/public/EmuSP12/lt/Tom L-02.wav
new file mode 100644
index 00000000..68624f5f
Binary files /dev/null and b/repl/public/EmuSP12/lt/Tom L-02.wav differ
diff --git a/repl/public/EmuSP12/lt/Tom L-03.wav b/repl/public/EmuSP12/lt/Tom L-03.wav
new file mode 100644
index 00000000..f1439d8c
Binary files /dev/null and b/repl/public/EmuSP12/lt/Tom L-03.wav differ
diff --git a/repl/public/EmuSP12/lt/Tom L-04.wav b/repl/public/EmuSP12/lt/Tom L-04.wav
new file mode 100644
index 00000000..46d614a0
Binary files /dev/null and b/repl/public/EmuSP12/lt/Tom L-04.wav differ
diff --git a/repl/public/EmuSP12/lt/Tom L-05.wav b/repl/public/EmuSP12/lt/Tom L-05.wav
new file mode 100644
index 00000000..c9566585
Binary files /dev/null and b/repl/public/EmuSP12/lt/Tom L-05.wav differ
diff --git a/repl/public/EmuSP12/lt/Tom L-06.wav b/repl/public/EmuSP12/lt/Tom L-06.wav
new file mode 100644
index 00000000..c1edf374
Binary files /dev/null and b/repl/public/EmuSP12/lt/Tom L-06.wav differ
diff --git a/repl/public/EmuSP12/misc/Metal-01.wav b/repl/public/EmuSP12/misc/Metal-01.wav
new file mode 100644
index 00000000..0f306e70
Binary files /dev/null and b/repl/public/EmuSP12/misc/Metal-01.wav differ
diff --git a/repl/public/EmuSP12/misc/Metal-02.wav b/repl/public/EmuSP12/misc/Metal-02.wav
new file mode 100644
index 00000000..8a05af0e
Binary files /dev/null and b/repl/public/EmuSP12/misc/Metal-02.wav differ
diff --git a/repl/public/EmuSP12/misc/Metal-03.wav b/repl/public/EmuSP12/misc/Metal-03.wav
new file mode 100644
index 00000000..0ae2ba80
Binary files /dev/null and b/repl/public/EmuSP12/misc/Metal-03.wav differ
diff --git a/repl/public/EmuSP12/misc/Scratch.wav b/repl/public/EmuSP12/misc/Scratch.wav
new file mode 100644
index 00000000..11bde1a5
Binary files /dev/null and b/repl/public/EmuSP12/misc/Scratch.wav differ
diff --git a/repl/public/EmuSP12/misc/Shot-01.wav b/repl/public/EmuSP12/misc/Shot-01.wav
new file mode 100644
index 00000000..e4ecfef3
Binary files /dev/null and b/repl/public/EmuSP12/misc/Shot-01.wav differ
diff --git a/repl/public/EmuSP12/misc/Shot-02.wav b/repl/public/EmuSP12/misc/Shot-02.wav
new file mode 100644
index 00000000..80f67cb2
Binary files /dev/null and b/repl/public/EmuSP12/misc/Shot-02.wav differ
diff --git a/repl/public/EmuSP12/misc/Shot-03.wav b/repl/public/EmuSP12/misc/Shot-03.wav
new file mode 100644
index 00000000..0cc84c28
Binary files /dev/null and b/repl/public/EmuSP12/misc/Shot-03.wav differ
diff --git a/repl/public/EmuSP12/mt/Tom M-01.wav b/repl/public/EmuSP12/mt/Tom M-01.wav
new file mode 100644
index 00000000..a650caf5
Binary files /dev/null and b/repl/public/EmuSP12/mt/Tom M-01.wav differ
diff --git a/repl/public/EmuSP12/mt/Tom M-02.wav b/repl/public/EmuSP12/mt/Tom M-02.wav
new file mode 100644
index 00000000..cbd7d16c
Binary files /dev/null and b/repl/public/EmuSP12/mt/Tom M-02.wav differ
diff --git a/repl/public/EmuSP12/mt/Tom M-03.wav b/repl/public/EmuSP12/mt/Tom M-03.wav
new file mode 100644
index 00000000..e5c4b133
Binary files /dev/null and b/repl/public/EmuSP12/mt/Tom M-03.wav differ
diff --git a/repl/public/EmuSP12/mt/Tom M-05.wav b/repl/public/EmuSP12/mt/Tom M-05.wav
new file mode 100644
index 00000000..841cac02
Binary files /dev/null and b/repl/public/EmuSP12/mt/Tom M-05.wav differ
diff --git a/repl/public/EmuSP12/oh/Hhopen1.wav b/repl/public/EmuSP12/oh/Hhopen1.wav
new file mode 100644
index 00000000..73811991
Binary files /dev/null and b/repl/public/EmuSP12/oh/Hhopen1.wav differ
diff --git a/repl/public/EmuSP12/perc/Blow1.wav b/repl/public/EmuSP12/perc/Blow1.wav
new file mode 100644
index 00000000..8021d0d1
Binary files /dev/null and b/repl/public/EmuSP12/perc/Blow1.wav differ
diff --git a/repl/public/EmuSP12/rd/Ride.wav b/repl/public/EmuSP12/rd/Ride.wav
new file mode 100644
index 00000000..da0e33eb
Binary files /dev/null and b/repl/public/EmuSP12/rd/Ride.wav differ
diff --git a/repl/public/EmuSP12/rim/zRim Shot-01.wav b/repl/public/EmuSP12/rim/zRim Shot-01.wav
new file mode 100644
index 00000000..98088cf2
Binary files /dev/null and b/repl/public/EmuSP12/rim/zRim Shot-01.wav differ
diff --git a/repl/public/EmuSP12/rim/zRim Shot-02.wav b/repl/public/EmuSP12/rim/zRim Shot-02.wav
new file mode 100644
index 00000000..c0f1a12d
Binary files /dev/null and b/repl/public/EmuSP12/rim/zRim Shot-02.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-01.wav b/repl/public/EmuSP12/sd/Snaredrum-01.wav
new file mode 100644
index 00000000..008bbf1d
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-01.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-02.wav b/repl/public/EmuSP12/sd/Snaredrum-02.wav
new file mode 100644
index 00000000..4711ff70
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-02.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-03.wav b/repl/public/EmuSP12/sd/Snaredrum-03.wav
new file mode 100644
index 00000000..643cf237
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-03.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-04.wav b/repl/public/EmuSP12/sd/Snaredrum-04.wav
new file mode 100644
index 00000000..bb8c4c34
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-04.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-05.wav b/repl/public/EmuSP12/sd/Snaredrum-05.wav
new file mode 100644
index 00000000..678db12e
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-05.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-06.wav b/repl/public/EmuSP12/sd/Snaredrum-06.wav
new file mode 100644
index 00000000..a89a1d60
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-06.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-07.wav b/repl/public/EmuSP12/sd/Snaredrum-07.wav
new file mode 100644
index 00000000..fdc1fb03
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-07.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-08.wav b/repl/public/EmuSP12/sd/Snaredrum-08.wav
new file mode 100644
index 00000000..324eafac
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-08.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-09.wav b/repl/public/EmuSP12/sd/Snaredrum-09.wav
new file mode 100644
index 00000000..35b617d7
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-09.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-10.wav b/repl/public/EmuSP12/sd/Snaredrum-10.wav
new file mode 100644
index 00000000..85d13e91
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-10.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-11.wav b/repl/public/EmuSP12/sd/Snaredrum-11.wav
new file mode 100644
index 00000000..d296fea5
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-11.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-12.wav b/repl/public/EmuSP12/sd/Snaredrum-12.wav
new file mode 100644
index 00000000..b4fc9ca4
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-12.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-13.wav b/repl/public/EmuSP12/sd/Snaredrum-13.wav
new file mode 100644
index 00000000..fbe745f9
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-13.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-14.wav b/repl/public/EmuSP12/sd/Snaredrum-14.wav
new file mode 100644
index 00000000..fd321482
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-14.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-15.wav b/repl/public/EmuSP12/sd/Snaredrum-15.wav
new file mode 100644
index 00000000..703a23cd
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-15.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-16.wav b/repl/public/EmuSP12/sd/Snaredrum-16.wav
new file mode 100644
index 00000000..ef6c1f9c
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-16.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-17.wav b/repl/public/EmuSP12/sd/Snaredrum-17.wav
new file mode 100644
index 00000000..df7e282e
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-17.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-18.wav b/repl/public/EmuSP12/sd/Snaredrum-18.wav
new file mode 100644
index 00000000..0950c300
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-18.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-19.wav b/repl/public/EmuSP12/sd/Snaredrum-19.wav
new file mode 100644
index 00000000..46b8e0d8
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-19.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-20.wav b/repl/public/EmuSP12/sd/Snaredrum-20.wav
new file mode 100644
index 00000000..4c211a7c
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-20.wav differ
diff --git a/repl/public/EmuSP12/sd/Snaredrum-21.wav b/repl/public/EmuSP12/sd/Snaredrum-21.wav
new file mode 100644
index 00000000..246ea401
Binary files /dev/null and b/repl/public/EmuSP12/sd/Snaredrum-21.wav differ
diff --git a/repl/src/App.jsx b/repl/src/App.jsx
index 3480a27d..df8cc780 100644
--- a/repl/src/App.jsx
+++ b/repl/src/App.jsx
@@ -12,9 +12,13 @@ import React, { useCallback, useLayoutEffect, useRef, useState } from 'react';
import './App.css';
import logo from './logo.svg';
import * as tunes from './tunes.mjs';
+import * as WebDirt from 'WebDirt';
+import { loadWebDirt, resetLoadedSamples } from '@strudel.cycles/webdirt';
+
evalScope(
Tone,
controls,
+ { WebDirt },
import('@strudel.cycles/core'),
import('@strudel.cycles/tone'),
import('@strudel.cycles/tonal'),
@@ -23,8 +27,15 @@ evalScope(
import('@strudel.cycles/xen'),
import('@strudel.cycles/webaudio'),
import('@strudel.cycles/osc'),
+ import('@strudel.cycles/webdirt'),
+ import('@strudel.cycles/serial'),
);
+loadWebDirt({
+ sampleMapUrl: 'EmuSP12.json',
+ sampleFolder: 'EmuSP12',
+});
+
const initialUrl = window.location.href;
const codeParam = window.location.href.split('#')[1];
let decoded;
@@ -79,16 +90,16 @@ function App() {
const handleKeyPress = async (e) => {
if (e.ctrlKey || e.altKey) {
if (e.code === 'Enter') {
- await activateCode();
e.preventDefault();
+ await activateCode();
} else if (e.code === 'Period') {
cycle.stop();
e.preventDefault();
}
}
};
- window.addEventListener('keydown', handleKeyPress);
- return () => window.removeEventListener('keydown', handleKeyPress);
+ window.addEventListener('keydown', handleKeyPress, true);
+ return () => window.removeEventListener('keydown', handleKeyPress, true);
}, [pattern, code, activateCode, cycle]);
useHighlighting({ view, pattern, active: cycle.started && !activeCode?.includes('strudel disable-highlighting') });
@@ -163,6 +174,7 @@ function App() {
setCode(_code);
cleanupDraw();
cleanupUi();
+ resetLoadedSamples();
const parsed = await evaluate(_code);
setPattern(parsed.pattern);
setActiveCode(_code);
diff --git a/tutorial/MiniRepl.jsx b/tutorial/MiniRepl.jsx
index a01a2f8b..af21f362 100644
--- a/tutorial/MiniRepl.jsx
+++ b/tutorial/MiniRepl.jsx
@@ -2,6 +2,8 @@ import { Tone } from '@strudel.cycles/tone';
import { evalScope } from '@strudel.cycles/eval';
import { MiniRepl as _MiniRepl } from '@strudel.cycles/react';
import controls from '@strudel.cycles/core/controls.mjs';
+import * as WebDirt from 'WebDirt';
+import { loadWebDirt } from '@strudel.cycles/webdirt';
export const defaultSynth = new Tone.PolySynth().chain(new Tone.Gain(0.5), Tone.Destination).set({
oscillator: { type: 'triangle' },
@@ -21,8 +23,14 @@ evalScope(
import('@strudel.cycles/xen'),
import('@strudel.cycles/webaudio'),
import('@strudel.cycles/osc'),
+ import('@strudel.cycles/webdirt'),
);
+loadWebDirt({
+ sampleMapUrl: '../EmuSP12.json',
+ sampleFolder: '../EmuSP12',
+});
+
export function MiniRepl({ tune }) {
return <_MiniRepl tune={tune} defaultSynth={defaultSynth} hideOutsideView={true} />;
}
diff --git a/tutorial/render.js b/tutorial/render.js
index 38b24020..58c6c51a 100644
--- a/tutorial/render.js
+++ b/tutorial/render.js
@@ -1,8 +1,10 @@
import nunjucks from 'nunjucks';
-import jsdoc from '../doc.json' assert { type: 'json' };
-
-// TODO: load tutorial.mdx and append rendered api.mdx to the bottom (to make sure TOC works)
-// TODO: split
+import { readFile } from 'node:fs/promises';
+import { fileURLToPath } from 'url';
+import { dirname } from 'path';
+const __dirname = dirname(fileURLToPath(import.meta.url));
+const jsdoc = JSON.parse(await readFile(`${__dirname}/../doc.json`, 'utf8'));
+// import jsdoc from '../doc.json' assert { type: 'json' }; // node 18
const env = nunjucks.configure('.', { autoescape: false });
diff --git a/tutorial/tutorial.mdx b/tutorial/tutorial.mdx
index 077d6f6d..d39c6259 100644
--- a/tutorial/tutorial.mdx
+++ b/tutorial/tutorial.mdx
@@ -758,6 +758,12 @@ They can provide streams of numbers that can be sampled at discrete points in ti
{{ 'square2' | jsdoc }}
+## Using Samples with Webdirt
+
+You can use the powerful sampling engine [Webdirt](https://github.com/dktr0/WebDirt) with Strudel.
+
+{{ 'Pattern.webdirt' | jsdoc }}
+
## Using Superdirt via OSC
In mainline tidal, the actual sound is generated via Superdirt, which runs inside Supercollider.