diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..2d30933e --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.png diff=image diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 00000000..480e7fd2 --- /dev/null +++ b/.gitconfig @@ -0,0 +1,2 @@ +[diff "image"] + command = sh tools/imgdiff.sh diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1e773c27..e79c6bc5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -9,15 +9,15 @@ jobs: lint: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: '20.x' + node-version: '22.x' - name: Install dependencies run: npm install - name: Lint @@ -27,15 +27,15 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: '20.x' + node-version: '22.x' - name: Install d2 document generator run: curl -fsSL https://d2lang.com/install.sh | sh -s -- - name: Install dependencies diff --git a/doc/visualizer-in-depth.md b/doc/visualizer-in-depth.md index 655ec101..f5188dd4 100644 --- a/doc/visualizer-in-depth.md +++ b/doc/visualizer-in-depth.md @@ -344,7 +344,7 @@ Make sure you do fill them all in -- if you attempt to draw with an Any time a parameter value is assigned into its corresponding property in your Visualizer object, the `parametersChanged()` method of your Visualizer is -called with a list of the parameter name(s) that changed. The default +called with a Set of the parameter name(s) that changed. The default implementation of this method in the P5Visualizer base class resets the display of the visualizer so that it re-runs from the beginning. So you likely do not need to modify that behavior. However, there could be a specialized diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts index 6e22ad77..60cfcbbc 100644 --- a/e2e/playwright.config.ts +++ b/e2e/playwright.config.ts @@ -12,8 +12,8 @@ export const baseConfiguration = { /* Run tests in files in parallel */ fullyParallel: false, forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, + /* Retry more on CI */ + retries: process.env.CI ? 2 : 1, /* Opt out of parallel tests on CI. */ workers: process.env.CI ? 1 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-chromium-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-chromium-linux.png index 4bfbbcc9..efd72382 100644 Binary files a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-chromium-linux.png and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-firefox-linux.png b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-firefox-linux.png index 880db390..7a2a95f0 100644 Binary files a/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-firefox-linux.png and b/e2e/tests/ci_snaps/featured.spec.ts-snapshots/TauManyPrimes-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png index 6fd0f6cf..3d23fba6 100644 Binary files a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png and b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png index 6b120fa0..6d41edc4 100644 Binary files a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png and b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png index 87f101e5..0626f837 100644 Binary files a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png and b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png index 123f21e6..2d7b9af2 100644 Binary files a/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png and b/e2e/tests/ci_snaps/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-chromium-linux.png index f2ed5bed..dd6a9ade 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-chromium-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-firefox-linux.png index 9fe583fa..bd4aa0bc 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-firefox-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA001489-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-chromium-linux.png index 7e1c4271..d5437a6f 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-chromium-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-firefox-linux.png index 4f208230..cb9e715e 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-firefox-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA086677-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-chromium-linux.png index c2da32f3..366fb6cb 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-chromium-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-firefox-linux.png index c837476b..5c66975d 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-firefox-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/DifferencesA202319-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-chromium-linux.png index d3c1f928..88680a93 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-chromium-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-firefox-linux.png index 927ddb93..a9b198ee 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-firefox-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA001489-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-chromium-linux.png index 5bc17d87..0bf4378e 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-chromium-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-firefox-linux.png index 329aab7c..9749d714 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-firefox-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA134028-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-chromium-linux.png index 4089a413..16e3346f 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-chromium-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-firefox-linux.png index 8c03364a..7cc5e088 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-firefox-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA202319-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-chromium-linux.png index 3e0b3c25..44e50082 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-chromium-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-firefox-linux.png index f0dc5d7e..e409692b 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-firefox-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/FactorFenceA241298-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-chromium-linux.png index bb77f858..cff1a996 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-chromium-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-firefox-linux.png index d642ed82..047da2b4 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-firefox-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA001220-firefox-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-chromium-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-chromium-linux.png index 7430cd18..906fb935 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-chromium-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-chromium-linux.png differ diff --git a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-firefox-linux.png b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-firefox-linux.png index 0cfe4224..e4214f9d 100644 Binary files a/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-firefox-linux.png and b/e2e/tests/ci_snaps/transversal.spec.ts-snapshots/ShowFactorsA086677-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts b/e2e/tests/featured.spec.ts index 934291b9..04b0cb77 100644 --- a/e2e/tests/featured.spec.ts +++ b/e2e/tests/featured.spec.ts @@ -15,7 +15,9 @@ test.describe('Featured gallery images', () => { details.tag = '@webGL' } test(featProps.name, details, async ({page, browserName}) => { - const short = featProps.name.replaceAll(' ', '') + const short = encodeURIComponent( + featProps.name.replaceAll(' ', '') + ) const testURL = `/?frames=64&randomSeed=${short}&${feature.query}` await page.goto(testURL) await expect( @@ -23,7 +25,7 @@ test.describe('Featured gallery images', () => { ).toHaveId('pause-button', {timeout: 30000}) const matchParams = browserName === 'firefox' && details.tag === '@webGL' - ? {maxDiffPixelRatio: 0.02} + ? {maxDiffPixelRatio: 0.01} : {} expect( await page.locator('#canvas-container').screenshot() diff --git a/e2e/tests/featured.spec.ts-snapshots/BeattyDNA-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/BeattyDNA-chromium-linux.png index 24d9f672..fd58b7c8 100644 Binary files a/e2e/tests/featured.spec.ts-snapshots/BeattyDNA-chromium-linux.png and b/e2e/tests/featured.spec.ts-snapshots/BeattyDNA-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/BeattyDNA-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/BeattyDNA-firefox-linux.png index 8857e1ab..d3735309 100644 Binary files a/e2e/tests/featured.spec.ts-snapshots/BeattyDNA-firefox-linux.png and b/e2e/tests/featured.spec.ts-snapshots/BeattyDNA-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/GosperFlowsnake-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/GosperFlowsnake-chromium-linux.png new file mode 100644 index 00000000..ce1c5e1f Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/GosperFlowsnake-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/GosperFlowsnake-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/GosperFlowsnake-firefox-linux.png new file mode 100644 index 00000000..42f1b1c8 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/GosperFlowsnake-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/HatTrick-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/HatTrick-chromium-linux.png new file mode 100644 index 00000000..16bdb903 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/HatTrick-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/HatTrick-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/HatTrick-firefox-linux.png new file mode 100644 index 00000000..53386536 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/HatTrick-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/MobiusHeartbeat-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/MobiusHeartbeat-chromium-linux.png new file mode 100644 index 00000000..3bdb3431 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/MobiusHeartbeat-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/MobiusHeartbeat-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/MobiusHeartbeat-firefox-linux.png new file mode 100644 index 00000000..557a6990 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/MobiusHeartbeat-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/PEMDASymmetry-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/PEMDASymmetry-chromium-linux.png new file mode 100644 index 00000000..527a2df0 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/PEMDASymmetry-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/PEMDASymmetry-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/PEMDASymmetry-firefox-linux.png new file mode 100644 index 00000000..369c5fa4 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/PEMDASymmetry-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/TheRaucousRecam-C3-A1n-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/TheRaucousRecam-C3-A1n-chromium-linux.png new file mode 100644 index 00000000..5912503f Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/TheRaucousRecam-C3-A1n-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/TheRaucousRecam-C3-A1n-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/TheRaucousRecam-C3-A1n-firefox-linux.png new file mode 100644 index 00000000..818193b9 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/TheRaucousRecam-C3-A1n-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/TheVertigoofDivergence-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/TheVertigoofDivergence-chromium-linux.png new file mode 100644 index 00000000..ae7663bb Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/TheVertigoofDivergence-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/TheVertigoofDivergence-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/TheVertigoofDivergence-firefox-linux.png new file mode 100644 index 00000000..0445397d Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/TheVertigoofDivergence-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/ThueTraipse-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/ThueTraipse-chromium-linux.png new file mode 100644 index 00000000..52ddf81a Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/ThueTraipse-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/ThueTraipse-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/ThueTraipse-firefox-linux.png new file mode 100644 index 00000000..50e5f272 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/ThueTraipse-firefox-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/VFibSnowflake-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/VFibSnowflake-chromium-linux.png index 36d87e03..11939c2b 100644 Binary files a/e2e/tests/featured.spec.ts-snapshots/VFibSnowflake-chromium-linux.png and b/e2e/tests/featured.spec.ts-snapshots/VFibSnowflake-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/WaitForIt-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/WaitForIt-chromium-linux.png index e349a151..3f4cb107 100644 Binary files a/e2e/tests/featured.spec.ts-snapshots/WaitForIt-chromium-linux.png and b/e2e/tests/featured.spec.ts-snapshots/WaitForIt-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/ZetaZero-2310143-chromium-linux.png b/e2e/tests/featured.spec.ts-snapshots/ZetaZero-2310143-chromium-linux.png new file mode 100644 index 00000000..1bab62f8 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/ZetaZero-2310143-chromium-linux.png differ diff --git a/e2e/tests/featured.spec.ts-snapshots/ZetaZero-2310143-firefox-linux.png b/e2e/tests/featured.spec.ts-snapshots/ZetaZero-2310143-firefox-linux.png new file mode 100644 index 00000000..947fbc28 Binary files /dev/null and b/e2e/tests/featured.spec.ts-snapshots/ZetaZero-2310143-firefox-linux.png differ diff --git a/e2e/tests/gallery.spec.ts b/e2e/tests/gallery.spec.ts index d0524ddb..3695b7f4 100644 --- a/e2e/tests/gallery.spec.ts +++ b/e2e/tests/gallery.spec.ts @@ -30,6 +30,8 @@ test.describe('Gallery', () => { ) }) test('clicking on a featured item', async ({page}) => { + const danceCard = await page.locator('.card-body >> nth=2') + await expect(danceCard.locator('.titlespan')).toContainText(/Dance/) await page.locator('.card-body >> nth=2').click() await expect(page.url()).not.toContain('gallery') await expect( diff --git a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png index 5868d5ab..3d23fba6 100644 Binary files a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png and b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-chromium-linux.png differ diff --git a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png index 1c442dac..243f80e1 100644 Binary files a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png and b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Start-deep-in-a-sequence-1-firefox-linux.png differ diff --git a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png index 76dfff2c..0626f837 100644 Binary files a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png and b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-chromium-linux.png differ diff --git a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png index dcd4248b..99553d35 100644 Binary files a/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png and b/e2e/tests/idiot.spec.ts-snapshots/Stress-test-Numberscope-usage-Way-too-big-a-number-1-firefox-linux.png differ diff --git a/e2e/tests/scope.spec.ts b/e2e/tests/scope.spec.ts index a2fda001..73fb8c98 100644 --- a/e2e/tests/scope.spec.ts +++ b/e2e/tests/scope.spec.ts @@ -76,7 +76,8 @@ test.describe('Scope: on some featured visualization', () => { const lookFor = 'Random' const andThenFind = 'Random integers 0 to 9' await page.locator('#sequenceTab .visualizer-info').click() - await page.getByText(lookFor, {exact: true}).click() + const itemToClick = await page.getByText(lookFor, {exact: true}) + await itemToClick.click() await expect( await page.locator('#sequenceTab .item-name').innerText() ).toMatch(andThenFind) diff --git a/package-lock.json b/package-lock.json index 50b51ef8..2159b3b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,11 +12,13 @@ "axios": "^1.6.8", "bigint-isqrt": "^0.3.2", "bigint-mod-arith": "^3.3.1", + "chroma-js": "^3.1.2", "dompurify": "^3.2.1", "interactjs": "^1.10.27", "p5": "^1.11.0", "temml": "^0.10.31", "vue": "^3.5.13", + "vue-pick-colors": "^1.8.0", "vue-router": "^4.5.0" }, "devDependencies": { @@ -25,6 +27,7 @@ "@playwright/browser-firefox": "^1.46.1", "@playwright/test": "^1.46.1", "@tsconfig/node20": "^20.1.4", + "@types/chroma-js": "^3.1.0", "@types/jsdom": "^21.1.7", "@types/node": "^20.14.10", "@types/p5": "^1.7.6", @@ -41,12 +44,12 @@ "npm-run-all": "^4.1.5", "prettier": "^3.3.3", "sass": "^1.77.2", - "typescript": "^5.5.4", - "typescript-eslint": "^8.5.0", + "typescript": "^5.7.3", + "typescript-eslint": "^8.23.0", "vite": "^6.0.0", "vitest": "^1.6.0", "vue-eslint-parser": "^9.4.3", - "vue-tsc": "^2.1.10" + "vue-tsc": "^2.2.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -906,6 +909,16 @@ "node": ">=18" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.27.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", @@ -1170,6 +1183,13 @@ "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", "dev": true }, + "node_modules/@types/chroma-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-3.1.0.tgz", + "integrity": "sha512-Uwl3SOtUkbQ6Ye6ZYu4q4xdLGBzmY839sEHYtOT7i691neeyd+7fXWT5VIkcUSfNwIFrIjQutNYQn9h4q5HFvg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -1220,21 +1240,21 @@ "optional": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz", - "integrity": "sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz", + "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/type-utils": "8.5.0", - "@typescript-eslint/utils": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/type-utils": "8.23.0", + "@typescript-eslint/utils": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1245,75 +1265,21 @@ }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.5.0.tgz", - "integrity": "sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz", + "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4" }, "engines": { @@ -1324,23 +1290,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz", + "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1350,104 +1312,17 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz", - "integrity": "sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz", + "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/utils": "8.5.0", + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/utils": "8.23.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1456,16 +1331,15 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", + "node_modules/@typescript-eslint/types": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz", + "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==", "dev": true, "license": "MIT", "engines": { @@ -1476,21 +1350,21 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz", + "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1499,31 +1373,11 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", @@ -1533,7 +1387,7 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", @@ -1550,16 +1404,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz", + "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0" + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1569,56 +1423,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz", + "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/types": "8.23.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1626,55 +1443,19 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - }, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/eslint" } }, "node_modules/@vitejs/plugin-vue": { @@ -1805,30 +1586,30 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.10.tgz", - "integrity": "sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", + "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", "dev": true, "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.10" + "@volar/source-map": "2.4.11" } }, "node_modules/@volar/source-map": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.10.tgz", - "integrity": "sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", + "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", "dev": true, "license": "MIT" }, "node_modules/@volar/typescript": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.10.tgz", - "integrity": "sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", + "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.10", + "@volar/language-core": "2.4.11", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } @@ -1901,17 +1682,17 @@ "license": "MIT" }, "node_modules/@vue/language-core": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.10.tgz", - "integrity": "sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", "dev": true, "license": "MIT", "dependencies": { - "@volar/language-core": "~2.4.8", + "@volar/language-core": "~2.4.11", "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.5.0", - "alien-signals": "^0.2.0", + "alien-signals": "^0.4.9", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" @@ -2100,9 +1881,9 @@ } }, "node_modules/alien-signals": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.2.2.tgz", - "integrity": "sha512-cZIRkbERILsBOXTQmMrxc9hgpxglstn69zm+F1ARf4aPAzdAFYd6sBq87ErO0Fj3DV94tglcyHG5kQz9nDC/8A==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", "dev": true, "license": "MIT" }, @@ -2350,6 +2131,12 @@ "node": ">= 6" } }, + "node_modules/chroma-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-3.1.2.tgz", + "integrity": "sha512-IJnETTalXbsLx1eKEgx19d5L6SRM7cH4vINw/99p/M11HCuXGRWL+6YmCm7FWFGIo6dtWuQoQi1dc5yQ7ESIHg==", + "license": "(BSD-3-Clause AND Apache-2.0)" + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3032,9 +2819,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -3042,7 +2829,7 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -3053,6 +2840,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3345,7 +3133,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/happy-dom": { "version": "14.12.3", @@ -4204,14 +3993,15 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -5644,15 +5434,16 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/type-check": { @@ -5699,9 +5490,9 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -5713,15 +5504,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.5.0.tgz", - "integrity": "sha512-uD+XxEoSIvqtm4KE97etm32Tn5MfaZWgWfMMREStLxR6JzvHkc2Tkj7zhTEK5XmtpTmKHNnG8Sot6qDfhHtR1Q==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.23.0.tgz", + "integrity": "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.5.0", - "@typescript-eslint/parser": "8.5.0", - "@typescript-eslint/utils": "8.5.0" + "@typescript-eslint/eslint-plugin": "8.23.0", + "@typescript-eslint/parser": "8.23.0", + "@typescript-eslint/utils": "8.23.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5730,10 +5521,9 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/ufo": { @@ -6951,9 +6741,9 @@ } }, "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true, "license": "MIT" }, @@ -7009,6 +6799,19 @@ "eslint": ">=6.0.0" } }, + "node_modules/vue-pick-colors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/vue-pick-colors/-/vue-pick-colors-1.8.0.tgz", + "integrity": "sha512-lIP28A1BZEPp0v0Y6m9lNbsC6jNM2LP+Dc2tJbUXiNRvDgXqBMe/msX3svqjspV4B+SZdPAjx75JY2zem0hA2Q==", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.11.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.11.2", + "vue": "^3.2.26" + } + }, "node_modules/vue-router": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", @@ -7025,15 +6828,14 @@ } }, "node_modules/vue-tsc": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.10.tgz", - "integrity": "sha512-RBNSfaaRHcN5uqVqJSZh++Gy/YUzryuv9u1aFWhsammDJXNtUiJMNoJ747lZcQ68wUQFx6E73y4FY3D8E7FGMA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.0.tgz", + "integrity": "sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==", "dev": true, "license": "MIT", "dependencies": { - "@volar/typescript": "~2.4.8", - "@vue/language-core": "2.1.10", - "semver": "^7.5.4" + "@volar/typescript": "~2.4.11", + "@vue/language-core": "2.2.0" }, "bin": { "vue-tsc": "bin/vue-tsc.js" @@ -7674,6 +7476,11 @@ "playwright": "1.46.1" } }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, "@rollup/rollup-android-arm-eabi": { "version": "4.27.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", @@ -7812,6 +7619,12 @@ "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", "dev": true }, + "@types/chroma-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-3.1.0.tgz", + "integrity": "sha512-Uwl3SOtUkbQ6Ye6ZYu4q4xdLGBzmY839sEHYtOT7i691neeyd+7fXWT5VIkcUSfNwIFrIjQutNYQn9h4q5HFvg==", + "dev": true + }, "@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -7857,169 +7670,79 @@ "optional": true }, "@typescript-eslint/eslint-plugin": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz", - "integrity": "sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz", + "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/type-utils": "8.5.0", - "@typescript-eslint/utils": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/type-utils": "8.23.0", + "@typescript-eslint/utils": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - } - }, - "@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - } - } + "ts-api-utils": "^2.0.1" } }, "@typescript-eslint/parser": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.5.0.tgz", - "integrity": "sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz", + "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - } - }, - "@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + } + }, + "@typescript-eslint/scope-manager": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz", + "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0" } }, "@typescript-eslint/type-utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz", - "integrity": "sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz", + "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/utils": "8.5.0", + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/utils": "8.23.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" + } + }, + "@typescript-eslint/types": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz", + "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz", + "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" }, "dependencies": { - "@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - } - }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -8041,76 +7764,32 @@ } }, "@typescript-eslint/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz", + "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0" + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz", + "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.23.0", + "eslint-visitor-keys": "^4.2.0" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - } - }, - "@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", + "eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } } } }, @@ -8204,27 +7883,27 @@ } }, "@volar/language-core": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.10.tgz", - "integrity": "sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", + "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", "dev": true, "requires": { - "@volar/source-map": "2.4.10" + "@volar/source-map": "2.4.11" } }, "@volar/source-map": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.10.tgz", - "integrity": "sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", + "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", "dev": true }, "@volar/typescript": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.10.tgz", - "integrity": "sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", + "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", "dev": true, "requires": { - "@volar/language-core": "2.4.10", + "@volar/language-core": "2.4.11", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } @@ -8291,16 +7970,16 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" }, "@vue/language-core": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.10.tgz", - "integrity": "sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", "dev": true, "requires": { - "@volar/language-core": "~2.4.8", + "@volar/language-core": "~2.4.11", "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.5.0", - "alien-signals": "^0.2.0", + "alien-signals": "^0.4.9", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" @@ -8432,9 +8111,9 @@ } }, "alien-signals": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.2.2.tgz", - "integrity": "sha512-cZIRkbERILsBOXTQmMrxc9hgpxglstn69zm+F1ARf4aPAzdAFYd6sBq87ErO0Fj3DV94tglcyHG5kQz9nDC/8A==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", "dev": true }, "ansi-regex": { @@ -8619,6 +8298,11 @@ } } }, + "chroma-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-3.1.2.tgz", + "integrity": "sha512-IJnETTalXbsLx1eKEgx19d5L6SRM7cH4vINw/99p/M11HCuXGRWL+6YmCm7FWFGIo6dtWuQoQi1dc5yQ7ESIHg==" + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9113,16 +8797,16 @@ "dev": true }, "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "dependencies": { "glob-parent": { @@ -9943,9 +9627,9 @@ "dev": true }, "micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { "braces": "^3.0.3", @@ -10959,9 +10643,9 @@ } }, "ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, "requires": {} }, @@ -10993,20 +10677,20 @@ "dev": true }, "typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "devOptional": true }, "typescript-eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.5.0.tgz", - "integrity": "sha512-uD+XxEoSIvqtm4KE97etm32Tn5MfaZWgWfMMREStLxR6JzvHkc2Tkj7zhTEK5XmtpTmKHNnG8Sot6qDfhHtR1Q==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.23.0.tgz", + "integrity": "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "8.5.0", - "@typescript-eslint/parser": "8.5.0", - "@typescript-eslint/utils": "8.5.0" + "@typescript-eslint/eslint-plugin": "8.23.0", + "@typescript-eslint/parser": "8.23.0", + "@typescript-eslint/utils": "8.23.0" } }, "ufo": { @@ -11540,9 +11224,9 @@ } }, "vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true }, "vue": { @@ -11578,6 +11262,14 @@ "semver": "^7.3.6" } }, + "vue-pick-colors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/vue-pick-colors/-/vue-pick-colors-1.8.0.tgz", + "integrity": "sha512-lIP28A1BZEPp0v0Y6m9lNbsC6jNM2LP+Dc2tJbUXiNRvDgXqBMe/msX3svqjspV4B+SZdPAjx75JY2zem0hA2Q==", + "requires": { + "@popperjs/core": "^2.11.2" + } + }, "vue-router": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", @@ -11587,14 +11279,13 @@ } }, "vue-tsc": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.10.tgz", - "integrity": "sha512-RBNSfaaRHcN5uqVqJSZh++Gy/YUzryuv9u1aFWhsammDJXNtUiJMNoJ747lZcQ68wUQFx6E73y4FY3D8E7FGMA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.0.tgz", + "integrity": "sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==", "dev": true, "requires": { - "@volar/typescript": "~2.4.8", - "@vue/language-core": "2.1.10", - "semver": "^7.5.4" + "@volar/typescript": "~2.4.11", + "@vue/language-core": "2.2.0" } }, "w3c-xmlserializer": { diff --git a/package.json b/package.json index 04aedb65..b61cc16d 100644 --- a/package.json +++ b/package.json @@ -83,17 +83,19 @@ "lint:check": "make -f etc/Makefile prettiest flags=-s", "//only lifecycle scripts below here": "echo", "prepare": "husky", - "postinstall": "python3 -m venv .venv && cd tools && node pyrun.mjs python -m pip install -U pip && node pyrun.mjs pip install -r requirements.txt" + "postinstall": "git config --local include.path ../.gitconfig && python3 -m venv .venv && cd tools && node pyrun.mjs python -m pip install -U pip && node pyrun.mjs pip install -r requirements.txt" }, "dependencies": { "axios": "^1.6.8", "bigint-isqrt": "^0.3.2", "bigint-mod-arith": "^3.3.1", + "chroma-js": "^3.1.2", "dompurify": "^3.2.1", "interactjs": "^1.10.27", "p5": "^1.11.0", "temml": "^0.10.31", "vue": "^3.5.13", + "vue-pick-colors": "^1.8.0", "vue-router": "^4.5.0" }, "devDependencies": { @@ -102,6 +104,7 @@ "@playwright/browser-firefox": "^1.46.1", "@playwright/test": "^1.46.1", "@tsconfig/node20": "^20.1.4", + "@types/chroma-js": "^3.1.0", "@types/jsdom": "^21.1.7", "@types/node": "^20.14.10", "@types/p5": "^1.7.6", @@ -118,11 +121,11 @@ "npm-run-all": "^4.1.5", "prettier": "^3.3.3", "sass": "^1.77.2", - "typescript": "^5.5.4", - "typescript-eslint": "^8.5.0", + "typescript": "^5.7.3", + "typescript-eslint": "^8.23.0", "vite": "^6.0.0", "vitest": "^1.6.0", "vue-eslint-parser": "^9.4.3", - "vue-tsc": "^2.1.10" + "vue-tsc": "^2.2.0" } } diff --git a/src/components/ParamEditor.vue b/src/components/ParamEditor.vue index 8a010cc7..74763839 100644 --- a/src/components/ParamEditor.vue +++ b/src/components/ParamEditor.vue @@ -49,28 +49,17 @@

