From 4121fc926ea3e4aa4f66ed337fa2ad10eaa7d00c Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 28 Jan 2023 17:59:59 +0100 Subject: [PATCH 01/24] write more about packages / monorepo setup --- website/src/config.ts | 1 + .../src/pages/technical-manual/packages.mdx | 73 ++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/website/src/config.ts b/website/src/config.ts index db724a5b5..f7f462685 100644 --- a/website/src/config.ts +++ b/website/src/config.ts @@ -76,6 +76,7 @@ export const SIDEBAR: Sidebar = { { text: 'REPL', link: 'technical-manual/repl' }, { text: 'Docs', link: 'technical-manual/docs' }, { text: 'Testing', link: 'technical-manual/testing' }, + { text: 'Packages', link: 'technical-manual/packages' }, // { text: 'Internals', link: 'technical-manual/internals' }, ], }, diff --git a/website/src/pages/technical-manual/packages.mdx b/website/src/pages/technical-manual/packages.mdx index b4beeda64..4f198af81 100644 --- a/website/src/pages/technical-manual/packages.mdx +++ b/website/src/pages/technical-manual/packages.mdx @@ -1,10 +1,79 @@ +--- +title: Strudel Packages +layout: ../../layouts/MainLayout.astro +--- + +import { MiniRepl } from '../../docs/MiniRepl'; + ## Strudel Packages +The [strudel repo](github.com/tidalcycles/strudel) is organized into packages, using [npm workspaces](https://docs.npmjs.com/cli/v7/using-npm/workspaces). +Publishing packages is done with [lerna](https://lerna.js.org/). + There are different packages for different purposes. They.. - split up the code into smaller chunks - can be selectively used to implement some sort of time based system -Please refer to the individual README files in the [packages folder](https://github.com/tidalcycles/strudel/tree/main/packages) +[See the latest published packages on npm](https://www.npmjs.com/search?q=%40strudel.cycles). -TODO +### Important bits + +- The [root package.json](https://github.com/tidalcycles/strudel/blob/main/package.json) specifies `packages/*` as `workspaces` +- Each folder in `packages` comes with its own `package.json`, defining a package name of the format `@strudel.cycles/` +- Running `npm i` from the root folder will symlink all packages to the `node_modules` folder, e.g. `node_modules/@strudel.cycles/core` symlinks `packages/core` +- These symlinks allow importing the packages with their package name, instead of a relative path, e.g. `import { seq } from '@strudel.cycles/core'`, instead of `import { seq } from '../core/`. + This works because the [bare module import](https://vitejs.dev/guide/features.html#npm-dependency-resolving-and-pre-bundling) `@strudel.cycles/core` is resolved to `node_modules/@strudel.cycles/core`. + In a project that installs the published packages from npm, these imports will still work, whereas relative ones might not. +- When a strudel package is importing from another strudel package, the package that is imported from should be listed in the `dependencies` field of the `package.json`. + For example, [@strudel.cycles/mini lists `@strudel.cycles/core` as a dependency](https://github.com/tidalcycles/strudel/blob/main/packages/mini/package.json). +- In development, files in any package can be changed and saved to instantly update the dev server via [hot module replacement](https://vitejs.dev/guide/features.html#hot-module-replacement) +- To publish packages, `npx lerna publish` will check which packages were changed since the last publish and publish only those. + The version numbers in the dependencies of each packages will be updated automatically to the latest version. + +### Building & Publishing + +Currently, all packages are only published as ESM with vite flavour. +To build standardized ESM and CJS files, a `vite.config.js` like that is needed: + +```js +import { defineConfig } from 'vite'; +import { dependencies } from './package.json'; +import { resolve } from 'path'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [], + build: { + lib: { + entry: resolve(__dirname, 'index.mjs'), + formats: ['es', 'cjs'], + fileName: (ext) => ({ es: 'index.mjs', cjs: 'index.js' }[ext]), + }, + rollupOptions: { + external: [...Object.keys(dependencies)], + }, + target: 'esnext', + }, +}); +``` + +This will build `index.mjs` (ESM) and `index.js` (CJS) to the dist folder. + +### What's the main file? + +Currently, each package uses the unbundled `index.mjs` as its main file, which must change for the published version. +There are 2 ways to handle this: + +1. `main` = `dist/index.js`, `module` = `dist/index.mjs`. The built files are used. This means that changing a source file won't take effect in the dev server without a rebuild. +2. Use different `package.json` files for dev vs publish. So the unbuilt `index.mjs` could be used in dev, while the built files can be used when publishing. + +Option 1 could be done with [workspace watching](https://lerna.js.org/docs/features/workspace-watching), although it might make the dev server less snappy.. +Option 2 can be done by [publishing just the dist folder and copying over the `package.json` file](https://stackoverflow.com/questions/37862712/how-to-publish-contents-only-of-a-specific-folder). +Sadly, [this does not fit into how lerna works](https://github.com/lerna/lerna/issues/91). + +https://github.com/changesets/changesets + +https://turbo.build/repo/docs/handbook/publishing-packages/versioning-and-publishing + +https://pnpm.io/workspaces \ No newline at end of file From 9d8c812aa386cead916d782f173cb09c7e394830 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 2 Feb 2023 19:51:16 +0100 Subject: [PATCH 02/24] pin @csound/browser to 6.18.3 + bump --- packages/csound/package.json | 4 ++-- pnpm-lock.yaml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/csound/package.json b/packages/csound/package.json index e2bab1423..08838448e 100644 --- a/packages/csound/package.json +++ b/packages/csound/package.json @@ -1,6 +1,6 @@ { "name": "@strudel.cycles/csound", - "version": "0.6.0", + "version": "0.6.1", "description": "csound bindings for strudel", "main": "index.mjs", "publishConfig": { @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/tidalcycles/strudel#readme", "dependencies": { - "@csound/browser": "^6.18.3", + "@csound/browser": "6.18.3", "@strudel.cycles/core": "workspace:*", "@strudel.cycles/webaudio": "workspace:*" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8c04cef8..e1e8404a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,12 +79,12 @@ importers: packages/csound: specifiers: - '@csound/browser': ^6.18.3 + '@csound/browser': 6.18.3 '@strudel.cycles/core': workspace:* '@strudel.cycles/webaudio': workspace:* vite: ^3.2.2 dependencies: - '@csound/browser': 6.18.5 + '@csound/browser': 6.18.3 '@strudel.cycles/core': link:../core '@strudel.cycles/webaudio': link:../webaudio devDependencies: @@ -1066,8 +1066,8 @@ packages: w3c-keyname: 2.2.6 dev: false - /@csound/browser/6.18.5: - resolution: {integrity: sha512-PrffNroCFgns9ct6O0e1anyxZWdDPcPA8y4Ei9t96DgkRba/wvxJayXfLJvEdlTQy+LVw1es92TDODtEYHJeKw==} + /@csound/browser/6.18.3: + resolution: {integrity: sha512-udvedLjNZjEvrCFxMItirRh/gKFbY/dED4SKbUoinhImJzVTRtykiCZv9CHMCmD6ixWPo4BByVkV2NuYNsBQ+g==} dependencies: comlink: 4.3.1 eslint-plugin-n: 15.6.1 From f7b3b582cc1e7ff0166ddd43359a66f992b298d5 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 2 Feb 2023 21:31:44 +0100 Subject: [PATCH 03/24] update csound + fix sound output see https://github.com/csound/csound/issues/1690#issuecomment-1414301145 --- packages/csound/index.mjs | 1 + packages/csound/package.json | 4 ++-- pnpm-lock.yaml | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/csound/index.mjs b/packages/csound/index.mjs index b9e263919..3aabc22b8 100644 --- a/packages/csound/index.mjs +++ b/packages/csound/index.mjs @@ -92,6 +92,7 @@ async function load() { ['message'].forEach((k) => _csound.on(k, (...args) => eventLogger(k, args))); await _csound.setOption('-m0d'); // see -m flag https://csound.com/docs/manual/CommandFlags.html await _csound.setOption('--sample-accurate'); + await _csound.setOption('-odac'); await _csound.compileCsdText(csd); // await _csound.compileOrc(livecodeOrc); await _csound.compileOrc(presetsOrc); diff --git a/packages/csound/package.json b/packages/csound/package.json index 08838448e..14700d28a 100644 --- a/packages/csound/package.json +++ b/packages/csound/package.json @@ -1,6 +1,6 @@ { "name": "@strudel.cycles/csound", - "version": "0.6.1", + "version": "0.6.2", "description": "csound bindings for strudel", "main": "index.mjs", "publishConfig": { @@ -32,7 +32,7 @@ }, "homepage": "https://github.com/tidalcycles/strudel#readme", "dependencies": { - "@csound/browser": "6.18.3", + "@csound/browser": "6.18.5", "@strudel.cycles/core": "workspace:*", "@strudel.cycles/webaudio": "workspace:*" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1e8404a8..ce03f49cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,12 +79,12 @@ importers: packages/csound: specifiers: - '@csound/browser': 6.18.3 + '@csound/browser': 6.18.5 '@strudel.cycles/core': workspace:* '@strudel.cycles/webaudio': workspace:* vite: ^3.2.2 dependencies: - '@csound/browser': 6.18.3 + '@csound/browser': 6.18.5 '@strudel.cycles/core': link:../core '@strudel.cycles/webaudio': link:../webaudio devDependencies: @@ -1066,8 +1066,8 @@ packages: w3c-keyname: 2.2.6 dev: false - /@csound/browser/6.18.3: - resolution: {integrity: sha512-udvedLjNZjEvrCFxMItirRh/gKFbY/dED4SKbUoinhImJzVTRtykiCZv9CHMCmD6ixWPo4BByVkV2NuYNsBQ+g==} + /@csound/browser/6.18.5: + resolution: {integrity: sha512-PrffNroCFgns9ct6O0e1anyxZWdDPcPA8y4Ei9t96DgkRba/wvxJayXfLJvEdlTQy+LVw1es92TDODtEYHJeKw==} dependencies: comlink: 4.3.1 eslint-plugin-n: 15.6.1 From dcdb3839601ac094b3e39ea0901388ded1bea507 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 2 Feb 2023 21:43:24 +0100 Subject: [PATCH 04/24] fix: share url on subpath fixes https://github.com/tidalcycles/strudel/issues/389 --- website/src/repl/Repl.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx index 5c3623bdc..b26f2bbc6 100644 --- a/website/src/repl/Repl.jsx +++ b/website/src/repl/Repl.jsx @@ -222,10 +222,10 @@ export function Repl({ embedded = false }) { } // generate uuid in the browser const hash = nanoid(12); + const shareUrl = window.location.origin + window.location.pathname + '?' + hash; const { data, error } = await supabase.from('code').insert([{ code: codeToShare, hash }]); if (!error) { setLastShared(activeCode || code); - const shareUrl = window.location.origin + '?' + hash; // copy shareUrl to clipboard await navigator.clipboard.writeText(shareUrl); const message = `Link copied to clipboard: ${shareUrl}`; From a7d484b1a85f5b202c94e569291edc3be7e7db43 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 3 Feb 2023 19:53:01 +0100 Subject: [PATCH 05/24] add shabda doc --- website/src/pages/learn/samples.mdx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/website/src/pages/learn/samples.mdx b/website/src/pages/learn/samples.mdx index 27deebc1d..510b43c5e 100644 --- a/website/src/pages/learn/samples.mdx +++ b/website/src/pages/learn/samples.mdx @@ -203,6 +203,21 @@ note("g2!2 !2, g4 f4]>") The sampler will always pick the closest matching sample for the current note! +# Shabda + +If you don't want to select samples by hand, there is also the wonderful tool called [shabda](https://shabda.ndre.gr/). +With it, you can enter any sample name(s) to query from [freesound.org](https://freesound.org/). Example: + + + # Sampler Effects Below are four different examples of sampler "effects" which are functions that can be used to change the behaviour of sample playback. From 1b99ac92ddebaa2e9facfec8b399cb359d33955c Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 14:34:59 +0100 Subject: [PATCH 06/24] categorize effects + add envelope doc + use short, more logical filter params as default --- packages/core/controls.mjs | 59 ++++++------- website/src/pages/learn/effects.mdx | 131 ++++++++++++++++++---------- 2 files changed, 114 insertions(+), 76 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index b3537db98..8166e0f96 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -83,8 +83,7 @@ const generic_params = [ */ ['f', 'amp', 'like @gain@, but linear.'], /** - * A pattern of numbers to specify the attack time of an envelope applied to each sample. - * [More info about envelopes](/learn/synths-samples-effects/#envelope) + * Amplitude envelope attack time: Specifies how long it takes for the sound to reach its peak value, relative to the onset. * * @name attack * @param {number | Pattern} attack time in seconds. @@ -92,11 +91,7 @@ const generic_params = [ * note("c3 e3").attack("<0 .1 .5>") * */ - [ - 'f', - 'attack', - 'a pattern of numbers to specify the attack time (in seconds) of an envelope applied to each sample.', - ], + ['f', 'attack'], /** * Select the sound bank to use. To be used together with `s`. The bank name (+ "_") will be prepended to the value of `s`. @@ -110,8 +105,8 @@ const generic_params = [ ['f', 'bank', 'selects sound bank to use'], /** - * Gain envelope decay time = the time it takes after the attack time to reach the sustain level. - * [More info about envelopes](/learn/synths-samples-effects/#envelope) + * Amplitude envelope decay time: the time it takes after the attack time to reach the sustain level. + * Note that the decay is only audible if the sustain value is lower than 1. * * @name decay * @param {number | Pattern} time decay time in seconds @@ -121,7 +116,7 @@ const generic_params = [ */ ['f', 'decay', ''], /** - * Gain envelope sustain level. [More info about envelopes](/learn/synths-samples-effects/#envelope) + * Amplitude envelope sustain level: The level which is reached after attack / decay, being sustained until the offset. * * @name sustain * @param {number | Pattern} gain sustain level between 0 and 1 @@ -131,7 +126,7 @@ const generic_params = [ */ ['f', 'sustain', ''], /** - * Gain envelope release time. [More info about envelopes](/learn/synths-samples-effects/#envelope) + * Amplitude envelope release time: The time it takes after the offset to go from sustain level to zero. * * @name release * @param {number | Pattern} time release time in seconds @@ -151,30 +146,30 @@ const generic_params = [ ], // TODO: in tidal, it seems to be normalized /** - * Sets the center frequency of the band-pass filter. + * Sets the center frequency of the **b**and-**p**ass **f**ilter. * - * @name bandf + * @name bpf * @param {number | Pattern} frequency center frequency - * @synonyms bpf + * @synonyms bandf * @example - * s("bd sd,hh*3").bandf("<1000 2000 4000 8000>") + * s("bd sd,hh*3").bpf("<1000 2000 4000 8000>") * */ - ['f', 'bandf', 'A pattern of numbers from 0 to 1. Sets the center frequency of the band-pass filter.'], ['f', 'bpf', ''], + ['f', 'bandf', 'A pattern of numbers from 0 to 1. Sets the center frequency of the band-pass filter.'], // TODO: in tidal, it seems to be normalized /** - * Sets the q-factor of the band-pass filter + * Sets the **b**and-**p**ass **q**-factor (resonance) * - * @name bandq + * @name bpq * @param {number | Pattern} q q factor - * @synonyms bpq + * @synonyms bandq * @example - * s("bd sd").bandf(500).bandq("<0 1 2 3>") + * s("bd sd").bpf(500).bpq("<0 1 2 3>") * */ - ['f', 'bandq', 'a pattern of anumbers from 0 to 1. Sets the q-factor of the band-pass filter.'], ['f', 'bpq', ''], + ['f', 'bandq', 'a pattern of anumbers from 0 to 1. Sets the q-factor of the band-pass filter.'], /** * a pattern of numbers from 0 to 1. Skips the beginning of each sample, e.g. `0.25` to cut off the first quarter from each sample. * @@ -284,46 +279,46 @@ const generic_params = [ /** * Applies the cutoff frequency of the low-pass filter. * - * @name cutoff + * @name lpf * @param {number | Pattern} frequency audible between 0 and 20000 - * @synonyms lpf + * @synonyms cutoff * @example * s("bd sd,hh*3").cutoff("<4000 2000 1000 500 200 100>") * */ - ['f', 'cutoff', 'a pattern of numbers from 0 to 1. Applies the cutoff frequency of the low-pass filter.'], ['f', 'lpf'], + ['f', 'cutoff', 'a pattern of numbers from 0 to 1. Applies the cutoff frequency of the low-pass filter.'], /** * Applies the cutoff frequency of the high-pass filter. * - * @name hcutoff + * @name hpf * @param {number | Pattern} frequency audible between 0 and 20000 - * @synonyms hpf + * @synonyms hcutoff * @example * s("bd sd,hh*4").hcutoff("<4000 2000 1000 500 200 100>") * */ - ['f', 'hcutoff', ''], ['f', 'hpf', ''], + ['f', 'hcutoff', ''], /** * Applies the resonance of the high-pass filter. * - * @name hresonance + * @name hpq * @param {number | Pattern} q resonance factor between 0 and 50 - * @synonyms hpq + * @synonyms hresonance * @example * s("bd sd,hh*4").hcutoff(2000).hresonance("<0 10 20 30>") * */ - ['f', 'hpq', ''], ['f', 'hresonance', ''], + ['f', 'hpq', ''], // TODO: add hpq synonym /** * Applies the cutoff frequency of the low-pass filter. * - * @name resonance + * @name lpq * @param {number | Pattern} q resonance factor between 0 and 50 - * @synonyms lpq + * @synonyms resonance * @example * s("bd sd,hh*4").cutoff(2000).resonance("<0 10 20 30>") * diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index 6ef4e7d3c..82b1ab1cc 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -12,13 +12,96 @@ import { JsDoc } from '../../docs/JsDoc'; Wether you're using a synth or a sample, you can apply any of the following built-in audio effects. As you might suspect, the effects can be chained together, and they accept a pattern string as their argument. -## bandf +# Filters - +Filters are an essential building block of [subtractive synthesis](https://en.wikipedia.org/wiki/Subtractive_synthesis). +Strudel comes with 3 types of filters: -## bandq +- low-pass filter: low frequencies may _pass_, high frequencies are cut off +- high-pass filter: high frequencies may _pass_, low frequencies are cut off +- band-pass filters: only a frequency band may _pass_, low and high frequencies around are cut off - +Each filter has 2 parameters: + +- cutoff: the frequency at which the filter starts to work. e.g. a low-pass filter with a cutoff of 1000Hz allows frequencies below 1000Hz to pass. +- q-value: Controls the resonance of the filter. Higher values sound more aggressive. Also see [Q-Factor](https://en.wikipedia.org/wiki/Q_factor) + +## lpf + + + +## lpq + + + +## hpf + + + +## hpq + + + +## bpf + + + +## bpq + + + +## vowel + + + +# Amplitude Envelope + +The amplitude [envelope]() controls the dynamic contour of a sound. +Strudel uses ADSR envelopes, which are probably the most common way to describe an envelope: + +![ADSR](https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/ADSR_parameter.svg/1920px-ADSR_parameter.svg.png) + +## attack + + + +## decay + + + +## sustain + + + +## release + + + +# Dynamics + +## gain + + + +## velocity + + + +# Panning + +## jux + + + +## juxBy + + + +## pan + + + +# Waveshaping ## coarse @@ -28,50 +111,10 @@ As you might suspect, the effects can be chained together, and they accept a pat -## cutoff - - - -## gain - - - -## hcutoff - - - -## hresonance - - - -## pan - - - -## resonance - - - ## shape -## velocity - - - -## vowel - - - -## jux - - - -## juxBy - - - # Global Effects ## Local vs Global Effects From 554e0d7a393944d3d35c6f0940a32a7f8cb13f03 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 14:38:47 +0100 Subject: [PATCH 07/24] remove envelope section from synths page --- website/src/pages/learn/synths.mdx | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/website/src/pages/learn/synths.mdx b/website/src/pages/learn/synths.mdx index f11388deb..69c453943 100644 --- a/website/src/pages/learn/synths.mdx +++ b/website/src/pages/learn/synths.mdx @@ -28,15 +28,3 @@ The power of patterns allows us to sequence any _param_ independently: Now we not only pattern the notes, but the sound as well! `sawtooth` `square` and `triangle` are the basic waveforms available in `s`. - -## Ampltude Envelope - -You can control the envelope of a synth using the `attack`, `decay`, `sustain` and `release` functions: - ->").s('sawtooth') - .attack(.1).decay(.1).sustain(.2).release(.1)`} -/> - -
From 74326f226df1f80808b36bc8dd65cb315edce0dc Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 14:42:08 +0100 Subject: [PATCH 08/24] format --- website/src/pages/technical-manual/packages.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/pages/technical-manual/packages.mdx b/website/src/pages/technical-manual/packages.mdx index 4f198af81..974b9f43a 100644 --- a/website/src/pages/technical-manual/packages.mdx +++ b/website/src/pages/technical-manual/packages.mdx @@ -76,4 +76,4 @@ https://github.com/changesets/changesets https://turbo.build/repo/docs/handbook/publishing-packages/versioning-and-publishing -https://pnpm.io/workspaces \ No newline at end of file +https://pnpm.io/workspaces From 0ec65c85d34fde68719839874f7121981959382b Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 14:52:01 +0100 Subject: [PATCH 09/24] fix examples + snapshots --- packages/core/controls.mjs | 17 +- test/__snapshots__/examples.test.mjs.snap | 284 +++++++++++----------- 2 files changed, 150 insertions(+), 151 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 8166e0f96..901a2ba33 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -277,50 +277,49 @@ const generic_params = [ '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.', ], /** - * Applies the cutoff frequency of the low-pass filter. + * Applies the cutoff frequency of the **l**ow-**p**ass **f**ilter. * * @name lpf * @param {number | Pattern} frequency audible between 0 and 20000 * @synonyms cutoff * @example - * s("bd sd,hh*3").cutoff("<4000 2000 1000 500 200 100>") + * s("bd sd,hh*3").lpf("<4000 2000 1000 500 200 100>") * */ ['f', 'lpf'], ['f', 'cutoff', 'a pattern of numbers from 0 to 1. Applies the cutoff frequency of the low-pass filter.'], /** - * Applies the cutoff frequency of the high-pass filter. + * Applies the cutoff frequency of the **h**igh-**p**ass **f**ilter. * * @name hpf * @param {number | Pattern} frequency audible between 0 and 20000 * @synonyms hcutoff * @example - * s("bd sd,hh*4").hcutoff("<4000 2000 1000 500 200 100>") + * s("bd sd,hh*4").hpf("<4000 2000 1000 500 200 100>") * */ ['f', 'hpf', ''], ['f', 'hcutoff', ''], /** - * Applies the resonance of the high-pass filter. + * Controls the **h**igh-**p**ass **q**-value. * * @name hpq * @param {number | Pattern} q resonance factor between 0 and 50 * @synonyms hresonance * @example - * s("bd sd,hh*4").hcutoff(2000).hresonance("<0 10 20 30>") + * s("bd sd,hh*4").hpf(2000).hpq("<0 10 20 30>") * */ ['f', 'hresonance', ''], ['f', 'hpq', ''], - // TODO: add hpq synonym /** - * Applies the cutoff frequency of the low-pass filter. + * Controls the **l**ow-**p**ass **q**-value. * * @name lpq * @param {number | Pattern} q resonance factor between 0 and 50 * @synonyms resonance * @example - * s("bd sd,hh*4").cutoff(2000).resonance("<0 10 20 30>") + * s("bd sd,hh*4").lpf(2000).lpq("<0 10 20 30>") * */ ['f', 'lpq'], diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 7320576ab..148f12cce 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -861,44 +861,6 @@ exports[`runs examples > example "attack" example index 0 1`] = ` ] `; -exports[`runs examples > example "bandf" example index 0 1`] = ` -[ - "[ 0/1 → 1/2 | s:bd bandf:1000 ]", - "[ 1/2 → 1/1 | s:sd bandf:1000 ]", - "[ 0/1 → 1/3 | s:hh bandf:1000 ]", - "[ 1/3 → 2/3 | s:hh bandf:1000 ]", - "[ 2/3 → 1/1 | s:hh bandf:1000 ]", - "[ 1/1 → 3/2 | s:bd bandf:2000 ]", - "[ 3/2 → 2/1 | s:sd bandf:2000 ]", - "[ 1/1 → 4/3 | s:hh bandf:2000 ]", - "[ 4/3 → 5/3 | s:hh bandf:2000 ]", - "[ 5/3 → 2/1 | s:hh bandf:2000 ]", - "[ 2/1 → 5/2 | s:bd bandf:4000 ]", - "[ 5/2 → 3/1 | s:sd bandf:4000 ]", - "[ 2/1 → 7/3 | s:hh bandf:4000 ]", - "[ 7/3 → 8/3 | s:hh bandf:4000 ]", - "[ 8/3 → 3/1 | s:hh bandf:4000 ]", - "[ 3/1 → 7/2 | s:bd bandf:8000 ]", - "[ 7/2 → 4/1 | s:sd bandf:8000 ]", - "[ 3/1 → 10/3 | s:hh bandf:8000 ]", - "[ 10/3 → 11/3 | s:hh bandf:8000 ]", - "[ 11/3 → 4/1 | s:hh bandf:8000 ]", -] -`; - -exports[`runs examples > example "bandq" example index 0 1`] = ` -[ - "[ 0/1 → 1/2 | s:bd bandf:500 bandq:0 ]", - "[ 1/2 → 1/1 | s:sd bandf:500 bandq:0 ]", - "[ 1/1 → 3/2 | s:bd bandf:500 bandq:1 ]", - "[ 3/2 → 2/1 | s:sd bandf:500 bandq:1 ]", - "[ 2/1 → 5/2 | s:bd bandf:500 bandq:2 ]", - "[ 5/2 → 3/1 | s:sd bandf:500 bandq:2 ]", - "[ 3/1 → 7/2 | s:bd bandf:500 bandq:3 ]", - "[ 7/2 → 4/1 | s:sd bandf:500 bandq:3 ]", -] -`; - exports[`runs examples > example "bank" example index 0 1`] = ` [ "[ 0/1 → 1/2 | s:bd bank:RolandTR909 ]", @@ -921,6 +883,44 @@ exports[`runs examples > example "begin" example index 0 1`] = ` ] `; +exports[`runs examples > example "bpf" example index 0 1`] = ` +[ + "[ 0/1 → 1/2 | s:bd bpf:1000 ]", + "[ 1/2 → 1/1 | s:sd bpf:1000 ]", + "[ 0/1 → 1/3 | s:hh bpf:1000 ]", + "[ 1/3 → 2/3 | s:hh bpf:1000 ]", + "[ 2/3 → 1/1 | s:hh bpf:1000 ]", + "[ 1/1 → 3/2 | s:bd bpf:2000 ]", + "[ 3/2 → 2/1 | s:sd bpf:2000 ]", + "[ 1/1 → 4/3 | s:hh bpf:2000 ]", + "[ 4/3 → 5/3 | s:hh bpf:2000 ]", + "[ 5/3 → 2/1 | s:hh bpf:2000 ]", + "[ 2/1 → 5/2 | s:bd bpf:4000 ]", + "[ 5/2 → 3/1 | s:sd bpf:4000 ]", + "[ 2/1 → 7/3 | s:hh bpf:4000 ]", + "[ 7/3 → 8/3 | s:hh bpf:4000 ]", + "[ 8/3 → 3/1 | s:hh bpf:4000 ]", + "[ 3/1 → 7/2 | s:bd bpf:8000 ]", + "[ 7/2 → 4/1 | s:sd bpf:8000 ]", + "[ 3/1 → 10/3 | s:hh bpf:8000 ]", + "[ 10/3 → 11/3 | s:hh bpf:8000 ]", + "[ 11/3 → 4/1 | s:hh bpf:8000 ]", +] +`; + +exports[`runs examples > example "bpq" example index 0 1`] = ` +[ + "[ 0/1 → 1/2 | s:bd bpf:500 bpq:0 ]", + "[ 1/2 → 1/1 | s:sd bpf:500 bpq:0 ]", + "[ 1/1 → 3/2 | s:bd bpf:500 bpq:1 ]", + "[ 3/2 → 2/1 | s:sd bpf:500 bpq:1 ]", + "[ 2/1 → 5/2 | s:bd bpf:500 bpq:2 ]", + "[ 5/2 → 3/1 | s:sd bpf:500 bpq:2 ]", + "[ 3/1 → 7/2 | s:bd bpf:500 bpq:3 ]", + "[ 7/2 → 4/1 | s:sd bpf:500 bpq:3 ]", +] +`; + exports[`runs examples > example "cat" example index 0 1`] = ` [ "[ 0/1 → 1/2 | s:hh ]", @@ -1254,31 +1254,6 @@ exports[`runs examples > example "cut" example index 0 1`] = ` ] `; -exports[`runs examples > example "cutoff" example index 0 1`] = ` -[ - "[ 0/1 → 1/2 | s:bd cutoff:4000 ]", - "[ 1/2 → 1/1 | s:sd cutoff:4000 ]", - "[ 0/1 → 1/3 | s:hh cutoff:4000 ]", - "[ 1/3 → 2/3 | s:hh cutoff:4000 ]", - "[ 2/3 → 1/1 | s:hh cutoff:4000 ]", - "[ 1/1 → 3/2 | s:bd cutoff:2000 ]", - "[ 3/2 → 2/1 | s:sd cutoff:2000 ]", - "[ 1/1 → 4/3 | s:hh cutoff:2000 ]", - "[ 4/3 → 5/3 | s:hh cutoff:2000 ]", - "[ 5/3 → 2/1 | s:hh cutoff:2000 ]", - "[ 2/1 → 5/2 | s:bd cutoff:1000 ]", - "[ 5/2 → 3/1 | s:sd cutoff:1000 ]", - "[ 2/1 → 7/3 | s:hh cutoff:1000 ]", - "[ 7/3 → 8/3 | s:hh cutoff:1000 ]", - "[ 8/3 → 3/1 | s:hh cutoff:1000 ]", - "[ 3/1 → 7/2 | s:bd cutoff:500 ]", - "[ 7/2 → 4/1 | s:sd cutoff:500 ]", - "[ 3/1 → 10/3 | s:hh cutoff:500 ]", - "[ 10/3 → 11/3 | s:hh cutoff:500 ]", - "[ 11/3 → 4/1 | s:hh cutoff:500 ]", -] -`; - exports[`runs examples > example "decay" example index 0 1`] = ` [ "[ 0/1 → 1/2 | note:c3 decay:0.1 sustain:0 ]", @@ -1898,61 +1873,61 @@ exports[`runs examples > example "gain" example index 0 1`] = ` ] `; -exports[`runs examples > example "hcutoff" example index 0 1`] = ` +exports[`runs examples > example "hpf" example index 0 1`] = ` [ - "[ 0/1 → 1/2 | s:bd hcutoff:4000 ]", - "[ 1/2 → 1/1 | s:sd hcutoff:4000 ]", - "[ 0/1 → 1/4 | s:hh hcutoff:4000 ]", - "[ 1/4 → 1/2 | s:hh hcutoff:4000 ]", - "[ 1/2 → 3/4 | s:hh hcutoff:4000 ]", - "[ 3/4 → 1/1 | s:hh hcutoff:4000 ]", - "[ 1/1 → 3/2 | s:bd hcutoff:2000 ]", - "[ 3/2 → 2/1 | s:sd hcutoff:2000 ]", - "[ 1/1 → 5/4 | s:hh hcutoff:2000 ]", - "[ 5/4 → 3/2 | s:hh hcutoff:2000 ]", - "[ 3/2 → 7/4 | s:hh hcutoff:2000 ]", - "[ 7/4 → 2/1 | s:hh hcutoff:2000 ]", - "[ 2/1 → 5/2 | s:bd hcutoff:1000 ]", - "[ 5/2 → 3/1 | s:sd hcutoff:1000 ]", - "[ 2/1 → 9/4 | s:hh hcutoff:1000 ]", - "[ 9/4 → 5/2 | s:hh hcutoff:1000 ]", - "[ 5/2 → 11/4 | s:hh hcutoff:1000 ]", - "[ 11/4 → 3/1 | s:hh hcutoff:1000 ]", - "[ 3/1 → 7/2 | s:bd hcutoff:500 ]", - "[ 7/2 → 4/1 | s:sd hcutoff:500 ]", - "[ 3/1 → 13/4 | s:hh hcutoff:500 ]", - "[ 13/4 → 7/2 | s:hh hcutoff:500 ]", - "[ 7/2 → 15/4 | s:hh hcutoff:500 ]", - "[ 15/4 → 4/1 | s:hh hcutoff:500 ]", + "[ 0/1 → 1/2 | s:bd hpf:4000 ]", + "[ 1/2 → 1/1 | s:sd hpf:4000 ]", + "[ 0/1 → 1/4 | s:hh hpf:4000 ]", + "[ 1/4 → 1/2 | s:hh hpf:4000 ]", + "[ 1/2 → 3/4 | s:hh hpf:4000 ]", + "[ 3/4 → 1/1 | s:hh hpf:4000 ]", + "[ 1/1 → 3/2 | s:bd hpf:2000 ]", + "[ 3/2 → 2/1 | s:sd hpf:2000 ]", + "[ 1/1 → 5/4 | s:hh hpf:2000 ]", + "[ 5/4 → 3/2 | s:hh hpf:2000 ]", + "[ 3/2 → 7/4 | s:hh hpf:2000 ]", + "[ 7/4 → 2/1 | s:hh hpf:2000 ]", + "[ 2/1 → 5/2 | s:bd hpf:1000 ]", + "[ 5/2 → 3/1 | s:sd hpf:1000 ]", + "[ 2/1 → 9/4 | s:hh hpf:1000 ]", + "[ 9/4 → 5/2 | s:hh hpf:1000 ]", + "[ 5/2 → 11/4 | s:hh hpf:1000 ]", + "[ 11/4 → 3/1 | s:hh hpf:1000 ]", + "[ 3/1 → 7/2 | s:bd hpf:500 ]", + "[ 7/2 → 4/1 | s:sd hpf:500 ]", + "[ 3/1 → 13/4 | s:hh hpf:500 ]", + "[ 13/4 → 7/2 | s:hh hpf:500 ]", + "[ 7/2 → 15/4 | s:hh hpf:500 ]", + "[ 15/4 → 4/1 | s:hh hpf:500 ]", ] `; -exports[`runs examples > example "hresonance" example index 0 1`] = ` +exports[`runs examples > example "hpq" example index 0 1`] = ` [ - "[ 0/1 → 1/2 | s:bd hcutoff:2000 hresonance:0 ]", - "[ 1/2 → 1/1 | s:sd hcutoff:2000 hresonance:0 ]", - "[ 0/1 → 1/4 | s:hh hcutoff:2000 hresonance:0 ]", - "[ 1/4 → 1/2 | s:hh hcutoff:2000 hresonance:0 ]", - "[ 1/2 → 3/4 | s:hh hcutoff:2000 hresonance:0 ]", - "[ 3/4 → 1/1 | s:hh hcutoff:2000 hresonance:0 ]", - "[ 1/1 → 3/2 | s:bd hcutoff:2000 hresonance:10 ]", - "[ 3/2 → 2/1 | s:sd hcutoff:2000 hresonance:10 ]", - "[ 1/1 → 5/4 | s:hh hcutoff:2000 hresonance:10 ]", - "[ 5/4 → 3/2 | s:hh hcutoff:2000 hresonance:10 ]", - "[ 3/2 → 7/4 | s:hh hcutoff:2000 hresonance:10 ]", - "[ 7/4 → 2/1 | s:hh hcutoff:2000 hresonance:10 ]", - "[ 2/1 → 5/2 | s:bd hcutoff:2000 hresonance:20 ]", - "[ 5/2 → 3/1 | s:sd hcutoff:2000 hresonance:20 ]", - "[ 2/1 → 9/4 | s:hh hcutoff:2000 hresonance:20 ]", - "[ 9/4 → 5/2 | s:hh hcutoff:2000 hresonance:20 ]", - "[ 5/2 → 11/4 | s:hh hcutoff:2000 hresonance:20 ]", - "[ 11/4 → 3/1 | s:hh hcutoff:2000 hresonance:20 ]", - "[ 3/1 → 7/2 | s:bd hcutoff:2000 hresonance:30 ]", - "[ 7/2 → 4/1 | s:sd hcutoff:2000 hresonance:30 ]", - "[ 3/1 → 13/4 | s:hh hcutoff:2000 hresonance:30 ]", - "[ 13/4 → 7/2 | s:hh hcutoff:2000 hresonance:30 ]", - "[ 7/2 → 15/4 | s:hh hcutoff:2000 hresonance:30 ]", - "[ 15/4 → 4/1 | s:hh hcutoff:2000 hresonance:30 ]", + "[ 0/1 → 1/2 | s:bd hpf:2000 hpq:0 ]", + "[ 1/2 → 1/1 | s:sd hpf:2000 hpq:0 ]", + "[ 0/1 → 1/4 | s:hh hpf:2000 hpq:0 ]", + "[ 1/4 → 1/2 | s:hh hpf:2000 hpq:0 ]", + "[ 1/2 → 3/4 | s:hh hpf:2000 hpq:0 ]", + "[ 3/4 → 1/1 | s:hh hpf:2000 hpq:0 ]", + "[ 1/1 → 3/2 | s:bd hpf:2000 hpq:10 ]", + "[ 3/2 → 2/1 | s:sd hpf:2000 hpq:10 ]", + "[ 1/1 → 5/4 | s:hh hpf:2000 hpq:10 ]", + "[ 5/4 → 3/2 | s:hh hpf:2000 hpq:10 ]", + "[ 3/2 → 7/4 | s:hh hpf:2000 hpq:10 ]", + "[ 7/4 → 2/1 | s:hh hpf:2000 hpq:10 ]", + "[ 2/1 → 5/2 | s:bd hpf:2000 hpq:20 ]", + "[ 5/2 → 3/1 | s:sd hpf:2000 hpq:20 ]", + "[ 2/1 → 9/4 | s:hh hpf:2000 hpq:20 ]", + "[ 9/4 → 5/2 | s:hh hpf:2000 hpq:20 ]", + "[ 5/2 → 11/4 | s:hh hpf:2000 hpq:20 ]", + "[ 11/4 → 3/1 | s:hh hpf:2000 hpq:20 ]", + "[ 3/1 → 7/2 | s:bd hpf:2000 hpq:30 ]", + "[ 7/2 → 4/1 | s:sd hpf:2000 hpq:30 ]", + "[ 3/1 → 13/4 | s:hh hpf:2000 hpq:30 ]", + "[ 13/4 → 7/2 | s:hh hpf:2000 hpq:30 ]", + "[ 7/2 → 15/4 | s:hh hpf:2000 hpq:30 ]", + "[ 15/4 → 4/1 | s:hh hpf:2000 hpq:30 ]", ] `; @@ -2385,6 +2360,60 @@ exports[`runs examples > example "loopAtCps" example index 0 1`] = ` ] `; +exports[`runs examples > example "lpf" example index 0 1`] = ` +[ + "[ 0/1 → 1/2 | s:bd lpf:4000 ]", + "[ 1/2 → 1/1 | s:sd lpf:4000 ]", + "[ 0/1 → 1/3 | s:hh lpf:4000 ]", + "[ 1/3 → 2/3 | s:hh lpf:4000 ]", + "[ 2/3 → 1/1 | s:hh lpf:4000 ]", + "[ 1/1 → 3/2 | s:bd lpf:2000 ]", + "[ 3/2 → 2/1 | s:sd lpf:2000 ]", + "[ 1/1 → 4/3 | s:hh lpf:2000 ]", + "[ 4/3 → 5/3 | s:hh lpf:2000 ]", + "[ 5/3 → 2/1 | s:hh lpf:2000 ]", + "[ 2/1 → 5/2 | s:bd lpf:1000 ]", + "[ 5/2 → 3/1 | s:sd lpf:1000 ]", + "[ 2/1 → 7/3 | s:hh lpf:1000 ]", + "[ 7/3 → 8/3 | s:hh lpf:1000 ]", + "[ 8/3 → 3/1 | s:hh lpf:1000 ]", + "[ 3/1 → 7/2 | s:bd lpf:500 ]", + "[ 7/2 → 4/1 | s:sd lpf:500 ]", + "[ 3/1 → 10/3 | s:hh lpf:500 ]", + "[ 10/3 → 11/3 | s:hh lpf:500 ]", + "[ 11/3 → 4/1 | s:hh lpf:500 ]", +] +`; + +exports[`runs examples > example "lpq" example index 0 1`] = ` +[ + "[ 0/1 → 1/2 | s:bd lpf:2000 lpq:0 ]", + "[ 1/2 → 1/1 | s:sd lpf:2000 lpq:0 ]", + "[ 0/1 → 1/4 | s:hh lpf:2000 lpq:0 ]", + "[ 1/4 → 1/2 | s:hh lpf:2000 lpq:0 ]", + "[ 1/2 → 3/4 | s:hh lpf:2000 lpq:0 ]", + "[ 3/4 → 1/1 | s:hh lpf:2000 lpq:0 ]", + "[ 1/1 → 3/2 | s:bd lpf:2000 lpq:10 ]", + "[ 3/2 → 2/1 | s:sd lpf:2000 lpq:10 ]", + "[ 1/1 → 5/4 | s:hh lpf:2000 lpq:10 ]", + "[ 5/4 → 3/2 | s:hh lpf:2000 lpq:10 ]", + "[ 3/2 → 7/4 | s:hh lpf:2000 lpq:10 ]", + "[ 7/4 → 2/1 | s:hh lpf:2000 lpq:10 ]", + "[ 2/1 → 5/2 | s:bd lpf:2000 lpq:20 ]", + "[ 5/2 → 3/1 | s:sd lpf:2000 lpq:20 ]", + "[ 2/1 → 9/4 | s:hh lpf:2000 lpq:20 ]", + "[ 9/4 → 5/2 | s:hh lpf:2000 lpq:20 ]", + "[ 5/2 → 11/4 | s:hh lpf:2000 lpq:20 ]", + "[ 11/4 → 3/1 | s:hh lpf:2000 lpq:20 ]", + "[ 3/1 → 7/2 | s:bd lpf:2000 lpq:30 ]", + "[ 7/2 → 4/1 | s:sd lpf:2000 lpq:30 ]", + "[ 3/1 → 13/4 | s:hh lpf:2000 lpq:30 ]", + "[ 13/4 → 7/2 | s:hh lpf:2000 lpq:30 ]", + "[ 7/2 → 15/4 | s:hh lpf:2000 lpq:30 ]", + "[ 15/4 → 4/1 | s:hh lpf:2000 lpq:30 ]", +] +`; + exports[`runs examples > example "lrate" example index 0 1`] = ` [ "[ 0/1 → 1/1 | n:0 s:supersquare leslie:1 lrate:1 ]", @@ -3048,35 +3077,6 @@ exports[`runs examples > example "reset" example index 0 1`] = ` ] `; -exports[`runs examples > example "resonance" example index 0 1`] = ` -[ - "[ 0/1 → 1/2 | s:bd cutoff:2000 resonance:0 ]", - "[ 1/2 → 1/1 | s:sd cutoff:2000 resonance:0 ]", - "[ 0/1 → 1/4 | s:hh cutoff:2000 resonance:0 ]", - "[ 1/4 → 1/2 | s:hh cutoff:2000 resonance:0 ]", - "[ 1/2 → 3/4 | s:hh cutoff:2000 resonance:0 ]", - "[ 3/4 → 1/1 | s:hh cutoff:2000 resonance:0 ]", - "[ 1/1 → 3/2 | s:bd cutoff:2000 resonance:10 ]", - "[ 3/2 → 2/1 | s:sd cutoff:2000 resonance:10 ]", - "[ 1/1 → 5/4 | s:hh cutoff:2000 resonance:10 ]", - "[ 5/4 → 3/2 | s:hh cutoff:2000 resonance:10 ]", - "[ 3/2 → 7/4 | s:hh cutoff:2000 resonance:10 ]", - "[ 7/4 → 2/1 | s:hh cutoff:2000 resonance:10 ]", - "[ 2/1 → 5/2 | s:bd cutoff:2000 resonance:20 ]", - "[ 5/2 → 3/1 | s:sd cutoff:2000 resonance:20 ]", - "[ 2/1 → 9/4 | s:hh cutoff:2000 resonance:20 ]", - "[ 9/4 → 5/2 | s:hh cutoff:2000 resonance:20 ]", - "[ 5/2 → 11/4 | s:hh cutoff:2000 resonance:20 ]", - "[ 11/4 → 3/1 | s:hh cutoff:2000 resonance:20 ]", - "[ 3/1 → 7/2 | s:bd cutoff:2000 resonance:30 ]", - "[ 7/2 → 4/1 | s:sd cutoff:2000 resonance:30 ]", - "[ 3/1 → 13/4 | s:hh cutoff:2000 resonance:30 ]", - "[ 13/4 → 7/2 | s:hh cutoff:2000 resonance:30 ]", - "[ 7/2 → 15/4 | s:hh cutoff:2000 resonance:30 ]", - "[ 15/4 → 4/1 | s:hh cutoff:2000 resonance:30 ]", -] -`; - exports[`runs examples > example "restart" example index 0 1`] = ` [ "[ 0/1 → 1/2 | s:bd ]", From ef4a68a24ddc46bf5c597e596986583176cd2d0f Mon Sep 17 00:00:00 2001 From: Bernhard Wagner Date: Sun, 5 Feb 2023 14:54:27 +0100 Subject: [PATCH 10/24] Update effects.mdx Wether -> Whether --- website/src/pages/learn/effects.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index 6ef4e7d3c..96a72afef 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -9,7 +9,7 @@ import { JsDoc } from '../../docs/JsDoc'; # Audio Effects -Wether you're using a synth or a sample, you can apply any of the following built-in audio effects. +Whether you're using a synth or a sample, you can apply any of the following built-in audio effects. As you might suspect, the effects can be chained together, and they accept a pattern string as their argument. ## bandf From ce64c98fb7ec294880d275524794f448a5dfc1eb Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 15:08:17 +0100 Subject: [PATCH 11/24] add adsr image link --- website/src/pages/learn/effects.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/src/pages/learn/effects.mdx b/website/src/pages/learn/effects.mdx index 82b1ab1cc..0d19c68f0 100644 --- a/website/src/pages/learn/effects.mdx +++ b/website/src/pages/learn/effects.mdx @@ -61,6 +61,8 @@ Strudel uses ADSR envelopes, which are probably the most common way to describe ![ADSR](https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/ADSR_parameter.svg/1920px-ADSR_parameter.svg.png) +[image link](https://commons.wikimedia.org/wiki/File:ADSR_parameter.svg) + ## attack From 0fdae70461fe26b3e4dc3a9394863a62126a616f Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 16:28:43 +0100 Subject: [PATCH 12/24] improve samples doc --- packages/core/controls.mjs | 10 +++ website/src/pages/learn/samples.mdx | 116 +++++++++++++++++++++++----- 2 files changed, 106 insertions(+), 20 deletions(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 901a2ba33..ad521112c 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -798,6 +798,16 @@ const generic_params = [ ['f', 'uid', ''], ['f', 'val', ''], ['f', 'cps', ''], + /** + * If set to 1, samples will be cut to the duration of their event. + * In tidal, this would be done with legato, which [is about to land in strudel too](https://github.com/tidalcycles/strudel/issues/111) + * + * @name clip + * @param {number | Pattern} active 1 or 0 + * @example + * note("c a f e ~").s("piano").clip(1) + * + */ ['f', 'clip', ''], ]; diff --git a/website/src/pages/learn/samples.mdx b/website/src/pages/learn/samples.mdx index 510b43c5e..6630a8625 100644 --- a/website/src/pages/learn/samples.mdx +++ b/website/src/pages/learn/samples.mdx @@ -9,16 +9,90 @@ import { JsDoc } from '../../docs/JsDoc'; # Samples -# Default Sample Map +Samples are the most common way to make sound with tidal and strudel. +A sample is a (commonly short) piece of audio that is used as a basis for sound generation, undergoing various transformations. +Music that is based on samples can be thought of as a collage of sound. [Read more about Sampling]() -As we have seen, `s` can play back audio samples: +Strudel allows loading samples in the form of audio files of various formats (wav, mp3, ogg) from any publicly available URL. - +# Default Samples -These sounds come from Strudel's in-built default "sample map". -To know which sounds are available, open the [default sample map](https://strudel.tidalcycles.org/EmuSP12.json). +By default, strudel comes with a built-in "sample map", providing a solid base to play with. -# Custom Sample Maps + + +Here, we are using the `s` function to play back different default samples (`bd`, `sd`, `hh` and `misc`) to get a drum beat. + +For drum sounds, strudel uses the comprehensive [tidal-drum-machines](https://github.com/ritchse/tidal-drum-machines) library, with the following naming convention: + +| Drum | Abbreviation | +| ----------------------------------- | ------------ | +| Bass drum, Kick drum | bd | +| Snare drum | sd | +| Rimshot | rim | +| Clap | cp | +| Closed hi-hat | hh | +| Open hi-hat | oh | +| Crash | cr | +| Ride | rd | +| Shakers (and maracas, cabasas, etc) | sh | +| High tom | ht | +| Medium tom | mt | +| Low tom | lt | +| Cowbell | cb | +| Tambourine | tb | +| Other percussions | perc | +| Miscellaneous samples | misc | +| Effects | fx | + +Furthermore, strudel also loads instrument samples from [VCSL](https://github.com/sgossner/VCSL) by default. + +To see which sample names are available, open the `samples` tab in the [REPL](https://strudel.tidalcycles.org/). + +Note that only the sample maps (mapping names to URLs) are loaded initially, while the audio samples itself are not loaded until they are actually played. +This behaviour of loading things only when they are needed is also called `lazy loading`. +While it saves resources, it can also lead to sounds not being audible the first time they are triggered, because the sound is still loading. +[This might be fixed in the future](https://github.com/tidalcycles/strudel/issues/187) + +# Sound Banks + +If we look at the `samples` tab, we can see that the drum samples are all prefixed with drum machine names: `RolandTR808_bd`, `RolandTR808_sd`, `RolandTR808_hh` etc.. + +We _could_ use them like this: + + + +... but thats obviously a bit much to write. Using the `bank` function, we can shorten this to: + + + +You could even pattern the bank to switch between different drum machines: + +")`} /> + +Behind the scenes, `bank` will just prepend the drum machine name to the sample name with `_` to get the full name. +This of course only works because the name after `_` (`bd`, `sd` etc..) is standardized. +Also note that some banks won't have samples for all sounds! + +# Selecting Sounds + +If we look again at the `samples` tab, there is also a number behind each name, indicating how many individual samples are available. +For example `RolandTR909_hh(4)` means there are 4 samples of a TR909 hihat available. +By default, `s` will play the first sample, but we can selecting the other ones using `n`, starting from 0: + +")`} /> + +Numbers that are too high will just wrap around to the beginning + +")`} /> + +Here, 0-3 will play the same sounds as 4-7, because `RolandTR909_hh` only has 4 sounds. + +Selecting sounds also works inside the mini notation, using "`:`" like this: + + + +# Loading Custom Samples You can load your own sample map using the `samples` function. In this example we create a map using sounds from the default sample map: @@ -48,7 +122,7 @@ s("bassdrum snaredrum, hihat*8")`} Here we have changed the "map" to include longer sample names. -# Loading Custom Samples +## Loading Custom Samples The `samples` function has two arguments: @@ -87,7 +161,7 @@ We can see there are some guitar samples inside the `/samples` folder, so let's s("[g0 g1 g2 g3 g4]/5")`} /> -# Loading Multiple Samples per Sound +## Loading Multiple Samples per Sound It is also possible, to declare multiple files for one sound, using the array notation: @@ -146,7 +220,7 @@ And as above, we can choose the sample number using `n` for even more flexibilit n("<0 1 2 3 4>").s("guitar")`} /> -# Pitched Sounds +## Pitched Sounds For pitched sounds, you can use `note`, just like with synths: @@ -170,7 +244,7 @@ note("g3 [bb3 c4] @2").s('gtr').clip(1) .gain(.5)`} /> -# Base Pitch +## Base Pitch If we have 2 samples with different base pitches, we can make them in tune by specifying the pitch like this: @@ -203,7 +277,7 @@ note("g2!2 !2, g4 f4]>") The sampler will always pick the closest matching sample for the current note! -# Shabda +## Shabda If you don't want to select samples by hand, there is also the wonderful tool called [shabda](https://shabda.ndre.gr/). With it, you can enter any sample name(s) to query from [freesound.org](https://freesound.org/). Example: @@ -220,30 +294,32 @@ stack( # Sampler Effects -Below are four different examples of sampler "effects" which are functions that can be used to change the behaviour of sample playback. -Note that most of what you've learned already about Tidal mini-notation can be used with these functions too. -Almost everything in Tidal can be patterned using strings! +Sampler effects are functions that can be used to change the behaviour of sample playback. -### `begin` +### begin -### `end` +### end -### `cut` +### cut -### `loopAt` +### clip + + + +### loopAt -### `chop` +### chop -### `speed` +### speed From 379b8392ddf0a31d4aeb74d0b12724ba167f1bd9 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 16:32:51 +0100 Subject: [PATCH 13/24] add snapshot --- test/__snapshots__/examples.test.mjs.snap | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 148f12cce..e52a59323 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -1060,6 +1060,27 @@ exports[`runs examples > example "chunkBack" example index 0 1`] = ` ] `; +exports[`runs examples > example "clip" example index 0 1`] = ` +[ + "[ 0/1 → 1/5 | note:c s:piano clip:1 ]", + "[ 1/5 → 2/5 | note:a s:piano clip:1 ]", + "[ 2/5 → 3/5 | note:f s:piano clip:1 ]", + "[ 3/5 → 4/5 | note:e s:piano clip:1 ]", + "[ 1/1 → 6/5 | note:c s:piano clip:1 ]", + "[ 6/5 → 7/5 | note:a s:piano clip:1 ]", + "[ 7/5 → 8/5 | note:f s:piano clip:1 ]", + "[ 8/5 → 9/5 | note:e s:piano clip:1 ]", + "[ 2/1 → 11/5 | note:c s:piano clip:1 ]", + "[ 11/5 → 12/5 | note:a s:piano clip:1 ]", + "[ 12/5 → 13/5 | note:f s:piano clip:1 ]", + "[ 13/5 → 14/5 | note:e s:piano clip:1 ]", + "[ 3/1 → 16/5 | note:c s:piano clip:1 ]", + "[ 16/5 → 17/5 | note:a s:piano clip:1 ]", + "[ 17/5 → 18/5 | note:f s:piano clip:1 ]", + "[ 18/5 → 19/5 | note:e s:piano clip:1 ]", +] +`; + exports[`runs examples > example "coarse" example index 0 1`] = ` [ "[ 0/1 → 1/2 | s:bd coarse:1 ]", From 0a77770ef3836de59adcd87a5496335e290bf908 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 16:37:00 +0100 Subject: [PATCH 14/24] remove double directive --- website/src/pages/learn/samples.mdx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/website/src/pages/learn/samples.mdx b/website/src/pages/learn/samples.mdx index 6630a8625..129f6474e 100644 --- a/website/src/pages/learn/samples.mdx +++ b/website/src/pages/learn/samples.mdx @@ -19,7 +19,7 @@ Strudel allows loading samples in the form of audio files of various formats (wa By default, strudel comes with a built-in "sample map", providing a solid base to play with. - + Here, we are using the `s` function to play back different default samples (`bd`, `sd`, `hh` and `misc`) to get a drum beat. @@ -60,15 +60,15 @@ If we look at the `samples` tab, we can see that the drum samples are all prefix We _could_ use them like this: - + ... but thats obviously a bit much to write. Using the `bank` function, we can shorten this to: - + You could even pattern the bank to switch between different drum machines: -")`} /> +")`} /> Behind the scenes, `bank` will just prepend the drum machine name to the sample name with `_` to get the full name. This of course only works because the name after `_` (`bd`, `sd` etc..) is standardized. @@ -80,17 +80,17 @@ If we look again at the `samples` tab, there is also a number behind each name, For example `RolandTR909_hh(4)` means there are 4 samples of a TR909 hihat available. By default, `s` will play the first sample, but we can selecting the other ones using `n`, starting from 0: -")`} /> +")`} /> Numbers that are too high will just wrap around to the beginning -")`} /> +")`} /> Here, 0-3 will play the same sounds as 4-7, because `RolandTR909_hh` only has 4 sounds. Selecting sounds also works inside the mini notation, using "`:`" like this: - + # Loading Custom Samples From 3e99f345efcc3e599fc1c15c05655d50dc163b39 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 16:40:29 +0100 Subject: [PATCH 15/24] better headings --- website/src/pages/learn/samples.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/src/pages/learn/samples.mdx b/website/src/pages/learn/samples.mdx index 129f6474e..5ad0c0e01 100644 --- a/website/src/pages/learn/samples.mdx +++ b/website/src/pages/learn/samples.mdx @@ -122,7 +122,7 @@ s("bassdrum snaredrum, hihat*8")`} Here we have changed the "map" to include longer sample names. -## Loading Custom Samples +## The `samples` function The `samples` function has two arguments: @@ -161,7 +161,7 @@ We can see there are some guitar samples inside the `/samples` folder, so let's s("[g0 g1 g2 g3 g4]/5")`} /> -## Loading Multiple Samples per Sound +## Multiple Samples per Sound It is also possible, to declare multiple files for one sound, using the array notation: From e15fecf6cf5b4590eea00f44c4423f7fc1bb015c Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 17:19:32 +0100 Subject: [PATCH 16/24] google gtfo --- website/src/components/HeadCommon.astro | 27 ------------------------- website/src/components/HeadSEO.astro | 17 +++------------- 2 files changed, 3 insertions(+), 41 deletions(-) diff --git a/website/src/components/HeadCommon.astro b/website/src/components/HeadCommon.astro index ecc6ae215..ba6e751cc 100644 --- a/website/src/components/HeadCommon.astro +++ b/website/src/components/HeadCommon.astro @@ -12,34 +12,7 @@ const base = BASE_URL; - - - - - - - - - - - - - diff --git a/website/src/components/HeadSEO.astro b/website/src/components/HeadSEO.astro index c40e04327..556b50a72 100644 --- a/website/src/components/HeadSEO.astro +++ b/website/src/components/HeadSEO.astro @@ -2,8 +2,8 @@ import { SITE, OPEN_GRAPH, Frontmatter } from '../config'; export interface Props { - frontmatter: Frontmatter; - canonicalUrl: URL; + frontmatter: Frontmatter; + canonicalUrl: URL; } const { frontmatter, canonicalUrl } = Astro.props as Props; @@ -23,11 +23,7 @@ const imageAlt = frontmatter.image?.alt ?? OPEN_GRAPH.image.alt; - + @@ -37,10 +33,3 @@ const imageAlt = frontmatter.image?.alt ?? OPEN_GRAPH.image.alt; - - From bb50df07e7e9cca4a14c8c8c3df138696342886a Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 5 Feb 2023 21:01:02 +0000 Subject: [PATCH 17/24] iclc reviews --- paper/iclc-reviews.md | 97 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 paper/iclc-reviews.md diff --git a/paper/iclc-reviews.md b/paper/iclc-reviews.md new file mode 100644 index 000000000..f79833dbc --- /dev/null +++ b/paper/iclc-reviews.md @@ -0,0 +1,97 @@ +**Submission ID:** 8 + +**Title:** Strudel: live coding patterns on the Web + +**Status:** Accept + +**Reviewer 1:** + +Author Comments: * Summary of the contribution:\ +This paper describes Strudel, a Web-based implementation of Tidal Cycles. It is generally a good overview of the system which could help prospective users understand how it works beyond the manual, and it provides many code examples. The most interesting contribution is the comparison between the Haskell and JavaScript features for this case. + +* On theme (1-5):\ +1 + +* Citation quality (1-5):\ +5 + +* Missing references:\ +not answered + +* Suggested improvements:\ +This paper is a good introduction to Strudel. The style is mostly illustrative, but it is hard to understand where the Tidal syntax is being introduced vs where the specific Strudel features are used. Thus, the best way to improve it would be to focus on Strudel. Also, it would be good to give a better hint on what output method would be preferable. Also the title of Section 9 should compare Strudel to Tidal or Haskell to JavaScript. + +The paper is driven by examples, but many are a bit difficult to follow, here are some issues:\ +Section 4 - the mini-notation example does not look terser despite the text.\ +Section 5 - echo funciton is not used.\ +Sections 7.11 and 7.12 - the same (mini-notation) example is used so it is not clear what relation there is between transpilation and using mini-notation. Also please reference peggy\ +Sectin 7.3.2 The sawtooth waveform has been used in all examples, so it would be clearer if it was used here (maybe cutoff as well). + +Generally, beyond the language differences, what does Strudel contribute with respect to Haskell-based Tidal? I would say that there is a lot to be gained in terms of installation, availability and potential for collaboration. + +* Clarity (1-5):\ +4 + +* Corrections required:\ +No contentious / incorrect claims + +* Other Changes if Published:\ +not answered + +* Correct Template used?\ +Yes + +* All materials provided?\ +Yes + +* Wordcount respected?\ +Yes + +* Have any deviations, errors or omissions impacted your ability to give a fair review?\ +No + +**Reviewer 2:** + +Author Comments: * Summary of the contribution:\ +This proposal presents Strudel, an online, JavaScript-native approach to algorithmic pattern composition that in many ways mirrors TidalCycles. TidalCycles, developed by one of the authors, is a key software piece for live coding. Perhaps the most difficult aspects of Tidal are related to Haskell and Haskell's dependency system that makes it very difficult to install. Haskell in itself is a difficult language to grasp; if Tidal users would like to expand and 'personalise' the possibilities of the software, they would have to get familiar with the particularities of Haskell. JavaScript is a multi-paradigm language that is used for web development can make pattern-based, algorithmic composition more popular. The process of bringing Tidal's paradigm to a dynamic type system seems to be an important part of this research. I enjoy and find very interesting the dialectical process that occurs between Strudel and Tidal, where the implementation of Tidal concepts in Strudel simultaneously transforms Tidal, either by introspection (finding bugs, etc.) or by bringing back to Tidal new insights that are clear in JavaScript. I think moving to TypeScript makes sense; perhaps a small section where the decision to use JavaScript is discussed a little further could be helpful for readers (beyond accessibility). Overall, this paper is clear and presents software that is a key development for live coding and will be a great addition to the next ICLC. + +* On theme (1-5):\ +4 + +* Citation quality (1-5):\ +5 + +* Missing references:\ +not answered + +* Suggested improvements:\ +Tidal-Strudel parity seems to be on the immediate horizon, but I wonder if this parity is transient and if the ultimate goal of Strudel is to ultimately diverge from Tidal. Perhaps the project is in its early stages, and this is not clear, but it would be interesting to get some insights on the authors' intentions. Personally, I think that a key discussion that needs to happen in live coding communities and development nodes is that of what is understood as multilingual live coding. Tidal's paradigm is implemented in a number of programming languages (as well as platforms such as Estuary), each with its own set of features and challenges: some are functional reactive programming, type strict oriented, while others are multi-paradigm, dynamic type oriented, etc. This seems to suggest that it is possible for many programming languages to adopt one single understanding of how to make music. Perhaps further considerations should be made as to whether we need one single grammar to name and express all music structures or whether we need environments and software that help difference to proliferate in terms of music/sound art/art idiosyncrasies. Perhaps questions in this direction are beyond the scope of this paper and I hope this comment is taken as productive feedback for the authors. + +* Clarity (1-5):\ +4 + +* Corrections required:\ +Nothing contentious or incorrect to note. + +* Other Changes if Published:\ +The example shown on page 3 under "Pattern Example" seems to be different from its explanation. The explanations do not mention scale but mention echo, which is not present in the example. I would double check all the code examples inc ase I missed something like this. + +* Correct Template used?\ +Yes + +* All materials provided?\ +Yes + +* Wordcount respected?\ +Yes + +* Have any deviations, errors or omissions impacted your ability to give a fair review?\ +no + +* General remarks:\ +This proposal presents Strudel, an online, JavaScript-native approach to algorithmic pattern composition that in many ways mirrors TidalCycles. TidalCycles, developed by one of the authors, is a key software piece for live coding. Perhaps the most difficult aspects of Tidal are related to Haskell and Haskell's dependency system that makes it very difficult to install. Haskell in itself is a difficult language to grasp; if Tidal users would like to expand and 'personalise' the possibilities of the software, they would have to get familiar with the particularities of Haskell. JavaScript is a multi-paradigm language that can make pattern-based, algorithmic composition more popular. The process of bringing Tidal's paradigm to a dynamic type system seems to be an important part of this research. I enjoy and find very interesting the dialectical process that occurs between Strudel and Tidal, where the implementation of Tidal concepts in Strudel simultaneously transforms Tidal, either by introspection (finding bugs, etc.) or by bringing back to Tidal new insights that are clear in JavaScript. I think moving to TypeScript makes sense; perhaps a small section where the decision to use JavaScript is discussed a little further could be helpful for readers (beyond accessibility). I am curious, did the authors consider PureScript? I can see how, in terms of popularity, PureScript is a lateral move coming from Haskell, but an explicit explanation about the (maybe) obvious candidates would be interesting.\ +Tidal-Strudel parity seems to be on the immediate horizon, but I wonder if this parity is transient and if the ultimate goal of Strudel is to ultimately diverge from Tidal. Perhaps the project is in its early stages, and this is not clear, but it would be interesting to get some insights on the authors' intentions. Personally, I think that a key discussion that needs to happen in live coding communities and development nodes is that of what is understood as multilingual live coding. Tidal's paradigm is implemented in a number of programming languages (as well as platforms such as Estuary), each with its own set of features and challenges: some are functional reactive programming, type strict oriented, while others are multi-paradigm, dynamic type oriented, etc. This seems to suggest that it is possible for many programming languages to adopt one single understanding of how to make music. Perhaps further considerations should be made as to whether we need one single grammar to name and express all music structures or whether we need environments and software that help difference to proliferate in terms of music/sound art/art idiosyncrasies. Perhaps questions in this direction are beyond the scope of this paper and I hope this last comment is taken as productive feedback for the authors. + +Overall, this paper is clear and presents software that is a key development for live coding and will be a great addition to the next ICLC. + +PS. The example shown on page 3 under "Pattern Example" seems to be different from its explanation. The explanations do not mention scale but mention echo, which is not present in the example. From ac606bcf711d1da90b9e21454fba103ac393f643 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 5 Feb 2023 23:16:38 +0100 Subject: [PATCH 18/24] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 50641ffdf..df020d004 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ An experiment in making a [Tidal](https://github.com/tidalcycles/tidal/) using w - Try it here: - Docs: - Technical Blog Post: +- 1 Year of Strudel Blog Post: ## Running Locally From f3f87b0a464d7fa36bd011a8f49d56ab8d163322 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Mon, 6 Feb 2023 20:20:45 +0100 Subject: [PATCH 19/24] dont lint json --- .eslintignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintignore b/.eslintignore index 99fffe672..8b9ef749f 100644 --- a/.eslintignore +++ b/.eslintignore @@ -15,3 +15,4 @@ vite.config.js !**/*.mjs **/*.tsx **/*.ts +**/*.json \ No newline at end of file From 10580a0bec8544068b17e3da866f4b066667342d Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Mon, 6 Feb 2023 20:21:09 +0100 Subject: [PATCH 20/24] change rocket to strudel --- website/src/layouts/MainLayout.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/layouts/MainLayout.astro b/website/src/layouts/MainLayout.astro index d14b19157..3d93f4363 100644 --- a/website/src/layouts/MainLayout.astro +++ b/website/src/layouts/MainLayout.astro @@ -27,7 +27,7 @@ const githubEditUrl = `${CONFIG.GITHUB_EDIT_URL}/${currentFile}`; - {frontmatter.title ? `${frontmatter.title} 🚀 ${CONFIG.SITE.title}` : CONFIG.SITE.title} + {frontmatter.title ? `${frontmatter.title} 🌀 ${CONFIG.SITE.title}` : CONFIG.SITE.title} From fd09dff381db365886c7afe596f583b1d7aeda99 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Mon, 6 Feb 2023 20:57:34 +0100 Subject: [PATCH 21/24] basic pwa setup --- .gitignore | 4 +- pnpm-lock.yaml | 1653 ++++++++++++++++- website/README.md | 7 + website/astro.config.mjs | 40 + website/package.json | 9 +- website/public/icon.png | Bin 0 -> 35958 bytes website/public/icons/apple-icon-180.png | Bin 0 -> 11375 bytes .../icons/manifest-icon-192.maskable.png | Bin 0 -> 12638 bytes .../icons/manifest-icon-512.maskable.png | Bin 0 -> 45307 bytes website/src/components/HeadCommon.astro | 12 + website/src/env.d.ts | 2 + website/src/layouts/MainLayout.astro | 2 +- website/src/pages/index.astro | 2 +- website/src/pwa.ts | 11 + website/src/repl/Footer.jsx | 2 +- website/tsconfig.json | 6 +- 16 files changed, 1678 insertions(+), 72 deletions(-) create mode 100644 website/public/icon.png create mode 100644 website/public/icons/apple-icon-180.png create mode 100644 website/public/icons/manifest-icon-192.maskable.png create mode 100644 website/public/icons/manifest-icon-512.maskable.png create mode 100644 website/src/pwa.ts diff --git a/.gitignore b/.gitignore index 52900ad40..aaebb858f 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,6 @@ talk/public/EmuSP12 talk/public/samples server/samples/old repl/stats.html -coverage \ No newline at end of file +coverage +public/icons/apple-splash-* +dev-dist \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce03f49cf..477cb7231 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -373,6 +373,7 @@ importers: '@types/node': ^18.0.0 '@types/react': ^18.0.26 '@types/react-dom': ^18.0.9 + '@vite-pwa/astro': ^0.0.1 astro: ^1.7.2 canvas: ^2.11.0 fraction.js: ^4.2.0 @@ -385,6 +386,8 @@ importers: rehype-slug: ^5.0.1 remark-toc: ^8.0.1 tailwindcss: ^3.2.4 + vite-plugin-pwa: ^0.14.1 + workbox-window: ^6.5.4 dependencies: '@algolia/client-search': 4.14.3 '@astrojs/mdx': 0.13.0 @@ -424,7 +427,10 @@ importers: remark-toc: 8.0.1 tailwindcss: 3.2.4 devDependencies: + '@vite-pwa/astro': 0.0.1 html-escaper: 3.0.3 + vite-plugin-pwa: 0.14.1_workbox-window@6.5.4 + workbox-window: 6.5.4 packages: @@ -546,6 +552,18 @@ packages: '@jridgewell/gen-mapping': 0.1.1 '@jridgewell/trace-mapping': 0.3.17 + /@apideck/better-ajv-errors/0.3.6_ajv@8.12.0: + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.12.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: true + /@astrojs/compiler/0.31.4: resolution: {integrity: sha512-6bBFeDTtPOn4jZaiD3p0f05MEGQL9pw2Zbfj546oFETNmjJFWO3nzHz6/m+P53calknCvyVzZ5YhoBLIvzn5iw==} dev: false @@ -769,6 +787,14 @@ packages: dependencies: '@babel/types': 7.20.7 + /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': 7.18.6 + '@babel/types': 7.20.7 + dev: true + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12: resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} @@ -782,10 +808,63 @@ packages: lru-cache: 5.1.1 semver: 6.3.0 + /@babel/helper-create-class-features-plugin/7.20.12_@babel+core@7.20.12: + resolution: {integrity: sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-member-expression-to-functions': 7.20.7 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin/7.20.5_@babel+core@7.20.12: + resolution: {integrity: sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.2.2 + dev: true + + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.12: + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-environment-visitor/7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} + /@babel/helper-explode-assignable-expression/7.18.6: + resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + /@babel/helper-function-name/7.19.0: resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} @@ -799,6 +878,13 @@ packages: dependencies: '@babel/types': 7.20.7 + /@babel/helper-member-expression-to-functions/7.20.7: + resolution: {integrity: sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} @@ -820,16 +906,59 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helper-optimise-call-expression/7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + /@babel/helper-plugin-utils/7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-wrap-function': 7.20.5 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers/7.20.7: + resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.20.7 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.13 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-simple-access/7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.7 + /@babel/helper-skip-transparent-expression-wrappers/7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.7 + dev: true + /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} @@ -848,6 +977,18 @@ packages: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} + /@babel/helper-wrap-function/7.20.5: + resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.19.0 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.13 + '@babel/types': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helpers/7.20.13: resolution: {integrity: sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==} engines: {node: '>=6.9.0'} @@ -881,6 +1022,277 @@ packages: dependencies: '@babel/types': 7.20.7 + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.14 + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + dev: true + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.20.5_@babel+core@7.20.12: + resolution: {integrity: sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.12: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.12: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.12: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.12: + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} @@ -890,6 +1302,348 @@ packages: '@babel/core': 7.20.12 '@babel/helper-plugin-utils': 7.20.2 + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.12: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.12: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.12: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.12: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.12: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-block-scoping/7.20.15_@babel+core@7.20.12: + resolution: {integrity: sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-classes/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/template': 7.20.7 + dev: true + + /@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.12: + resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.20.12: + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.20.11_@babel+core@7.20.12: + resolution: {integrity: sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.20.12: + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-identifier': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.20.12: + resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.12: resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} @@ -933,12 +1687,203 @@ packages: '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.12 '@babel/types': 7.20.7 + /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.20.12: + resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + regenerator-transform: 0.15.1 + dev: true + + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-spread/7.20.7_@babel+core@7.20.12: + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + dev: true + + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.12: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.12: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.12: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-create-regexp-features-plugin': 7.20.5_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/preset-env/7.20.2_@babel+core@7.20.12: + resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.14 + '@babel/core': 7.20.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-class-static-block': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-optional-chaining': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-proposal-private-property-in-object': 7.20.5_@babel+core@7.20.12 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.12 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.12 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.12 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.12 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.12 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.12 + '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-block-scoping': 7.20.15_@babel+core@7.20.12 + '@babel/plugin-transform-classes': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-transform-destructuring': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.12 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.20.12 + '@babel/plugin-transform-modules-commonjs': 7.20.11_@babel+core@7.20.12 + '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.20.12 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.20.12 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.20.12 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.20.12 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.12 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.12 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.12 + '@babel/preset-modules': 0.1.5_@babel+core@7.20.12 + '@babel/types': 7.20.7 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.12 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.12 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.12 + core-js-compat: 3.27.2 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules/0.1.5_@babel+core@7.20.12: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.12 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.12 + '@babel/types': 7.20.7 + esutils: 2.0.3 + dev: true + /@babel/runtime/7.20.13: resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 - dev: false /@babel/template/7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} @@ -1416,6 +2361,13 @@ packages: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + /@jridgewell/source-map/0.3.2: + resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} @@ -2442,6 +3394,74 @@ packages: tsm: 2.3.0 dev: false + /@rollup/plugin-babel/5.3.1_3dsfpkpoyvuuxyfgdbpn4j4uzm: + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-module-imports': 7.18.6 + '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-node-resolve/11.2.1_rollup@2.79.1: + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.2.2 + is-module: 1.0.0 + resolve: 1.22.1 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-replace/2.4.2_rollup@2.79.1: + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + magic-string: 0.25.9 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-replace/5.0.2_rollup@3.12.0: + resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2_rollup@3.12.0 + magic-string: 0.27.0 + rollup: 3.12.0 + dev: true + + /@rollup/pluginutils/3.1.0_rollup@2.79.1: + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + /@rollup/pluginutils/5.0.2: resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} @@ -2456,6 +3476,21 @@ packages: picomatch: 2.3.1 dev: false + /@rollup/pluginutils/5.0.2_rollup@3.12.0: + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.12.0 + dev: true + /@supabase/functions-js/1.3.4: resolution: {integrity: sha512-yYVgkECjv7IZEBKBI3EB5Q7R1p0FJ10g8Q9N7SWKIHUU6i6DnbEGHIMFLyQRm1hmiNWD8fL7bRVEYacmTRJhHw==} dependencies: @@ -2510,6 +3545,15 @@ packages: - supports-color dev: false + /@surma/rollup-plugin-off-main-thread/2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.8 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.8 + dev: true + /@tailwindcss/typography/0.5.9_tailwindcss@3.2.4: resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==} peerDependencies: @@ -2749,9 +3793,12 @@ packages: '@types/estree': 1.0.0 dev: false + /@types/estree/0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - dev: false /@types/extend/3.0.1: resolution: {integrity: sha512-R1g/VyKFFI2HLC1QGAeTtCBWCo6n75l41OnsVYNbmKG+kempOESaodf6BeJyUM3Q0rKa/NQcTHbB2+66lNnxLw==} @@ -2869,6 +3916,12 @@ packages: '@types/scheduler': 0.16.2 csstype: 3.1.1 + /@types/resolve/1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 18.11.18 + dev: true + /@types/resolve/1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: false @@ -2876,6 +3929,10 @@ packages: /@types/scheduler/0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + /@types/trusted-types/2.0.2: + resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==} + dev: true + /@types/unist/2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: false @@ -2967,6 +4024,10 @@ packages: react-dom: 17.0.2_react@17.0.2 dev: false + /@vite-pwa/astro/0.0.1: + resolution: {integrity: sha512-FkX3F+JbVVjSjXrHkE681ZmOSIS2h43ldj7+YnBf52/qoSM9Ns05kNcjC7RNSIlRpD0a0TN1efutulDWWra6UQ==} + dev: true + /@vitejs/plugin-react/2.2.0_vite@3.2.5: resolution: {integrity: sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3087,6 +4148,15 @@ packages: uri-js: 4.4.1 dev: true + /ajv/8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + /algoliasearch/4.14.3: resolution: {integrity: sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg==} dependencies: @@ -3436,6 +4506,10 @@ packages: lodash: 4.17.21 dev: true + /async/3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + dev: true + /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true @@ -3492,6 +4566,42 @@ packages: resolve: 1.22.1 dev: false + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.12: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.20.14 + '@babel/core': 7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.12: + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + core-js-compat: 3.27.2 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.12: + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12 + transitivePeerDependencies: + - supports-color + dev: true + /bail/2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: false @@ -3560,6 +4670,12 @@ packages: balanced-match: 1.0.2 concat-map: 0.0.1 + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -3602,6 +4718,11 @@ packages: node-gyp-build: 4.6.0 dev: false + /builtin-modules/3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + /builtins/1.0.3: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} dev: true @@ -4045,6 +5166,11 @@ packages: engines: {node: '>=8'} dev: true + /common-tags/1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + /commondir/1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true @@ -4178,6 +5304,12 @@ packages: engines: {node: '>= 0.6'} dev: false + /core-js-compat/3.27.2: + resolution: {integrity: sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==} + dependencies: + browserslist: 4.21.4 + dev: true + /core-util-is/1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} dev: true @@ -4216,6 +5348,11 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /crypto-random-string/2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: true + /cssesc/3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -4344,7 +5481,6 @@ packages: /deepmerge/4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} - dev: false /defaults/1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -4613,6 +5749,14 @@ packages: safer-buffer: 2.1.2 dev: true + /ejs/3.1.8: + resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.5 + dev: true + /electron-to-chromium/1.4.284: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} @@ -5300,9 +6444,12 @@ packages: '@types/unist': 2.0.6 dev: false + /estree-walker/1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + /estree-walker/2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: false /estree-walker/3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -5447,6 +6594,12 @@ packages: glob: 7.2.3 dev: true + /filelist/1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true + /filename-reserved-regex/2.0.0: resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} engines: {node: '>=4'} @@ -5736,7 +6889,6 @@ packages: /get-own-enumerable-property-symbols/3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - dev: false /get-pkg-repo/4.2.1: resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} @@ -6296,6 +7448,10 @@ packages: dev: true optional: true + /idb/7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: true + /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -6544,6 +7700,10 @@ packages: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: true + /is-module/1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -6563,7 +7723,6 @@ packages: /is-obj/1.0.1: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} - dev: false /is-obj/2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} @@ -6619,7 +7778,6 @@ packages: /is-regexp/1.0.0: resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} engines: {node: '>=0.10.0'} - dev: false /is-relative-path/1.0.2: resolution: {integrity: sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA==} @@ -6745,11 +7903,31 @@ packages: istanbul-lib-report: 3.0.0 dev: true + /jake/10.8.5: + resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + /jazz-midi/1.7.9: resolution: {integrity: sha512-c8c4BBgwxdsIr1iVm53nadCrtH7BUlnX3V95ciK/gbvXN/ndE5+POskBalXgqlc/r9p2XUbdLTrgrC6fou5p9w==} engines: {node: '>=10.0.0'} dev: false + /jest-worker/26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.11.18 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + /js-sdsl/4.3.0: resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} dev: true @@ -6871,6 +8049,11 @@ packages: underscore: 1.13.6 dev: true + /jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + /jsesc/2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -6888,6 +8071,10 @@ packages: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true + /json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + /json-schema/0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} dev: true @@ -6942,6 +8129,11 @@ packages: engines: {'0': node >= 0.2.0} dev: true + /jsonpointer/5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: true + /jsprim/1.4.2: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} @@ -7009,6 +8201,11 @@ packages: - supports-color dev: true + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + /levn/0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} @@ -7140,6 +8337,10 @@ packages: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} dev: false + /lodash.debounce/4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + /lodash.ismatch/4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} dev: true @@ -7163,6 +8364,10 @@ packages: resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} dev: true + /lodash.sortby/4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + /lodash.template/4.5.0: resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} dependencies: @@ -7214,6 +8419,12 @@ packages: dependencies: yallist: 4.0.0 + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + /magic-string/0.26.7: resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} engines: {node: '>=12'} @@ -7226,7 +8437,6 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 - dev: false /make-dir/2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -7974,6 +9184,13 @@ packages: dependencies: brace-expansion: 1.1.11 + /minimatch/5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options/4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -9004,17 +10221,6 @@ packages: - supports-color dev: true - /postcss-import/14.1.0: - resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.1 - dev: false - /postcss-import/14.1.0_postcss@8.4.21: resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} @@ -9025,16 +10231,6 @@ packages: postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.1 - dev: true - - /postcss-js/4.0.0: - resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.3.3 - dependencies: - camelcase-css: 2.0.1 - dev: false /postcss-js/4.0.0_postcss@8.4.21: resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} @@ -9044,23 +10240,6 @@ packages: dependencies: camelcase-css: 2.0.1 postcss: 8.4.21 - dev: true - - /postcss-load-config/3.1.4: - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.0.6 - yaml: 1.10.2 - dev: false /postcss-load-config/3.1.4_postcss@8.4.21: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} @@ -9078,15 +10257,6 @@ packages: postcss: 8.4.21 yaml: 1.10.2 - /postcss-nested/6.0.0: - resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss-selector-parser: 6.0.11 - dev: false - /postcss-nested/6.0.0_postcss@8.4.21: resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} engines: {node: '>=12.0'} @@ -9095,7 +10265,6 @@ packages: dependencies: postcss: 8.4.21 postcss-selector-parser: 6.0.11 - dev: true /postcss-selector-parser/6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -9224,6 +10393,16 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + /pretty-bytes/5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /pretty-bytes/6.1.0: + resolution: {integrity: sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: true + /pretty-format/3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} dev: false @@ -9351,6 +10530,12 @@ packages: resolution: {integrity: sha512-A9hihu7dUTLOUCM+I8E61V4kRXnN4DwYeK0DwCBydC1MqNI1PidyAtbtpsJlBBzK4icSctEcCQ1bGcLpBuETUQ==} dev: false + /randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /rc/1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -9590,9 +10775,25 @@ packages: test-value: 2.1.0 dev: true + /regenerate-unicode-properties/10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate/1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + /regenerator-runtime/0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: false + + /regenerator-transform/0.15.1: + resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} + dependencies: + '@babel/runtime': 7.20.13 + dev: true /regexp.prototype.flags/1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} @@ -9607,6 +10808,29 @@ packages: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} + /regexpu-core/5.2.2: + resolution: {integrity: sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.0 + regjsgen: 0.7.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsgen/0.7.1: + resolution: {integrity: sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==} + dev: true + + /regjsparser/0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + /rehype-autolink-headings/6.1.1: resolution: {integrity: sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA==} dependencies: @@ -9771,6 +10995,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + /requirejs-config-file/4.0.0: resolution: {integrity: sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==} engines: {node: '>=10.13.0'} @@ -9910,6 +11139,19 @@ packages: sprintf-js: 1.1.2 dev: false + /rollup-plugin-terser/7.0.2_rollup@2.79.1: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.18.6 + jest-worker: 26.6.2 + rollup: 2.79.1 + serialize-javascript: 4.0.0 + terser: 5.16.3 + dev: true + /rollup-plugin-visualizer/5.9.0: resolution: {integrity: sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==} engines: {node: '>=14'} @@ -10047,6 +11289,12 @@ packages: type-fest: 0.13.1 dev: false + /serialize-javascript/4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: true + /set-blocking/2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -10247,6 +11495,13 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + /source-map/0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -10260,6 +11515,13 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + /source-map/0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: true + /sourcemap-codec/1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead @@ -10395,6 +11657,19 @@ packages: strip-ansi: 7.0.1 dev: false + /string.prototype.matchall/4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.21.1 + get-intrinsic: 1.2.0 + has-symbols: 1.0.3 + internal-slot: 1.0.4 + regexp.prototype.flags: 1.4.3 + side-channel: 1.0.4 + dev: true + /string.prototype.trimend/1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: @@ -10435,7 +11710,6 @@ packages: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 - dev: false /strip-ansi/3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} @@ -10469,6 +11743,11 @@ packages: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} + /strip-comments/2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + dev: true + /strip-final-newline/2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -10594,8 +11873,6 @@ packages: resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==} engines: {node: '>=12.13.0'} hasBin: true - peerDependencies: - postcss: ^8.0.9 dependencies: arg: 5.0.2 chokidar: 3.5.3 @@ -10612,10 +11889,10 @@ packages: object-hash: 3.0.0 picocolors: 1.0.0 postcss: 8.4.21 - postcss-import: 14.1.0 - postcss-js: 4.0.0 - postcss-load-config: 3.1.4 - postcss-nested: 6.0.0 + postcss-import: 14.1.0_postcss@8.4.21 + postcss-js: 4.0.0_postcss@8.4.21 + postcss-load-config: 3.1.4_postcss@8.4.21 + postcss-nested: 6.0.0_postcss@8.4.21 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 @@ -10712,6 +11989,11 @@ packages: engines: {node: '>=4'} dev: true + /temp-dir/2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: true + /temp-path/1.0.0: resolution: {integrity: sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==} dev: true @@ -10727,6 +12009,27 @@ packages: uuid: 3.4.0 dev: true + /tempy/0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: true + + /terser/5.16.3: + resolution: {integrity: sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.2 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + /test-exclude/6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -10847,6 +12150,12 @@ packages: /tr46/0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + /tr46/1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.0 + dev: true + /tr46/2.1.0: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} engines: {node: '>=8'} @@ -10951,6 +12260,11 @@ packages: engines: {node: '>=10'} dev: false + /type-fest/0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + dev: true + /type-fest/0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} @@ -11079,6 +12393,11 @@ packages: engines: {node: '>=4'} dev: false + /unicode-canonical-property-names-ecmascript/2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + /unicode-match-property-ecmascript/1.0.4: resolution: {integrity: sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==} engines: {node: '>=4'} @@ -11087,16 +12406,34 @@ packages: unicode-property-aliases-ecmascript: 1.0.4 dev: false + /unicode-match-property-ecmascript/2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + /unicode-match-property-value-ecmascript/1.0.2: resolution: {integrity: sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==} engines: {node: '>=4'} dev: false + /unicode-match-property-value-ecmascript/2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + /unicode-property-aliases-ecmascript/1.0.4: resolution: {integrity: sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==} engines: {node: '>=4'} dev: false + /unicode-property-aliases-ecmascript/2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + /unified/10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: @@ -11121,6 +12458,13 @@ packages: imurmurhash: 0.1.4 dev: true + /unique-string/2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: true + /unist-builder/3.0.1: resolution: {integrity: sha512-gnpOw7DIpCA0vpr6NqdPvTWnlPTApCTRzr+38E6hCWx3rz/cjo83SsKIlS1Z+L5ttScQ2AwutNnb8+tAvpb6qQ==} dependencies: @@ -11212,6 +12556,11 @@ packages: resolution: {integrity: sha512-MmoCOrsS2gn3wLT2tT+hF56Q4V4kksIKn2LHrwAtX6umzQwQHDWSh1slMzH+0WuxTZ62s3w8/wsfIII1FQ7ACg==} dev: false + /upath/1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: true + /upath/2.0.1: resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} engines: {node: '>=4'} @@ -11339,6 +12688,24 @@ packages: replace-ext: 1.0.1 dev: false + /vite-plugin-pwa/0.14.1_workbox-window@6.5.4: + resolution: {integrity: sha512-5zx7yhQ8RTLwV71+GA9YsQQ63ALKG8XXIMqRJDdZkR8ZYftFcRgnzM7wOWmQZ/DATspyhPih5wCdcZnAIsM+mA==} + peerDependencies: + vite: ^3.1.0 || ^4.0.0 + workbox-window: ^6.5.4 + dependencies: + '@rollup/plugin-replace': 5.0.2_rollup@3.12.0 + debug: 4.3.4 + fast-glob: 3.2.12 + pretty-bytes: 6.1.0 + rollup: 3.12.0 + workbox-build: 6.5.4 + workbox-window: 6.5.4 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: true + /vite/3.2.5: resolution: {integrity: sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -11638,6 +13005,10 @@ packages: /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + /webidl-conversions/4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + /webidl-conversions/6.1.0: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} @@ -11672,6 +13043,14 @@ packages: tr46: 0.0.3 webidl-conversions: 3.0.1 + /whatwg-url/7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + /whatwg-url/8.7.0: resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} engines: {node: '>=10'} @@ -11758,6 +13137,152 @@ packages: typical: 2.6.1 dev: true + /workbox-background-sync/6.5.4: + resolution: {integrity: sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==} + dependencies: + idb: 7.1.1 + workbox-core: 6.5.4 + dev: true + + /workbox-broadcast-update/6.5.4: + resolution: {integrity: sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==} + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-build/6.5.4: + resolution: {integrity: sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==} + engines: {node: '>=10.0.0'} + dependencies: + '@apideck/better-ajv-errors': 0.3.6_ajv@8.12.0 + '@babel/core': 7.20.12 + '@babel/preset-env': 7.20.2_@babel+core@7.20.12 + '@babel/runtime': 7.20.13 + '@rollup/plugin-babel': 5.3.1_3dsfpkpoyvuuxyfgdbpn4j4uzm + '@rollup/plugin-node-resolve': 11.2.1_rollup@2.79.1 + '@rollup/plugin-replace': 2.4.2_rollup@2.79.1 + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.12.0 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.1 + rollup-plugin-terser: 7.0.2_rollup@2.79.1 + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 6.5.4 + workbox-broadcast-update: 6.5.4 + workbox-cacheable-response: 6.5.4 + workbox-core: 6.5.4 + workbox-expiration: 6.5.4 + workbox-google-analytics: 6.5.4 + workbox-navigation-preload: 6.5.4 + workbox-precaching: 6.5.4 + workbox-range-requests: 6.5.4 + workbox-recipes: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 + workbox-streams: 6.5.4 + workbox-sw: 6.5.4 + workbox-window: 6.5.4 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: true + + /workbox-cacheable-response/6.5.4: + resolution: {integrity: sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==} + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-core/6.5.4: + resolution: {integrity: sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==} + dev: true + + /workbox-expiration/6.5.4: + resolution: {integrity: sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==} + dependencies: + idb: 7.1.1 + workbox-core: 6.5.4 + dev: true + + /workbox-google-analytics/6.5.4: + resolution: {integrity: sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==} + dependencies: + workbox-background-sync: 6.5.4 + workbox-core: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 + dev: true + + /workbox-navigation-preload/6.5.4: + resolution: {integrity: sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==} + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-precaching/6.5.4: + resolution: {integrity: sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==} + dependencies: + workbox-core: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 + dev: true + + /workbox-range-requests/6.5.4: + resolution: {integrity: sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==} + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-recipes/6.5.4: + resolution: {integrity: sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==} + dependencies: + workbox-cacheable-response: 6.5.4 + workbox-core: 6.5.4 + workbox-expiration: 6.5.4 + workbox-precaching: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 + dev: true + + /workbox-routing/6.5.4: + resolution: {integrity: sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==} + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-strategies/6.5.4: + resolution: {integrity: sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==} + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-streams/6.5.4: + resolution: {integrity: sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==} + dependencies: + workbox-core: 6.5.4 + workbox-routing: 6.5.4 + dev: true + + /workbox-sw/6.5.4: + resolution: {integrity: sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==} + dev: true + + /workbox-window/6.5.4: + resolution: {integrity: sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==} + dependencies: + '@types/trusted-types': 2.0.2 + workbox-core: 6.5.4 + dev: true + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} diff --git a/website/README.md b/website/README.md index a180b92a9..e80871994 100644 --- a/website/README.md +++ b/website/README.md @@ -19,6 +19,13 @@ npm run build # <- builds repl + tutorial to ../docs npm run preview # <- test static build ``` +## Generate PWA icons + +```sh +cd website/public +npx pwa-asset-generator icon.png icons +``` + # Standard Readme of Astro Starter Kit: Docs Site ```bash diff --git a/website/astro.config.mjs b/website/astro.config.mjs index ccc169dc4..aa0f185e6 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -9,6 +9,7 @@ import rehypeSlug from 'rehype-slug'; import rehypeAutolinkHeadings from 'rehype-autolink-headings'; import tailwind from '@astrojs/tailwind'; +import AstroPWA from '@vite-pwa/astro'; // import { visualizer } from 'rollup-plugin-visualizer'; const options = { @@ -29,6 +30,45 @@ export default defineConfig({ react(), mdx(options), tailwind(), + AstroPWA({ + devOptions: { + enabled: true, + }, + manifest: { + includeAssets: ['favicon.ico', 'icons/apple-icon-180.png', 'favicon.svg'], + name: 'Strudel REPL', + short_name: 'Strudel', + description: + 'Strudel is a music live coding environment for the browser, porting the TidalCycles pattern language to JavaScript.', + theme_color: '#222222', + icons: [ + { + src: 'icons/manifest-icon-192.maskable.png', + sizes: '192x192', + type: 'image/png', + purpose: 'any', + }, + { + src: 'icons/manifest-icon-192.maskable.png', + sizes: '192x192', + type: 'image/png', + purpose: 'maskable', + }, + { + src: 'icons/manifest-icon-512.maskable.png', + sizes: '512x512', + type: 'image/png', + purpose: 'any', + }, + { + src: 'icons/manifest-icon-512.maskable.png', + sizes: '512x512', + type: 'image/png', + purpose: 'maskable', + }, + ], + }, + }), ], site: `https://strudel.tidalcycles.org`, base: '/', diff --git a/website/package.json b/website/package.json index 596925e53..b07c9f0f1 100644 --- a/website/package.json +++ b/website/package.json @@ -39,6 +39,7 @@ "@types/react": "^18.0.26", "@types/react-dom": "^18.0.9", "astro": "^1.7.2", + "canvas": "^2.11.0", "fraction.js": "^4.2.0", "nanoid": "^4.0.0", "preact": "^10.7.3", @@ -47,10 +48,12 @@ "rehype-autolink-headings": "^6.1.1", "rehype-slug": "^5.0.1", "remark-toc": "^8.0.1", - "tailwindcss": "^3.2.4", - "canvas": "^2.11.0" + "tailwindcss": "^3.2.4" }, "devDependencies": { - "html-escaper": "^3.0.3" + "@vite-pwa/astro": "^0.0.1", + "html-escaper": "^3.0.3", + "vite-plugin-pwa": "^0.14.1", + "workbox-window": "^6.5.4" } } diff --git a/website/public/icon.png b/website/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8b6902288b74c63b2235daf424b02faa1d5abc GIT binary patch literal 35958 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 PKwOus94)J{e#HL)+`H|K literal 0 HcmV?d00001 diff --git a/website/public/icons/apple-icon-180.png b/website/public/icons/apple-icon-180.png new file mode 100644 index 0000000000000000000000000000000000000000..f261df914071cf237ca9c1143da4ee2258267a48 GIT binary patch literal 11375 zcmb`NRZtvV)UHVa1Pvq*f)m``f(HriE`tSv4GzI25ZoEu-Q5{n!r(ALhT!h*I`GeT zd8*FEU#Cu0%T4#*y?3u#@;)nERapibgBSw|2?<+HR!SXlZ~X5>Lq%Lg#!1^*%-Z{5kh`cg%HiUWj{9sC_{J zD9M3Ug>6bZWVDxnG-`}Yf{V47gMFA_H_w4g)I7&mIdGtRBu_kU<>uCA>E>lwJb6%k zP=3;;YaXvicj+}51`QqBQX4p_{>`Fo(Jl7NoR*o0$mf1?*LNeFK3hf?$clnO9Vonq zj*ovt8=Q+N9U%clq5ej>7Z{(9>)I=;hSp|M$bf9fp^hKOM#zXE{wWIofBD#oAGXit zMaCnqYcHDP)BdO1A4`1_|NGbfFSFD+%)8}ySE7tHJILa0UOt81mwPoU( zA1IV;SKcIuue^D<-ui(yCFAk&OddB%k^|KbJ8vZSHSPfRr5Yo$ub6J+K;W!$VdqEN zLkwF$$O&s0Nu12D=c7C~Vf8hgx*}_a$-aNqr8yFbIO3{r_bG#rrA(Jk6C|KHA+!G) zv6l`0!DOIq7+HsLmA_+d*HC!OS#SS7qn$jVpy80rJnF(s?a#BU4_z$ zWe(2Xlegb{F;LfI@te z4Eo-keKA|NGQ>uazn)AeEYVY3IZW?}h z!Wi>^tClXfrzfHf^rKJ{y9d|JX z3DJ_Zf@oVo>vE#&cky&g=Qofqc@CVo(aSzG$PDP}f$Xe#r$HiG4P((nI}q$^5Z-;Z z%>=P79EH!W_tJkZ-0KgafVctB1TJ#q{j!*?Z(*1F5#7F0Zl!&@uAUNllK`86>FIyP zXzw20pHpvJRH;PXCmwVt2eBB3P0*#CVvZ_&oWd zWd7xu;kSrWRBA43V~r{MOK*1gy#BvEbhZ_BpVmq%SDNIk2vDCo21^r^OS^eSKDpij z-S;eM*)-ne7&69Ns2^tzRrpi9IHiCrN2hzp026d{Qd7fb#nb9vcj|viY*;IjS?1P* z6V1;G1iHL%N|ejA%c|fO(C$?p<`W&q-kP^A^=vOj%&|Wg=o){U@a_}@Q0nZ>p^coc#k z%@j<_QdkCyu`J(N$0*tK`7Rm4P}2>25tCU+I+qk#$pkK;1=T8QvF^t1WC|3fRW7{E z4&_YF&MJIr>W<}iBRwbl)@h6~DI)=e*&Icm_9eaC#`7yx23x3{S$^`Zt|}jA_$I(1 zER^GN5@wPA{aloGas>+zK?+ig+j?#Hc_MeKf#?`bII_mEtM18MLC8@}KOXPayG1ye zp9X?aSgSaPH8}=kBOOJjaHLGLNIp8NQS)AR_&l?zV6(t3j?+DA$|~i)w$S|#kF!MJ z>C87LRvTaWdvbXFy3nL0X$F_9)9K`|hT>%@$96_=GnJmTf?yrZaO>bM`5LnVZDUjt zwu@PEK|*?2dLHqOuYKJ|$fZbXwL$S=`sE>!jyvLqGULGt3g128Z6U`N!NT_j@|&y|beP}yP(hKv(;jHjU{09jb-)i($XV4T zlr{t{|si^EO}TypK^N?D7=dJ`3vH9d99l>3elzwVy4{bf0;{xuYIcO!M6P^^Z1k zz=cmT6cIS~%qv|db`f^v7Wc6G#Il8x?_Kk8PXnQ%qpaY4%il%B#Kpjnvh*VT`k9qwX19jFT5`X{%zNS(8fq@oL=m;%m0Wxn=^JmltdAd~c}43KDvR z_&bzx^e{%}a@@Xm8Q?GU6fH)ac9LAN7DSR!WOE4n3tRfhYhW~I1IH$aFfu1uf*<|Z z1DawG=IG>YICX?Rr5Lvpw*$Ja-hzJ{sFUj-Ey+6Ey!E|PM`F(!8Fub9_S@Q7J(4r( zKDs1fFOEtQgD;>_o(ZGNCEV?(lx9C>4Yqw*0*2^7VQnt{okb!<_GOILuFdu>GW6Ib zJ8mtG{3IX>-!+E_@RmW>jphirARX#b-4i+rnvJ26M}`HS+8saXy+Lc4HN*hiIh5Pn zU0A!Lx!2ycd&wZaFrH)=vZSw5*}*8lUE;Z~332shhQMb_xY9*>w`q4D*?DOlj4nO4 z0XJ#Yp}4PCbqW=_bDbY_-i!ZGsoodo=m=CM{+F@3+<*)(DyCT^9l4mvBW;QlvStNz z6z$O%obT0S%6XcK|NhnDz~JXKKrfFn3q4EX7SQ08Ol$+hDq@!Bjqa*W)lX@6c#fNO zG7~YAD34jOkxqBi=7JqHFIQM&Dg5^w+IXzlJp9$_{^C9De8M}RGeKL|E=#8X6Y2pZms^`jU`UQT+}UY0ZDz?})KrHI~$=AXrbZpw^v>IT7IpLTd~t zDqirh7jVRsVKnVz_Bei%Lz9ALdOy)1&|sEMVdzZR^X2Ed5N4uJFZUqAlUR)eY^`>% zwoa=rSu?J5ncf|wWqwlGLHM$UsSg0a5=NOGa-`Dmq}atBEZFDrF+rWssoJ&Cg`!2+v*V$FBN{_Mt}6*vFXMgR4W zvXHo~&$yMY6^gJnpKZm7V6${>6=($Vc=l(0N-*PjBne2_T&@0h)5$muit9sl1W0vt z7KZ>}pw*L{`?l`*c*$PAab3fo0*Mhtn|`k_xXH~5zPFCYL(u*tnCf~Ofw4ZsxQ5XXaDYI5|hF>MkwUNJC#4AIm(Rp z#6>KDSZ3{TpLgQvdg|DDZ?~bU=$W;P@!#u+>KFUm{icpQY#%V8$24iJ%#RN4h4^R{ zlq4q!tdjIr8Ma?9e~XZ5AaR?a1`KSlY+gtYrGc-q4VsX4Q5y}rf>GF5XVFE5pEUnS z&7M(oB-S^^Pb<@8{VPcD=x_mIv3QJp@Cd1|VMIxXa^Fp@c`JuIy;DO~0Ou!ou-GA2 zHsduLd^gr3u;5|Ons6VhB2#D^oUO`ZjArP?_2P^2AWe48#`n)WAnyZMxu4*Yo-Uye=A zS+2NfbeZFWF;OKiL%cdB_BGcn4ZMA~@4AWUlns?I!#1O2`{+G9EwC8|`a!H2hBX)p z^AE|xYYdsqIUR-4Qe=x&gJ&Jlp+Jj+=OrF=`v;xDaF@LakFvR@J|1@#+oI(m!s1=ePC%BsdRnqRdyMig1$@_Rx7*z z9V)LYv8sBJ#cp`POS_8eF)iVyZ0a zlgifZ)~_S!YF^Lczouk|p91}abukZ5Pk=?#D!p^rBUaxWOR8Q4G)Dld1U?*d=2UVT zjh1S@7Ir8hp$ftS)$lZdEc}@0_ya8_Oa7u;UA^`Sry8dP$J3;_unM9twYxqxZqIj4 ze*9Xk0U1dzz)S!1iN^)+)&lh;q$&B!1Qas$BO0^ZlhLJ$Z z`DH9#x*C}MQ?Ii-$cVt1$IwhLh9Tu+5h!-o6KjH z*Ob{5_d}p6nq1$&o`+denatmIzu<8IinefoKh?=DS4%R{)^|^B2N@C2In~rVy(eU@ zl_fqWtZE!_EgNtJe{1@rflkTddDj)X%UDQiTW|`xWpR7F?Wxxv={0dTx6JgcsfB@P zh_c+GV9C+{Hh<4@`W+8#ii9*#U`6Nt{kv(6UWZL<>c{oHJlVOO=;GWaNqg%};F1T+ zEuHlrv&7Dz@Y;U!G9})qv!tF&+OAXN>cpj4R?j6};INC*jDj2p%Z#Or005|tALT5@ zp%8%HAEWeB?{&;gw)=FTy_)^%V$nSKWd0{wI*Hkx30~zSZXsMhQ;?($o=?j=kr~rU zj|wGw{SiDALXYkf`}s^Y`v?;tOdeoBZ(fDHY$WlaL?|Y@vmLOx;FV@(8KYJed;H>a zleYf;>J|0FJ-G_S0f*SUSrM6Y$;YWEAFnc*Y7__)-xM*4^+)3!&8MLB)q)NBL`~^j z_1zbyv&65A;fYh*YO(?NCx>5;-c)q;e*-g*n6~(zM9vXM@}Ziscoq+HDP=o+3yliC z&Ym0);xUe!}`?m7T>MZRiuwC`jQB_NgbRd<>zsLVwZK(ar3C7~ zDJ+`)#X6hXR*l!FnBblU&HhAi9lp>UEq|c$QQgWam%|{rTCuFltjdgk<4{;rvVF%- z$93qFTntO5=vmx`5hqWeGy|a!3W;~d(hCjeKen7o3q?(C<%ugOt5dG z{txQ{sp8XBtyxUtf5&nr0KuUWeNpxgqEg+X3&8kp@Y zinmsSC$e+n(!us^S{9~4YM^+F6WRGsMxIIY)Pv+Ne{R$0h2FXGOZ2VR;21WViM@X< zG0CMd>ak;$;gDspzO>FqD`p9N`xgXM5|aNa&(?9pYxD$ZQCrzF99;jv^Vx235A1lDd)7$gPsct9RfZXz1JBD=!Bjm~S|Max^;V>ff~#o3tsojrjU zDb$UImz1fKJ>h9%8q&Y|fNE6b2Gv;937M35Lq#YFxbuxFUrG3-;mDpHXqKckGvJRL zDTdtOzsrS_o`>HUDJQ1jw^fr%;U95zHq{x>d8JaD@=_yXzj|KCl^KYN``Uk9C#+)f z{U9UcU!VRe4qgAsola`x3n58#_9$ORAgZ}1=%V2TJ)U2s1<&lHT2uFIn58=g{PZ^U z?mTna2Y}U-8;pCGP(t{!HQ#$1H2}cvgS)$Rvy6>l2+P} zClY@g0neE0Yw}}lsq~%TTCq2jJr13cUiUbh_f~f^)Rb0~$h~6%bY17SXuI9g_&~mN z!-Zq3LA|y>@ArJ62CMXjPs5!_b|G=`xIDjbKR6r_ZW_O^muAB4DzU=77!RZ0E!!(* zXN)(vp%@@4rtqN^xY&?>OUQFIA6FoG?i15B`xE&rJDg0=Ef8QJc$~W96{<{6H+s=k z8~TXTl7dFbFwAy7@Pd=!Ci?g`+eBI!iY8u-BIawEblPpaV`GM8_Z28vlK};s*4O=A z#&-*lln=1&lB~blQ8iA9$8%jeyx8@>2<^CE=%(fuja)A1XmA6~mMRy2gy@34Sa$v` z0xljy}x02tFi@og(g#*dCB~wPvt@ng?qbZ(%EBC{(xII!$QHdaB{q6qi z57)V)ww}L-o!_buA_B9LOCrc4n+DBSXIWNG2l}JYc~uOr2)WrazVc^+$-$Vo%5EMZ z5khkUU+s`|oWuQt|E8CDq4*nMTiSgbFPxB8FMvg-QW*RY-pem!PAF=klmm!$e?DVK zdGplc?L*t1jVny@-WYB~x%c~z{%DrLoaeF13z0M;i!1o>(2k~N^1iWw>C+sOCOmat zJ@UL(a$e;;Xwg~`lu0ujKh=bF^9DzSF>zPk-7cwyj5QDE!Oz{HGsf@PT}@K=2_c)= zHSQc!yu`sCh+m6}kGWItS^Q|z3(pn$HXoaY)~*;rHewWk3%g(Rb;1m&keqW@@iAWa zwrMyWDGf7V442Q?ie@gQHvY1=FU%pyZUtnmP-tnrYsfLF`X(p0--RslHI6uk=X_rF z0MM^`OKrhKq8McOI*Bs)n=S|Bb0eh!<-tp1;+iM9k?~r&G0DU9$gb%8#wP}x`X&YB zP-CCIT`zXTxLLbTdn(UiEa9)ve1qvJXg#Q{EwvU%J|=Q#cBDq+s9u|m7)cC|p8YtH zVgtPT)4Sp9g3QQQ5%G>G@*Pt&Q&VT=Ndmn+WzX$LxkI{C(iumxSz??2{)+E0(;Qo8 z%YCOj;ZeLSpg-45yC_Qw7cS@`Z#7~hJsVqk|6WTBqGRy-Q!8DvMGDPB)kUlFT2~F4 z1WpmEHhdVjMI8gL%IuO*4ejCFG-_umLu}w?S~}Q~zzZ`H{|n_i{j%#vkSw?XvjWKf z3euYH0zt#dfBDBs=Tb1FMkAP;rnwCKj;5(RpiugN{)3(F3b3t83kU}=VyR;_FSAOt z4#}tQxVEFKV+2B}v3!J$^B%IeaOBt2F^0UWv4`R~X97=bc@PUJ7$59Xmt{OJH0{Xb z)Ke-;axTxKQ$;l<65d8GIyr!pKL*0!Y?|QrR@4B?a=YW`grz2PmszQgWd!CBOA&Nk z6@cbfjNkM;**tel^l?OaBMjdA#f$lcE4J+xQM55!8w`t$OQw5xLF5v)-?Yf-`BX5( z#q86WM{O&sY(?2nK!}Xr66Yr&^RBElzk-b~!E?zK>QYz07poS&JwVcS;1`#1j*R$8 zFZ$dB2KD3ko%+>V%ZA973T9RpNFe!i5#M!fWVh1N?^F*`AtxOmZ69>iR^qC)7Dg(I z87K3j6vcNJh7I~6VUk9|?{i!hgxB!UMXW4}CS)K{Yxnl=210-1QJi%q2m_pUFC`7x z-S`l9{&L%TZ&|)ttrU0gYnH);H@zo?Xwx)hSUt3yLXB8TD+tdWSRjM@pjpvNe^nboH|P2I>g0UPIIM2JOl5NQ_u z&BM20U+n^PSiY0Ik^J~6r=dOPdpG{zEIJ~+WDN{ordixmKOvwfjhkxoEjl|#H;E*( zl^xG0zv#|P=FXh4;_VXCDa!9`23l)|`;cK9NS|vEXDtl9wO-xKlltiKG>`!&{30&N zD)2mav@D#K$tV!lB$_rtyam492z@e8`@i}x?CNH)qL9wpUwTFaQw>> zO4_lQqOlp0Mzetpue5D9*@jQK(G`y!@h}hIHjhiv&v!a=h%enuzm^WIJLl>;JqAB= z?){K0!>Y%hblu!~G zD@}1>3RuCyX0mSCxgkm`mH0Z(Pnr`Uz(wwIuN)n#ZSyA$c!jr3%f=u3H;Sf&j{hu) zc9dsXS<$z$qeR;ax>&23CQ)iK3GoGB73Eg(k|yh*Q8?Z}`n+TuuVXeWBteVB*-Un* zvkwIhqW<1P4v&3e(;!8Kg>ak<`ec^u#zY?_0jTC1M5+P6-c?to9U^M&%qbRA=>_+b z6<07)u*~XNhyLo(?@fXb$|YZp<-L=az%L4-&EZ%gnKN0lCw%k#XE@LHk3eFea>2V2 zdJ-Jhiblb%%37>wd1xwm?5j} zc;Vcrf8+m2!UA@ymZv}8qY-6>$0s$)T9=}xgX@CK@Hns4LlSdXY#B|Ov$@o)&tTC` z)%;9IgojQ}VCh^eOG|IGS5Ao^kiB;mEcM<^^)p}OQBW}HQJ$Tyy7Lh{UqlR&P~2y9 z)z#n!&=c0skYMSb9eU5}BYb)3ZH`;0)U9B) zHfmbtgPd&Z2W>_2w5L2SRvZg(t0iF#gZf+2wXH_daskbt$kCt06-3iXV@+1vs72%= ziI$HiA?4(KBpLo&=kEg7@fw>-U9Y>U8c^(OF#X)dSL>h^iNea0KLtb<3kY_E0GL2Z zeq2ka5{-n1RYQ?0ZI<`CH{|-{q@6hFt0e0(sU@!eNzq7?%^@mJ+p9y791Dj`gcwtO z^M!AI8=7j`LemR6#YkH|k(a=a7%%n1kG1K6L%J zCw|zaDb7Y;x_WQ*d2vt1>s!?}`T%cN7u)rz_0rAI8FHR(`a|vCr6Q!VU&9-ZqSf}S zEOtjeZk^_cw7I^&(@N&-la9|y`+nXrjG|%3JE-eNW#UxQoUOJ#r)LY4sx3s> z!auSl{kb;LN3t`MTTQtviEG3UqC0n_WF@@IT;dg#;*!V%ccid7{&1xb@D+nkL*>#h#3+$Tziv>U ze#^}T%MMFz>AN4-Ze)q`0qyvwPwD2K(LzcbXrishoQC`zt_LdsnQaB*esGQG# zFmynF_xG(AdO4Sj$K604)*LpWpg87NEsLL*A$Zd%5u2T18~AEigYK?A0|(82bH;ATFmT7EWpQbWQomoHRMkJ^y1Q6X?>x&u)+iyj z$)pcQgs?M-krMx;y92TA8bdD1wE;W<1rm_B*GV2)ObAO5k0tEvA zSO4|`6h3@F(3H*J-z=*v4?^ZS`!&ZeiZleW$K+gOoyF55m0C<|1rVg{9ZOdrODM1c zgp=|y#lf2f?)ZJJH)V2*l(_pgF|4V!l?^;km})<&NxQk%SaEU1fsntZGL86qNyOx~ z_g78uZE~ zV-ztu;7hX0eltQ3l447tnpi`SvIVf!T6x0SNOy>cdG%2k znD-I=`N%it`Xu?MsA$^7Qs9915RE^O)hQEHOzgiST%@roJp>m)xojoW7ssSz%<)Qs zO|kF&#ABL0Yxu^xHt(s#Tif9#U{baDwD13D-%}=(j!>gXGnN(t-3H6nwkl0c7jS<- zBWOrOdcAa@d$O>0kkJO!XUMyEQ2TMSOOwh#d6TqCqMd^fuv5S7vO4pkp@vCxa1wSe zFy)PXvQyEPN%rGUh25 z>9BSk`|M93-OjYnCAC4IL%dN&bi+?_FMWW^MNFe*%kwY|v(*j^^JF z9|?wB!nnox1MI2z3K-XX_VkCrl(adIBdZh69*-d#O$ws-7VpBhhk_88`$tp~#md~Q z{xsm!RBa~b#jp=-N#RvVAD>6ic*Z=FeIKi9>=|oMe=_IU)ooz8*Iy%?;d~Po>9J%Z z>s5w#bFDS-mvMZUX#6PEwBBafVvMas19{DR%{$qP=tOSx5ewCmFfBw{27!Z}@0$mm z6}}&T=7u_ZDPJaW&s(&fnhv=rwSP3NDstT*(Ny+(%p3GlfA5wvQMuaswBv{6jRV`d zVuN#5bw915`}E#PZ3plXqn7AsFDj2A0J~SX&>Vem5vguDrQ#e90>jGCAzDEOG<<=N zL?vpX`@G|8KMg=6K(?p3Be}Nle|2Vh>_mw8ySb#MluPcXqY9L)n59;7);#7&sCjPj zFdKYVDL8#zV!V{%6lw%TqEoTzx)B2bUR(mda`G8@?&&+pp;9bqcXaRlJ;DG1t{%f3 zqO~rtr+@Zq&T?rrL?s!zN;2+F+4>8CZ4^(aN2FF?l9%S=D&1)0niok~^DG5K?d~A+ zGR%`ERRdOse=>K54oEe+FILwPXtnj#Z5aH+m1;Zbn;?u*v6s2OS&N0yIMyvx2WH!$ zf?tUr&iVp((#+DYtJjnj>Zd@JO|;R~pXCjU3JtJ_s~|TyuG)(ULU8jG((OL?1-}KK zr47e?8@*Imrf8u6pQi)isW?J1FClA(ku*upbYJCAw5HxB#MeThVmNah(wp8dNO-)e z+26l+L>=gmc-=W=dB*{FsVd#Gyb&D`dMm0l^PTb0Z^h9R=0owg1uSE&b|B+B8|P{X zG4+bm3wwD@uRd~|U%!B+`uMZMa1Ga;m*|J53~W1|asDp5Cg%e3H+w{V~pThs4!<$-6e6ajR0otE23}-~6RGrnM>%KSE5QJCc zzP?yONL0`T#|pSk0ul*g8n zeSg|sr5C<>oz?Q<;A$DpATI}s`g~QU`MSfd6Du@aTrJgzol*%v4?xnC-9B>A5V;j9 zJvi!BzCa?hM))vX@#vAX)3wRWg6rv*G}n8(sK0;IH4#?D;NUol6ln^pXwe zxA-m})6qCJZwk~44*vV}!ncjreFd%?a_0t#UY+PF62CWoq3mQ{r8R&f9l^@Saqz|0 z9BwG^Rb=rf+>b`WzbLs((a?`ykO>{-^N8=?&6SD5GdvPXLN*jl>gq0r(9Biye0Jv0 zV!IT54%zp*ZbSEO?0P^&=`6GGcUrGkZ_yRVyK2b&&6F?+79Hj?<7tQl`3>v`npYXW zT)l4E^-nRmc~Z@RtuTwq5Ih*UPEoZz_s>m^GBCIW z*DuNBgsAVnMqTiMtDfsps`VR=B;}qjL?2UdfW{8A-4a&)L^73h3*eu9?Ae#MeY|C> zsXLzj4fy#!N<;M8j;X{Sh1U&h{n$=v?{_Yu&>jT2>txLu`9*g8#KhyTvnI))7q(it z^rgnyg2Om3XhXs_y@XrrH0q>vd!Gjr(^fe8Khfzm{So Nxo^r+)eyWIX@? literal 0 HcmV?d00001 diff --git a/website/public/icons/manifest-icon-192.maskable.png b/website/public/icons/manifest-icon-192.maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..119b15c8165032a4cc2af3b806a98733c5b3d356 GIT binary patch literal 12638 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 RATCS*6h5iQ)JmCz{vWWYt`YzM literal 0 HcmV?d00001 diff --git a/website/public/icons/manifest-icon-512.maskable.png b/website/public/icons/manifest-icon-512.maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea1c331128f232a06643f0c868ae595e0c0181a GIT binary patch literal 45307 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 literal 0 HcmV?d00001 diff --git a/website/src/components/HeadCommon.astro b/website/src/components/HeadCommon.astro index ba6e751cc..ce00f97e2 100644 --- a/website/src/components/HeadCommon.astro +++ b/website/src/components/HeadCommon.astro @@ -1,4 +1,5 @@ --- +import { pwaInfo } from 'virtual:pwa-info'; import '../styles/index.css'; const { BASE_URL } = import.meta.env; @@ -12,7 +13,18 @@ const base = BASE_URL; + + + + + + + +{pwaInfo && } diff --git a/website/src/env.d.ts b/website/src/env.d.ts index f964fe0cf..8959d4d6f 100644 --- a/website/src/env.d.ts +++ b/website/src/env.d.ts @@ -1 +1,3 @@ /// +/// +/// diff --git a/website/src/layouts/MainLayout.astro b/website/src/layouts/MainLayout.astro index 3d93f4363..84eb320b2 100644 --- a/website/src/layouts/MainLayout.astro +++ b/website/src/layouts/MainLayout.astro @@ -22,7 +22,7 @@ const currentFile = `src/pages${currentPage.replace(/\/$/, '')}.mdx`; const githubEditUrl = `${CONFIG.GITHUB_EDIT_URL}/${currentFile}`; --- - + diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro index f22f55692..fd6f96c16 100644 --- a/website/src/pages/index.astro +++ b/website/src/pages/index.astro @@ -3,7 +3,7 @@ import HeadCommon from '../components/HeadCommon.astro'; import { Repl } from '../repl/Repl.jsx'; --- - + Strudel REPL diff --git a/website/src/pwa.ts b/website/src/pwa.ts new file mode 100644 index 000000000..18ef9a05c --- /dev/null +++ b/website/src/pwa.ts @@ -0,0 +1,11 @@ +import { registerSW } from 'virtual:pwa-register' + +registerSW({ + immediate: true, + onRegisteredSW(swScriptUrl) { + // console.log('SW registered: ', swScriptUrl) + }, + onOfflineReady() { + // console.log('PWA application ready to work offline') + }, +}) diff --git a/website/src/repl/Footer.jsx b/website/src/repl/Footer.jsx index 49da64af8..31468e819 100644 --- a/website/src/repl/Footer.jsx +++ b/website/src/repl/Footer.jsx @@ -76,7 +76,7 @@ export function Footer({ context }) { {activeFooter !== '' && ( - )} diff --git a/website/tsconfig.json b/website/tsconfig.json index efb484fc1..78017eafe 100644 --- a/website/tsconfig.json +++ b/website/tsconfig.json @@ -3,6 +3,10 @@ "compilerOptions": { "jsx": "react-jsx", "skipLibCheck": true, - "jsxImportSource": "react" + "jsxImportSource": "react", + "noImplicitAny": false, + "types": [ + "vite-plugin-pwa/client" + ] } } \ No newline at end of file From 44ef372399952c828f89137815b733bdf5339e3d Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Mon, 6 Feb 2023 21:05:28 +0100 Subject: [PATCH 22/24] update og meta data --- website/src/config.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/website/src/config.ts b/website/src/config.ts index 8d4d364e0..6fe760520 100644 --- a/website/src/config.ts +++ b/website/src/config.ts @@ -1,16 +1,14 @@ export const SITE = { - title: 'Strudel Docs', - description: 'Documentation for the Strudel Live Coding Language', - defaultLanguage: 'en_US', + title: 'Strudel', + description: 'Strudel is a music live coding editor that brings TidalCycles to the browser.', + defaultLanguage: 'en', }; export const OPEN_GRAPH = { image: { - src: 'https://github.com/withastro/astro/blob/main/assets/social/banner-minimal.png?raw=true', - alt: - 'astro logo on a starry expanse of space,' + ' with a purple saturn-like planet floating in the right foreground', + src: 'https://strudel.tidalcycles.org/icon.png', + alt: 'Strudel Logo', }, - twitter: 'astrodotbuild', }; // This is the type of the frontmatter you put in the docs markdown files. From 3d27a5f8c74e98526e6126775c026985aa951326 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Mon, 6 Feb 2023 21:06:33 +0100 Subject: [PATCH 23/24] format --- website/src/pwa.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/src/pwa.ts b/website/src/pwa.ts index 18ef9a05c..e86ddf3f1 100644 --- a/website/src/pwa.ts +++ b/website/src/pwa.ts @@ -1,4 +1,4 @@ -import { registerSW } from 'virtual:pwa-register' +import { registerSW } from 'virtual:pwa-register'; registerSW({ immediate: true, @@ -8,4 +8,4 @@ registerSW({ onOfflineReady() { // console.log('PWA application ready to work offline') }, -}) +}); From 6a5d849b3c8e4f7dfb701781a096c72a66438c07 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Tue, 7 Feb 2023 21:50:08 +0100 Subject: [PATCH 24/24] add caching strategy for missing file types + cache all samples loaded from github --- website/astro.config.mjs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/website/astro.config.mjs b/website/astro.config.mjs index aa0f185e6..646a3b3ca 100644 --- a/website/astro.config.mjs +++ b/website/astro.config.mjs @@ -31,6 +31,27 @@ export default defineConfig({ mdx(options), tailwind(), AstroPWA({ + registerType: 'autoUpdate', + injectRegister: 'auto', + workbox: { + globPatterns: ['**/*.{js,css,html,ico,png,svg,json,wav,mp3,ogg}'], + runtimeCaching: [ + { + urlPattern: /^https:\/\/raw\.githubusercontent\.com\/.*/i, + handler: 'CacheFirst', + options: { + cacheName: 'github-files', + expiration: { + maxEntries: 200, + maxAgeSeconds: 60 * 60 * 24 * 30, // <== 14 days + }, + cacheableResponse: { + statuses: [0, 200], + }, + }, + }, + ], + }, devOptions: { enabled: true, },