ngxson HF staff commited on
Commit
8e0957b
·
1 Parent(s): 58e4ac1

first working version

Browse files
app.py CHANGED
@@ -157,12 +157,12 @@ API_NAME = 'tts'
157
 
158
  head = f'''
159
  <script>
160
- document.addEventListener('DOMContentLoaded', () => {{
161
  console.log('DOM content loaded');
162
- if (!localStorage.getItem('debug')) {{
163
  console.log('Attaching frontend app');
164
  const frontendApp = document.createElement('iframe');
165
- frontendApp.src = '/gradio_api/file=./front/dist/index.html';
166
  frontendApp.style = 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; border: none; z-index: 999999;';
167
  document.body.appendChild(frontendApp);
168
  }}
 
157
 
158
  head = f'''
159
  <script>
160
+ document.addEventListener('load', () => {{
161
  console.log('DOM content loaded');
162
+ if (!localStorage.getItem('debug') && !window.location.href.match(/debug=1/)) {{
163
  console.log('Attaching frontend app');
164
  const frontendApp = document.createElement('iframe');
165
+ frontendApp.src = '/gradio_api/file=./front/dist/index.html?SPACE_ID={SPACE_ID}';
166
  frontendApp.style = 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; border: none; z-index: 999999;';
167
  document.body.appendChild(frontendApp);
168
  }}
front/.prettierignore ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ **/.vscode
2
+ **/.github
3
+ **/.git
4
+ **/.svn
5
+ **/.hg
6
+ **/node_modules
7
+ **/dist
8
+ **/docs
9
+
10
+ /scripts
11
+ /esm
12
+ /models
13
+ /build
14
+
15
+ *.md
16
+ *.mdx
17
+ *.json
18
+ *.lock
19
+ *.yml
20
+ *.cpp
21
+ *.hpp
22
+
23
+ *.config.js
front/eslint.config.js CHANGED
@@ -23,6 +23,8 @@ export default tseslint.config(
23
  'warn',
24
  { allowConstantExport: true },
25
  ],
 
 
26
  },
27
  },
28
  )
 
23
  'warn',
24
  { allowConstantExport: true },
25
  ],
26
+ '@typescript-eslint/no-explicit-any': 'off',
27
+ '@typescript-eslint/no-unused-vars': 'off',
28
  },
29
  },
30
  )
front/index.html CHANGED
@@ -4,7 +4,7 @@
4
  <meta charset="UTF-8" />
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <title>Vite + React + TS</title>
8
  </head>
9
  <body>
10
  <div id="root"></div>
 
4
  <meta charset="UTF-8" />
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>kokoro-podcast-generator</title>
8
  </head>
9
  <body>
10
  <div id="root"></div>
front/package-lock.json CHANGED
@@ -9,24 +9,48 @@
9
  "version": "0.0.0",
10
  "dependencies": {
11
  "@gradio/client": "^1.12.0",
 
 
 
 
 
12
  "react": "^19.0.0",
13
  "react-dom": "^19.0.0",
14
- "vite-plugin-singlefile": "^2.1.0"
 
 
 
15
  },
16
  "devDependencies": {
17
  "@eslint/js": "^9.19.0",
18
  "@types/react": "^19.0.8",
19
  "@types/react-dom": "^19.0.3",
20
  "@vitejs/plugin-react": "^4.3.4",
 
21
  "eslint": "^9.19.0",
22
  "eslint-plugin-react-hooks": "^5.0.0",
23
  "eslint-plugin-react-refresh": "^0.4.18",
24
  "globals": "^15.14.0",
 
 
25
  "typescript": "~5.7.2",
26
  "typescript-eslint": "^8.22.0",
27
  "vite": "^6.1.0"
28
  }
29
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  "node_modules/@ampproject/remapping": {
31
  "version": "2.3.0",
32
  "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
@@ -323,6 +347,12 @@
323
  "node": ">=6.9.0"
324
  }
325
  },
 
 
 
 
 
 
326
  "node_modules/@bundled-es-modules/cookie": {
327
  "version": "2.0.1",
328
  "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz",
@@ -751,6 +781,12 @@
751
  "node": ">=18"
752
  }
753
  },
 
 
 
 
 
 
754
  "node_modules/@eslint-community/eslint-utils": {
755
  "version": "4.4.1",
756
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
@@ -1065,6 +1101,109 @@
1065
  }
1066
  }
1067
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1068
  "node_modules/@jridgewell/gen-mapping": {
1069
  "version": "0.3.8",
1070
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
@@ -1195,6 +1334,17 @@
1195
  "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==",
1196
  "license": "MIT"
1197
  },
 
 
 
 
 
 
 
 
 
 
 
1198
  "node_modules/@rollup/rollup-android-arm-eabi": {
1199
  "version": "4.34.7",
1200
  "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.7.tgz",
@@ -1442,6 +1592,61 @@
1442
  "win32"
1443
  ]
1444
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1445
  "node_modules/@types/babel__core": {
1446
  "version": "7.20.5",
1447
  "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -1783,6 +1988,44 @@
1783
  "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
1784
  }
1785
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1786
  "node_modules/acorn": {
1787
  "version": "8.14.0",
1788
  "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
@@ -1874,6 +2117,34 @@
1874
  "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1875
  }
1876
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1877
  "node_modules/argparse": {
1878
  "version": "2.0.1",
1879
  "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -1881,6 +2152,74 @@
1881
  "dev": true,
1882
  "license": "Python-2.0"
1883
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1884
  "node_modules/balanced-match": {
1885
  "version": "1.0.2",
1886
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1888,6 +2227,28 @@
1888
  "dev": true,
1889
  "license": "MIT"
1890
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1891
  "node_modules/brace-expansion": {
1892
  "version": "1.1.11",
1893
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -1915,7 +2276,6 @@
1915
  "version": "4.24.4",
1916
  "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
1917
  "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
1918
- "dev": true,
1919
  "funding": [
1920
  {
1921
  "type": "opencollective",
@@ -1944,6 +2304,12 @@
1944
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1945
  }
1946
  },
 
 
 
 
 
 
1947
  "node_modules/bufferutil": {
1948
  "version": "4.0.9",
1949
  "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz",
@@ -1967,11 +2333,20 @@
1967
  "node": ">=6"
1968
  }
1969
  },
 
 
 
 
 
 
 
 
 
 
1970
  "node_modules/caniuse-lite": {
1971
  "version": "1.0.30001699",
1972
  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
1973
  "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==",
1974
- "dev": true,
1975
  "funding": [
1976
  {
1977
  "type": "opencollective",
@@ -2005,6 +2380,44 @@
2005
  "url": "https://github.com/chalk/chalk?sponsor=1"
2006
  }
2007
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2008
  "node_modules/cli-width": {
2009
  "version": "4.1.0",
2010
  "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
@@ -2045,6 +2458,12 @@
2045
  "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2046
  }
2047
  },
 
 
 
 
 
 
2048
  "node_modules/color-convert": {
2049
  "version": "2.0.1",
2050
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -2063,6 +2482,22 @@
2063
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2064
  "license": "MIT"
2065
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2066
  "node_modules/concat-map": {
2067
  "version": "0.0.1",
2068
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2101,15 +2536,69 @@
2101
  "node": ">= 8"
2102
  }
2103
  },
2104
- "node_modules/csstype": {
2105
- "version": "3.1.3",
2106
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
2107
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
2108
  "dev": true,
2109
- "license": "MIT"
 
 
 
 
2110
  },
2111
- "node_modules/debug": {
2112
- "version": "4.4.0",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2113
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
2114
  "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
2115
  "dev": true,
@@ -2133,11 +2622,45 @@
2133
  "dev": true,
2134
  "license": "MIT"
2135
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2136
  "node_modules/electron-to-chromium": {
2137
  "version": "1.5.101",
2138
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.101.tgz",
2139
  "integrity": "sha512-L0ISiQrP/56Acgu4/i/kfPwWSgrzYZUnQrC0+QPFuhqlLP1Ir7qzPPDVS9BcKIyWTRU8+o6CC8dKw38tSWhYIA==",
2140
- "dev": true,
2141
  "license": "ISC"
2142
  },
2143
  "node_modules/emoji-regex": {
@@ -2445,6 +2968,13 @@
2445
  "dev": true,
2446
  "license": "MIT"
2447
  },
 
 
 
 
 
 
 
2448
  "node_modules/fastq": {
2449
  "version": "1.19.0",
2450
  "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
@@ -2524,6 +3054,36 @@
2524
  "dev": true,
2525
  "license": "ISC"
2526
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2527
  "node_modules/fsevents": {
2528
  "version": "2.3.3",
2529
  "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -2538,6 +3098,16 @@
2538
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
2539
  }
2540
  },
 
 
 
 
 
 
 
 
 
 
2541
  "node_modules/gensync": {
2542
  "version": "1.0.0-beta.2",
2543
  "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -2557,6 +3127,27 @@
2557
  "node": "6.* || 8.* || >= 10.*"
2558
  }
2559
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2560
  "node_modules/glob-parent": {
2561
  "version": "6.0.2",
2562
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -2570,6 +3161,32 @@
2570
  "node": ">=10.13.0"
2571
  }
2572
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2573
  "node_modules/globals": {
2574
  "version": "15.15.0",
2575
  "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
@@ -2603,12 +3220,24 @@
2603
  "version": "4.0.0",
2604
  "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2605
  "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2606
- "dev": true,
2607
  "license": "MIT",
2608
  "engines": {
2609
  "node": ">=8"
2610
  }
2611
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
2612
  "node_modules/headers-polyfill": {
2613
  "version": "4.0.3",
2614
  "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz",
@@ -2625,6 +3254,12 @@
2625
  "node": ">= 4"
2626
  }
2627
  },
 
 
 
 
 
 
2628
  "node_modules/import-fresh": {
2629
  "version": "3.3.1",
2630
  "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
@@ -2652,6 +3287,35 @@
2652
  "node": ">=0.8.19"
2653
  }
2654
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2655
  "node_modules/is-extglob": {
2656
  "version": "2.1.1",
2657
  "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -2706,6 +3370,33 @@
2706
  "dev": true,
2707
  "license": "ISC"
2708
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2709
  "node_modules/js-tokens": {
2710
  "version": "4.0.0",
2711
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -2797,73 +3488,356 @@
2797
  "node": ">= 0.8.0"
2798
  }
2799
  },
2800
- "node_modules/locate-path": {
2801
- "version": "6.0.0",
2802
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
2803
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
2804
- "dev": true,
2805
- "license": "MIT",
 
2806
  "dependencies": {
2807
- "p-locate": "^5.0.0"
2808
  },
2809
  "engines": {
2810
- "node": ">=10"
2811
  },
2812
  "funding": {
2813
- "url": "https://github.com/sponsors/sindresorhus"
2814
- }
2815
- },
2816
- "node_modules/lodash.merge": {
2817
- "version": "4.6.2",
2818
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
2819
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
2820
- "dev": true,
2821
- "license": "MIT"
2822
- },
2823
- "node_modules/lru-cache": {
2824
- "version": "5.1.1",
2825
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
2826
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
2827
- "dev": true,
2828
- "license": "ISC",
2829
- "dependencies": {
2830
- "yallist": "^3.0.2"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2831
  }
2832
  },
2833
- "node_modules/merge2": {
2834
- "version": "1.4.1",
2835
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
2836
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
2837
- "dev": true,
2838
- "license": "MIT",
 
 
 
 
 
 
 
2839
  "engines": {
2840
- "node": ">= 8"
 
 
 
 
2841
  }
2842
  },
2843
- "node_modules/micromatch": {
2844
- "version": "4.0.8",
2845
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
2846
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
2847
- "license": "MIT",
2848
- "dependencies": {
2849
- "braces": "^3.0.3",
2850
- "picomatch": "^2.3.1"
2851
- },
 
 
 
 
2852
  "engines": {
2853
- "node": ">=8.6"
 
 
 
 
2854
  }
2855
  },
2856
- "node_modules/minimatch": {
2857
- "version": "3.1.2",
2858
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
2859
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
2860
- "dev": true,
2861
- "license": "ISC",
2862
- "dependencies": {
2863
- "brace-expansion": "^1.1.7"
2864
- },
 
 
 
 
2865
  "engines": {
2866
- "node": "*"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2867
  }
2868
  },
2869
  "node_modules/ms": {
@@ -2926,6 +3900,18 @@
2926
  "node": "^18.17.0 || >=20.5.0"
2927
  }
2928
  },
 
 
 
 
 
 
 
 
 
 
 
 
2929
  "node_modules/nanoid": {
2930
  "version": "3.3.8",
2931
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
@@ -2966,9 +3952,71 @@
2966
  "version": "2.0.19",
2967
  "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
2968
  "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
2969
- "dev": true,
2970
  "license": "MIT"
2971
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2972
  "node_modules/optionator": {
2973
  "version": "0.9.4",
2974
  "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@@ -2987,6 +4035,19 @@
2987
  "node": ">= 0.8.0"
2988
  }
2989
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
2990
  "node_modules/outvariant": {
2991
  "version": "1.4.3",
2992
  "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz",
@@ -3025,6 +4086,13 @@
3025
  "url": "https://github.com/sponsors/sindresorhus"
3026
  }
3027
  },
 
 
 
 
 
 
 
3028
  "node_modules/parent-module": {
3029
  "version": "1.0.1",
3030
  "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -3058,6 +4126,37 @@
3058
  "node": ">=8"
3059
  }
3060
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3061
  "node_modules/path-to-regexp": {
3062
  "version": "6.3.0",
3063
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
@@ -3082,6 +4181,26 @@
3082
  "url": "https://github.com/sponsors/jonschlinkert"
3083
  }
3084
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3085
  "node_modules/postcss": {
3086
  "version": "8.5.2",
3087
  "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
@@ -3110,16 +4229,152 @@
3110
  "node": "^10 || ^12 || >=14"
3111
  }
3112
  },
3113
- "node_modules/prelude-ls": {
3114
- "version": "1.2.1",
3115
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
3116
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
3117
  "dev": true,
3118
  "license": "MIT",
3119
- "engines": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3120
  "node": ">= 0.8.0"
3121
  }
3122
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3123
  "node_modules/psl": {
3124
  "version": "1.15.0",
3125
  "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
@@ -3141,6 +4396,15 @@
3141
  "node": ">=6"
3142
  }
3143
  },
 
 
 
 
 
 
 
 
 
3144
  "node_modules/querystringify": {
3145
  "version": "2.2.0",
3146
  "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
@@ -3189,112 +4453,544 @@
3189
  "react": "^19.0.0"
3190
  }
3191
  },
3192
- "node_modules/react-refresh": {
3193
- "version": "0.14.2",
3194
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
3195
- "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
3196
- "dev": true,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3197
  "license": "MIT",
 
 
 
 
3198
  "engines": {
3199
- "node": ">=0.10.0"
3200
  }
3201
  },
3202
- "node_modules/require-directory": {
3203
- "version": "2.1.1",
3204
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
3205
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
 
 
 
3206
  "license": "MIT",
 
 
 
 
3207
  "engines": {
3208
- "node": ">=0.10.0"
3209
  }
3210
  },
3211
- "node_modules/requires-port": {
3212
- "version": "1.0.0",
3213
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
3214
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
3215
- "license": "MIT"
3216
- },
3217
- "node_modules/resolve-from": {
3218
- "version": "4.0.0",
3219
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
3220
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
3221
- "dev": true,
3222
  "license": "MIT",
 
 
 
 
3223
  "engines": {
3224
- "node": ">=4"
3225
  }
3226
  },
3227
- "node_modules/reusify": {
3228
- "version": "1.0.4",
3229
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
3230
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
3231
- "dev": true,
 
 
3232
  "license": "MIT",
 
 
 
 
3233
  "engines": {
3234
- "iojs": ">=1.0.0",
3235
- "node": ">=0.10.0"
3236
  }
3237
  },
3238
- "node_modules/rollup": {
3239
- "version": "4.34.7",
3240
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.7.tgz",
3241
- "integrity": "sha512-8qhyN0oZ4x0H6wmBgfKxJtxM7qS98YJ0k0kNh5ECVtuchIJ7z9IVVvzpmtQyT10PXKMtBxYr1wQ5Apg8RS8kXQ==",
 
 
 
3242
  "license": "MIT",
3243
- "dependencies": {
3244
- "@types/estree": "1.0.6"
3245
- },
3246
- "bin": {
3247
- "rollup": "dist/bin/rollup"
3248
- },
3249
  "engines": {
3250
- "node": ">=18.0.0",
3251
- "npm": ">=8.0.0"
3252
- },
3253
- "optionalDependencies": {
3254
- "@rollup/rollup-android-arm-eabi": "4.34.7",
3255
- "@rollup/rollup-android-arm64": "4.34.7",
3256
- "@rollup/rollup-darwin-arm64": "4.34.7",
3257
- "@rollup/rollup-darwin-x64": "4.34.7",
3258
- "@rollup/rollup-freebsd-arm64": "4.34.7",
3259
- "@rollup/rollup-freebsd-x64": "4.34.7",
3260
- "@rollup/rollup-linux-arm-gnueabihf": "4.34.7",
3261
- "@rollup/rollup-linux-arm-musleabihf": "4.34.7",
3262
- "@rollup/rollup-linux-arm64-gnu": "4.34.7",
3263
- "@rollup/rollup-linux-arm64-musl": "4.34.7",
3264
- "@rollup/rollup-linux-loongarch64-gnu": "4.34.7",
3265
- "@rollup/rollup-linux-powerpc64le-gnu": "4.34.7",
3266
- "@rollup/rollup-linux-riscv64-gnu": "4.34.7",
3267
- "@rollup/rollup-linux-s390x-gnu": "4.34.7",
3268
- "@rollup/rollup-linux-x64-gnu": "4.34.7",
3269
- "@rollup/rollup-linux-x64-musl": "4.34.7",
3270
- "@rollup/rollup-win32-arm64-msvc": "4.34.7",
3271
- "@rollup/rollup-win32-ia32-msvc": "4.34.7",
3272
- "@rollup/rollup-win32-x64-msvc": "4.34.7",
3273
- "fsevents": "~2.3.2"
3274
  }
3275
  },
3276
- "node_modules/run-parallel": {
3277
- "version": "1.2.0",
3278
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
3279
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
3280
- "dev": true,
3281
- "funding": [
3282
- {
3283
- "type": "github",
3284
- "url": "https://github.com/sponsors/feross"
3285
- },
3286
- {
3287
- "type": "patreon",
3288
- "url": "https://www.patreon.com/feross"
3289
- },
3290
- {
3291
- "type": "consulting",
3292
- "url": "https://feross.org/support"
3293
- }
3294
- ],
3295
  "license": "MIT",
3296
  "dependencies": {
3297
- "queue-microtask": "^1.2.2"
 
 
 
 
 
 
3298
  }
3299
  },
3300
  "node_modules/scheduler": {
@@ -3357,6 +5053,16 @@
3357
  "url": "https://github.com/sponsors/isaacs"
3358
  }
3359
  },
 
 
 
 
 
 
 
 
 
 
3360
  "node_modules/source-map-js": {
3361
  "version": "1.2.1",
3362
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -3395,6 +5101,22 @@
3395
  "node": ">=8"
3396
  }
