From 63f2bdbe6093fdd022cc71feee17e0c3f10f33d2 Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Wed, 10 Jan 2024 02:00:38 +0100 Subject: [PATCH] Integrated channel filter, partially restored actor bio. --- components/actors/bio.vue | 629 +++++++++++++++++++++++++++++++ components/actors/tile.vue | 10 +- components/filters/actors.vue | 8 +- components/filters/channels.vue | 101 ++--- components/filters/countries.vue | 10 +- components/filters/filters.vue | 15 + components/loading/ellipsis.vue | 90 +++++ components/scenes/scenes.vue | 68 +++- package-lock.json | 155 +++++++- package.json | 2 + pages/actors/@actorId/+Page.vue | 100 ++++- pages/scene/+Page.vue | 10 +- renderer/+onRenderHtml.js | 12 +- renderer/container.vue | 2 + src/actors.js | 44 ++- src/scenes.js | 52 ++- src/web/scenes.js | 13 +- {src => utils}/format.js | 0 utils/media-path.js | 59 +++ 19 files changed, 1221 insertions(+), 159 deletions(-) create mode 100644 components/actors/bio.vue create mode 100755 components/loading/ellipsis.vue rename {src => utils}/format.js (100%) create mode 100644 utils/media-path.js diff --git a/components/actors/bio.vue b/components/actors/bio.vue new file mode 100644 index 0000000..3364a7a --- /dev/null +++ b/components/actors/bio.vue @@ -0,0 +1,629 @@ + + + + + + + diff --git a/components/actors/tile.vue b/components/actors/tile.vue index c3c1cd8..9eaa99b 100644 --- a/components/actors/tile.vue +++ b/components/actors/tile.vue @@ -32,13 +32,13 @@ - {{ actor.birthCountry.alpha2 }} + {{ actor.origin.country.alpha2 }} @@ -47,7 +47,7 @@ @@ -134,11 +150,12 @@ const networks = computed(() => { } .filter-item.channel { - .icon { + .filter-text .icon { width: 1.5rem; height: 1rem; transform: rotate(-135deg); fill: var(--shadow-weak-30); + overflow: hidden; /* prevent parent jumping on load */ } } diff --git a/components/filters/countries.vue b/components/filters/countries.vue index 9e9de0e..a9e65be 100755 --- a/components/filters/countries.vue +++ b/components/filters/countries.vue @@ -18,6 +18,7 @@ @@ -55,15 +56,6 @@ const emit = defineEmits(['country']); padding: .25rem .25rem .25rem .5rem; } - .icon { - padding: .25rem .6rem; - fill: var(--shadow); - - &:hover { - fill: var(--shadow-strong-10); - } - } - &:hover { background: var(--shadow-weak-30); cursor: pointer; diff --git a/components/filters/filters.vue b/components/filters/filters.vue index ae7bd0c..173b83d 100644 --- a/components/filters/filters.vue +++ b/components/filters/filters.vue @@ -250,6 +250,21 @@ function toggleFilters(state) { } } +.filter-details { + display: flex; + align-items: stretch; + margin-left: .5rem; + + .filter-remove.icon { + padding: .25rem .6rem; + fill: var(--shadow); + + &:hover { + fill: var(--alert); + } + } +} + .filter-count { width: 1.5rem; display: flex; diff --git a/components/loading/ellipsis.vue b/components/loading/ellipsis.vue new file mode 100755 index 0000000..87fb46b --- /dev/null +++ b/components/loading/ellipsis.vue @@ -0,0 +1,90 @@ + + + diff --git a/components/scenes/scenes.vue b/components/scenes/scenes.vue index 936dc42..1c33155 100644 --- a/components/scenes/scenes.vue +++ b/components/scenes/scenes.vue @@ -1,6 +1,11 @@ @@ -75,8 +90,9 @@ import Filters from '#/components/filters/filters.vue'; import ActorsFilter from '#/components/filters/actors.vue'; import TagsFilter from '#/components/filters/tags.vue'; import ChannelsFilter from '#/components/filters/channels.vue'; -import Scene from './tile.vue'; -import Pagination from '../pagination/pagination.vue'; +import Scene from '#/components/scenes/tile.vue'; +import Pagination from '#/components/pagination/pagination.vue'; +import Ellipsis from '#/components/loading/ellipsis.vue'; defineProps({ showFilters: { @@ -99,12 +115,13 @@ const { } = pageProps; const scenes = ref(pageProps.scenes); -const aggActors = ref(pageProps.aggActors); -const aggTags = ref(pageProps.aggTags); -const aggChannels = ref(pageProps.aggChannels); +const aggActors = ref(pageProps.aggActors || []); +const aggTags = ref(pageProps.aggTags || []); +const aggChannels = ref(pageProps.aggChannels || []); const currentPage = ref(Number(routeParams.page)); const total = ref(Number(pageProps.total)); +const loading = ref(false); const actorIds = urlParsed.search.actors?.split(',').map((identifier) => parseActorIdentifier(identifier)?.id).filter(Boolean) || []; const queryActors = actorIds.map((urlActorId) => aggActors.value.find((aggActor) => aggActor.id === urlActorId)).filter(Boolean); @@ -112,11 +129,11 @@ const queryActors = actorIds.map((urlActorId) => aggActors.value.find((aggActor) const networks = Object.fromEntries(aggChannels.value.map((channel) => (channel.type === 'network' ? channel : channel.parent)).filter(Boolean).map((parent) => [`_${parent.slug}`, parent])); const channels = Object.fromEntries(aggChannels.value.filter((channel) => channel.type === 'channel').map((channel) => [channel.slug, channel])); -const queryChannel = networks[urlParsed.search.e] || channels[urlParsed.search.e]; +const queryEntity = networks[urlParsed.search.e] || channels[urlParsed.search.e]; const filters = ref({ tags: urlParsed.search.tags?.split(',').filter(Boolean) || [], - channel: queryChannel, + entity: queryEntity, actors: queryActors, }); @@ -149,14 +166,16 @@ async function search(resetPage = true) { const query = {}; - const entity = filters.value.channel || pageChannel; + const entity = filters.value.entity || pageChannel; const entitySlug = entity?.type === 'network' ? `_${entity.slug}` : entity?.slug; + loading.value = true; + const res = await get('/scenes', { ...query, actors: [pageActor, ...filters.value.actors].filter(Boolean).map((filterActor) => getActorIdentifier(filterActor)).join(','), // if we're on an actor page, that actor ID needs to be included tags: [pageTag?.slug, ...filters.value.tags].filter(Boolean).join(','), - entity: entitySlug, + e: entitySlug, scope, page: currentPage.value, // client uses param rather than query pagination }); @@ -164,15 +183,17 @@ async function search(resetPage = true) { scenes.value = res.scenes; aggActors.value = res.aggActors; aggTags.value = res.aggTags; + aggChannels.value = res.aggChannels; total.value = res.total; + loading.value = false; events.emit('scrollUp'); navigate(getPath(scope, false), { ...query, actors: filters.value.actors.map((filterActor) => getActorIdentifier(filterActor)).join(',') || undefined, // don't include page actor ID in query, already a parameter tags: filters.value.tags.join(',') || undefined, - e: filters.value.channel?.type === 'network' ? `_${filters.value.channel.slug}` : (filters.value.channel?.slug || undefined), + e: filters.value.entity?.type === 'network' ? `_${filters.value.entity.slug}` : (filters.value.entity?.slug || undefined), }, { redirect: false }); } @@ -189,12 +210,13 @@ function updateFilter(prop, value, reload = true) { .page { display: flex; background: var(--background-base-10); + position: relative; } .scenes-header { display: flex; align-items: center; - padding: .5rem 0 .25rem 2rem; + padding: 1rem 0 .25rem 3rem; } .scenes-container { @@ -233,4 +255,20 @@ function updateFilter(prop, value, reload = true) { font-weight: bold; } } + +.loading:not(.ellipsis) { + opacity: .3; + pointer-events: none; +} + +.ellipsis { + display: none; + position: absolute; + top: 1rem; + left: 50%; + + &.loading { + display: flex; + } +} diff --git a/package-lock.json b/package-lock.json index 08c24db..2cc05b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@vue/server-renderer": "^3.3.10", "compression": "^1.7.4", "config": "^3.3.9", + "convert": "^4.14.1", "cross-env": "^7.0.3", "date-fns": "^3.0.0", "error-stack-parser": "^2.1.4", @@ -23,6 +24,7 @@ "express-query-boolean": "^2.0.0", "knex": "^3.1.0", "manticoresearch": "^4.0.0", + "mathjs": "^12.2.1", "mitt": "^3.0.1", "nanoid": "^5.0.4", "path-to-regexp": "^6.2.1", @@ -1771,7 +1773,6 @@ "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -3424,6 +3425,18 @@ "node": ">=14" } }, + "node_modules/complex.js": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", + "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", @@ -3521,6 +3534,11 @@ "node": ">= 0.6" } }, + "node_modules/convert": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/convert/-/convert-4.14.1.tgz", + "integrity": "sha512-haeYUERJCdvILEfZC2OHZd8JIIvU6Kl93zfDrDCG3dvws4icuWC2D5O7jyaKh8vjECdfkWkVB6qDycQpGhWWSA==" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3622,6 +3640,11 @@ "ms": "2.0.0" } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3875,6 +3898,11 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "node_modules/escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -4722,6 +4750,18 @@ "node": ">= 0.6" } }, + "node_modules/fraction.js": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.4.tgz", + "integrity": "sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -5386,6 +5426,11 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5651,6 +5696,28 @@ "superagent": "5.1.0" } }, + "node_modules/mathjs": { + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.2.1.tgz", + "integrity": "sha512-/uG/yMP0wUSfALCyJkKco0gYlrp0kHFt4yNT3E+ZCoiWpsT9GdtLqydxHp3gjDCQrR4GGBDXMnKOQtJbmIe9SQ==", + "dependencies": { + "@babel/runtime": "^7.23.6", + "complex.js": "^2.1.1", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "4.3.4", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.1.1" + }, + "bin": { + "mathjs": "bin/cli.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -6497,8 +6564,7 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -6699,6 +6765,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -7108,6 +7179,11 @@ "node": ">=8" } }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7279,6 +7355,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-function": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.1.tgz", + "integrity": "sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ==", + "engines": { + "node": ">= 14" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -9315,7 +9399,6 @@ "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", - "dev": true, "requires": { "regenerator-runtime": "^0.14.0" } @@ -10399,6 +10482,11 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" }, + "complex.js": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", + "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==" + }, "component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", @@ -10466,6 +10554,11 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, + "convert": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/convert/-/convert-4.14.1.tgz", + "integrity": "sha512-haeYUERJCdvILEfZC2OHZd8JIIvU6Kl93zfDrDCG3dvws4icuWC2D5O7jyaKh8vjECdfkWkVB6qDycQpGhWWSA==" + }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -10538,6 +10631,11 @@ "ms": "2.0.0" } }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -10741,6 +10839,11 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -11389,6 +11492,11 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, + "fraction.js": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.4.tgz", + "integrity": "sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==" + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -11844,6 +11952,11 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -12042,6 +12155,22 @@ "superagent": "5.1.0" } }, + "mathjs": { + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.2.1.tgz", + "integrity": "sha512-/uG/yMP0wUSfALCyJkKco0gYlrp0kHFt4yNT3E+ZCoiWpsT9GdtLqydxHp3gjDCQrR4GGBDXMnKOQtJbmIe9SQ==", + "requires": { + "@babel/runtime": "^7.23.6", + "complex.js": "^2.1.1", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "4.3.4", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.1.1" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -12613,8 +12742,7 @@ "regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "regenerator-transform": { "version": "0.15.2", @@ -12750,6 +12878,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -13049,6 +13182,11 @@ "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==" }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -13174,6 +13312,11 @@ "is-typed-array": "^1.1.9" } }, + "typed-function": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.1.tgz", + "integrity": "sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ==" + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", diff --git a/package.json b/package.json index e503f56..cc4e8e8 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@vue/server-renderer": "^3.3.10", "compression": "^1.7.4", "config": "^3.3.9", + "convert": "^4.14.1", "cross-env": "^7.0.3", "date-fns": "^3.0.0", "error-stack-parser": "^2.1.4", @@ -23,6 +24,7 @@ "express-query-boolean": "^2.0.0", "knex": "^3.1.0", "manticoresearch": "^4.0.0", + "mathjs": "^12.2.1", "mitt": "^3.0.1", "nanoid": "^5.0.4", "path-to-regexp": "^6.2.1", diff --git a/pages/actors/@actorId/+Page.vue b/pages/actors/@actorId/+Page.vue index ea8fa6c..fc88bb3 100644 --- a/pages/actors/@actorId/+Page.vue +++ b/pages/actors/@actorId/+Page.vue @@ -1,23 +1,59 @@ diff --git a/pages/scene/+Page.vue b/pages/scene/+Page.vue index ac78c54..ec04326 100644 --- a/pages/scene/+Page.vue +++ b/pages/scene/+Page.vue @@ -168,7 +168,7 @@