{{ paramable.description }}

-
+
-
-
- -
-
@@ -85,11 +74,6 @@ import MageExchangeA from './MageExchangeA.vue' import ParamField from './ParamField.vue' - interface ParamHierarchy { - param: ParamInterface - children: {[key: string]: ParamInterface} - } - type Paramable = () => ParamableInterface export default defineComponent({ @@ -107,28 +91,31 @@ }, emits: ['changed', 'openSwitcher'], computed: { - sortedParams() { - const sortedParams: {[key: string]: ParamHierarchy} = {} + visibleParams() { + const visParams: typeof this.paramable.params = {} Object.keys(this.paramable.params).forEach(key => { const param = this.paramable.params[key] - if (!param.visibleDependency) - sortedParams[key] = {param, children: {}} + if ( + this.paramable.statusOf[key].invalid() + || this.checkDependency(param) + ) { + visParams[key] = param + } }) - Object.keys(this.paramable.params).forEach(key => { - const param = this.paramable.params[key] - if (param.visibleDependency) - sortedParams[param.visibleDependency].children[key] = - param - }) - return sortedParams + return visParams }, }, methods: { async updateParam(paramName: string, value: string) { const paramable = this.paramable + const param = paramable.params[paramName] + const oldValue = paramable.tentativeValues[paramName] paramable.tentativeValues[paramName] = value paramable.validateIndividual(paramName) if (paramable.statusOf[paramName].invalid()) return + if (param.updateAction) { + param.updateAction.call(paramable, value, oldValue) + } await paramable.validate() if (paramable.validationStatus.isValid()) { this.$emit('changed') @@ -139,6 +126,7 @@ if (!dep) return true if (this.paramable.statusOf[dep].invalid()) return false const parent = this.paramable.params[dep] + if (!this.checkDependency(parent)) return false const v = realizeOne( parent, this.paramable.tentativeValues[dep] @@ -147,6 +135,36 @@ return param.visiblePredicate(v as never) } else return param.visibleValue! === v }, + displayNameOf(paramName: string | number) { + const paramable = this.paramable + const param = paramable.params[paramName] + if (typeof param.displayName === 'string') { + return param.displayName + } + // Otherwise, it should be a function of the visibleDependency + const dep = param.visibleDependency + if (!dep) return '' + if (paramable.statusOf[dep].invalid()) return '' + const parent = paramable.params[dep] + const v = realizeOne(parent, paramable.tentativeValues[dep]) + return param.displayName(v as never) + }, + paramClass(param: ParamInterface): string { + let klass = '' + if ( + param.level === 1 + || (param.level !== 0 && param.visibleDependency) + ) { + klass = 'sub-' + } + if ( + param.type === ParamType.BOOLEAN + || param.type === ParamType.COLOR + ) + klass += 'inline' + else klass += 'stacked' + return klass + '-param' + }, openSwitcher() { this.$emit('openSwitcher') }, @@ -203,10 +221,30 @@ margin-bottom: 24px; } - .sub-param-box { + .stacked-param { + margin-top: 24px; + margin-bottom: 0px; + } + + .inline-param { + margin-top: 16px; + margin-bottom: 0px; + } + + .sub-stacked-param { + border-left: 1px solid var(--ns-color-black); + margin-left: 8px; + padding-left: 8px; + padding-top: 8px; + padding-bottom: 8px; + } + + .sub-inline-param { border-left: 1px solid var(--ns-color-black); margin-left: 8px; padding-left: 8px; + padding-top: 6px; + padding-bottom: 6px; } .error-box { diff --git a/src/components/ParamField.vue b/src/components/ParamField.vue index f14f772f..c5d0cdbb 100644 --- a/src/components/ParamField.vue +++ b/src/components/ParamField.vue @@ -1,20 +1,22 @@ -