3397
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3398
  "node_modules/strip-ansi": {
3399
  "version": "6.0.1",
3400
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -3407,6 +5129,20 @@
3407
  "node": ">=8"
3408
  }
3409
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3410
  "node_modules/strip-json-comments": {
3411
  "version": "3.1.1",
3412
  "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -3420,6 +5156,29 @@
3420
  "url": "https://github.com/sponsors/sindresorhus"
3421
  }
3422
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3423
  "node_modules/supports-color": {
3424
  "version": "7.2.0",
3425
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -3433,12 +5192,117 @@
3433
  "node": ">=8"
3434
  }
3435
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3436
  "node_modules/textlinestream": {
3437
  "version": "1.1.1",
3438
  "resolved": "https://registry.npmjs.org/textlinestream/-/textlinestream-1.1.1.tgz",
3439
  "integrity": "sha512-iBHbi7BQxrFmwZUQJsT0SjNzlLLsXhvW/kg7EyOMVMBIrlnj/qYofwo1LVLZi+3GbUEo96Iu2eqToI2+lZoAEQ==",
3440
  "license": "MIT"
3441
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3442
  "node_modules/to-regex-range": {
3443
  "version": "5.0.1",
3444
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -3479,6 +5343,19 @@
3479
  "typescript": ">=4.8.4"
3480
  }
3481
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
3482
  "node_modules/type-check": {
3483
  "version": "0.4.0",
3484
  "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -3553,7 +5430,6 @@
3553
  "version": "1.1.2",
3554
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
3555
  "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
3556
- "dev": true,
3557
  "funding": [
3558
  {
3559
  "type": "opencollective",
@@ -3600,6 +5476,19 @@
3600
  "requires-port": "^1.0.0"
3601
  }
3602
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
3603
  "node_modules/vite": {
3604
  "version": "6.1.0",
3605
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz",
@@ -3727,6 +5616,25 @@
3727
  "node": ">=8"
3728
  }
3729
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3730
  "node_modules/ws": {
3731
  "version": "8.18.0",
3732
  "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
@@ -3764,6 +5672,18 @@
3764
  "dev": true,
3765
  "license": "ISC"
3766
  },
 
 
 
 
 
 
 
 
 
 
 
 
3767
  "node_modules/yargs": {
3768
  "version": "17.7.2",
3769
  "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
 
9
  "version": "0.0.0",
10
  "dependencies": {
11
  "@gradio/client": "^1.12.0",
12
+ "@sec-ant/readable-stream": "^0.6.0",
13
+ "audio-decode": "^2.2.2",
14
+ "autoprefixer": "^10.4.20",
15
+ "base64-arraybuffer": "^1.0.2",
16
+ "postcss": "^8.5.2",
17
  "react": "^19.0.0",
18
  "react-dom": "^19.0.0",
19
+ "sass-embedded": "^1.85.0",
20
+ "textlinestream": "^1.1.1",
21
+ "vite-plugin-singlefile": "^2.1.0",
22
+ "yaml": "^2.7.0"
23
  },
24
  "devDependencies": {
25
  "@eslint/js": "^9.19.0",
26
  "@types/react": "^19.0.8",
27
  "@types/react-dom": "^19.0.3",
28
  "@vitejs/plugin-react": "^4.3.4",
29
+ "daisyui": "^4.12.23",
30
  "eslint": "^9.19.0",
31
  "eslint-plugin-react-hooks": "^5.0.0",
32
  "eslint-plugin-react-refresh": "^0.4.18",
33
  "globals": "^15.14.0",
34
+ "prettier": "^3.5.1",
35
+ "tailwindcss": "^3.4.17",
36
  "typescript": "~5.7.2",
37
  "typescript-eslint": "^8.22.0",
38
  "vite": "^6.1.0"
39
  }
40
  },
41
+ "node_modules/@alloc/quick-lru": {
42
+ "version": "5.2.0",
43
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
44
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
45
+ "dev": true,
46
+ "license": "MIT",
47
+ "engines": {
48
+ "node": ">=10"
49
+ },
50
+ "funding": {
51
+ "url": "https://github.com/sponsors/sindresorhus"
52
+ }
53
+ },
54
  "node_modules/@ampproject/remapping": {
55
  "version": "2.3.0",
56
  "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
 
347
  "node": ">=6.9.0"
348
  }
349
  },
350
+ "node_modules/@bufbuild/protobuf": {
351
+ "version": "2.2.3",
352
+ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz",
353
+ "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==",
354
+ "license": "(Apache-2.0 AND BSD-3-Clause)"
355
+ },
356
  "node_modules/@bundled-es-modules/cookie": {
357
  "version": "2.0.1",
358
  "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz",
 
781
  "node": ">=18"
782
  }
783
  },
784
+ "node_modules/@eshaz/web-worker": {
785
+ "version": "1.2.2",
786
+ "resolved": "https://registry.npmjs.org/@eshaz/web-worker/-/web-worker-1.2.2.tgz",
787
+ "integrity": "sha512-WxXiHFmD9u/owrzempiDlBB1ZYqiLnm9s6aPc8AlFQalq2tKmqdmMr9GXOupDgzXtqnBipj8Un0gkIm7Sjf8mw==",
788
+ "license": "Apache-2.0"
789
+ },
790
  "node_modules/@eslint-community/eslint-utils": {
791
  "version": "4.4.1",
792
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
 
1101
  }
1102
  }
1103
  },
1104
+ "node_modules/@isaacs/cliui": {
1105
+ "version": "8.0.2",
1106
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
1107
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
1108
+ "dev": true,
1109
+ "license": "ISC",
1110
+ "dependencies": {
1111
+ "string-width": "^5.1.2",
1112
+ "string-width-cjs": "npm:string-width@^4.2.0",
1113
+ "strip-ansi": "^7.0.1",
1114
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
1115
+ "wrap-ansi": "^8.1.0",
1116
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
1117
+ },
1118
+ "engines": {
1119
+ "node": ">=12"
1120
+ }
1121
+ },
1122
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
1123
+ "version": "6.1.0",
1124
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
1125
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
1126
+ "dev": true,
1127
+ "license": "MIT",
1128
+ "engines": {
1129
+ "node": ">=12"
1130
+ },
1131
+ "funding": {
1132
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
1133
+ }
1134
+ },
1135
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
1136
+ "version": "6.2.1",
1137
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
1138
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
1139
+ "dev": true,
1140
+ "license": "MIT",
1141
+ "engines": {
1142
+ "node": ">=12"
1143
+ },
1144
+ "funding": {
1145
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1146
+ }
1147
+ },
1148
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
1149
+ "version": "9.2.2",
1150
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1151
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
1152
+ "dev": true,
1153
+ "license": "MIT"
1154
+ },
1155
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
1156
+ "version": "5.1.2",
1157
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
1158
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
1159
+ "dev": true,
1160
+ "license": "MIT",
1161
+ "dependencies": {
1162
+ "eastasianwidth": "^0.2.0",
1163
+ "emoji-regex": "^9.2.2",
1164
+ "strip-ansi": "^7.0.1"
1165
+ },
1166
+ "engines": {
1167
+ "node": ">=12"
1168
+ },
1169
+ "funding": {
1170
+ "url": "https://github.com/sponsors/sindresorhus"
1171
+ }
1172
+ },
1173
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
1174
+ "version": "7.1.0",
1175
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
1176
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
1177
+ "dev": true,
1178
+ "license": "MIT",
1179
+ "dependencies": {
1180
+ "ansi-regex": "^6.0.1"
1181
+ },
1182
+ "engines": {
1183
+ "node": ">=12"
1184
+ },
1185
+ "funding": {
1186
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
1187
+ }
1188
+ },
1189
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
1190
+ "version": "8.1.0",
1191
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
1192
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
1193
+ "dev": true,
1194
+ "license": "MIT",
1195
+ "dependencies": {
1196
+ "ansi-styles": "^6.1.0",
1197
+ "string-width": "^5.0.1",
1198
+ "strip-ansi": "^7.0.1"
1199
+ },
1200
+ "engines": {
1201
+ "node": ">=12"
1202
+ },
1203
+ "funding": {
1204
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1205
+ }
1206
+ },
1207
  "node_modules/@jridgewell/gen-mapping": {
1208
  "version": "0.3.8",
1209
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
 
1334
  "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==",
1335
  "license": "MIT"
1336
  },
1337
+ "node_modules/@pkgjs/parseargs": {
1338
+ "version": "0.11.0",
1339
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
1340
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
1341
+ "dev": true,
1342
+ "license": "MIT",
1343
+ "optional": true,
1344
+ "engines": {
1345
+ "node": ">=14"
1346
+ }
1347
+ },
1348
  "node_modules/@rollup/rollup-android-arm-eabi": {
1349
  "version": "4.34.7",
1350
  "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.7.tgz",
 
1592
  "win32"
1593
  ]
1594
  },
1595
+ "node_modules/@sec-ant/readable-stream": {
1596
+ "version": "0.6.0",
1597
+ "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.6.0.tgz",
1598
+ "integrity": "sha512-uiBh8DrB5FN35gP6/o8JEhEQ7/ci1jUsOZO/VMUjyvTpjtV54VstOXVj1TvTj/wsT23pfX6butxxh3qufsW3+g==",
1599
+ "license": "MIT"
1600
+ },
1601
+ "node_modules/@thi.ng/bitstream": {
1602
+ "version": "2.4.12",
1603
+ "resolved": "https://registry.npmjs.org/@thi.ng/bitstream/-/bitstream-2.4.12.tgz",
1604
+ "integrity": "sha512-89v8XLbkgGfVFmoTTq4TPZU44BkrmwVyOSz4PIaBkxRFkVeQCf/MOLi2qjluUJMpbmOb9BFh2OjvmKCakGgZFQ==",
1605
+ "funding": [
1606
+ {
1607
+ "type": "github",
1608
+ "url": "https://github.com/sponsors/postspectacular"
1609
+ },
1610
+ {
1611
+ "type": "patreon",
1612
+ "url": "https://patreon.com/thing_umbrella"
1613
+ },
1614
+ {
1615
+ "type": "liberapay",
1616
+ "url": "https://liberapay.com/thi.ng"
1617
+ }
1618
+ ],
1619
+ "license": "Apache-2.0",
1620
+ "dependencies": {
1621
+ "@thi.ng/errors": "^2.5.26"
1622
+ },
1623
+ "engines": {
1624
+ "node": ">=18"
1625
+ }
1626
+ },
1627
+ "node_modules/@thi.ng/errors": {
1628
+ "version": "2.5.26",
1629
+ "resolved": "https://registry.npmjs.org/@thi.ng/errors/-/errors-2.5.26.tgz",
1630
+ "integrity": "sha512-BnuETWjhmGyE/1MDY9sUQL0YfwvOlzQjWIZkLP8WhlJdl8VoECn+YpNrcQdRFP3uzDu1v+95paddt+KGEIxmcw==",
1631
+ "funding": [
1632
+ {
1633
+ "type": "github",
1634
+ "url": "https://github.com/sponsors/postspectacular"
1635
+ },
1636
+ {
1637
+ "type": "patreon",
1638
+ "url": "https://patreon.com/thing_umbrella"
1639
+ },
1640
+ {
1641
+ "type": "liberapay",
1642
+ "url": "https://liberapay.com/thi.ng"
1643
+ }
1644
+ ],
1645
+ "license": "Apache-2.0",
1646
+ "engines": {
1647
+ "node": ">=18"
1648
+ }
1649
+ },
1650
  "node_modules/@types/babel__core": {
1651
  "version": "7.20.5",
1652
  "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
 
1988
  "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
1989
  }
1990
  },
1991
+ "node_modules/@wasm-audio-decoders/common": {
1992
+ "version": "9.0.5",
1993
+ "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/common/-/common-9.0.5.tgz",
1994
+ "integrity": "sha512-b9JNh9sPAvn8PVIizNh9D60WkfQong/u9ea873H47u7zvVDLctxYIp2aZw9CQqXaQdk7JB3MoU5UHiseO40swg==",
1995
+ "license": "MIT",
1996
+ "dependencies": {
1997
+ "@eshaz/web-worker": "1.2.2",
1998
+ "simple-yenc": "^1.0.4"
1999
+ }
2000
+ },
2001
+ "node_modules/@wasm-audio-decoders/flac": {
2002
+ "version": "0.2.5",
2003
+ "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/flac/-/flac-0.2.5.tgz",
2004
+ "integrity": "sha512-8M//CgB3PlkWwn47KcwD0tO6DZBA7/AGG0ukHSG0G97UbNEUNINvKDWAKPVWznzHsqeBP6axw+K/38dzng64JA==",
2005
+ "license": "MIT",
2006
+ "dependencies": {
2007
+ "@wasm-audio-decoders/common": "9.0.5",
2008
+ "codec-parser": "2.5.0"
2009
+ },
2010
+ "funding": {
2011
+ "type": "individual",
2012
+ "url": "https://github.com/sponsors/eshaz"
2013
+ }
2014
+ },
2015
+ "node_modules/@wasm-audio-decoders/ogg-vorbis": {
2016
+ "version": "0.1.16",
2017
+ "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/ogg-vorbis/-/ogg-vorbis-0.1.16.tgz",
2018
+ "integrity": "sha512-HcEx4LPZbbzjhs9bTXgMaXLVCSMSo/egY9paJxAnE9tsYbvseAaGtVddLYktl3Qi/G+nW/ZzUXg4144izJjqCw==",
2019
+ "license": "MIT",
2020
+ "dependencies": {
2021
+ "@wasm-audio-decoders/common": "9.0.5",
2022
+ "codec-parser": "2.5.0"
2023
+ },
2024
+ "funding": {
2025
+ "type": "individual",
2026
+ "url": "https://github.com/sponsors/eshaz"
2027
+ }
2028
+ },
2029
  "node_modules/acorn": {
2030
  "version": "8.14.0",
2031
  "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
 
2117
  "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2118
  }
2119
  },
2120
+ "node_modules/any-promise": {
2121
+ "version": "1.3.0",
2122
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
2123
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
2124
+ "dev": true,
2125
+ "license": "MIT"
2126
+ },
2127
+ "node_modules/anymatch": {
2128
+ "version": "3.1.3",
2129
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
2130
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
2131
+ "dev": true,
2132
+ "license": "ISC",
2133
+ "dependencies": {
2134
+ "normalize-path": "^3.0.0",
2135
+ "picomatch": "^2.0.4"
2136
+ },
2137
+ "engines": {
2138
+ "node": ">= 8"
2139
+ }
2140
+ },
2141
+ "node_modules/arg": {
2142
+ "version": "5.0.2",
2143
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
2144
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
2145
+ "dev": true,
2146
+ "license": "MIT"
2147
+ },
2148
  "node_modules/argparse": {
2149
  "version": "2.0.1",
2150
  "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
 
2152
  "dev": true,
2153
  "license": "Python-2.0"
2154
  },
2155
+ "node_modules/audio-buffer": {
2156
+ "version": "5.0.0",
2157
+ "resolved": "https://registry.npmjs.org/audio-buffer/-/audio-buffer-5.0.0.tgz",
2158
+ "integrity": "sha512-gsDyj1wwUp8u7NBB+eW6yhLb9ICf+0eBmDX8NGaAS00w8/fLqFdxUlL5Ge/U8kB64DlQhdonxYC59dXy1J7H/w==",
2159
+ "license": "MIT"
2160
+ },
2161
+ "node_modules/audio-decode": {
2162
+ "version": "2.2.2",
2163
+ "resolved": "https://registry.npmjs.org/audio-decode/-/audio-decode-2.2.2.tgz",
2164
+ "integrity": "sha512-xyh7z6dpRT+5Ez4ggV2cEkSShkDvvIBBmVPR3kYY7uIBqRO1BGNjofip6JnjBnvezhrU3ypBGZjepyKFDZWnDw==",
2165
+ "license": "MIT",
2166
+ "dependencies": {
2167
+ "@wasm-audio-decoders/flac": "^0.2.4",
2168
+ "@wasm-audio-decoders/ogg-vorbis": "^0.1.15",
2169
+ "audio-buffer": "^5.0.0",
2170
+ "audio-type": "^2.2.1",
2171
+ "mpg123-decoder": "^1.0.0",
2172
+ "node-wav": "^0.0.2",
2173
+ "ogg-opus-decoder": "^1.6.12",
2174
+ "qoa-format": "^1.0.1"
2175
+ }
2176
+ },
2177
+ "node_modules/audio-type": {
2178
+ "version": "2.2.1",
2179
+ "resolved": "https://registry.npmjs.org/audio-type/-/audio-type-2.2.1.tgz",
2180
+ "integrity": "sha512-En9AY6EG1qYqEy5L/quryzbA4akBpJrnBZNxeKTqGHC2xT9Qc4aZ8b7CcbOMFTTc/MGdoNyp+SN4zInZNKxMYA==",
2181
+ "license": "MIT",
2182
+ "engines": {
2183
+ "node": ">=14"
2184
+ }
2185
+ },
2186
+ "node_modules/autoprefixer": {
2187
+ "version": "10.4.20",
2188
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
2189
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
2190
+ "funding": [
2191
+ {
2192
+ "type": "opencollective",
2193
+ "url": "https://opencollective.com/postcss/"
2194
+ },
2195
+ {
2196
+ "type": "tidelift",
2197
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
2198
+ },
2199
+ {
2200
+ "type": "github",
2201
+ "url": "https://github.com/sponsors/ai"
2202
+ }
2203
+ ],
2204
+ "license": "MIT",
2205
+ "dependencies": {
2206
+ "browserslist": "^4.23.3",
2207
+ "caniuse-lite": "^1.0.30001646",
2208
+ "fraction.js": "^4.3.7",
2209
+ "normalize-range": "^0.1.2",
2210
+ "picocolors": "^1.0.1",
2211
+ "postcss-value-parser": "^4.2.0"
2212
+ },
2213
+ "bin": {
2214
+ "autoprefixer": "bin/autoprefixer"
2215
+ },
2216
+ "engines": {
2217
+ "node": "^10 || ^12 || >=14"
2218
+ },
2219
+ "peerDependencies": {
2220
+ "postcss": "^8.1.0"
2221
+ }
2222
+ },
2223
  "node_modules/balanced-match": {
2224
  "version": "1.0.2",
2225
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
 
2227
  "dev": true,
2228
  "license": "MIT"
2229
  },
2230
+ "node_modules/base64-arraybuffer": {
2231
+ "version": "1.0.2",
2232
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
2233
+ "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
2234
+ "license": "MIT",
2235
+ "engines": {
2236
+ "node": ">= 0.6.0"
2237
+ }
2238
+ },
2239
+ "node_modules/binary-extensions": {
2240
+ "version": "2.3.0",
2241
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
2242
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
2243
+ "dev": true,
2244
+ "license": "MIT",
2245
+ "engines": {
2246
+ "node": ">=8"
2247
+ },
2248
+ "funding": {
2249
+ "url": "https://github.com/sponsors/sindresorhus"
2250
+ }
2251
+ },
2252
  "node_modules/brace-expansion": {
2253
  "version": "1.1.11",
2254
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
 
2276
  "version": "4.24.4",
2277
  "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
2278
  "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
 
2279
  "funding": [
2280
  {
2281
  "type": "opencollective",
 
2304
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
2305
  }
2306
  },
2307
+ "node_modules/buffer-builder": {
2308
+ "version": "0.2.0",
2309
+ "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz",
2310
+ "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==",
2311
+ "license": "MIT/X11"
2312
+ },
2313
  "node_modules/bufferutil": {
2314
  "version": "4.0.9",
2315
  "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz",
 
2333
  "node": ">=6"
2334
  }
2335
  },
