mirror of
https://github.com/BluemediaDev/ScanOS.git
synced 2025-05-05 09:51:37 +02:00
Initial commit
This commit is contained in:
commit
b9d5c06956
55 changed files with 4706 additions and 0 deletions
15
frontend/.eslintrc.cjs
Normal file
15
frontend/.eslintrc.cjs
Normal file
|
@ -0,0 +1,15 @@
|
|||
/* eslint-env node */
|
||||
require('@rushstack/eslint-patch/modern-module-resolution')
|
||||
|
||||
module.exports = {
|
||||
root: true,
|
||||
'extends': [
|
||||
'plugin:vue/vue3-essential',
|
||||
'eslint:recommended',
|
||||
'@vue/eslint-config-typescript',
|
||||
'@vue/eslint-config-prettier/skip-formatting'
|
||||
],
|
||||
parserOptions: {
|
||||
ecmaVersion: 'latest'
|
||||
}
|
||||
}
|
28
frontend/.gitignore
vendored
Normal file
28
frontend/.gitignore
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
dist-ssr
|
||||
coverage
|
||||
*.local
|
||||
|
||||
/cypress/videos/
|
||||
/cypress/screenshots/
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
8
frontend/.prettierrc.json
Normal file
8
frontend/.prettierrc.json
Normal file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/prettierrc",
|
||||
"semi": false,
|
||||
"tabWidth": 2,
|
||||
"singleQuote": true,
|
||||
"printWidth": 100,
|
||||
"trailingComma": "none"
|
||||
}
|
8
frontend/.vscode/extensions.json
vendored
Normal file
8
frontend/.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"recommendations": [
|
||||
"Vue.volar",
|
||||
"Vue.vscode-typescript-vue-plugin",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"esbenp.prettier-vscode"
|
||||
]
|
||||
}
|
42
frontend/README.md
Normal file
42
frontend/README.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
# ScanOS frontend
|
||||
|
||||
This folder contains the frontend of ScanOS. It is built using Vue 3 in Vite and Tailwind CSS. The frontend runs inside Chromium on the scanner.
|
||||
|
||||
## Recommended IDE Setup
|
||||
|
||||
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
|
||||
|
||||
## Type Support for `.vue` Imports in TS
|
||||
|
||||
TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types.
|
||||
|
||||
If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps:
|
||||
|
||||
1. Disable the built-in TypeScript Extension
|
||||
1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette
|
||||
2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)`
|
||||
2. Reload the VSCode window by running `Developer: Reload Window` from the command palette.
|
||||
|
||||
## Project Setup
|
||||
|
||||
```sh
|
||||
yarn install
|
||||
```
|
||||
|
||||
### Compile and Hot-Reload for Development
|
||||
|
||||
```sh
|
||||
yarn dev
|
||||
```
|
||||
|
||||
### Type-Check, Compile and Minify for Production
|
||||
|
||||
```sh
|
||||
yarn build
|
||||
```
|
||||
|
||||
### Lint with [ESLint](https://eslint.org/)
|
||||
|
||||
```sh
|
||||
yarn lint
|
||||
```
|
1
frontend/env.d.ts
vendored
Normal file
1
frontend/env.d.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/// <reference types="vite/client" />
|
12
frontend/index.html
Normal file
12
frontend/index.html
Normal file
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||||
<title>ScanOS</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
</body>
|
||||
</html>
|
40
frontend/package.json
Normal file
40
frontend/package.json
Normal file
|
@ -0,0 +1,40 @@
|
|||
{
|
||||
"name": "scan-os-frontend",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "run-p type-check build-only",
|
||||
"preview": "vite preview",
|
||||
"build-only": "vite build",
|
||||
"type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false",
|
||||
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
|
||||
"format": "prettier --write src/"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^1.5.0",
|
||||
"bootstrap-icons": "^1.11.1",
|
||||
"pinia": "^2.1.6",
|
||||
"vue": "^3.3.4",
|
||||
"vue-router": "^4.2.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rushstack/eslint-patch": "^1.3.2",
|
||||
"@tsconfig/node18": "^18.2.0",
|
||||
"@types/node": "^20.5.7",
|
||||
"@vitejs/plugin-vue": "^4.3.1",
|
||||
"@vue/eslint-config-prettier": "^8.0.0",
|
||||
"@vue/eslint-config-typescript": "^11.0.3",
|
||||
"@vue/tsconfig": "^0.4.0",
|
||||
"autoprefixer": "^10.4.15",
|
||||
"eslint": "^8.46.0",
|
||||
"eslint-plugin-vue": "^9.16.1",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"postcss": "^8.4.29",
|
||||
"prettier": "^3.0.0",
|
||||
"tailwindcss": "^3.3.3",
|
||||
"typescript": "~5.1.6",
|
||||
"vite": "^4.4.9",
|
||||
"vue-tsc": "^1.8.8"
|
||||
}
|
||||
}
|
6
frontend/postcss.config.js
Normal file
6
frontend/postcss.config.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
52
frontend/src/App.vue
Normal file
52
frontend/src/App.vue
Normal file
|
@ -0,0 +1,52 @@
|
|||
<script setup lang="ts">
|
||||
import { RouterView } from 'vue-router'
|
||||
import TopBar from './components/TopBar.vue'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="w-full h-full bg-gray-100 flex flex-col">
|
||||
<TopBar />
|
||||
<div class="w-full h-full flex flex-row">
|
||||
<RouterView v-slot="{ Component, route}">
|
||||
<!--<Transition>-->
|
||||
<component :is="Component" :key="route.path" />
|
||||
<!--</Transition-->
|
||||
</RouterView>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
@keyframes slidein {
|
||||
0% {
|
||||
transform: translateX(-200vh);
|
||||
}
|
||||
100% {
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
@keyframes slideout {
|
||||
0% {
|
||||
transform: translateX(0);
|
||||
}
|
||||
100% {
|
||||
transform: translateX(+200vh);
|
||||
}
|
||||
}
|
||||
.v-enter-from {
|
||||
transform: translateX(-200vh);
|
||||
}
|
||||
.v-enter-active {
|
||||
animation: slidein 0.3s ease-in-out;
|
||||
}
|
||||
.v-leave-from {
|
||||
transform: translateX(0);
|
||||
}
|
||||
.v-leave-active {
|
||||
animation: slideout 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
.v-leave-to {
|
||||
transform: translateX(+200vh);
|
||||
}
|
||||
</style>
|
20
frontend/src/assets/main.css
Normal file
20
frontend/src/assets/main.css
Normal file
|
@ -0,0 +1,20 @@
|
|||
body {
|
||||
min-height: 100vh;
|
||||
font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
|
||||
Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
|
||||
text-rendering: optimizeLegibility;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
#app {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 1024px;
|
||||
height: 768px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
4
frontend/src/components/LoadingSpinner.vue
Normal file
4
frontend/src/components/LoadingSpinner.vue
Normal file
|
@ -0,0 +1,4 @@
|
|||
<template>
|
||||
<div class="inline-block animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]">
|
||||
</div>
|
||||
</template>
|
12
frontend/src/components/ModalComponent.vue
Normal file
12
frontend/src/components/ModalComponent.vue
Normal file
|
@ -0,0 +1,12 @@
|
|||
<template>
|
||||
<div class="fixed inset-0 bg-black bg-opacity-30 flex justify-center items-center">
|
||||
<div class="bg-white rounded-lg shadow-lg flex">
|
||||
<slot></slot>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'ModalComponent'
|
||||
};
|
||||
</script>
|
18
frontend/src/components/ScannedPage.vue
Normal file
18
frontend/src/components/ScannedPage.vue
Normal file
|
@ -0,0 +1,18 @@
|
|||
<script setup lang="ts">
|
||||
import { ref } from 'vue';
|
||||
import LoadingSpinner from '@/components/LoadingSpinner.vue';
|
||||
|
||||
const props = defineProps({
|
||||
imgUrl: String
|
||||
})
|
||||
|
||||
const imgLoaded = ref(false)
|
||||
</script>
|
||||
<template>
|
||||
<div class="p-2">
|
||||
<div class="w-full h-full rounded-lg shadow-lg bg-white flex justify-center items-center">
|
||||
<LoadingSpinner v-if="!imgLoaded" class="w-10 h-10 text-gray-600" />
|
||||
<img v-if="imgUrl" v-show="imgLoaded" :src="imgUrl" @load="imgLoaded=true" class="w-full h-full rounded-lg object-cover">
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
5
frontend/src/components/ShadowCard.vue
Normal file
5
frontend/src/components/ShadowCard.vue
Normal file
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<div class="bg-white rounded-lg shadow-lg">
|
||||
<slot></slot>
|
||||
</div>
|
||||
</template>
|
22
frontend/src/components/TopBar.vue
Normal file
22
frontend/src/components/TopBar.vue
Normal file
|
@ -0,0 +1,22 @@
|
|||
<script setup lang="ts">
|
||||
import Logo from './icons/Logo.vue';
|
||||
import SettingsGear from './icons/SettingsGear.vue';
|
||||
import PowerButton from './icons/PowerButton.vue';
|
||||
import { RouterLink } from 'vue-router';
|
||||
</script>
|
||||
<template>
|
||||
<div class="w-full h-28 p-4 flex-shrink-0">
|
||||
<div class="w-full h-full pl-6 pr-6 rounded-lg shadow-lg bg-white flex flex-row justify-center items-center gap-5">
|
||||
<RouterLink to="/" class="h-full w-auto pt-4 pb-4 flex-none">
|
||||
<Logo class="h-full w-auto flex-none text-gray-600" />
|
||||
</RouterLink>
|
||||
<span class="h-full grow"></span>
|
||||
<RouterLink to="/settings" class="h-full w-auto pt-5 pb-5 flex-none">
|
||||
<SettingsGear class="h-full w-auto text-gray-600" />
|
||||
</RouterLink>
|
||||
<RouterLink to="/power" class="h-full w-auto pt-5 pb-5 flex-none">
|
||||
<PowerButton class="h-full w-auto text-gray-600" />
|
||||
</RouterLink>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
5
frontend/src/components/icons/ArrowClockwise.vue
Normal file
5
frontend/src/components/icons/ArrowClockwise.vue
Normal file
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||
<use xlink:href="~/bootstrap-icons/bootstrap-icons.svg#arrow-clockwise"/>
|
||||
</svg>
|
||||
</template>
|
5
frontend/src/components/icons/EnvelopeAt.vue
Normal file
5
frontend/src/components/icons/EnvelopeAt.vue
Normal file
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||
<use xlink:href="~/bootstrap-icons/bootstrap-icons.svg#envelope-at"/>
|
||||
</svg>
|
||||
</template>
|
5
frontend/src/components/icons/FolderSymlink.vue
Normal file
5
frontend/src/components/icons/FolderSymlink.vue
Normal file
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||
<use xlink:href="~/bootstrap-icons/bootstrap-icons.svg#folder-symlink"/>
|
||||
</svg>
|
||||
</template>
|
15
frontend/src/components/icons/Logo.vue
Normal file
15
frontend/src/components/icons/Logo.vue
Normal file
|
@ -0,0 +1,15 @@
|
|||
<template>
|
||||
<svg viewBox="0 0 410.5 131">
|
||||
<g transform="matrix(1,0,0,1,0,0)" fill="currentColor">
|
||||
<rect width="128" height="131" rx="8"></rect>
|
||||
</g>
|
||||
<g transform="matrix(1.1107004880905151,0,0,1.1107004880905151,12.586962218116945,9.922718916840406)" fill="#ffffff">
|
||||
<polygon xmlns="http://www.w3.org/2000/svg" points="60.3031502,62.5137749 85.3330688,47.9245911 85.2139664,18.9536228 60.0643883,4.5712423 35.0344353,19.1604233 60.1840477,33.5422134"></polygon>
|
||||
<polygon xmlns="http://www.w3.org/2000/svg" points="85.3342133,51.8689041 85.3330688,51.8689041 60.3031502,66.4577866 35.1541672,52.0760002 35.2731972,81.0466766 60.4234772,95.4287567 85.4533157,80.8395767"></polygon>
|
||||
<polygon xmlns="http://www.w3.org/2000/svg" points="56.8537292,35.8179016 31.704155,21.4358158 6.6742005,36.0249977 6.7939329,64.9959641 31.9435081,79.3780518 31.8238506,50.4073792"></polygon>
|
||||
</g>
|
||||
<g transform="matrix(1.724704384803772,0,0,1.724704384803772,144.68856912093733,21.131404856786435)" fill="currentColor">
|
||||
<path d="M13.4 40.4 c-3.8 0 -7.4 -1.2 -10.52 -3.52 c-0.56 -0.4 -0.96 -1.08 -0.96 -1.88 c0 -1.28 1.04 -2.28 2.32 -2.28 c0.68 0 1.12 0.2 1.44 0.44 c2.32 1.84 4.8 2.88 7.84 2.88 s4.96 -1.44 4.96 -3.52 l0 -0.08 c0 -2 -1.12 -3.08 -6.32 -4.28 c-5.96 -1.44 -9.32 -3.2 -9.32 -8.36 l0 -0.08 c0 -4.8 4 -8.12 9.56 -8.12 c3.52 0 6.36 0.92 8.88 2.6 c0.56 0.32 1.08 1 1.08 1.96 c0 1.28 -1.04 2.28 -2.32 2.28 c-0.48 0 -0.88 -0.12 -1.28 -0.36 c-2.16 -1.4 -4.24 -2.12 -6.44 -2.12 c-2.88 0 -4.56 1.48 -4.56 3.32 l0 0.08 c0 2.16 1.28 3.12 6.68 4.4 c5.92 1.44 8.96 3.56 8.96 8.2 l0 0.08 c0 5.24 -4.12 8.36 -10 8.36 z M38.400000000000006 40.48 c-6.28 0 -10.92 -4.92 -10.92 -10.92 l0 -0.08 c0 -6 4.64 -11.04 11 -11.04 c3.32 0 5.6 1.08 7.4 2.64 c0.32 0.28 0.76 0.88 0.76 1.68 c0 1.24 -1 2.2 -2.24 2.2 c-0.6 0 -1.12 -0.24 -1.44 -0.48 c-1.24 -1.04 -2.6 -1.8 -4.52 -1.8 c-3.52 0 -6.12 3.04 -6.12 6.72 l0 0.08 c0 3.76 2.6 6.76 6.32 6.76 c1.92 0 3.4 -0.76 4.72 -1.88 c0.28 -0.24 0.76 -0.52 1.32 -0.52 c1.16 0 2.08 0.96 2.08 2.12 c0 0.64 -0.24 1.16 -0.68 1.52 c-1.88 1.8 -4.16 3 -7.68 3 z M57.559999999999995 40.44 c-3.96 0 -7.48 -2.28 -7.48 -6.52 l0 -0.08 c0 -4.56 3.56 -6.8 8.72 -6.8 c2.36 0 4.04 0.36 5.68 0.88 l0 -0.52 c0 -3 -1.84 -4.6 -5.24 -4.6 c-1.84 0 -3.36 0.32 -4.68 0.84 c-0.28 0.08 -0.52 0.12 -0.76 0.12 c-1.12 0 -2.04 -0.88 -2.04 -2 c0 -0.88 0.6 -1.64 1.32 -1.92 c2 -0.76 4.04 -1.24 6.8 -1.24 c3.16 0 5.52 0.84 7 2.36 c1.56 1.52 2.28 3.76 2.28 6.52 l0 10.4 c0 1.32 -1.04 2.32 -2.36 2.32 c-1.4 0 -2.36 -0.96 -2.36 -2.04 l0 -0.8 c-1.44 1.72 -3.64 3.08 -6.88 3.08 z M58.92 36.92 c3.2 0 5.64 -1.84 5.64 -4.52 l0 -1.44 c-1.24 -0.48 -2.88 -0.84 -4.8 -0.84 c-3.12 0 -4.96 1.32 -4.96 3.52 l0 0.08 c0 2.04 1.8 3.2 4.12 3.2 z M74.96000000000001 37.8 l0 -16.72 c0 -1.36 1.04 -2.44 2.4 -2.44 s2.44 1.08 2.44 2.44 l0 1.04 c1.36 -1.96 3.32 -3.68 6.6 -3.68 c4.76 0 7.52 3.2 7.52 8.08 l0 11.28 c0 1.36 -1.04 2.4 -2.4 2.4 s-2.44 -1.04 -2.44 -2.4 l0 -9.8 c0 -3.28 -1.64 -5.16 -4.52 -5.16 c-2.8 0 -4.76 1.96 -4.76 5.24 l0 9.72 c0 1.36 -1.08 2.4 -2.44 2.4 c-1.32 0 -2.4 -1.04 -2.4 -2.4 z M113.68 40.48 c-8.6 0 -14.6 -6.52 -14.6 -14.4 l0 -0.08 c0 -7.88 6.08 -14.48 14.68 -14.48 s14.6 6.52 14.6 14.4 l0 0.08 c0 7.88 -6.08 14.48 -14.68 14.48 z M113.75999999999999 35.92 c5.56 0 9.44 -4.4 9.44 -9.84 l0 -0.08 c0 -5.44 -3.96 -9.96 -9.52 -9.96 s-9.44 4.44 -9.44 9.88 l0 0.08 c0 5.44 3.96 9.92 9.52 9.92 z M144.12 40.4 c-3.8 0 -7.4 -1.2 -10.52 -3.52 c-0.56 -0.4 -0.96 -1.08 -0.96 -1.88 c0 -1.28 1.04 -2.28 2.32 -2.28 c0.68 0 1.12 0.2 1.44 0.44 c2.32 1.84 4.8 2.88 7.84 2.88 s4.96 -1.44 4.96 -3.52 l0 -0.08 c0 -2 -1.12 -3.08 -6.32 -4.28 c-5.96 -1.44 -9.32 -3.2 -9.32 -8.36 l0 -0.08 c0 -4.8 4 -8.12 9.56 -8.12 c3.52 0 6.36 0.92 8.88 2.6 c0.56 0.32 1.08 1 1.08 1.96 c0 1.28 -1.04 2.28 -2.32 2.28 c-0.48 0 -0.88 -0.12 -1.28 -0.36 c-2.16 -1.4 -4.24 -2.12 -6.44 -2.12 c-2.88 0 -4.56 1.48 -4.56 3.32 l0 0.08 c0 2.16 1.28 3.12 6.68 4.4 c5.92 1.44 8.96 3.56 8.96 8.2 l0 0.08 c0 5.24 -4.12 8.36 -10 8.36 z"></path>
|
||||
</g>
|
||||
</svg>
|
||||
</template>
|
36
frontend/src/components/icons/PaperlessLogo.vue
Normal file
36
frontend/src/components/icons/PaperlessLogo.vue
Normal file
|
@ -0,0 +1,36 @@
|
|||
<template>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2812.1333 801.20001">
|
||||
<g transform="matrix(1.3333333,0,0,-1.3333333,0,801.2)">
|
||||
<g transform="scale(0.1)">
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 7436.71,2391.22 c 0,126.66 -37.86,232.21 -112.83,318.83 -74.98,86.62 -173.97,128.84 -295.54,128.84 -121.56,0 -219.83,-42.94 -294.08,-128.84 -74.24,-85.89 -111.37,-192.17 -111.37,-318.83 0,-126.65 37.13,-232.2 111.37,-318.82 74.25,-86.63 171.79,-128.85 294.08,-128.85 122.29,0 220.56,42.95 295.54,128.85 74.97,85.89 112.83,192.17 112.83,318.82 z m -25.48,-908.44 v 149.95 c -131.03,-145.58 -313.73,-219.1 -548.85,-219.1 -163.06,0 -311.55,42.22 -444.03,127.39 -132.48,85.16 -236.58,202.36 -312.28,351.58 -75.7,149.22 -112.83,315.19 -112.83,497.9 0,182.7 37.85,349.4 112.83,498.62 74.98,149.22 179.07,266.42 312.28,351.59 133.21,85.16 280.97,127.38 444.03,127.38 235.12,0 418.55,-72.79 548.85,-219.1 v 149.95 h 620.91 V 1482.05 h -620.91 v 0.73"/>
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 9841.75,2391.22 c 0,126.66 -37.13,232.21 -111.37,318.83 -74.25,86.62 -171.79,128.84 -294.08,128.84 -122.29,0 -219.83,-42.94 -294.08,-128.84 -74.25,-85.89 -111.37,-192.17 -111.37,-318.83 0,-126.65 37.12,-232.2 111.37,-318.82 74.25,-86.63 171.79,-128.85 294.08,-128.85 122.29,0 219.83,42.95 294.08,128.85 74.24,85.89 111.37,192.17 111.37,318.82 z m 205.95,849.49 c 133.3,-85.17 236.6,-202.37 312.3,-351.59 75.7,-149.22 112.9,-315.19 112.9,-498.62 0,-183.44 -37.9,-349.4 -112.9,-497.9 -74.9,-148.5 -179,-266.42 -312.3,-351.58 -133.16,-85.17 -280.93,-127.39 -443.98,-127.39 -235.12,0 -418.55,72.79 -548.85,219.1 V 427.301 H 8433.95 V 3298.94 h 620.92 v -149.95 c 131.02,145.58 313.73,219.1 548.85,219.1 157.22,1.4 311.47,-42.85 443.98,-127.38"/>
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 11351.5,2600.14 h 676.2 c -15.1,89.29 -54.4,160.62 -117.9,214.01 -60.9,52.41 -138.8,80.87 -219.1,80.07 -80.8,0.68 -159.1,-27.74 -220.6,-80.07 -64.1,-53.14 -103.4,-124.48 -118.6,-214.01 z m 849.4,-502.99 385.8,-359.6 c -204.5,-215.46 -485.5,-323.19 -842.9,-323.19 -204.5,0 -385.8,42.22 -542.3,127.38 -156.5,85.17 -278.1,201.64 -362.5,349.4 -84.4,147.77 -128.8,314.46 -131,500.08 0,180.53 42.9,345.52 128.8,494.99 84.2,147.45 206.7,269.42 354.5,353.04 150,85.89 316.7,128.84 500.1,128.84 180.5,0 346.5,-44.4 496.4,-132.48 150,-88.08 269.4,-214.74 357.4,-380.7 88.1,-165.97 132.5,-357.41 132.5,-575.06 l -2.9,-85.16 h -1323.3 c 26.2,-82.99 76.4,-150.68 152.1,-204.55 75.7,-53.86 155,-80.07 240.2,-80.07 104.8,0 191.4,16.01 259.9,47.31 72.9,35.54 139.5,82.75 197.2,139.77"/>
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 13621.8,3093.67 c 53.3,75.56 124,137.22 206,179.79 80.8,41.49 160.2,61.88 238.8,61.88 83,0 145.6,-11.65 189.2,-35.67 l -78.6,-529.2 c -52.2,13.97 -106,21.55 -160.1,22.57 -124.5,0 -221.3,-31.31 -290.4,-93.18 -69.2,-61.87 -104.9,-176.15 -104.9,-341.39 v -875.69 h -620.9 v 1816.16 h 620.9 v -205.27 0"/>
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 15108.2,4259.79 V 1482.78 h -620.9 v 2777.01 h 620.9"/>
|
||||
<g transform="scale(1.0668)">
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 15056.7,2437.33 h 634 c -14.3,83.93 -51.2,150.8 -110.5,200.61 -57.1,49.13 -130.1,75.81 -205.4,75.06 -75.7,0.63 -149.1,-26 -206.8,-75.06 -59.3,-49.81 -96.9,-116.68 -111.3,-200.61 z m 796.4,-471.49 361.6,-337.09 c -191.7,-201.97 -455.1,-302.95 -790.1,-302.95 -191.8,0 -361.7,39.58 -508.4,119.4 -146.7,79.84 -260.7,189.02 -339.8,327.53 -79.2,138.51 -120.8,294.77 -122.8,468.76 0,169.23 40.2,323.89 120.8,464 78.9,138.22 193.7,252.55 332.3,330.93 140.5,80.52 296.7,120.78 468.8,120.78 169.2,0 324.8,-41.62 465.3,-124.19 140.6,-82.56 252.4,-201.29 335,-356.86 82.6,-155.58 124.2,-335.03 124.2,-539.05 l -2.7,-79.83 h -1240.6 c 24.6,-77.79 71.8,-141.24 142.7,-191.74 71,-50.49 145.3,-75.06 225.2,-75.06 98.2,0 179.4,15.01 243.6,44.35 68.4,33.14 131,77.42 184.9,131.02"/>
|
||||
</g>
|
||||
<g transform="scale(1.18166)">
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 15575.6,2446.21 c -61,0 -105.4,-6.78 -132.4,-20.94 -27.1,-14.18 -41.3,-36.35 -41.3,-67.76 0,-31.43 20.9,-54.22 63.4,-69 42.5,-14.79 110.9,-30.19 204.6,-46.82 123.1,-18.48 227.6,-41.48 313.5,-69 85,-27.1 161.6,-75.69 222.3,-141.06 62.9,-66.53 94.3,-159.55 94.3,-279.06 0,-184.19 -67.4,-322.99 -202,-416.42 -134.3,-93.02 -309.9,-139.84 -525.5,-139.84 -158.3,0 -304.9,22.59 -439.8,67.76 -134.9,45.18 -230.8,90.76 -287.7,136.76 l 207.6,373.31 c 62.8,-55.45 144.4,-97.33 244.6,-125.67 100.3,-28.34 192.8,-43.12 277.8,-43.12 121.4,0 182.3,32.03 182.3,96.71 0,33.27 -20.3,57.91 -60.9,73.3 -40.7,15.41 -106,32.03 -196.5,48.67 -116.5,20.33 -215.1,44.35 -295.7,72.08 -81.8,28.05 -154.6,77.13 -211.3,142.29 -59.8,67.15 -90,160.17 -90,277.83 0,167.55 59.7,298.77 178.6,392.4 118.9,93.63 283.4,141.06 493.5,141.06 143.7,0 273.7,-22.17 389.9,-66.52 116.3,-44.35 209.3,-89.53 279.1,-135.52 l -202.1,-362.22 c -71,48.5 -148.3,87.04 -229.8,114.57 -84.9,31.43 -164.4,46.21 -236.5,46.21"/>
|
||||
</g>
|
||||
<g transform="scale(1.29393)" id="g32">
|
||||
<path id="path34" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 15638.4,2233.96 c -55.7,0 -96.2,-6.19 -120.9,-19.13 -24.8,-12.94 -37.7,-33.19 -37.7,-61.88 0,-28.7 19.1,-49.51 57.9,-63.01 38.8,-13.5 101.3,-27.57 186.8,-42.75 112.5,-16.88 207.9,-37.89 286.4,-63.01 77.6,-24.76 147.5,-69.13 203,-128.83 57.4,-60.76 86.1,-145.7 86.1,-254.84 0,-168.21 -61.5,-294.97 -184.6,-380.29 -122.5,-84.96 -282.9,-127.71 -479.8,-127.71 -144.5,0 -278.5,20.63 -401.7,61.88 -122.6,41.07 -210.2,82.7 -262.6,124.9 l 189.5,340.91 c 57.4,-50.64 131.8,-88.88 223.4,-114.77 91.6,-25.87 176,-39.37 253.6,-39.37 111.5,0 166.6,29.25 166.6,88.32 0,30.38 -18.6,52.88 -55.7,66.94 -37.1,14.07 -96.8,29.25 -179.5,44.45 -106.3,18.56 -196.3,40.5 -270,65.82 -74.6,25.61 -141.1,70.44 -192.9,129.95 -54.6,61.32 -82.2,146.26 -82.2,253.72 0,153.01 54.6,272.84 163.2,358.35 108.5,85.51 258.7,128.83 450.5,128.83 131.3,0 250,-20.25 356.2,-60.76 106.1,-40.5 191.1,-81.76 254.8,-123.76 l -184.5,-330.79 c -64.9,44.29 -135.4,79.49 -209.8,104.63 -78.3,28.7 -150.8,42.2 -216.1,42.2"/>
|
||||
</g>
|
||||
<g transform="scale(1.13017)" id="g36">
|
||||
<path id="path38" style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 15912.3,769.049 h 387.7 v -111.43 h -387.7 v 111.43"/>
|
||||
</g>
|
||||
<g transform="scale(1.18041)" id="g40">
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 15982.5,918.845 c 31.2,12.777 64.8,19.273 98.6,19.121 67.3,0 120.3,-20.967 159.8,-62.902 39.4,-41.935 59.1,-102.981 59.1,-182.538 V 339.181 h -120.8 v 324.362 c 0,57.353 -10.5,99.907 -31.5,127.651 -20.9,27.755 -56.1,41.316 -104.8,41.316 -38,0.755 -74.3,-15.265 -99.3,-43.781 -26.5,-29.598 -39.5,-70.917 -39.5,-124.567 V 339.8 h -120.9 v 583.367 h 120.9 v -58.59 c 22.1,23.237 48.8,41.706 78.4,54.268"/>
|
||||
</g>
|
||||
<g transform="scale(1.2352)" id="g44">
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 16175.1,516.837 c 15.4,28.791 23.1,61.06 22.3,93.703 0.4,32.788 -7.3,65.162 -22.3,94.285 -14.3,27.096 -35.6,49.739 -62,65.412 -26.8,15.951 -57.6,24.11 -88.9,23.576 -64.1,0.98 -123.1,-35.031 -151.5,-92.527 -28.3,-57.189 -28.3,-124.303 0,-181.502 13.7,-27.734 34.7,-51.18 60.7,-67.767 27.1,-17.188 58.7,-26.005 90.8,-25.351 31.3,-0.332 62.2,8.033 88.9,24.168 26,16.378 47.2,39.094 62,66.003 z m 47.7,-456.7159 c -50.7,-40.0744 -114.3,-60.11161269 -190.4,-60.11161269 -44.1,-0.34786831 -88,7.85233269 -129,24.16421269 -37.9,14.8982 -71.1,39.7265 -96,71.8916 -25.5,33.3127 -40.1,73.6307 -41.9,115.5017 h 115.5 c 4.1,-35.944 20.6,-63.641 49.5,-81.913 30.6,-19.355 66.3,-29.199 102.5,-28.285 38.8,-0.867 76.7,11.615 107.3,35.362 30,23.567 45.4,60.694 45.4,111.375 V 393.67 c -22.7,-21.179 -49.3,-37.608 -78.4,-48.326 -30.6,-12.216 -63.2,-18.418 -96.1,-18.263 -49.1,-0.673 -97.5,12.384 -139.6,37.709 -41.2,24.708 -75.2,59.884 -98.5,101.951 -23.9,44.527 -36.1,94.43 -35.3,144.972 -0.7,50.729 11.4,100.803 35.3,145.564 47.3,87.249 138.9,141.225 238.1,140.251 64.4,-0.006 126.5,-23.712 174.5,-66.588 v 51.854 h 114.3 v -635.27 c -1.2,-85.452 -26.6,-147.329 -77.2,-187.4029"/>
|
||||
</g>
|
||||
<g transform="scale(1.28763)" id="g48">
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 15863,310.936 h -122.1 l 214.2,271.35 -205.7,263.437 h 127.7 l 145.3,-188.251 145.9,188.251 h 122.1 L 16085.7,586.238 16300,311.494 h -127.8 L 16017.3,509.362 15863,310.936"/>
|
||||
</g>
|
||||
<path style="fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 5164.87,3106.77 c -68.42,-65.51 -158.68,-98.27 -269.33,-98.27 l -457.13,-2.91 v 679.87 l 457.13,2.92 c 111.37,0 200.91,-32.76 269.33,-98.27 67.13,-62.22 104.48,-150.16 102.64,-241.67 0,-96.09 -34.21,-176.89 -102.64,-241.67 z m 646.39,708.99 c -83.71,137.58 -199.45,245.31 -346.49,325.38 -147.04,80.07 -313,119.38 -498.62,119.38 h -659.49 c -60.58,-282.42 -153.4,-556.94 -276.61,-818.18 -71.71,-151.07 -154.17,-296.78 -246.77,-436.02 V 1483.51 h 653.67 v 982.69 h 529.2 c 184.89,0 351.58,40.04 498.62,119.38 147.04,79.34 262.78,187.8 346.49,325.38 83.28,135.47 126.91,291.57 125.93,450.58 0,165.24 -41.49,316.64 -125.93,454.22"/>
|
||||
<path style="fill:#225025;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 894.902,1648.75 C 1218.1,2022.9 838.125,2662.74 609.559,2871.65 996.082,2207.06 970.605,1820.54 894.902,1648.75 Z m 31.301,-595.44 c -25.48,120.11 -75.707,361.05 -82.258,361.05 C -226.82,2054.93 -100.164,3163.55 254.332,3797.56 330.035,2999.04 1743.65,2448 919.648,1471.86 c -6.55,-12.37 37.856,-164.51 75.707,-304.27 164.505,278.8 412.005,614.37 398.895,646.39 -1013.988,2471.29 2154.64,2661.28 2813.41,4195 297.72,-1482.77 -152.14,-3777.17 -2699.12,-4360.23 -12.38,-6.55 -462.23,-798.531 -481.89,-805.078 0,12.367 -189.982,6.547 -164.505,69.879 13.832,38.578 38.578,88.809 64.054,139.759 h 0.004"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
</template>
|
5
frontend/src/components/icons/PowerButton.vue
Normal file
5
frontend/src/components/icons/PowerButton.vue
Normal file
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||
<use xlink:href="~/bootstrap-icons/bootstrap-icons.svg#power"/>
|
||||
</svg>
|
||||
</template>
|
5
frontend/src/components/icons/SettingsGear.vue
Normal file
5
frontend/src/components/icons/SettingsGear.vue
Normal file
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||
<use xlink:href="~/bootstrap-icons/bootstrap-icons.svg#gear"/>
|
||||
</svg>
|
||||
</template>
|
14
frontend/src/main.ts
Normal file
14
frontend/src/main.ts
Normal file
|
@ -0,0 +1,14 @@
|
|||
import './assets/main.css'
|
||||
|
||||
import { createApp } from 'vue'
|
||||
import { createPinia } from 'pinia'
|
||||
|
||||
import App from './App.vue'
|
||||
import router from './router'
|
||||
|
||||
const app = createApp(App)
|
||||
|
||||
app.use(createPinia())
|
||||
app.use(router)
|
||||
|
||||
app.mount('#app')
|
25
frontend/src/router/index.ts
Normal file
25
frontend/src/router/index.ts
Normal file
|
@ -0,0 +1,25 @@
|
|||
import { createRouter, createWebHistory } from 'vue-router'
|
||||
import HomeView from '../views/HomeView.vue'
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(import.meta.env.BASE_URL),
|
||||
routes: [
|
||||
{
|
||||
path: '/',
|
||||
name: 'home',
|
||||
component: HomeView
|
||||
},
|
||||
{
|
||||
path: '/power',
|
||||
name: 'power',
|
||||
component: () => import('@/views/PowerView.vue')
|
||||
},
|
||||
{
|
||||
path: '/scan',
|
||||
name: 'scan',
|
||||
component: () => import('@/views/ScanView.vue')
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
export default router
|
50
frontend/src/views/HomeView.vue
Normal file
50
frontend/src/views/HomeView.vue
Normal file
|
@ -0,0 +1,50 @@
|
|||
<script setup lang="ts">
|
||||
import ShadowCard from '@/components/ShadowCard.vue';
|
||||
import PaperlessLogo from '@/components/icons/PaperlessLogo.vue'
|
||||
import EnvelopeAt from '@/components/icons/EnvelopeAt.vue';
|
||||
import FolderSymlink from '@/components/icons/FolderSymlink.vue';
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="w-full h-full pt-10 pb-10 pl-4 pr-4 flex flex-shrink-0 flex-row justify-between items-center gap-5 text-gray-700">
|
||||
<RouterLink to="/scan?backend=paperless" class="h-2/3 max-w-xs">
|
||||
<ShadowCard class="h-full w-full">
|
||||
<div class="h-full w-full p-5 flex flex-col justify-center items-center">
|
||||
<div class="h-full w-full flex flex-col justify-center items-center gap-4">
|
||||
<PaperlessLogo class="h-16 w-auto" />
|
||||
<h1 class="text-xl select-none">Paperless-ngx</h1>
|
||||
</div>
|
||||
<div class="h-full w-full flex justify-center items-start">
|
||||
<p class="text-lg select-none">Scan your documents right into Paperless-ngx. You can also customize correspondent, document type and tags.</p>
|
||||
</div>
|
||||
</div>
|
||||
</ShadowCard>
|
||||
</RouterLink>
|
||||
<RouterLink to="/scan?backend=mail" class="h-2/3 max-w-xs">
|
||||
<ShadowCard class="h-full w-full">
|
||||
<div class="h-full w-full p-5 flex flex-col justify-center items-center">
|
||||
<div class="h-full w-full flex flex-col justify-center items-center gap-4">
|
||||
<EnvelopeAt class="h-16 w-auto" />
|
||||
<h1 class="text-xl select-none">Scan2Mail</h1>
|
||||
</div>
|
||||
<div class="h-full w-full flex justify-center items-start">
|
||||
<p class="text-lg select-none">Scan your documents and send them as a PDF file attachment via email.</p>
|
||||
</div>
|
||||
</div>
|
||||
</ShadowCard>
|
||||
</RouterLink>
|
||||
<RouterLink to="/scan?backend=storage-share" class="h-2/3 max-w-xs">
|
||||
<ShadowCard class="h-full w-full">
|
||||
<div class="h-full w-full p-5 flex flex-col justify-center items-center">
|
||||
<div class="h-full w-full flex flex-col justify-center items-center gap-4">
|
||||
<FolderSymlink class="h-16 w-auto" />
|
||||
<h1 class="text-xl select-none">Network Share</h1>
|
||||
</div>
|
||||
<div class="h-full w-full flex justify-center items-start">
|
||||
<p class="text-lg select-none">Scan your documents and save them as PDF files to a network storage share.</p>
|
||||
</div>
|
||||
</div>
|
||||
</ShadowCard>
|
||||
</RouterLink>
|
||||
</div>
|
||||
</template>
|
47
frontend/src/views/PowerView.vue
Normal file
47
frontend/src/views/PowerView.vue
Normal file
|
@ -0,0 +1,47 @@
|
|||
<script setup lang="ts">
|
||||
import ShadowCard from '@/components/ShadowCard.vue';
|
||||
import PowerButton from '@/components/icons/PowerButton.vue';
|
||||
import ArrowClockwise from '@/components/icons/ArrowClockwise.vue';
|
||||
import ModalComponent from '@/components/ModalComponent.vue';
|
||||
import axios from 'axios';
|
||||
import {ref} from 'vue';
|
||||
|
||||
const showModal = ref(false);
|
||||
const action = ref("");
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="w-full h-full pt-10 pb-10 pl-4 pr-4 flex flex-shrink-0 flex-row justify-center items-center gap-20 text-gray-700">
|
||||
<ShadowCard @click="action='shutdown';showModal=true" class="h-1/3 w-1/5">
|
||||
<div class="w-full h-full flex flex-col justify-center items-center">
|
||||
<PowerButton class="w-12 h-12 text-red-700" />
|
||||
<h1 class="mt-5 text-xl font-semibold">Shutdown</h1>
|
||||
</div>
|
||||
</ShadowCard>
|
||||
<ShadowCard @click="action='restart';showModal=true" class="h-1/3 w-1/5">
|
||||
<div class="w-full h-full flex flex-col justify-center items-center">
|
||||
<ArrowClockwise class="w-12 h-12 text-orange-400" />
|
||||
<h1 class="mt-5 text-xl font-semibold">Restart</h1>
|
||||
</div>
|
||||
</ShadowCard>
|
||||
<ModalComponent v-if="showModal">
|
||||
<div class="flex flex-col p-10">
|
||||
<h1 class="font-semibold text-lg mb-5">Do you really want to {{ action }}?</h1>
|
||||
<div class="flex flex-row justify-between items-center">
|
||||
<button @click="confirm(action)" class="h-12 w-20 rounded-md bg-green-500 text-white font-semibold">Yes</button>
|
||||
<button @click="showModal=false" class="h-12 w-20 rounded-md bg-red-500 text-white font-semibold">No</button>
|
||||
</div>
|
||||
</div>
|
||||
</ModalComponent>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
function confirm(action: String) {
|
||||
if (action == "shutdown") {
|
||||
axios.post('/api/power/shutdown', {});
|
||||
} else {
|
||||
axios.post('/api/power/restart', {});
|
||||
}
|
||||
}
|
||||
</script>
|
44
frontend/src/views/ScanView.vue
Normal file
44
frontend/src/views/ScanView.vue
Normal file
|
@ -0,0 +1,44 @@
|
|||
<script setup lang="ts">
|
||||
import ScannedPage from '@/components/ScannedPage.vue';
|
||||
import { useRoute } from 'vue-router'
|
||||
import { ref } from 'vue';
|
||||
import axios from 'axios';
|
||||
|
||||
const route = useRoute()
|
||||
let backend = route.query.backend;
|
||||
|
||||
const data = ref({
|
||||
pages: new Array<any>(),
|
||||
status: "idle"
|
||||
})
|
||||
|
||||
function getUpdate() {
|
||||
axios.get('/api/scan/status')
|
||||
.then(function (response) {
|
||||
data.value = response.data
|
||||
if (response.data.status === "running") {
|
||||
setTimeout(getUpdate, 1000)
|
||||
}
|
||||
})
|
||||
.catch(function (error) {
|
||||
// handle error
|
||||
console.log(error);
|
||||
})
|
||||
}
|
||||
axios.post('/api/scan')
|
||||
.then(function (response) {
|
||||
data.value.status = "running"
|
||||
setTimeout(getUpdate, 2000)
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<dev class="w-full h-full flex flex-col">
|
||||
<div class="w-full h-full p-2 flex flex-row flex-wrap overflow-auto">
|
||||
<ScannedPage v-for="page in data.pages" :key="page.filename" class="w-1/5 h-1/2" :imgUrl="'/img/' + page.filename" />
|
||||
<ScannedPage v-if="data.status==='running'" class="w-1/5 h-1/2" />
|
||||
</div>
|
||||
<div class="w-full h-28 p-4 flex">
|
||||
|
||||
</div>
|
||||
</dev>
|
||||
</template>
|
9
frontend/tailwind.config.js
Normal file
9
frontend/tailwind.config.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
|
||||
theme: {
|
||||
extend: {},
|
||||
},
|
||||
plugins: [],
|
||||
}
|
||||
|
12
frontend/tsconfig.app.json
Normal file
12
frontend/tsconfig.app.json
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
|
||||
"exclude": ["src/**/__tests__/*"],
|
||||
"compilerOptions": {
|
||||
"composite": true,
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
}
|
||||
}
|
11
frontend/tsconfig.json
Normal file
11
frontend/tsconfig.json
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"files": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "./tsconfig.node.json"
|
||||
},
|
||||
{
|
||||
"path": "./tsconfig.app.json"
|
||||
}
|
||||
]
|
||||
}
|
16
frontend/tsconfig.node.json
Normal file
16
frontend/tsconfig.node.json
Normal file
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"extends": "@tsconfig/node18/tsconfig.json",
|
||||
"include": [
|
||||
"vite.config.*",
|
||||
"vitest.config.*",
|
||||
"cypress.config.*",
|
||||
"nightwatch.conf.*",
|
||||
"playwright.config.*"
|
||||
],
|
||||
"compilerOptions": {
|
||||
"composite": true,
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "Bundler",
|
||||
"types": ["node"]
|
||||
}
|
||||
}
|
16
frontend/vite.config.ts
Normal file
16
frontend/vite.config.ts
Normal file
|
@ -0,0 +1,16 @@
|
|||
import { fileURLToPath, URL } from 'node:url'
|
||||
|
||||
import { defineConfig } from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
vue(),
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
'@': fileURLToPath(new URL('./src', import.meta.url))
|
||||
}
|
||||
}
|
||||
})
|
2828
frontend/yarn.lock
Normal file
2828
frontend/yarn.lock
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue