├── src ├── components │ ├── MultiSelect.vue │ ├── Input.vue │ ├── CustomSelect.vue │ ├── Sidebar.vue │ ├── DatePicker.vue │ └── Icons.vue ├── assets │ ├── Fonts │ │ ├── Telev2.woff │ │ ├── Telev2b.woff │ │ ├── Telev2c.woff │ │ ├── Telev2cb.woff │ │ ├── Telev2s.woff │ │ ├── noto-sans-v38-latin-200.woff2 │ │ ├── noto-sans-v38-latin-300.woff2 │ │ ├── noto-sans-v38-latin-500.woff2 │ │ ├── noto-sans-v38-latin-600.woff2 │ │ ├── noto-sans-v38-latin-700.woff2 │ │ ├── noto-sans-v38-latin-800.woff2 │ │ ├── noto-sans-v38-latin-900.woff2 │ │ └── noto-sans-v38-latin-regular.woff2 │ └── CSS │ │ └── style.css ├── main.js ├── App.vue ├── Router │ └── index.js ├── Pages │ ├── Opinion │ │ └── OpinionPage.vue │ ├── Sertificates │ │ ├── idgenerator.js │ │ ├── SertificateModal.vue │ │ └── Sertificate.vue │ ├── Events │ │ ├── EventPage.vue │ │ └── EvetModal.vue │ ├── Settings │ │ └── Settings.vue │ └── Statistics │ │ ├── StatisticsModal.vue │ │ └── Statistics.vue ├── Utils │ ├── axios.js │ └── Toastiff.vue └── Views │ ├── Home │ └── HomePage.vue │ └── Login │ └── LoginPage.vue ├── babel.config.js ├── vue.config.js ├── .gitignore ├── public ├── Vector.svg └── index.html ├── jsconfig.json ├── README.md └── package.json /src/components/MultiSelect.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /src/assets/Fonts/Telev2.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/Telev2.woff -------------------------------------------------------------------------------- /src/assets/Fonts/Telev2b.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/Telev2b.woff -------------------------------------------------------------------------------- /src/assets/Fonts/Telev2c.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/Telev2c.woff -------------------------------------------------------------------------------- /src/assets/Fonts/Telev2cb.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/Telev2cb.woff -------------------------------------------------------------------------------- /src/assets/Fonts/Telev2s.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/Telev2s.woff -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('@vue/cli-service') 2 | module.exports = defineConfig({ 3 | transpileDependencies: true 4 | }) 5 | -------------------------------------------------------------------------------- /src/assets/Fonts/noto-sans-v38-latin-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/noto-sans-v38-latin-200.woff2 -------------------------------------------------------------------------------- /src/assets/Fonts/noto-sans-v38-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/noto-sans-v38-latin-300.woff2 -------------------------------------------------------------------------------- /src/assets/Fonts/noto-sans-v38-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/noto-sans-v38-latin-500.woff2 -------------------------------------------------------------------------------- /src/assets/Fonts/noto-sans-v38-latin-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/noto-sans-v38-latin-600.woff2 -------------------------------------------------------------------------------- /src/assets/Fonts/noto-sans-v38-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/noto-sans-v38-latin-700.woff2 -------------------------------------------------------------------------------- /src/assets/Fonts/noto-sans-v38-latin-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/noto-sans-v38-latin-800.woff2 -------------------------------------------------------------------------------- /src/assets/Fonts/noto-sans-v38-latin-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/noto-sans-v38-latin-900.woff2 -------------------------------------------------------------------------------- /src/assets/Fonts/noto-sans-v38-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azamjonbro/Algoritm-admin/HEAD/src/assets/Fonts/noto-sans-v38-latin-regular.woff2 -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import router from './Router' 4 | import "./assets/CSS/style.css" 5 | 6 | createApp(App) 7 | .use(router) 8 | .mount('#app') 9 | -------------------------------------------------------------------------------- /src/components/Input.vue: -------------------------------------------------------------------------------- 1 | 6 | 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /public/Vector.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "esnext", 5 | "baseUrl": "./", 6 | "moduleResolution": "node", 7 | "paths": { 8 | "@/*": [ 9 | "src/*" 10 | ] 11 | }, 12 | "lib": [ 13 | "esnext", 14 | "dom", 15 | "dom.iterable", 16 | "scripthost" 17 | ] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # algoritm_admin 2 | 3 | ## Project setup 4 | ``` 5 | npm install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | npm run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | ### Lints and fixes files 19 | ``` 20 | npm run lint 21 | ``` 22 | 23 | ### Customize configuration 24 | See [Configuration Reference](https://cli.vuejs.org/config/). 25 | # Algoritm-admin 26 | -------------------------------------------------------------------------------- /src/Router/index.js: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from 'vue-router'; 2 | import LoginPage from '@/Views/Login/LoginPage.vue'; 3 | import HomePage from '@/Views/Home/HomePage.vue'; 4 | const routes = [ 5 | { 6 | path: '/login', 7 | name: 'Login', 8 | component: LoginPage 9 | }, 10 | { 11 | path: '/', 12 | name: 'Home', 13 | component: HomePage, 14 | }, 15 | ]; 16 | 17 | const router = createRouter({ 18 | history: createWebHistory(), 19 | routes 20 | }); 21 | 22 | export default router; 23 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Algoritm Ta'lim 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/Pages/Opinion/OpinionPage.vue: -------------------------------------------------------------------------------- 1 | 18 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/Utils/axios.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | const instance = axios.create({ 4 | baseURL: 'https://algoritm.safonon.uz', 5 | timeout: 100000000000000, 6 | headers: { 7 | 'Content-Type': 'application/json', 8 | } 9 | }); 10 | instance.interceptors.request.use(config => { 11 | const token = localStorage.getItem('token'); 12 | if (token) { 13 | config.headers.Authorization = `Bearer ${token}`; 14 | } 15 | return config; 16 | }, error => { 17 | return Promise.reject(error); 18 | }); 19 | 20 | instance.interceptors.response.use(response => { 21 | return response; 22 | }, error => { 23 | console.error('Axios error:', error); 24 | return Promise.reject(error); 25 | }); 26 | 27 | export default instance; 28 | -------------------------------------------------------------------------------- /src/Pages/Sertificates/idgenerator.js: -------------------------------------------------------------------------------- 1 | // certificate-id-generator.js 2 | 3 | const generatedIds = new Set(); // Faqat xotirada saqlanadi 4 | 5 | function generateNumericId() { 6 | let newId; 7 | let attempts = 0; 8 | 9 | do { 10 | newId = Math.floor(10000000 + Math.random() * 90000000).toString(); 11 | attempts++; 12 | } while (generatedIds.has(newId) && attempts < 10); 13 | 14 | if (!generatedIds.has(newId)) { 15 | generatedIds.add(newId); 16 | return newId; 17 | } else { 18 | throw new Error("Yangi noyob ID yaratib bo‘lmadi."); 19 | } 20 | } 21 | 22 | function getAllIds() { 23 | return Array.from(generatedIds); 24 | } 25 | 26 | function clearAllIds() { 27 | generatedIds.clear(); 28 | } 29 | 30 | export { 31 | generateNumericId, 32 | getAllIds, 33 | clearAllIds 34 | }; 35 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "algoritm_admin", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "axios": "^1.8.4", 12 | "core-js": "^3.8.3", 13 | "toastify-js": "^1.12.0", 14 | "vue": "^3.2.13", 15 | "vue-router": "^4.5.0" 16 | }, 17 | "devDependencies": { 18 | "@babel/core": "^7.12.16", 19 | "@babel/eslint-parser": "^7.12.16", 20 | "@vue/cli-plugin-babel": "~5.0.0", 21 | "@vue/cli-plugin-eslint": "~5.0.0", 22 | "@vue/cli-service": "~5.0.0", 23 | "eslint": "^7.32.0", 24 | "eslint-plugin-vue": "^8.0.3" 25 | }, 26 | "eslintConfig": { 27 | "root": true, 28 | "env": { 29 | "node": true 30 | }, 31 | "extends": [ 32 | "plugin:vue/vue3-essential", 33 | "eslint:recommended" 34 | ], 35 | "parserOptions": { 36 | "parser": "@babel/eslint-parser" 37 | }, 38 | "rules": {} 39 | }, 40 | "browserslist": [ 41 | "> 1%", 42 | "last 2 versions", 43 | "not dead", 44 | "not ie 11" 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /src/Views/Home/HomePage.vue: -------------------------------------------------------------------------------- 1 | 13 | 44 | -------------------------------------------------------------------------------- /src/Pages/Events/EventPage.vue: -------------------------------------------------------------------------------- 1 | 35 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /src/Pages/Settings/Settings.vue: -------------------------------------------------------------------------------- 1 | 27 | 95 | -------------------------------------------------------------------------------- /src/Utils/Toastiff.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /src/Pages/Statistics/StatisticsModal.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 91 | 92 | -------------------------------------------------------------------------------- /src/Pages/Statistics/Statistics.vue: -------------------------------------------------------------------------------- 1 | 35 | 110 | -------------------------------------------------------------------------------- /src/Pages/Events/EvetModal.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 97 | 98 | 196 | -------------------------------------------------------------------------------- /src/components/CustomSelect.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 135 | 136 | 137 | 196 | -------------------------------------------------------------------------------- /src/Pages/Sertificates/SertificateModal.vue: -------------------------------------------------------------------------------- 1 | 53 | 54 | 167 | -------------------------------------------------------------------------------- /src/Pages/Sertificates/Sertificate.vue: -------------------------------------------------------------------------------- 1 | 69 | 172 | 179 | -------------------------------------------------------------------------------- /src/components/Sidebar.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 66 | 67 | 68 | 69 | 113 | 114 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | -------------------------------------------------------------------------------- /src/Views/Login/LoginPage.vue: -------------------------------------------------------------------------------- 1 | 80 | 81 | 125 | -------------------------------------------------------------------------------- /src/components/DatePicker.vue: -------------------------------------------------------------------------------- 1 | 50 | 51 | 247 | -------------------------------------------------------------------------------- /src/assets/CSS/style.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-display: swap; 3 | font-family: 'Noto Sans'; 4 | font-style: normal; 5 | font-weight: 200; 6 | src: url('../Fonts/noto-sans-v38-latin-200.woff2') format('woff2'); 7 | } 8 | 9 | @font-face { 10 | font-display: swap; 11 | font-family: 'Noto Sans'; 12 | font-style: normal; 13 | font-weight: 300; 14 | src: url('../Fonts/noto-sans-v38-latin-300.woff2') format('woff2'); 15 | } 16 | 17 | @font-face { 18 | font-display: swap; 19 | font-family: 'Noto Sans'; 20 | font-style: normal; 21 | font-weight: 400; 22 | src: url('../Fonts/noto-sans-v38-latin-regular.woff2') format('woff2'); 23 | } 24 | 25 | @font-face { 26 | font-display: swap; 27 | font-family: 'Noto Sans'; 28 | font-style: normal; 29 | font-weight: 500; 30 | src: url('../Fonts/noto-sans-v38-latin-500.woff2') format('woff2'); 31 | } 32 | 33 | @font-face { 34 | font-display: swap; 35 | font-family: 'Noto Sans'; 36 | font-style: normal; 37 | font-weight: 600; 38 | src: url('../Fonts/noto-sans-v38-latin-600.woff2') format('woff2'); 39 | } 40 | 41 | @font-face { 42 | font-display: swap; 43 | font-family: 'Noto Sans'; 44 | font-style: normal; 45 | font-weight: 700; 46 | src: url('../Fonts/noto-sans-v38-latin-700.woff2') format('woff2'); 47 | } 48 | 49 | @font-face { 50 | font-display: swap; 51 | font-family: 'Noto Sans'; 52 | font-style: normal; 53 | font-weight: 800; 54 | src: url('../Fonts/noto-sans-v38-latin-800.woff2') format('woff2'); 55 | } 56 | 57 | @font-face { 58 | font-display: swap; 59 | font-family: 'Noto Sans'; 60 | font-style: normal; 61 | font-weight: 900; 62 | src: url('../Fonts/noto-sans-v38-latin-900.woff2') format('woff2'); 63 | } 64 | 65 | @font-face { 66 | font-display: swap; 67 | font-family: 'Tele-Marianes'; 68 | font-style: normal; 69 | font-weight: 500; 70 | src: url('../Fonts/Telev2.woff') format('woff'); 71 | } 72 | @font-face { 73 | font-display: swap; 74 | font-family: 'Tele-Marianes'; 75 | font-style: normal; 76 | font-weight: 300; 77 | src: url('../Fonts/Telev2c.woff') format('woff'); 78 | } 79 | 80 | @font-face { 81 | font-display: swap; 82 | font-family: 'Tele-Marianes'; 83 | font-style: normal; 84 | font-weight: 300; 85 | src: url('../Fonts/Telev2s.woff') format('woff'); 86 | } 87 | @font-face { 88 | font-display: swap; 89 | font-family: 'Tele-Marianes'; 90 | font-style: normal; 91 | font-weight: 700; 92 | src: url('../Fonts/Telev2cb.woff') format('woff'); 93 | } 94 | 95 | 96 | *, 97 | *::after, 98 | *::before { 99 | margin: 0; 100 | padding: 0; 101 | box-sizing: border-box; 102 | font-family: "Noto Sans", sans-serif; 103 | /* user-select: none; */ 104 | } 105 | 106 | ::-webkit-scrollbar { 107 | width: 4px; 108 | background: gray; 109 | margin-right: 10px; 110 | border-radius: 10px; 111 | } 112 | 113 | html, 114 | body, 115 | #app { 116 | width: 100%; 117 | height: 100%; 118 | background: var(--base-background); 119 | } 120 | 121 | input { 122 | padding: 6px; 123 | } 124 | 125 | input, 126 | button { 127 | background: #fff; 128 | outline: none; 129 | border: none; 130 | } 131 | 132 | a { 133 | color: #000; 134 | text-decoration: none; 135 | outline: none; 136 | } 137 | 138 | li { 139 | list-style: none; 140 | } 141 | 142 | .relative { 143 | position: relative; 144 | } 145 | 146 | .w-100 { 147 | width: 100%; 148 | } 149 | 150 | .w-33 { 151 | width: 33%; 152 | } 153 | 154 | .w-50 { 155 | width: 49%; 156 | } 157 | 158 | .d-flex { 159 | display: flex; 160 | } 161 | 162 | .j-around { 163 | justify-content: space-around; 164 | } 165 | 166 | .j-between { 167 | justify-content: space-between; 168 | } 169 | 170 | .j-center { 171 | justify-content: center; 172 | } 173 | 174 | .j-end { 175 | justify-content: end; 176 | } 177 | 178 | .a-center { 179 | align-items: center; 180 | } 181 | 182 | .a-start { 183 | align-items: start; 184 | } 185 | 186 | .a-end { 187 | align-items: end; 188 | } 189 | 190 | .column { 191 | flex-direction: column; 192 | } 193 | 194 | .wrap { 195 | flex-wrap: wrap; 196 | } 197 | 198 | .radius1 { 199 | border-radius: 8px; 200 | } 201 | 202 | .border1 { 203 | border: 1px solid #bdbdbd; 204 | } 205 | 206 | .border2 { 207 | border: 1px solid #D2D9DF; 208 | } 209 | 210 | .white { 211 | color: white; 212 | } 213 | 214 | .gray { 215 | color: #919191; 216 | } 217 | 218 | /* gap */ 219 | .gap12 { 220 | gap: 12px; 221 | } 222 | 223 | .gap24 { 224 | gap: 24px; 225 | } 226 | 227 | /* padding */ 228 | .p12 { 229 | padding: 12px; 230 | } 231 | 232 | .p10 { 233 | padding: 8px; 234 | } 235 | 236 | .p-24 { 237 | padding: 24px; 238 | } 239 | 240 | .p-0-12 { 241 | padding: 0px 12px; 242 | } 243 | 244 | 245 | /* buttons */ 246 | 247 | .create-button { 248 | border-radius: 8px; 249 | background: #f1d11a; 250 | display: flex; 251 | padding: 12px 40px; 252 | justify-content: center; 253 | align-items: center; 254 | gap: 20px; 255 | color: #FFF; 256 | font-size: 16px; 257 | font-style: normal; 258 | font-weight: 500; 259 | line-height: normal; 260 | letter-spacing: 0.32px; 261 | cursor: pointer; 262 | } 263 | 264 | .danger-button { 265 | border-radius: 8px; 266 | background: #F30300; 267 | display: flex; 268 | padding: 12px 40px; 269 | justify-content: center; 270 | align-items: center; 271 | gap: 20px; 272 | color: #FFF; 273 | font-size: 16px; 274 | font-style: normal; 275 | font-weight: 500; 276 | line-height: normal; 277 | letter-spacing: 0.32px; 278 | cursor: pointer; 279 | } 280 | 281 | .sendButton { 282 | color: #FFF; 283 | border-radius: 5px; 284 | background: #f1d11a; 285 | font-size: 16px; 286 | font-style: normal; 287 | font-weight: 600; 288 | line-height: 150%; 289 | letter-spacing: 0.64px; 290 | text-transform: uppercase; 291 | } 292 | 293 | .icon { 294 | display: flex; 295 | width: 30px; 296 | height: 30px; 297 | padding: 5px; 298 | justify-content: center; 299 | align-items: center; 300 | border-radius: 5px; 301 | } 302 | 303 | .info { 304 | background: #f1d11a; 305 | } 306 | 307 | .danger { 308 | background: #F30300; 309 | } 310 | 311 | .text12 { 312 | font-size: 12px; 313 | } 314 | 315 | .text16 { 316 | font-size: 16px; 317 | } 318 | 319 | .left-item>a { 320 | font-size: 16px; 321 | font-weight: 400; 322 | display: block; 323 | } 324 | 325 | /* page info and item style */ 326 | 327 | .item { 328 | height: 45px; 329 | align-self: stretch; 330 | border-radius: 10px; 331 | border: 1px solid #B1B1B1; 332 | } 333 | 334 | .item>div { 335 | display: flex; 336 | } 337 | 338 | .item>div>p { 339 | flex: 1; 340 | } 341 | 342 | 343 | /* scrollbar */ 344 | 345 | .scroll { 346 | max-height: 99%; 347 | overflow: auto; 348 | } 349 | 350 | .scroll::-webkit-scrollbar { 351 | width: 8px; 352 | height: 8px; 353 | /* Bu yerda bitta kichkina hatolik qolib ketgan ekan sababi 354 | bu yerda agar x oqidan scroll ochilsa buni heighti katta bolib ketarkan */ 355 | } 356 | 357 | .scroll::-webkit-scrollbar-track { 358 | background: #f1f1f1; 359 | border-radius: 8px; 360 | } 361 | 362 | .scroll::-webkit-scrollbar-thumb { 363 | background-color: #a0a0a0; 364 | border-radius: 8px; 365 | border: 2px solid #f1f1f1; 366 | } 367 | 368 | .scroll::-webkit-scrollbar-thumb:hover { 369 | background-color: #888; 370 | } 371 | 372 | .login { 373 | width: 100%; 374 | height: 100%; 375 | display: flex; 376 | justify-content: space-around; 377 | align-items: center; 378 | } 379 | 380 | .left-content { 381 | width: 50%; 382 | height: 100%; 383 | display: flex; 384 | justify-content: center; 385 | align-items: center; 386 | } 387 | 388 | .left-container { 389 | width: 80%; 390 | height: 70%; 391 | display: flex; 392 | flex-direction: column; 393 | justify-content: center; 394 | row-gap: 60px; 395 | } 396 | 397 | .login-icon { 398 | width: 100px; 399 | } 400 | 401 | .login-title { 402 | color: #000; 403 | font-size: 60px; 404 | font-weight: 500; 405 | } 406 | 407 | .login-container-form { 408 | width: 80%; 409 | display: flex; 410 | flex-direction: column; 411 | gap: 15px; 412 | } 413 | 414 | .form-item { 415 | display: flex; 416 | justify-content: space-between; 417 | height: 50px; 418 | padding: 0px 8px; 419 | } 420 | 421 | .form-item:focus-within { 422 | border: 1px solid #f1d11a; 423 | } 424 | 425 | .form-item>input { 426 | width: 100%; 427 | font-size: 18px; 428 | font-weight: 500; 429 | color: gray; 430 | } 431 | 432 | .form-item>input:placeholder { 433 | color: #919191; 434 | } 435 | 436 | 437 | .login-create { 438 | margin-top: 80px; 439 | border-radius: 8px; 440 | background: #f1d11a; 441 | display: flex; 442 | height: 60px; 443 | padding: 21px 0px 20px 0px; 444 | justify-content: center; 445 | color: #FFF; 446 | color: #FFF; 447 | font-size: 16px; 448 | font-style: normal; 449 | font-weight: 700; 450 | line-height: normal; 451 | cursor: pointer; 452 | } 453 | 454 | .right-content { 455 | width: 45%; 456 | height: 95%; 457 | background: #f1d11a; 458 | border-radius: 30px; 459 | display: flex; 460 | justify-content: center; 461 | align-items: center; 462 | } 463 | 464 | .page { 465 | width: 100%; 466 | height: 100%; 467 | padding: 24px; 468 | display: flex; 469 | flex-direction: column; 470 | gap: 20px; 471 | } 472 | 473 | .page-top-buttons { 474 | width: 58%; 475 | } 476 | 477 | .page-bottom { 478 | width: 100%; 479 | height: 94.2%; 480 | border: 1px solid #d1d1d1; 481 | border-radius: 8px; 482 | padding: 12px; 483 | } 484 | 485 | .page-title { 486 | color: #292D32; 487 | font-size: 36px; 488 | font-style: normal; 489 | font-weight: 500; 490 | line-height: normal; 491 | letter-spacing: 0.72px; 492 | } 493 | 494 | 495 | .home-banner { 496 | width: 83%; 497 | height: 100%; 498 | display: flex; 499 | flex-direction: column; 500 | padding: 24px; 501 | gap: 24px; 502 | } 503 | 504 | .curs { 505 | width: 32.2%; 506 | height: 80px; 507 | background: #F9FAFC; 508 | display: flex; 509 | align-items: center; 510 | gap: 12px; 511 | padding: 0px 12px; 512 | } 513 | 514 | .home-banner-bottom { 515 | width: 100%; 516 | height: 100%; 517 | border-radius: 8px; 518 | border: 1px solid #919191; 519 | display: flex; 520 | flex-direction: column; 521 | align-items: end; 522 | } 523 | 524 | .home-banner-bottom>.date { 525 | width: 25%; 526 | min-height: 42px; 527 | display: flex; 528 | align-items: center; 529 | justify-content: end; 530 | position: relative; 531 | padding: 0px 12px; 532 | } 533 | 534 | .border-bottom { 535 | width: 100%; 536 | height: 1px !important; 537 | background: #919191; 538 | } 539 | 540 | table { 541 | width: 100%; 542 | max-height: 100%; 543 | border-collapse: collapse; 544 | } 545 | 546 | th, 547 | td { 548 | border-bottom: 1px solid #919191; 549 | padding: 10px; 550 | text-align: left; 551 | } 552 | 553 | 554 | th { 555 | font-weight: bold; 556 | } 557 | 558 | .settings-page { 559 | width: 83%; 560 | } 561 | 562 | .worker-search { 563 | width: 290px; 564 | height: 44px; 565 | border-radius: 8px; 566 | font-size: 16px; 567 | border: none; 568 | 569 | } 570 | 571 | .worker-title { 572 | text-transform: capitalize; 573 | } 574 | 575 | .fixed-notif { 576 | position: fixed; 577 | bottom: 70px; 578 | right: 70px; 579 | width: 60px; 580 | height: 60px; 581 | border-radius: 50%; 582 | background: blue; 583 | display: flex; 584 | justify-content: center; 585 | align-items: center; 586 | cursor: pointer; 587 | z-index: 2; 588 | } 589 | 590 | .fixed-notif::after { 591 | content: ''; 592 | position: absolute; 593 | top: 0; 594 | left: 0; 595 | width: 100%; 596 | height: 100%; 597 | border: 10px solid #f1d11a; 598 | border-radius: 50%; 599 | animation: pulse 0.8s infinite; 600 | } 601 | 602 | @keyframes pulse { 603 | 0% { 604 | transform: scale(1); 605 | opacity: 0.7; 606 | } 607 | 608 | 25% { 609 | transform: scale(1.1); 610 | opacity: 0.6; 611 | } 612 | 613 | 50% { 614 | transform: scale(1.2); 615 | opacity: 0.5; 616 | } 617 | 618 | 75% { 619 | transform: scale(1.3); 620 | opacity: 0.3; 621 | } 622 | 623 | 90% { 624 | transform: scale(1.4); 625 | opacity: 0.2; 626 | } 627 | 628 | 100% { 629 | transform: scale(1.5); 630 | opacity: 0.1; 631 | } 632 | } 633 | 634 | .jingra>svg { 635 | width: 30px; 636 | height: 30px; 637 | } 638 | 639 | .jingra>svg>path { 640 | stroke: #fff; 641 | } 642 | 643 | .notif-table { 644 | width: 500px; 645 | height: 600px; 646 | border: 1px solid #919191; 647 | backdrop-filter: blur(20px); 648 | position: absolute; 649 | bottom: 50px; 650 | right: 50px; 651 | z-index: 1; 652 | border-radius: 8px; 653 | } 654 | 655 | 656 | @keyframes modalPostion { 657 | 0% { 658 | transform: translateX(2000px); 659 | } 660 | 661 | 100% { 662 | transform: translateX(0); 663 | } 664 | } 665 | 666 | 667 | .modal { 668 | width: 100%; 669 | height: 100%; 670 | position: fixed; 671 | top: 0; 672 | left: 0; 673 | background: rgba(0, 0, 0, 0.5); 674 | display: flex; 675 | align-items: center; 676 | justify-content: end; 677 | z-index: 100; 678 | } 679 | 680 | .modal-content { 681 | width: 90%; 682 | height: 100%; 683 | background: #fff; 684 | border-radius: 30px 0px 0px 30px; 685 | padding: 70px 40px; 686 | display: flex; 687 | flex-direction: column; 688 | justify-content: space-around; 689 | animation: modalPostion 0.8s; 690 | transform: translateX(0); 691 | z-index: 100; 692 | 693 | } 694 | 695 | .slide-modal-enter-active, 696 | .slide-modal-leave-active { 697 | transition: transform 0.5s ease; 698 | } 699 | 700 | .slide-modal-enter { 701 | transform: translateX(100%); 702 | } 703 | 704 | .slide-modal-enter-to { 705 | transform: translateX(0); 706 | } 707 | 708 | .slide-modal-leave-active { 709 | transform: translateX(100%); 710 | } 711 | 712 | .modal-form { 713 | display: grid; 714 | grid-template-columns: repeat(2, 1fr); 715 | gap: 20px; 716 | margin-bottom: 20px; 717 | } 718 | 719 | .form-group { 720 | display: flex; 721 | flex-direction: column; 722 | gap: 4px; 723 | } 724 | 725 | .form-group label { 726 | font-size: 14px; 727 | color: #919EAD; 728 | } 729 | 730 | .form-group input { 731 | padding: 12px; 732 | border: 1px solid #D2D9DF; 733 | border-radius: 8px; 734 | font-size: 14px; 735 | color: #000000; 736 | } 737 | 738 | .form-group>input:placeholder { 739 | color: #919EAD; 740 | } 741 | 742 | .modal-buttons .action-button { 743 | padding: 12px 77px; 744 | font-size: 16px; 745 | border: none; 746 | border-radius: 8px; 747 | cursor: pointer; 748 | } 749 | 750 | .modal-buttons .action-button:first-child { 751 | background-color: #ff4d4d; 752 | color: #fff; 753 | } 754 | 755 | .modal-buttons .action-button:last-child { 756 | background-color: #4d79ff; 757 | color: #fff; 758 | } 759 | 760 | .action-button:disabled { 761 | background-color: #d6d6d6; 762 | cursor: not-allowed; 763 | color: #000; 764 | } 765 | 766 | .border9 { 767 | border: 1px solid #D2D9DF 768 | } 769 | 770 | .text16 { 771 | font-size: 16px; 772 | } 773 | 774 | input[type="number"]::-webkit-outer-spin-button, 775 | input[type="number"]::-webkit-inner-spin-button { 776 | -webkit-appearance: none; 777 | margin: 0; 778 | } 779 | 780 | .error-message { 781 | color: red; 782 | margin-top: 10px; 783 | } 784 | 785 | tbody>tr { 786 | border-bottom: 1px solid #919191; 787 | } 788 | 789 | tbody>tr>td { 790 | border: none, 791 | } 792 | 793 | .notifytable { 794 | min-width: 500px; 795 | } 796 | 797 | .burgericon { 798 | position: fixed; 799 | top: 50%; 800 | left: 0px; 801 | width: 20px; 802 | height: 60px; 803 | background: #6a8ffd; 804 | display: flex; 805 | justify-content: center; 806 | align-items: center; 807 | border-radius: 0px 10px 10px 0px; 808 | display: none; 809 | } 810 | 811 | .burgericon>div>svg { 812 | width: 18px; 813 | height: 18px; 814 | } 815 | 816 | .burgericon>div>svg>path { 817 | stroke-width: 1.5px; 818 | } 819 | 820 | .home-page { 821 | display: flex; 822 | height: 100%; 823 | } 824 | 825 | .main { 826 | width: 100%; 827 | display: flex; 828 | flex-direction: column; 829 | align-items: center; 830 | justify-content: center; 831 | } 832 | 833 | .not-found { 834 | font-size: 28px; 835 | font-weight: 400; 836 | text-transform: uppercase; 837 | text-align: center; 838 | font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; 839 | } 840 | 841 | 842 | 843 | 844 | @media(max-width:980px) { 845 | .cell { 846 | padding: 4px 6px; 847 | font-size: 12px; 848 | } 849 | 850 | .gap12 { 851 | gap: 8px; 852 | } 853 | .modal-form-2{ 854 | grid-template-columns: repeat(2,1fr); 855 | } 856 | } 857 | 858 | 859 | @media (max-width:768px) { 860 | .login-title { 861 | font-size: 42px; 862 | font-weight: 500; 863 | } 864 | 865 | .login>.left-content { 866 | width: 100%; 867 | } 868 | 869 | .login>.right-content { 870 | display: none; 871 | } 872 | 873 | .burgericon { 874 | display: flex; 875 | } 876 | 877 | .burgericon>h3 { 878 | text-transform: capitalize; 879 | } 880 | 881 | .navbar-menu { 882 | height: 80%; 883 | } 884 | 885 | .main { 886 | flex: 11; 887 | } 888 | 889 | .sidebar-logo { 890 | width: 180px; 891 | } 892 | 893 | .page { 894 | padding: 12px; 895 | } 896 | 897 | .navbar { 898 | margin: 0; 899 | } 900 | 901 | .modal-content { 902 | width: 100%; 903 | border-radius: 0px; 904 | } 905 | 906 | .cell { 907 | padding: 4px 6px; 908 | width: min-content; 909 | word-break: break-word; 910 | } 911 | 912 | .cell>.danger, 913 | .cell>.info { 914 | display: none !important; 915 | } 916 | 917 | .cell:nth-child(2) { 918 | width: 150px; 919 | word-break: break-word; 920 | } 921 | 922 | .text16 { 923 | font-size: 10px; 924 | } 925 | 926 | .create-button { 927 | padding: 10px 20px; 928 | font-size: 14px; 929 | } 930 | 931 | .page-top>h3 { 932 | font-size: 15px !important; 933 | } 934 | 935 | .page-bottom { 936 | overflow-x: auto; 937 | } 938 | .table{ 939 | overflow-x: auto !important; 940 | } 941 | .modal-form-2{ 942 | grid-template-columns: (2/1fr); 943 | } 944 | } 945 | 946 | @media (max-width:580px) { 947 | .login-title { 948 | font-size: 36px; 949 | font-weight: 400; 950 | } 951 | .xIcon{ 952 | top: 30px !important; 953 | right: 40px !important; 954 | } 955 | 956 | .login-container-form { 957 | width: 100%; 958 | } 959 | 960 | .notifytable { 961 | min-width: 280px; 962 | width: 40vw; 963 | } 964 | 965 | .create-button { 966 | font-size: 12px; 967 | } 968 | 969 | .page-bottom { 970 | padding: 0px; 971 | } 972 | 973 | .modal-content { 974 | padding: 40px 40px; 975 | justify-content: space-between; 976 | } 977 | .modal-buttons { 978 | width: 100%; 979 | justify-content: space-between; 980 | } 981 | .modal-buttons .action-button { 982 | padding: 12px calc(100% - 85%); 983 | } 984 | .navbar-menu{ 985 | height: 70%; 986 | } 987 | } 988 | @media (max-width:480px){ 989 | form>.modal-form{ 990 | grid-template-columns: repeat(1,1fr); 991 | } 992 | form{ 993 | max-height: 400px; 994 | overflow-y: auto; 995 | } 996 | .modal-content>h3{ 997 | font-size: 14px; 998 | } 999 | .xIcon>svg{ 1000 | width: 36px; 1001 | height: 36px; 1002 | } 1003 | .navbar-menu{ 1004 | height: 70%; 1005 | } 1006 | .page{ 1007 | padding:0px 24px ; 1008 | height: 99%; 1009 | } 1010 | } 1011 | 1012 | 1013 | 1014 | @keyframes skeleton-loading { 1015 | 0% { 1016 | background-color: #e0e0e0; 1017 | } 1018 | 1019 | 100% { 1020 | background-color: #f5f5f5; 1021 | } 1022 | } 1023 | 1024 | .skeleton { 1025 | width: 100%; 1026 | height: auto; 1027 | border-radius: 4px; 1028 | animation: skeleton-loading 1.5s infinite alternate; 1029 | } 1030 | 1031 | 1032 | 1033 | .table, 1034 | .history { 1035 | display: flex; 1036 | flex-direction: column; 1037 | width: 100%; 1038 | } 1039 | .history-body { 1040 | max-height: 400px; 1041 | overflow: auto; 1042 | } 1043 | 1044 | .row { 1045 | display: flex; 1046 | justify-content: space-between; 1047 | padding: 12px; 1048 | border-bottom: 1px solid #ddd; 1049 | } 1050 | .row-top { 1051 | padding: 6px 8px; 1052 | display: flex; 1053 | justify-content: space-between; 1054 | border-bottom: 1px solid #ddd; 1055 | } 1056 | .row-items { 1057 | display: flex; 1058 | flex-direction: column; 1059 | padding: 12px; 1060 | border-bottom: 1px solid #ddd; 1061 | } 1062 | 1063 | .row-items > .top { 1064 | display: flex; 1065 | justify-content: space-between; 1066 | } 1067 | 1068 | .cell { 1069 | flex: 1; 1070 | padding: 8px; 1071 | text-align: left; 1072 | } 1073 | 1074 | .table-header .row { 1075 | font-weight: bold; 1076 | background-color: #f5f5f5; 1077 | border-radius: 8px; 1078 | } 1079 | 1080 | .history { 1081 | background: #fafafa; 1082 | padding: 10px; 1083 | border-radius: 8px; 1084 | } 1085 | 1086 | .history-header .row { 1087 | font-weight: bold; 1088 | } 1089 | .rotated { 1090 | transform: rotate(180deg); 1091 | transition: transform 0.3s ease; 1092 | } 1093 | @media (max-width: 768px) { 1094 | .table { 1095 | min-width: calc(150px + 100%); 1096 | } 1097 | } 1098 | @media (max-width: 580px) { 1099 | .table { 1100 | min-width: calc(300px + 100%); 1101 | } 1102 | } 1103 | @media (max-width: 380px) { 1104 | .table { 1105 | min-width: calc(550px + 100%); 1106 | } 1107 | .table .cell { 1108 | width: 100%; 1109 | } 1110 | } -------------------------------------------------------------------------------- /src/components/Icons.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 88 | 89 | 91 | --------------------------------------------------------------------------------