2336
+ "node_modules/camelcase-css": {
2337
+ "version": "2.0.1",
2338
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
2339
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
2340
+ "dev": true,
2341
+ "license": "MIT",
2342
+ "engines": {
2343
+ "node": ">= 6"
2344
+ }
2345
+ },
2346
  "node_modules/caniuse-lite": {
2347
  "version": "1.0.30001699",
2348
  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
2349
  "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==",
 
2350
  "funding": [
2351
  {
2352
  "type": "opencollective",
 
2380
  "url": "https://github.com/chalk/chalk?sponsor=1"
2381
  }
2382
  },
2383
+ "node_modules/chokidar": {
2384
+ "version": "3.6.0",
2385
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
2386
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
2387
+ "dev": true,
2388
+ "license": "MIT",
2389
+ "dependencies": {
2390
+ "anymatch": "~3.1.2",
2391
+ "braces": "~3.0.2",
2392
+ "glob-parent": "~5.1.2",
2393
+ "is-binary-path": "~2.1.0",
2394
+ "is-glob": "~4.0.1",
2395
+ "normalize-path": "~3.0.0",
2396
+ "readdirp": "~3.6.0"
2397
+ },
2398
+ "engines": {
2399
+ "node": ">= 8.10.0"
2400
+ },
2401
+ "funding": {
2402
+ "url": "https://paulmillr.com/funding/"
2403
+ },
2404
+ "optionalDependencies": {
2405
+ "fsevents": "~2.3.2"
2406
+ }
2407
+ },
2408
+ "node_modules/chokidar/node_modules/glob-parent": {
2409
+ "version": "5.1.2",
2410
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
2411
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
2412
+ "dev": true,
2413
+ "license": "ISC",
2414
+ "dependencies": {
2415
+ "is-glob": "^4.0.1"
2416
+ },
2417
+ "engines": {
2418
+ "node": ">= 6"
2419
+ }
2420
+ },
2421
  "node_modules/cli-width": {
2422
  "version": "4.1.0",
2423
  "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
 
2458
  "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2459
  }
2460
  },
2461
+ "node_modules/codec-parser": {
2462
+ "version": "2.5.0",
2463
+ "resolved": "https://registry.npmjs.org/codec-parser/-/codec-parser-2.5.0.tgz",
2464
+ "integrity": "sha512-Ru9t80fV8B0ZiixQl8xhMTLru+dzuis/KQld32/x5T/+3LwZb0/YvQdSKytX9JqCnRdiupvAvyYJINKrXieziQ==",
2465
+ "license": "LGPL-3.0-or-later"
2466
+ },
2467
  "node_modules/color-convert": {
2468
  "version": "2.0.1",
2469
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
 
2482
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2483
  "license": "MIT"
2484
  },
2485
+ "node_modules/colorjs.io": {
2486
+ "version": "0.5.2",
2487
+ "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz",
2488
+ "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==",
2489
+ "license": "MIT"
2490
+ },
2491
+ "node_modules/commander": {
2492
+ "version": "4.1.1",
2493
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
2494
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
2495
+ "dev": true,
2496
+ "license": "MIT",
2497
+ "engines": {
2498
+ "node": ">= 6"
2499
+ }
2500
+ },
2501
  "node_modules/concat-map": {
2502
  "version": "0.0.1",
2503
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 
2536
  "node": ">= 8"
2537
  }
2538
  },
2539
+ "node_modules/css-selector-tokenizer": {
2540
+ "version": "0.8.0",
2541
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz",
2542
+ "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==",
2543
  "dev": true,
2544
+ "license": "MIT",
2545
+ "dependencies": {
2546
+ "cssesc": "^3.0.0",
2547
+ "fastparse": "^1.1.2"
2548
+ }
2549
  },
2550
+ "node_modules/cssesc": {
2551
+ "version": "3.0.0",
2552
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
2553
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
2554
+ "dev": true,
2555
+ "license": "MIT",
2556
+ "bin": {
2557
+ "cssesc": "bin/cssesc"
2558
+ },
2559
+ "engines": {
2560
+ "node": ">=4"
2561
+ }
2562
+ },
2563
+ "node_modules/csstype": {
2564
+ "version": "3.1.3",
2565
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
2566
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
2567
+ "dev": true,
2568
+ "license": "MIT"
2569
+ },
2570
+ "node_modules/culori": {
2571
+ "version": "3.3.0",
2572
+ "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz",
2573
+ "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==",
2574
+ "dev": true,
2575
+ "license": "MIT",
2576
+ "engines": {
2577
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
2578
+ }
2579
+ },
2580
+ "node_modules/daisyui": {
2581
+ "version": "4.12.23",
2582
+ "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.23.tgz",
2583
+ "integrity": "sha512-EM38duvxutJ5PD65lO/AFMpcw+9qEy6XAZrTpzp7WyaPeO/l+F/Qiq0ECHHmFNcFXh5aVoALY4MGrrxtCiaQCQ==",
2584
+ "dev": true,
2585
+ "license": "MIT",
2586
+ "dependencies": {
2587
+ "css-selector-tokenizer": "^0.8",
2588
+ "culori": "^3",
2589
+ "picocolors": "^1",
2590
+ "postcss-js": "^4"
2591
+ },
2592
+ "engines": {
2593
+ "node": ">=16.9.0"
2594
+ },
2595
+ "funding": {
2596
+ "type": "opencollective",
2597
+ "url": "https://opencollective.com/daisyui"
2598
+ }
2599
+ },
2600
+ "node_modules/debug": {
2601
+ "version": "4.4.0",
2602
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
2603
  "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
2604
  "dev": true,
 
2622
  "dev": true,
2623
  "license": "MIT"
2624
  },
2625
+ "node_modules/detect-libc": {
2626
+ "version": "1.0.3",
2627
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
2628
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
2629
+ "license": "Apache-2.0",
2630
+ "optional": true,
2631
+ "peer": true,
2632
+ "bin": {
2633
+ "detect-libc": "bin/detect-libc.js"
2634
+ },
2635
+ "engines": {
2636
+ "node": ">=0.10"
2637
+ }
2638
+ },
2639
+ "node_modules/didyoumean": {
2640
+ "version": "1.2.2",
2641
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
2642
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
2643
+ "dev": true,
2644
+ "license": "Apache-2.0"
2645
+ },
2646
+ "node_modules/dlv": {
2647
+ "version": "1.1.3",
2648
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
2649
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
2650
+ "dev": true,
2651
+ "license": "MIT"
2652
+ },
2653
+ "node_modules/eastasianwidth": {
2654
+ "version": "0.2.0",
2655
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
2656
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
2657
+ "dev": true,
2658
+ "license": "MIT"
2659
+ },
2660
  "node_modules/electron-to-chromium": {
2661
  "version": "1.5.101",
2662
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.101.tgz",
2663
  "integrity": "sha512-L0ISiQrP/56Acgu4/i/kfPwWSgrzYZUnQrC0+QPFuhqlLP1Ir7qzPPDVS9BcKIyWTRU8+o6CC8dKw38tSWhYIA==",
 
2664
  "license": "ISC"
2665
  },
2666
  "node_modules/emoji-regex": {
 
2968
  "dev": true,
2969
  "license": "MIT"
2970
  },
2971
+ "node_modules/fastparse": {
2972
+ "version": "1.1.2",
2973
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
2974
+ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
2975
+ "dev": true,
2976
+ "license": "MIT"
2977
+ },
2978
  "node_modules/fastq": {
2979
  "version": "1.19.0",
2980
  "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
 
3054
  "dev": true,
3055
  "license": "ISC"
3056
  },
3057
+ "node_modules/foreground-child": {
3058
+ "version": "3.3.0",
3059
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
3060
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
3061
+ "dev": true,
3062
+ "license": "ISC",
3063
+ "dependencies": {
3064
+ "cross-spawn": "^7.0.0",
3065
+ "signal-exit": "^4.0.1"
3066
+ },
3067
+ "engines": {
3068
+ "node": ">=14"
3069
+ },
3070
+ "funding": {
3071
+ "url": "https://github.com/sponsors/isaacs"
3072
+ }
3073
+ },
3074
+ "node_modules/fraction.js": {
3075
+ "version": "4.3.7",
3076
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
3077
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
3078
+ "license": "MIT",
3079
+ "engines": {
3080
+ "node": "*"
3081
+ },
3082
+ "funding": {
3083
+ "type": "patreon",
3084
+ "url": "https://github.com/sponsors/rawify"
3085
+ }
3086
+ },
3087
  "node_modules/fsevents": {
3088
  "version": "2.3.3",
3089
  "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
 
3098
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
3099
  }
3100
  },
3101
+ "node_modules/function-bind": {
3102
+ "version": "1.1.2",
3103
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
3104
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
3105
+ "dev": true,
3106
+ "license": "MIT",
3107
+ "funding": {
3108
+ "url": "https://github.com/sponsors/ljharb"
3109
+ }
3110
+ },
3111
  "node_modules/gensync": {
3112
  "version": "1.0.0-beta.2",
3113
  "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
 
3127
  "node": "6.* || 8.* || >= 10.*"
3128
  }
3129
  },
3130
+ "node_modules/glob": {
3131
+ "version": "10.4.5",
3132
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
3133
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
3134
+ "dev": true,
3135
+ "license": "ISC",
3136
+ "dependencies": {
3137
+ "foreground-child": "^3.1.0",
3138
+ "jackspeak": "^3.1.2",
3139
+ "minimatch": "^9.0.4",
3140
+ "minipass": "^7.1.2",
3141
+ "package-json-from-dist": "^1.0.0",
3142
+ "path-scurry": "^1.11.1"
3143
+ },
3144
+ "bin": {
3145
+ "glob": "dist/esm/bin.mjs"
3146
+ },
3147
+ "funding": {
3148
+ "url": "https://github.com/sponsors/isaacs"
3149
+ }
3150
+ },
3151
  "node_modules/glob-parent": {
3152
  "version": "6.0.2",
3153
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
 
3161
  "node": ">=10.13.0"
3162
  }
3163
  },
3164
+ "node_modules/glob/node_modules/brace-expansion": {
3165
+ "version": "2.0.1",
3166
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
3167
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
3168
+ "dev": true,
3169
+ "license": "MIT",
3170
+ "dependencies": {
3171
+ "balanced-match": "^1.0.0"
3172
+ }
3173
+ },
3174
+ "node_modules/glob/node_modules/minimatch": {
3175
+ "version": "9.0.5",
3176
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
3177
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
3178
+ "dev": true,
3179
+ "license": "ISC",
3180
+ "dependencies": {
3181
+ "brace-expansion": "^2.0.1"
3182
+ },
3183
+ "engines": {
3184
+ "node": ">=16 || 14 >=14.17"
3185
+ },
3186
+ "funding": {
3187
+ "url": "https://github.com/sponsors/isaacs"
3188
+ }
3189
+ },
3190
  "node_modules/globals": {
3191
  "version": "15.15.0",
3192
  "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
 
3220
  "version": "4.0.0",
3221
  "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
3222
  "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
 
3223
  "license": "MIT",
3224
  "engines": {
3225
  "node": ">=8"
3226
  }
3227
  },
3228
+ "node_modules/hasown": {
3229
+ "version": "2.0.2",
3230
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
3231
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
3232
+ "dev": true,
3233
+ "license": "MIT",
3234
+ "dependencies": {
3235
+ "function-bind": "^1.1.2"
3236
+ },
3237
+ "engines": {
3238
+ "node": ">= 0.4"
3239
+ }
3240
+ },
3241
  "node_modules/headers-polyfill": {
3242
  "version": "4.0.3",
3243
  "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz",
 
3254
  "node": ">= 4"
3255
  }
3256
  },
3257
+ "node_modules/immutable": {
3258
+ "version": "5.0.3",
3259
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz",
3260
+ "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==",
3261
+ "license": "MIT"
3262
+ },
3263
  "node_modules/import-fresh": {
3264
  "version": "3.3.1",
3265
  "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
 
3287
  "node": ">=0.8.19"
3288
  }
3289
  },
3290
+ "node_modules/is-binary-path": {
3291
+ "version": "2.1.0",
3292
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
3293
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
3294
+ "dev": true,
3295
+ "license": "MIT",
3296
+ "dependencies": {
3297
+ "binary-extensions": "^2.0.0"
3298
+ },
3299
+ "engines": {
3300
+ "node": ">=8"
3301
+ }
3302
+ },
3303
+ "node_modules/is-core-module": {
3304
+ "version": "2.16.1",
3305
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
3306
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
3307
+ "dev": true,
3308
+ "license": "MIT",
3309
+ "dependencies": {
3310
+ "hasown": "^2.0.2"
3311
+ },
3312
+ "engines": {
3313
+ "node": ">= 0.4"
3314
+ },
3315
+ "funding": {
3316
+ "url": "https://github.com/sponsors/ljharb"
3317
+ }
3318
+ },
3319
  "node_modules/is-extglob": {
3320
  "version": "2.1.1",
3321
  "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
 
3370
  "dev": true,
3371
  "license": "ISC"
3372
  },
3373
+ "node_modules/jackspeak": {
3374
+ "version": "3.4.3",
3375
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
3376
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
3377
+ "dev": true,
3378
+ "license": "BlueOak-1.0.0",
3379
+ "dependencies": {
3380
+ "@isaacs/cliui": "^8.0.2"
3381
+ },
3382
+ "funding": {
3383
+ "url": "https://github.com/sponsors/isaacs"
3384
+ },
3385
+ "optionalDependencies": {
3386
+ "@pkgjs/parseargs": "^0.11.0"
3387
+ }
3388
+ },
3389
+ "node_modules/jiti": {
3390
+ "version": "2.4.2",
3391
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
3392
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
3393
+ "license": "MIT",
3394
+ "optional": true,
3395
+ "peer": true,
3396
+ "bin": {
3397
+ "jiti": "lib/jiti-cli.mjs"
3398
+ }
3399
+ },
3400
  "node_modules/js-tokens": {
3401
  "version": "4.0.0",
3402
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 
3488
  "node": ">= 0.8.0"
3489
  }
3490
  },
3491
+ "node_modules/lightningcss": {
3492
+ "version": "1.29.1",
3493
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz",
3494
+ "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==",
3495
+ "license": "MPL-2.0",
3496
+ "optional": true,
3497
+ "peer": true,
3498
  "dependencies": {
3499
+ "detect-libc": "^1.0.3"
3500
  },
3501
  "engines": {
3502
+ "node": ">= 12.0.0"
3503
  },
3504
  "funding": {
3505
+ "type": "opencollective",
3506
+ "url": "https://opencollective.com/parcel"
3507
+ },
3508
+ "optionalDependencies": {
3509
+ "lightningcss-darwin-arm64": "1.29.1",
3510
+ "lightningcss-darwin-x64": "1.29.1",
3511
+ "lightningcss-freebsd-x64": "1.29.1",
3512
+ "lightningcss-linux-arm-gnueabihf": "1.29.1",
3513
+ "lightningcss-linux-arm64-gnu": "1.29.1",
3514
+ "lightningcss-linux-arm64-musl": "1.29.1",
3515
+ "lightningcss-linux-x64-gnu": "1.29.1",
3516
+ "lightningcss-linux-x64-musl": "1.29.1",
3517
+ "lightningcss-win32-arm64-msvc": "1.29.1",
3518
+ "lightningcss-win32-x64-msvc": "1.29.1"
3519
+ }
3520
+ },
3521
+ "node_modules/lightningcss-darwin-arm64": {
3522
+ "version": "1.29.1",
3523
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz",
3524
+ "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==",
3525
+ "cpu": [
3526
+ "arm64"
3527
+ ],
3528
+ "license": "MPL-2.0",
3529
+ "optional": true,
3530
+ "os": [
3531
+ "darwin"
3532
+ ],
3533
+ "peer": true,
3534
+ "engines": {
3535
+ "node": ">= 12.0.0"
3536
+ },
3537
+ "funding": {
3538
+ "type": "opencollective",
3539
+ "url": "https://opencollective.com/parcel"
3540
  }
3541
  },
3542
+ "node_modules/lightningcss-darwin-x64": {
3543
+ "version": "1.29.1",
3544
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz",
3545
+ "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==",
3546
+ "cpu": [
3547
+ "x64"
3548
+ ],
3549
+ "license": "MPL-2.0",
3550
+ "optional": true,
3551
+ "os": [
3552
+ "darwin"
3553
+ ],
3554
+ "peer": true,
3555
  "engines": {
3556
+ "node": ">= 12.0.0"
3557
+ },
3558
+ "funding": {
3559
+ "type": "opencollective",
3560
+ "url": "https://opencollective.com/parcel"
3561
  }
3562
  },
3563
+ "node_modules/lightningcss-freebsd-x64": {
3564
+ "version": "1.29.1",
3565
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz",
3566
+ "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==",
3567
+ "cpu": [
3568
+ "x64"
3569
+ ],
3570
+ "license": "MPL-2.0",
3571
+ "optional": true,
3572
+ "os": [
3573
+ "freebsd"
3574
+ ],
3575
+ "peer": true,
3576
  "engines": {
3577
+ "node": ">= 12.0.0"
3578
+ },
3579
+ "funding": {
3580
+ "type": "opencollective",
3581
+ "url": "https://opencollective.com/parcel"
3582
  }
3583
  },
