diff --git a/package.json b/package.json
index 314ba348..e9884e4a 100644
--- a/package.json
+++ b/package.json
@@ -73,7 +73,6 @@
"glob": "^11.0.3",
"js-yaml": "^4.1.1",
"jsdom": "^26.1.0",
- "matrix-js-sdk": "^37.12.0",
"npm-run-all": "^4.1.5",
"prettier": "^3.7.4",
"prettier-plugin-css-order": "^2.1.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3b2cdb3c..d80b8606 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -125,9 +125,6 @@ importers:
jsdom:
specifier: ^26.1.0
version: 26.1.0
- matrix-js-sdk:
- specifier: ^37.12.0
- version: 37.12.0
npm-run-all:
specifier: ^4.1.5
version: 4.1.5
@@ -710,10 +707,6 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
- '@babel/runtime@7.24.7':
- resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==}
- engines: {node: '>=6.9.0'}
-
'@babel/runtime@7.28.4':
resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
engines: {node: '>=6.9.0'}
@@ -1075,10 +1068,6 @@ packages:
'@material/material-color-utilities@0.3.0':
resolution: {integrity: sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g==}
- '@matrix-org/matrix-sdk-crypto-wasm@15.1.0':
- resolution: {integrity: sha512-ZsDdjn46J3+VxsDLmaSODuS+qtGZB/i3Cg9tWL1QPNjvAWzNaTHQ7glleByI2PKVBm83aklfuhGKT2MqE1ZsEA==}
- engines: {node: '>= 18'}
-
'@melt-ui/pp@0.3.2':
resolution: {integrity: sha512-xKkPvaIAFinklLXcQOpwZ8YSpqAFxykjWf8Y/fSJQwsixV/0rcFs07hJ49hJjPy5vItvw5Qa0uOjzFUbXzBypQ==}
peerDependencies:
@@ -1499,9 +1488,6 @@ packages:
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
- '@types/events@3.0.3':
- resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==}
-
'@types/js-yaml@4.0.9':
resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
@@ -1511,9 +1497,6 @@ packages:
'@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
- '@types/retry@0.12.0':
- resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==}
-
'@types/semver@7.7.1':
resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==}
@@ -1601,9 +1584,6 @@ packages:
ajv@8.17.1:
resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
- another-json@0.2.0:
- resolution: {integrity: sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==}
-
ansi-colors@4.1.3:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
@@ -1738,9 +1718,6 @@ packages:
balanced-match@2.0.0:
resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
- base-x@5.0.0:
- resolution: {integrity: sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==}
-
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -1775,9 +1752,6 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
- bs58@6.0.0:
- resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==}
-
buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
@@ -1916,10 +1890,6 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- content-type@1.0.5:
- resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
- engines: {node: '>= 0.6'}
-
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
@@ -2383,10 +2353,6 @@ packages:
eventemitter2@6.4.7:
resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==}
- events@3.3.0:
- resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
- engines: {node: '>=0.8.x'}
-
execa@4.1.0:
resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==}
engines: {node: '>=10'}
@@ -3050,10 +3016,6 @@ packages:
resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==}
engines: {'0': node >=0.6.0}
- jwt-decode@4.0.0:
- resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==}
- engines: {node: '>=18'}
-
keyv@5.5.5:
resolution: {integrity: sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==}
@@ -3124,10 +3086,6 @@ packages:
resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
engines: {node: '>=10'}
- loglevel@1.9.2:
- resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==}
- engines: {node: '>= 0.6.0'}
-
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
@@ -3157,16 +3115,6 @@ packages:
mathml-tag-names@2.1.3:
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
- matrix-events-sdk@0.0.1:
- resolution: {integrity: sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==}
-
- matrix-js-sdk@37.12.0:
- resolution: {integrity: sha512-2JSTMtvACE4egrBPp0ZQ7fSxBXcX6xuHcQSjcoBiBxFL7W0SZCl4qsNl30pBshDTe5wARAByzIHEMv6bGVKKNA==}
- engines: {node: '>=22.0.0'}
-
- matrix-widget-api@1.13.1:
- resolution: {integrity: sha512-mkOHUVzaN018TCbObfGOSaMW2GoUxOfcxNNlTVx5/HeMk3OSQPQM0C9oEME5Liiv/dBUoSrEB64V8wF7e/gb1w==}
-
mdn-data@2.12.2:
resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
@@ -3297,10 +3245,6 @@ packages:
obug@2.1.1:
resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
- oidc-client-ts@3.0.1:
- resolution: {integrity: sha512-xX8unZNtmtw3sOz4FPSqDhkLFnxCDsdo2qhFEH2opgWnF/iXMFoYdBQzkwCxAZVgt3FT3DnuBY3k80EZHT0RYg==}
- engines: {node: '>=18'}
-
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
@@ -3319,10 +3263,6 @@ packages:
resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
engines: {node: '>=10'}
- p-retry@4.6.2:
- resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==}
- engines: {node: '>=8'}
-
package-json-from-dist@1.0.0:
resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
@@ -3539,9 +3479,6 @@ packages:
regenerate@1.4.2:
resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
- regenerator-runtime@0.14.1:
- resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
-
regexp.prototype.flags@1.5.2:
resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
engines: {node: '>= 0.4'}
@@ -3592,10 +3529,6 @@ packages:
restructure@3.0.2:
resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==}
- retry@0.13.1:
- resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
- engines: {node: '>= 4'}
-
reusify@1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
@@ -3667,10 +3600,6 @@ packages:
resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
engines: {node: '>=v12.22.7'}
- sdp-transform@2.14.2:
- resolution: {integrity: sha512-icY6jVao7MfKCieyo1AyxFYm1baiM+fA00qW/KrNNVlkxHAd34riEKuEkUe4bBb3gJwLJZM+xT60Yj1QL8rHiA==}
- hasBin: true
-
semver@5.7.2:
resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
hasBin: true
@@ -4190,9 +4119,6 @@ packages:
undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
- unhomoglyph@1.0.6:
- resolution: {integrity: sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==}
-
unicode-canonical-property-names-ecmascript@2.0.1:
resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
engines: {node: '>=4'}
@@ -4243,10 +4169,6 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- uuid@11.1.0:
- resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
- hasBin: true
-
uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
@@ -5222,10 +5144,6 @@ snapshots:
'@babel/types': 7.28.5
esutils: 2.0.3
- '@babel/runtime@7.24.7':
- dependencies:
- regenerator-runtime: 0.14.1
-
'@babel/runtime@7.28.4': {}
'@babel/template@7.27.2':
@@ -5577,8 +5495,6 @@ snapshots:
'@material/material-color-utilities@0.3.0': {}
- '@matrix-org/matrix-sdk-crypto-wasm@15.1.0': {}
-
'@melt-ui/pp@0.3.2(@melt-ui/svelte@0.86.6(svelte@5.37.1))(svelte@5.37.1)':
dependencies:
'@melt-ui/svelte': 0.86.6(svelte@5.37.1)
@@ -5932,8 +5848,6 @@ snapshots:
'@types/estree@1.0.8': {}
- '@types/events@3.0.3': {}
-
'@types/js-yaml@4.0.9': {}
'@types/node@20.14.10':
@@ -5943,8 +5857,6 @@ snapshots:
'@types/resolve@1.20.2': {}
- '@types/retry@0.12.0': {}
-
'@types/semver@7.7.1': {}
'@types/sinonjs__fake-timers@8.1.1': {}
@@ -6040,8 +5952,6 @@ snapshots:
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
- another-json@0.2.0: {}
-
ansi-colors@4.1.3: {}
ansi-escapes@4.3.2:
@@ -6176,8 +6086,6 @@ snapshots:
balanced-match@2.0.0: {}
- base-x@5.0.0: {}
-
base64-js@1.5.1: {}
baseline-browser-mapping@2.9.10: {}
@@ -6215,10 +6123,6 @@ snapshots:
node-releases: 2.0.27
update-browserslist-db: 1.2.3(browserslist@4.28.1)
- bs58@6.0.0:
- dependencies:
- base-x: 5.0.0
-
buffer-crc32@0.2.13: {}
buffer-from@1.1.2: {}
@@ -6354,8 +6258,6 @@ snapshots:
concat-map@0.0.1: {}
- content-type@1.0.5: {}
-
convert-source-map@2.0.0: {}
cookie@0.6.0: {}
@@ -7001,8 +6903,6 @@ snapshots:
eventemitter2@6.4.7: {}
- events@3.3.0: {}
-
execa@4.1.0:
dependencies:
cross-spawn: 7.0.3
@@ -7696,8 +7596,6 @@ snapshots:
json-schema: 0.4.0
verror: 1.10.0
- jwt-decode@4.0.0: {}
-
keyv@5.5.5:
dependencies:
'@keyv/serialize': 1.1.1
@@ -7762,8 +7660,6 @@ snapshots:
slice-ansi: 4.0.0
wrap-ansi: 6.2.0
- loglevel@1.9.2: {}
-
lru-cache@10.4.3: {}
lru-cache@11.0.0: {}
@@ -7792,30 +7688,6 @@ snapshots:
mathml-tag-names@2.1.3: {}
- matrix-events-sdk@0.0.1: {}
-
- matrix-js-sdk@37.12.0:
- dependencies:
- '@babel/runtime': 7.24.7
- '@matrix-org/matrix-sdk-crypto-wasm': 15.1.0
- another-json: 0.2.0
- bs58: 6.0.0
- content-type: 1.0.5
- jwt-decode: 4.0.0
- loglevel: 1.9.2
- matrix-events-sdk: 0.0.1
- matrix-widget-api: 1.13.1
- oidc-client-ts: 3.0.1
- p-retry: 4.6.2
- sdp-transform: 2.14.2
- unhomoglyph: 1.0.6
- uuid: 11.1.0
-
- matrix-widget-api@1.13.1:
- dependencies:
- '@types/events': 3.0.3
- events: 3.3.0
-
mdn-data@2.12.2: {}
mdn-data@2.23.0: {}
@@ -7927,10 +7799,6 @@ snapshots:
obug@2.1.1: {}
- oidc-client-ts@3.0.1:
- dependencies:
- jwt-decode: 4.0.0
-
once@1.4.0:
dependencies:
wrappy: 1.0.2
@@ -7951,11 +7819,6 @@ snapshots:
dependencies:
aggregate-error: 3.1.0
- p-retry@4.6.2:
- dependencies:
- '@types/retry': 0.12.0
- retry: 0.13.1
-
package-json-from-dist@1.0.0: {}
pako@0.2.9: {}
@@ -8137,8 +8000,6 @@ snapshots:
regenerate@1.4.2: {}
- regenerator-runtime@0.14.1: {}
-
regexp.prototype.flags@1.5.2:
dependencies:
call-bind: 1.0.7
@@ -8199,8 +8060,6 @@ snapshots:
restructure@3.0.2: {}
- retry@0.13.1: {}
-
reusify@1.0.4: {}
rfdc@1.4.1: {}
@@ -8301,8 +8160,6 @@ snapshots:
dependencies:
xmlchars: 2.2.0
- sdp-transform@2.14.2: {}
-
semver@5.7.2: {}
semver@6.3.1: {}
@@ -8921,8 +8778,6 @@ snapshots:
undici-types@5.26.5:
optional: true
- unhomoglyph@1.0.6: {}
-
unicode-canonical-property-names-ecmascript@2.0.1: {}
unicode-match-property-ecmascript@2.0.0:
@@ -8966,8 +8821,6 @@ snapshots:
util-deprecate@1.0.2: {}
- uuid@11.1.0: {}
-
uuid@8.3.2: {}
validate-npm-package-license@3.0.4:
diff --git a/src/lib/chat/MatrixRoomMembers.svelte b/src/lib/chat/MatrixRoomMembers.svelte
deleted file mode 100644
index 86d2d76d..00000000
--- a/src/lib/chat/MatrixRoomMembers.svelte
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
- {#each members as member (member.userId)}
- {@const avatar = member.getMxcAvatarUrl()}
-
- {#if avatar}
-

- {:else}
- {@const color = memberColor(member, $theme)}
- {@const modeColor = $theme.mode === "dark" ? color.dark : color.light}
-
- person
-
- {/if}
-
{member.name}
-
- {/each}
-
-
-
diff --git a/src/lib/chat/MatrixRooms.svelte b/src/lib/chat/MatrixRooms.svelte
deleted file mode 100644
index c99d237d..00000000
--- a/src/lib/chat/MatrixRooms.svelte
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
- {#each $matrixClient.getRooms() as room}
- {@const avatar = room.getMxcAvatarUrl()}
-
- {/each}
-
- {#await $matrixClient.publicRooms()}
-
Loading...
- {:then rooms}
- {#each rooms.chunk as room}
-
- {/each}
- {:catch error}
-
{error.message}
- {/await}
-
-
-
diff --git a/src/lib/chat/MatrixSpace.svelte b/src/lib/chat/MatrixSpace.svelte
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/lib/chat/MatrixTimeline.svelte b/src/lib/chat/MatrixTimeline.svelte
deleted file mode 100644
index 3f85111b..00000000
--- a/src/lib/chat/MatrixTimeline.svelte
+++ /dev/null
@@ -1,231 +0,0 @@
-
-
-
-
- {#each live.entries() as [userId, recorder] (userId)}
- {@const roomId = timeline.getRoomId()}
- {#if roomId}
- {@const room = $matrixClient.getRoom(roomId)}
- {@const member = room?.getMember(userId)}
- {#if member}
-
- {/if}
- {/if}
- {/each}
- {#each events as event, i (event.event["event_id"])}
- {@const prev = events[i + 1]}
-
- {/each}
-
-
-
-
-
-
diff --git a/src/lib/chat/chat-rx.ts b/src/lib/chat/chat-rx.ts
deleted file mode 100644
index 34ee3526..00000000
--- a/src/lib/chat/chat-rx.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import { derived, writable, type Writable } from "svelte/store";
-import type {
- ClientEvent,
- LoginResponse,
- MatrixClient,
- RoomMember,
-} from "matrix-js-sdk";
-import { persistentWritable } from "$lib/storage";
-import {
- themeFromSourceColor,
- argbFromHex,
- type CustomColorGroup,
-} from "@material/material-color-utilities";
-import type { UserTheme } from "$lib/preferences";
-import { MatrixRx } from "./matrix-rx/client";
-
-export const matrixClient: Writable = writable();
-
-export const isLoggedIn: Writable = writable(false);
-
-export const matrix = derived(
- [matrixClient, isLoggedIn],
- ([matrixClient, isLoggedIn]) =>
- isLoggedIn ? new MatrixRx(matrixClient) : undefined,
-);
-
-export const currentRoomId = persistentWritable(
- "currentRoomId",
- null,
-);
-
-function getStoredLogin(): LoginResponse | undefined {
- try {
- return JSON.parse(localStorage.getItem("matrix-login")!);
- } catch {
- return undefined;
- }
-}
-
-export function storeLogin(response: LoginResponse) {
- localStorage.setItem("matrix-login", JSON.stringify(response));
-}
-
-export async function initMatrixClient() {
- const { createClient, IndexedDBStore, IndexedDBCryptoStore } = await import(
- "matrix-js-sdk"
- );
-
- const storedLogin = getStoredLogin();
-
- const store = new IndexedDBStore({
- dbName: "matrix",
- indexedDB: window.indexedDB,
- });
- const cryptoStore = new IndexedDBCryptoStore(
- window.indexedDB,
- "matrix-crypto",
- );
-
- const client = createClient({
- baseUrl: import.meta.env.VITE_MATRIX_URL,
- userId: storedLogin?.user_id,
- accessToken: storedLogin?.access_token,
- timelineSupport: true,
- store,
- cryptoStore,
- });
-
- console.log("store");
- await store.startup();
- console.log("cryptoStore");
- await cryptoStore.startup();
- console.log("client");
- await client.startClient();
- client.once("sync" as ClientEvent.Sync, () => {
- isLoggedIn.set(client.isLoggedIn());
- });
-
- const loginToken = new URLSearchParams(window.location.search).get(
- "loginToken",
- );
- if (loginToken) {
- storeLogin(await client.loginWithToken(loginToken));
- window.history.replaceState({}, document.title, window.location.pathname);
- isLoggedIn.set(client.isLoggedIn());
- }
-
- matrixClient.set(client);
- console.log("done");
-}
-
-export function memberColor(
- member: RoomMember,
- theme: UserTheme,
-): CustomColorGroup {
- let hash = 0;
- member.userId.split("").forEach((char) => {
- hash = char.charCodeAt(0) + ((hash << 5) - hash);
- });
- let color = "#";
- for (let i = 0; i < 3; i++) {
- const value = (hash >> (i * 8)) & 0xff;
- color += value.toString(16).padStart(2, "0");
- }
-
- return themeFromSourceColor(argbFromHex(theme.color), [
- { value: argbFromHex(color), name: "member", blend: true },
- ]).customColors.find((c) => c.color.name === "member")!;
-}
diff --git a/src/lib/chat/chat.ts b/src/lib/chat/chat.ts
deleted file mode 100644
index a2b07a6d..00000000
--- a/src/lib/chat/chat.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { writable, type Writable } from "svelte/store";
-import type { MatrixClient, RoomMember } from "matrix-js-sdk";
-import { persistentWritable } from "$lib/storage";
-import {
- themeFromSourceColor,
- argbFromHex,
- type CustomColorGroup,
-} from "@material/material-color-utilities";
-import type { UserTheme } from "$lib/preferences";
-
-export const matrixClient: Writable = writable();
-
-export const currentRoomId = persistentWritable(
- "currentRoomId",
- null,
-);
-
-export function memberColor(
- member: RoomMember,
- theme: UserTheme,
-): CustomColorGroup {
- let hash = 0;
- member.userId.split("").forEach((char) => {
- hash = char.charCodeAt(0) + ((hash << 5) - hash);
- });
- let color = "#";
- for (let i = 0; i < 3; i++) {
- const value = (hash >> (i * 8)) & 0xff;
- color += value.toString(16).padStart(2, "0");
- }
-
- return themeFromSourceColor(argbFromHex(theme.color), [
- { value: argbFromHex(color), name: "member", blend: true },
- ]).customColors.find((c) => c.color.name === "member")!;
-}
diff --git a/src/lib/chat/events/MatrixEvent.svelte b/src/lib/chat/events/MatrixEvent.svelte
deleted file mode 100644
index 2e2f365a..00000000
--- a/src/lib/chat/events/MatrixEvent.svelte
+++ /dev/null
@@ -1,381 +0,0 @@
-
-
- (mainHover = true)}
- onfocus={() => (mainHover = true)}
- onmouseout={() => (mainHover = false)}
- onblur={() => (mainHover = false)}
->
- {#if event && hover}
-
- {/if}
-
- {#if sender && !(prev && prev?.getType() === event?.getType() && prev.sender?.userId === event.sender?.userId)}
- {@const color = memberColor(sender, $theme)}
- {@const avatarMxc = sender.getMxcAvatarUrl()}
- {#if avatarMxc}
- {@const avatar = $matrixClient.mxcUrlToHttp(avatarMxc, 32, 32)}
-

- {:else}
-
- person
-
- {/if}
-
-
-
{sender.name}
- {#if replay || replayPlayer}
-
- {#each new Array(3) as _, i}
-
- {/each}
-
- {/if}
-
- {/if}
-
-
- {#if event}
- {#if event.getType() === "m.room.message"}
-
- {:else}
-
- {event.getType()}
- {JSON.stringify(event.event, null, 2)}
-
- {/if}
- {/if}
- {#if replayPlayer}
-
- {/if}
-
-
- {#if event && hover}
-
- {/if}
-
- {#if $annotations && $annotations.length > 0}
-
- {#each $annotations as [reaction, events]}
-
- {/each}
-
- {/if}
-
-
-
diff --git a/src/lib/chat/events/MatrixMessageEvent.svelte b/src/lib/chat/events/MatrixMessageEvent.svelte
deleted file mode 100644
index 91518ee7..00000000
--- a/src/lib/chat/events/MatrixMessageEvent.svelte
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
- {#if event.event.content?.msgtype === "m.image"}
-
![{event.event.content["body"]}]({$matrixClient.mxcUrlToHttp(event.event.content["url"])})
- {:else}
-
{event.event.content?.["body"]}
- {/if}
- {#if replay}
-
- (replay = undefined)}
- />
-
- {/if}
-
-
-
diff --git a/src/lib/chat/matrix-rx/client.ts b/src/lib/chat/matrix-rx/client.ts
deleted file mode 100644
index fc098a53..00000000
--- a/src/lib/chat/matrix-rx/client.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import type { Direction, MatrixClient, Room } from "matrix-js-sdk";
-import {
- filter,
- map,
- type Observable,
- of,
- distinctUntilChanged,
- merge,
-} from "rxjs";
-import { fromMatrixClientEvent } from "./events";
-
-function roomListDistinct(prev: Room[], curr: Room[]) {
- if (prev.length !== curr.length) return false;
- for (let i = 0; i < prev.length; i++) {
- if (prev[i]!.roomId !== curr[i]!.roomId) return false;
- }
- return true;
-}
-
-export class MatrixRx {
- topLevelRooms$: Observable;
-
- topLevelSpaces$: Observable;
-
- topLevelChats$: Observable;
-
- constructor(private client: MatrixClient) {
- this.topLevelRooms$ = merge(
- of([]),
- fromMatrixClientEvent(client, "Room"),
- fromMatrixClientEvent(client, "deleteRoom"),
- fromMatrixClientEvent(client, "Room.myMembership"),
- fromMatrixClientEvent(client, "Room.CurrentStateUpdated").pipe(
- filter(
- ([_room, prev, curr]) =>
- prev.getStateEvents("m.space.parent").length !==
- curr.getStateEvents("m.space.parent").length,
- ),
- ),
- ).pipe(
- map(() =>
- this.client.getVisibleRooms().filter(
- (room) =>
- room.getMyMembership() !== "leave" &&
- room
- .getLiveTimeline()
- .getState("f" as Direction.Forward)
- ?.getStateEvents("m.space.parent").length === 0,
- ),
- ),
- distinctUntilChanged(roomListDistinct),
- );
-
- this.topLevelSpaces$ = this.topLevelRooms$.pipe(
- map((rooms) => rooms.filter((room) => room.isSpaceRoom())),
- distinctUntilChanged(roomListDistinct),
- );
-
- this.topLevelChats$ = this.topLevelRooms$.pipe(
- map((rooms) => rooms.filter((room) => !room.isSpaceRoom())),
- distinctUntilChanged(roomListDistinct),
- );
- }
-}
-
-export class SpaceRx {
- constructor(
- private client: MatrixClient,
- private space: Room,
- ) {}
-}
diff --git a/src/lib/chat/matrix-rx/events.ts b/src/lib/chat/matrix-rx/events.ts
deleted file mode 100644
index 57f6764e..00000000
--- a/src/lib/chat/matrix-rx/events.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import type { ClientEventHandlerMap, MatrixClient } from "matrix-js-sdk";
-import { fromEvent, type Observable } from "rxjs";
-
-export function fromMatrixClientEvent(
- client: MatrixClient,
- eventName: `${T}`, // hack so we can use strings instead of enums
-): Observable> {
- return fromEvent(client, eventName) as Observable<
- Parameters
- >;
-}
diff --git a/src/lib/chat/matrix-rx/rooms.ts b/src/lib/chat/matrix-rx/rooms.ts
deleted file mode 100644
index 986e4737..00000000
--- a/src/lib/chat/matrix-rx/rooms.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import type {
- MatrixClient,
- MatrixEvent,
- Room,
- Direction,
- RoomState,
- RoomStateEventHandlerMap,
- EventType,
-} from "matrix-js-sdk";
-import { fromMatrixClientEvent } from "./events";
-import {
- map,
- filter,
- merge,
- startWith,
- Observable,
- of,
- fromEvent,
- concat,
- defer,
-} from "rxjs";
-
-export function matrixRoom$(
- client: MatrixClient,
- roomId: string | undefined,
-): Observable {
- return merge([
- fromMatrixClientEvent(client, "Room").pipe(
- filter(([room]) => room.roomId === roomId),
- ),
- fromMatrixClientEvent(client, "deleteRoom").pipe(
- filter(([id]) => id === roomId),
- ),
- ]).pipe(
- startWith([]),
- map(() => client.getRoom(roomId) ?? undefined),
- );
-}
-
-export function roomTimeline$(
- client: MatrixClient,
- room: Room | undefined,
-): Observable {
- if (!room) return of(undefined);
- const eventTimeline = room.getLiveTimeline();
-
- return fromMatrixClientEvent(client, "Room.timeline").pipe(
- filter(
- ([, eventRoom]) =>
- eventRoom !== undefined && eventRoom.roomId === room.roomId,
- ),
- startWith([]),
- map(() => eventTimeline.getEvents()),
- );
-}
-
-export function roomCurrentStateEvents$(
- client: MatrixClient,
- room: Room,
- eventType: EventType | string,
-): Observable {
- return concat(
- defer(() =>
- of(
- room
- .getLiveTimeline()
- .getState("f" as Direction.Forward)
- ?.getStateEvents(eventType) ?? [],
- ),
- ),
- fromMatrixClientEvent(client, "Room.CurrentStateUpdated").pipe(
- filter(([room]) => room.roomId === room.roomId),
- map(([_room, _prev, curr]) => curr.getStateEvents(eventType)),
- ),
- );
-}
-
-export function fromRoomStateEvent(
- state: RoomState,
- eventName: `${T}`,
-): Observable> {
- return fromEvent(state, eventName) as Observable<
- Parameters
- >;
-}
diff --git a/src/lib/chat/matrix-rx/timeline.ts b/src/lib/chat/matrix-rx/timeline.ts
deleted file mode 100644
index 3cf9e743..00000000
--- a/src/lib/chat/matrix-rx/timeline.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import type { EventTimeline, MatrixClient, MatrixEvent } from "matrix-js-sdk";
-import { filter, map, of, startWith, type Observable } from "rxjs";
-import { fromMatrixClientEvent } from "./events";
-
-export function roomTimeline(
- client: MatrixClient,
- roomId: string | undefined,
-): Observable {
- if (!roomId) return of([]);
- const room = client.getRoom(roomId);
- if (!room) return of([]);
- const eventTimeline = room.getLiveTimeline();
-
- return fromMatrixClientEvent(client, "Room.timeline").pipe(
- filter(([, room]) => room?.roomId === roomId),
- startWith([]),
- map(() => eventTimeline.getEvents()),
- );
-}
diff --git a/src/lib/components/Action.svelte b/src/lib/components/Action.svelte
index 3fa99fe3..6e7a4852 100644
--- a/src/lib/components/Action.svelte
+++ b/src/lib/components/Action.svelte
@@ -53,6 +53,12 @@
{info.description}
{/if}
+ {#if info.breaking}
+
Prevents prepended autospaces
+ {/if}
+ {#if info.separator || info.breaking}
+
Stops autocorrect
+ {/if}
{:else}
Unknown Action
{#if info.code > 1023}
@@ -200,13 +206,13 @@
display: -webkit-box;
opacity: 0.9;
max-width: 15ch;
+ -webkit-line-clamp: 2; /* number of lines to show */
+ line-clamp: 2;
overflow: hidden;
font-style: italic;
font-size: 12px;
text-align: left;
text-overflow: ellipsis;
- -webkit-line-clamp: 2; /* number of lines to show */
- line-clamp: 2;
-webkit-box-orient: vertical;
}
}
diff --git a/src/lib/learn/chords.ts b/src/lib/learn/chords.ts
deleted file mode 100644
index d191eb92..00000000
--- a/src/lib/learn/chords.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-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, KEYMAP_CODES],
- ([chords, layout, KEYMAP_CODES]) =>
- 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/lib/learn/stats.ts b/src/lib/learn/stats.ts
deleted file mode 100644
index 05df68a2..00000000
--- a/src/lib/learn/stats.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { persistentWritable } from "$lib/storage";
-
-interface ChordStats {
- level: number;
- lastUprank: number;
-}
-
-export const chordStats = persistentWritable>(
- "chord-stats",
- {},
-);
diff --git a/src/routes/(app)/ccos/+layout.server.ts b/src/routes/(app)/ccos/+layout.server.ts
new file mode 100644
index 00000000..d43d0cd2
--- /dev/null
+++ b/src/routes/(app)/ccos/+layout.server.ts
@@ -0,0 +1 @@
+export const prerender = false;
diff --git a/src/routes/(app)/chat-rx/+page.svelte b/src/routes/(app)/chat-rx/+page.svelte
deleted file mode 100644
index f91ece57..00000000
--- a/src/routes/(app)/chat-rx/+page.svelte
+++ /dev/null
@@ -1,92 +0,0 @@
-
-
-{#if $isLoggedIn}
-
-
-
-{:else}
-
-{/if}
-
-
diff --git a/src/routes/(app)/chat-rx/Login.svelte b/src/routes/(app)/chat-rx/Login.svelte
deleted file mode 100644
index 5af64d54..00000000
--- a/src/routes/(app)/chat-rx/Login.svelte
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-{#if $matrixClient}
- {#await $matrixClient.loginFlows() then flows}
- {#each flows.flows as flow}
- {#if flow.type === "m.login.sso"}
-
- {#each flow.identity_providers as idp}
- {#if idp.icon}
-
- {:else}
- {idp.name}
- {/if}
- {/each}
-
- {:else if flow.type === "m.login.password"}
-
- {/if}
- {/each}
- {/await}
-{/if}
diff --git a/src/routes/(app)/chat-rx/Space.svelte b/src/routes/(app)/chat-rx/Space.svelte
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/routes/(app)/chat/+page.svelte b/src/routes/(app)/chat/+page.svelte
deleted file mode 100644
index 0815cd58..00000000
--- a/src/routes/(app)/chat/+page.svelte
+++ /dev/null
@@ -1,180 +0,0 @@
-
-
-{#if $matrixClient && loggedIn}
- {#if ready}
-
-
-
-
-
- {#if $currentRoomId}
- {@const room = $matrixClient.getRoom($currentRoomId)}
- {#key room}
- {#if room}
-
-
-
-
-
-
- {/if}
- {/key}
- {/if}
-
- {/if}
-{:else if $matrixClient}
- {#await $matrixClient.loginFlows() then flows}
- {#each flows.flows as flow}
- {#if flow.type === "m.login.sso"}
-
- {#each flow.identity_providers as idp}
- {#if idp.icon}
-
- {:else}
- {idp.name}
- {/if}
- {/each}
-
- {:else if flow.type === "m.login.password"}
-
- {/if}
- {/each}
- {/await}
-{/if}
-
-
diff --git a/src/routes/(app)/config/chords/will-my-compound-break/+page.svelte b/src/routes/(app)/config/chords/will-my-compound-break/+page.svelte
index a7e5b4a7..a2a19f32 100644
--- a/src/routes/(app)/config/chords/will-my-compound-break/+page.svelte
+++ b/src/routes/(app)/config/chords/will-my-compound-break/+page.svelte
@@ -47,19 +47,6 @@
font-weight: bold;
}
- .chord {
- display: flex;
- gap: 0.5rem;
- margin-bottom: 0.5rem;
- }
-
- .compound {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
- margin-bottom: 1rem;
- }
-
p {
max-width: 600px;
}
diff --git a/src/routes/(app)/config/cv2/+page.svelte b/src/routes/(app)/config/cv2/+page.svelte
deleted file mode 100644
index 9713d609..00000000
--- a/src/routes/(app)/config/cv2/+page.svelte
+++ /dev/null
@@ -1,200 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/src/routes/(app)/learn/+page.svelte b/src/routes/(app)/learn/+page.svelte
deleted file mode 100644
index 0ed68878..00000000
--- a/src/routes/(app)/learn/+page.svelte
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
diff --git a/src/routes/(app)/learn/chords/+page.svelte b/src/routes/(app)/learn/chords/+page.svelte
deleted file mode 100644
index bb009fe2..00000000
--- a/src/routes/(app)/learn/chords/+page.svelte
+++ /dev/null
@@ -1,232 +0,0 @@
-
-
-WIP
-
-
-
-{#key $nextWord}
-
- {$nextWord}
- {#if $scores[$nextWord!] === undefined}
- new
- {:else if ($scores[$nextWord!]?.score ?? 0) < 0}
- weak
- {/if}
-
-
-
-
-
-
-
-{/key}
-
-{#key $nextWord}
-
- {}} />
-
-{/key}
-
-
-
-
-
- | Weak |
-
-
- {#each Object.entries($scores)
- .sort(([, a], [, b]) => a.score - b.score)
- .splice(0, 10) as [word, score]}
-
- | {word} |
- {score.score.toFixed(2)} |
-
- {/each}
-
-
-
-
-
- | Strong |
-
-
- {#each Object.entries($scores)
- .sort(([, a], [, b]) => b.score - a.score)
- .splice(0, 10) as [word, score]}
-
- | {word} |
- {score.score.toFixed(2)} |
-
- {/each}
-
-
-
-
-
- | Rehearse |
-
-
- {#each Object.entries($scores)
- .sort(([, a], [, b]) => b.lastTyped - a.lastTyped)
- .splice(0, 10) as [word, _score]}
-
- | {word} |
-
- {/each}
-
-
-
-
-
- Settings
-
-
-
-
-
diff --git a/src/routes/(app)/learn/layout/+page.svelte b/src/routes/(app)/learn/layout/+page.svelte
deleted file mode 100644
index a495383d..00000000
--- a/src/routes/(app)/learn/layout/+page.svelte
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
-
diff --git a/src/routes/(app)/learn/sentence/+page.svelte b/src/routes/(app)/learn/sentence/+page.svelte
deleted file mode 100644
index 629ed3ba..00000000
--- a/src/routes/(app)/learn/sentence/+page.svelte
+++ /dev/null
@@ -1,652 +0,0 @@
-
-
-
-
Sentence Trainer
-
-
-
- {#each masteryThresholds as [, , title], i}
-
- {/each}
-
- {#each masteryThresholds as _, i}
-
- {/each}
-
-
-
- {#each sentenceWords as _, i}
- {#if i !== sentenceWords.length - 1}
- {@const word = sentenceWords.slice(i, i + 2).join(" ")}
- {@const mastery = wordMastery.get(word) ?? 0}
-
- {/if}
- {/each}
- {#each sentenceWords as word, i}
- {@const mastery = wordMastery.get(word)}
-
- {word}
-
- {/each}
- {#each sentenceWords as _, i}
- {#if i < sentenceWords.length - 2}
- {@const word = sentenceWords.slice(i, i + 3).join(" ")}
- {@const mastery = wordMastery.get(word) ?? 0}
-
- {/if}
- {/each}
-
- {#if level === masteryThresholds.length}
- {@const maxDigits = 4}
- {@const indices = Array.from({ length: maxDigits }, (_, i) => i)}
- {@const wpmString = Math.floor(bestWPM).toString().padStart(maxDigits, " ")}
-
-
- {#each indices as i}
- {@const char = wpmString[i]}
- {#key char}
-
- {char}
-
- {/key}
- {/each}
-
- WPM
-
-
-
- {#key wpm}
-
- {Math.floor(wpm)}
-
- {/key}
-
WPM
-
-
- {/if}
-
-
- {#if devTools}
-
Dev Tools
-
-
-
-
-
- | Total |
- {Math.round(totalMs)}ms
- |
-
-
- | Char |
- {Math.round(msPerChar)}ms
- |
-
-
- | Word |
- {Math.round(msPerWord)}ms
- |
-
-
-
-
-
-
- {#each wordStats.entries() as [word, stats]}
- {@const mastery = wordMastery.get(word) ?? 0}
-
- | {word} |
- {Math.round(mastery * 100)}%
- |
- {#each stats as stat}
- {stat} |
- {/each}
-
- {/each}
-
-
- {/if}
-
-
-
diff --git a/src/routes/(app)/learn/sentence/configuration.ts b/src/routes/(app)/learn/sentence/configuration.ts
deleted file mode 100644
index 2d932e90..00000000
--- a/src/routes/(app)/learn/sentence/configuration.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-export interface PageParam {
- key: string;
- default: T;
- parse?: (value: string) => T;
-}
-
-export const SENTENCE_TRAINER_PAGE_PARAMS: {
- sentence: PageParam;
- wpm: PageParam;
- showDevTools: PageParam;
- textAreaDebounceInMillis: PageParam;
-} = {
- sentence: {
- key: "sentence",
- default: "This text has been typed at the speed of thought",
- },
- wpm: {
- key: "wpm",
- default: 250,
- parse: (value) => Number(value),
- },
- showDevTools: {
- key: "dev",
- default: false,
- parse: (value) => value === "true",
- },
- textAreaDebounceInMillis: {
- key: "debounceMillis",
- default: 5000,
- parse: (value) => Number(value),
- },
-};
diff --git a/src/routes/(app)/learn/sentence/constants.ts b/src/routes/(app)/learn/sentence/constants.ts
deleted file mode 100644
index faf41187..00000000
--- a/src/routes/(app)/learn/sentence/constants.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-// Domain constants
-export const AVG_WORD_LENGTH = 5;
-export const SECONDS_IN_MINUTE = 60;
-export const MILLIS_IN_SECOND = 1000;
-
-// Error messages.
-export const TOO_SHORT_SENTENCE_FOR_NGRAMS_MESSAGE =
- "The sentence is too short to make N-Grams, please enter longer sentence";
diff --git a/src/routes/(app)/learn/sentence/types.ts b/src/routes/(app)/learn/sentence/types.ts
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/routes/(app)/learn/sentence/word-selector.spec.ts b/src/routes/(app)/learn/sentence/word-selector.spec.ts
deleted file mode 100644
index 2e46a9f0..00000000
--- a/src/routes/(app)/learn/sentence/word-selector.spec.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { describe, it, beforeEach, expect, vi } from "vitest";
-import { pickNextWord } from "./word-selector";
-import { untrack } from "svelte";
-import { SvelteMap } from "svelte/reactivity";
-import { TOO_SHORT_SENTENCE_FOR_NGRAMS_MESSAGE } from "./constants";
-
-// Mock untrack so it simply executes the callback, allowing us to spy on its usage.
-vi.mock("svelte", () => ({
- untrack: vi.fn((fn: any) => fn()),
-}));
-
-describe("pickNextWord", () => {
- let words: string[];
- let wordMastery: SvelteMap;
- let currentWord: string;
-
- beforeEach(() => {
- vi.clearAllMocks();
-
- // Set up sample words and mastery values.
- words = ["alpha", "beta", "gamma"];
- wordMastery = new SvelteMap();
- // For this test, assume none of the words are mastered.
- words.forEach((word) => wordMastery.set(word, 0));
- currentWord = "alpha";
- });
-
- it("should return a word different from current", () => {
- // Force Math.random() to return a predictable value.
- vi.spyOn(Math, "random").mockReturnValueOnce(0.3);
-
- const nextWord = pickNextWord(words, wordMastery, currentWord);
-
- // Since currentWord ("alpha") should be skipped, we expect next word.
- expect(nextWord).toBe("beta");
- });
-
- it("should randomly skip words", () => {
- // Force Math.random() to return a predictable value.
- vi.spyOn(Math, "random").mockReturnValueOnce(0.6).mockReturnValueOnce(0.3);
-
- const nextWord = pickNextWord(words, wordMastery, currentWord);
-
- // Since currentWord ("alpha") should be skipped as current
- // and "beta" should be randomly skipped we expect "gamma".
- expect(nextWord).toBe("gamma");
- });
-
- it("should return current word if all other words were randomly skipped", () => {
- // Force Math.random() to return a predictable value.
- vi.spyOn(Math, "random").mockReturnValueOnce(0.6).mockReturnValueOnce(0.6);
-
- const nextWord = pickNextWord(words, wordMastery, currentWord);
-
- // Since all other words have been randomly skipped, we expect
- // current word to be returned.
- expect(nextWord).toBe("alpha");
- });
-
- it("current word should be passed untracked", () => {
- pickNextWord(words, wordMastery, currentWord);
- expect(untrack).toHaveBeenCalledTimes(0);
- });
-
- it("should return TOO_SHORT_SENTENCE_FOR_NGRAMS_MESSAGE if the words array is empty", () => {
- const result = pickNextWord([], wordMastery, currentWord);
- expect(result).toBe(TOO_SHORT_SENTENCE_FOR_NGRAMS_MESSAGE);
- });
-});
diff --git a/src/routes/(app)/learn/sentence/word-selector.ts b/src/routes/(app)/learn/sentence/word-selector.ts
deleted file mode 100644
index 21603af7..00000000
--- a/src/routes/(app)/learn/sentence/word-selector.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { TOO_SHORT_SENTENCE_FOR_NGRAMS_MESSAGE } from "./constants";
-import { SvelteMap } from "svelte/reactivity";
-
-export function pickNextWord(
- words: string[],
- wordMastery: SvelteMap,
- untrackedCurrentWord: string,
-) {
- const unmasteredWords = words
- .map((it) => [it, wordMastery.get(it) ?? 0] as const)
- .filter(([, it]) => it !== 1);
- unmasteredWords.sort(([, a], [, b]) => a - b);
- let nextWord =
- unmasteredWords[0]?.[0] ??
- words[0] ??
- TOO_SHORT_SENTENCE_FOR_NGRAMS_MESSAGE;
- // This is important to break infinite loop created by
- // reading and writing `currentWord` inside $effect rune
- for (const [word] of unmasteredWords) {
- if (word === untrackedCurrentWord || Math.random() > 0.5) continue;
- nextWord = word;
- break;
- }
- return nextWord;
-}
diff --git a/src/routes/(app)/plugin/+page.svelte b/src/routes/(app)/plugin/+page.svelte
deleted file mode 100644
index 178f195d..00000000
--- a/src/routes/(app)/plugin/+page.svelte
+++ /dev/null
@@ -1,263 +0,0 @@
-
-
-
-
- Plugin
-
-
-
-
-
-
-
diff --git a/src/routes/(app)/plugin/example-plugin.js b/src/routes/(app)/plugin/example-plugin.js
deleted file mode 100644
index 97c70533..00000000
--- a/src/routes/(app)/plugin/example-plugin.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// @ts-nocheck
-/*******************************
- * HOLD UP AND READ THIS FIRST *
- *******************************
- *
- * Chara devices have a LIMITED number of commits.
- * calling `Chara.commit()` can be a dangerous operation, which is why a confirmation dialog will be shown.
- * Devices are only rated for 10,000-25,000 commits, exceeding that limit may result in premature breakdowns.
- * `Chara.setSetting` or `Chara.setLayoutKey` is not affected by this, they last however only until the next boot.
- *
- * Chord writing is more forgiving, but keep in mind that excessive large-scale writing can still damage the device.
- *
- */
-
-const count = await Chara.getChordCount(); // => 499
-const chord = await Chara.getChord(2); // => {actions: [1, 2, 3], phrase: [4, 5, 6]}
-
-const setting = await Chara.getSetting(5); // => 0
-
-// This, for example, would return all chords
-const chords = [];
-for (let i = 0; i < count; i++) {
- chords.push(await Chara.getChord(i));
-}
-
-// You can also print values to the browser console (F12)
-console.log("Chords:", chords);
-
-// You can access the actions by ID!
-Actions.SPACE; // => {id: "SPACE", code: 32, icon: "space_bar", description: ...}
-Actions[32]; // This also works
-Actions[0x20]; // Or this!
diff --git a/src/routes/(app)/plugin/plugin-types.ts b/src/routes/(app)/plugin/plugin-types.ts
deleted file mode 100644
index 29e65fb1..00000000
--- a/src/routes/(app)/plugin/plugin-types.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import type { CharaDevice } from "$lib/serial/device";
-import type { KeyInfo } from "$lib/serial/keymap-codes";
-
-export const charaMethods = [
- "reboot",
- "bootloader",
- "getRamBytesAvailable",
- "getSetting",
- "setSetting",
- "getLayoutKey",
- "setLayoutKey",
- "deleteChord",
- "setChord",
- "getChordPhrase",
- "getChordCount",
- "getChord",
- "send",
-] as const satisfies Array;
-
-export interface ChannelResponseEventData {
- response: unknown;
-}
-
-export interface ChannelCharaEventData {
- charaChannels: string[];
- script: string;
- actionCodes: Map;
-}
-
-export type ChannelEventData = ChannelResponseEventData | ChannelCharaEventData;
diff --git a/src/routes/(app)/stats/+page.svelte b/src/routes/(app)/stats/+page.svelte
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/routes/(app)/test/+page.svelte b/src/routes/(app)/test/+page.svelte
deleted file mode 100644
index 61b30974..00000000
--- a/src/routes/(app)/test/+page.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-The number is
diff --git a/static/sandbox/index.html b/static/sandbox/index.html
deleted file mode 100644
index 114bf606..00000000
--- a/static/sandbox/index.html
+++ /dev/null
@@ -1,60 +0,0 @@
-
diff --git a/static/sentences/Modelfile b/static/sentences/Modelfile
deleted file mode 100644
index a25237ae..00000000
--- a/static/sentences/Modelfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM llama3.1
-
-TEMPLATE """
-<|system|>
-Only output the sentence
-<|user|>
-Create a typical sentence with around 10 words that includes the word "{{ .Prompt }}".
-<|assistant|>
-Create a sentence that includes "{{ .Prompt }}".
-"""
diff --git a/vite.config.ts b/vite.config.ts
index 07028412..b190339d 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -62,7 +62,6 @@ export default defineConfig({
"client/**/*.{js,css,ico,woff2,csv,png,webp,svg,webmanifest}",
"prerendered/**/*.html",
],
- globIgnores: ["prerendered/pages/ccos/**/*"],
ignoreURLParametersMatching: [/^import|redirectUrl|loginToken$/],
maximumFileSizeToCacheInBytes: 10 * 1024 * 1024,
},