diff --git a/client/components/PanelLeftRight.vue b/client/components/PanelLeftRight.vue
new file mode 100644
index 0000000..ac05943
--- /dev/null
+++ b/client/components/PanelLeftRight.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/splitpanes.d.ts b/client/splitpanes.d.ts
new file mode 100644
index 0000000..0395faa
--- /dev/null
+++ b/client/splitpanes.d.ts
@@ -0,0 +1,21 @@
+// TODO install @types/splitpanes once updated
+declare module 'splitpanes' {
+ import { Component } from 'vue'
+
+ export interface SplitpaneProps {
+ horizontal: boolean
+ pushOtherPanes: boolean
+ dblClickSplitter: boolean
+ firstSplitter: boolean
+ }
+
+ export interface PaneProps {
+ size: number | string
+ minSize: number | string
+ maxSize: number | string
+ }
+
+ export type Pane = Component
+ export const Pane: Pane
+ export const Splitpanes: Component
+}
diff --git a/package.json b/package.json
index 35fbf39..2dca8e5 100644
--- a/package.json
+++ b/package.json
@@ -63,6 +63,9 @@
"eslint": "^8.38.0",
"mongoose": "^7.0.4",
"nuxt": "^3.4.1",
+ "sass": "^1.62.0",
+ "sass-loader": "^13.2.2",
+ "splitpanes": "^3.1.5",
"vitest": "^0.30.1"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3c2f3fe..c7aa78d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -21,7 +21,10 @@ specifiers:
mongoose: ^7.0.4
nuxt: ^3.4.1
pluralize: ^8.0.0
+ sass: ^1.62.0
+ sass-loader: ^13.2.2
sirv: ^2.0.2
+ splitpanes: ^3.1.5
tinyws: ^0.1.0
vitest: ^0.30.1
ws: ^8.13.0
@@ -43,7 +46,7 @@ devDependencies:
'@antfu/eslint-config': 0.38.4_eslint@8.38.0
'@nuxt/devtools': 0.4.1_nuxt@3.4.1
'@nuxt/devtools-ui-kit': 0.4.1_sbrejdityadm54jexvksf2ocw4
- '@nuxt/module-builder': 0.3.0
+ '@nuxt/module-builder': 0.3.0_sass@1.62.0
'@nuxt/schema': 3.4.1
'@nuxt/test-utils': 3.4.1
'@types/pluralize': 0.0.29
@@ -51,8 +54,11 @@ devDependencies:
changelogen: 0.5.3
eslint: 8.38.0
mongoose: 7.0.4
- nuxt: 3.4.1_eslint@8.38.0
- vitest: 0.30.1
+ nuxt: 3.4.1_eslint@8.38.0+sass@1.62.0
+ sass: 1.62.0
+ sass-loader: 13.2.2_sass@1.62.0
+ splitpanes: 3.1.5
+ vitest: 0.30.1_sass@1.62.0
packages:
@@ -905,7 +911,7 @@ packages:
'@nuxt/kit': 3.4.1
'@nuxt/schema': 3.4.1
execa: 7.1.1
- nuxt: 3.4.1_eslint@8.38.0
+ nuxt: 3.4.1_eslint@8.38.0+sass@1.62.0
transitivePeerDependencies:
- rollup
- supports-color
@@ -994,7 +1000,7 @@ packages:
is-installed-globally: 0.4.0
launch-editor: 2.6.0
local-pkg: 0.4.3
- nuxt: 3.4.1_eslint@8.38.0
+ nuxt: 3.4.1_eslint@8.38.0+sass@1.62.0
nypm: 0.2.0
pacote: 15.1.1
pathe: 1.1.0
@@ -1045,7 +1051,7 @@ packages:
- rollup
- supports-color
- /@nuxt/module-builder/0.3.0:
+ /@nuxt/module-builder/0.3.0_sass@1.62.0:
resolution: {integrity: sha512-ocXA3pY5T3YKBLNE/Epgnh5cIIrad6vGP31gT7RorpFa7mtIqMxIPX/Z7RSQ7xnTvZW9sA1AxadjfhwHMEBhKg==}
hasBin: true
dependencies:
@@ -1053,7 +1059,7 @@ packages:
mlly: 1.2.0
mri: 1.2.0
pathe: 1.1.0
- unbuild: 1.2.1
+ unbuild: 1.2.1_sass@1.62.0
transitivePeerDependencies:
- sass
- supports-color
@@ -1132,7 +1138,7 @@ packages:
/@nuxt/ui-templates/1.1.1:
resolution: {integrity: sha512-PjVETP7+iZXAs5Q8O4ivl4t6qjWZMZqwiTVogUXHoHGZZcw7GZW3u3tzfYfE1HbzyYJfr236IXqQ02MeR8Fz2w==}
- /@nuxt/vite-builder/3.4.1_eslint@8.38.0+vue@3.2.47:
+ /@nuxt/vite-builder/3.4.1_asotxjri2eml4oou4c5r5nmofa:
resolution: {integrity: sha512-qqS+hUv91z58vLNEorP4xfyvo/uoteTCYaMouyRZzqnJhrE/G82x2SqdzfADEhKpNHUkGWhpc37uuejrM+y6qw==}
engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0}
peerDependencies:
@@ -1169,8 +1175,8 @@ packages:
strip-literal: 1.0.1
ufo: 1.1.1
unplugin: 1.3.1
- vite: 4.2.1
- vite-node: 0.30.1
+ vite: 4.2.1_sass@1.62.0
+ vite-node: 0.30.1_sass@1.62.0
vite-plugin-checker: 0.5.6_eslint@8.38.0+vite@4.2.1
vue: 3.2.47
vue-bundle-renderer: 1.0.3
@@ -1904,7 +1910,7 @@ packages:
'@babel/core': 7.21.4
'@babel/plugin-transform-typescript': 7.21.3_@babel+core@7.21.4
'@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.21.4
- vite: 4.2.1
+ vite: 4.2.1_sass@1.62.0
vue: 3.2.47
transitivePeerDependencies:
- supports-color
@@ -1916,7 +1922,7 @@ packages:
vite: ^4.0.0
vue: ^3.2.25
dependencies:
- vite: 4.2.1
+ vite: 4.2.1_sass@1.62.0
vue: 3.2.47
/@vitest/expect/0.30.1:
@@ -2128,7 +2134,7 @@ packages:
'@vueuse/core': 10.0.2
'@vueuse/metadata': 10.0.2
local-pkg: 0.4.3
- nuxt: 3.4.1_eslint@8.38.0
+ nuxt: 3.4.1_eslint@8.38.0+sass@1.62.0
vue-demi: 0.14.0
transitivePeerDependencies:
- '@vue/composition-api'
@@ -4404,6 +4410,9 @@ packages:
engines: {node: '>=10.18.0'}
dev: true
+ /immutable/4.3.0:
+ resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==}
+
/import-fresh/3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
@@ -5312,7 +5321,7 @@ packages:
engines: {node: '>=10'}
hasBin: true
- /mkdist/1.2.0_typescript@5.0.4:
+ /mkdist/1.2.0_sffncwaojpqok57nsd7h6ezloq:
resolution: {integrity: sha512-UTqu/bXmIk/+VKNVgufAeMyjUcNy1dn9Bl7wL1zZlCKVrpDgj/VllmZBeh3ZCC/2HWqUrt6frNFTKt9TRZbNvQ==}
hasBin: true
peerDependencies:
@@ -5332,6 +5341,7 @@ packages:
mlly: 1.2.0
mri: 1.2.0
pathe: 1.1.0
+ sass: 1.62.0
typescript: 5.0.4
dev: true
@@ -5447,6 +5457,10 @@ packages:
engines: {node: '>= 0.6'}
dev: true
+ /neo-async/2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+ dev: true
+
/nitropack/2.3.3:
resolution: {integrity: sha512-1g/4zdwWo+tWSvno57rhRXeGk6jNbG5W1yRNtOywInT1nyoEG1ksOwQ3W3JHGB2E1GNjZwAVi611UVOVL+JgYw==}
engines: {node: ^14.16.0 || ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0}
@@ -5725,7 +5739,7 @@ packages:
optionalDependencies:
fsevents: 2.3.2
- /nuxt/3.4.1_eslint@8.38.0:
+ /nuxt/3.4.1_eslint@8.38.0+sass@1.62.0:
resolution: {integrity: sha512-wKT5iZebO1D7QtAN1fDNNsjaTFbAC5pO4kWzw2qX2OOg2SWP/k42sCfxbcz/JkLL4FJVwpya+9OD9/2MwEdt1g==}
engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0}
hasBin: true
@@ -5737,7 +5751,7 @@ packages:
'@nuxt/schema': 3.4.1
'@nuxt/telemetry': 2.2.0
'@nuxt/ui-templates': 1.1.1
- '@nuxt/vite-builder': 3.4.1_eslint@8.38.0+vue@3.2.47
+ '@nuxt/vite-builder': 3.4.1_asotxjri2eml4oou4c5r5nmofa
'@unhead/ssr': 1.1.25
'@unhead/vue': 1.1.25_vue@3.2.47
'@vue/reactivity': 3.2.47
@@ -6769,6 +6783,39 @@ packages:
dev: true
optional: true
+ /sass-loader/13.2.2_sass@1.62.0:
+ resolution: {integrity: sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==}
+ engines: {node: '>= 14.15.0'}
+ peerDependencies:
+ fibers: '>= 3.1.0'
+ node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+ sass: ^1.3.0
+ sass-embedded: '*'
+ webpack: ^5.0.0
+ peerDependenciesMeta:
+ fibers:
+ optional: true
+ node-sass:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ dependencies:
+ klona: 2.0.6
+ neo-async: 2.6.2
+ sass: 1.62.0
+ dev: true
+
+ /sass/1.62.0:
+ resolution: {integrity: sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+ dependencies:
+ chokidar: 3.5.3
+ immutable: 4.3.0
+ source-map-js: 1.0.2
+
/scule/1.0.0:
resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==}
@@ -6987,6 +7034,10 @@ packages:
resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
dev: true
+ /splitpanes/3.1.5:
+ resolution: {integrity: sha512-r3Mq2ITFQ5a2VXLOy4/Sb2Ptp7OfEO8YIbhVJqJXoFc9hc5nTXXkCvtVDjIGbvC0vdE7tse+xTM9BMjsszP6bw==}
+ dev: true
+
/ssri/10.0.3:
resolution: {integrity: sha512-lJtX/BFPI/VEtxZmLfeh7pzisIs6micwZ3eruD3+ds9aPsXKlYpwDS2Q7omD6WC42WO9+bnUSzlMmfv8uK8meg==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -7382,7 +7433,7 @@ packages:
which-boxed-primitive: 1.0.2
dev: true
- /unbuild/1.2.1:
+ /unbuild/1.2.1_sass@1.62.0:
resolution: {integrity: sha512-J4efk69Aye43tWcBPCsLK7TIRppGrEN4pAlDzRKo3HSE6MgTSTBxSEuE3ccx7ixc62JvGQ/CoFXYqqF2AHozow==}
hasBin: true
dependencies:
@@ -7400,7 +7451,7 @@ packages:
hookable: 5.5.3
jiti: 1.18.2
magic-string: 0.30.0
- mkdist: 1.2.0_typescript@5.0.4
+ mkdist: 1.2.0_sffncwaojpqok57nsd7h6ezloq
mlly: 1.2.0
mri: 1.2.0
pathe: 1.1.0
@@ -7709,7 +7760,7 @@ packages:
builtins: 5.0.1
dev: true
- /vite-node/0.30.1:
+ /vite-node/0.30.1_g772r5w5ng27elj5pzc7q7vnhy:
resolution: {integrity: sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==}
engines: {node: '>=v14.18.0'}
hasBin: true
@@ -7719,27 +7770,7 @@ packages:
mlly: 1.2.0
pathe: 1.1.0
picocolors: 1.0.0
- vite: 4.2.1
- transitivePeerDependencies:
- - '@types/node'
- - less
- - sass
- - stylus
- - sugarss
- - supports-color
- - terser
-
- /vite-node/0.30.1_@types+node@18.15.11:
- resolution: {integrity: sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==}
- engines: {node: '>=v14.18.0'}
- hasBin: true
- dependencies:
- cac: 6.7.14
- debug: 4.3.4
- mlly: 1.2.0
- pathe: 1.1.0
- picocolors: 1.0.0
- vite: 4.2.1_@types+node@18.15.11
+ vite: 4.2.1_g772r5w5ng27elj5pzc7q7vnhy
transitivePeerDependencies:
- '@types/node'
- less
@@ -7750,6 +7781,26 @@ packages:
- terser
dev: true
+ /vite-node/0.30.1_sass@1.62.0:
+ resolution: {integrity: sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg==}
+ engines: {node: '>=v14.18.0'}
+ hasBin: true
+ dependencies:
+ cac: 6.7.14
+ debug: 4.3.4
+ mlly: 1.2.0
+ pathe: 1.1.0
+ picocolors: 1.0.0
+ vite: 4.2.1_sass@1.62.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
/vite-plugin-checker/0.5.6_eslint@8.38.0+vite@4.2.1:
resolution: {integrity: sha512-ftRyON0gORUHDxcDt2BErmsikKSkfvl1i2DoP6Jt2zDO9InfvM6tqO1RkXhSjkaXEhKPea6YOnhFaZxW3BzudQ==}
engines: {node: '>=14.16'}
@@ -7794,7 +7845,7 @@ packages:
npm-run-path: 4.0.1
strip-ansi: 6.0.1
tiny-invariant: 1.3.1
- vite: 4.2.1
+ vite: 4.2.1_sass@1.62.0
vscode-languageclient: 7.0.0
vscode-languageserver: 7.0.0
vscode-languageserver-textdocument: 1.0.8
@@ -7835,39 +7886,7 @@ packages:
- supports-color
dev: true
- /vite/4.2.1:
- resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==}
- engines: {node: ^14.18.0 || >=16.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': '>= 14'
- less: '*'
- sass: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
- dependencies:
- esbuild: 0.17.16
- postcss: 8.4.21
- resolve: 1.22.3
- rollup: 3.20.2
- optionalDependencies:
- fsevents: 2.3.2
-
- /vite/4.2.1_@types+node@18.15.11:
+ /vite/4.2.1_g772r5w5ng27elj5pzc7q7vnhy:
resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@@ -7897,11 +7916,45 @@ packages:
postcss: 8.4.21
resolve: 1.22.3
rollup: 3.20.2
+ sass: 1.62.0
optionalDependencies:
fsevents: 2.3.2
dev: true
- /vitest/0.30.1:
+ /vite/4.2.1_sass@1.62.0:
+ resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>= 14'
+ less: '*'
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.17.16
+ postcss: 8.4.21
+ resolve: 1.22.3
+ rollup: 3.20.2
+ sass: 1.62.0
+ optionalDependencies:
+ fsevents: 2.3.2
+
+ /vitest/0.30.1_sass@1.62.0:
resolution: {integrity: sha512-y35WTrSTlTxfMLttgQk4rHcaDkbHQwDP++SNwPb+7H8yb13Q3cu2EixrtHzF27iZ8v0XCciSsLg00RkPAzB/aA==}
engines: {node: '>=v14.18.0'}
hasBin: true
@@ -7955,8 +8008,8 @@ packages:
strip-literal: 1.0.1
tinybench: 2.4.0
tinypool: 0.4.0
- vite: 4.2.1_@types+node@18.15.11
- vite-node: 0.30.1_@types+node@18.15.11
+ vite: 4.2.1_g772r5w5ng27elj5pzc7q7vnhy
+ vite-node: 0.30.1_g772r5w5ng27elj5pzc7q7vnhy
why-is-node-running: 2.2.2
transitivePeerDependencies:
- less