3584
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
3585
+ "version": "1.29.1",
3586
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz",
3587
+ "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==",
3588
+ "cpu": [
3589
+ "arm"
3590
+ ],
3591
+ "license": "MPL-2.0",
3592
+ "optional": true,
3593
+ "os": [
3594
+ "linux"
3595
+ ],
3596
+ "peer": true,
3597
  "engines": {
3598
+ "node": ">= 12.0.0"
3599
+ },
3600
+ "funding": {
3601
+ "type": "opencollective",
3602
+ "url": "https://opencollective.com/parcel"
3603
+ }
3604
+ },
3605
+ "node_modules/lightningcss-linux-arm64-gnu": {
3606
+ "version": "1.29.1",
3607
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz",
3608
+ "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==",
3609
+ "cpu": [
3610
+ "arm64"
3611
+ ],
3612
+ "license": "MPL-2.0",
3613
+ "optional": true,
3614
+ "os": [
3615
+ "linux"
3616
+ ],
3617
+ "peer": true,
3618
+ "engines": {
3619
+ "node": ">= 12.0.0"
3620
+ },
3621
+ "funding": {
3622
+ "type": "opencollective",
3623
+ "url": "https://opencollective.com/parcel"
3624
+ }
3625
+ },
3626
+ "node_modules/lightningcss-linux-arm64-musl": {
3627
+ "version": "1.29.1",
3628
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz",
3629
+ "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==",
3630
+ "cpu": [
3631
+ "arm64"
3632
+ ],
3633
+ "license": "MPL-2.0",
3634
+ "optional": true,
3635
+ "os": [
3636
+ "linux"
3637
+ ],
3638
+ "peer": true,
3639
+ "engines": {
3640
+ "node": ">= 12.0.0"
3641
+ },
3642
+ "funding": {
3643
+ "type": "opencollective",
3644
+ "url": "https://opencollective.com/parcel"
3645
+ }
3646
+ },
3647
+ "node_modules/lightningcss-linux-x64-gnu": {
3648
+ "version": "1.29.1",
3649
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz",
3650
+ "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==",
3651
+ "cpu": [
3652
+ "x64"
3653
+ ],
3654
+ "license": "MPL-2.0",
3655
+ "optional": true,
3656
+ "os": [
3657
+ "linux"
3658
+ ],
3659
+ "peer": true,
3660
+ "engines": {
3661
+ "node": ">= 12.0.0"
3662
+ },
3663
+ "funding": {
3664
+ "type": "opencollective",
3665
+ "url": "https://opencollective.com/parcel"
3666
+ }
3667
+ },
3668
+ "node_modules/lightningcss-linux-x64-musl": {
3669
+ "version": "1.29.1",
3670
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz",
3671
+ "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==",
3672
+ "cpu": [
3673
+ "x64"
3674
+ ],
3675
+ "license": "MPL-2.0",
3676
+ "optional": true,
3677
+ "os": [
3678
+ "linux"
3679
+ ],
3680
+ "peer": true,
3681
+ "engines": {
3682
+ "node": ">= 12.0.0"
3683
+ },
3684
+ "funding": {
3685
+ "type": "opencollective",
3686
+ "url": "https://opencollective.com/parcel"
3687
+ }
3688
+ },
3689
+ "node_modules/lightningcss-win32-arm64-msvc": {
3690
+ "version": "1.29.1",
3691
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz",
3692
+ "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==",
3693
+ "cpu": [
3694
+ "arm64"
3695
+ ],
3696
+ "license": "MPL-2.0",
3697
+ "optional": true,
3698
+ "os": [
3699
+ "win32"
3700
+ ],
3701
+ "peer": true,
3702
+ "engines": {
3703
+ "node": ">= 12.0.0"
3704
+ },
3705
+ "funding": {
3706
+ "type": "opencollective",
3707
+ "url": "https://opencollective.com/parcel"
3708
+ }
3709
+ },
3710
+ "node_modules/lightningcss-win32-x64-msvc": {
3711
+ "version": "1.29.1",
3712
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz",
3713
+ "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==",
3714
+ "cpu": [
3715
+ "x64"
3716
+ ],
3717
+ "license": "MPL-2.0",
3718
+ "optional": true,
3719
+ "os": [
3720
+ "win32"
3721
+ ],
3722
+ "peer": true,
3723
+ "engines": {
3724
+ "node": ">= 12.0.0"
3725
+ },
3726
+ "funding": {
3727
+ "type": "opencollective",
3728
+ "url": "https://opencollective.com/parcel"
3729
+ }
3730
+ },
3731
+ "node_modules/lilconfig": {
3732
+ "version": "3.1.3",
3733
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
3734
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
3735
+ "dev": true,
3736
+ "license": "MIT",
3737
+ "engines": {
3738
+ "node": ">=14"
3739
+ },
3740
+ "funding": {
3741
+ "url": "https://github.com/sponsors/antonk52"
3742
+ }
3743
+ },
3744
+ "node_modules/lines-and-columns": {
3745
+ "version": "1.2.4",
3746
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
3747
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
3748
+ "dev": true,
3749
+ "license": "MIT"
3750
+ },
3751
+ "node_modules/locate-path": {
3752
+ "version": "6.0.0",
3753
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
3754
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
3755
+ "dev": true,
3756
+ "license": "MIT",
3757
+ "dependencies": {
3758
+ "p-locate": "^5.0.0"
3759
+ },
3760
+ "engines": {
3761
+ "node": ">=10"
3762
+ },
3763
+ "funding": {
3764
+ "url": "https://github.com/sponsors/sindresorhus"
3765
+ }
3766
+ },
3767
+ "node_modules/lodash.merge": {
3768
+ "version": "4.6.2",
3769
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
3770
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
3771
+ "dev": true,
3772
+ "license": "MIT"
3773
+ },
3774
+ "node_modules/lru-cache": {
3775
+ "version": "5.1.1",
3776
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
3777
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
3778
+ "dev": true,
3779
+ "license": "ISC",
3780
+ "dependencies": {
3781
+ "yallist": "^3.0.2"
3782
+ }
3783
+ },
3784
+ "node_modules/merge2": {
3785
+ "version": "1.4.1",
3786
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
3787
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
3788
+ "dev": true,
3789
+ "license": "MIT",
3790
+ "engines": {
3791
+ "node": ">= 8"
3792
+ }
3793
+ },
3794
+ "node_modules/micromatch": {
3795
+ "version": "4.0.8",
3796
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
3797
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
3798
+ "license": "MIT",
3799
+ "dependencies": {
3800
+ "braces": "^3.0.3",
3801
+ "picomatch": "^2.3.1"
3802
+ },
3803
+ "engines": {
3804
+ "node": ">=8.6"
3805
+ }
3806
+ },
3807
+ "node_modules/minimatch": {
3808
+ "version": "3.1.2",
3809
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
3810
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
3811
+ "dev": true,
3812
+ "license": "ISC",
3813
+ "dependencies": {
3814
+ "brace-expansion": "^1.1.7"
3815
+ },
3816
+ "engines": {
3817
+ "node": "*"
3818
+ }
3819
+ },
3820
+ "node_modules/minipass": {
3821
+ "version": "7.1.2",
3822
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
3823
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
3824
+ "dev": true,
3825
+ "license": "ISC",
3826
+ "engines": {
3827
+ "node": ">=16 || 14 >=14.17"
3828
+ }
3829
+ },
3830
+ "node_modules/mpg123-decoder": {
3831
+ "version": "1.0.0",
3832
+ "resolved": "https://registry.npmjs.org/mpg123-decoder/-/mpg123-decoder-1.0.0.tgz",
3833
+ "integrity": "sha512-WV+pyuMUhRqv7s8S6p/Ii4KQHdBD1pb3yaABxcKJRsNp+HQ/Y6z2iIBIaOZu0JMHPTOoICYt0REDZ7XfLu+n/g==",
3834
+ "license": "MIT",
3835
+ "dependencies": {
3836
+ "@wasm-audio-decoders/common": "9.0.5"
3837
+ },
3838
+ "funding": {
3839
+ "type": "individual",
3840
+ "url": "https://github.com/sponsors/eshaz"
3841
  }
3842
  },
3843
  "node_modules/ms": {
 
3900
  "node": "^18.17.0 || >=20.5.0"
3901
  }
3902
  },
3903
+ "node_modules/mz": {
3904
+ "version": "2.7.0",
3905
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
3906
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
3907
+ "dev": true,
3908
+ "license": "MIT",
3909
+ "dependencies": {
3910
+ "any-promise": "^1.0.0",
3911
+ "object-assign": "^4.0.1",
3912
+ "thenify-all": "^1.0.0"
3913
+ }
3914
+ },
3915
  "node_modules/nanoid": {
3916
  "version": "3.3.8",
3917
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
 
3952
  "version": "2.0.19",
3953
  "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
3954
  "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
 
3955
  "license": "MIT"
3956
  },
3957
+ "node_modules/node-wav": {
3958
+ "version": "0.0.2",
3959
+ "resolved": "https://registry.npmjs.org/node-wav/-/node-wav-0.0.2.tgz",
3960
+ "integrity": "sha512-M6Rm/bbG6De/gKGxOpeOobx/dnGuP0dz40adqx38boqHhlWssBJZgLCPBNtb9NkrmnKYiV04xELq+R6PFOnoLA==",
3961
+ "license": "MIT",
3962
+ "engines": {
3963
+ "node": ">=4.4.0"
3964
+ }
3965
+ },
3966
+ "node_modules/normalize-path": {
3967
+ "version": "3.0.0",
3968
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
3969
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
3970
+ "dev": true,
3971
+ "license": "MIT",
3972
+ "engines": {
3973
+ "node": ">=0.10.0"
3974
+ }
3975
+ },
3976
+ "node_modules/normalize-range": {
3977
+ "version": "0.1.2",
3978
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
3979
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
3980
+ "license": "MIT",
3981
+ "engines": {
3982
+ "node": ">=0.10.0"
3983
+ }
3984
+ },
3985
+ "node_modules/object-assign": {
3986
+ "version": "4.1.1",
3987
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
3988
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
3989
+ "dev": true,
3990
+ "license": "MIT",
3991
+ "engines": {
3992
+ "node": ">=0.10.0"
3993
+ }
3994
+ },
3995
+ "node_modules/object-hash": {
3996
+ "version": "3.0.0",
3997
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
3998
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
3999
+ "dev": true,
4000
+ "license": "MIT",
4001
+ "engines": {
4002
+ "node": ">= 6"
4003
+ }
4004
+ },
4005
+ "node_modules/ogg-opus-decoder": {
4006
+ "version": "1.6.14",
4007
+ "resolved": "https://registry.npmjs.org/ogg-opus-decoder/-/ogg-opus-decoder-1.6.14.tgz",
4008
+ "integrity": "sha512-RQpk9yFl/mqXFwcgf1BrEYWL92HZk++aU1fOO8mPZ1+1DUYbJdpdUQEFfbPE1xcBkRGU3p75DjEO+EDMNeikFQ==",
4009
+ "license": "MIT",
4010
+ "dependencies": {
4011
+ "@wasm-audio-decoders/common": "9.0.5",
4012
+ "codec-parser": "2.5.0",
4013
+ "opus-decoder": "0.7.7"
4014
+ },
4015
+ "funding": {
4016
+ "type": "individual",
4017
+ "url": "https://github.com/sponsors/eshaz"
4018
+ }
4019
+ },
4020
  "node_modules/optionator": {
4021
  "version": "0.9.4",
4022
  "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
 
4035
  "node": ">= 0.8.0"
4036
  }
4037
  },
4038
+ "node_modules/opus-decoder": {
4039
+ "version": "0.7.7",
4040
+ "resolved": "https://registry.npmjs.org/opus-decoder/-/opus-decoder-0.7.7.tgz",
4041
+ "integrity": "sha512-KWDyCi/9aXnNN+jrjs+aaVdwiwzDdac81S9ul0iv1CTs4+5K4VDZKuJjIImrYOBA2oSNHDjVq4xzn6BE+XbI1A==",
4042
+ "license": "MIT",
4043
+ "dependencies": {
4044
+ "@wasm-audio-decoders/common": "9.0.5"
4045
+ },
4046
+ "funding": {
4047
+ "type": "individual",
4048
+ "url": "https://github.com/sponsors/eshaz"
4049
+ }
4050
+ },
4051
  "node_modules/outvariant": {
4052
  "version": "1.4.3",
4053
  "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz",
 
4086
  "url": "https://github.com/sponsors/sindresorhus"
4087
  }
4088
  },
4089
+ "node_modules/package-json-from-dist": {
4090
+ "version": "1.0.1",
4091
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
4092
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
4093
+ "dev": true,
4094
+ "license": "BlueOak-1.0.0"
4095
+ },
4096
  "node_modules/parent-module": {
4097
  "version": "1.0.1",
4098
  "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
 
4126
  "node": ">=8"
4127
  }
4128
  },
4129
+ "node_modules/path-parse": {
4130
+ "version": "1.0.7",
4131
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
4132
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
4133
+ "dev": true,
4134
+ "license": "MIT"
4135
+ },
4136
+ "node_modules/path-scurry": {
4137
+ "version": "1.11.1",
4138
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
4139
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
4140
+ "dev": true,
4141
+ "license": "BlueOak-1.0.0",
4142
+ "dependencies": {
4143
+ "lru-cache": "^10.2.0",
4144
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
4145
+ },
4146
+ "engines": {
4147
+ "node": ">=16 || 14 >=14.18"
4148
+ },
4149
+ "funding": {
4150
+ "url": "https://github.com/sponsors/isaacs"
4151
+ }
4152
+ },
4153
+ "node_modules/path-scurry/node_modules/lru-cache": {
4154
+ "version": "10.4.3",
4155
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
4156
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
4157
+ "dev": true,
4158
+ "license": "ISC"
4159
+ },
4160
  "node_modules/path-to-regexp": {
4161
  "version": "6.3.0",
4162
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
 
4181
  "url": "https://github.com/sponsors/jonschlinkert"
4182
  }
4183
  },
4184
+ "node_modules/pify": {
4185
+ "version": "2.3.0",
4186
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
4187
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
4188
+ "dev": true,
4189
+ "license": "MIT",
4190
+ "engines": {
4191
+ "node": ">=0.10.0"
4192
+ }
4193
+ },
4194
+ "node_modules/pirates": {
4195
+ "version": "4.0.6",
4196
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
4197
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
4198
+ "dev": true,
4199
+ "license": "MIT",
4200
+ "engines": {
4201
+ "node": ">= 6"
4202
+ }
4203
+ },
4204
  "node_modules/postcss": {
4205
  "version": "8.5.2",
4206
  "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
 
4229
  "node": "^10 || ^12 || >=14"
4230
  }
4231
  },
4232
+ "node_modules/postcss-import": {
4233
+ "version": "15.1.0",
4234
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
4235
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
4236
  "dev": true,
4237
  "license": "MIT",
4238
+ "dependencies": {
4239
+ "postcss-value-parser": "^4.0.0",
4240
+ "read-cache": "^1.0.0",
4241
+ "resolve": "^1.1.7"
4242
+ },
4243
+ "engines": {
4244
+ "node": ">=14.0.0"
4245
+ },
4246
+ "peerDependencies": {
4247
+ "postcss": "^8.0.0"
4248
+ }
4249
+ },
4250
+ "node_modules/postcss-js": {
4251
+ "version": "4.0.1",
4252
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
4253
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
4254
+ "dev": true,
4255
+ "license": "MIT",
4256
+ "dependencies": {
4257
+ "camelcase-css": "^2.0.1"
4258
+ },
4259
+ "engines": {
4260
+ "node": "^12 || ^14 || >= 16"
4261
+ },
4262
+ "funding": {
4263
+ "type": "opencollective",
4264
+ "url": "https://opencollective.com/postcss/"
4265
+ },
4266
+ "peerDependencies": {
4267
+ "postcss": "^8.4.21"
4268
+ }
4269
+ },
4270
+ "node_modules/postcss-load-config": {
4271
+ "version": "4.0.2",
4272
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
4273
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
4274
+ "dev": true,
4275
+ "funding": [
4276
+ {
4277
+ "type": "opencollective",
4278
+ "url": "https://opencollective.com/postcss/"
4279
+ },
4280
+ {
4281
+ "type": "github",
4282
+ "url": "https://github.com/sponsors/ai"
4283
+ }
4284
+ ],
4285
+ "license": "MIT",
4286
+ "dependencies": {
4287
+ "lilconfig": "^3.0.0",
4288
+ "yaml": "^2.3.4"
4289
+ },
4290
+ "engines": {
4291
+ "node": ">= 14"
4292
+ },
4293
+ "peerDependencies": {
4294
+ "postcss": ">=8.0.9",
4295
+ "ts-node": ">=9.0.0"
4296
+ },
4297
+ "peerDependenciesMeta": {
4298
+ "postcss": {
4299
+ "optional": true
4300
+ },
4301
+ "ts-node": {
4302
+ "optional": true
4303
+ }
4304
+ }
4305
+ },
4306
+ "node_modules/postcss-nested": {
4307
+ "version": "6.2.0",
4308
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
4309
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
4310
+ "dev": true,
4311
+ "funding": [
4312
+ {
4313
+ "type": "opencollective",
4314
+ "url": "https://opencollective.com/postcss/"
4315
+ },
4316
+ {
4317
+ "type": "github",
4318
+ "url": "https://github.com/sponsors/ai"
4319
+ }
4320
+ ],
4321
+ "license": "MIT",
4322
+ "dependencies": {
4323
+ "postcss-selector-parser": "^6.1.1"
4324
+ },
4325
+ "engines": {
4326
+ "node": ">=12.0"
4327
+ },
4328
+ "peerDependencies": {
4329
+ "postcss": "^8.2.14"
4330
+ }
4331
+ },
4332
+ "node_modules/postcss-selector-parser": {
4333
+ "version": "6.1.2",
4334
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
4335
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
4336
+ "dev": true,
4337
+ "license": "MIT",
4338
+ "dependencies": {
4339
+ "cssesc": "^3.0.0",
4340
+ "util-deprecate": "^1.0.2"
4341
+ },
4342
+ "engines": {
4343
+ "node": ">=4"
4344
+ }
4345
+ },
4346
+ "node_modules/postcss-value-parser": {
4347
+ "version": "4.2.0",
4348
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
4349
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
4350
+ "license": "MIT"
4351
+ },
4352
+ "node_modules/prelude-ls": {
4353
+ "version": "1.2.1",
4354
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
4355
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
4356
+ "dev": true,
4357
+ "license": "MIT",
4358
+ "engines": {
4359
  "node": ">= 0.8.0"
4360
  }
4361
  },
4362
+ "node_modules/prettier": {
4363
+ "version": "3.5.1",
4364
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz",
4365
+ "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==",
4366
+ "dev": true,
4367
+ "license": "MIT",
4368
+ "bin": {
4369
+ "prettier": "bin/prettier.cjs"
4370
+ },
4371
+ "engines": {
4372
+ "node": ">=14"
4373
+ },
4374
+ "funding": {
4375
+ "url": "https://github.com/prettier/prettier?sponsor=1"
4376
+ }
4377
+ },
4378
  "node_modules/psl": {
4379
  "version": "1.15.0",
4380
  "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
 
4396
  "node": ">=6"
4397
  }
4398
  },
4399
+ "node_modules/qoa-format": {
4400
+ "version": "1.0.1",
4401
+ "resolved": "https://registry.npmjs.org/qoa-format/-/qoa-format-1.0.1.tgz",
4402
+ "integrity": "sha512-dMB0Z6XQjdpz/Cw4Rf6RiBpQvUSPCfYlQMWvmuWlWkAT7nDQD29cVZ1SwDUB6DYJSitHENwbt90lqfI+7bvMcw==",
4403
+ "license": "MIT",
4404
+ "dependencies": {
4405
+ "@thi.ng/bitstream": "^2.2.12"
4406
+ }
4407
+ },
4408
  "node_modules/querystringify": {
4409
  "version": "2.2.0",
4410
  "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
 
4453
  "react": "^19.0.0"
4454
  }
4455
  },
