commit a198c703ef5a9d875a7dbd424abda848c6962811 Author: xds Date: Mon Oct 27 15:12:00 2025 +0300 init diff --git a/.env b/.env new file mode 100644 index 0000000..3f7fd2f --- /dev/null +++ b/.env @@ -0,0 +1,3 @@ +# Базовые настройки для всех режимов +VITE_APP_NAME=Space +VITE_API_TIMEOUT=5000 \ No newline at end of file diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..21abd47 --- /dev/null +++ b/.env.development @@ -0,0 +1,2 @@ +VITE_API_URL=http://localhost:8086/api +VITE_ENABLE_DEVTOOLS=true \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..85371bb --- /dev/null +++ b/.env.production @@ -0,0 +1,2 @@ +VITE_API_URL=https://vector.luminic.space/api +VITE_ENABLE_DEVTOOLS=false \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a3f7a51 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# 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 + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo + +.eslintcache + +# Cypress +/cypress/videos/ +/cypress/screenshots/ + +# Vitest +__screenshots__/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..5d401f7 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# space + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Vue (Official)](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Recommended Browser Setup + +- Chromium-based browsers (Chrome, Edge, Brave, etc.): + - [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) + - [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters) +- Firefox: + - [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/) + - [Turn on Custom Object Formatter in Firefox DevTools](https://fxdx.dev/firefox-devtools-custom-object-formatters/) + +## Customize configuration + +See [Vite Configuration Reference](https://vite.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Compile and Minify for Production + +```sh +npm run build +``` diff --git a/index.html b/index.html new file mode 100644 index 0000000..17d0bfe --- /dev/null +++ b/index.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + Luminic Space + + + +
+ + + diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..5a1f2d2 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..802b32e --- /dev/null +++ b/manifest.json @@ -0,0 +1,10 @@ +{ + "name": "Luminic Space App", + "short_name": "Luminic Space", + "start_url": "/", + "icons": [ + ], + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#ffffff" +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f4eb450 --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "space", + "version": "0.0.0", + "private": true, + "type": "module", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@amirafa/vue3-pull-to-refresh": "^1.2.13", + "@primevue/themes": "^4.4.1", + "@tailwindcss/postcss": "^4.1.16", + "@tailwindcss/vite": "^4.1.16", + "axios": "^1.12.2", + "dayjs": "^1.11.18", + "emoji-regex": "^10.6.0", + "pinia": "^3.0.3", + "primeicons": "^7.0.0", + "primevue": "^4.4.1", + "tailwind": "^2.3.1", + "tailwindcss-primeui": "^0.6.1", + "tslib": "^2.8.1", + "vue": "^3.5.22", + "vue-router": "^4.6.3" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "autoprefixer": "^10.4.21", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.16", + "vite": "^7.1.11", + "vite-plugin-vue-devtools": "^8.0.3" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..bce4855 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +export default { + plugins: { + "@tailwindcss/postcss": {}, + } +} \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/public/favicon.ico differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..b665518 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/assets/1024.png b/src/assets/1024.png new file mode 100644 index 0000000..b07dda3 Binary files /dev/null and b/src/assets/1024.png differ diff --git a/src/assets/base.css b/src/assets/base.css new file mode 100644 index 0000000..06db787 --- /dev/null +++ b/src/assets/base.css @@ -0,0 +1,87 @@ +@import "tailwindcss"; +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/src/assets/main.css b/src/assets/main.css new file mode 100644 index 0000000..25a5731 --- /dev/null +++ b/src/assets/main.css @@ -0,0 +1,57 @@ +@import "tailwindcss"; +@import "./theme.css"; +@import './base.css'; + +@plugin "tailwindcss-primeui"; + + +#app { + width: 100%; + margin: 0 auto; + font-weight: normal; + background-color: var(--primary-color); +} + +body { + background-color: var(--primary-color); +} + +a, +.green { + text-decoration: none; + color: hsla(160, 100%, 37%, 1); + transition: 0.4s; + padding: 3px; +} + +@media (hover: hover) { + a:hover { + background-color: hsla(160, 100%, 37%, 0.2); + } +} + +@media (min-width: 1024px) { + body { + display: flex; + place-items: center; + } + + #app { + width: 100%; + height: 100%; + padding: 0 2rem; + } +} + +.card { + display: flex; + flex-direction: column; + width: 100%; + height: fit-content; + justify-content: center; + justify-items: center; + align-items: center; + border-radius: var(--radius-4xl); + background-color: var(--color-white); + padding: calc(var(--spacing) * 2); +} \ No newline at end of file diff --git a/src/assets/theme.css b/src/assets/theme.css new file mode 100644 index 0000000..41e3723 --- /dev/null +++ b/src/assets/theme.css @@ -0,0 +1,208 @@ +/* custom-theme.css — кастомная тема PrimeVue v4 с теплой премиальной палитрой */ + +:root { + /* Основные цвета */ + --primary-color: #EFEFF3; /* mainGold */ + --primary-color-text: #ffffff; + + --primary-hover-color: #AA8F59; /* secondGold */ + --primary-active-color: #8B744B; /* ещё темнее вариант для активного */ + + --secondary-color: #AA8F59; + --secondary-color-text: #ffffff; + + /* Поверхности */ + --surface-ground: #FBF9F6; /* system02 */ + --surface-card: #ffffff; /* Белый, на фоне system02 */ + --surface-overlay: #C7BCA8; /* system01 как подложка/оверлей */ + + /* Текст */ + --text-color: #393838; /* darkBrown */ + --text-color-secondary: #AA8F59; /* secondGold */ + --text-color-muted: #C7BCA8; /* system01 */ + + /* Статусы */ + --success-color: #36AC54; + --danger-color: #CC2A21; + --warning-color: #D99721; + + /* Бордюры и тени */ + --border-color: #C7BCA8; + --shadow-color: rgba(200, 173, 125, 0.3); /* мягкая тень mainGold */ + + /* PrimeVue-specific */ + --button-text-color: var(--primary-color-text); + --button-bg-color: var(--primary-color); + --button-hover-bg-color: var(--primary-hover-color); + --button-active-bg-color: var(--primary-active-color); + + --input-bg-color: var(--surface-ground); + --input-border-color: var(--secondary-color); + --input-focus-border-color: var(--primary-color); + + --menu-bg-color: var(--surface-card); + --menu-item-hover-bg-color: var(--surface-overlay); + --menu-item-hover-color: var(--primary-color-text); +} + +/* Кнопки */ +.p-button { + background-color: var(--button-bg-color) !important; + color: var(--button-text-color) !important; + border: none !important; + box-shadow: 0 2px 6px var(--shadow-color); + transition: background-color 0.3s ease, box-shadow 0.3s ease; + padding: 8px 12px !important; + min-width: fit-content; + /*font-weight: 500;*/ +} + +.p-button:hover { + background-color: var(--button-hover-bg-color) !important; + box-shadow: 0 4px 10px var(--shadow-color); +} + +.p-button:active { + background-color: var(--button-active-bg-color) !important; +} + +.p-button-secondary { + background-color: var(--surface-ground) !important; + color: var(--button-active-bg-color) !important; + border: 1px solid var(--button-bg-color) !important; + /*font-size: 1rem !important;*/ + padding: 8px 12px !important; + min-width: fit-content; +} + +.p-button-secondary:hover { + background-color: var(--button-bg-color) !important; + box-shadow: 0 4px 10px var(--shadow-color); + color: var(--primary-color-text) !important; +} +.p-togglebutton { + background-color: var(--primary-color) !important; + border: none !important; +} + +.p-togglebutton-content { + + color: var(--primary-color) !important; + padding: 0.5rem 2rem !important; + /*background-color: var(--input-bg-color) !important;*/ + /*border: 1px solid var(--button-bg-color) !important;*/ + box-shadow: inset 0.3px rgba(0, 0, 0, 0.5);; +} +.p-togglebutton-checked { + box-shadow: 1px rgba(0, 0, 0, 0.5);; +} +.p-selectbutton { + border: 1px solid var(--button-bg-color) !important; +} + +/* InputText */ +.p-inputtext, textarea { + width: 100% !important; + align-items: center; + justify-content: center; + text-align: center; + /*justify-items: center;*/ + font-weight: bold; + background-color: var(--primary-color) !important; + border: none !important; + box-shadow: none !important; + /*color: var(--text-color) !important;*/ + /*padding: 0.5rem 0.75rem;*/ + font-size: inherit !important; + transition: border-color 0.3s ease, box-shadow 0.3s ease; +} +.p-inputnumber-input { + +} +.p-inputgroupaddon { + background-color: var(--input-bg-color) !important; + border: 1px solid var(--button-bg-color) !important; + border-right: 0 !important ; +} +.p-inputtext:focus, textarea:focus { + border-color: var(--input-focus-border-color) !important; + outline: none !important; + box-shadow: 0 0 8px var(--primary-color); +} + + +/* Select */ +.p-select { + background-color: var(--input-bg-color) !important; + border: 1px solid var(--button-bg-color) !important; + color: var(--text-color) !important; + /*padding: 0.5rem 0.75rem;*/ + border-radius: 0.5rem; + transition: border-color 0.3s ease, box-shadow 0.3s ease; +} + +.p-select:focus { + border-color: var(--input-focus-border-color) !important; + outline: none !important; + box-shadow: 0 0 8px var(--primary-color); +} + +.p-select-option-selected { + background-color: var(--input-bg-color) !important; +} + +.p-select-option-label { + color: #000 !important; +} + +.p-panel-header { + border-radius: 1rem 1rem 1rem 1rem !important; +} + +/* Общий фон */ +body { + width: 100% !important; + background-color: var(--surface-ground); + color: var(--text-color); + font-family: 'Inter', sans-serif; +} + +/* Checkbox */ +.p-checkbox-checked .p-checkbox-box { + background: var(--button-bg-color) !important; + /*color: var(--button-text-color) !important;*/ + border-color: var(--button-bg-color) !important; + +} + +/* Прочее */ +.p-card { + background-color: var(--surface-card) !important; + box-shadow: 0 2px 8px var(--shadow-color); + border-radius: 1rem; +} + +.p-menu .p-menuitem:hover { + background-color: var(--menu-item-hover-bg-color) !important; + color: var(--menu-item-hover-color) !important; +} + +/* Индикаторы статуса */ +.status-success { + color: var(--success-color); +} + +.status-danger { + color: var(--danger-color); +} + +.status-warning { + color: var(--warning-color); +} +div { + display: flex; +} +span, a, i { + color: var(--text-color) !important; + padding: 0 !important; +} \ No newline at end of file diff --git a/src/components/Toolbar.vue b/src/components/Toolbar.vue new file mode 100644 index 0000000..a484506 --- /dev/null +++ b/src/components/Toolbar.vue @@ -0,0 +1,28 @@ + + + \ No newline at end of file diff --git a/src/components/dashboard/DashboardView.vue b/src/components/dashboard/DashboardView.vue new file mode 100644 index 0000000..aaf020d --- /dev/null +++ b/src/components/dashboard/DashboardView.vue @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/src/components/settings/CategoriesList.vue b/src/components/settings/CategoriesList.vue new file mode 100644 index 0000000..6921b45 --- /dev/null +++ b/src/components/settings/CategoriesList.vue @@ -0,0 +1,71 @@ + + + + + \ No newline at end of file diff --git a/src/components/settings/CategoryCreateUpdate.vue b/src/components/settings/CategoryCreateUpdate.vue new file mode 100644 index 0000000..981767e --- /dev/null +++ b/src/components/settings/CategoryCreateUpdate.vue @@ -0,0 +1,150 @@ + + +