From 26c43b19666155ed18bad5ccae3e2f0341ae5346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Wed, 21 Aug 2024 18:20:04 +0200 Subject: [PATCH] feat: learn --- icons.config.js | 2 + package.json | 5 +- pnpm-lock.yaml | 472 ++++++++++++++++++-- src/lib/charrecorder/CharRecorder.svelte | 4 +- src/lib/charrecorder/core/plugins/chords.ts | 1 + src/lib/learn/chords.ts | 101 +++++ src/routes/(app)/+layout.svelte | 30 +- src/routes/(app)/Sidebar.svelte | 88 +++- src/routes/(app)/learn/+page.svelte | 230 ++++++++++ src/routes/(app)/vocabulary/+page.svelte | 174 -------- static/sentences/Modelfile | 10 + svelte.config.js | 7 +- 12 files changed, 872 insertions(+), 252 deletions(-) create mode 100644 src/lib/learn/chords.ts delete mode 100644 src/routes/(app)/vocabulary/+page.svelte create mode 100644 static/sentences/Modelfile diff --git a/icons.config.js b/icons.config.js index 09857e83..11ea748f 100644 --- a/icons.config.js +++ b/icons.config.js @@ -100,6 +100,7 @@ const config = { "account_circle", "experiment", "code", + "dictionary", ], codePoints: { speed: "e9e4", @@ -120,6 +121,7 @@ const config = { stat_2: "e699", routine: "e20c", experiment: "e686", + dictionary: "f539", }, }; diff --git a/package.json b/package.json index db5d17d6..2e04f62c 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,8 @@ "@fontsource-variable/noto-sans-mono": "^5.0.20", "@lezer/highlight": "^1.2.0", "@material/material-color-utilities": "^0.3.0", + "@melt-ui/pp": "^0.3.2", + "@melt-ui/svelte": "^0.83.0", "@modyfi/vite-plugin-yaml": "^1.1.0", "@sveltejs/adapter-static": "^3.0.2", "@sveltejs/kit": "^2.5.18", @@ -58,6 +60,7 @@ "autoprefixer": "^10.4.19", "codemirror": "^6.0.1", "cypress": "^13.13.2", + "d3": "^7.9.0", "flexsearch": "^0.7.43", "fontkit": "^2.0.2", "glob": "^11.0.0", @@ -72,7 +75,7 @@ "stylelint-config-prettier-scss": "^1.0.0", "stylelint-config-recommended-scss": "^14.1.0", "stylelint-config-standard-scss": "^13.1.0", - "svelte": "5.0.0-next.178", + "svelte": "5.0.0-next.221", "svelte-check": "^3.8.5", "svelte-preprocess": "^6.0.2", "tippy.js": "^6.3.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b320551..df85f565 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,18 +38,24 @@ importers: '@material/material-color-utilities': specifier: ^0.3.0 version: 0.3.0 + '@melt-ui/pp': + specifier: ^0.3.2 + version: 0.3.2(@melt-ui/svelte@0.83.0(svelte@5.0.0-next.221))(svelte@5.0.0-next.221) + '@melt-ui/svelte': + specifier: ^0.83.0 + version: 0.83.0(svelte@5.0.0-next.221) '@modyfi/vite-plugin-yaml': specifier: ^1.1.0 version: 1.1.0(rollup@2.79.1)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) '@sveltejs/adapter-static': specifier: ^3.0.2 - version: 3.0.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))) + version: 3.0.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))) '@sveltejs/kit': specifier: ^2.5.18 - version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) + version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.1 - version: 3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) + version: 3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) '@tauri-apps/api': specifier: ^1.6.0 version: 1.6.0 @@ -70,7 +76,7 @@ importers: version: 1.0.10 '@vite-pwa/sveltekit': specifier: ^0.6.0 - version: 0.6.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(vite-plugin-pwa@0.20.1(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))(workbox-build@7.1.1)(workbox-window@7.1.0)) + version: 0.6.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(vite-plugin-pwa@0.20.1(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))(workbox-build@7.1.1)(workbox-window@7.1.0)) autoprefixer: specifier: ^10.4.19 version: 10.4.19(postcss@8.4.39) @@ -80,6 +86,9 @@ importers: cypress: specifier: ^13.13.2 version: 13.13.2 + d3: + specifier: ^7.9.0 + version: 7.9.0 flexsearch: specifier: ^0.7.43 version: 0.7.43 @@ -100,7 +109,7 @@ importers: version: 3.3.3 prettier-plugin-svelte: specifier: ^3.2.6 - version: 3.2.6(prettier@3.3.3)(svelte@5.0.0-next.178) + version: 3.2.6(prettier@3.3.3)(svelte@5.0.0-next.221) sass: specifier: ^1.77.8 version: 1.77.8 @@ -123,14 +132,14 @@ importers: specifier: ^13.1.0 version: 13.1.0(postcss@8.4.39)(stylelint@16.8.1(typescript@5.5.4)) svelte: - specifier: 5.0.0-next.178 - version: 5.0.0-next.178 + specifier: 5.0.0-next.221 + version: 5.0.0-next.221 svelte-check: specifier: ^3.8.5 - version: 3.8.5(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.178) + version: 3.8.5(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.221) svelte-preprocess: specifier: ^6.0.2 - version: 6.0.2(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.178)(typescript@5.5.4) + version: 6.0.2(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.221)(typescript@5.5.4) tippy.js: specifier: ^6.3.7 version: 6.3.7 @@ -948,12 +957,24 @@ packages: cpu: [x64] os: [win32] + '@floating-ui/core@1.6.7': + resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} + + '@floating-ui/dom@1.6.10': + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + '@fontsource-variable/material-symbols-rounded@5.0.36': resolution: {integrity: sha512-bSuXPJXM7kV2KJUW6FqNwWykhMfwlBgguiMZxx/6VTXXR/UcKAj4skUpHAuzYFuJfpXP/IS492ENiCdFPT5qxw==} '@fontsource-variable/noto-sans-mono@5.0.20': resolution: {integrity: sha512-Mik/wbKjiir7t+KBaDZnPZ5GjDnPOXpMF7obmFeyRa528ZsrKcFiSn4ZvArrn3sJMCp/k23wakOcXOWlGNc9cw==} + '@internationalized/date@3.5.5': + resolution: {integrity: sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -994,6 +1015,17 @@ packages: '@material/material-color-utilities@0.3.0': resolution: {integrity: sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g==} + '@melt-ui/pp@0.3.2': + resolution: {integrity: sha512-xKkPvaIAFinklLXcQOpwZ8YSpqAFxykjWf8Y/fSJQwsixV/0rcFs07hJ49hJjPy5vItvw5Qa0uOjzFUbXzBypQ==} + peerDependencies: + '@melt-ui/svelte': '>= 0.29.0' + svelte: ^3.55.0 || ^4.0.0 || ^5.0.0-next.1 + + '@melt-ui/svelte@0.83.0': + resolution: {integrity: sha512-E7QT+8YSftz+Hdk1W0hNR3f+cnaF2COMWkStn+2u4vk0RO1I9mXRJl+bJD6uhYaH146oxEB+5elu/ABbv6rpsA==} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.118 + '@modyfi/vite-plugin-yaml@1.1.0': resolution: {integrity: sha512-L26xfzkSo1yamODCAtk/ipVlL6OEw2bcJ92zunyHu8zxi7+meV0zefA9xscRMDCsMY8xL3C3wi3DhMiPxcbxbw==} peerDependencies: @@ -1240,6 +1272,9 @@ packages: '@swc/helpers@0.4.36': resolution: {integrity: sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==} + '@swc/helpers@0.5.12': + resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} + '@tauri-apps/api@1.6.0': resolution: {integrity: sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==} engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} @@ -1680,6 +1715,10 @@ packages: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} @@ -1746,6 +1785,133 @@ packages: engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} hasBin: true + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} @@ -1814,6 +1980,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -2029,6 +2198,9 @@ packages: flexsearch@0.7.43: resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + focus-trap@7.5.4: + resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} + follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} @@ -2282,6 +2454,10 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -2667,6 +2843,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.0.7: + resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} + engines: {node: ^18 || >=20} + hasBin: true + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -3004,6 +3185,9 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} @@ -3023,6 +3207,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -3416,8 +3603,8 @@ packages: typescript: optional: true - svelte@5.0.0-next.178: - resolution: {integrity: sha512-Hr/h/fV+6h7FBoZjop+f8Goc32nfsNP9YWjcWVSZ0kTt3UIWWQbj3rFpaF1b2173fklIq+HJLzrFxC1XMnBfSw==} + svelte@5.0.0-next.221: + resolution: {integrity: sha512-Cen/f3FLWI9C2z6fwPZmopD609+eMGkdwsf010EyGQeB+vyuree7bgaGxSVUbN0yMGx+2ztYw2RfjIji+YiBgA==} engines: {node: '>=18'} svg-tags@1.0.0: @@ -3426,6 +3613,9 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + table@6.8.2: resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} engines: {node: '>=10.0.0'} @@ -4811,10 +5001,25 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true + '@floating-ui/core@1.6.7': + dependencies: + '@floating-ui/utils': 0.2.7 + + '@floating-ui/dom@1.6.10': + dependencies: + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 + + '@floating-ui/utils@0.2.7': {} + '@fontsource-variable/material-symbols-rounded@5.0.36': {} '@fontsource-variable/noto-sans-mono@5.0.20': {} + '@internationalized/date@3.5.5': + dependencies: + '@swc/helpers': 0.5.12 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4864,6 +5069,23 @@ snapshots: '@material/material-color-utilities@0.3.0': {} + '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.83.0(svelte@5.0.0-next.221))(svelte@5.0.0-next.221)': + dependencies: + '@melt-ui/svelte': 0.83.0(svelte@5.0.0-next.221) + estree-walker: 3.0.3 + magic-string: 0.30.10 + svelte: 5.0.0-next.221 + + '@melt-ui/svelte@0.83.0(svelte@5.0.0-next.221)': + dependencies: + '@floating-ui/core': 1.6.7 + '@floating-ui/dom': 1.6.10 + '@internationalized/date': 3.5.5 + dequal: 2.0.3 + focus-trap: 7.5.4 + nanoid: 5.0.7 + svelte: 5.0.0-next.221 + '@modyfi/vite-plugin-yaml@1.1.0(rollup@2.79.1)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))': dependencies: '@rollup/pluginutils': 5.1.0(rollup@2.79.1) @@ -5059,13 +5281,13 @@ snapshots: magic-string: 0.25.9 string.prototype.matchall: 4.0.11 - '@sveltejs/adapter-static@3.0.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))': + '@sveltejs/adapter-static@3.0.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))': dependencies: - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) + '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) - '@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))': + '@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -5077,28 +5299,28 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.4 - svelte: 5.0.0-next.178 + svelte: 5.0.0-next.221 tiny-glob: 0.2.9 vite: 5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) debug: 4.3.5(supports-color@8.1.1) - svelte: 5.0.0-next.178 + svelte: 5.0.0-next.221 vite: 5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))': + '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) debug: 4.3.5(supports-color@8.1.1) deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.10 - svelte: 5.0.0-next.178 - svelte-hmr: 0.16.0(svelte@5.0.0-next.178) + svelte: 5.0.0-next.221 + svelte-hmr: 0.16.0(svelte@5.0.0-next.221) vite: 5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1) vitefu: 0.2.5(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) transitivePeerDependencies: @@ -5113,6 +5335,10 @@ snapshots: legacy-swc-helpers: '@swc/helpers@0.4.14' tslib: 2.6.3 + '@swc/helpers@0.5.12': + dependencies: + tslib: 2.6.3 + '@tauri-apps/api@1.6.0': {} '@tauri-apps/cli-darwin-arm64@1.6.0': @@ -5192,9 +5418,9 @@ snapshots: '@types/node': 20.14.10 optional: true - '@vite-pwa/sveltekit@0.6.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(vite-plugin-pwa@0.20.1(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))(workbox-build@7.1.1)(workbox-window@7.1.0))': + '@vite-pwa/sveltekit@0.6.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(vite-plugin-pwa@0.20.1(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))(workbox-build@7.1.1)(workbox-window@7.1.0))': dependencies: - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.178)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) + '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)))(svelte@5.0.0-next.221)(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1)) kolorist: 1.8.0 vite-plugin-pwa: 0.20.1(vite@5.3.5(@types/node@20.14.10)(sass@1.77.8)(terser@5.31.1))(workbox-build@7.1.1)(workbox-window@7.1.0) @@ -5541,6 +5767,8 @@ snapshots: commander@6.2.1: {} + commander@7.2.0: {} + common-tags@1.8.2: {} concat-map@0.0.1: {} @@ -5640,6 +5868,158 @@ snapshots: untildify: 4.0.0 yauzl: 2.10.0 + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + dashdash@1.14.1: dependencies: assert-plus: 1.0.0 @@ -5703,6 +6083,10 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} deprecation@2.3.1: {} @@ -5986,6 +6370,10 @@ snapshots: flexsearch@0.7.43: {} + focus-trap@7.5.4: + dependencies: + tabbable: 6.2.0 + follow-redirects@1.15.6(debug@4.3.5): optionalDependencies: debug: 4.3.5(supports-color@8.1.1) @@ -6249,6 +6637,8 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + internmap@2.0.3: {} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -6590,6 +6980,8 @@ snapshots: nanoid@3.3.7: {} + nanoid@5.0.7: {} + nice-try@1.0.5: {} node-releases@2.0.14: {} @@ -6776,10 +7168,10 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 - prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@5.0.0-next.178): + prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@5.0.0-next.221): dependencies: prettier: 3.3.3 - svelte: 5.0.0-next.178 + svelte: 5.0.0-next.221 prettier@3.3.3: {} @@ -6889,6 +7281,8 @@ snapshots: dependencies: glob: 7.2.3 + robust-predicates@3.0.2: {} + rollup@2.79.1: optionalDependencies: fsevents: 2.3.3 @@ -6923,6 +7317,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rw@1.3.3: {} + rxjs@7.8.1: dependencies: tslib: 2.6.3 @@ -7294,14 +7690,14 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.8.5(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.178): + svelte-check@3.8.5(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.221): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 picocolors: 1.0.1 sade: 1.8.1 - svelte: 5.0.0-next.178 - svelte-preprocess: 5.1.4(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.178)(typescript@5.5.4) + svelte: 5.0.0-next.221 + svelte-preprocess: 5.1.4(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.221)(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - '@babel/core' @@ -7314,34 +7710,34 @@ snapshots: - stylus - sugarss - svelte-hmr@0.16.0(svelte@5.0.0-next.178): + svelte-hmr@0.16.0(svelte@5.0.0-next.221): dependencies: - svelte: 5.0.0-next.178 + svelte: 5.0.0-next.221 - svelte-preprocess@5.1.4(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.178)(typescript@5.5.4): + svelte-preprocess@5.1.4(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.221)(typescript@5.5.4): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 magic-string: 0.30.10 sorcery: 0.11.1 strip-indent: 3.0.0 - svelte: 5.0.0-next.178 + svelte: 5.0.0-next.221 optionalDependencies: '@babel/core': 7.24.7 postcss: 8.4.39 sass: 1.77.8 typescript: 5.5.4 - svelte-preprocess@6.0.2(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.178)(typescript@5.5.4): + svelte-preprocess@6.0.2(@babel/core@7.24.7)(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.221)(typescript@5.5.4): dependencies: - svelte: 5.0.0-next.178 + svelte: 5.0.0-next.221 optionalDependencies: '@babel/core': 7.24.7 postcss: 8.4.39 sass: 1.77.8 typescript: 5.5.4 - svelte@5.0.0-next.178: + svelte@5.0.0-next.221: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.4.15 @@ -7361,6 +7757,8 @@ snapshots: symbol-tree@3.2.4: {} + tabbable@6.2.0: {} + table@6.8.2: dependencies: ajv: 8.16.0 diff --git a/src/lib/charrecorder/CharRecorder.svelte b/src/lib/charrecorder/CharRecorder.svelte index c6821687..b426e8bd 100644 --- a/src/lib/charrecorder/CharRecorder.svelte +++ b/src/lib/charrecorder/CharRecorder.svelte @@ -13,8 +13,8 @@ children, }: { replay: ReplayPlayer | Replay; - cursor: boolean; - keys: boolean; + cursor?: boolean; + keys?: boolean; children?: Snippet; } = $props(); diff --git a/src/lib/charrecorder/core/plugins/chords.ts b/src/lib/charrecorder/core/plugins/chords.ts index c12f39a8..2b889450 100644 --- a/src/lib/charrecorder/core/plugins/chords.ts +++ b/src/lib/charrecorder/core/plugins/chords.ts @@ -85,6 +85,7 @@ export class ChordsReplayPlugin } } } + console.log(this.tokens); clearTimeout(this.timeout); if (replay.stepper.held.size === 0) { diff --git a/src/lib/learn/chords.ts b/src/lib/learn/chords.ts new file mode 100644 index 00000000..c6cc1a68 --- /dev/null +++ b/src/lib/learn/chords.ts @@ -0,0 +1,101 @@ +import { osLayout } from "$lib/os-layout"; +import { KEYMAP_CODES } from "$lib/serial/keymap-codes"; +import { persistentWritable } from "$lib/storage"; +import { type ChordInfo, chords } from "$lib/undo-redo"; +import { derived } from "svelte/store"; + +export const words = derived( + [chords, osLayout], + ([chords, layout]) => + new Map( + chords + .map((chord) => ({ + chord, + output: chord.phrase.map((action) => + layout.get(KEYMAP_CODES.get(action)?.keyCode ?? ""), + ), + })) + .filter(({ output }) => output.every((it) => !!it)) + .map(({ chord, output }) => [output.join("").trim(), chord] as const), + ), +); + +interface Score { + lastTyped: number; + score: number; + total: number; +} + +export const scores = persistentWritable>("scores", {}); + +export const learnConfigDefault = { + maxScore: 3, + minScore: -3, + scoreBlend: 0.5, + weakRate: 0.8, + weakBoost: 0.5, + maxWeak: 3, + newRate: 0.3, + initialNewRate: 0.9, + initialCount: 10, +}; +export const learnConfigStored = persistentWritable< + Partial +>("learn-config", {}); +export const learnConfig = derived(learnConfigStored, (config) => ({ + ...learnConfigDefault, + ...config, +})); + +let lastWord: string | undefined; + +function shuffle(array: T[]): T[] { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j]!, array[i]!]; + } + return array; +} + +function randomLog2(array: T[], max = array.length): T | undefined { + return array[ + Math.floor(Math.pow(2, Math.log2(Math.random() * Math.log2(max)))) + ]; +} + +export const nextWord = derived( + [words, scores, learnConfig], + ([words, scores, config]) => { + const values = Object.entries(scores).filter(([it]) => it !== lastWord); + + values.sort(([, a], [, b]) => a.score - b.score); + const weakCount = + (values.findIndex(([, { score }]) => score > 0) + 1 || + values.length + 1) - 1; + const weak = randomLog2(values, weakCount); + if (weak && Math.random() / weakCount < config.weakRate) { + lastWord = weak[0]; + return weak[0]; + } + + values.sort(([, { lastTyped: a }], [, { lastTyped: b }]) => a - b); + const recent = randomLog2(values); + const newRate = + values.length < config.initialCount + ? config.initialNewRate + : config.newRate; + if ( + recent && + (Math.random() < Math.min(1, Math.max(0, weakCount / config.maxWeak)) || + Math.random() > newRate) + ) { + lastWord = recent[0]; + return recent[0]; + } + + const newWord = shuffle(Array.from(words.keys())).find((it) => !scores[it]); + const word = newWord || recent?.[0] || weak?.[0]; + lastWord = word; + return word; + }, +); diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index 4fbd7aa4..556867b2 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -108,32 +108,30 @@ - {@html webManifestLink} + {$LL.TITLE()} - +
+ - + - + + {#if children} + {@render children()} + {/if} + - - {#if children} - {@render children()} +
+ + {#if import.meta.env.TAURI_FAMILY === undefined && browser && !("serial" in navigator)} + {/if} - - -
- -{#if import.meta.env.TAURI_FAMILY === undefined && browser && !("serial" in navigator)} - -{/if} -
diff --git a/src/routes/(app)/Sidebar.svelte b/src/routes/(app)/Sidebar.svelte index 0b8a3387..07714288 100644 --- a/src/routes/(app)/Sidebar.svelte +++ b/src/routes/(app)/Sidebar.svelte @@ -15,18 +15,42 @@ } }); + const routes = [ + [ + { href: "/config/chords/", icon: "dictionary", title: "Chords" }, + { href: "/config/layout/", icon: "keyboard", title: "Layout" }, + { href: "/config/settings/", icon: "tune", title: "Config" }, + ], + [ + { href: "/learn", icon: "school", title: "Learn", wip: true }, + { href: "/learn", icon: "description", title: "Docs" }, + { href: "/editor", icon: "edit_document", title: "Editor", wip: true }, + ], + [ + { href: "/chat", icon: "chat", title: "Chat", wip: true }, + { href: "/plugin", icon: "code", title: "Plugin", wip: true }, + ], + ] satisfies { href: string; icon: string; title: string; wip?: boolean }[][]; + let connectButton: HTMLButtonElement;