4456
+ "node_modules/react-refresh": {
4457
+ "version": "0.14.2",
4458
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
4459
+ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
4460
+ "dev": true,
4461
+ "license": "MIT",
4462
+ "engines": {
4463
+ "node": ">=0.10.0"
4464
+ }
4465
+ },
4466
+ "node_modules/read-cache": {
4467
+ "version": "1.0.0",
4468
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
4469
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
4470
+ "dev": true,
4471
+ "license": "MIT",
4472
+ "dependencies": {
4473
+ "pify": "^2.3.0"
4474
+ }
4475
+ },
4476
+ "node_modules/readdirp": {
4477
+ "version": "3.6.0",
4478
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
4479
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
4480
+ "dev": true,
4481
+ "license": "MIT",
4482
+ "dependencies": {
4483
+ "picomatch": "^2.2.1"
4484
+ },
4485
+ "engines": {
4486
+ "node": ">=8.10.0"
4487
+ }
4488
+ },
4489
+ "node_modules/require-directory": {
4490
+ "version": "2.1.1",
4491
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
4492
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
4493
+ "license": "MIT",
4494
+ "engines": {
4495
+ "node": ">=0.10.0"
4496
+ }
4497
+ },
4498
+ "node_modules/requires-port": {
4499
+ "version": "1.0.0",
4500
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
4501
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
4502
+ "license": "MIT"
4503
+ },
4504
+ "node_modules/resolve": {
4505
+ "version": "1.22.10",
4506
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
4507
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
4508
+ "dev": true,
4509
+ "license": "MIT",
4510
+ "dependencies": {
4511
+ "is-core-module": "^2.16.0",
4512
+ "path-parse": "^1.0.7",
4513
+ "supports-preserve-symlinks-flag": "^1.0.0"
4514
+ },
4515
+ "bin": {
4516
+ "resolve": "bin/resolve"
4517
+ },
4518
+ "engines": {
4519
+ "node": ">= 0.4"
4520
+ },
4521
+ "funding": {
4522
+ "url": "https://github.com/sponsors/ljharb"
4523
+ }
4524
+ },
4525
+ "node_modules/resolve-from": {
4526
+ "version": "4.0.0",
4527
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
4528
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
4529
+ "dev": true,
4530
+ "license": "MIT",
4531
+ "engines": {
4532
+ "node": ">=4"
4533
+ }
4534
+ },
4535
+ "node_modules/reusify": {
4536
+ "version": "1.0.4",
4537
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
4538
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
4539
+ "dev": true,
4540
+ "license": "MIT",
4541
+ "engines": {
4542
+ "iojs": ">=1.0.0",
4543
+ "node": ">=0.10.0"
4544
+ }
4545
+ },
4546
+ "node_modules/rollup": {
4547
+ "version": "4.34.7",
4548
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.7.tgz",
4549
+ "integrity": "sha512-8qhyN0oZ4x0H6wmBgfKxJtxM7qS98YJ0k0kNh5ECVtuchIJ7z9IVVvzpmtQyT10PXKMtBxYr1wQ5Apg8RS8kXQ==",
4550
+ "license": "MIT",
4551
+ "dependencies": {
4552
+ "@types/estree": "1.0.6"
4553
+ },
4554
+ "bin": {
4555
+ "rollup": "dist/bin/rollup"
4556
+ },
4557
+ "engines": {
4558
+ "node": ">=18.0.0",
4559
+ "npm": ">=8.0.0"
4560
+ },
4561
+ "optionalDependencies": {
4562
+ "@rollup/rollup-android-arm-eabi": "4.34.7",
4563
+ "@rollup/rollup-android-arm64": "4.34.7",
4564
+ "@rollup/rollup-darwin-arm64": "4.34.7",
4565
+ "@rollup/rollup-darwin-x64": "4.34.7",
4566
+ "@rollup/rollup-freebsd-arm64": "4.34.7",
4567
+ "@rollup/rollup-freebsd-x64": "4.34.7",
4568
+ "@rollup/rollup-linux-arm-gnueabihf": "4.34.7",
4569
+ "@rollup/rollup-linux-arm-musleabihf": "4.34.7",
4570
+ "@rollup/rollup-linux-arm64-gnu": "4.34.7",
4571
+ "@rollup/rollup-linux-arm64-musl": "4.34.7",
4572
+ "@rollup/rollup-linux-loongarch64-gnu": "4.34.7",
4573
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.34.7",
4574
+ "@rollup/rollup-linux-riscv64-gnu": "4.34.7",
4575
+ "@rollup/rollup-linux-s390x-gnu": "4.34.7",
4576
+ "@rollup/rollup-linux-x64-gnu": "4.34.7",
4577
+ "@rollup/rollup-linux-x64-musl": "4.34.7",
4578
+ "@rollup/rollup-win32-arm64-msvc": "4.34.7",
4579
+ "@rollup/rollup-win32-ia32-msvc": "4.34.7",
4580
+ "@rollup/rollup-win32-x64-msvc": "4.34.7",
4581
+ "fsevents": "~2.3.2"
4582
+ }
4583
+ },
4584
+ "node_modules/run-parallel": {
4585
+ "version": "1.2.0",
4586
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
4587
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
4588
+ "dev": true,
4589
+ "funding": [
4590
+ {
4591
+ "type": "github",
4592
+ "url": "https://github.com/sponsors/feross"
4593
+ },
4594
+ {
4595
+ "type": "patreon",
4596
+ "url": "https://www.patreon.com/feross"
4597
+ },
4598
+ {
4599
+ "type": "consulting",
4600
+ "url": "https://feross.org/support"
4601
+ }
4602
+ ],
4603
+ "license": "MIT",
4604
+ "dependencies": {
4605
+ "queue-microtask": "^1.2.2"
4606
+ }
4607
+ },
4608
+ "node_modules/rxjs": {
4609
+ "version": "7.8.1",
4610
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
4611
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
4612
+ "license": "Apache-2.0",
4613
+ "dependencies": {
4614
+ "tslib": "^2.1.0"
4615
+ }
4616
+ },
4617
+ "node_modules/sass-embedded": {
4618
+ "version": "1.85.0",
4619
+ "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.85.0.tgz",
4620
+ "integrity": "sha512-x3Vv54g0jv1aPSW8OTA/0GzQCs/HMQOjIkLtZJ3Xsn/I4vnyjKbVTQmFTax9bQjldqLEEkdbvy6ES/cOOnYNwA==",
4621
+ "license": "MIT",
4622
+ "dependencies": {
4623
+ "@bufbuild/protobuf": "^2.0.0",
4624
+ "buffer-builder": "^0.2.0",
4625
+ "colorjs.io": "^0.5.0",
4626
+ "immutable": "^5.0.2",
4627
+ "rxjs": "^7.4.0",
4628
+ "supports-color": "^8.1.1",
4629
+ "sync-child-process": "^1.0.2",
4630
+ "varint": "^6.0.0"
4631
+ },
4632
+ "bin": {
4633
+ "sass": "dist/bin/sass.js"
4634
+ },
4635
+ "engines": {
4636
+ "node": ">=16.0.0"
4637
+ },
4638
+ "optionalDependencies": {
4639
+ "sass-embedded-android-arm": "1.85.0",
4640
+ "sass-embedded-android-arm64": "1.85.0",
4641
+ "sass-embedded-android-ia32": "1.85.0",
4642
+ "sass-embedded-android-riscv64": "1.85.0",
4643
+ "sass-embedded-android-x64": "1.85.0",
4644
+ "sass-embedded-darwin-arm64": "1.85.0",
4645
+ "sass-embedded-darwin-x64": "1.85.0",
4646
+ "sass-embedded-linux-arm": "1.85.0",
4647
+ "sass-embedded-linux-arm64": "1.85.0",
4648
+ "sass-embedded-linux-ia32": "1.85.0",
4649
+ "sass-embedded-linux-musl-arm": "1.85.0",
4650
+ "sass-embedded-linux-musl-arm64": "1.85.0",
4651
+ "sass-embedded-linux-musl-ia32": "1.85.0",
4652
+ "sass-embedded-linux-musl-riscv64": "1.85.0",
4653
+ "sass-embedded-linux-musl-x64": "1.85.0",
4654
+ "sass-embedded-linux-riscv64": "1.85.0",
4655
+ "sass-embedded-linux-x64": "1.85.0",
4656
+ "sass-embedded-win32-arm64": "1.85.0",
4657
+ "sass-embedded-win32-ia32": "1.85.0",
4658
+ "sass-embedded-win32-x64": "1.85.0"
4659
+ }
4660
+ },
4661
+ "node_modules/sass-embedded-android-arm": {
4662
+ "version": "1.85.0",
4663
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.85.0.tgz",
4664
+ "integrity": "sha512-pPBT7Ad6G8Mlao8ypVNXW2ya7I/Bhcny+RYZ/EmrunEXfhzCNp4PWV2VAweitPO9RnPIJwvUTkLc8Fu6K3nVmw==",
4665
+ "cpu": [
4666
+ "arm"
4667
+ ],
4668
+ "license": "MIT",
4669
+ "optional": true,
4670
+ "os": [
4671
+ "android"
4672
+ ],
4673
+ "engines": {
4674
+ "node": ">=14.0.0"
4675
+ }
4676
+ },
4677
+ "node_modules/sass-embedded-android-arm64": {
4678
+ "version": "1.85.0",
4679
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.85.0.tgz",
4680
+ "integrity": "sha512-4itDzRwezwrW8+YzMLIwHtMeH+qrBNdBsRn9lTVI15K+cNLC8z5JWJi6UCZ8TNNZr9LDBfsh5jUdjSub0yF7jg==",
4681
+ "cpu": [
4682
+ "arm64"
4683
+ ],
4684
+ "license": "MIT",
4685
+ "optional": true,
4686
+ "os": [
4687
+ "android"
4688
+ ],
4689
+ "engines": {
4690
+ "node": ">=14.0.0"
4691
+ }
4692
+ },
4693
+ "node_modules/sass-embedded-android-ia32": {
4694
+ "version": "1.85.0",
4695
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.85.0.tgz",
4696
+ "integrity": "sha512-bwqKq95hzbGbMTeXCMQhH7yEdc2xJVwIXj7rGdD3McvyFWbED6362XRFFPI5YyjfD2wRJd9yWLh/hn+6VyjcYA==",
4697
+ "cpu": [
4698
+ "ia32"
4699
+ ],
4700
+ "license": "MIT",
4701
+ "optional": true,
4702
+ "os": [
4703
+ "android"
4704
+ ],
4705
+ "engines": {
4706
+ "node": ">=14.0.0"
4707
+ }
4708
+ },
4709
+ "node_modules/sass-embedded-android-riscv64": {
4710
+ "version": "1.85.0",
4711
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.85.0.tgz",
4712
+ "integrity": "sha512-Fgkgay+5EePJXZFHR5Vlkutnsmox2V6nX4U3mfGbSN1xjLRm8F5ST72V2s5Z0mnIFpGvEu/v7hfptgViqMvaxg==",
4713
+ "cpu": [
4714
+ "riscv64"
4715
+ ],
4716
+ "license": "MIT",
4717
+ "optional": true,
4718
+ "os": [
4719
+ "android"
4720
+ ],
4721
+ "engines": {
4722
+ "node": ">=14.0.0"
4723
+ }
4724
+ },
4725
+ "node_modules/sass-embedded-android-x64": {
4726
+ "version": "1.85.0",
4727
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.85.0.tgz",
4728
+ "integrity": "sha512-/bG3JgTn3eoIDHCiJNVkLeJgUesat4ghxqYmKMZUJx++4e6iKCDj8XwQTJAgm+QDrsPKXHBacHEANJ9LEAuTqg==",
4729
+ "cpu": [
4730
+ "x64"
4731
+ ],
4732
+ "license": "MIT",
4733
+ "optional": true,
4734
+ "os": [
4735
+ "android"
4736
+ ],
4737
+ "engines": {
4738
+ "node": ">=14.0.0"
4739
+ }
4740
+ },
4741
+ "node_modules/sass-embedded-darwin-arm64": {
4742
+ "version": "1.85.0",
4743
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.85.0.tgz",
4744
+ "integrity": "sha512-plp8TyMz97YFBCB3ndftEvoW29vyfsSBJILM5U84cGzr06SvLh/Npjj8psfUeRw+upEk1zkFtw5u61sRCdgwIw==",
4745
+ "cpu": [
4746
+ "arm64"
4747
+ ],
4748
+ "license": "MIT",
4749
+ "optional": true,
4750
+ "os": [
4751
+ "darwin"
4752
+ ],
4753
+ "engines": {
4754
+ "node": ">=14.0.0"
4755
+ }
4756
+ },
4757
+ "node_modules/sass-embedded-darwin-x64": {
4758
+ "version": "1.85.0",
4759
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.85.0.tgz",
4760
+ "integrity": "sha512-LP8Zv8DG57Gn6PmSwWzC0gEZUsGdg36Ps3m0i1fVTOelql7N3HZIrlPYRjJvidL8ZlB3ISxNANebTREUHn/wkQ==",
4761
+ "cpu": [
4762
+ "x64"
4763
+ ],
4764
+ "license": "MIT",
4765
+ "optional": true,
4766
+ "os": [
4767
+ "darwin"
4768
+ ],
4769
+ "engines": {
4770
+ "node": ">=14.0.0"
4771
+ }
4772
+ },
4773
+ "node_modules/sass-embedded-linux-arm": {
4774
+ "version": "1.85.0",
4775
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.85.0.tgz",
4776
+ "integrity": "sha512-18xOAEfazJt1MMVS2TRHV94n81VyMnywOoJ7/S7I79qno/zx26OoqqP4XvH107xu8+mZ9Gg54LrUH6ZcgHk08g==",
4777
+ "cpu": [
4778
+ "arm"
4779
+ ],
4780
+ "license": "MIT",
4781
+ "optional": true,
4782
+ "os": [
4783
+ "linux"
4784
+ ],
4785
+ "engines": {
4786
+ "node": ">=14.0.0"
4787
+ }
4788
+ },
4789
+ "node_modules/sass-embedded-linux-arm64": {
4790
+ "version": "1.85.0",
4791
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.85.0.tgz",
4792
+ "integrity": "sha512-JRIRKVOY5Y8M1zlUOv9AQGju4P6lj8i5vLJZsVYVN/uY8Cd2dDJZPC8EOhjntp+IpF8AOGIHqCeCkHBceIyIjA==",
4793
+ "cpu": [
4794
+ "arm64"
4795
+ ],
4796
+ "license": "MIT",
4797
+ "optional": true,
4798
+ "os": [
4799
+ "linux"
4800
+ ],
4801
+ "engines": {
4802
+ "node": ">=14.0.0"
4803
+ }
4804
+ },
4805
+ "node_modules/sass-embedded-linux-ia32": {
4806
+ "version": "1.85.0",
4807
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.85.0.tgz",
4808
+ "integrity": "sha512-4JH+h+gLt9So22nNPQtsKojEsLzjld9ol3zWcOtMGclv+HojZGbCuhJUrLUcK72F8adXYsULmWhJPKROLIwYMA==",
4809
+ "cpu": [
4810
+ "ia32"
4811
+ ],
4812
+ "license": "MIT",
4813
+ "optional": true,
4814
+ "os": [
4815
+ "linux"
4816
+ ],
4817
+ "engines": {
4818
+ "node": ">=14.0.0"
4819
+ }
4820
+ },
4821
+ "node_modules/sass-embedded-linux-musl-arm": {
4822
+ "version": "1.85.0",
4823
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.85.0.tgz",
4824
+ "integrity": "sha512-Z1j4ageDVFihqNUBnm89fxY46pY0zD/Clp1D3ZdI7S+D280+AEpbm5vMoH8LLhBQfQLf2w7H++SZGpQwrisudQ==",
4825
+ "cpu": [
4826
+ "arm"
4827
+ ],
4828
+ "license": "MIT",
4829
+ "optional": true,
4830
+ "os": [
4831
+ "linux"
4832
+ ],
4833
+ "engines": {
4834
+ "node": ">=14.0.0"
4835
+ }
4836
+ },
4837
+ "node_modules/sass-embedded-linux-musl-arm64": {
4838
+ "version": "1.85.0",
4839
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.85.0.tgz",
4840
+ "integrity": "sha512-aoQjUjK28bvdw9XKTjQeayn8oWQ2QqvoTD11myklGd3IHH7Jj0nwXUstI4NxDueCKt3wghuZoIQkjOheReQxlg==",
4841
+ "cpu": [
4842
+ "arm64"
4843
+ ],
4844
+ "license": "MIT",
4845
+ "optional": true,
4846
+ "os": [
4847
+ "linux"
4848
+ ],
4849
+ "engines": {
4850
+ "node": ">=14.0.0"
4851
+ }
4852
+ },
4853
+ "node_modules/sass-embedded-linux-musl-ia32": {
4854
+ "version": "1.85.0",
4855
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.85.0.tgz",
4856
+ "integrity": "sha512-/cJCSXOfXmQFH8deE+3U9x+BSz8i0d1Tt9gKV/Gat1Xm43Oumw8pmZgno+cDuGjYQInr9ryW5121pTMlj/PBXQ==",
4857
+ "cpu": [
4858
+ "ia32"
4859
+ ],
4860
+ "license": "MIT",
4861
+ "optional": true,
4862
+ "os": [
4863
+ "linux"
4864
+ ],
4865
+ "engines": {
4866
+ "node": ">=14.0.0"
4867
+ }
4868
+ },
4869
+ "node_modules/sass-embedded-linux-musl-riscv64": {
4870
+ "version": "1.85.0",
4871
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.85.0.tgz",
4872
+ "integrity": "sha512-l+FJxMXkmg42RZq5RFKXg4InX0IA7yEiPHe4kVSdrczP7z3NLxk+W9wVkPnoRKYIMe1qZPPQ25y0TgI4HNWouA==",
4873
+ "cpu": [
4874
+ "riscv64"
4875
+ ],
4876
+ "license": "MIT",
4877
+ "optional": true,
4878
+ "os": [
4879
+ "linux"
4880
+ ],
4881
+ "engines": {
4882
+ "node": ">=14.0.0"
4883
+ }
4884
+ },
4885
+ "node_modules/sass-embedded-linux-musl-x64": {
4886
+ "version": "1.85.0",
4887
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.85.0.tgz",
4888
+ "integrity": "sha512-M9ffjcYfFcRvkFA6V3DpOS955AyvmpvPAhL/xNK45d/ma1n1ehTWpd24tVeKiNK5CZkNjjMEfyw2fHa6MpqmEA==",
4889
+ "cpu": [
4890
+ "x64"
4891
+ ],
4892
+ "license": "MIT",
4893
+ "optional": true,
4894
+ "os": [
4895
+ "linux"
4896
+ ],
4897
+ "engines": {
4898
+ "node": ">=14.0.0"
4899
+ }
4900
+ },
4901
+ "node_modules/sass-embedded-linux-riscv64": {
4902
+ "version": "1.85.0",
4903
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.85.0.tgz",
4904
+ "integrity": "sha512-yqPXQWfM+qiIPkfn++48GOlbmSvUZIyL9nwFstBk0k4x40UhbhilfknqeTUpxoHfQzylTGVhrm5JE7MjM+LNZA==",
4905
+ "cpu": [
4906
+ "riscv64"
4907
+ ],
4908
  "license": "MIT",
4909
+ "optional": true,
4910
+ "os": [
4911
+ "linux"
4912
+ ],
4913
  "engines": {
4914
+ "node": ">=14.0.0"
4915
  }
4916
  },
