Merge pull request #459 from Discours/hotfix/topic-reopen
Hotfix/topic reopen
This commit is contained in:
commit
138403dfc3
35
biome.json
35
biome.json
|
@ -1,21 +1,8 @@
|
||||||
{
|
{
|
||||||
"$schema": "https://biomejs.dev/schemas/1.5.3/schema.json",
|
"$schema": "https://biomejs.dev/schemas/1.5.3/schema.json",
|
||||||
"files": {
|
"files": {
|
||||||
"include": [
|
"include": ["*.tsx", "*.ts", "*.js", "*.json"],
|
||||||
"*.tsx",
|
"ignore": ["./dist", "./node_modules", ".husky", "docs", "gen", "*.gen.ts", "*.d.ts"]
|
||||||
"*.ts",
|
|
||||||
"*.js",
|
|
||||||
"*.json"
|
|
||||||
],
|
|
||||||
"ignore": [
|
|
||||||
"./dist",
|
|
||||||
"./node_modules",
|
|
||||||
".husky",
|
|
||||||
"docs",
|
|
||||||
"gen",
|
|
||||||
"*.gen.ts",
|
|
||||||
"*.d.ts"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"vcs": {
|
"vcs": {
|
||||||
"defaultBranch": "dev",
|
"defaultBranch": "dev",
|
||||||
|
@ -23,19 +10,13 @@
|
||||||
},
|
},
|
||||||
"organizeImports": {
|
"organizeImports": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"ignore": [
|
"ignore": ["./api", "./gen"]
|
||||||
"./api",
|
|
||||||
"./gen"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"formatter": {
|
"formatter": {
|
||||||
"indentStyle": "space",
|
"indentStyle": "space",
|
||||||
"indentWidth": 2,
|
"indentWidth": 2,
|
||||||
"lineWidth": 108,
|
"lineWidth": 108,
|
||||||
"ignore": [
|
"ignore": ["./src/graphql/schema", "./gen"]
|
||||||
"./src/graphql/schema",
|
|
||||||
"./gen"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"javascript": {
|
"javascript": {
|
||||||
"formatter": {
|
"formatter": {
|
||||||
|
@ -48,13 +29,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"linter": {
|
"linter": {
|
||||||
"ignore": [
|
"ignore": ["*.scss", "*.md", ".DS_Store", "*.svg", "*.d.ts"],
|
||||||
"*.scss",
|
|
||||||
"*.md",
|
|
||||||
".DS_Store",
|
|
||||||
"*.svg",
|
|
||||||
"*.d.ts"
|
|
||||||
],
|
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"rules": {
|
"rules": {
|
||||||
"all": true,
|
"all": true,
|
||||||
|
|
543
package-lock.json
generated
543
package-lock.json
generated
|
@ -34,9 +34,8 @@
|
||||||
"@solid-primitives/memo": "1.2.4",
|
"@solid-primitives/memo": "1.2.4",
|
||||||
"@solid-primitives/pagination": "0.2.10",
|
"@solid-primitives/pagination": "0.2.10",
|
||||||
"@solid-primitives/share": "2.0.4",
|
"@solid-primitives/share": "2.0.4",
|
||||||
"@solid-primitives/storage": "1.3.9",
|
"@solid-primitives/storage": "^3.5.0",
|
||||||
"@solid-primitives/upload": "0.0.110",
|
"@solid-primitives/upload": "0.0.115",
|
||||||
"@solidjs/meta": "0.29.1",
|
|
||||||
"@thisbeyond/solid-select": "0.14.0",
|
"@thisbeyond/solid-select": "0.14.0",
|
||||||
"@tiptap/core": "2.2.3",
|
"@tiptap/core": "2.2.3",
|
||||||
"@tiptap/extension-blockquote": "2.2.3",
|
"@tiptap/extension-blockquote": "2.2.3",
|
||||||
|
@ -95,9 +94,9 @@
|
||||||
"prosemirror-history": "1.3.2",
|
"prosemirror-history": "1.3.2",
|
||||||
"prosemirror-trailing-node": "2.0.7",
|
"prosemirror-trailing-node": "2.0.7",
|
||||||
"prosemirror-view": "1.32.7",
|
"prosemirror-view": "1.32.7",
|
||||||
"rollup": "4.11.0",
|
"rollup": "4.17.2",
|
||||||
"sass": "1.69.5",
|
"sass": "1.69.5",
|
||||||
"solid-js": "1.8.15",
|
"solid-js": "1.8.17",
|
||||||
"solid-popper": "0.3.0",
|
"solid-popper": "0.3.0",
|
||||||
"solid-tiptap": "0.7.0",
|
"solid-tiptap": "0.7.0",
|
||||||
"solid-transition-group": "0.2.3",
|
"solid-transition-group": "0.2.3",
|
||||||
|
@ -111,7 +110,7 @@
|
||||||
"typograf": "7.3.0",
|
"typograf": "7.3.0",
|
||||||
"uniqolor": "1.1.0",
|
"uniqolor": "1.1.0",
|
||||||
"vike": "0.4.148",
|
"vike": "0.4.148",
|
||||||
"vite": "5.2.10",
|
"vite": "5.2.11",
|
||||||
"vite-plugin-mkcert": "^1.17.3",
|
"vite-plugin-mkcert": "^1.17.3",
|
||||||
"vite-plugin-node-polyfills": "0.21.0",
|
"vite-plugin-node-polyfills": "0.21.0",
|
||||||
"vite-plugin-sass-dts": "^1.3.17",
|
"vite-plugin-sass-dts": "^1.3.17",
|
||||||
|
@ -1204,9 +1203,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@biomejs/biome": {
|
"node_modules/@biomejs/biome": {
|
||||||
"version": "1.7.2",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.7.3.tgz",
|
||||||
"integrity": "sha512-6Skx9N47inLQzYi9RKgJ7PBnUnaHnMe/imqX43cOcJjZtfMnQLxEvfM2Eyo7gChkwrZlwc+VbA4huFRjw2fsYA==",
|
"integrity": "sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
|
@ -1220,20 +1219,20 @@
|
||||||
"url": "https://opencollective.com/biome"
|
"url": "https://opencollective.com/biome"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@biomejs/cli-darwin-arm64": "1.7.2",
|
"@biomejs/cli-darwin-arm64": "1.7.3",
|
||||||
"@biomejs/cli-darwin-x64": "1.7.2",
|
"@biomejs/cli-darwin-x64": "1.7.3",
|
||||||
"@biomejs/cli-linux-arm64": "1.7.2",
|
"@biomejs/cli-linux-arm64": "1.7.3",
|
||||||
"@biomejs/cli-linux-arm64-musl": "1.7.2",
|
"@biomejs/cli-linux-arm64-musl": "1.7.3",
|
||||||
"@biomejs/cli-linux-x64": "1.7.2",
|
"@biomejs/cli-linux-x64": "1.7.3",
|
||||||
"@biomejs/cli-linux-x64-musl": "1.7.2",
|
"@biomejs/cli-linux-x64-musl": "1.7.3",
|
||||||
"@biomejs/cli-win32-arm64": "1.7.2",
|
"@biomejs/cli-win32-arm64": "1.7.3",
|
||||||
"@biomejs/cli-win32-x64": "1.7.2"
|
"@biomejs/cli-win32-x64": "1.7.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@biomejs/cli-darwin-arm64": {
|
"node_modules/@biomejs/cli-darwin-arm64": {
|
||||||
"version": "1.7.2",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.7.3.tgz",
|
||||||
"integrity": "sha512-CrldIueHivWEWmeTkK8bTXajeX53F8i2Rrkkt8cPZyMtzkrwxf8Riq4a/jz3SQBHkxHFT4TqGbSTNMXe3X1ogA==",
|
"integrity": "sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -1247,9 +1246,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@biomejs/cli-darwin-x64": {
|
"node_modules/@biomejs/cli-darwin-x64": {
|
||||||
"version": "1.7.2",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.7.3.tgz",
|
||||||
"integrity": "sha512-UELnLJuJOsTL9meArvn8BtiXDURyPil2Ej9me2uVpEvee8UQdqd/bssP5we400OWShlL1AAML4fn6d2WX5332g==",
|
"integrity": "sha512-JXCaIseKRER7dIURsVlAJacnm8SG5I0RpxZ4ya3dudASYUc68WGl4+FEN03ABY3KMIq7hcK1tzsJiWlmXyosZg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -1263,9 +1262,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@biomejs/cli-linux-arm64": {
|
"node_modules/@biomejs/cli-linux-arm64": {
|
||||||
"version": "1.7.2",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.7.3.tgz",
|
||||||
"integrity": "sha512-Z1CSGQE6fHz55gkiFHv9E8wEAaSUd7dHSRaxSCBa7utonHqpIeMbvj3Evm1w0WfGLFDtRXLV1fTfEdM0FMTOhA==",
|
"integrity": "sha512-phNTBpo7joDFastnmZsFjYcDYobLTx4qR4oPvc9tJ486Bd1SfEVPHEvJdNJrMwUQK56T+TRClOQd/8X1nnjA9w==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -1279,9 +1278,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@biomejs/cli-linux-arm64-musl": {
|
"node_modules/@biomejs/cli-linux-arm64-musl": {
|
||||||
"version": "1.7.2",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.7.3.tgz",
|
||||||
"integrity": "sha512-kKYZiem7Sj7wI0dpVxJlK7C+TFQwzO/ctufIGXGJAyEmUe9vEKSzV8CXpv+JIRiTWyqaZJ4K+eHz4SPdPCv05w==",
|
"integrity": "sha512-c8AlO45PNFZ1BYcwaKzdt46kYbuP6xPGuGQ6h4j3XiEDpyseRRUy/h+6gxj07XovmyxKnSX9GSZ6nVbZvcVUAw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -1295,9 +1294,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@biomejs/cli-linux-x64": {
|
"node_modules/@biomejs/cli-linux-x64": {
|
||||||
"version": "1.7.2",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.7.3.tgz",
|
||||||
"integrity": "sha512-vXXyox8/CQijBxAu0+r8FfSO7JlC4tob3PbaFda8gPJFRz2uFJw39HtxVUwbTV1EcU6wSPh4SiRu5sZfP1VHrQ==",
|
"integrity": "sha512-vnedYcd5p4keT3iD48oSKjOIRPYcjSNNbd8MO1bKo9ajg3GwQXZLAH+0Cvlr+eMsO67/HddWmscSQwTFrC/uPA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -1311,9 +1310,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@biomejs/cli-linux-x64-musl": {
|
"node_modules/@biomejs/cli-linux-x64-musl": {
|
||||||
"version": "1.7.2",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.7.3.tgz",
|
||||||
"integrity": "sha512-x10LpGMepDrLS+h2TZ6/T7egpHjGKtiI4GuShNylmBQJWfTotbFf9eseHggrqJ4WZf9yrGoVYrtbxXftuB95sQ==",
|
"integrity": "sha512-UdEHKtYGWEX3eDmVWvQeT+z05T9/Sdt2+F/7zmMOFQ7boANeX8pcO6EkJPK3wxMudrApsNEKT26rzqK6sZRTRA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -1327,9 +1326,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@biomejs/cli-win32-arm64": {
|
"node_modules/@biomejs/cli-win32-arm64": {
|
||||||
"version": "1.7.2",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.7.3.tgz",
|
||||||
"integrity": "sha512-kRXdlKzcU7INf6/ldu0nVmkOgt7bKqmyXRRCUqqaJfA32+9InTbkD8tGrHZEVYIWr+eTuKcg16qZVDsPSDFZ8g==",
|
"integrity": "sha512-unNCDqUKjujYkkSxs7gFIfdasttbDC4+z0kYmcqzRk6yWVoQBL4dNLcCbdnJS+qvVDNdI9rHp2NwpQ0WAdla4Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -1343,9 +1342,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@biomejs/cli-win32-x64": {
|
"node_modules/@biomejs/cli-win32-x64": {
|
||||||
"version": "1.7.2",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.7.3.tgz",
|
||||||
"integrity": "sha512-qHTtpAs+CNglAAuaTy09htoqUhrQyd3nd0aGTuLNqD10h1llMVi8WFZfoa+e5MuDSfYtMK6nW2Tbf6WgzzR1Qw==",
|
"integrity": "sha512-ZmByhbrnmz/UUFYB622CECwhKIPjJLLPr5zr3edhu04LzbfcOrz16VYeNq5dpO1ADG70FORhAJkaIGdaVBG00w==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -1392,9 +1391,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@csstools/css-parser-algorithms": {
|
"node_modules/@csstools/css-parser-algorithms": {
|
||||||
"version": "2.6.1",
|
"version": "2.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz",
|
||||||
"integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==",
|
"integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -1410,13 +1409,13 @@
|
||||||
"node": "^14 || ^16 || >=18"
|
"node": "^14 || ^16 || >=18"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@csstools/css-tokenizer": "^2.2.4"
|
"@csstools/css-tokenizer": "^2.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@csstools/css-tokenizer": {
|
"node_modules/@csstools/css-tokenizer": {
|
||||||
"version": "2.2.4",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz",
|
||||||
"integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==",
|
"integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -1433,9 +1432,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@csstools/media-query-list-parser": {
|
"node_modules/@csstools/media-query-list-parser": {
|
||||||
"version": "2.1.9",
|
"version": "2.1.11",
|
||||||
"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz",
|
"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz",
|
||||||
"integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==",
|
"integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -1451,8 +1450,8 @@
|
||||||
"node": "^14 || ^16 || >=18"
|
"node": "^14 || ^16 || >=18"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@csstools/css-parser-algorithms": "^2.6.1",
|
"@csstools/css-parser-algorithms": "^2.6.3",
|
||||||
"@csstools/css-tokenizer": "^2.2.4"
|
"@csstools/css-tokenizer": "^2.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@csstools/selector-specificity": {
|
"node_modules/@csstools/selector-specificity": {
|
||||||
|
@ -1487,22 +1486,6 @@
|
||||||
"url": "https://github.com/sponsors/wooorm"
|
"url": "https://github.com/sponsors/wooorm"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@esbuild/aix-ppc64": {
|
|
||||||
"version": "0.20.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
|
|
||||||
"integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
|
|
||||||
"cpu": [
|
|
||||||
"ppc64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"aix"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@esbuild/android-arm": {
|
"node_modules/@esbuild/android-arm": {
|
||||||
"version": "0.17.19",
|
"version": "0.17.19",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
|
||||||
|
@ -3632,9 +3615,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz",
|
||||||
"integrity": "sha512-BV+u2QSfK3i1o6FucqJh5IK9cjAU6icjFFhvknzFgu472jzl0bBojfDAkJLBEsHFMo+YZg6rthBvBBt8z12IBQ==",
|
"integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
@ -3645,9 +3628,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm64": {
|
"node_modules/@rollup/rollup-android-arm64": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz",
|
||||||
"integrity": "sha512-0ij3iw7sT5jbcdXofWO2NqDNjSVVsf6itcAkV2I6Xsq4+6wjW1A8rViVB67TfBEan7PV2kbLzT8rhOVWLI2YXw==",
|
"integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -3658,9 +3641,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz",
|
||||||
"integrity": "sha512-yPLs6RbbBMupArf6qv1UDk6dzZvlH66z6NLYEwqTU0VHtss1wkI4UYeeMS7TVj5QRVvaNAWYKP0TD/MOeZ76Zg==",
|
"integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -3671,9 +3654,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-x64": {
|
"node_modules/@rollup/rollup-darwin-x64": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz",
|
||||||
"integrity": "sha512-OvqIgwaGAwnASzXaZEeoJY3RltOFg+WUbdkdfoluh2iqatd090UeOG3A/h0wNZmE93dDew9tAtXgm3/+U/B6bw==",
|
"integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -3684,9 +3667,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz",
|
||||||
"integrity": "sha512-X17s4hZK3QbRmdAuLd2EE+qwwxL8JxyVupEqAkxKPa/IgX49ZO+vf0ka69gIKsaYeo6c1CuwY3k8trfDtZ9dFg==",
|
"integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
@ -3710,9 +3693,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz",
|
||||||
"integrity": "sha512-673Lu9EJwxVB9NfYeA4AdNu0FOHz7g9t6N1DmT7bZPn1u6bTF+oZjj+fuxUcrfxWXE0r2jxl5QYMa9cUOj9NFg==",
|
"integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -3723,9 +3706,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz",
|
||||||
"integrity": "sha512-yFW2msTAQNpPJaMmh2NpRalr1KXI7ZUjlN6dY/FhWlOclMrZezm5GIhy3cP4Ts2rIAC+IPLAjNibjp1BsxCVGg==",
|
"integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -3749,9 +3732,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz",
|
||||||
"integrity": "sha512-kKT9XIuhbvYgiA3cPAGntvrBgzhWkGpBMzuk1V12Xuoqg7CI41chye4HU0vLJnGf9MiZzfNh4I7StPeOzOWJfA==",
|
"integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
|
@ -3775,9 +3758,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz",
|
||||||
"integrity": "sha512-6q4ESWlyTO+erp1PSCmASac+ixaDv11dBk1fqyIuvIUc/CmRAX2Zk+2qK1FGo5q7kyDcjHCFVwgGFCGIZGVwCA==",
|
"integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -3788,9 +3771,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz",
|
||||||
"integrity": "sha512-vIAQUmXeMLmaDN78HSE4Kh6xqof2e3TJUKr+LPqXWU4NYNON0MDN9h2+t4KHrPAQNmU3w1GxBQ/n01PaWFwa5w==",
|
"integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -3801,9 +3784,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz",
|
||||||
"integrity": "sha512-LVXo9dDTGPr0nezMdqa1hK4JeoMZ02nstUxGYY/sMIDtTYlli1ZxTXBYAz3vzuuvKO4X6NBETciIh7N9+abT1g==",
|
"integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
@ -3814,9 +3797,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz",
|
||||||
"integrity": "sha512-xZVt6K70Gr3I7nUhug2dN6VRR1ibot3rXqXS3wo+8JP64t7djc3lBFyqO4GiVrhNaAIhUCJtwQ/20dr0h0thmQ==",
|
"integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
|
@ -3827,9 +3810,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz",
|
||||||
"integrity": "sha512-f3I7h9oTg79UitEco9/2bzwdciYkWr8pITs3meSDSlr1TdvQ7IxkQaaYN2YqZXX5uZhiYL+VuYDmHwNzhx+HOg==",
|
"integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
@ -4072,15 +4055,24 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@solid-primitives/storage": {
|
"node_modules/@solid-primitives/storage": {
|
||||||
"version": "1.3.9",
|
"version": "3.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/@solid-primitives/storage/-/storage-1.3.9.tgz",
|
"resolved": "https://registry.npmjs.org/@solid-primitives/storage/-/storage-3.5.0.tgz",
|
||||||
"integrity": "sha512-ysJSIycmToQD8Hpt4jpIlh7U8EuYdpQwkamppng3g93E5f6RZVPCzYmRZ+ckRN2cNLFpAuTEqZx7OBRh3PBWFQ==",
|
"integrity": "sha512-AqU3vrXz8XlxOgJIiP+oQxE/vFchGf4Qe7E5Xfa02DJdF9rD8CtiTmVZDBU08ViS7g0Nwc4IpStHvVO0jBMalQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@solid-primitives/utils": "^6.0.0"
|
"@solid-primitives/utils": "^6.2.3"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
|
"@tauri-apps/plugin-store": "*",
|
||||||
"solid-js": "^1.6.12"
|
"solid-js": "^1.6.12"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@tauri-apps/plugin-store": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"solid-start": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@solid-primitives/transition-group": {
|
"node_modules/@solid-primitives/transition-group": {
|
||||||
|
@ -4093,26 +4085,17 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@solid-primitives/upload": {
|
"node_modules/@solid-primitives/upload": {
|
||||||
"version": "0.0.110",
|
"version": "0.0.115",
|
||||||
"resolved": "https://registry.npmjs.org/@solid-primitives/upload/-/upload-0.0.110.tgz",
|
"resolved": "https://registry.npmjs.org/@solid-primitives/upload/-/upload-0.0.115.tgz",
|
||||||
"integrity": "sha512-YQZGogXzc77c/3hxDoxGi78FkvQQfUbElbdSPn+E0GRl21XMuJbD/QKQKNXm7KyxX+cMTwLnQYCoqfRXcgHMIA==",
|
"integrity": "sha512-CWTXz28mmRGvZV90IzViNtBAKC6cnO2WSNb3UjvbkPRrtxlHrj/ewZwLRhuLSu6JzdY/c+rHi1j24v7H0SrdXg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@solid-primitives/utils": "^5.5.1"
|
"@solid-primitives/utils": "^6.2.2"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"solid-js": "^1.6.12"
|
"solid-js": "^1.6.12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@solid-primitives/upload/node_modules/@solid-primitives/utils": {
|
|
||||||
"version": "5.5.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-5.5.2.tgz",
|
|
||||||
"integrity": "sha512-L52ig3eHKU6CqbPCKJIb4lweBuINHBOERcE1duApyKozEN8+zCqEKwD1Qo9ljKeEzJTBGWClxNpwEiNTUWTGvg==",
|
|
||||||
"dev": true,
|
|
||||||
"peerDependencies": {
|
|
||||||
"solid-js": "^1.6.12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@solid-primitives/utils": {
|
"node_modules/@solid-primitives/utils": {
|
||||||
"version": "6.2.3",
|
"version": "6.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.2.3.tgz",
|
||||||
|
@ -4122,15 +4105,6 @@
|
||||||
"solid-js": "^1.6.12"
|
"solid-js": "^1.6.12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@solidjs/meta": {
|
|
||||||
"version": "0.29.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@solidjs/meta/-/meta-0.29.1.tgz",
|
|
||||||
"integrity": "sha512-qtrBYCnRRuzyvBg/u/SRO/2fM5r6DT1YKf+2W1RZhveMoeXHbZpWIrXjgpLFRHJLn6cqAGqrIzu42qS2o+1hKQ==",
|
|
||||||
"dev": true,
|
|
||||||
"peerDependencies": {
|
|
||||||
"solid-js": ">=1.8.4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@thisbeyond/solid-select": {
|
"node_modules/@thisbeyond/solid-select": {
|
||||||
"version": "0.14.0",
|
"version": "0.14.0",
|
||||||
"resolved": "https://registry.npmjs.org/@thisbeyond/solid-select/-/solid-select-0.14.0.tgz",
|
"resolved": "https://registry.npmjs.org/@thisbeyond/solid-select/-/solid-select-0.14.0.tgz",
|
||||||
|
@ -4630,9 +4604,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "20.12.8",
|
"version": "20.12.10",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz",
|
||||||
"integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==",
|
"integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~5.26.4"
|
"undici-types": "~5.26.4"
|
||||||
|
@ -5454,9 +5428,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001615",
|
"version": "1.0.30001616",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz",
|
||||||
"integrity": "sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==",
|
"integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
@ -6290,9 +6264,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.4.756",
|
"version": "1.4.757",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.756.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz",
|
||||||
"integrity": "sha512-RJKZ9+vEBMeiPAvKNWyZjuYyUqMndcP1f335oHqn3BEQbs2NFtVrnK5+6Xg5wSM9TknNNpWghGDUCKGYF+xWXw==",
|
"integrity": "sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/elliptic": {
|
"node_modules/elliptic": {
|
||||||
|
@ -10796,9 +10770,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prosemirror-model": {
|
"node_modules/prosemirror-model": {
|
||||||
"version": "1.20.0",
|
"version": "1.21.0",
|
||||||
"resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.20.0.tgz",
|
"resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.0.tgz",
|
||||||
"integrity": "sha512-q7AY7vMjKYqDCeoedgUiAgrLabliXxndJuuFmcmc2+YU1SblvnOiG2WEACF2lwAZsMlfLpiAilA3L+TWlDqIsQ==",
|
"integrity": "sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"orderedmap": "^2.0.0"
|
"orderedmap": "^2.0.0"
|
||||||
|
@ -10880,12 +10854,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prosemirror-transform": {
|
"node_modules/prosemirror-transform": {
|
||||||
"version": "1.8.0",
|
"version": "1.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.8.0.tgz",
|
"resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz",
|
||||||
"integrity": "sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==",
|
"integrity": "sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"prosemirror-model": "^1.0.0"
|
"prosemirror-model": "^1.21.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prosemirror-view": {
|
"node_modules/prosemirror-view": {
|
||||||
|
@ -11193,9 +11167,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/rollup": {
|
"node_modules/rollup": {
|
||||||
"version": "4.11.0",
|
"version": "4.17.2",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz",
|
||||||
"integrity": "sha512-2xIbaXDXjf3u2tajvA5xROpib7eegJ9Y/uPlSFhXLNpK9ampCczXAhLEb5yLzJyG3LAdI1NWtNjDXiLyniNdjQ==",
|
"integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/estree": "1.0.5"
|
"@types/estree": "1.0.5"
|
||||||
|
@ -11208,19 +11182,22 @@
|
||||||
"npm": ">=8.0.0"
|
"npm": ">=8.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@rollup/rollup-android-arm-eabi": "4.11.0",
|
"@rollup/rollup-android-arm-eabi": "4.17.2",
|
||||||
"@rollup/rollup-android-arm64": "4.11.0",
|
"@rollup/rollup-android-arm64": "4.17.2",
|
||||||
"@rollup/rollup-darwin-arm64": "4.11.0",
|
"@rollup/rollup-darwin-arm64": "4.17.2",
|
||||||
"@rollup/rollup-darwin-x64": "4.11.0",
|
"@rollup/rollup-darwin-x64": "4.17.2",
|
||||||
"@rollup/rollup-linux-arm-gnueabihf": "4.11.0",
|
"@rollup/rollup-linux-arm-gnueabihf": "4.17.2",
|
||||||
"@rollup/rollup-linux-arm64-gnu": "4.11.0",
|
"@rollup/rollup-linux-arm-musleabihf": "4.17.2",
|
||||||
"@rollup/rollup-linux-arm64-musl": "4.11.0",
|
"@rollup/rollup-linux-arm64-gnu": "4.17.2",
|
||||||
"@rollup/rollup-linux-riscv64-gnu": "4.11.0",
|
"@rollup/rollup-linux-arm64-musl": "4.17.2",
|
||||||
"@rollup/rollup-linux-x64-gnu": "4.11.0",
|
"@rollup/rollup-linux-powerpc64le-gnu": "4.17.2",
|
||||||
"@rollup/rollup-linux-x64-musl": "4.11.0",
|
"@rollup/rollup-linux-riscv64-gnu": "4.17.2",
|
||||||
"@rollup/rollup-win32-arm64-msvc": "4.11.0",
|
"@rollup/rollup-linux-s390x-gnu": "4.17.2",
|
||||||
"@rollup/rollup-win32-ia32-msvc": "4.11.0",
|
"@rollup/rollup-linux-x64-gnu": "4.17.2",
|
||||||
"@rollup/rollup-win32-x64-msvc": "4.11.0",
|
"@rollup/rollup-linux-x64-musl": "4.17.2",
|
||||||
|
"@rollup/rollup-win32-arm64-msvc": "4.17.2",
|
||||||
|
"@rollup/rollup-win32-ia32-msvc": "4.17.2",
|
||||||
|
"@rollup/rollup-win32-x64-msvc": "4.17.2",
|
||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -11550,13 +11527,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/solid-js": {
|
"node_modules/solid-js": {
|
||||||
"version": "1.8.15",
|
"version": "1.8.17",
|
||||||
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.15.tgz",
|
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.17.tgz",
|
||||||
"integrity": "sha512-d0QP/efr3UVcwGgWVPveQQ0IHOH6iU7yUhc2piy8arNG8wxKmvUy1kFxyF8owpmfCWGB87usDKMaVnsNYZm+Vw==",
|
"integrity": "sha512-E0FkUgv9sG/gEBWkHr/2XkBluHb1fkrHywUgA6o6XolPDCJ4g1HaLmQufcBBhiF36ee40q+HpG/vCZu7fLpI3Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"csstype": "^3.1.0",
|
"csstype": "^3.1.0",
|
||||||
"seroval": "^1.0.3",
|
"seroval": "^1.0.4",
|
||||||
"seroval-plugins": "^1.0.3"
|
"seroval-plugins": "^1.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -12530,9 +12507,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "5.2.10",
|
"version": "5.2.11",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz",
|
||||||
"integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==",
|
"integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.20.1",
|
"esbuild": "^0.20.1",
|
||||||
|
@ -12660,6 +12637,22 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/vite/node_modules/@esbuild/aix-ppc64": {
|
||||||
|
"version": "0.20.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
|
||||||
|
"integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
|
||||||
|
"cpu": [
|
||||||
|
"ppc64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"aix"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/vite/node_modules/@esbuild/android-arm": {
|
"node_modules/vite/node_modules/@esbuild/android-arm": {
|
||||||
"version": "0.20.2",
|
"version": "0.20.2",
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
|
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
|
||||||
|
@ -13012,175 +13005,6 @@
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==",
|
|
||||||
"cpu": [
|
|
||||||
"arm"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"android"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-android-arm64": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==",
|
|
||||||
"cpu": [
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"android"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==",
|
|
||||||
"cpu": [
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"darwin"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-darwin-x64": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"darwin"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==",
|
|
||||||
"cpu": [
|
|
||||||
"arm"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==",
|
|
||||||
"cpu": [
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==",
|
|
||||||
"cpu": [
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==",
|
|
||||||
"cpu": [
|
|
||||||
"riscv64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==",
|
|
||||||
"cpu": [
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"win32"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==",
|
|
||||||
"cpu": [
|
|
||||||
"ia32"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"win32"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"win32"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"node_modules/vite/node_modules/esbuild": {
|
"node_modules/vite/node_modules/esbuild": {
|
||||||
"version": "0.20.2",
|
"version": "0.20.2",
|
||||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
|
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
|
||||||
|
@ -13233,41 +13057,6 @@
|
||||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vite/node_modules/rollup": {
|
|
||||||
"version": "4.17.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz",
|
|
||||||
"integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/estree": "1.0.5"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"rollup": "dist/bin/rollup"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=18.0.0",
|
|
||||||
"npm": ">=8.0.0"
|
|
||||||
},
|
|
||||||
"optionalDependencies": {
|
|
||||||
"@rollup/rollup-android-arm-eabi": "4.17.2",
|
|
||||||
"@rollup/rollup-android-arm64": "4.17.2",
|
|
||||||
"@rollup/rollup-darwin-arm64": "4.17.2",
|
|
||||||
"@rollup/rollup-darwin-x64": "4.17.2",
|
|
||||||
"@rollup/rollup-linux-arm-gnueabihf": "4.17.2",
|
|
||||||
"@rollup/rollup-linux-arm-musleabihf": "4.17.2",
|
|
||||||
"@rollup/rollup-linux-arm64-gnu": "4.17.2",
|
|
||||||
"@rollup/rollup-linux-arm64-musl": "4.17.2",
|
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu": "4.17.2",
|
|
||||||
"@rollup/rollup-linux-riscv64-gnu": "4.17.2",
|
|
||||||
"@rollup/rollup-linux-s390x-gnu": "4.17.2",
|
|
||||||
"@rollup/rollup-linux-x64-gnu": "4.17.2",
|
|
||||||
"@rollup/rollup-linux-x64-musl": "4.17.2",
|
|
||||||
"@rollup/rollup-win32-arm64-msvc": "4.17.2",
|
|
||||||
"@rollup/rollup-win32-ia32-msvc": "4.17.2",
|
|
||||||
"@rollup/rollup-win32-x64-msvc": "4.17.2",
|
|
||||||
"fsevents": "~2.3.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/vitefu": {
|
"node_modules/vitefu": {
|
||||||
"version": "0.2.5",
|
"version": "0.2.5",
|
||||||
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz",
|
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz",
|
||||||
|
|
17
package.json
17
package.json
|
@ -16,7 +16,7 @@
|
||||||
"hygen": "HYGEN_TMPLS=gen hygen",
|
"hygen": "HYGEN_TMPLS=gen hygen",
|
||||||
"postinstall": "npm run codegen && npx patch-package",
|
"postinstall": "npm run codegen && npx patch-package",
|
||||||
"check:code": "npx @biomejs/biome check src --log-kind=compact --verbose",
|
"check:code": "npx @biomejs/biome check src --log-kind=compact --verbose",
|
||||||
"check:code:fix": "npx @biomejs/biome lint src --log-kind=compact",
|
"check:code:fix": "npx @biomejs/biome check . --apply",
|
||||||
"lint": "npm run lint:code && stylelint **/*.{scss,css}",
|
"lint": "npm run lint:code && stylelint **/*.{scss,css}",
|
||||||
"lint:code": "npx @biomejs/biome lint src --log-kind=compact --verbose",
|
"lint:code": "npx @biomejs/biome lint src --log-kind=compact --verbose",
|
||||||
"lint:code:fix": "npx @biomejs/biome lint src --apply-unsafe --log-kind=compact --verbose",
|
"lint:code:fix": "npx @biomejs/biome lint src --apply-unsafe --log-kind=compact --verbose",
|
||||||
|
@ -52,9 +52,8 @@
|
||||||
"@solid-primitives/memo": "1.2.4",
|
"@solid-primitives/memo": "1.2.4",
|
||||||
"@solid-primitives/pagination": "0.2.10",
|
"@solid-primitives/pagination": "0.2.10",
|
||||||
"@solid-primitives/share": "2.0.4",
|
"@solid-primitives/share": "2.0.4",
|
||||||
"@solid-primitives/storage": "1.3.9",
|
"@solid-primitives/storage": "^3.5.0",
|
||||||
"@solid-primitives/upload": "0.0.110",
|
"@solid-primitives/upload": "0.0.115",
|
||||||
"@solidjs/meta": "0.29.1",
|
|
||||||
"@thisbeyond/solid-select": "0.14.0",
|
"@thisbeyond/solid-select": "0.14.0",
|
||||||
"@tiptap/core": "2.2.3",
|
"@tiptap/core": "2.2.3",
|
||||||
"@tiptap/extension-blockquote": "2.2.3",
|
"@tiptap/extension-blockquote": "2.2.3",
|
||||||
|
@ -113,9 +112,9 @@
|
||||||
"prosemirror-history": "1.3.2",
|
"prosemirror-history": "1.3.2",
|
||||||
"prosemirror-trailing-node": "2.0.7",
|
"prosemirror-trailing-node": "2.0.7",
|
||||||
"prosemirror-view": "1.32.7",
|
"prosemirror-view": "1.32.7",
|
||||||
"rollup": "4.11.0",
|
"rollup": "4.17.2",
|
||||||
"sass": "1.69.5",
|
"sass": "1.69.5",
|
||||||
"solid-js": "1.8.15",
|
"solid-js": "1.8.17",
|
||||||
"solid-popper": "0.3.0",
|
"solid-popper": "0.3.0",
|
||||||
"solid-tiptap": "0.7.0",
|
"solid-tiptap": "0.7.0",
|
||||||
"solid-transition-group": "0.2.3",
|
"solid-transition-group": "0.2.3",
|
||||||
|
@ -129,7 +128,7 @@
|
||||||
"typograf": "7.3.0",
|
"typograf": "7.3.0",
|
||||||
"uniqolor": "1.1.0",
|
"uniqolor": "1.1.0",
|
||||||
"vike": "0.4.148",
|
"vike": "0.4.148",
|
||||||
"vite": "5.2.10",
|
"vite": "5.2.11",
|
||||||
"vite-plugin-mkcert": "^1.17.3",
|
"vite-plugin-mkcert": "^1.17.3",
|
||||||
"vite-plugin-node-polyfills": "0.21.0",
|
"vite-plugin-node-polyfills": "0.21.0",
|
||||||
"vite-plugin-sass-dts": "^1.3.17",
|
"vite-plugin-sass-dts": "^1.3.17",
|
||||||
|
@ -141,7 +140,5 @@
|
||||||
"y-prosemirror": "1.2.2",
|
"y-prosemirror": "1.2.2",
|
||||||
"yjs": "13.6.12"
|
"yjs": "13.6.12"
|
||||||
},
|
},
|
||||||
"trustedDependencies": [
|
"trustedDependencies": ["@biomejs/biome"]
|
||||||
"@biomejs/biome"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -397,7 +397,7 @@
|
||||||
"Top authors": "Authors rating",
|
"Top authors": "Authors rating",
|
||||||
"Top commented": "Most commented",
|
"Top commented": "Most commented",
|
||||||
"Top discussed": "Top discussed",
|
"Top discussed": "Top discussed",
|
||||||
"Top month articles": "Top of the month",
|
"Top month": "Top of the month",
|
||||||
"Top rated": "Popular",
|
"Top rated": "Popular",
|
||||||
"Top recent": "Most recent",
|
"Top recent": "Most recent",
|
||||||
"Top topics": "Interesting topics",
|
"Top topics": "Interesting topics",
|
||||||
|
|
|
@ -418,7 +418,7 @@
|
||||||
"Top authors": "Рейтинг авторов",
|
"Top authors": "Рейтинг авторов",
|
||||||
"Top commented": "Самое комментируемое",
|
"Top commented": "Самое комментируемое",
|
||||||
"Top discussed": "Обсуждаемое",
|
"Top discussed": "Обсуждаемое",
|
||||||
"Top month articles": "Лучшие материалы месяца",
|
"Top month": "Лучшее за месяц",
|
||||||
"Top rated": "Популярное",
|
"Top rated": "Популярное",
|
||||||
"Top recent": "Самое новое",
|
"Top recent": "Самое новое",
|
||||||
"Top topics": "Интересные темы",
|
"Top topics": "Интересные темы",
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import type { PageProps, RootSearchParams } from '../pages/types'
|
import type { PageProps, RootSearchParams } from '../pages/types'
|
||||||
|
|
||||||
import { Meta, MetaProvider } from '@solidjs/meta'
|
|
||||||
import { Component, createEffect, createMemo } from 'solid-js'
|
import { Component, createEffect, createMemo } from 'solid-js'
|
||||||
import { Dynamic } from 'solid-js/web'
|
import { Dynamic } from 'solid-js/web'
|
||||||
|
import { Meta, MetaProvider } from '../context/meta'
|
||||||
|
|
||||||
import { ConfirmProvider } from '../context/confirm'
|
import { ConfirmProvider } from '../context/confirm'
|
||||||
import { ConnectProvider } from '../context/connect'
|
import { ConnectProvider } from '../context/connect'
|
||||||
|
@ -12,6 +12,7 @@ import { InboxProvider } from '../context/inbox'
|
||||||
import { LocalizeProvider } from '../context/localize'
|
import { LocalizeProvider } from '../context/localize'
|
||||||
import { MediaQueryProvider } from '../context/mediaQuery'
|
import { MediaQueryProvider } from '../context/mediaQuery'
|
||||||
import { NotificationsProvider } from '../context/notifications'
|
import { NotificationsProvider } from '../context/notifications'
|
||||||
|
import { SeenProvider } from '../context/seen'
|
||||||
import { SessionProvider } from '../context/session'
|
import { SessionProvider } from '../context/session'
|
||||||
import { SnackbarProvider } from '../context/snackbar'
|
import { SnackbarProvider } from '../context/snackbar'
|
||||||
import { TopicsProvider } from '../context/topics'
|
import { TopicsProvider } from '../context/topics'
|
||||||
|
@ -115,21 +116,23 @@ export const App = (props: Props) => {
|
||||||
<MediaQueryProvider>
|
<MediaQueryProvider>
|
||||||
<SnackbarProvider>
|
<SnackbarProvider>
|
||||||
<TopicsProvider>
|
<TopicsProvider>
|
||||||
<ConfirmProvider>
|
<SeenProvider>
|
||||||
<SessionProvider onStateChangeCallback={console.log}>
|
<ConfirmProvider>
|
||||||
<FollowingProvider>
|
<SessionProvider onStateChangeCallback={console.log}>
|
||||||
<ConnectProvider>
|
<FollowingProvider>
|
||||||
<NotificationsProvider>
|
<ConnectProvider>
|
||||||
<EditorProvider>
|
<NotificationsProvider>
|
||||||
<InboxProvider>
|
<EditorProvider>
|
||||||
<Dynamic component={pageComponent()} {...props} />
|
<InboxProvider>
|
||||||
</InboxProvider>
|
<Dynamic component={pageComponent()} {...props} />
|
||||||
</EditorProvider>
|
</InboxProvider>
|
||||||
</NotificationsProvider>
|
</EditorProvider>
|
||||||
</ConnectProvider>
|
</NotificationsProvider>
|
||||||
</FollowingProvider>
|
</ConnectProvider>
|
||||||
</SessionProvider>
|
</FollowingProvider>
|
||||||
</ConfirmProvider>
|
</SessionProvider>
|
||||||
|
</ConfirmProvider>
|
||||||
|
</SeenProvider>
|
||||||
</TopicsProvider>
|
</TopicsProvider>
|
||||||
</SnackbarProvider>
|
</SnackbarProvider>
|
||||||
</MediaQueryProvider>
|
</MediaQueryProvider>
|
||||||
|
|
|
@ -127,7 +127,7 @@ export const Comment = (props: Props) => {
|
||||||
<li
|
<li
|
||||||
id={`comment_${props.comment.id}`}
|
id={`comment_${props.comment.id}`}
|
||||||
class={clsx(styles.comment, props.class, {
|
class={clsx(styles.comment, props.class, {
|
||||||
[styles.isNew]: props.comment?.created_at > props.lastSeen,
|
[styles.isNew]: props.lastSeen > (props.comment.updated_at || props.comment.created_at),
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
<Show when={!!body()}>
|
<Show when={!!body()}>
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { ShowIfAuthenticated } from '../_shared/ShowIfAuthenticated'
|
||||||
|
|
||||||
import { Comment } from './Comment'
|
import { Comment } from './Comment'
|
||||||
|
|
||||||
|
import { useSeen } from '../../context/seen'
|
||||||
import styles from './Article.module.scss'
|
import styles from './Article.module.scss'
|
||||||
|
|
||||||
const SimplifiedEditor = lazy(() => import('../Editor/SimplifiedEditor'))
|
const SimplifiedEditor = lazy(() => import('../Editor/SimplifiedEditor'))
|
||||||
|
@ -48,21 +49,20 @@ export const CommentsTree = (props: Props) => {
|
||||||
}
|
}
|
||||||
return newSortedComments
|
return newSortedComments
|
||||||
})
|
})
|
||||||
|
const { seen } = useSeen()
|
||||||
const dateFromLocalStorage = Number.parseInt(localStorage.getItem(`${props.shoutSlug}`))
|
const shoutLastSeen = createMemo(() => seen()[props.shoutSlug] ?? 0)
|
||||||
const currentDate = new Date()
|
const currentDate = new Date()
|
||||||
const setCookie = () => localStorage.setItem(`${props.shoutSlug}`, `${currentDate}`)
|
const setCookie = () => localStorage.setItem(`${props.shoutSlug}`, `${currentDate}`)
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
if (!dateFromLocalStorage) {
|
if (!shoutLastSeen()) {
|
||||||
setCookie()
|
setCookie()
|
||||||
} else if (currentDate.getTime() > dateFromLocalStorage) {
|
} else if (currentDate.getTime() > shoutLastSeen()) {
|
||||||
const newComments = comments().filter((c) => {
|
const newComments = comments().filter((c) => {
|
||||||
if (c.reply_to || c.created_by.slug === author()?.slug) {
|
if (c.reply_to || c.created_by.slug === author()?.slug) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const created = c.created_at
|
return (c.updated_at || c.created_at) > shoutLastSeen()
|
||||||
return created > dateFromLocalStorage
|
|
||||||
})
|
})
|
||||||
setNewReactions(newComments)
|
setNewReactions(newComments)
|
||||||
setCookie()
|
setCookie()
|
||||||
|
@ -134,7 +134,7 @@ export const CommentsTree = (props: Props) => {
|
||||||
comment={reaction}
|
comment={reaction}
|
||||||
clickedReply={(id) => setClickedReplyId(id)}
|
clickedReply={(id) => setClickedReplyId(id)}
|
||||||
clickedReplyId={clickedReplyId()}
|
clickedReplyId={clickedReplyId()}
|
||||||
lastSeen={dateFromLocalStorage}
|
lastSeen={shoutLastSeen()}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</For>
|
</For>
|
||||||
|
|
|
@ -2,11 +2,11 @@ import type { Author, Shout, Topic } from '../../graphql/schema/core.gen'
|
||||||
|
|
||||||
import { getPagePath } from '@nanostores/router'
|
import { getPagePath } from '@nanostores/router'
|
||||||
import { createPopper } from '@popperjs/core'
|
import { createPopper } from '@popperjs/core'
|
||||||
import { Link, Meta } from '@solidjs/meta'
|
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { install } from 'ga-gtag'
|
import { install } from 'ga-gtag'
|
||||||
import { For, Show, createEffect, createMemo, createSignal, on, onCleanup, onMount } from 'solid-js'
|
import { For, Show, createEffect, createMemo, createSignal, on, onCleanup, onMount } from 'solid-js'
|
||||||
import { isServer } from 'solid-js/web'
|
import { isServer } from 'solid-js/web'
|
||||||
|
import { Link, Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
import { useReactions } from '../../context/reactions'
|
import { useReactions } from '../../context/reactions'
|
||||||
|
@ -38,6 +38,7 @@ import { CommentsTree } from './CommentsTree'
|
||||||
import { SharePopup, getShareUrl } from './SharePopup'
|
import { SharePopup, getShareUrl } from './SharePopup'
|
||||||
import { ShoutRatingControl } from './ShoutRatingControl'
|
import { ShoutRatingControl } from './ShoutRatingControl'
|
||||||
|
|
||||||
|
import { useSeen } from '../../context/seen'
|
||||||
import stylesHeader from '../Nav/Header/Header.module.scss'
|
import stylesHeader from '../Nav/Header/Header.module.scss'
|
||||||
import styles from './Article.module.scss'
|
import styles from './Article.module.scss'
|
||||||
|
|
||||||
|
@ -76,6 +77,7 @@ export const FullArticle = (props: Props) => {
|
||||||
const [isActionPopupActive, setIsActionPopupActive] = createSignal(false)
|
const [isActionPopupActive, setIsActionPopupActive] = createSignal(false)
|
||||||
const { t, formatDate, lang } = useLocalize()
|
const { t, formatDate, lang } = useLocalize()
|
||||||
const { author, session, requireAuthentication } = useSession()
|
const { author, session, requireAuthentication } = useSession()
|
||||||
|
const { addSeen } = useSeen()
|
||||||
|
|
||||||
const formattedDate = createMemo(() => formatDate(new Date(props.article.published_at * 1000)))
|
const formattedDate = createMemo(() => formatDate(new Date(props.article.published_at * 1000)))
|
||||||
|
|
||||||
|
@ -302,6 +304,7 @@ export const FullArticle = (props: Props) => {
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
install('G-LQ4B87H8C2')
|
install('G-LQ4B87H8C2')
|
||||||
await loadReactionsBy({ by: { shout: props.article.slug } })
|
await loadReactionsBy({ by: { shout: props.article.slug } })
|
||||||
|
addSeen(props.article.slug)
|
||||||
setIsReactionsLoaded(true)
|
setIsReactionsLoaded(true)
|
||||||
document.title = props.article.title
|
document.title = props.article.title
|
||||||
window?.addEventListener('resize', updateIframeSizes)
|
window?.addEventListener('resize', updateIframeSizes)
|
||||||
|
|
|
@ -89,8 +89,8 @@ const getTitleAndSubtitle = (
|
||||||
}
|
}
|
||||||
|
|
||||||
const getMainTopicTitle = (article: Shout, lng: string) => {
|
const getMainTopicTitle = (article: Shout, lng: string) => {
|
||||||
const mainTopicSlug = article.main_topic || ''
|
const mainTopicSlug = article?.main_topic || ''
|
||||||
const mainTopic = article.topics?.find((tpc: Topic) => tpc.slug === mainTopicSlug)
|
const mainTopic = article?.topics?.find((tpc: Topic) => tpc.slug === mainTopicSlug)
|
||||||
const mainTopicTitle =
|
const mainTopicTitle =
|
||||||
mainTopicSlug && lng === 'en' ? mainTopicSlug.replace(/-/, ' ') : mainTopic?.title || ''
|
mainTopicSlug && lng === 'en' ? mainTopicSlug.replace(/-/, ' ') : mainTopic?.title || ''
|
||||||
|
|
||||||
|
@ -111,8 +111,8 @@ export const ArticleCard = (props: ArticleCardProps) => {
|
||||||
const [isActionPopupActive, setIsActionPopupActive] = createSignal(false)
|
const [isActionPopupActive, setIsActionPopupActive] = createSignal(false)
|
||||||
const [isCoverImageLoadError, setIsCoverImageLoadError] = createSignal(false)
|
const [isCoverImageLoadError, setIsCoverImageLoadError] = createSignal(false)
|
||||||
const [isCoverImageLoading, setIsCoverImageLoading] = createSignal(true)
|
const [isCoverImageLoading, setIsCoverImageLoading] = createSignal(true)
|
||||||
const description = getDescription(props.article.body)
|
const description = getDescription(props.article?.body)
|
||||||
const aspectRatio = () => LAYOUT_ASPECT[props.article.layout]
|
const aspectRatio = () => LAYOUT_ASPECT[props.article?.layout]
|
||||||
const [mainTopicTitle, mainTopicSlug] = getMainTopicTitle(props.article, lang())
|
const [mainTopicTitle, mainTopicSlug] = getMainTopicTitle(props.article, lang())
|
||||||
const { title, subtitle } = getTitleAndSubtitle(props.article)
|
const { title, subtitle } = getTitleAndSubtitle(props.article)
|
||||||
|
|
||||||
|
|
|
@ -4,21 +4,20 @@ import { For, Show, createSignal } from 'solid-js'
|
||||||
|
|
||||||
import { useFollowing } from '../../../context/following'
|
import { useFollowing } from '../../../context/following'
|
||||||
import { useLocalize } from '../../../context/localize'
|
import { useLocalize } from '../../../context/localize'
|
||||||
|
import { useSeen } from '../../../context/seen'
|
||||||
import { Author } from '../../../graphql/schema/core.gen'
|
import { Author } from '../../../graphql/schema/core.gen'
|
||||||
import { router, useRouter } from '../../../stores/router'
|
import { router, useRouter } from '../../../stores/router'
|
||||||
import { useArticlesStore } from '../../../stores/zine/articles'
|
import { useArticlesStore } from '../../../stores/zine/articles'
|
||||||
import { useSeenStore } from '../../../stores/zine/seen'
|
|
||||||
import { Userpic } from '../../Author/Userpic'
|
import { Userpic } from '../../Author/Userpic'
|
||||||
import { Icon } from '../../_shared/Icon'
|
import { Icon } from '../../_shared/Icon'
|
||||||
|
|
||||||
import styles from './Sidebar.module.scss'
|
import styles from './Sidebar.module.scss'
|
||||||
|
|
||||||
export const Sidebar = () => {
|
export const Sidebar = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
const { seen } = useSeenStore()
|
const { seen } = useSeen()
|
||||||
const { subscriptions } = useFollowing()
|
const { subscriptions } = useFollowing()
|
||||||
const { page } = useRouter()
|
const { page } = useRouter()
|
||||||
const { articlesByTopic } = useArticlesStore()
|
const { articlesByTopic, articlesByAuthor } = useArticlesStore()
|
||||||
const [isSubscriptionsVisible, setSubscriptionsVisible] = createSignal(true)
|
const [isSubscriptionsVisible, setSubscriptionsVisible] = createSignal(true)
|
||||||
|
|
||||||
const checkTopicIsSeen = (topicSlug: string) => {
|
const checkTopicIsSeen = (topicSlug: string) => {
|
||||||
|
@ -26,8 +25,9 @@ export const Sidebar = () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const checkAuthorIsSeen = (authorSlug: string) => {
|
const checkAuthorIsSeen = (authorSlug: string) => {
|
||||||
return Boolean(seen()[authorSlug])
|
return articlesByAuthor()[authorSlug]?.every((article) => Boolean(seen()[article.slug]))
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div class={styles.sidebar}>
|
<div class={styles.sidebar}>
|
||||||
<ul class={styles.feedFilters}>
|
<ul class={styles.feedFilters}>
|
||||||
|
|
|
@ -48,7 +48,7 @@ export const Header = (props: Props) => {
|
||||||
const { page } = useRouter()
|
const { page } = useRouter()
|
||||||
const { requireAuthentication } = useSession()
|
const { requireAuthentication } = useSession()
|
||||||
const { searchParams } = useRouter<HeaderSearchParams>()
|
const { searchParams } = useRouter<HeaderSearchParams>()
|
||||||
const { topics } = useTopics()
|
const { sortedTopics: topics } = useTopics()
|
||||||
const [randomTopics, setRandomTopics] = createSignal([])
|
const [randomTopics, setRandomTopics] = createSignal([])
|
||||||
const [getIsScrollingBottom, setIsScrollingBottom] = createSignal(false)
|
const [getIsScrollingBottom, setIsScrollingBottom] = createSignal(false)
|
||||||
const [getIsScrolled, setIsScrolled] = createSignal(false)
|
const [getIsScrolled, setIsScrolled] = createSignal(false)
|
||||||
|
|
|
@ -234,7 +234,12 @@ export const HeaderAuth = (props: Props) => {
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Show when={!isSaveButtonVisible()}>
|
<Show when={!isSaveButtonVisible()}>
|
||||||
<div class={clsx(styles.userControlItem, styles.userControlItemInbox)}>
|
<div
|
||||||
|
class={clsx(
|
||||||
|
styles.userControlItem,
|
||||||
|
// styles.userControlItemInbox
|
||||||
|
)}
|
||||||
|
>
|
||||||
<a href={getPagePath(router, 'inbox')}>
|
<a href={getPagePath(router, 'inbox')}>
|
||||||
<div classList={{ entered: page().path === '/inbox' }}>
|
<div classList={{ entered: page().path === '/inbox' }}>
|
||||||
<Icon name="inbox-white" class={styles.icon} />
|
<Icon name="inbox-white" class={styles.icon} />
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import type { Author } from '../../../graphql/schema/core.gen'
|
import type { Author } from '../../../graphql/schema/core.gen'
|
||||||
|
|
||||||
import { Meta } from '@solidjs/meta'
|
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { For, Show, createMemo, createSignal } from 'solid-js'
|
import { For, Show, createMemo, createSignal } from 'solid-js'
|
||||||
|
import { Meta } from '../../../context/meta'
|
||||||
|
|
||||||
import { useLocalize } from '../../../context/localize'
|
import { useLocalize } from '../../../context/localize'
|
||||||
import { useRouter } from '../../../stores/router'
|
import { useRouter } from '../../../stores/router'
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import type { Topic } from '../../../graphql/schema/core.gen'
|
import type { Topic } from '../../../graphql/schema/core.gen'
|
||||||
|
|
||||||
import { Meta } from '@solidjs/meta'
|
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { For, Show, createEffect, createMemo, createSignal } from 'solid-js'
|
import { For, Show, createEffect, createMemo, createSignal } from 'solid-js'
|
||||||
import { useLocalize } from '../../../context/localize'
|
import { useLocalize } from '../../../context/localize'
|
||||||
|
import { Meta } from '../../../context/meta'
|
||||||
|
import { useTopics } from '../../../context/topics'
|
||||||
import { useRouter } from '../../../stores/router'
|
import { useRouter } from '../../../stores/router'
|
||||||
import { setTopicsSort, useTopicsStore } from '../../../stores/zine/topics'
|
|
||||||
import { capitalize } from '../../../utils/capitalize'
|
import { capitalize } from '../../../utils/capitalize'
|
||||||
import { dummyFilter } from '../../../utils/dummyFilter'
|
import { dummyFilter } from '../../../utils/dummyFilter'
|
||||||
import { getImageUrl } from '../../../utils/getImageUrl'
|
import { getImageUrl } from '../../../utils/getImageUrl'
|
||||||
|
@ -33,11 +33,7 @@ export const AllTopics = (props: Props) => {
|
||||||
const [limit, setLimit] = createSignal(PAGE_SIZE)
|
const [limit, setLimit] = createSignal(PAGE_SIZE)
|
||||||
const ALPHABET =
|
const ALPHABET =
|
||||||
lang() === 'ru' ? [...'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ#'] : [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ#']
|
lang() === 'ru' ? [...'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ#'] : [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ#']
|
||||||
|
const { sortedTopics, setTopicsSort } = useTopics()
|
||||||
const { sortedTopics } = useTopicsStore({
|
|
||||||
topics: props.topics,
|
|
||||||
sortBy: searchParams().by || 'shouts',
|
|
||||||
})
|
|
||||||
|
|
||||||
createEffect(() => {
|
createEffect(() => {
|
||||||
if (!searchParams().by) {
|
if (!searchParams().by) {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import type { Author, Reaction, Shout, Topic } from '../../../graphql/schema/core.gen'
|
import type { Author, Reaction, Shout, Topic } from '../../../graphql/schema/core.gen'
|
||||||
|
|
||||||
import { getPagePath } from '@nanostores/router'
|
import { getPagePath } from '@nanostores/router'
|
||||||
import { Meta, Title } from '@solidjs/meta'
|
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { For, Match, Show, Switch, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
|
import { For, Match, Show, Switch, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
|
||||||
|
import { Meta, Title } from '../../../context/meta'
|
||||||
|
|
||||||
import { useFollowing } from '../../../context/following'
|
import { useFollowing } from '../../../context/following'
|
||||||
import { useLocalize } from '../../../context/localize'
|
import { useLocalize } from '../../../context/localize'
|
||||||
|
|
|
@ -192,7 +192,7 @@ export const Expo = (props: Props) => {
|
||||||
)}
|
)}
|
||||||
</For>
|
</For>
|
||||||
<Show when={reactedTopMonthArticles()?.length > 0} keyed={true}>
|
<Show when={reactedTopMonthArticles()?.length > 0} keyed={true}>
|
||||||
<ArticleCardSwiper title={t('Top month articles')} slides={reactedTopMonthArticles()} />
|
<ArticleCardSwiper title={t('Top month')} slides={reactedTopMonthArticles()} />
|
||||||
</Show>
|
</Show>
|
||||||
<For each={expoShouts().slice(LOAD_MORE_PAGE_SIZE, LOAD_MORE_PAGE_SIZE * 2)}>
|
<For each={expoShouts().slice(LOAD_MORE_PAGE_SIZE, LOAD_MORE_PAGE_SIZE * 2)}>
|
||||||
{(shout) => (
|
{(shout) => (
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
import { getPagePath } from '@nanostores/router'
|
import { getPagePath } from '@nanostores/router'
|
||||||
import { Meta } from '@solidjs/meta'
|
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
|
import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
|
||||||
|
|
||||||
import { useLocalize } from '../../../context/localize'
|
import { useLocalize } from '../../../context/localize'
|
||||||
|
import { Meta } from '../../../context/meta'
|
||||||
import { useReactions } from '../../../context/reactions'
|
import { useReactions } from '../../../context/reactions'
|
||||||
import { useSession } from '../../../context/session'
|
import { useSession } from '../../../context/session'
|
||||||
|
import { useTopics } from '../../../context/topics'
|
||||||
import { apiClient } from '../../../graphql/client/core'
|
import { apiClient } from '../../../graphql/client/core'
|
||||||
import type { Author, LoadShoutsOptions, Reaction, Shout } from '../../../graphql/schema/core.gen'
|
import type { Author, LoadShoutsOptions, Reaction, Shout } from '../../../graphql/schema/core.gen'
|
||||||
import { router, useRouter } from '../../../stores/router'
|
import { router, useRouter } from '../../../stores/router'
|
||||||
import { showModal } from '../../../stores/ui'
|
import { showModal } from '../../../stores/ui'
|
||||||
import { resetSortedArticles, useArticlesStore } from '../../../stores/zine/articles'
|
import { resetSortedArticles, useArticlesStore } from '../../../stores/zine/articles'
|
||||||
import { useTopAuthorsStore } from '../../../stores/zine/topAuthors'
|
import { useTopAuthorsStore } from '../../../stores/zine/topAuthors'
|
||||||
import { useTopicsStore } from '../../../stores/zine/topics'
|
|
||||||
import { getImageUrl } from '../../../utils/getImageUrl'
|
import { getImageUrl } from '../../../utils/getImageUrl'
|
||||||
import { byCreated } from '../../../utils/sortby'
|
import { byCreated } from '../../../utils/sortby'
|
||||||
import { CommentDate } from '../../Article/CommentDate'
|
import { CommentDate } from '../../Article/CommentDate'
|
||||||
|
@ -103,7 +103,7 @@ export const FeedView = (props: Props) => {
|
||||||
const { session } = useSession()
|
const { session } = useSession()
|
||||||
const { loadReactionsBy } = useReactions()
|
const { loadReactionsBy } = useReactions()
|
||||||
const { sortedArticles } = useArticlesStore()
|
const { sortedArticles } = useArticlesStore()
|
||||||
const { topTopics } = useTopicsStore()
|
const { topTopics } = useTopics()
|
||||||
const { topAuthors } = useTopAuthorsStore()
|
const { topAuthors } = useTopAuthorsStore()
|
||||||
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
|
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
|
||||||
const [topComments, setTopComments] = createSignal<Reaction[]>([])
|
const [topComments, setTopComments] = createSignal<Reaction[]>([])
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { getPagePath } from '@nanostores/router'
|
||||||
import { For, Show, createMemo, createSignal, onMount } from 'solid-js'
|
import { For, Show, createMemo, createSignal, onMount } from 'solid-js'
|
||||||
|
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { useTopics } from '../../context/topics'
|
||||||
import { Shout, Topic } from '../../graphql/schema/core.gen'
|
import { Shout, Topic } from '../../graphql/schema/core.gen'
|
||||||
import { router } from '../../stores/router'
|
import { router } from '../../stores/router'
|
||||||
import {
|
import {
|
||||||
|
@ -11,7 +12,6 @@ import {
|
||||||
useArticlesStore,
|
useArticlesStore,
|
||||||
} from '../../stores/zine/articles'
|
} from '../../stores/zine/articles'
|
||||||
import { useTopAuthorsStore } from '../../stores/zine/topAuthors'
|
import { useTopAuthorsStore } from '../../stores/zine/topAuthors'
|
||||||
import { useTopicsStore } from '../../stores/zine/topics'
|
|
||||||
import { capitalize } from '../../utils/capitalize'
|
import { capitalize } from '../../utils/capitalize'
|
||||||
import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll'
|
import { restoreScrollPosition, saveScrollPosition } from '../../utils/scroll'
|
||||||
import { splitToPages } from '../../utils/splitToPages'
|
import { splitToPages } from '../../utils/splitToPages'
|
||||||
|
@ -46,7 +46,7 @@ export const HomeView = (props: Props) => {
|
||||||
shouts: props.shouts,
|
shouts: props.shouts,
|
||||||
})
|
})
|
||||||
|
|
||||||
const { topTopics } = useTopicsStore()
|
const { topTopics } = useTopics()
|
||||||
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
|
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
|
||||||
const { topAuthors } = useTopAuthorsStore()
|
const { topAuthors } = useTopAuthorsStore()
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
|
@ -110,7 +110,7 @@ export const HomeView = (props: Props) => {
|
||||||
nodate={true}
|
nodate={true}
|
||||||
/>
|
/>
|
||||||
<Show when={topMonthArticles()}>
|
<Show when={topMonthArticles()}>
|
||||||
<ArticleCardSwiper title={t('Top month articles')} slides={topMonthArticles()} />
|
<ArticleCardSwiper title={t('Top month')} slides={topMonthArticles()} />
|
||||||
</Show>
|
</Show>
|
||||||
<Row2 articles={sortedArticles().slice(10, 12)} nodate={true} />
|
<Row2 articles={sortedArticles().slice(10, 12)} nodate={true} />
|
||||||
<RowShort articles={sortedArticles().slice(12, 16)} />
|
<RowShort articles={sortedArticles().slice(12, 16)} />
|
||||||
|
|
|
@ -6,11 +6,11 @@ import { createStore } from 'solid-js/store'
|
||||||
import { ShoutForm, useEditorContext } from '../../../context/editor'
|
import { ShoutForm, useEditorContext } from '../../../context/editor'
|
||||||
import { useLocalize } from '../../../context/localize'
|
import { useLocalize } from '../../../context/localize'
|
||||||
import { useSession } from '../../../context/session'
|
import { useSession } from '../../../context/session'
|
||||||
|
import { useTopics } from '../../../context/topics'
|
||||||
import { Topic } from '../../../graphql/schema/core.gen'
|
import { Topic } from '../../../graphql/schema/core.gen'
|
||||||
import { UploadedFile } from '../../../pages/types'
|
import { UploadedFile } from '../../../pages/types'
|
||||||
import { router } from '../../../stores/router'
|
import { router } from '../../../stores/router'
|
||||||
import { hideModal, showModal } from '../../../stores/ui'
|
import { hideModal, showModal } from '../../../stores/ui'
|
||||||
import { loadAllTopics, useTopicsStore } from '../../../stores/zine/topics'
|
|
||||||
import { TopicSelect, UploadModalContent } from '../../Editor'
|
import { TopicSelect, UploadModalContent } from '../../Editor'
|
||||||
import { Modal } from '../../Nav/Modal'
|
import { Modal } from '../../Nav/Modal'
|
||||||
import { Button } from '../../_shared/Button'
|
import { Button } from '../../_shared/Button'
|
||||||
|
@ -53,7 +53,7 @@ const emptyConfig = {
|
||||||
export const PublishSettings = (props: Props) => {
|
export const PublishSettings = (props: Props) => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
const { author } = useSession()
|
const { author } = useSession()
|
||||||
const { sortedTopics } = useTopicsStore()
|
const { sortedTopics } = useTopics()
|
||||||
const { showSnackbar } = useSnackbar()
|
const { showSnackbar } = useSnackbar()
|
||||||
const [topics, setTopics] = createSignal<Topic[]>(sortedTopics())
|
const [topics, setTopics] = createSignal<Topic[]>(sortedTopics())
|
||||||
|
|
||||||
|
@ -82,7 +82,6 @@ export const PublishSettings = (props: Props) => {
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
setSettingsForm(initialData())
|
setSettingsForm(initialData())
|
||||||
loadAllTopics()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
createEffect(() => setTopics(sortedTopics()))
|
createEffect(() => setTopics(sortedTopics()))
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import { LoadShoutsOptions, Shout, Topic } from '../../graphql/schema/core.gen'
|
import { LoadShoutsOptions, Shout, Topic } from '../../graphql/schema/core.gen'
|
||||||
|
|
||||||
import { Meta } from '@solidjs/meta'
|
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
|
import { For, Show, createEffect, createMemo, createSignal, on, onMount } from 'solid-js'
|
||||||
|
import { Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
import { useTopics } from '../../context/topics'
|
||||||
import { useRouter } from '../../stores/router'
|
import { useRouter } from '../../stores/router'
|
||||||
import { loadShouts, useArticlesStore } from '../../stores/zine/articles'
|
import { loadShouts, useArticlesStore } from '../../stores/zine/articles'
|
||||||
import { useAuthorsStore } from '../../stores/zine/authors'
|
import { useAuthorsStore } from '../../stores/zine/authors'
|
||||||
import { useTopicsStore } from '../../stores/zine/topics'
|
|
||||||
import { capitalize } from '../../utils/capitalize'
|
import { capitalize } from '../../utils/capitalize'
|
||||||
import { getImageUrl } from '../../utils/getImageUrl'
|
import { getImageUrl } from '../../utils/getImageUrl'
|
||||||
import { getDescription } from '../../utils/meta'
|
import { getDescription } from '../../utils/meta'
|
||||||
|
@ -43,7 +43,7 @@ export const TopicView = (props: Props) => {
|
||||||
const { searchParams, changeSearchParams } = useRouter<TopicsPageSearchParams>()
|
const { searchParams, changeSearchParams } = useRouter<TopicsPageSearchParams>()
|
||||||
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
|
const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false)
|
||||||
const { sortedArticles } = useArticlesStore({ shouts: props.shouts })
|
const { sortedArticles } = useArticlesStore({ shouts: props.shouts })
|
||||||
const { topicEntities } = useTopicsStore({ topics: [props.topic] })
|
const { topicEntities } = useTopics()
|
||||||
const { authorsByTopic } = useAuthorsStore()
|
const { authorsByTopic } = useAuthorsStore()
|
||||||
const [favoriteTopArticles, setFavoriteTopArticles] = createSignal<Shout[]>([])
|
const [favoriteTopArticles, setFavoriteTopArticles] = createSignal<Shout[]>([])
|
||||||
const [reactedTopMonthArticles, setReactedTopMonthArticles] = createSignal<Shout[]>([])
|
const [reactedTopMonthArticles, setReactedTopMonthArticles] = createSignal<Shout[]>([])
|
||||||
|
@ -216,7 +216,7 @@ export const TopicView = (props: Props) => {
|
||||||
wrapper={'author'}
|
wrapper={'author'}
|
||||||
/>
|
/>
|
||||||
<Show when={reactedTopMonthArticles()?.length > 0} keyed={true}>
|
<Show when={reactedTopMonthArticles()?.length > 0} keyed={true}>
|
||||||
<ArticleCardSwiper title={t('Top month articles')} slides={reactedTopMonthArticles()} />
|
<ArticleCardSwiper title={t('Top month')} slides={reactedTopMonthArticles()} />
|
||||||
</Show>
|
</Show>
|
||||||
<Beside
|
<Beside
|
||||||
beside={sortedArticles()[12]}
|
beside={sortedArticles()[12]}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import type { JSX } from 'solid-js'
|
import type { JSX } from 'solid-js'
|
||||||
|
|
||||||
import { Link } from '@solidjs/meta'
|
|
||||||
import { splitProps } from 'solid-js'
|
import { splitProps } from 'solid-js'
|
||||||
|
import { Link } from '../../../context/meta'
|
||||||
|
|
||||||
import { getImageUrl } from '../../../utils/getImageUrl'
|
import { getImageUrl } from '../../../utils/getImageUrl'
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import type { JSX } from 'solid-js'
|
import type { JSX } from 'solid-js'
|
||||||
|
|
||||||
import { Title } from '@solidjs/meta'
|
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
import { Show, createEffect, createSignal } from 'solid-js'
|
import { Show, createEffect, createSignal } from 'solid-js'
|
||||||
|
import { Title } from '../../context/meta'
|
||||||
|
|
||||||
import { Footer } from '../Discours/Footer'
|
import { Footer } from '../Discours/Footer'
|
||||||
import { Header } from '../Nav/Header'
|
import { Header } from '../Nav/Header'
|
||||||
|
|
|
@ -73,7 +73,7 @@
|
||||||
border: none;
|
border: none;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|
||||||
&:before {
|
&::before {
|
||||||
content: '';
|
content: '';
|
||||||
height: 100%;
|
height: 100%;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
|
|
@ -10,6 +10,8 @@ import { ShowOnlyOnClient } from '../ShowOnlyOnClient'
|
||||||
|
|
||||||
import { SwiperRef } from './swiper'
|
import { SwiperRef } from './swiper'
|
||||||
|
|
||||||
|
import { Row1 } from '../../Feed/Row1'
|
||||||
|
import { Row2 } from '../../Feed/Row2'
|
||||||
import styles from './Swiper.module.scss'
|
import styles from './Swiper.module.scss'
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
@ -42,71 +44,62 @@ export const ArticleCardSwiper = (props: Props) => {
|
||||||
<h2 class={styles.sliderTitle}>{props.title}</h2>
|
<h2 class={styles.sliderTitle}>{props.title}</h2>
|
||||||
</Show>
|
</Show>
|
||||||
<div class={styles.container}>
|
<div class={styles.container}>
|
||||||
<Show
|
<Show when={props.slides.length > 0}>
|
||||||
when={props.slides.length > 1}
|
<Show when={props.slides.length !== 1} fallback={<Row1 article={props.slides[0]} />}>
|
||||||
fallback={
|
<Show when={props.slides.length !== 2} fallback={<Row2 articles={props.slides} />}>
|
||||||
<ArticleCard
|
<div class={styles.holder}>
|
||||||
article={props.slides[0]}
|
<swiper-container
|
||||||
settings={{
|
ref={(el) => (mainSwipeRef.current = el)}
|
||||||
isFloorImportant: true,
|
centered-slides={true}
|
||||||
isWithCover: true,
|
observer={true}
|
||||||
nodate: true,
|
space-between={10}
|
||||||
}}
|
breakpoints={{
|
||||||
desktopCoverSize="L"
|
576: { spaceBetween: 20, slidesPerView: 1.5 },
|
||||||
/>
|
992: { spaceBetween: 52, slidesPerView: 1.5 },
|
||||||
}
|
}}
|
||||||
>
|
round-lengths={true}
|
||||||
<div class={styles.holder}>
|
loop={true}
|
||||||
<swiper-container
|
speed={800}
|
||||||
ref={(el) => (mainSwipeRef.current = el)}
|
autoplay={{
|
||||||
centered-slides={true}
|
disableOnInteraction: false,
|
||||||
observer={true}
|
delay: 6000,
|
||||||
space-between={10}
|
pauseOnMouseEnter: true,
|
||||||
breakpoints={{
|
}}
|
||||||
576: { spaceBetween: 20, slidesPerView: 1.5 },
|
>
|
||||||
992: { spaceBetween: 52, slidesPerView: 1.5 },
|
<For each={props.slides}>
|
||||||
}}
|
{(slide, index) => (
|
||||||
round-lengths={true}
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
loop={true}
|
// @ts-ignore
|
||||||
speed={800}
|
<swiper-slide virtual-index={index()}>
|
||||||
autoplay={{
|
<ArticleCard
|
||||||
disableOnInteraction: false,
|
article={slide}
|
||||||
delay: 6000,
|
settings={{
|
||||||
pauseOnMouseEnter: true,
|
additionalClass: 'swiper-slide',
|
||||||
}}
|
isFloorImportant: true,
|
||||||
>
|
isWithCover: true,
|
||||||
<For each={props.slides}>
|
nodate: true,
|
||||||
{(slide, index) => (
|
}}
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
desktopCoverSize="L"
|
||||||
// @ts-ignore
|
/>
|
||||||
<swiper-slide virtual-index={index()}>
|
</swiper-slide>
|
||||||
<ArticleCard
|
)}
|
||||||
article={slide}
|
</For>
|
||||||
settings={{
|
</swiper-container>
|
||||||
additionalClass: 'swiper-slide',
|
<div
|
||||||
isFloorImportant: true,
|
class={clsx(styles.navigation, styles.prev)}
|
||||||
isWithCover: true,
|
onClick={() => mainSwipeRef.current.swiper.slidePrev()}
|
||||||
nodate: true,
|
>
|
||||||
}}
|
<Icon name="swiper-l-arr" class={styles.icon} />
|
||||||
desktopCoverSize="L"
|
</div>
|
||||||
/>
|
<div
|
||||||
</swiper-slide>
|
class={clsx(styles.navigation, styles.next)}
|
||||||
)}
|
onClick={() => mainSwipeRef.current.swiper.slideNext()}
|
||||||
</For>
|
>
|
||||||
</swiper-container>
|
<Icon name="swiper-r-arr" class={styles.icon} />
|
||||||
<div
|
</div>
|
||||||
class={clsx(styles.navigation, styles.prev)}
|
</div>
|
||||||
onClick={() => mainSwipeRef.current.swiper.slidePrev()}
|
</Show>
|
||||||
>
|
</Show>
|
||||||
<Icon name="swiper-l-arr" class={styles.icon} />
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class={clsx(styles.navigation, styles.next)}
|
|
||||||
onClick={() => mainSwipeRef.current.swiper.slideNext()}
|
|
||||||
>
|
|
||||||
<Icon name="swiper-r-arr" class={styles.icon} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
275
src/context/meta.tsx
Normal file
275
src/context/meta.tsx
Normal file
|
@ -0,0 +1,275 @@
|
||||||
|
import {
|
||||||
|
Component,
|
||||||
|
JSX,
|
||||||
|
ParentComponent,
|
||||||
|
createContext,
|
||||||
|
createRenderEffect,
|
||||||
|
createUniqueId,
|
||||||
|
onCleanup,
|
||||||
|
sharedConfig,
|
||||||
|
useContext,
|
||||||
|
} from 'solid-js'
|
||||||
|
import { escape as escapeMeta, isServer, spread, ssr, useAssets } from 'solid-js/web'
|
||||||
|
|
||||||
|
export const MetaContext = createContext<MetaContextType>()
|
||||||
|
|
||||||
|
interface TagDescription {
|
||||||
|
tag: string
|
||||||
|
props: Record<string, unknown>
|
||||||
|
setting?: { close?: boolean; escape?: boolean }
|
||||||
|
id: string
|
||||||
|
name?: string
|
||||||
|
ref?: Element
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MetaContextType {
|
||||||
|
addTag: (tag: TagDescription) => number
|
||||||
|
removeTag: (tag: TagDescription, index: number) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
const cascadingTags = ['title', 'meta']
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/semantics.html#the-title-element
|
||||||
|
const titleTagProperties: string[] = []
|
||||||
|
|
||||||
|
const metaTagProperties: string[] =
|
||||||
|
// https://html.spec.whatwg.org/multipage/semantics.html#the-meta-element
|
||||||
|
['name', 'http-equiv', 'content', 'charset', 'media']
|
||||||
|
// additional properties
|
||||||
|
.concat(['property'])
|
||||||
|
|
||||||
|
const getTagKey = (tag: TagDescription, properties: string[]) => {
|
||||||
|
// pick allowed properties and sort them
|
||||||
|
const tagProps = Object.fromEntries(
|
||||||
|
Object.entries(tag.props)
|
||||||
|
.filter(([k]) => properties.includes(k))
|
||||||
|
.sort(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// treat `property` as `name` for meta tags
|
||||||
|
if (Object.hasOwn(tagProps, 'name') || Object.hasOwn(tagProps, 'property')) {
|
||||||
|
tagProps.name = tagProps.name || tagProps.property
|
||||||
|
tagProps.property = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
// concat tag name and properties as unique key for this tag
|
||||||
|
return tag.tag + JSON.stringify(tagProps)
|
||||||
|
}
|
||||||
|
|
||||||
|
function initClientProvider() {
|
||||||
|
if (!sharedConfig.context) {
|
||||||
|
const ssrTags = document.head.querySelectorAll('[data-sm]')
|
||||||
|
// `forEach` on `NodeList` is not supported in Googlebot, so use a workaround
|
||||||
|
Array.prototype.forEach.call(ssrTags, (ssrTag: Node) => ssrTag.parentNode?.removeChild(ssrTag))
|
||||||
|
}
|
||||||
|
|
||||||
|
const cascadedTagInstances = new Map()
|
||||||
|
// TODO: use one element for all tags of the same type, just swap out
|
||||||
|
// where the props get applied
|
||||||
|
function getElement(tag: TagDescription) {
|
||||||
|
if (tag.ref) {
|
||||||
|
return tag.ref
|
||||||
|
}
|
||||||
|
let el = document.querySelector(`[data-sm="${tag.id}"]`)
|
||||||
|
if (el) {
|
||||||
|
if (el.tagName.toLowerCase() !== tag.tag) {
|
||||||
|
if (el.parentNode) {
|
||||||
|
// remove the old tag
|
||||||
|
el.parentNode.removeChild(el)
|
||||||
|
}
|
||||||
|
// add the new tag
|
||||||
|
el = document.createElement(tag.tag)
|
||||||
|
}
|
||||||
|
// use the old tag
|
||||||
|
el.removeAttribute('data-sm')
|
||||||
|
} else {
|
||||||
|
// create a new tag
|
||||||
|
el = document.createElement(tag.tag)
|
||||||
|
}
|
||||||
|
return el
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
addTag(tag: TagDescription) {
|
||||||
|
if (cascadingTags.indexOf(tag.tag) !== -1) {
|
||||||
|
const properties = tag.tag === 'title' ? titleTagProperties : metaTagProperties
|
||||||
|
const tagKey = getTagKey(tag, properties)
|
||||||
|
|
||||||
|
// only cascading tags need to be kept as singletons
|
||||||
|
if (!cascadedTagInstances.has(tagKey)) {
|
||||||
|
cascadedTagInstances.set(tagKey, [])
|
||||||
|
}
|
||||||
|
|
||||||
|
let instances = cascadedTagInstances.get(tagKey)
|
||||||
|
const index = instances.length
|
||||||
|
|
||||||
|
instances = [...instances, tag]
|
||||||
|
|
||||||
|
// track indices synchronously
|
||||||
|
cascadedTagInstances.set(tagKey, instances)
|
||||||
|
|
||||||
|
const element = getElement(tag)
|
||||||
|
tag.ref = element
|
||||||
|
|
||||||
|
spread(element, tag.props)
|
||||||
|
|
||||||
|
let lastVisited = null
|
||||||
|
for (let i = index - 1; i >= 0; i--) {
|
||||||
|
if (instances[i] != null) {
|
||||||
|
lastVisited = instances[i]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.parentNode !== document.head) {
|
||||||
|
document.head.appendChild(element)
|
||||||
|
}
|
||||||
|
if (lastVisited?.ref?.parentNode) {
|
||||||
|
document.head?.removeChild(lastVisited.ref)
|
||||||
|
}
|
||||||
|
|
||||||
|
return index
|
||||||
|
}
|
||||||
|
|
||||||
|
const element = getElement(tag)
|
||||||
|
tag.ref = element
|
||||||
|
|
||||||
|
spread(element, tag.props)
|
||||||
|
|
||||||
|
if (element.parentNode !== document.head) {
|
||||||
|
document.head.appendChild(element)
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1
|
||||||
|
},
|
||||||
|
removeTag(tag: TagDescription, index: number) {
|
||||||
|
const properties = tag.tag === 'title' ? titleTagProperties : metaTagProperties
|
||||||
|
const tagKey = getTagKey(tag, properties)
|
||||||
|
|
||||||
|
if (tag.ref) {
|
||||||
|
const t = cascadedTagInstances.get(tagKey)
|
||||||
|
if (t) {
|
||||||
|
if (tag.ref.parentNode) {
|
||||||
|
tag.ref.parentNode.removeChild(tag.ref)
|
||||||
|
for (let i = index - 1; i >= 0; i--) {
|
||||||
|
if (t[i] != null) {
|
||||||
|
document.head.appendChild(t[i].ref)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t[index] = null
|
||||||
|
cascadedTagInstances.set(tagKey, t)
|
||||||
|
} else if (tag.ref.parentNode) {
|
||||||
|
tag.ref.parentNode.removeChild(tag.ref)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function initServerProvider() {
|
||||||
|
const tags: TagDescription[] = []
|
||||||
|
useAssets(() => {
|
||||||
|
const rendered = renderTags(tags)
|
||||||
|
return ssr(rendered as string) as unknown as Element
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
addTag(tagDesc: TagDescription) {
|
||||||
|
// tweak only cascading tags
|
||||||
|
if (cascadingTags.indexOf(tagDesc.tag) !== -1) {
|
||||||
|
const properties = tagDesc.tag === 'title' ? titleTagProperties : metaTagProperties
|
||||||
|
const tagDescKey = getTagKey(tagDesc, properties)
|
||||||
|
const index = tags.findIndex(
|
||||||
|
(prev) => prev.tag === tagDesc.tag && getTagKey(prev, properties) === tagDescKey,
|
||||||
|
)
|
||||||
|
if (index !== -1) {
|
||||||
|
tags.splice(index, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tags.push(tagDesc)
|
||||||
|
return tags.length
|
||||||
|
},
|
||||||
|
// biome-ignore lint/suspicious/noEmptyBlockStatements: initial value
|
||||||
|
removeTag(_tag: TagDescription, _index: number) {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const MetaProvider: ParentComponent = (props) => {
|
||||||
|
const actions = isServer ? initServerProvider() : initClientProvider()
|
||||||
|
return <MetaContext.Provider value={actions as MetaContextType}>{props.children}</MetaContext.Provider>
|
||||||
|
}
|
||||||
|
|
||||||
|
const MetaTag = (
|
||||||
|
tag: string,
|
||||||
|
props: { [k: string]: string },
|
||||||
|
setting?: { escape?: boolean; close?: boolean },
|
||||||
|
) => {
|
||||||
|
useHead({
|
||||||
|
tag,
|
||||||
|
props,
|
||||||
|
setting,
|
||||||
|
id: createUniqueId(),
|
||||||
|
get name() {
|
||||||
|
return props.name || props.property
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useHead(tagDesc: TagDescription) {
|
||||||
|
const c = useContext(MetaContext)
|
||||||
|
if (!c) throw new Error('<MetaProvider /> should be in the tree')
|
||||||
|
|
||||||
|
createRenderEffect(() => {
|
||||||
|
const index = c?.addTag(tagDesc)
|
||||||
|
onCleanup(() => c?.removeTag(tagDesc, index))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderTags(tags: TagDescription[]) {
|
||||||
|
return tags
|
||||||
|
.map((tag) => {
|
||||||
|
const keys = Object.keys(tag.props)
|
||||||
|
const props = keys
|
||||||
|
.map((k) =>
|
||||||
|
k === 'children'
|
||||||
|
? ''
|
||||||
|
: ` ${k}="${
|
||||||
|
// @ts-expect-error
|
||||||
|
escapeMeta(tag.props[k], true)
|
||||||
|
}"`,
|
||||||
|
)
|
||||||
|
.join('')
|
||||||
|
const children = tag.props.children
|
||||||
|
if (tag.setting?.close) {
|
||||||
|
return `<${tag.tag} data-sm="${tag.id}"${props}>${
|
||||||
|
// @ts-expect-error
|
||||||
|
tag.setting?.escape ? escapeMeta(children) : children || ''
|
||||||
|
}</${tag.tag}>`
|
||||||
|
}
|
||||||
|
return `<${tag.tag} data-sm="${tag.id}"${props}/>`
|
||||||
|
})
|
||||||
|
.join('')
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Title: Component<JSX.HTMLAttributes<HTMLTitleElement>> = (props) =>
|
||||||
|
MetaTag('title', props as { [k: string]: string }, { escape: true, close: true })
|
||||||
|
|
||||||
|
export const Style: Component<JSX.StyleHTMLAttributes<HTMLStyleElement>> = (props) =>
|
||||||
|
MetaTag('style', props as { [k: string]: string }, { close: true })
|
||||||
|
|
||||||
|
export const Meta: Component<JSX.MetaHTMLAttributes<HTMLMetaElement>> = (props) =>
|
||||||
|
MetaTag('meta', props as { [k: string]: string })
|
||||||
|
|
||||||
|
export const Link: Component<JSX.LinkHTMLAttributes<HTMLLinkElement>> = (props) =>
|
||||||
|
MetaTag('link', props as { [k: string]: string })
|
||||||
|
|
||||||
|
export const Base: Component<JSX.BaseHTMLAttributes<HTMLBaseElement>> = (props) =>
|
||||||
|
MetaTag('base', props as { [k: string]: string })
|
||||||
|
|
||||||
|
export const Stylesheet: Component<Omit<JSX.LinkHTMLAttributes<HTMLLinkElement>, 'rel'>> = (props) => (
|
||||||
|
<Link rel="stylesheet" {...props} />
|
||||||
|
)
|
29
src/context/seen.tsx
Normal file
29
src/context/seen.tsx
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
import { makePersisted } from '@solid-primitives/storage'
|
||||||
|
import { Accessor, JSX, createContext, createSignal, useContext } from 'solid-js'
|
||||||
|
|
||||||
|
type SeenContextType = {
|
||||||
|
seen: Accessor<{ [slug: string]: number }>
|
||||||
|
addSeen: (slug: string) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
const SeenContext = createContext<SeenContextType>()
|
||||||
|
export function useSeen() {
|
||||||
|
return useContext(SeenContext)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SeenProvider = (props: { children: JSX.Element }) => {
|
||||||
|
const [seen, setSeen] = makePersisted(createSignal<{ [slug: string]: number }>({}), {
|
||||||
|
name: 'discoursio-seen',
|
||||||
|
})
|
||||||
|
|
||||||
|
const addSeen = async (slug: string) => {
|
||||||
|
setSeen((prev) => {
|
||||||
|
const newSeen = { ...prev, [slug]: Date.now() }
|
||||||
|
return newSeen
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const value: SeenContextType = { seen, addSeen }
|
||||||
|
|
||||||
|
return <SeenContext.Provider value={value}>{props.children}</SeenContext.Provider>
|
||||||
|
}
|
|
@ -1,10 +1,19 @@
|
||||||
|
import { createLazyMemo } from '@solid-primitives/memo'
|
||||||
import { openDB } from 'idb'
|
import { openDB } from 'idb'
|
||||||
import { Accessor, JSX, createContext, createSignal, onMount, useContext } from 'solid-js'
|
import { Accessor, JSX, createContext, createMemo, createSignal, onMount, useContext } from 'solid-js'
|
||||||
import { apiClient } from '../graphql/client/core'
|
import { apiClient } from '../graphql/client/core'
|
||||||
import { Topic } from '../graphql/schema/core.gen'
|
import { Topic } from '../graphql/schema/core.gen'
|
||||||
|
import { useRouter } from '../stores/router'
|
||||||
|
import { byTopicStatDesc } from '../utils/sortby'
|
||||||
|
|
||||||
type TopicsContextType = {
|
type TopicsContextType = {
|
||||||
topics: Accessor<Topic[]>
|
topicEntities: Accessor<{ [topicSlug: string]: Topic }>
|
||||||
|
sortedTopics: Accessor<Topic[]>
|
||||||
|
randomTopics: Accessor<Topic[]>
|
||||||
|
topTopics: Accessor<Topic[]>
|
||||||
|
setTopicsSort: (sortBy: string) => void
|
||||||
|
addTopics: (topics: Topic[]) => void
|
||||||
|
loadTopics: () => Promise<Topic[]>
|
||||||
}
|
}
|
||||||
|
|
||||||
const TopicsContext = createContext<TopicsContextType>()
|
const TopicsContext = createContext<TopicsContextType>()
|
||||||
|
@ -25,11 +34,13 @@ const setupIndexedDB = async () => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const getTopicsFromIndexedDB = (db) => {
|
const getTopicsFromIndexedDB = async (db) => {
|
||||||
const tx = db.transaction(STORE_NAME, 'readonly')
|
const tx = db.transaction(STORE_NAME, 'readonly')
|
||||||
const store = tx.objectStore(STORE_NAME)
|
const store = tx.objectStore(STORE_NAME)
|
||||||
return store.getAll()
|
const topics = await store.getAll()
|
||||||
|
return { topics, timestamp: tx.done }
|
||||||
}
|
}
|
||||||
|
|
||||||
const saveTopicsToIndexedDB = async (db, topics) => {
|
const saveTopicsToIndexedDB = async (db, topics) => {
|
||||||
const tx = db.transaction(STORE_NAME, 'readwrite')
|
const tx = db.transaction(STORE_NAME, 'readwrite')
|
||||||
const store = tx.objectStore(STORE_NAME)
|
const store = tx.objectStore(STORE_NAME)
|
||||||
|
@ -40,20 +51,93 @@ const saveTopicsToIndexedDB = async (db, topics) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const TopicsProvider = (props: { children: JSX.Element }) => {
|
export const TopicsProvider = (props: { children: JSX.Element }) => {
|
||||||
|
const [topicEntities, setTopicEntities] = createSignal<{ [topicSlug: string]: Topic }>({})
|
||||||
|
const [sortAllBy, setSortAllBy] = createSignal<'shouts' | 'followers' | 'authors' | 'title'>('shouts')
|
||||||
const [randomTopics, setRandomTopics] = createSignal<Topic[]>([])
|
const [randomTopics, setRandomTopics] = createSignal<Topic[]>([])
|
||||||
|
|
||||||
|
const sortedTopics = createLazyMemo<Topic[]>(() => {
|
||||||
|
const topics = Object.values(topicEntities())
|
||||||
|
const { changeSearchParams } = useRouter()
|
||||||
|
switch (sortAllBy()) {
|
||||||
|
case 'followers': {
|
||||||
|
topics.sort(byTopicStatDesc('followers'))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
case 'shouts': {
|
||||||
|
topics.sort(byTopicStatDesc('shouts'))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
case 'authors': {
|
||||||
|
topics.sort(byTopicStatDesc('authors'))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
case 'title': {
|
||||||
|
topics.sort((a, b) => a.title.localeCompare(b.title))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
topics.sort(byTopicStatDesc('shouts'))
|
||||||
|
changeSearchParams({ by: 'shouts' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return topics
|
||||||
|
})
|
||||||
|
|
||||||
|
const topTopics = createMemo(() => {
|
||||||
|
const topics = Object.values(topicEntities())
|
||||||
|
topics.sort(byTopicStatDesc('shouts'))
|
||||||
|
return topics
|
||||||
|
})
|
||||||
|
|
||||||
|
const addTopics = (...args: Topic[][]) => {
|
||||||
|
const allTopics = args.flatMap((topics) => (topics || []).filter(Boolean))
|
||||||
|
|
||||||
|
const newTopicEntities = allTopics.reduce(
|
||||||
|
(acc, topic) => {
|
||||||
|
acc[topic.slug] = topic
|
||||||
|
return acc
|
||||||
|
},
|
||||||
|
{} as Record<string, Topic>,
|
||||||
|
)
|
||||||
|
|
||||||
|
setTopicEntities((prevTopicEntities) => {
|
||||||
|
return {
|
||||||
|
...prevTopicEntities,
|
||||||
|
...newTopicEntities,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const [db, setDb] = createSignal()
|
||||||
|
const loadTopics = async () => {
|
||||||
|
const ttt = await apiClient.getAllTopics()
|
||||||
|
await saveTopicsToIndexedDB(db(), ttt)
|
||||||
|
return ttt
|
||||||
|
}
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
const db = await setupIndexedDB()
|
const db = await setupIndexedDB()
|
||||||
let topics = getTopicsFromIndexedDB(db)
|
setDb(db)
|
||||||
|
let { topics, timestamp } = await getTopicsFromIndexedDB(db)
|
||||||
|
|
||||||
if (topics.length === 0) {
|
if (topics.length < 100 || Date.now() - timestamp > 3600000) {
|
||||||
topics = await apiClient.getAllTopics()
|
const newTopics = await loadTopics()
|
||||||
await saveTopicsToIndexedDB(db, topics)
|
await saveTopicsToIndexedDB(db, newTopics)
|
||||||
|
topics = newTopics
|
||||||
}
|
}
|
||||||
|
addTopics(topics)
|
||||||
setRandomTopics(topics)
|
setRandomTopics(topics)
|
||||||
})
|
})
|
||||||
|
|
||||||
const value: TopicsContextType = { topics: randomTopics }
|
const value: TopicsContextType = {
|
||||||
|
setTopicsSort: setSortAllBy,
|
||||||
|
topicEntities,
|
||||||
|
sortedTopics,
|
||||||
|
randomTopics,
|
||||||
|
topTopics,
|
||||||
|
addTopics,
|
||||||
|
loadTopics,
|
||||||
|
}
|
||||||
|
|
||||||
return <TopicsContext.Provider value={value}>{props.children}</TopicsContext.Provider>
|
return <TopicsContext.Provider value={value}>{props.children}</TopicsContext.Provider>
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { Donate } from '../../components/Discours/Donate'
|
import { Donate } from '../../components/Discours/Donate'
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { Feedback } from '../../components/Discours/Feedback'
|
import { Feedback } from '../../components/Discours/Feedback'
|
||||||
import { Modal } from '../../components/Nav/Modal'
|
import { Modal } from '../../components/Nav/Modal'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Meta } from '@solidjs/meta'
|
import { Meta } from '../../context/meta'
|
||||||
|
|
||||||
import { StaticPage } from '../../components/Views/StaticPage'
|
import { StaticPage } from '../../components/Views/StaticPage'
|
||||||
import { useLocalize } from '../../context/localize'
|
import { useLocalize } from '../../context/localize'
|
||||||
|
|
|
@ -1,29 +1,15 @@
|
||||||
import type { PageProps } from './types'
|
|
||||||
|
|
||||||
import { createSignal, onMount } from 'solid-js'
|
|
||||||
|
|
||||||
import { AllTopics } from '../components/Views/AllTopics'
|
import { AllTopics } from '../components/Views/AllTopics'
|
||||||
import { PageLayout } from '../components/_shared/PageLayout'
|
import { PageLayout } from '../components/_shared/PageLayout'
|
||||||
import { useLocalize } from '../context/localize'
|
import { useLocalize } from '../context/localize'
|
||||||
import { loadAllTopics } from '../stores/zine/topics'
|
import { useTopics } from '../context/topics'
|
||||||
|
|
||||||
export const AllTopicsPage = (props: PageProps) => {
|
export const AllTopicsPage = () => {
|
||||||
const { t } = useLocalize()
|
const { t } = useLocalize()
|
||||||
|
const { sortedTopics } = useTopics()
|
||||||
const [isLoaded, setIsLoaded] = createSignal<boolean>(Boolean(props.allTopics))
|
|
||||||
|
|
||||||
onMount(async () => {
|
|
||||||
if (isLoaded()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
await loadAllTopics()
|
|
||||||
setIsLoaded(true)
|
|
||||||
})
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageLayout title={t('Themes and plots')}>
|
<PageLayout title={t('Themes and plots')}>
|
||||||
<AllTopics isLoaded={isLoaded()} topics={props.allTopics} />
|
<AllTopics isLoaded={!!sortedTopics()?.length} topics={sortedTopics()} />
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { redirectPage } from '@nanostores/router'
|
import { redirectPage } from '@nanostores/router'
|
||||||
import { Meta } from '@solidjs/meta'
|
|
||||||
import { clsx } from 'clsx'
|
import { clsx } from 'clsx'
|
||||||
|
import { Meta } from '../context/meta'
|
||||||
|
|
||||||
import { AuthGuard } from '../components/AuthGuard'
|
import { AuthGuard } from '../components/AuthGuard'
|
||||||
import { Button } from '../components/_shared/Button'
|
import { Button } from '../components/_shared/Button'
|
||||||
|
|
|
@ -2,13 +2,12 @@ import type { PageProps } from './types'
|
||||||
|
|
||||||
import { Show, createSignal, onCleanup, onMount } from 'solid-js'
|
import { Show, createSignal, onCleanup, onMount } from 'solid-js'
|
||||||
|
|
||||||
import { HomeView, PRERENDERED_ARTICLES_COUNT, RANDOM_TOPICS_COUNT } from '../components/Views/Home'
|
import { HomeView, PRERENDERED_ARTICLES_COUNT } from '../components/Views/Home'
|
||||||
import { Loading } from '../components/_shared/Loading'
|
import { Loading } from '../components/_shared/Loading'
|
||||||
import { PageLayout } from '../components/_shared/PageLayout'
|
import { PageLayout } from '../components/_shared/PageLayout'
|
||||||
import { useLocalize } from '../context/localize'
|
import { useLocalize } from '../context/localize'
|
||||||
import { ReactionsProvider } from '../context/reactions'
|
import { ReactionsProvider } from '../context/reactions'
|
||||||
import { loadShouts, resetSortedArticles } from '../stores/zine/articles'
|
import { loadShouts, resetSortedArticles } from '../stores/zine/articles'
|
||||||
import { loadRandomTopics } from '../stores/zine/topics'
|
|
||||||
|
|
||||||
export const HomePage = (props: PageProps) => {
|
export const HomePage = (props: PageProps) => {
|
||||||
const [isLoaded, setIsLoaded] = createSignal(Boolean(props.homeShouts))
|
const [isLoaded, setIsLoaded] = createSignal(Boolean(props.homeShouts))
|
||||||
|
@ -19,10 +18,7 @@ export const HomePage = (props: PageProps) => {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
await Promise.all([
|
await loadShouts({ filters: { featured: true }, limit: PRERENDERED_ARTICLES_COUNT })
|
||||||
loadShouts({ filters: { featured: true }, limit: PRERENDERED_ARTICLES_COUNT }),
|
|
||||||
loadRandomTopics({ amount: RANDOM_TOPICS_COUNT }),
|
|
||||||
])
|
|
||||||
|
|
||||||
setIsLoaded(true)
|
setIsLoaded(true)
|
||||||
})
|
})
|
||||||
|
|
|
@ -8,7 +8,6 @@ import { PageLayout } from '../components/_shared/PageLayout'
|
||||||
import { ReactionsProvider } from '../context/reactions'
|
import { ReactionsProvider } from '../context/reactions'
|
||||||
import { useRouter } from '../stores/router'
|
import { useRouter } from '../stores/router'
|
||||||
import { loadShouts, resetSortedArticles } from '../stores/zine/articles'
|
import { loadShouts, resetSortedArticles } from '../stores/zine/articles'
|
||||||
import { loadTopic } from '../stores/zine/topics'
|
|
||||||
|
|
||||||
export const TopicPage = (props: PageProps) => {
|
export const TopicPage = (props: PageProps) => {
|
||||||
const { page } = useRouter()
|
const { page } = useRouter()
|
||||||
|
@ -25,7 +24,6 @@ export const TopicPage = (props: PageProps) => {
|
||||||
limit: PRERENDERED_ARTICLES_COUNT,
|
limit: PRERENDERED_ARTICLES_COUNT,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
}),
|
}),
|
||||||
loadTopic({ slug: slug() }),
|
|
||||||
])
|
])
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
import { createStorageSignal } from '@solid-primitives/storage'
|
|
||||||
|
|
||||||
// TODO: use indexedDB here
|
|
||||||
export const [seen, setSeen] = createStorageSignal<{ [slug: string]: Date }>('seen', {})
|
|
||||||
export const addSeen = (slug) => setSeen({ ...seen(), [slug]: Date.now() })
|
|
||||||
|
|
||||||
export const useSeenStore = (initialData: { [slug: string]: Date } = {}) => {
|
|
||||||
setSeen({ ...seen(), ...initialData })
|
|
||||||
|
|
||||||
return {
|
|
||||||
seen,
|
|
||||||
setSeen,
|
|
||||||
addSeen,
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,110 +0,0 @@
|
||||||
import type { Topic } from '../../graphql/schema/core.gen'
|
|
||||||
|
|
||||||
import { createLazyMemo } from '@solid-primitives/memo'
|
|
||||||
import { createMemo, createSignal } from 'solid-js'
|
|
||||||
|
|
||||||
import { apiClient } from '../../graphql/client/core'
|
|
||||||
import { byTopicStatDesc } from '../../utils/sortby'
|
|
||||||
import { useRouter } from '../router'
|
|
||||||
|
|
||||||
export type TopicsSortBy = 'followers' | 'title' | 'authors' | 'shouts'
|
|
||||||
|
|
||||||
const [sortAllBy, setSortAllBy] = createSignal<TopicsSortBy>('shouts')
|
|
||||||
|
|
||||||
export const setTopicsSort = (sortBy: TopicsSortBy) => setSortAllBy(sortBy)
|
|
||||||
|
|
||||||
const [topicEntities, setTopicEntities] = createSignal<{ [topicSlug: string]: Topic }>({})
|
|
||||||
const [randomTopics, setRandomTopics] = createSignal<Topic[]>([])
|
|
||||||
|
|
||||||
const sortedTopics = createLazyMemo<Topic[]>(() => {
|
|
||||||
const topics = Object.values(topicEntities())
|
|
||||||
const { changeSearchParams } = useRouter()
|
|
||||||
switch (sortAllBy()) {
|
|
||||||
case 'followers': {
|
|
||||||
// console.debug('[store.topics] sorted by followers')
|
|
||||||
topics.sort(byTopicStatDesc('followers'))
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'shouts': {
|
|
||||||
// log.debug(`sorted by shouts`)
|
|
||||||
topics.sort(byTopicStatDesc('shouts'))
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'authors': {
|
|
||||||
// log.debug(`sorted by authors`)
|
|
||||||
topics.sort(byTopicStatDesc('authors'))
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'title': {
|
|
||||||
// console.debug('[store.topics] sorted by title')
|
|
||||||
topics.sort((a, b) => a.title.localeCompare(b.title))
|
|
||||||
break
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
topics.sort(byTopicStatDesc('shouts'))
|
|
||||||
changeSearchParams({ by: 'shouts' })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return topics
|
|
||||||
})
|
|
||||||
|
|
||||||
const topTopics = createMemo(() => {
|
|
||||||
const topics = Object.values(topicEntities())
|
|
||||||
topics.sort(byTopicStatDesc('shouts'))
|
|
||||||
return topics
|
|
||||||
})
|
|
||||||
|
|
||||||
const addTopics = (...args: Topic[][]) => {
|
|
||||||
const allTopics = args.flatMap((topics) => (topics || []).filter(Boolean))
|
|
||||||
|
|
||||||
const newTopicEntities = allTopics.reduce(
|
|
||||||
(acc, topic) => {
|
|
||||||
acc[topic.slug] = topic
|
|
||||||
return acc
|
|
||||||
},
|
|
||||||
{} as Record<string, Topic>,
|
|
||||||
)
|
|
||||||
|
|
||||||
setTopicEntities((prevTopicEntities) => {
|
|
||||||
return {
|
|
||||||
...prevTopicEntities,
|
|
||||||
...newTopicEntities,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export const loadAllTopics = async (): Promise<void> => {
|
|
||||||
const topics = await apiClient.getAllTopics()
|
|
||||||
addTopics(topics)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const loadRandomTopics = async ({ amount }: { amount: number }): Promise<void> => {
|
|
||||||
const topics = await apiClient.getRandomTopics({ amount })
|
|
||||||
setRandomTopics(topics)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const loadTopic = async ({ slug }: { slug: string }): Promise<void> => {
|
|
||||||
const topic = await apiClient.getTopic({ slug })
|
|
||||||
addTopics([topic])
|
|
||||||
}
|
|
||||||
|
|
||||||
type InitialState = {
|
|
||||||
topics?: Topic[]
|
|
||||||
randomTopics?: Topic[]
|
|
||||||
sortBy?: TopicsSortBy
|
|
||||||
}
|
|
||||||
|
|
||||||
export const useTopicsStore = (initialState: InitialState = {}) => {
|
|
||||||
if (initialState.sortBy) {
|
|
||||||
setSortAllBy(initialState.sortBy)
|
|
||||||
}
|
|
||||||
|
|
||||||
addTopics(initialState.topics, initialState.randomTopics)
|
|
||||||
|
|
||||||
if (initialState.randomTopics) {
|
|
||||||
setRandomTopics(initialState.randomTopics)
|
|
||||||
}
|
|
||||||
|
|
||||||
return { topicEntities, sortedTopics, randomTopics, topTopics }
|
|
||||||
}
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { Shout } from '../graphql/schema/core.gen'
|
import { Shout } from '../graphql/schema/core.gen'
|
||||||
|
|
||||||
const MAX_DESCRIPTION_LENGTH = 150
|
const MAX_DESCRIPTION_LENGTH = 150
|
||||||
|
|
||||||
export const getDescription = (body: string): string => {
|
export const getDescription = (body: string): string => {
|
||||||
if (!body) {
|
if (!body) {
|
||||||
return ''
|
return ''
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import ssrPlugin from 'vike/plugin'
|
import ssrPlugin from 'vike/plugin'
|
||||||
import { defineConfig } from 'vite'
|
import { defineConfig } from 'vite'
|
||||||
import mkcert from 'vite-plugin-mkcert'
|
import mkcert from 'vite-plugin-mkcert'
|
||||||
import { nodePolyfills } from 'vite-plugin-node-polyfills';
|
import { nodePolyfills } from 'vite-plugin-node-polyfills'
|
||||||
import sassDts from 'vite-plugin-sass-dts'
|
import sassDts from 'vite-plugin-sass-dts'
|
||||||
import solidPlugin from 'vite-plugin-solid'
|
import solidPlugin from 'vite-plugin-solid'
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user