4917
+ "node_modules/sass-embedded-linux-x64": {
4918
+ "version": "1.85.0",
4919
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.85.0.tgz",
4920
+ "integrity": "sha512-NTDeQFZcuVR7COoaRy8pZD6/+QznwBR8kVFsj7NpmvX9aJ7TX/q+OQZHX7Bfb3tsfKXhf1YZozegPuYxRnMKAQ==",
4921
+ "cpu": [
4922
+ "x64"
4923
+ ],
4924
  "license": "MIT",
4925
+ "optional": true,
4926
+ "os": [
4927
+ "linux"
4928
+ ],
4929
  "engines": {
4930
+ "node": ">=14.0.0"
4931
  }
4932
  },
4933
+ "node_modules/sass-embedded-win32-arm64": {
4934
+ "version": "1.85.0",
4935
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.85.0.tgz",
4936
+ "integrity": "sha512-gO0VAuxC4AdV+uZYJESRWVVHQWCGzNs0C3OKCAdH4r1vGRugooMi7J/5wbwUdXDA1MV9ICfhlKsph2n3GiPdqA==",
4937
+ "cpu": [
4938
+ "arm64"
4939
+ ],
 
 
 
 
4940
  "license": "MIT",
4941
+ "optional": true,
4942
+ "os": [
4943
+ "win32"
4944
+ ],
4945
  "engines": {
4946
+ "node": ">=14.0.0"
4947
  }
4948
  },
4949
+ "node_modules/sass-embedded-win32-ia32": {
4950
+ "version": "1.85.0",
4951
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.85.0.tgz",
4952
+ "integrity": "sha512-PCyn6xeFIBUgBceNypuf73/5DWF2VWPlPqPuBprPsTvpZOMUJeBtP+Lf4mnu3dNy1z76mYVnpaCnQmzZ0zHZaA==",
4953
+ "cpu": [
4954
+ "ia32"
4955
+ ],
4956
  "license": "MIT",
4957
+ "optional": true,
4958
+ "os": [
4959
+ "win32"
4960
+ ],
4961
  "engines": {
4962
+ "node": ">=14.0.0"
 
4963
  }
4964
  },
4965
+ "node_modules/sass-embedded-win32-x64": {
4966
+ "version": "1.85.0",
4967
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.85.0.tgz",
4968
+ "integrity": "sha512-AknE2jLp6OBwrR5hQ8pDsG94KhJCeSheFJ2xgbnk8RUjZX909JiNbgh2sNt9LG+RXf4xZa55dDL537gZoCx/iw==",
4969
+ "cpu": [
4970
+ "x64"
4971
+ ],
4972
  "license": "MIT",
4973
+ "optional": true,
4974
+ "os": [
4975
+ "win32"
4976
+ ],
 
 
4977
  "engines": {
4978
+ "node": ">=14.0.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4979
  }
4980
  },
4981
+ "node_modules/sass-embedded/node_modules/supports-color": {
4982
+ "version": "8.1.1",
4983
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
4984
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4985
  "license": "MIT",
4986
  "dependencies": {
4987
+ "has-flag": "^4.0.0"
4988
+ },
4989
+ "engines": {
4990
+ "node": ">=10"
4991
+ },
4992
+ "funding": {
4993
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
4994
  }
4995
  },
4996
  "node_modules/scheduler": {
 
5053
  "url": "https://github.com/sponsors/isaacs"
5054
  }
5055
  },
5056
+ "node_modules/simple-yenc": {
5057
+ "version": "1.0.4",
5058
+ "resolved": "https://registry.npmjs.org/simple-yenc/-/simple-yenc-1.0.4.tgz",
5059
+ "integrity": "sha512-5gvxpSd79e9a3V4QDYUqnqxeD4HGlhCakVpb6gMnDD7lexJggSBJRBO5h52y/iJrdXRilX9UCuDaIJhSWm5OWw==",
5060
+ "license": "MIT",
5061
+ "funding": {
5062
+ "type": "individual",
5063
+ "url": "https://github.com/sponsors/eshaz"
5064
+ }
5065
+ },
5066
  "node_modules/source-map-js": {
5067
  "version": "1.2.1",
5068
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
 
5101
  "node": ">=8"
5102
  }
5103
  },
5104
+ "node_modules/string-width-cjs": {
5105
+ "name": "string-width",
5106
+ "version": "4.2.3",
5107
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
5108
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
5109
+ "dev": true,
5110
+ "license": "MIT",
5111
+ "dependencies": {
5112
+ "emoji-regex": "^8.0.0",
5113
+ "is-fullwidth-code-point": "^3.0.0",
5114
+ "strip-ansi": "^6.0.1"
5115
+ },
5116
+ "engines": {
5117
+ "node": ">=8"
5118
+ }
5119
+ },
5120
  "node_modules/strip-ansi": {
5121
  "version": "6.0.1",
5122
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 
5129
  "node": ">=8"
5130
  }
5131
  },
5132
+ "node_modules/strip-ansi-cjs": {
5133
+ "name": "strip-ansi",
5134
+ "version": "6.0.1",
5135
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
5136
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
5137
+ "dev": true,
5138
+ "license": "MIT",
5139
+ "dependencies": {
5140
+ "ansi-regex": "^5.0.1"
5141
+ },
5142
+ "engines": {
5143
+ "node": ">=8"
5144
+ }
5145
+ },
5146
  "node_modules/strip-json-comments": {
5147
  "version": "3.1.1",
5148
  "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
 
5156
  "url": "https://github.com/sponsors/sindresorhus"
5157
  }
5158
  },
5159
+ "node_modules/sucrase": {
5160
+ "version": "3.35.0",
5161
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
5162
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
5163
+ "dev": true,
5164
+ "license": "MIT",
5165
+ "dependencies": {
5166
+ "@jridgewell/gen-mapping": "^0.3.2",
5167
+ "commander": "^4.0.0",
5168
+ "glob": "^10.3.10",
5169
+ "lines-and-columns": "^1.1.6",
5170
+ "mz": "^2.7.0",
5171
+ "pirates": "^4.0.1",
5172
+ "ts-interface-checker": "^0.1.9"
5173
+ },
5174
+ "bin": {
5175
+ "sucrase": "bin/sucrase",
5176
+ "sucrase-node": "bin/sucrase-node"
5177
+ },
5178
+ "engines": {
5179
+ "node": ">=16 || 14 >=14.17"
5180
+ }
5181
+ },
5182
  "node_modules/supports-color": {
5183
  "version": "7.2.0",
5184
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
 
5192
  "node": ">=8"
5193
  }
5194
  },
5195
+ "node_modules/supports-preserve-symlinks-flag": {
5196
+ "version": "1.0.0",
5197
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
5198
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
5199
+ "dev": true,
5200
+ "license": "MIT",
5201
+ "engines": {
5202
+ "node": ">= 0.4"
5203
+ },
5204
+ "funding": {
5205
+ "url": "https://github.com/sponsors/ljharb"
5206
+ }
5207
+ },
5208
+ "node_modules/sync-child-process": {
5209
+ "version": "1.0.2",
5210
+ "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz",
5211
+ "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==",
5212
+ "license": "MIT",
5213
+ "dependencies": {
5214
+ "sync-message-port": "^1.0.0"
5215
+ },
5216
+ "engines": {
5217
+ "node": ">=16.0.0"
5218
+ }
5219
+ },
5220
+ "node_modules/sync-message-port": {
5221
+ "version": "1.1.3",
5222
+ "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz",
5223
+ "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==",
5224
+ "license": "MIT",
5225
+ "engines": {
5226
+ "node": ">=16.0.0"
5227
+ }
5228
+ },
5229
+ "node_modules/tailwindcss": {
5230
+ "version": "3.4.17",
5231
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
5232
+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
5233
+ "dev": true,
5234
+ "license": "MIT",
5235
+ "dependencies": {
5236
+ "@alloc/quick-lru": "^5.2.0",
5237
+ "arg": "^5.0.2",
5238
+ "chokidar": "^3.6.0",
5239
+ "didyoumean": "^1.2.2",
5240
+ "dlv": "^1.1.3",
5241
+ "fast-glob": "^3.3.2",
5242
+ "glob-parent": "^6.0.2",
5243
+ "is-glob": "^4.0.3",
5244
+ "jiti": "^1.21.6",
5245
+ "lilconfig": "^3.1.3",
5246
+ "micromatch": "^4.0.8",
5247
+ "normalize-path": "^3.0.0",
5248
+ "object-hash": "^3.0.0",
5249
+ "picocolors": "^1.1.1",
5250
+ "postcss": "^8.4.47",
5251
+ "postcss-import": "^15.1.0",
5252
+ "postcss-js": "^4.0.1",
5253
+ "postcss-load-config": "^4.0.2",
5254
+ "postcss-nested": "^6.2.0",
5255
+ "postcss-selector-parser": "^6.1.2",
5256
+ "resolve": "^1.22.8",
5257
+ "sucrase": "^3.35.0"
5258
+ },
5259
+ "bin": {
5260
+ "tailwind": "lib/cli.js",
5261
+ "tailwindcss": "lib/cli.js"
5262
+ },
5263
+ "engines": {
5264
+ "node": ">=14.0.0"
5265
+ }
5266
+ },
5267
+ "node_modules/tailwindcss/node_modules/jiti": {
5268
+ "version": "1.21.7",
5269
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
5270
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
5271
+ "dev": true,
5272
+ "license": "MIT",
5273
+ "bin": {
5274
+ "jiti": "bin/jiti.js"
5275
+ }
5276
+ },
5277
  "node_modules/textlinestream": {
5278
  "version": "1.1.1",
5279
  "resolved": "https://registry.npmjs.org/textlinestream/-/textlinestream-1.1.1.tgz",
5280
  "integrity": "sha512-iBHbi7BQxrFmwZUQJsT0SjNzlLLsXhvW/kg7EyOMVMBIrlnj/qYofwo1LVLZi+3GbUEo96Iu2eqToI2+lZoAEQ==",
5281
  "license": "MIT"
5282
  },
5283
+ "node_modules/thenify": {
5284
+ "version": "3.3.1",
5285
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
5286
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
5287
+ "dev": true,
5288
+ "license": "MIT",
5289
+ "dependencies": {
5290
+ "any-promise": "^1.0.0"
5291
+ }
5292
+ },
5293
+ "node_modules/thenify-all": {
5294
+ "version": "1.6.0",
5295
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
5296
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
5297
+ "dev": true,
5298
+ "license": "MIT",
5299
+ "dependencies": {
5300
+ "thenify": ">= 3.1.0 < 4"
5301
+ },
5302
+ "engines": {
5303
+ "node": ">=0.8"
5304
+ }
5305
+ },
5306
  "node_modules/to-regex-range": {
5307
  "version": "5.0.1",
5308
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
 
5343
  "typescript": ">=4.8.4"
5344
  }
5345
  },
5346
+ "node_modules/ts-interface-checker": {
5347
+ "version": "0.1.13",
5348
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
5349
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
5350
+ "dev": true,
5351
+ "license": "Apache-2.0"
5352
+ },
5353
+ "node_modules/tslib": {
5354
+ "version": "2.8.1",
5355
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
5356
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
5357
+ "license": "0BSD"
5358
+ },
5359
  "node_modules/type-check": {
5360
  "version": "0.4.0",
5361
  "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
 
5430
  "version": "1.1.2",
5431
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
5432
  "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
 
5433
  "funding": [
5434
  {
5435
  "type": "opencollective",
 
5476
  "requires-port": "^1.0.0"
5477
  }
5478
  },
5479
+ "node_modules/util-deprecate": {
5480
+ "version": "1.0.2",
5481
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
5482
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
5483
+ "dev": true,
5484
+ "license": "MIT"
5485
+ },
5486
+ "node_modules/varint": {
5487
+ "version": "6.0.0",
5488
+ "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
5489
+ "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==",
5490
+ "license": "MIT"
5491
+ },
5492
  "node_modules/vite": {
5493
  "version": "6.1.0",
5494
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz",
 
5616
  "node": ">=8"
5617
  }
5618
  },
5619
+ "node_modules/wrap-ansi-cjs": {
5620
+ "name": "wrap-ansi",
5621
+ "version": "7.0.0",
5622
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
5623
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
5624
+ "dev": true,
5625
+ "license": "MIT",
5626
+ "dependencies": {
5627
+ "ansi-styles": "^4.0.0",
5628
+ "string-width": "^4.1.0",
5629
+ "strip-ansi": "^6.0.0"
5630
+ },
5631
+ "engines": {
5632
+ "node": ">=10"
5633
+ },
5634
+ "funding": {
5635
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
5636
+ }
5637
+ },
5638
  "node_modules/ws": {
5639
  "version": "8.18.0",
5640
  "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
 
5672
  "dev": true,
5673
  "license": "ISC"
5674
  },
5675
+ "node_modules/yaml": {
5676
+ "version": "2.7.0",
5677
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
5678
+ "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
5679
+ "license": "ISC",
5680
+ "bin": {
5681
+ "yaml": "bin.mjs"
5682
+ },
5683
+ "engines": {
5684
+ "node": ">= 14"
5685
+ }
5686
+ },
5687
  "node_modules/yargs": {
5688
  "version": "17.7.2",
5689
  "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
front/package.json CHANGED
@@ -7,25 +7,44 @@
7
  "dev": "vite",
8
  "build": "tsc -b && vite build",
9
  "lint": "eslint .",
 
10
  "preview": "vite preview"
11
  },
12
  "dependencies": {
13
  "@gradio/client": "^1.12.0",
 
 
 
 
 
14
  "react": "^19.0.0",
15
  "react-dom": "^19.0.0",
16
- "vite-plugin-singlefile": "^2.1.0"
 
 
 
17
  },
18
  "devDependencies": {
19
  "@eslint/js": "^9.19.0",
20
  "@types/react": "^19.0.8",
21
  "@types/react-dom": "^19.0.3",
22
  "@vitejs/plugin-react": "^4.3.4",
 
23
  "eslint": "^9.19.0",
24
  "eslint-plugin-react-hooks": "^5.0.0",
25
  "eslint-plugin-react-refresh": "^0.4.18",
26
  "globals": "^15.14.0",
 
 
27
  "typescript": "~5.7.2",
28
  "typescript-eslint": "^8.22.0",
29
  "vite": "^6.1.0"
 
 
 
 
 
 
 
30
  }
31
  }
 
7
  "dev": "vite",
8
  "build": "tsc -b && vite build",
9
  "lint": "eslint .",
10
+ "format": "npm run lint && prettier --write .",
11
  "preview": "vite preview"
12
  },
13
  "dependencies": {
14
  "@gradio/client": "^1.12.0",
15
+ "@sec-ant/readable-stream": "^0.6.0",
16
+ "audio-decode": "^2.2.2",
17
+ "autoprefixer": "^10.4.20",
18
+ "base64-arraybuffer": "^1.0.2",
19
+ "postcss": "^8.5.2",
20
  "react": "^19.0.0",
21
  "react-dom": "^19.0.0",
22
+ "sass-embedded": "^1.85.0",
23
+ "textlinestream": "^1.1.1",
24
+ "vite-plugin-singlefile": "^2.1.0",
25
+ "yaml": "^2.7.0"
26
  },
27
  "devDependencies": {
28
  "@eslint/js": "^9.19.0",
29
  "@types/react": "^19.0.8",
30
  "@types/react-dom": "^19.0.3",
31
  "@vitejs/plugin-react": "^4.3.4",
32
+ "daisyui": "^4.12.23",
33
  "eslint": "^9.19.0",
34
  "eslint-plugin-react-hooks": "^5.0.0",
35
  "eslint-plugin-react-refresh": "^0.4.18",
36
  "globals": "^15.14.0",
37
+ "prettier": "^3.5.1",
38
+ "tailwindcss": "^3.4.17",
39
  "typescript": "~5.7.2",
40
  "typescript-eslint": "^8.22.0",
41
  "vite": "^6.1.0"
42
+ },
43
+ "prettier": {
44
+ "trailingComma": "es5",
45
+ "tabWidth": 2,
46
+ "semi": true,
47
+ "singleQuote": true,
48
+ "bracketSameLine": false
49
  }
50
  }
front/postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
front/src/App.css DELETED
@@ -1,42 +0,0 @@
1
- #root {
2
- max-width: 1280px;
3
- margin: 0 auto;
4
- padding: 2rem;
5
- text-align: center;
6
- }
7
-
8
- .logo {
9
- height: 6em;
10
- padding: 1.5em;
11
- will-change: filter;
12
- transition: filter 300ms;
13
- }
14
- .logo:hover {
15
- filter: drop-shadow(0 0 2em #646cffaa);
16
- }
17
- .logo.react:hover {
18
- filter: drop-shadow(0 0 2em #61dafbaa);
19
- }
20
-
21
- @keyframes logo-spin {
22
- from {
23
- transform: rotate(0deg);
24
- }
25
- to {
26
- transform: rotate(360deg);
27
- }
28
- }
29
-
30
- @media (prefers-reduced-motion: no-preference) {
31
- a:nth-of-type(2) .logo {
32
- animation: logo-spin infinite 20s linear;
33
- }
34
- }
35
-
36
- .card {
37
- padding: 2em;
38
- }
39
-
40
- .read-the-docs {
41
- color: #888;
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
front/src/App.tsx CHANGED
@@ -1,48 +1,39 @@
1
- //import { useState } from 'react'
2
- import reactLogo from './assets/react.svg'
3
- import viteLogo from '/vite.svg'
4
- import './App.css'
5
- import { Client } from '@gradio/client';
6
 
7
  function App() {
8
- // const [count, setCount] = useState(0)
9
- const count = 0;
10
-
11
- const test = async () => {
12
- const client = await Client.connect("ngxson/kokoro-podcast-generator");
13
- const result = await client.predict("/tts", {
14
- text: "Hello!!",
15
- voice: "af_heart",
16
- speed: 0.5,
17
- });
18
-
19
- console.log(result.data);
20
- };
21
 
22
  return (
23
- <>
24
- <div>
25
- <a href="https://vite.dev" target="_blank">
26
- <img src={viteLogo} className="logo" alt="Vite logo" />
27
- </a>
28
- <a href="https://react.dev" target="_blank">
29
- <img src={reactLogo} className="logo react" alt="React logo" />
30
- </a>
31
- </div>
32
- <h1>Vite + React</h1>
33
- <div className="card">
34
- <button onClick={() => test()}>
35
- count is {count}
36
- </button>
37
- <p>
38
- Edit <code>src/App.tsx</code> and save to test HMR
39
- </p>
 
 
 
 
 
 
40
  </div>
41
- <p className="read-the-docs">
42
- Click on the Vite and React logos to learn more
43
- </p>
44
- </>
45
- )
46
  }
47
 
48
- export default App
 
1
+ import { OpenInNewTab } from './utils/common';
2
+ import { PodcastGenerator } from './components/PodcastGenerator';
3
+ import { useState } from 'react';
4
+ import { ScriptMaker } from './components/ScriptMaker';
 
5
 
6
  function App() {
7
+ const [genratedScript, setGeneratedScript] = useState<string>('');
8
+ const [busy, setBusy] = useState<boolean>(false);
 
 
 
 
 
 
 
 
 
 
 
9
 
10
  return (
11
+ <div className="bg-base-300 min-h-screen">
12
+ <div className="max-w-screen-lg mx-auto p-4 pb-32 grid gap-4 grid-cols-1">
13
+ <div className="p-4 col-span-1">
14
+ <h1 className="text-3xl font-bold mb-2">
15
+ Podcast generator via Kokoro-TTS
16
+ </h1>
17
+ <p>
18
+ A space made by{' '}
19
+ <OpenInNewTab href="https://hf.co/ngxson">🤗 ngxson</OpenInNewTab>
20
+ </p>
21
+ </div>
22
+
23
+ <ScriptMaker
24
+ setScript={setGeneratedScript}
25
+ setBusy={setBusy}
26
+ busy={busy}
27
+ />
28
+
29
+ <PodcastGenerator
30
+ genratedScript={genratedScript}
31
+ setBusy={setBusy}
32
+ busy={busy}
33
+ />
34
  </div>
35
+ </div>
36
+ );
 
 
 
37
  }
38
 
39
+ export default App;
front/src/assets/react.svg DELETED
front/src/components/AudioPlayer.tsx ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useMemo, useEffect } from 'react';
2
+ import { audioBufferToWav, blobFromAudioBuffer } from '../utils/utils';
3
+ import { encode } from 'base64-arraybuffer';
4
+
5
+ interface AudioPlayerProps {
6
+ audioBuffer: AudioBuffer;
7
+ }
8
+
9
+ export const AudioPlayer: React.FC<AudioPlayerProps> = ({ audioBuffer }) => {
10
+ // Create a Blob URL from the audioBuffer.
11
+ const blobUrl = useMemo(() => {
12
+ const wavBlob = blobFromAudioBuffer(audioBuffer);
13
+ return URL.createObjectURL(wavBlob);
14
+ }, [audioBuffer]);
15
+
16
+ const downloadUrl = useMemo(() => {
17
+ const wavArrayBuffer = audioBufferToWav(audioBuffer, { float32: false });
18
+ const base64 = encode(wavArrayBuffer);
19
+ return `data:audio/wav;base64,${base64}`;
20
+ }, [audioBuffer]);
21
+
22
+ // Clean up the object URL when the component unmounts or audioBuffer changes.
23
+ useEffect(() => {
24
+ return () => {
25
+ URL.revokeObjectURL(blobUrl);
26
+ };
27
+ }, [blobUrl]);
28
+
29
+ return (
30
+ <div className="mt-4 flex items-center">
31
+ <audio controls src={blobUrl}>
32
+ Your browser does not support the audio element.
33
+ </audio>
34
+
35
+ <a
36
+ className="btn btn-sm btn-primary ml-2"
37
+ href={downloadUrl}
38
+ download={'podcast.wav'}
39
+ >
40
+ Download
41
+ </a>
42
+ </div>
43
+ );
44
+ };
front/src/components/PodcastGenerator.tsx ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { use, useEffect, useState } from 'react';
2
+ import { AudioPlayer } from './AudioPlayer';
3
+ import { Podcast, PodcastTurn } from '../utils/types';
4
+ import { parse } from 'yaml';
5
+ import {
6
+ generateAudio,
7
+ joinAudio,
8
+ loadWavAndDecode,
9
+ pickRand,
10
+ } from '../utils/utils';
11
+
12
+ interface GenerationStep {
13
+ turn: PodcastTurn;
14
+ audioBuffer?: AudioBuffer;
15
+ }
16
+
17
+ const SPEEDS = [
18
+ { name: 'slow AF', value: 0.8 },
19
+ { name: 'slow', value: 0.9 },
20
+ { name: 'a bit slow', value: 1.0 },
21
+ { name: 'most natural', value: 1.1 },
22
+ { name: 'a bit fast', value: 1.2 },
23
+ { name: 'fast!', value: 1.3 },
24
+ { name: 'fast AF', value: 1.4 },
25
+ ];
26
+
27
+ const SPEAKERS = [
28
+ { name: '🇺🇸 🚺 Heart ❤️', value: 'af_heart' },
29
+ { name: '🇺🇸 🚺 Bella 🔥', value: 'af_bella' },
30
+ { name: '🇺🇸 🚺 Nicole 🎧', value: 'af_nicole' },
31
+ { name: '🇺🇸 🚺 Aoede', value: 'af_aoede' },
32
+ { name: '🇺🇸 🚺 Kore', value: 'af_kore' },
33
+ { name: '🇺🇸 🚺 Sarah', value: 'af_sarah' },
34
+ { name: '🇺🇸 🚺 Nova', value: 'af_nova' },
35
+ { name: '🇺🇸 🚺 Sky', value: 'af_sky' },
36
+ { name: '🇺🇸 🚺 Alloy', value: 'af_alloy' },
37
+ { name: '🇺🇸 🚺 Jessica', value: 'af_jessica' },
38
+ { name: '🇺🇸 🚺 River', value: 'af_river' },
39
+ { name: '🇺🇸 🚹 Michael', value: 'am_michael' },
40
+ { name: '🇺🇸 🚹 Fenrir', value: 'am_fenrir' },
41
+ { name: '🇺🇸 🚹 Puck', value: 'am_puck' },
42
+ { name: '🇺🇸 🚹 Echo', value: 'am_echo' },
43
+ { name: '🇺🇸 🚹 Eric', value: 'am_eric' },
44
+ { name: '🇺🇸 🚹 Liam', value: 'am_liam' },
45
+ { name: '🇺🇸 🚹 Onyx', value: 'am_onyx' },
46
+ { name: '🇺🇸 🚹 Santa', value: 'am_santa' },
47
+ { name: '🇺🇸 🚹 Adam', value: 'am_adam' },
48
+ { name: '🇬🇧 🚺 Emma', value: 'bf_emma' },
49
+ { name: '🇬🇧 🚺 Isabella', value: 'bf_isabella' },
50
+ { name: '🇬🇧 🚺 Alice', value: 'bf_alice' },
51
+ { name: '🇬🇧 🚺 Lily', value: 'bf_lily' },
52
+ { name: '🇬🇧 🚹 George', value: 'bm_george' },
53
+ { name: '🇬🇧 🚹 Fable', value: 'bm_fable' },
54
+ { name: '🇬🇧 🚹 Lewis', value: 'bm_lewis' },
55
+ { name: '🇬🇧 🚹 Daniel', value: 'bm_daniel' },
56
+ ];
57
+
58
+ const getRandomSpeakerPair = (): { s1: string; s2: string } => {
59
+ const s1Gender = Math.random() > 0.5 ? '🚺' : '🚹';
60
+ const s2Gender = s1Gender === '🚺' ? '🚹' : '🚺';
61
+ const s1 = pickRand(
62
+ SPEAKERS.filter((s) => s.name.includes(s1Gender) && s.name.includes('🇺🇸'))
63
+ ).value;
64
+ const s2 = pickRand(
65
+ SPEAKERS.filter((s) => s.name.includes(s2Gender) && s.name.includes('🇺🇸'))
66
+ ).value;
67
+ return { s1, s2 };
68
+ };
69
+
70
+ export const PodcastGenerator = ({
71
+ genratedScript,
72
+ setBusy,
73
+ busy,
74
+ }: {
75
+ genratedScript: string;
76
+ setBusy: (busy: boolean) => void;
77
+ busy: boolean;
78
+ }) => {
79
+ const [wav, setWav] = useState<AudioBuffer | null>(null);
80
+ const [numSteps, setNumSteps] = useState<number>(0);
81
+ const [numStepsDone, setNumStepsDone] = useState<number>(0);
82
+
83
+ const [script, setScript] = useState<string>('');
84
+ const [speaker1, setSpeaker1] = useState<string>('');
85
+ const [speaker2, setSpeaker2] = useState<string>('');
86
+ const [speed, setSpeed] = useState<string>('1.1');
87
+
88
+ const setRandSpeaker = () => {
89
+ const { s1, s2 } = getRandomSpeakerPair();
90
+ setSpeaker1(s1);
91
+ setSpeaker2(s2);
92
+ };
93
+ useEffect(setRandSpeaker, []);
94
+
95
+ useEffect(() => {
96
+ setScript(genratedScript);
97
+ }, [genratedScript]);
98
+
99
+ const generatePodcast = async () => {
100
+ setWav(null);
101
+ setBusy(true);
102
+ try {
103
+ const podcast: Podcast = parse(script);
104
+ const { speakerNames, turns } = podcast;
105
+ for (const turn of turns) {
106
+ // normalize it
107
+ turn.nextGapMilisecs =
108
+ Math.max(-600, Math.min(300, turn.nextGapMilisecs)) - 100;
109
+ turn.text = turn.text
110
+ .trim()
111
+ .replace(/’/g, "'")
112
+ .replace(/“/g, '"')
113
+ .replace(/”/g, '"');
114
+ }
115
+ const steps: GenerationStep[] = turns.map((turn) => ({ turn }));
116
+ setNumSteps(steps.length);
117
+ setNumStepsDone(0);
118
+ let outputWav: AudioBuffer;
119
+ for (let i = 0; i < steps.length; i++) {
120
+ const step = steps[i];
121
+ const speakerIdx = speakerNames.indexOf(
122
+ step.turn.speakerName as string
123
+ ) as 1 | 0;
124
+ const speakerVoice = speakerIdx === 0 ? speaker1 : speaker2;
125
+ const url = await generateAudio(
126
+ step.turn.text,
127
+ speakerVoice,
128
+ parseFloat(speed)
129
+ );
130
+ step.audioBuffer = await loadWavAndDecode(url);
131
+ if (i === 0) {
132
+ outputWav = step.audioBuffer;
133
+ } else {
134
+ const lastStep = steps[i - 1];
135
+ outputWav = joinAudio(
136
+ outputWav!,
137
+ step.audioBuffer,
138
+ lastStep.turn.nextGapMilisecs / 1000
139
+ );
140
+ }
141
+ setNumStepsDone(i + 1);
142
+ }
143
+ setWav(outputWav! ?? null);
144
+ } catch (e) {
145
+ console.error(e);
146
+ alert(`Error: ${(e as any).message}`);
147
+ setWav(null);
148
+ }
149
+ setBusy(false);
150
+ setNumStepsDone(0);
151
+ setNumSteps(0);
152
+ };
153
+
154
+ const isGenerating = numSteps > 0;
155
+
156
+ return (
157
+ <>
158
+ <div className="card bg-base-100 w-full shadow-xl">
159
+ <div className="card-body">
160
+ <h2 className="card-title">Step 2: Script (YAML format)</h2>
161
+ <textarea
162
+ className="textarea textarea-bordered w-full h-72 p-2"
163
+ placeholder="Type your script here..."
164
+ value={script}
165
+ onChange={(e) => setScript(e.target.value)}
166
+ ></textarea>
167
+
168
+ <div className="grid grid-cols-2 gap-4">
169
+ <label className="form-control w-full">
170
+ <div className="label">
171
+ <span className="label-text">Speaker 1</span>
172
+ </div>
173
+ <select
174
+ className="select select-bordered"
175
+ value={speaker1}
176
+ onChange={(e) => setSpeaker1(e.target.value)}
177
+ >
178
+ {SPEAKERS.map((s) => (
179
+ <option key={s.value} value={s.value}>
180
+ {s.name}
181
+ </option>
182
+ ))}
183
+ </select>
184
+ </label>
185
+ <label className="form-control w-full">
186
+ <div className="label">
187
+ <span className="label-text">Speaker 2</span>
188
+ </div>
189
+ <select
190
+ className="select select-bordered"
191
+ value={speaker2}
192
+ onChange={(e) => setSpeaker2(e.target.value)}
193
+ >
194
+ {SPEAKERS.map((s) => (
195
+ <option key={s.value} value={s.value}>
196
+ {s.name}
197
+ </option>
198
+ ))}
199
+ </select>
200
+ </label>
201
+ </div>
202
+
203
+ <div className="grid grid-cols-2 gap-4">
204
+ <button className="btn" onClick={setRandSpeaker}>
205
+ Randomize speakers
206
+ </button>
207
+ <label className="form-control w-full">
208
+ <select
209
+ className="select select-bordered"
210
+ value={speed.toString()}
211
+ onChange={(e) => setSpeed(e.target.value)}
212
+ >
213
+ {SPEEDS.map((s) => (
214
+ <option key={s.value} value={s.value.toString()}>
215
+ Speed: {s.name} ({s.value})
216
+ </option>
217
+ ))}
218
+ </select>
219
+ </label>
220
+ </div>
221
+
222
+ <button
223
+ className="btn btn-primary mt-2"
224
+ onClick={generatePodcast}
225
+ disabled={busy || !script || isGenerating}
226
+ >
227
+ {isGenerating ? (
228
+ <>
229
+ <span className="loading loading-spinner loading-sm"></span>
230
+ Generating ({numStepsDone}/{numSteps})...
231
+ </>
232
+ ) : (
233
+ 'Generate podcast'
234
+ )}
235
+ </button>
236
+
237
+ {isGenerating && (
238
+ <progress
239
+ className="progress progress-primary mt-2"
240
+ value={numStepsDone}
241
+ max={numSteps}
242
+ ></progress>
243
+ )}
244
+ </div>
245
+ </div>
246
+
247
+ {wav && (
248
+ <div className="card bg-base-100 w-full shadow-xl">
249
+ <div className="card-body">
250
+ <h2 className="card-title">Step 3: Listen to your podcast</h2>
251
+ <AudioPlayer audioBuffer={wav} />
252
+ </div>
253
+ </div>
254
+ )}
255
+ </>
256
+ );
257
+ };
front/src/components/ScriptMaker.tsx ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useEffect, useState } from 'react';
2
+ import { CONFIG } from '../config';
3
+ import { getPromptGeneratePodcastScript } from '../utils/prompts';
4
+ import { getSSEStreamAsync } from '../utils/utils';
5
+
6
+ interface SplitContent {
7
+ thought: string;
8
+ codeBlock: string;
9
+ }
10
+
11
+ const getFromTo = (content: string, from: string, to: string): string => {
12
+ const firstSplit = content.split(from, 2);
13
+ if (firstSplit[1] !== undefined) {
14
+ const secondSplit = firstSplit[1].split(to, 1);
15
+ return secondSplit[0];
16
+ } else {
17
+ return '';
18
+ }
19
+ };
20
+
21
+ const splitContent = (content: string): SplitContent => {
22
+ return {
23
+ thought: getFromTo(content, '<think>', '</think>').trim(),
24
+ codeBlock: getFromTo(content, '```yaml', '```').trim(),
25
+ };
26
+ };
27
+
28
+ export const ScriptMaker = ({
29
+ setScript,
30
+ setBusy,
31
+ busy,
32
+ }: {
33
+ setScript: (script: string) => void;
34
+ setBusy: (busy: boolean) => void;
35
+ busy: boolean;
36
+ }) => {
37
+ const [input, setInput] = useState<string>('');
38
+ const [note, setNote] = useState<string>('');
39
+ const [thought, setThought] = useState<string>('');
40
+ const [isGenerating, setIsGenerating] = useState<boolean>(false);
41
+
42
+ useEffect(() => {
43
+ setBusy(isGenerating);
44
+ }, [isGenerating]);
45
+
46
+ const generate = async () => {
47
+ setIsGenerating(true);
48
+ setThought('');
49
+ try {
50
+ let responseContent = '';
51
+ const fetchResponse = await fetch(CONFIG.llmEndpoint, {
52
+ method: 'POST',
53
+ headers: {
54
+ 'Content-Type': 'application/json',
55
+ },
56
+ body: JSON.stringify({
57
+ messages: [
58
+ {
59
+ role: 'user',
60
+ content: getPromptGeneratePodcastScript(input, note),
61
+ },
62
+ ],
63
+ temperature: 0.3,
64
+ stream: true,
65
+ }),
66
+ });
67
+ if (fetchResponse.status !== 200) {
68
+ const body = await fetchResponse.json();
69
+ throw new Error(body?.error?.message || 'Unknown error');
70
+ }
71
+ const chunks = getSSEStreamAsync(fetchResponse);
72
+ for await (const chunk of chunks) {
73
+ // const stop = chunk.stop;
74
+ if (chunk.error) {
75
+ throw new Error(chunk.error?.message || 'Unknown error');
76
+ }
77
+ const addedContent = chunk.choices[0].delta.content;
78
+ responseContent += addedContent;
79
+ const { thought, codeBlock } = splitContent(responseContent);
80
+ setThought(thought);
81
+ if (codeBlock.length > 0) {
82
+ setScript(codeBlock);
83
+ }
84
+ }
85
+ } catch (error) {
86
+ console.error(error);
87
+ alert('Failed to generate the script. Please try again.');
88
+ }
89
+ setIsGenerating(false);
90
+ };
91
+
92
+ return (
93
+ <div className="card bg-base-100 w-full shadow-xl">
94
+ <div className="card-body">
95
+ <h2 className="card-title">Step 1: Input information</h2>
96
+ <textarea
97
+ className="textarea textarea-bordered w-full h-72 p-2"
98
+ placeholder="Type your input information here (an article, a document, etc)..."
99
+ value={input}
100
+ onChange={(e) => setInput(e.target.value)}
101
+ disabled={isGenerating || busy}
102
+ ></textarea>
103
+ <textarea
104
+ className="textarea textarea-bordered w-full h-24 p-2"
105
+ placeholder="Optional note (the theme, tone, etc)..."
106
+ value={note}
107
+ onChange={(e) => setNote(e.target.value)}
108
+ disabled={isGenerating || busy}
109
+ ></textarea>
110
+
111
+ {thought.length > 0 && (
112
+ <>
113
+ <p>Thought process:</p>
114
+ <textarea
115
+ className="textarea textarea-bordered w-full h-24 p-2"
116
+ value={thought}
117
+ readOnly
118
+ ></textarea>
119
+ </>
120
+ )}
121
+ <button
122
+ className="btn btn-primary mt-2"
123
+ onClick={generate}
124
+ disabled={isGenerating || busy}
125
+ >
126
+ {isGenerating ? (
127
+ <>
128
+ <span className="loading loading-spinner loading-sm"></span>
129
+ Generating...
130
+ </>
131
+ ) : (
132
+ 'Generate script'
133
+ )}
134
+ </button>
135
+ </div>
136
+ </div>
137
+ );
138
+ };
front/src/config.ts ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ export const CONFIG = {
2
+ llmEndpoint:
3
+ 'https://gnb1thady6h3noiz.us-east-1.aws.endpoints.huggingface.cloud/v1/chat/completions',
4
+ ttsSpaceId: 'ngxson/kokoro-podcast-generator',
5
+ };
front/src/index.css DELETED
@@ -1,68 +0,0 @@
1
- :root {
2
- font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
3
- line-height: 1.5;
4
- font-weight: 400;
5
-
6
- color-scheme: light dark;
7
- color: rgba(255, 255, 255, 0.87);
8
- background-color: #242424;
9
-
10
- font-synthesis: none;
11
- text-rendering: optimizeLegibility;
12
- -webkit-font-smoothing: antialiased;
13
- -moz-osx-font-smoothing: grayscale;
14
- }
15
-
16
- a {
17
- font-weight: 500;
18
- color: #646cff;
19
- text-decoration: inherit;
20
- }
21
- a:hover {
22
- color: #535bf2;
23
- }
24
-
25
- body {
26
- margin: 0;
27
- display: flex;
28
- place-items: center;
29
- min-width: 320px;
30
- min-height: 100vh;
31
- }
32
-
33
- h1 {
34
- font-size: 3.2em;
35
- line-height: 1.1;
36
- }
37
-
38
- button {
39
- border-radius: 8px;
40
- border: 1px solid transparent;
41
- padding: 0.6em 1.2em;
42
- font-size: 1em;
43
- font-weight: 500;
44
- font-family: inherit;
45
- background-color: #1a1a1a;
46
- cursor: pointer;
47
- transition: border-color 0.25s;
48
- }
49
- button:hover {
50
- border-color: #646cff;
51
- }
52
- button:focus,
53
- button:focus-visible {
54
- outline: 4px auto -webkit-focus-ring-color;
55
- }
56
-
57
- @media (prefers-color-scheme: light) {
58
- :root {
59
- color: #213547;
60
- background-color: #ffffff;
61
- }
62
- a:hover {
63
- color: #747bff;
64
- }
65
- button {
66
- background-color: #f9f9f9;
67
- }
68
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
front/src/index.scss ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
front/src/main.tsx CHANGED
@@ -1,14 +1,12 @@
1
- import { StrictMode } from 'react'
2
- import { createRoot } from 'react-dom/client'
3
- import './index.css'
4
- import App from './App.tsx'
5
 
6
  if (!localStorage.getItem('debug')) {
7
-
8
  createRoot(document.getElementById('root')!).render(
9
  <StrictMode>
10
  <App />
11
- </StrictMode>,
12
- )
13
-
14
  }
 
1
+ import { StrictMode } from 'react';
2
+ import { createRoot } from 'react-dom/client';
3
+ import './index.scss';
4
+ import App from './App.tsx';
5
 
6
  if (!localStorage.getItem('debug')) {
 
7
  createRoot(document.getElementById('root')!).render(
8
  <StrictMode>
9
  <App />
10
+ </StrictMode>
11
+ );
 
12
  }
front/src/utils/common.tsx ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const OpenInNewTab = ({
2
+ href,
3
+ children,
4
+ }: {
5
+ href: string;
6
+ children: string;
7
+ }) => (
8
+ <a
9
+ className="underline"
10
+ href={href}
11
+ target="_blank"
12
+ rel="noopener noreferrer"
13
+ >
14
+ {children}
15
+ </a>
16
+ );
front/src/utils/prompts.ts ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const getPromptGeneratePodcastScript = (content: string, note: string) =>
2
+ `
3
+
4
+ You are a podcast script writter. You only output content in YAML format. Given a raw unstructured content, think about a plan, then write the podcast script in YAML format. Please also take into account the note from the podcast producer.
5
+
6
+ Some rules:
7
+ - Must output YAML format, must be wrapped inside mardown code block.
8
+ - There are only 2 speakers (so, speakerNames must have 2 elements). These speakers are talking about the subject as if they are an outsider. You must make up a new name.
9
+ - You can use [word](+1) to raise the stress of the word, and [word](+2) to raise the stress of the word even more.
10
+ - The opposite, lower the word stress with [word](-1) and [word](-2).
11
+ - nextGapMilisecs indicates the time gap between the current turn and the next turn in milliseconds. It can be negative or positive. Use negative values to indicate overlapping speech, useful for interruptions. Possible values are from -1000 to 300.
12
+ - The text should be a sentence or a phrase. It should not be too long or too short. Sometimes, write longer sentences to make the conversation more natural.
13
+ - Root level must have title, speakerNames, and turns.
14
+ - Each turn must have index, speakerName, text, and nextGapMilisecs.
15
+ - There can be from 20 to 30 turns in total.
16
+ - Only use base ASCII, do NOT use ALL CAPS, strings are wrapped inside "..."
17
+ - First turns should be the introduction for the theme and speakers.
18
+ - The script will be passed to TTS engine, make sure to write plain pronunciation, for example the www. must pronounced like "www dot"
19
+ - Sometimes, try inserting small words like "Yeah?", "Oh!" and set nextGapMilisecs to high negative number to simulate interruptions.
20
+
21
+ There is an example (it is truncated):
22
+
23
+ [START OF EXAMPLE]
24
+ \`\`\`yaml
25
+ title: "Podcast about the history of the Internet"
26
+ speakerNames:
27
+ - "Alice"
28
+ - Davy Peel
29
+ turns:
30
+ - index: 0
31
+ speakerName: Alice
32
+ text: It wouldn't be better to follow on technology with Magnus Nystedt than to actually cross over using technology to Wellington International School and [Whiz Radio](+1). And who better to kick off the Whiz Radio segment than the person who motivates the students over at Whiz, Wellington International School, than Miss Davy Peel. [Welcome](+1)... [Tell me](-1), give me, give me the scoop here, because I, I came and talked to you a little while ago and said, what do you guys think about doing some kind of a TEDx thing? And then I just sort of backed off.
33
+ nextGapMilisecs: 100
34
+ - index: 1
35
+ speakerName: Davy Peel
36
+ text: [Absolutely!](+1) An amazing opportunity to get the kids a bit of kind of creative freedom and, and a forum.
37
+ nextGapMilisecs: 1000
38
+ \`\`\`
39
+ [END OF EXAMPLE]
40
+
41
+ The example above is truncated at index 1, REMEMBER TO CREATE AT LEAST 20 TURNS
42
+
43
+ Now, here is the content you need to write the podcast script:
44
+
45
+ [START OF CONTENT]
46
+ ${content}
47
+ [END OF CONTENT]
48
+
49
+ [START OF NOTE]
50
+ ${note.length < 1 ? '(No note provided)' : note}
51
+ [END OF NOTE]
52
+
53
+ `.trim();
front/src/utils/types.ts ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export interface PodcastTurn {
2
+ index: number;
3
+ speakerName: string;
4
+ text: string;
5
+ nextGapMilisecs: number;
6
+ }
7
+
8
+ export interface Podcast {
9
+ title: string;
10
+ speakerNames: string[];
11
+ turns: PodcastTurn[];
12
+ }
front/src/utils/utils.ts ADDED
@@ -0,0 +1,301 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // @ts-expect-error this package does not have typing
2
+ import TextLineStream from 'textlinestream';
3
+ import { Client } from '@gradio/client';
4
+ import decodeAudio from 'audio-decode';
5
+
6
+ // ponyfill for missing ReadableStream asyncIterator on Safari
7
+ import { asyncIterator } from '@sec-ant/readable-stream/ponyfill/asyncIterator';
8
+ import { CONFIG } from '../config';
9
+
10
+ // return URL to the WAV file
11
+ export const generateAudio = async (
12
+ content: string,
13
+ voice: string,
14
+ speed: number = 1.1
15
+ ): Promise<string> => {
16
+ const client = await Client.connect(CONFIG.ttsSpaceId);
17
+ const result = await client.predict('/tts', {
18
+ text: content,
19
+ voice,
20
+ speed,
21
+ });
22
+
23
+ console.log(result.data);
24
+ return (result.data as any)[0].url;
25
+ };
26
+
27
+ export const pickRand = <T>(arr: T[]): T => {
28
+ return arr[Math.floor(Math.random() * arr.length)];
29
+ };
30
+
31
+ // wrapper for SSE
32
+ export async function* getSSEStreamAsync(fetchResponse: Response) {
33
+ if (!fetchResponse.body) throw new Error('Response body is empty');
34
+ const lines: ReadableStream<string> = fetchResponse.body
35
+ .pipeThrough(new TextDecoderStream())
36
+ .pipeThrough(new TextLineStream());
37
+ // @ts-expect-error asyncIterator complains about type, but it should work
38
+ for await (const line of asyncIterator(lines)) {
39
+ //if (isDev) console.log({ line });
40
+ if (line.startsWith('data:') && !line.endsWith('[DONE]')) {
41
+ const data = JSON.parse(line.slice(5));
42
+ yield data;
43
+ } else if (line.startsWith('error:')) {
44
+ const data = JSON.parse(line.slice(6));
45
+ throw new Error(data.message || 'Unknown error');
46
+ }
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Ok now, most of the functions below are written by ChatGPT using Reasoning mode.
52
+ */
53
+
54
+ ////////////////////////////////////////
55
+ // Audio manipulation utils
56
+
57
+ export const trimSilence = (audioBuffer: AudioBuffer): AudioBuffer => {
58
+ const threshold = 0.01; // Amplitude below which a sample is considered silent.
59
+ const numChannels = audioBuffer.numberOfChannels;
60
+ const totalSamples = audioBuffer.length;
61
+
62
+ // Helper function to check if a sample at the given index is silent in all channels.
63
+ const isSilent = (index: number): boolean => {
64
+ for (let channel = 0; channel < numChannels; channel++) {
65
+ const channelData = audioBuffer.getChannelData(channel);
66
+ if (Math.abs(channelData[index]) > threshold) {
67
+ return false;
68
+ }
69
+ }
70
+ return true;
71
+ };
72
+
73
+ // Find the first non-silent sample.
74
+ let startSample = 0;
75
+ while (startSample < totalSamples && isSilent(startSample)) {
76
+ startSample++;
77
+ }
78
+
79
+ // Find the last non-silent sample.
80
+ let endSample = totalSamples - 1;
81
+ while (endSample >= startSample && isSilent(endSample)) {
82
+ endSample--;
83
+ }
84
+
85
+ // If no non-silent samples were found, return an empty AudioBuffer.
86
+ if (startSample >= totalSamples || endSample < startSample) {
87
+ return new AudioBuffer({
88
+ length: 1,
89
+ numberOfChannels: numChannels,
90
+ sampleRate: audioBuffer.sampleRate,
91
+ });
92
+ }
93
+
94
+ const newLength = endSample - startSample + 1;
95
+ const newBuffer = new AudioBuffer({
96
+ length: newLength,
97
+ numberOfChannels: numChannels,
98
+ sampleRate: audioBuffer.sampleRate,
99
+ });
100
+
101
+ // Copy the trimmed audio samples from the original buffer to the new buffer.
102
+ for (let channel = 0; channel < numChannels; channel++) {
103
+ const oldData = audioBuffer.getChannelData(channel);
104
+ const newData = newBuffer.getChannelData(channel);
105
+ for (let i = 0; i < newLength; i++) {
106
+ newData[i] = oldData[startSample + i];
107
+ }
108
+ }
109
+
110
+ return newBuffer;
111
+ };
112
+
113
+ export const joinAudio = (
114
+ audio1: AudioBuffer,
115
+ audio2: AudioBuffer,
116
+ gapSeconds: number
117
+ ): AudioBuffer => {
118
+ const sampleRate = audio1.sampleRate;
119
+ const numChannels = audio1.numberOfChannels;
120
+
121
+ // Ensure both audio buffers are compatible.
122
+ if (audio2.sampleRate !== sampleRate) {
123
+ throw new Error('Audio buffers must have the same sample rate');
124
+ }
125
+ if (audio2.numberOfChannels !== numChannels) {
126
+ throw new Error('Audio buffers must have the same number of channels');
127
+ }
128
+
129
+ let newLength: number;
130
+
131
+ if (gapSeconds > 0) {
132
+ // Pad with silence: gapSamples of silence in between.
133
+ const gapSamples = Math.round(gapSeconds * sampleRate);
134
+ newLength = audio1.length + gapSamples + audio2.length;
135
+ } else if (gapSeconds === 0) {
136
+ // Simply join one after the other.
137
+ newLength = audio1.length + audio2.length;
138
+ } else {
139
+ // gapSeconds < 0 means we blend (overlap) the end of audio1 with the beginning of audio2.
140
+ const overlapSamplesRequested = Math.round(-gapSeconds * sampleRate);
141
+ // Ensure we don't overlap more than available in either buffer.
142
+ const effectiveOverlap = Math.min(
143
+ overlapSamplesRequested,
144
+ audio1.length,
145
+ audio2.length
146
+ );
147
+ newLength = audio1.length + audio2.length - effectiveOverlap;
148
+ }
149
+
150
+ // Create a new AudioBuffer for the joined result.
151
+ const newBuffer = new AudioBuffer({
152
+ length: newLength,
153
+ numberOfChannels: numChannels,
154
+ sampleRate: sampleRate,
155
+ });
156
+
157
+ // Process each channel.
158
+ for (let channel = 0; channel < numChannels; channel++) {
159
+ const outputData = newBuffer.getChannelData(channel);
160
+ const data1 = audio1.getChannelData(channel);
161
+ const data2 = audio2.getChannelData(channel);
162
+ let offset = 0;
163
+
164
+ if (gapSeconds < 0) {
165
+ // Blend the join section.
166
+ const overlapSamplesRequested = Math.round(-gapSeconds * sampleRate);
167
+ const effectiveOverlap = Math.min(
168
+ overlapSamplesRequested,
169
+ audio1.length,
170
+ audio2.length
171
+ );
172
+
173
+ // Copy audio1 data up to the start of the overlapping section.
174
+ const nonOverlapLength = audio1.length - effectiveOverlap;
175
+ outputData.set(data1.subarray(0, nonOverlapLength), offset);
176
+ offset += nonOverlapLength;
177
+
178
+ // Blend overlapping region.
179
+ for (let i = 0; i < effectiveOverlap; i++) {
180
+ // Linear crossfade:
181
+ const fadeOut = 1 - i / effectiveOverlap;
182
+ const fadeIn = i / effectiveOverlap;
183
+ outputData[offset + i] =
184
+ data1[nonOverlapLength + i] * fadeOut + data2[i] * fadeIn;
185
+ }
186
+ offset += effectiveOverlap;
187
+
188
+ // Append remaining audio2 data.
189
+ outputData.set(data2.subarray(effectiveOverlap), offset);
190
+ } else if (gapSeconds === 0) {
191
+ // Directly concatenate: copy audio1 then audio2.
192
+ outputData.set(data1, offset);
193
+ offset += audio1.length;
194
+ outputData.set(data2, offset);
195
+ } else {
196
+ // gapSeconds > 0: insert silence between audio1 and audio2.
197
+ const gapSamples = Math.round(gapSeconds * sampleRate);
198
+ outputData.set(data1, offset);
199
+ offset += audio1.length;
200
+
201
+ // Silence: the buffer is initialized with zeros, so we simply move the offset.
202
+ offset += gapSamples;
203
+
204
+ outputData.set(data2, offset);
205
+ }
206
+ }
207
+
208
+ return newBuffer;
209
+ };
210
+
211
+ ////////////////////////////////////////
212
+ // Audio formatting utils
213
+
214
+ export const loadWavAndDecode = async (url: string): Promise<AudioBuffer> => {
215
+ const response = await fetch(url);
216
+ const arrayBuffer = await response.arrayBuffer();
217
+ const audioBuffer = await decodeAudio(arrayBuffer);
218
+ return audioBuffer;
219
+ };
220
+
221
+ export function audioBufferToWav(
222
+ buffer: AudioBuffer,
223
+ options: { float32?: boolean } = {}
224
+ ): ArrayBuffer {
225
+ const numChannels = buffer.numberOfChannels;
226
+ const sampleRate = buffer.sampleRate;
227
+ const format = options.float32 ? 3 : 1; // 3 = IEEE float, 1 = PCM
228
+ const bitDepth = options.float32 ? 32 : 16;
229
+
230
+ const numSamples = buffer.length;
231
+ const headerLength = 44;
232
+ const bytesPerSample = bitDepth / 8;
233
+ const dataLength = numSamples * numChannels * bytesPerSample;
234
+ const bufferLength = headerLength + dataLength;
235
+
236
+ const arrayBuffer = new ArrayBuffer(bufferLength);
237
+ const view = new DataView(arrayBuffer);
238
+ let offset = 0;
239
+
240
+ function writeString(str: string) {
241
+ for (let i = 0; i < str.length; i++) {
242
+ view.setUint8(offset, str.charCodeAt(i));
243
+ offset++;
244
+ }
245
+ }
246
+
247
+ // Write WAV header
248
+ writeString('RIFF');
249
+ view.setUint32(offset, 36 + dataLength, true);
250
+ offset += 4;
251
+ writeString('WAVE');
252
+ writeString('fmt ');
253
+ view.setUint32(offset, 16, true);
254
+ offset += 4;
255
+ view.setUint16(offset, format, true);
256
+ offset += 2;
257
+ view.setUint16(offset, numChannels, true);
258
+ offset += 2;
259
+ view.setUint32(offset, sampleRate, true);
260
+ offset += 4;
261
+ view.setUint32(offset, sampleRate * numChannels * bytesPerSample, true);
262
+ offset += 4;
263
+ view.setUint16(offset, numChannels * bytesPerSample, true);
264
+ offset += 2;
265
+ view.setUint16(offset, bitDepth, true);
266
+ offset += 2;
267
+ writeString('data');
268
+ view.setUint32(offset, dataLength, true);
269
+ offset += 4;
270
+
271
+ // Write PCM samples: interleave channels
272
+ const channels: Float32Array[] = [];
273
+ for (let i = 0; i < numChannels; i++) {
274
+ channels.push(buffer.getChannelData(i));
275
+ }
276
+
277
+ for (let i = 0; i < numSamples; i++) {
278
+ for (let channel = 0; channel < numChannels; channel++) {
279
+ let sample = channels[channel][i];
280
+ // Clamp the sample to [-1, 1]
281
+ sample = Math.max(-1, Math.min(1, sample));
282
+ if (options.float32) {
283
+ view.setFloat32(offset, sample, true);
284
+ offset += 4;
285
+ } else {
286
+ // Convert to 16-bit PCM sample
287
+ const intSample = sample < 0 ? sample * 0x8000 : sample * 0x7fff;
288
+ view.setInt16(offset, intSample, true);
289
+ offset += 2;
290
+ }
291
+ }
292
+ }
293
+
294
+ return arrayBuffer;
295
+ }
296
+
297
+ export const blobFromAudioBuffer = (audioBuffer: AudioBuffer): Blob => {
298
+ // Using 16-bit PCM for compatibility.
299
+ const wavArrayBuffer = audioBufferToWav(audioBuffer, { float32: false });
300
+ return new Blob([wavArrayBuffer], { type: 'audio/wav' });
301
+ };
front/tailwind.config.js ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ content: [
4
+ "./index.html",
5
+ "./src/**/*.{js,ts,jsx,tsx}",
6
+ ],
7
+ theme: {
8
+ extend: {},
9
+ },
10
+ plugins: [
11
+ require('daisyui'),
12
+ ],
13
+ daisyui: {}
14
+ }
front/vite.config.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { defineConfig } from 'vite'
2
- import react from '@vitejs/plugin-react'
3
  import { viteSingleFile } from 'vite-plugin-singlefile';
4
 
5
  // https://vite.dev/config/
6
  export default defineConfig({
7
  plugins: [react(), viteSingleFile()],
8
- })
 
1
+ import { defineConfig } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
  import { viteSingleFile } from 'vite-plugin-singlefile';
4
 
5
  // https://vite.dev/config/
6
  export default defineConfig({
7
  plugins: [react(), viteSingleFile()],
8
+ });