├── .gitignore ├── CHANGELOG.md ├── README.md ├── index.html ├── package.json ├── pnpm-lock.yaml ├── postcss.config.cjs ├── public ├── _redirects └── favicon.ico ├── src ├── App.vue ├── charts │ ├── BarChart01.vue │ ├── BarChart02.vue │ ├── BarChart03.vue │ ├── ChartjsConfig.js │ ├── DoughnutChart.vue │ ├── LineChart01.vue │ ├── LineChart02.vue │ └── RealtimeChart.vue ├── components │ ├── Datepicker.vue │ ├── DropdownEditMenu.vue │ ├── DropdownFilter.vue │ ├── DropdownHelp.vue │ ├── DropdownNotifications.vue │ ├── DropdownProfile.vue │ ├── ModalSearch.vue │ ├── ThemeToggle.vue │ └── Tooltip.vue ├── css │ ├── additional-styles │ │ ├── flatpickr.css │ │ └── utility-patterns.css │ └── style.css ├── images │ ├── icon-01.svg │ ├── icon-02.svg │ ├── icon-03.svg │ ├── user-36-05.jpg │ ├── user-36-06.jpg │ ├── user-36-07.jpg │ ├── user-36-08.jpg │ ├── user-36-09.jpg │ └── user-avatar-32.png ├── main.js ├── pages │ └── Dashboard.vue ├── partials │ ├── Banner.vue │ ├── Header.vue │ ├── Sidebar.vue │ ├── SidebarLinkGroup.vue │ └── dashboard │ │ ├── DashboardCard01.vue │ │ ├── DashboardCard02.vue │ │ ├── DashboardCard03.vue │ │ ├── DashboardCard04.vue │ │ ├── DashboardCard05.vue │ │ ├── DashboardCard06.vue │ │ ├── DashboardCard07.vue │ │ ├── DashboardCard08.vue │ │ ├── DashboardCard09.vue │ │ ├── DashboardCard10.vue │ │ ├── DashboardCard11.vue │ │ ├── DashboardCard12.vue │ │ └── DashboardCard13.vue ├── router.js └── utils │ └── Utils.js └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG.md 2 | 3 | ## [4.0.0] - 2025-02-04 4 | 5 | - Updgrade to Tailwind v4 6 | - Update dependencies 7 | 8 | ## [3.1.0] 2024-12-08 9 | 10 | - Upgrade to Vite 6 11 | 12 | ## [3.0.0] - 2024-07-05 13 | 14 | - Mosaic Redesign 15 | 16 | ## [2.1.0] - 2023-12-08 17 | 18 | - Update to Vite 5 19 | - Update dependencies 20 | 21 | ## [2.0.1] - 2023-10-04 22 | 23 | - Dependencies update 24 | 25 | ## [2.0.0] - 2023-06-01 26 | 27 | - Dark version added 28 | 29 | ## [1.4.3] - 2023-04-11 30 | 31 | - Update dependencies 32 | 33 | ## [1.4.2] - 2023-02-13 34 | 35 | - Update dependencies 36 | - Improve sidebar icons color logic 37 | 38 | ## [1.4.0] - 2022-08-30 39 | 40 | - Update sidebar 41 | 42 | ## [1.3.0] - 2022-07-15 43 | 44 | - Replace Sass with CSS files 45 | - Update dependencies 46 | 47 | ## [1.1.0] - 2021-12-13 48 | 49 | - Update Tailwind 3 50 | - Several improvements 51 | 52 | ## [1.0.3] - 2021-12-10 53 | 54 | - Alignment issue 55 | 56 | ## [1.0.2] - 2021-11-23 57 | 58 | - Alignment issue 59 | 60 | ## [1.0.1] - 2021-11-22 61 | 62 | Fix dashboard icon color 63 | 64 | ## [1.0.0] - 2021-11-22 65 | 66 | First release -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Free Tailwind & Vue.js admin dashboard template 2 | 3 | ![Mosaic TailwindCSS template preview](https://github.com/cruip/vuejs-admin-dashboard-template/assets/2683512/3b9af06c-f3b2-45c5-8c60-052989cbebcb) 4 | 5 | **Mosaic Lite Vue** is a responsive dashboard template built on top of TailwindCSS and fully coded in Vue.js. This template is a great starting point for anyone who wants to create a user interface for SaaS products, administrator dashboards, modern web apps, and more. 6 | 7 | **UPDATE 2025-02-04** Added Tailwind v4 support! 8 | 9 | Use it for whatever you want, and be sure to reach us out on [Twitter](https://twitter.com/Cruip_com) if you build anything cool/useful with it. 10 | 11 | [Also available in React](https://github.com/cruip/tailwind-dashboard-template) 12 | 13 | Created and maintained with ❤️ by [Cruip.com](https://cruip.com/). 14 | 15 | ## Live demo 16 | 17 | Check the live demo here 👉️ [https://mosaic-vue.cruip.com/](https://mosaic-vue.cruip.com/) 18 | 19 | ## Mosaic Pro 20 | 21 | [![Mosaic Tailwind Admin Template](https://github.com/cruip/tailwind-dashboard-template/assets/2683512/2b4d0fae-bb07-4229-8a8a-48005f2f33cb)](https://cruip.com/mosaic/) 22 | 23 | ## Design files 24 | 25 | If you need the design files, you can download them from Figma's Community 👉 https://bit.ly/3sigqHe 26 | 27 | ## Table of contents 28 | 29 | * [Usage](#usage) 30 | * [Project setup](#project-setup) 31 | * [Compiles and hot-reloads for development](#compiles-and-hot-reloads-for-development) 32 | * [Compiles and minifies for production](#compiles-and-minifies-for-production) 33 | * [Customize configuration](#customize-configuration) 34 | * [Credits](#credits) 35 | * [Terms and License](#terms-and-license) 36 | * [About Us](#about-us) 37 | * [Stay in the loop](#stay-in-the-loop) 38 | 39 | ## Usage 40 | 41 | This project was built with [Vue 3](https://v3.vuejs.org/) and [Vite](https://vitejs.dev/). 42 | 43 | ### Project setup 44 | ``` 45 | pnpm install 46 | ``` 47 | 48 | #### Compiles and hot-reloads for development 49 | ``` 50 | pnpm run dev 51 | ``` 52 | 53 | #### Compiles and minifies for production 54 | ``` 55 | pnpm run build 56 | ``` 57 | 58 | #### Customize configuration 59 | See [Configuration Reference](https://vitejs.dev/guide/). 60 | 61 | ## Credits 62 | 63 | - [Nucleo](https://nucleoapp.com/) 64 | 65 | ## Terms and License 66 | 67 | - Released under the [GPL](https://www.gnu.org/licenses/gpl-3.0.html). 68 | - Copyright 2025 [Cruip](https://cruip.com/). 69 | - Use it for personal and commercial projects, but please don’t republish, redistribute, or resell the template. 70 | - Attribution is not required, although it is really appreciated. 71 | 72 | ## About Us 73 | 74 | We're an Italian developer/designer duo creating high-quality design/code resources for developers, makers, and startups. 75 | 76 | ## Stay in the loop 77 | 78 | If you would like to know when we release new resources, you can follow [@pacovitiello](https://x.com/pacovitiello) and [@DavidePacilio](https://x.com/DavidePacilio) on X, or you can subscribe to our [newsletter](https://cruip.com/newsletter/). 79 | 80 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mosaic-vue", 3 | "version": "0.0.0", 4 | "type": "module", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "@tailwindcss/forms": "^0.5.7", 12 | "@vueuse/core": "^12.0.0", 13 | "chart.js": "^4.4.1", 14 | "chartjs-adapter-moment": "^1.0.1", 15 | "flatpickr": "^4.6.13", 16 | "moment": "^2.29.4", 17 | "vue": "^3.2.20", 18 | "vue-flatpickr-component": "^11.0.3", 19 | "vue-router": "^4.2.5" 20 | }, 21 | "devDependencies": { 22 | "@tailwindcss/postcss": "^4.0.0", 23 | "@vitejs/plugin-vue": "^5.0.5", 24 | "@vue/compiler-sfc": "^3.2.20", 25 | "postcss": "^8.4.32", 26 | "tailwindcss": "^4.0.0", 27 | "vite": "^6.0.3" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@tailwindcss/forms': 12 | specifier: ^0.5.7 13 | version: 0.5.10(tailwindcss@4.0.3) 14 | '@vueuse/core': 15 | specifier: ^12.0.0 16 | version: 12.5.0 17 | chart.js: 18 | specifier: ^4.4.1 19 | version: 4.4.7 20 | chartjs-adapter-moment: 21 | specifier: ^1.0.1 22 | version: 1.0.1(chart.js@4.4.7)(moment@2.30.1) 23 | flatpickr: 24 | specifier: ^4.6.13 25 | version: 4.6.13 26 | moment: 27 | specifier: ^2.29.4 28 | version: 2.30.1 29 | vue: 30 | specifier: ^3.2.20 31 | version: 3.5.13 32 | vue-flatpickr-component: 33 | specifier: ^11.0.3 34 | version: 11.0.5(vue@3.5.13) 35 | vue-router: 36 | specifier: ^4.2.5 37 | version: 4.5.0(vue@3.5.13) 38 | devDependencies: 39 | '@tailwindcss/postcss': 40 | specifier: ^4.0.0 41 | version: 4.0.3 42 | '@vitejs/plugin-vue': 43 | specifier: ^5.0.5 44 | version: 5.2.1(vite@6.0.11(jiti@2.4.2)(lightningcss@1.29.1))(vue@3.5.13) 45 | '@vue/compiler-sfc': 46 | specifier: ^3.2.20 47 | version: 3.5.13 48 | postcss: 49 | specifier: ^8.4.32 50 | version: 8.5.1 51 | tailwindcss: 52 | specifier: ^4.0.0 53 | version: 4.0.3 54 | vite: 55 | specifier: ^6.0.3 56 | version: 6.0.11(jiti@2.4.2)(lightningcss@1.29.1) 57 | 58 | packages: 59 | 60 | '@alloc/quick-lru@5.2.0': 61 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 62 | engines: {node: '>=10'} 63 | 64 | '@babel/helper-string-parser@7.25.9': 65 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 66 | engines: {node: '>=6.9.0'} 67 | 68 | '@babel/helper-validator-identifier@7.25.9': 69 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 70 | engines: {node: '>=6.9.0'} 71 | 72 | '@babel/parser@7.26.7': 73 | resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} 74 | engines: {node: '>=6.0.0'} 75 | hasBin: true 76 | 77 | '@babel/types@7.26.7': 78 | resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} 79 | engines: {node: '>=6.9.0'} 80 | 81 | '@esbuild/aix-ppc64@0.24.2': 82 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 83 | engines: {node: '>=18'} 84 | cpu: [ppc64] 85 | os: [aix] 86 | 87 | '@esbuild/android-arm64@0.24.2': 88 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 89 | engines: {node: '>=18'} 90 | cpu: [arm64] 91 | os: [android] 92 | 93 | '@esbuild/android-arm@0.24.2': 94 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 95 | engines: {node: '>=18'} 96 | cpu: [arm] 97 | os: [android] 98 | 99 | '@esbuild/android-x64@0.24.2': 100 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 101 | engines: {node: '>=18'} 102 | cpu: [x64] 103 | os: [android] 104 | 105 | '@esbuild/darwin-arm64@0.24.2': 106 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 107 | engines: {node: '>=18'} 108 | cpu: [arm64] 109 | os: [darwin] 110 | 111 | '@esbuild/darwin-x64@0.24.2': 112 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 113 | engines: {node: '>=18'} 114 | cpu: [x64] 115 | os: [darwin] 116 | 117 | '@esbuild/freebsd-arm64@0.24.2': 118 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 119 | engines: {node: '>=18'} 120 | cpu: [arm64] 121 | os: [freebsd] 122 | 123 | '@esbuild/freebsd-x64@0.24.2': 124 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 125 | engines: {node: '>=18'} 126 | cpu: [x64] 127 | os: [freebsd] 128 | 129 | '@esbuild/linux-arm64@0.24.2': 130 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 131 | engines: {node: '>=18'} 132 | cpu: [arm64] 133 | os: [linux] 134 | 135 | '@esbuild/linux-arm@0.24.2': 136 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 137 | engines: {node: '>=18'} 138 | cpu: [arm] 139 | os: [linux] 140 | 141 | '@esbuild/linux-ia32@0.24.2': 142 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 143 | engines: {node: '>=18'} 144 | cpu: [ia32] 145 | os: [linux] 146 | 147 | '@esbuild/linux-loong64@0.24.2': 148 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 149 | engines: {node: '>=18'} 150 | cpu: [loong64] 151 | os: [linux] 152 | 153 | '@esbuild/linux-mips64el@0.24.2': 154 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 155 | engines: {node: '>=18'} 156 | cpu: [mips64el] 157 | os: [linux] 158 | 159 | '@esbuild/linux-ppc64@0.24.2': 160 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 161 | engines: {node: '>=18'} 162 | cpu: [ppc64] 163 | os: [linux] 164 | 165 | '@esbuild/linux-riscv64@0.24.2': 166 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 167 | engines: {node: '>=18'} 168 | cpu: [riscv64] 169 | os: [linux] 170 | 171 | '@esbuild/linux-s390x@0.24.2': 172 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 173 | engines: {node: '>=18'} 174 | cpu: [s390x] 175 | os: [linux] 176 | 177 | '@esbuild/linux-x64@0.24.2': 178 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 179 | engines: {node: '>=18'} 180 | cpu: [x64] 181 | os: [linux] 182 | 183 | '@esbuild/netbsd-arm64@0.24.2': 184 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 185 | engines: {node: '>=18'} 186 | cpu: [arm64] 187 | os: [netbsd] 188 | 189 | '@esbuild/netbsd-x64@0.24.2': 190 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 191 | engines: {node: '>=18'} 192 | cpu: [x64] 193 | os: [netbsd] 194 | 195 | '@esbuild/openbsd-arm64@0.24.2': 196 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 197 | engines: {node: '>=18'} 198 | cpu: [arm64] 199 | os: [openbsd] 200 | 201 | '@esbuild/openbsd-x64@0.24.2': 202 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 203 | engines: {node: '>=18'} 204 | cpu: [x64] 205 | os: [openbsd] 206 | 207 | '@esbuild/sunos-x64@0.24.2': 208 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 209 | engines: {node: '>=18'} 210 | cpu: [x64] 211 | os: [sunos] 212 | 213 | '@esbuild/win32-arm64@0.24.2': 214 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 215 | engines: {node: '>=18'} 216 | cpu: [arm64] 217 | os: [win32] 218 | 219 | '@esbuild/win32-ia32@0.24.2': 220 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 221 | engines: {node: '>=18'} 222 | cpu: [ia32] 223 | os: [win32] 224 | 225 | '@esbuild/win32-x64@0.24.2': 226 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 227 | engines: {node: '>=18'} 228 | cpu: [x64] 229 | os: [win32] 230 | 231 | '@jridgewell/sourcemap-codec@1.5.0': 232 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 233 | 234 | '@kurkle/color@0.3.4': 235 | resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} 236 | 237 | '@rollup/rollup-android-arm-eabi@4.34.1': 238 | resolution: {integrity: sha512-kwctwVlswSEsr4ljpmxKrRKp1eG1v2NAhlzFzDf1x1OdYaMjBYjDCbHkzWm57ZXzTwqn8stMXgROrnMw8dJK3w==} 239 | cpu: [arm] 240 | os: [android] 241 | 242 | '@rollup/rollup-android-arm64@4.34.1': 243 | resolution: {integrity: sha512-4H5ZtZitBPlbPsTv6HBB8zh1g5d0T8TzCmpndQdqq20Ugle/nroOyDMf9p7f88Gsu8vBLU78/cuh8FYHZqdXxw==} 244 | cpu: [arm64] 245 | os: [android] 246 | 247 | '@rollup/rollup-darwin-arm64@4.34.1': 248 | resolution: {integrity: sha512-f2AJ7Qwx9z25hikXvg+asco8Sfuc5NCLg8rmqQBIOUoWys5sb/ZX9RkMZDPdnnDevXAMJA5AWLnRBmgdXGEUiA==} 249 | cpu: [arm64] 250 | os: [darwin] 251 | 252 | '@rollup/rollup-darwin-x64@4.34.1': 253 | resolution: {integrity: sha512-+/2JBrRfISCsWE4aEFXxd+7k9nWGXA8+wh7ZUHn/u8UDXOU9LN+QYKKhd57sIn6WRcorOnlqPMYFIwie/OHXWw==} 254 | cpu: [x64] 255 | os: [darwin] 256 | 257 | '@rollup/rollup-freebsd-arm64@4.34.1': 258 | resolution: {integrity: sha512-SUeB0pYjIXwT2vfAMQ7E4ERPq9VGRrPR7Z+S4AMssah5EHIilYqjWQoTn5dkDtuIJUSTs8H+C9dwoEcg3b0sCA==} 259 | cpu: [arm64] 260 | os: [freebsd] 261 | 262 | '@rollup/rollup-freebsd-x64@4.34.1': 263 | resolution: {integrity: sha512-L3T66wAZiB/ooiPbxz0s6JEX6Sr2+HfgPSK+LMuZkaGZFAFCQAHiP3dbyqovYdNaiUXcl9TlgnIbcsIicAnOZg==} 264 | cpu: [x64] 265 | os: [freebsd] 266 | 267 | '@rollup/rollup-linux-arm-gnueabihf@4.34.1': 268 | resolution: {integrity: sha512-UBXdQ4+ATARuFgsFrQ+tAsKvBi/Hly99aSVdeCUiHV9dRTTpMU7OrM3WXGys1l40wKVNiOl0QYY6cZQJ2xhKlQ==} 269 | cpu: [arm] 270 | os: [linux] 271 | 272 | '@rollup/rollup-linux-arm-musleabihf@4.34.1': 273 | resolution: {integrity: sha512-m/yfZ25HGdcCSwmopEJm00GP7xAUyVcBPjttGLRAqZ60X/bB4Qn6gP7XTwCIU6bITeKmIhhwZ4AMh2XLro+4+w==} 274 | cpu: [arm] 275 | os: [linux] 276 | 277 | '@rollup/rollup-linux-arm64-gnu@4.34.1': 278 | resolution: {integrity: sha512-Wy+cUmFuvziNL9qWRRzboNprqSQ/n38orbjRvd6byYWridp5TJ3CD+0+HUsbcWVSNz9bxkDUkyASGP0zS7GAvg==} 279 | cpu: [arm64] 280 | os: [linux] 281 | 282 | '@rollup/rollup-linux-arm64-musl@4.34.1': 283 | resolution: {integrity: sha512-CQ3MAGgiFmQW5XJX5W3wnxOBxKwFlUAgSXFA2SwgVRjrIiVt5LHfcQLeNSHKq5OEZwv+VCBwlD1+YKCjDG8cpg==} 284 | cpu: [arm64] 285 | os: [linux] 286 | 287 | '@rollup/rollup-linux-loongarch64-gnu@4.34.1': 288 | resolution: {integrity: sha512-rSzb1TsY4lSwH811cYC3OC2O2mzNMhM13vcnA7/0T6Mtreqr3/qs6WMDriMRs8yvHDI54qxHgOk8EV5YRAHFbw==} 289 | cpu: [loong64] 290 | os: [linux] 291 | 292 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.1': 293 | resolution: {integrity: sha512-fwr0n6NS0pG3QxxlqVYpfiY64Fd1Dqd8Cecje4ILAV01ROMp4aEdCj5ssHjRY3UwU7RJmeWd5fi89DBqMaTawg==} 294 | cpu: [ppc64] 295 | os: [linux] 296 | 297 | '@rollup/rollup-linux-riscv64-gnu@4.34.1': 298 | resolution: {integrity: sha512-4uJb9qz7+Z/yUp5RPxDGGGUcoh0PnKF33QyWgEZ3X/GocpWb6Mb+skDh59FEt5d8+Skxqs9mng6Swa6B2AmQZg==} 299 | cpu: [riscv64] 300 | os: [linux] 301 | 302 | '@rollup/rollup-linux-s390x-gnu@4.34.1': 303 | resolution: {integrity: sha512-QlIo8ndocWBEnfmkYqj8vVtIUpIqJjfqKggjy7IdUncnt8BGixte1wDON7NJEvLg3Kzvqxtbo8tk+U1acYEBlw==} 304 | cpu: [s390x] 305 | os: [linux] 306 | 307 | '@rollup/rollup-linux-x64-gnu@4.34.1': 308 | resolution: {integrity: sha512-hzpleiKtq14GWjz3ahWvJXgU1DQC9DteiwcsY4HgqUJUGxZThlL66MotdUEK9zEo0PK/2ADeZGM9LIondE302A==} 309 | cpu: [x64] 310 | os: [linux] 311 | 312 | '@rollup/rollup-linux-x64-musl@4.34.1': 313 | resolution: {integrity: sha512-jqtKrO715hDlvUcEsPn55tZt2TEiBvBtCMkUuU0R6fO/WPT7lO9AONjPbd8II7/asSiNVQHCMn4OLGigSuxVQA==} 314 | cpu: [x64] 315 | os: [linux] 316 | 317 | '@rollup/rollup-win32-arm64-msvc@4.34.1': 318 | resolution: {integrity: sha512-RnHy7yFf2Wz8Jj1+h8klB93N0NHNHXFhNwAmiy9zJdpY7DE01VbEVtPdrK1kkILeIbHGRJjvfBDBhnxBr8kD4g==} 319 | cpu: [arm64] 320 | os: [win32] 321 | 322 | '@rollup/rollup-win32-ia32-msvc@4.34.1': 323 | resolution: {integrity: sha512-i7aT5HdiZIcd7quhzvwQ2oAuX7zPYrYfkrd1QFfs28Po/i0q6kas/oRrzGlDhAEyug+1UfUtkWdmoVlLJj5x9Q==} 324 | cpu: [ia32] 325 | os: [win32] 326 | 327 | '@rollup/rollup-win32-x64-msvc@4.34.1': 328 | resolution: {integrity: sha512-k3MVFD9Oq+laHkw2N2v7ILgoa9017ZMF/inTtHzyTVZjYs9cSH18sdyAf6spBAJIGwJ5UaC7et2ZH1WCdlhkMw==} 329 | cpu: [x64] 330 | os: [win32] 331 | 332 | '@tailwindcss/forms@0.5.10': 333 | resolution: {integrity: sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==} 334 | peerDependencies: 335 | tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' 336 | 337 | '@tailwindcss/node@4.0.3': 338 | resolution: {integrity: sha512-QsVJokOl0pJ4AbJV33D2npvLcHGPWi5MOSZtrtE0GT3tSx+3D0JE2lokLA8yHS1x3oCY/3IyRyy7XX6tmzid7A==} 339 | 340 | '@tailwindcss/oxide-android-arm64@4.0.3': 341 | resolution: {integrity: sha512-S8XOTQuMnpijZRlPm5HBzPJjZ28quB+40LSRHjRnQF6rRYKsvpr1qkY7dfwsetNdd+kMLOMDsvmuT8WnqqETvg==} 342 | engines: {node: '>= 10'} 343 | cpu: [arm64] 344 | os: [android] 345 | 346 | '@tailwindcss/oxide-darwin-arm64@4.0.3': 347 | resolution: {integrity: sha512-smrY2DpzhXvgDhZtQlYAl8+vxJ04lv2/64C1eiRxvsRT2nkw/q+zA1/eAYKvUHat6cIuwqDku3QucmrUT6pCeg==} 348 | engines: {node: '>= 10'} 349 | cpu: [arm64] 350 | os: [darwin] 351 | 352 | '@tailwindcss/oxide-darwin-x64@4.0.3': 353 | resolution: {integrity: sha512-NTz8x/LcGUjpZAWUxz0ZuzHao90Wj9spoQgomwB+/hgceh5gcJDfvaBYqxLFpKzVglpnbDSq1Fg0p0zI4oa5Pg==} 354 | engines: {node: '>= 10'} 355 | cpu: [x64] 356 | os: [darwin] 357 | 358 | '@tailwindcss/oxide-freebsd-x64@4.0.3': 359 | resolution: {integrity: sha512-yQc9Q0JCOp3kkAV8gKgDctXO60IkQhHpqGB+KgOccDtD5UmN6Q5+gd+lcsDyQ7N8dRuK1fAud51xQpZJgKfm7g==} 360 | engines: {node: '>= 10'} 361 | cpu: [x64] 362 | os: [freebsd] 363 | 364 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.3': 365 | resolution: {integrity: sha512-e1ivVMLSnxTOU1O3npnxN16FEyWM/g3SuH2pP6udxXwa0/SnSAijRwcAYRpqIlhVKujr158S8UeHxQjC4fGl4w==} 366 | engines: {node: '>= 10'} 367 | cpu: [arm] 368 | os: [linux] 369 | 370 | '@tailwindcss/oxide-linux-arm64-gnu@4.0.3': 371 | resolution: {integrity: sha512-PLrToqQqX6sdJ9DmMi8IxZWWrfjc9pdi9AEEPTrtMts3Jm9HBi1WqEeF1VwZZ2aW9TXloE5OwA35zuuq1Bhb/Q==} 372 | engines: {node: '>= 10'} 373 | cpu: [arm64] 374 | os: [linux] 375 | 376 | '@tailwindcss/oxide-linux-arm64-musl@4.0.3': 377 | resolution: {integrity: sha512-YlzRxx7N1ampfgSKzEDw0iwDkJXUInR4cgNEqmR4TzHkU2Vhg59CGPJrTI7dxOBofD8+O35R13Nk9Ytyv0JUFg==} 378 | engines: {node: '>= 10'} 379 | cpu: [arm64] 380 | os: [linux] 381 | 382 | '@tailwindcss/oxide-linux-x64-gnu@4.0.3': 383 | resolution: {integrity: sha512-Xfc3z/li6XkuD7Hs+Uk6pjyCXnfnd9zuQTKOyDTZJ544xc2yoMKUkuDw6Et9wb31MzU2/c0CIUpTDa71lL9KHw==} 384 | engines: {node: '>= 10'} 385 | cpu: [x64] 386 | os: [linux] 387 | 388 | '@tailwindcss/oxide-linux-x64-musl@4.0.3': 389 | resolution: {integrity: sha512-ugKVqKzwa/cjmqSQG17aS9DYrEcQ/a5NITcgmOr3JLW4Iz64C37eoDlkC8tIepD3S/Td/ywKAolTQ8fKbjEL4g==} 390 | engines: {node: '>= 10'} 391 | cpu: [x64] 392 | os: [linux] 393 | 394 | '@tailwindcss/oxide-win32-arm64-msvc@4.0.3': 395 | resolution: {integrity: sha512-qHPDMl+UUwsk1RMJMgAXvhraWqUUT+LR/tkXix5RA39UGxtTrHwsLIN1AhNxI5i2RFXAXfmFXDqZCdyQ4dWmAQ==} 396 | engines: {node: '>= 10'} 397 | cpu: [arm64] 398 | os: [win32] 399 | 400 | '@tailwindcss/oxide-win32-x64-msvc@4.0.3': 401 | resolution: {integrity: sha512-+ujwN4phBGyOsPyLgGgeCyUm4Mul+gqWVCIGuSXWgrx9xVUnf6LVXrw0BDBc9Aq1S2qMyOTX4OkCGbZeoIo8Qw==} 402 | engines: {node: '>= 10'} 403 | cpu: [x64] 404 | os: [win32] 405 | 406 | '@tailwindcss/oxide@4.0.3': 407 | resolution: {integrity: sha512-FFcp3VNvRjjmFA39ORM27g2mbflMQljhvM7gxBAujHxUy4LXlKa6yMF9wbHdTbPqTONiCyyOYxccvJyVyI/XBg==} 408 | engines: {node: '>= 10'} 409 | 410 | '@tailwindcss/postcss@4.0.3': 411 | resolution: {integrity: sha512-qUyxuhuI2eTgRJ+qfCQRAr69Cw7BdSz+PoNFUNoRuhPjikNC8+sxK+Mi/chaXAXewjv/zbf6if6z6ItVLh+e9Q==} 412 | 413 | '@types/estree@1.0.6': 414 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 415 | 416 | '@types/web-bluetooth@0.0.20': 417 | resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} 418 | 419 | '@vitejs/plugin-vue@5.2.1': 420 | resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} 421 | engines: {node: ^18.0.0 || >=20.0.0} 422 | peerDependencies: 423 | vite: ^5.0.0 || ^6.0.0 424 | vue: ^3.2.25 425 | 426 | '@vue/compiler-core@3.5.13': 427 | resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} 428 | 429 | '@vue/compiler-dom@3.5.13': 430 | resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} 431 | 432 | '@vue/compiler-sfc@3.5.13': 433 | resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} 434 | 435 | '@vue/compiler-ssr@3.5.13': 436 | resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} 437 | 438 | '@vue/devtools-api@6.6.4': 439 | resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} 440 | 441 | '@vue/reactivity@3.5.13': 442 | resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} 443 | 444 | '@vue/runtime-core@3.5.13': 445 | resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} 446 | 447 | '@vue/runtime-dom@3.5.13': 448 | resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} 449 | 450 | '@vue/server-renderer@3.5.13': 451 | resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} 452 | peerDependencies: 453 | vue: 3.5.13 454 | 455 | '@vue/shared@3.5.13': 456 | resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} 457 | 458 | '@vueuse/core@12.5.0': 459 | resolution: {integrity: sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==} 460 | 461 | '@vueuse/metadata@12.5.0': 462 | resolution: {integrity: sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==} 463 | 464 | '@vueuse/shared@12.5.0': 465 | resolution: {integrity: sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==} 466 | 467 | chart.js@4.4.7: 468 | resolution: {integrity: sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw==} 469 | engines: {pnpm: '>=8'} 470 | 471 | chartjs-adapter-moment@1.0.1: 472 | resolution: {integrity: sha512-Uz+nTX/GxocuqXpGylxK19YG4R3OSVf8326D+HwSTsNw1LgzyIGRo+Qujwro1wy6X+soNSnfj5t2vZ+r6EaDmA==} 473 | peerDependencies: 474 | chart.js: '>=3.0.0' 475 | moment: ^2.10.2 476 | 477 | csstype@3.1.3: 478 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 479 | 480 | detect-libc@1.0.3: 481 | resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} 482 | engines: {node: '>=0.10'} 483 | hasBin: true 484 | 485 | enhanced-resolve@5.18.0: 486 | resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} 487 | engines: {node: '>=10.13.0'} 488 | 489 | entities@4.5.0: 490 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 491 | engines: {node: '>=0.12'} 492 | 493 | esbuild@0.24.2: 494 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 495 | engines: {node: '>=18'} 496 | hasBin: true 497 | 498 | estree-walker@2.0.2: 499 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 500 | 501 | flatpickr@4.6.13: 502 | resolution: {integrity: sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==} 503 | 504 | fsevents@2.3.3: 505 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 506 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 507 | os: [darwin] 508 | 509 | graceful-fs@4.2.11: 510 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 511 | 512 | jiti@2.4.2: 513 | resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 514 | hasBin: true 515 | 516 | lightningcss-darwin-arm64@1.29.1: 517 | resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} 518 | engines: {node: '>= 12.0.0'} 519 | cpu: [arm64] 520 | os: [darwin] 521 | 522 | lightningcss-darwin-x64@1.29.1: 523 | resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} 524 | engines: {node: '>= 12.0.0'} 525 | cpu: [x64] 526 | os: [darwin] 527 | 528 | lightningcss-freebsd-x64@1.29.1: 529 | resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} 530 | engines: {node: '>= 12.0.0'} 531 | cpu: [x64] 532 | os: [freebsd] 533 | 534 | lightningcss-linux-arm-gnueabihf@1.29.1: 535 | resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} 536 | engines: {node: '>= 12.0.0'} 537 | cpu: [arm] 538 | os: [linux] 539 | 540 | lightningcss-linux-arm64-gnu@1.29.1: 541 | resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} 542 | engines: {node: '>= 12.0.0'} 543 | cpu: [arm64] 544 | os: [linux] 545 | 546 | lightningcss-linux-arm64-musl@1.29.1: 547 | resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} 548 | engines: {node: '>= 12.0.0'} 549 | cpu: [arm64] 550 | os: [linux] 551 | 552 | lightningcss-linux-x64-gnu@1.29.1: 553 | resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} 554 | engines: {node: '>= 12.0.0'} 555 | cpu: [x64] 556 | os: [linux] 557 | 558 | lightningcss-linux-x64-musl@1.29.1: 559 | resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} 560 | engines: {node: '>= 12.0.0'} 561 | cpu: [x64] 562 | os: [linux] 563 | 564 | lightningcss-win32-arm64-msvc@1.29.1: 565 | resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} 566 | engines: {node: '>= 12.0.0'} 567 | cpu: [arm64] 568 | os: [win32] 569 | 570 | lightningcss-win32-x64-msvc@1.29.1: 571 | resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} 572 | engines: {node: '>= 12.0.0'} 573 | cpu: [x64] 574 | os: [win32] 575 | 576 | lightningcss@1.29.1: 577 | resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} 578 | engines: {node: '>= 12.0.0'} 579 | 580 | magic-string@0.30.17: 581 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 582 | 583 | mini-svg-data-uri@1.4.4: 584 | resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} 585 | hasBin: true 586 | 587 | moment@2.30.1: 588 | resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} 589 | 590 | nanoid@3.3.8: 591 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 592 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 593 | hasBin: true 594 | 595 | picocolors@1.1.1: 596 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 597 | 598 | postcss@8.5.1: 599 | resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} 600 | engines: {node: ^10 || ^12 || >=14} 601 | 602 | rollup@4.34.1: 603 | resolution: {integrity: sha512-iYZ/+PcdLYSGfH3S+dGahlW/RWmsqDhLgj1BT9DH/xXJ0ggZN7xkdP9wipPNjjNLczI+fmMLmTB9pye+d2r4GQ==} 604 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 605 | hasBin: true 606 | 607 | source-map-js@1.2.1: 608 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 609 | engines: {node: '>=0.10.0'} 610 | 611 | tailwindcss@4.0.3: 612 | resolution: {integrity: sha512-ImmZF0Lon5RrQpsEAKGxRvHwCvMgSC4XVlFRqmbzTEDb/3wvin9zfEZrMwgsa3yqBbPqahYcVI6lulM2S7IZAA==} 613 | 614 | tapable@2.2.1: 615 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 616 | engines: {node: '>=6'} 617 | 618 | vite@6.0.11: 619 | resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} 620 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 621 | hasBin: true 622 | peerDependencies: 623 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 624 | jiti: '>=1.21.0' 625 | less: '*' 626 | lightningcss: ^1.21.0 627 | sass: '*' 628 | sass-embedded: '*' 629 | stylus: '*' 630 | sugarss: '*' 631 | terser: ^5.16.0 632 | tsx: ^4.8.1 633 | yaml: ^2.4.2 634 | peerDependenciesMeta: 635 | '@types/node': 636 | optional: true 637 | jiti: 638 | optional: true 639 | less: 640 | optional: true 641 | lightningcss: 642 | optional: true 643 | sass: 644 | optional: true 645 | sass-embedded: 646 | optional: true 647 | stylus: 648 | optional: true 649 | sugarss: 650 | optional: true 651 | terser: 652 | optional: true 653 | tsx: 654 | optional: true 655 | yaml: 656 | optional: true 657 | 658 | vue-flatpickr-component@11.0.5: 659 | resolution: {integrity: sha512-Vfwg5uVU+sanKkkLzUGC5BUlWd5wlqAMq/UpQ6lI2BCZq0DDrXhOMX7hrevt8bEgglIq2QUv0K2Nl84Me/VnlA==} 660 | engines: {node: '>=14.13.0'} 661 | peerDependencies: 662 | vue: ^3.2.0 663 | 664 | vue-router@4.5.0: 665 | resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} 666 | peerDependencies: 667 | vue: ^3.2.0 668 | 669 | vue@3.5.13: 670 | resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} 671 | peerDependencies: 672 | typescript: '*' 673 | peerDependenciesMeta: 674 | typescript: 675 | optional: true 676 | 677 | snapshots: 678 | 679 | '@alloc/quick-lru@5.2.0': {} 680 | 681 | '@babel/helper-string-parser@7.25.9': {} 682 | 683 | '@babel/helper-validator-identifier@7.25.9': {} 684 | 685 | '@babel/parser@7.26.7': 686 | dependencies: 687 | '@babel/types': 7.26.7 688 | 689 | '@babel/types@7.26.7': 690 | dependencies: 691 | '@babel/helper-string-parser': 7.25.9 692 | '@babel/helper-validator-identifier': 7.25.9 693 | 694 | '@esbuild/aix-ppc64@0.24.2': 695 | optional: true 696 | 697 | '@esbuild/android-arm64@0.24.2': 698 | optional: true 699 | 700 | '@esbuild/android-arm@0.24.2': 701 | optional: true 702 | 703 | '@esbuild/android-x64@0.24.2': 704 | optional: true 705 | 706 | '@esbuild/darwin-arm64@0.24.2': 707 | optional: true 708 | 709 | '@esbuild/darwin-x64@0.24.2': 710 | optional: true 711 | 712 | '@esbuild/freebsd-arm64@0.24.2': 713 | optional: true 714 | 715 | '@esbuild/freebsd-x64@0.24.2': 716 | optional: true 717 | 718 | '@esbuild/linux-arm64@0.24.2': 719 | optional: true 720 | 721 | '@esbuild/linux-arm@0.24.2': 722 | optional: true 723 | 724 | '@esbuild/linux-ia32@0.24.2': 725 | optional: true 726 | 727 | '@esbuild/linux-loong64@0.24.2': 728 | optional: true 729 | 730 | '@esbuild/linux-mips64el@0.24.2': 731 | optional: true 732 | 733 | '@esbuild/linux-ppc64@0.24.2': 734 | optional: true 735 | 736 | '@esbuild/linux-riscv64@0.24.2': 737 | optional: true 738 | 739 | '@esbuild/linux-s390x@0.24.2': 740 | optional: true 741 | 742 | '@esbuild/linux-x64@0.24.2': 743 | optional: true 744 | 745 | '@esbuild/netbsd-arm64@0.24.2': 746 | optional: true 747 | 748 | '@esbuild/netbsd-x64@0.24.2': 749 | optional: true 750 | 751 | '@esbuild/openbsd-arm64@0.24.2': 752 | optional: true 753 | 754 | '@esbuild/openbsd-x64@0.24.2': 755 | optional: true 756 | 757 | '@esbuild/sunos-x64@0.24.2': 758 | optional: true 759 | 760 | '@esbuild/win32-arm64@0.24.2': 761 | optional: true 762 | 763 | '@esbuild/win32-ia32@0.24.2': 764 | optional: true 765 | 766 | '@esbuild/win32-x64@0.24.2': 767 | optional: true 768 | 769 | '@jridgewell/sourcemap-codec@1.5.0': {} 770 | 771 | '@kurkle/color@0.3.4': {} 772 | 773 | '@rollup/rollup-android-arm-eabi@4.34.1': 774 | optional: true 775 | 776 | '@rollup/rollup-android-arm64@4.34.1': 777 | optional: true 778 | 779 | '@rollup/rollup-darwin-arm64@4.34.1': 780 | optional: true 781 | 782 | '@rollup/rollup-darwin-x64@4.34.1': 783 | optional: true 784 | 785 | '@rollup/rollup-freebsd-arm64@4.34.1': 786 | optional: true 787 | 788 | '@rollup/rollup-freebsd-x64@4.34.1': 789 | optional: true 790 | 791 | '@rollup/rollup-linux-arm-gnueabihf@4.34.1': 792 | optional: true 793 | 794 | '@rollup/rollup-linux-arm-musleabihf@4.34.1': 795 | optional: true 796 | 797 | '@rollup/rollup-linux-arm64-gnu@4.34.1': 798 | optional: true 799 | 800 | '@rollup/rollup-linux-arm64-musl@4.34.1': 801 | optional: true 802 | 803 | '@rollup/rollup-linux-loongarch64-gnu@4.34.1': 804 | optional: true 805 | 806 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.1': 807 | optional: true 808 | 809 | '@rollup/rollup-linux-riscv64-gnu@4.34.1': 810 | optional: true 811 | 812 | '@rollup/rollup-linux-s390x-gnu@4.34.1': 813 | optional: true 814 | 815 | '@rollup/rollup-linux-x64-gnu@4.34.1': 816 | optional: true 817 | 818 | '@rollup/rollup-linux-x64-musl@4.34.1': 819 | optional: true 820 | 821 | '@rollup/rollup-win32-arm64-msvc@4.34.1': 822 | optional: true 823 | 824 | '@rollup/rollup-win32-ia32-msvc@4.34.1': 825 | optional: true 826 | 827 | '@rollup/rollup-win32-x64-msvc@4.34.1': 828 | optional: true 829 | 830 | '@tailwindcss/forms@0.5.10(tailwindcss@4.0.3)': 831 | dependencies: 832 | mini-svg-data-uri: 1.4.4 833 | tailwindcss: 4.0.3 834 | 835 | '@tailwindcss/node@4.0.3': 836 | dependencies: 837 | enhanced-resolve: 5.18.0 838 | jiti: 2.4.2 839 | tailwindcss: 4.0.3 840 | 841 | '@tailwindcss/oxide-android-arm64@4.0.3': 842 | optional: true 843 | 844 | '@tailwindcss/oxide-darwin-arm64@4.0.3': 845 | optional: true 846 | 847 | '@tailwindcss/oxide-darwin-x64@4.0.3': 848 | optional: true 849 | 850 | '@tailwindcss/oxide-freebsd-x64@4.0.3': 851 | optional: true 852 | 853 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.3': 854 | optional: true 855 | 856 | '@tailwindcss/oxide-linux-arm64-gnu@4.0.3': 857 | optional: true 858 | 859 | '@tailwindcss/oxide-linux-arm64-musl@4.0.3': 860 | optional: true 861 | 862 | '@tailwindcss/oxide-linux-x64-gnu@4.0.3': 863 | optional: true 864 | 865 | '@tailwindcss/oxide-linux-x64-musl@4.0.3': 866 | optional: true 867 | 868 | '@tailwindcss/oxide-win32-arm64-msvc@4.0.3': 869 | optional: true 870 | 871 | '@tailwindcss/oxide-win32-x64-msvc@4.0.3': 872 | optional: true 873 | 874 | '@tailwindcss/oxide@4.0.3': 875 | optionalDependencies: 876 | '@tailwindcss/oxide-android-arm64': 4.0.3 877 | '@tailwindcss/oxide-darwin-arm64': 4.0.3 878 | '@tailwindcss/oxide-darwin-x64': 4.0.3 879 | '@tailwindcss/oxide-freebsd-x64': 4.0.3 880 | '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.3 881 | '@tailwindcss/oxide-linux-arm64-gnu': 4.0.3 882 | '@tailwindcss/oxide-linux-arm64-musl': 4.0.3 883 | '@tailwindcss/oxide-linux-x64-gnu': 4.0.3 884 | '@tailwindcss/oxide-linux-x64-musl': 4.0.3 885 | '@tailwindcss/oxide-win32-arm64-msvc': 4.0.3 886 | '@tailwindcss/oxide-win32-x64-msvc': 4.0.3 887 | 888 | '@tailwindcss/postcss@4.0.3': 889 | dependencies: 890 | '@alloc/quick-lru': 5.2.0 891 | '@tailwindcss/node': 4.0.3 892 | '@tailwindcss/oxide': 4.0.3 893 | lightningcss: 1.29.1 894 | postcss: 8.5.1 895 | tailwindcss: 4.0.3 896 | 897 | '@types/estree@1.0.6': {} 898 | 899 | '@types/web-bluetooth@0.0.20': {} 900 | 901 | '@vitejs/plugin-vue@5.2.1(vite@6.0.11(jiti@2.4.2)(lightningcss@1.29.1))(vue@3.5.13)': 902 | dependencies: 903 | vite: 6.0.11(jiti@2.4.2)(lightningcss@1.29.1) 904 | vue: 3.5.13 905 | 906 | '@vue/compiler-core@3.5.13': 907 | dependencies: 908 | '@babel/parser': 7.26.7 909 | '@vue/shared': 3.5.13 910 | entities: 4.5.0 911 | estree-walker: 2.0.2 912 | source-map-js: 1.2.1 913 | 914 | '@vue/compiler-dom@3.5.13': 915 | dependencies: 916 | '@vue/compiler-core': 3.5.13 917 | '@vue/shared': 3.5.13 918 | 919 | '@vue/compiler-sfc@3.5.13': 920 | dependencies: 921 | '@babel/parser': 7.26.7 922 | '@vue/compiler-core': 3.5.13 923 | '@vue/compiler-dom': 3.5.13 924 | '@vue/compiler-ssr': 3.5.13 925 | '@vue/shared': 3.5.13 926 | estree-walker: 2.0.2 927 | magic-string: 0.30.17 928 | postcss: 8.5.1 929 | source-map-js: 1.2.1 930 | 931 | '@vue/compiler-ssr@3.5.13': 932 | dependencies: 933 | '@vue/compiler-dom': 3.5.13 934 | '@vue/shared': 3.5.13 935 | 936 | '@vue/devtools-api@6.6.4': {} 937 | 938 | '@vue/reactivity@3.5.13': 939 | dependencies: 940 | '@vue/shared': 3.5.13 941 | 942 | '@vue/runtime-core@3.5.13': 943 | dependencies: 944 | '@vue/reactivity': 3.5.13 945 | '@vue/shared': 3.5.13 946 | 947 | '@vue/runtime-dom@3.5.13': 948 | dependencies: 949 | '@vue/reactivity': 3.5.13 950 | '@vue/runtime-core': 3.5.13 951 | '@vue/shared': 3.5.13 952 | csstype: 3.1.3 953 | 954 | '@vue/server-renderer@3.5.13(vue@3.5.13)': 955 | dependencies: 956 | '@vue/compiler-ssr': 3.5.13 957 | '@vue/shared': 3.5.13 958 | vue: 3.5.13 959 | 960 | '@vue/shared@3.5.13': {} 961 | 962 | '@vueuse/core@12.5.0': 963 | dependencies: 964 | '@types/web-bluetooth': 0.0.20 965 | '@vueuse/metadata': 12.5.0 966 | '@vueuse/shared': 12.5.0 967 | vue: 3.5.13 968 | transitivePeerDependencies: 969 | - typescript 970 | 971 | '@vueuse/metadata@12.5.0': {} 972 | 973 | '@vueuse/shared@12.5.0': 974 | dependencies: 975 | vue: 3.5.13 976 | transitivePeerDependencies: 977 | - typescript 978 | 979 | chart.js@4.4.7: 980 | dependencies: 981 | '@kurkle/color': 0.3.4 982 | 983 | chartjs-adapter-moment@1.0.1(chart.js@4.4.7)(moment@2.30.1): 984 | dependencies: 985 | chart.js: 4.4.7 986 | moment: 2.30.1 987 | 988 | csstype@3.1.3: {} 989 | 990 | detect-libc@1.0.3: {} 991 | 992 | enhanced-resolve@5.18.0: 993 | dependencies: 994 | graceful-fs: 4.2.11 995 | tapable: 2.2.1 996 | 997 | entities@4.5.0: {} 998 | 999 | esbuild@0.24.2: 1000 | optionalDependencies: 1001 | '@esbuild/aix-ppc64': 0.24.2 1002 | '@esbuild/android-arm': 0.24.2 1003 | '@esbuild/android-arm64': 0.24.2 1004 | '@esbuild/android-x64': 0.24.2 1005 | '@esbuild/darwin-arm64': 0.24.2 1006 | '@esbuild/darwin-x64': 0.24.2 1007 | '@esbuild/freebsd-arm64': 0.24.2 1008 | '@esbuild/freebsd-x64': 0.24.2 1009 | '@esbuild/linux-arm': 0.24.2 1010 | '@esbuild/linux-arm64': 0.24.2 1011 | '@esbuild/linux-ia32': 0.24.2 1012 | '@esbuild/linux-loong64': 0.24.2 1013 | '@esbuild/linux-mips64el': 0.24.2 1014 | '@esbuild/linux-ppc64': 0.24.2 1015 | '@esbuild/linux-riscv64': 0.24.2 1016 | '@esbuild/linux-s390x': 0.24.2 1017 | '@esbuild/linux-x64': 0.24.2 1018 | '@esbuild/netbsd-arm64': 0.24.2 1019 | '@esbuild/netbsd-x64': 0.24.2 1020 | '@esbuild/openbsd-arm64': 0.24.2 1021 | '@esbuild/openbsd-x64': 0.24.2 1022 | '@esbuild/sunos-x64': 0.24.2 1023 | '@esbuild/win32-arm64': 0.24.2 1024 | '@esbuild/win32-ia32': 0.24.2 1025 | '@esbuild/win32-x64': 0.24.2 1026 | 1027 | estree-walker@2.0.2: {} 1028 | 1029 | flatpickr@4.6.13: {} 1030 | 1031 | fsevents@2.3.3: 1032 | optional: true 1033 | 1034 | graceful-fs@4.2.11: {} 1035 | 1036 | jiti@2.4.2: {} 1037 | 1038 | lightningcss-darwin-arm64@1.29.1: 1039 | optional: true 1040 | 1041 | lightningcss-darwin-x64@1.29.1: 1042 | optional: true 1043 | 1044 | lightningcss-freebsd-x64@1.29.1: 1045 | optional: true 1046 | 1047 | lightningcss-linux-arm-gnueabihf@1.29.1: 1048 | optional: true 1049 | 1050 | lightningcss-linux-arm64-gnu@1.29.1: 1051 | optional: true 1052 | 1053 | lightningcss-linux-arm64-musl@1.29.1: 1054 | optional: true 1055 | 1056 | lightningcss-linux-x64-gnu@1.29.1: 1057 | optional: true 1058 | 1059 | lightningcss-linux-x64-musl@1.29.1: 1060 | optional: true 1061 | 1062 | lightningcss-win32-arm64-msvc@1.29.1: 1063 | optional: true 1064 | 1065 | lightningcss-win32-x64-msvc@1.29.1: 1066 | optional: true 1067 | 1068 | lightningcss@1.29.1: 1069 | dependencies: 1070 | detect-libc: 1.0.3 1071 | optionalDependencies: 1072 | lightningcss-darwin-arm64: 1.29.1 1073 | lightningcss-darwin-x64: 1.29.1 1074 | lightningcss-freebsd-x64: 1.29.1 1075 | lightningcss-linux-arm-gnueabihf: 1.29.1 1076 | lightningcss-linux-arm64-gnu: 1.29.1 1077 | lightningcss-linux-arm64-musl: 1.29.1 1078 | lightningcss-linux-x64-gnu: 1.29.1 1079 | lightningcss-linux-x64-musl: 1.29.1 1080 | lightningcss-win32-arm64-msvc: 1.29.1 1081 | lightningcss-win32-x64-msvc: 1.29.1 1082 | 1083 | magic-string@0.30.17: 1084 | dependencies: 1085 | '@jridgewell/sourcemap-codec': 1.5.0 1086 | 1087 | mini-svg-data-uri@1.4.4: {} 1088 | 1089 | moment@2.30.1: {} 1090 | 1091 | nanoid@3.3.8: {} 1092 | 1093 | picocolors@1.1.1: {} 1094 | 1095 | postcss@8.5.1: 1096 | dependencies: 1097 | nanoid: 3.3.8 1098 | picocolors: 1.1.1 1099 | source-map-js: 1.2.1 1100 | 1101 | rollup@4.34.1: 1102 | dependencies: 1103 | '@types/estree': 1.0.6 1104 | optionalDependencies: 1105 | '@rollup/rollup-android-arm-eabi': 4.34.1 1106 | '@rollup/rollup-android-arm64': 4.34.1 1107 | '@rollup/rollup-darwin-arm64': 4.34.1 1108 | '@rollup/rollup-darwin-x64': 4.34.1 1109 | '@rollup/rollup-freebsd-arm64': 4.34.1 1110 | '@rollup/rollup-freebsd-x64': 4.34.1 1111 | '@rollup/rollup-linux-arm-gnueabihf': 4.34.1 1112 | '@rollup/rollup-linux-arm-musleabihf': 4.34.1 1113 | '@rollup/rollup-linux-arm64-gnu': 4.34.1 1114 | '@rollup/rollup-linux-arm64-musl': 4.34.1 1115 | '@rollup/rollup-linux-loongarch64-gnu': 4.34.1 1116 | '@rollup/rollup-linux-powerpc64le-gnu': 4.34.1 1117 | '@rollup/rollup-linux-riscv64-gnu': 4.34.1 1118 | '@rollup/rollup-linux-s390x-gnu': 4.34.1 1119 | '@rollup/rollup-linux-x64-gnu': 4.34.1 1120 | '@rollup/rollup-linux-x64-musl': 4.34.1 1121 | '@rollup/rollup-win32-arm64-msvc': 4.34.1 1122 | '@rollup/rollup-win32-ia32-msvc': 4.34.1 1123 | '@rollup/rollup-win32-x64-msvc': 4.34.1 1124 | fsevents: 2.3.3 1125 | 1126 | source-map-js@1.2.1: {} 1127 | 1128 | tailwindcss@4.0.3: {} 1129 | 1130 | tapable@2.2.1: {} 1131 | 1132 | vite@6.0.11(jiti@2.4.2)(lightningcss@1.29.1): 1133 | dependencies: 1134 | esbuild: 0.24.2 1135 | postcss: 8.5.1 1136 | rollup: 4.34.1 1137 | optionalDependencies: 1138 | fsevents: 2.3.3 1139 | jiti: 2.4.2 1140 | lightningcss: 1.29.1 1141 | 1142 | vue-flatpickr-component@11.0.5(vue@3.5.13): 1143 | dependencies: 1144 | flatpickr: 4.6.13 1145 | vue: 3.5.13 1146 | 1147 | vue-router@4.5.0(vue@3.5.13): 1148 | dependencies: 1149 | '@vue/devtools-api': 6.6.4 1150 | vue: 3.5.13 1151 | 1152 | vue@3.5.13: 1153 | dependencies: 1154 | '@vue/compiler-dom': 3.5.13 1155 | '@vue/compiler-sfc': 3.5.13 1156 | '@vue/runtime-dom': 3.5.13 1157 | '@vue/server-renderer': 3.5.13(vue@3.5.13) 1158 | '@vue/shared': 3.5.13 1159 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | '@tailwindcss/postcss': {}, 4 | }, 5 | } -------------------------------------------------------------------------------- /public/_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cruip/vuejs-admin-dashboard-template/1306a8aa7308b66cbfb1020067a25ae4d42f7192/public/favicon.ico -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /src/charts/BarChart01.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /src/charts/BarChart02.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /src/charts/BarChart03.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /src/charts/ChartjsConfig.js: -------------------------------------------------------------------------------- 1 | // Import Chart.js 2 | import { Chart, Tooltip } from 'chart.js' 3 | // Import Tailwind config 4 | import { adjustColorOpacity, getCssVariable } from '../utils/Utils' 5 | 6 | Chart.register(Tooltip) 7 | 8 | // Define Chart.js default settings 9 | Chart.defaults.font.family = '"Inter", sans-serif' 10 | Chart.defaults.font.weight = 500 11 | Chart.defaults.plugins.tooltip.borderWidth = 1 12 | Chart.defaults.plugins.tooltip.displayColors = false 13 | Chart.defaults.plugins.tooltip.mode = 'nearest' 14 | Chart.defaults.plugins.tooltip.intersect = false 15 | Chart.defaults.plugins.tooltip.position = 'nearest' 16 | Chart.defaults.plugins.tooltip.caretSize = 0 17 | Chart.defaults.plugins.tooltip.caretPadding = 20 18 | Chart.defaults.plugins.tooltip.cornerRadius = 8 19 | Chart.defaults.plugins.tooltip.padding = 8 20 | 21 | // Function that generates a gradient for line charts 22 | export const chartAreaGradient = (ctx, chartArea, colorStops) => { 23 | if (!ctx || !chartArea || !colorStops || colorStops.length === 0) { 24 | return 'transparent'; 25 | } 26 | const gradient = ctx.createLinearGradient(0, chartArea.bottom, 0, chartArea.top); 27 | colorStops.forEach(({ stop, color }) => { 28 | gradient.addColorStop(stop, color); 29 | }); 30 | return gradient; 31 | }; 32 | 33 | export const getChartColors = () => ({ 34 | textColor: { 35 | light: getCssVariable('--color-gray-400'), 36 | dark: getCssVariable('--color-gray-500') 37 | }, 38 | gridColor: { 39 | light: getCssVariable('--color-gray-100'), 40 | dark: adjustColorOpacity(getCssVariable('--color-gray-700'), 0.6) 41 | }, 42 | backdropColor: { 43 | light: getCssVariable('--color-white'), 44 | dark: getCssVariable('--color-gray-800') 45 | }, 46 | tooltipTitleColor: { 47 | light: getCssVariable('--color-gray-800'), 48 | dark: getCssVariable('--color-gray-100') 49 | }, 50 | tooltipBodyColor : { 51 | light: getCssVariable('--color-gray-500'), 52 | dark: getCssVariable('--color-gray-400') 53 | }, 54 | tooltipBgColor: { 55 | light: getCssVariable('--color-white'), 56 | dark: getCssVariable('--color-gray-700') 57 | }, 58 | tooltipBorderColor: { 59 | light: getCssVariable('--color-gray-200'), 60 | dark: getCssVariable('--color-gray-600') 61 | }, 62 | }) 63 | -------------------------------------------------------------------------------- /src/charts/DoughnutChart.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /src/charts/LineChart01.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /src/charts/LineChart02.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | -------------------------------------------------------------------------------- /src/charts/RealtimeChart.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /src/components/Datepicker.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /src/components/DropdownEditMenu.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | -------------------------------------------------------------------------------- /src/components/DropdownFilter.vue: -------------------------------------------------------------------------------- 1 | 79 | 80 | -------------------------------------------------------------------------------- /src/components/DropdownHelp.vue: -------------------------------------------------------------------------------- 1 | 62 | 63 | -------------------------------------------------------------------------------- /src/components/DropdownNotifications.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | -------------------------------------------------------------------------------- /src/components/DropdownProfile.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | -------------------------------------------------------------------------------- /src/components/ModalSearch.vue: -------------------------------------------------------------------------------- 1 | 119 | 120 | -------------------------------------------------------------------------------- /src/components/ThemeToggle.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 32 | -------------------------------------------------------------------------------- /src/components/Tooltip.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | -------------------------------------------------------------------------------- /src/css/additional-styles/flatpickr.css: -------------------------------------------------------------------------------- 1 | @import 'flatpickr/dist/flatpickr.min.css'; 2 | 3 | /* Customise flatpickr */ 4 | * { 5 | --calendarPadding: 24px; 6 | --daySize: 36px; 7 | --daysWidth: calc(var(--daySize)*7); 8 | } 9 | 10 | @keyframes fpFadeInDown { 11 | from { 12 | opacity: 0; 13 | transform: translate3d(0, -8px, 0); 14 | } 15 | to { 16 | opacity: 1; 17 | transform: translate3d(0, 0, 0); 18 | } 19 | } 20 | 21 | .flatpickr-calendar { 22 | border: inherit; 23 | @apply bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700/60 left-1/2; 24 | margin-left: calc(calc(var(--daysWidth) + calc(var(--calendarPadding)*2))*0.5*-1); 25 | padding: var(--calendarPadding); 26 | width: calc(var(--daysWidth) + calc(var(--calendarPadding)*2)); 27 | } 28 | 29 | @media (width >= theme(--breakpoint-lg)) { 30 | .flatpickr-calendar { 31 | @apply left-0 right-auto; 32 | margin-left: 0; 33 | } 34 | } 35 | 36 | .flatpickr-right.flatpickr-calendar { 37 | @apply right-0 left-auto; 38 | margin-left: 0; 39 | } 40 | 41 | .flatpickr-calendar.animate.open { 42 | animation: fpFadeInDown 200ms ease-out; 43 | } 44 | 45 | .flatpickr-calendar.static { 46 | position: absolute; 47 | top: calc(100% + 4px); 48 | } 49 | 50 | .flatpickr-calendar.static.open { 51 | z-index: 20; 52 | } 53 | 54 | .flatpickr-days { 55 | width: var(--daysWidth); 56 | } 57 | 58 | .dayContainer { 59 | width: var(--daysWidth); 60 | min-width: var(--daysWidth); 61 | max-width: var(--daysWidth); 62 | } 63 | 64 | .flatpickr-day { 65 | @apply bg-gray-50 dark:bg-gray-700/20 text-sm font-medium text-gray-600 dark:text-gray-100; 66 | max-width: var(--daySize); 67 | height: var(--daySize); 68 | line-height: var(--daySize); 69 | } 70 | 71 | .flatpickr-day, 72 | .flatpickr-day.prevMonthDay, 73 | .flatpickr-day.nextMonthDay { 74 | border: none; 75 | } 76 | 77 | .flatpickr-day.flatpickr-disabled, 78 | .flatpickr-day.flatpickr-disabled:hover, 79 | .flatpickr-day.prevMonthDay, 80 | .flatpickr-day.nextMonthDay, 81 | .flatpickr-day.notAllowed, 82 | .flatpickr-day.notAllowed.prevMonthDay, 83 | .flatpickr-day.notAllowed.nextMonthDay { 84 | @apply bg-transparent; 85 | } 86 | 87 | .flatpickr-day, 88 | .flatpickr-day.prevMonthDay, 89 | .flatpickr-day.nextMonthDay, 90 | .flatpickr-day.selected.startRange, 91 | .flatpickr-day.startRange.startRange, 92 | .flatpickr-day.endRange.startRange, 93 | .flatpickr-day.selected.endRange, 94 | .flatpickr-day.startRange.endRange, 95 | .flatpickr-day.endRange.endRange, 96 | .flatpickr-day.selected.startRange.endRange, 97 | .flatpickr-day.startRange.startRange.endRange, 98 | .flatpickr-day.endRange.startRange.endRange { 99 | border-radius: 0; 100 | } 101 | 102 | .flatpickr-day.flatpickr-disabled, 103 | .flatpickr-day.flatpickr-disabled:hover, 104 | .flatpickr-day.prevMonthDay, 105 | .flatpickr-day.nextMonthDay, 106 | .flatpickr-day.notAllowed, 107 | .flatpickr-day.notAllowed.prevMonthDay, 108 | .flatpickr-day.notAllowed.nextMonthDay { 109 | @apply text-gray-400 dark:text-gray-500; 110 | } 111 | 112 | .rangeMode .flatpickr-day { 113 | margin: 0; 114 | } 115 | 116 | .flatpickr-day.selected, 117 | .flatpickr-day.startRange, 118 | .flatpickr-day.endRange, 119 | .flatpickr-day.selected.inRange, 120 | .flatpickr-day.startRange.inRange, 121 | .flatpickr-day.endRange.inRange, 122 | .flatpickr-day.selected:focus, 123 | .flatpickr-day.startRange:focus, 124 | .flatpickr-day.endRange:focus, 125 | .flatpickr-day.selected:hover, 126 | .flatpickr-day.startRange:hover, 127 | .flatpickr-day.endRange:hover, 128 | .flatpickr-day.selected.prevMonthDay, 129 | .flatpickr-day.startRange.prevMonthDay, 130 | .flatpickr-day.endRange.prevMonthDay, 131 | .flatpickr-day.selected.nextMonthDay, 132 | .flatpickr-day.startRange.nextMonthDay, 133 | .flatpickr-day.endRange.nextMonthDay { 134 | @apply bg-violet-600 text-violet-50; 135 | } 136 | 137 | .flatpickr-day.inRange, 138 | .flatpickr-day.prevMonthDay.inRange, 139 | .flatpickr-day.nextMonthDay.inRange, 140 | .flatpickr-day.today.inRange, 141 | .flatpickr-day.prevMonthDay.today.inRange, 142 | .flatpickr-day.nextMonthDay.today.inRange, 143 | .flatpickr-day:hover, 144 | .flatpickr-day.prevMonthDay:hover, 145 | .flatpickr-day.nextMonthDay:hover, 146 | .flatpickr-day:focus, 147 | .flatpickr-day.prevMonthDay:focus, 148 | .flatpickr-day.nextMonthDay:focus, 149 | .flatpickr-day.today:hover, 150 | .flatpickr-day.today:focus { 151 | @apply bg-violet-500 text-violet-50; 152 | } 153 | 154 | .flatpickr-day.inRange, 155 | .flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)), 156 | .flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)), 157 | .flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)) { 158 | box-shadow: none; 159 | } 160 | 161 | .flatpickr-months { 162 | align-items: center; 163 | margin-top: -8px; 164 | margin-bottom: 6px; 165 | } 166 | 167 | .flatpickr-months .flatpickr-prev-month, 168 | .flatpickr-months .flatpickr-next-month { 169 | position: static; 170 | height: auto; 171 | @apply text-gray-400 hover:text-gray-900 dark:text-gray-500 dark:hover:text-gray-300; 172 | } 173 | 174 | .flatpickr-months .flatpickr-prev-month svg, 175 | .flatpickr-months .flatpickr-next-month svg { 176 | width: 7px; 177 | height: 11px; 178 | fill: currentColor; 179 | } 180 | 181 | .flatpickr-months .flatpickr-prev-month:hover svg, 182 | .flatpickr-months .flatpickr-next-month:hover svg { 183 | @apply fill-current; 184 | } 185 | 186 | .flatpickr-months .flatpickr-prev-month { 187 | margin-left: -10px; 188 | } 189 | 190 | .flatpickr-months .flatpickr-next-month { 191 | margin-right: -10px; 192 | } 193 | 194 | .flatpickr-months .flatpickr-month { 195 | @apply text-gray-800 dark:text-gray-100; 196 | height: auto; 197 | line-height: inherit; 198 | } 199 | 200 | .flatpickr-current-month { 201 | @apply text-sm font-medium; 202 | position: static; 203 | height: auto; 204 | width: auto; 205 | left: auto; 206 | padding: 0; 207 | } 208 | 209 | .flatpickr-current-month span.cur-month { 210 | @apply font-medium m-0; 211 | } 212 | 213 | .flatpickr-current-month span.cur-month:hover { 214 | background: none; 215 | } 216 | 217 | .flatpickr-current-month input.cur-year { 218 | font-weight: inherit; 219 | box-shadow: none !important; 220 | } 221 | 222 | .numInputWrapper:hover { 223 | background: none; 224 | } 225 | 226 | .numInputWrapper span { 227 | display: none; 228 | } 229 | 230 | span.flatpickr-weekday { 231 | @apply text-gray-400 dark:text-gray-500 font-medium text-xs; 232 | } 233 | 234 | .flatpickr-calendar.arrowTop::before, 235 | .flatpickr-calendar.arrowTop::after, 236 | .flatpickr-calendar.arrowBottom::before, 237 | .flatpickr-calendar.arrowBottom::after { 238 | display: none; 239 | } -------------------------------------------------------------------------------- /src/css/additional-styles/utility-patterns.css: -------------------------------------------------------------------------------- 1 | /* Typography */ 2 | .h1 { 3 | @apply text-4xl font-extrabold tracking-tighter; 4 | } 5 | 6 | .h2 { 7 | @apply text-3xl font-extrabold tracking-tighter; 8 | } 9 | 10 | .h3 { 11 | @apply text-3xl font-extrabold; 12 | } 13 | 14 | .h4 { 15 | @apply text-2xl font-extrabold tracking-tight; 16 | } 17 | 18 | @media (width >= theme(--breakpoint-md)) { 19 | .h1 { 20 | @apply text-5xl; 21 | } 22 | 23 | .h2 { 24 | @apply text-4xl; 25 | } 26 | } 27 | 28 | /* Buttons */ 29 | .btn, 30 | .btn-lg, 31 | .btn-sm, 32 | .btn-xs { 33 | @apply font-medium text-sm inline-flex items-center justify-center border border-transparent rounded-lg leading-5 shadow-xs transition; 34 | } 35 | 36 | .btn { 37 | @apply px-3 py-2; 38 | } 39 | 40 | .btn-lg { 41 | @apply px-4 py-3; 42 | } 43 | 44 | .btn-sm { 45 | @apply px-2 py-1; 46 | } 47 | 48 | .btn-xs { 49 | @apply px-2 py-0.5; 50 | } 51 | 52 | /* Forms */ 53 | input[type="search"]::-webkit-search-decoration, 54 | input[type="search"]::-webkit-search-cancel-button, 55 | input[type="search"]::-webkit-search-results-button, 56 | input[type="search"]::-webkit-search-results-decoration { 57 | -webkit-appearance: none; 58 | } 59 | 60 | .form-input, 61 | .form-textarea, 62 | .form-multiselect, 63 | .form-select, 64 | .form-checkbox, 65 | .form-radio { 66 | @apply bg-white dark:bg-gray-900/30 border focus:ring-0 focus:ring-offset-0 dark:disabled:bg-gray-700/30 dark:disabled:border-gray-700 dark:disabled:hover:border-gray-700; 67 | } 68 | 69 | .form-checkbox { 70 | @apply rounded-sm; 71 | } 72 | 73 | .form-input, 74 | .form-textarea, 75 | .form-multiselect, 76 | .form-select { 77 | @apply text-sm text-gray-800 dark:text-gray-100 leading-5 py-2 px-3 border-gray-200 hover:border-gray-300 focus:border-gray-300 dark:border-gray-700/60 dark:hover:border-gray-600 dark:focus:border-gray-600 shadow-xs rounded-lg; 78 | } 79 | 80 | .form-input, 81 | .form-textarea { 82 | @apply placeholder-gray-400 dark:placeholder-gray-500; 83 | } 84 | 85 | .form-select { 86 | @apply pr-10; 87 | } 88 | 89 | .form-checkbox, 90 | .form-radio { 91 | @apply text-violet-500 checked:bg-violet-500 checked:border-transparent border border-gray-300 dark:border-gray-700/60 dark:checked:border-transparent focus-visible:not-checked:ring-2 focus-visible:not-checked:ring-violet-500/50; 92 | } 93 | 94 | /* Switch element */ 95 | .form-switch { 96 | @apply relative select-none; 97 | width: 44px; 98 | } 99 | 100 | .form-switch label { 101 | @apply block overflow-hidden cursor-pointer h-6 rounded-full; 102 | } 103 | 104 | .form-switch label > span:first-child { 105 | @apply absolute block rounded-full; 106 | width: 20px; 107 | height: 20px; 108 | top: 2px; 109 | left: 2px; 110 | right: 50%; 111 | transition: all .15s ease-out; 112 | } 113 | 114 | .form-switch input[type="checkbox"] + label { 115 | @apply bg-gray-400 dark:bg-gray-700; 116 | } 117 | 118 | .form-switch input[type="checkbox"]:checked + label { 119 | @apply bg-violet-500; 120 | } 121 | 122 | .form-switch input[type="checkbox"]:checked + label > span:first-child { 123 | left: 22px; 124 | } 125 | 126 | .form-switch input[type="checkbox"]:disabled + label { 127 | @apply cursor-not-allowed bg-gray-100 dark:bg-gray-700/20 border border-gray-200 dark:border-gray-700/60; 128 | } 129 | 130 | .form-switch input[type="checkbox"]:disabled + label > span:first-child { 131 | @apply bg-gray-400 dark:bg-gray-600; 132 | } 133 | 134 | /* Chrome, Safari and Opera */ 135 | .no-scrollbar::-webkit-scrollbar { 136 | display: none; 137 | } 138 | 139 | .no-scrollbar { 140 | -ms-overflow-style: none; /* IE and Edge */ 141 | scrollbar-width: none; /* Firefox */ 142 | } -------------------------------------------------------------------------------- /src/css/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=fallback'); 2 | 3 | @import 'tailwindcss'; 4 | @import './additional-styles/flatpickr.css'; 5 | @import './additional-styles/utility-patterns.css' layer(components); 6 | 7 | @plugin "@tailwindcss/forms" { 8 | strategy: base; 9 | } 10 | 11 | @custom-variant dark (&:is(.dark *)); 12 | @custom-variant sidebar-expanded (&:is(.sidebar-expanded *)); 13 | 14 | @theme { 15 | --shadow-sm: 0 1px 1px 0 rgb(0 0 0 / 0.05), 0 1px 2px 0 rgb(0 0 0 / 0.02); 16 | 17 | --color-gray-50: #f9fafb; 18 | --color-gray-100: #f3f4f6; 19 | --color-gray-200: #e5e7eb; 20 | --color-gray-300: #bfc4cd; 21 | --color-gray-400: #9ca3af; 22 | --color-gray-500: #6b7280; 23 | --color-gray-600: #4b5563; 24 | --color-gray-700: #374151; 25 | --color-gray-800: #1f2937; 26 | --color-gray-900: #111827; 27 | --color-gray-950: #030712; 28 | 29 | --color-violet-50: #f1eeff; 30 | --color-violet-100: #e6e1ff; 31 | --color-violet-200: #d2cbff; 32 | --color-violet-300: #b7acff; 33 | --color-violet-400: #9c8cff; 34 | --color-violet-500: #8470ff; 35 | --color-violet-600: #755ff8; 36 | --color-violet-700: #5d47de; 37 | --color-violet-800: #4634b1; 38 | --color-violet-900: #2f227c; 39 | --color-violet-950: #1c1357; 40 | 41 | --color-sky-50: #e3f3ff; 42 | --color-sky-100: #d1ecff; 43 | --color-sky-200: #b6e1ff; 44 | --color-sky-300: #a0d7ff; 45 | --color-sky-400: #7bc8ff; 46 | --color-sky-500: #67bfff; 47 | --color-sky-600: #56b1f3; 48 | --color-sky-700: #3193da; 49 | --color-sky-800: #1c71ae; 50 | --color-sky-900: #124d79; 51 | --color-sky-950: #0b324f; 52 | 53 | --color-green-50: #d2ffe2; 54 | --color-green-100: #b1fdcd; 55 | --color-green-200: #8bf0b0; 56 | --color-green-300: #67e294; 57 | --color-green-400: #4bd37d; 58 | --color-green-500: #3ec972; 59 | --color-green-600: #34bd68; 60 | --color-green-700: #239f52; 61 | --color-green-800: #15773a; 62 | --color-green-900: #0f5429; 63 | --color-green-950: #0a3f1e; 64 | 65 | --color-red-50: #ffe8e8; 66 | --color-red-100: #ffd1d1; 67 | --color-red-200: #ffb2b2; 68 | --color-red-300: #ff9494; 69 | --color-red-400: #ff7474; 70 | --color-red-500: #ff5656; 71 | --color-red-600: #fa4949; 72 | --color-red-700: #e63939; 73 | --color-red-800: #c52727; 74 | --color-red-900: #941818; 75 | --color-red-950: #600f0f; 76 | 77 | --color-yellow-50: #fff2c9; 78 | --color-yellow-100: #ffe7a0; 79 | --color-yellow-200: #ffe081; 80 | --color-yellow-300: #ffd968; 81 | --color-yellow-400: #f7cd4c; 82 | --color-yellow-500: #f0bb33; 83 | --color-yellow-600: #dfad2b; 84 | --color-yellow-700: #bc9021; 85 | --color-yellow-800: #816316; 86 | --color-yellow-900: #4f3d0e; 87 | --color-yellow-950: #342809; 88 | 89 | --font-inter: "Inter", "sans-serif"; 90 | 91 | --text-xs: 0.75rem; 92 | --text-xs--line-height: 1.5; 93 | --text-sm: 0.875rem; 94 | --text-sm--line-height: 1.5715; 95 | --text-base: 1rem; 96 | --text-base--line-height: 1.5; 97 | --text-base--letter-spacing: -0.01em; 98 | --text-lg: 1.125rem; 99 | --text-lg--line-height: 1.5; 100 | --text-lg--letter-spacing: -0.01em; 101 | --text-xl: 1.25rem; 102 | --text-xl--line-height: 1.5; 103 | --text-xl--letter-spacing: -0.01em; 104 | --text-2xl: 1.5rem; 105 | --text-2xl--line-height: 1.33; 106 | --text-2xl--letter-spacing: -0.01em; 107 | --text-3xl: 1.88rem; 108 | --text-3xl--line-height: 1.33; 109 | --text-3xl--letter-spacing: -0.01em; 110 | --text-4xl: 2.25rem; 111 | --text-4xl--line-height: 1.25; 112 | --text-4xl--letter-spacing: -0.02em; 113 | --text-5xl: 3rem; 114 | --text-5xl--line-height: 1.25; 115 | --text-5xl--letter-spacing: -0.02em; 116 | --text-6xl: 3.75rem; 117 | --text-6xl--line-height: 1.2; 118 | --text-6xl--letter-spacing: -0.02em; 119 | 120 | --breakpoint-xs: 480px; 121 | } 122 | 123 | /* 124 | The default border color has changed to `currentColor` in Tailwind CSS v4, 125 | so we've added these compatibility styles to make sure everything still 126 | looks the same as it did with Tailwind CSS v3. 127 | 128 | If we ever want to remove these styles, we need to add an explicit border 129 | color utility to any element that depends on these defaults. 130 | */ 131 | @layer base { 132 | *, 133 | ::after, 134 | ::before, 135 | ::backdrop, 136 | ::file-selector-button { 137 | border-color: var(--color-gray-200, currentColor); 138 | } 139 | } -------------------------------------------------------------------------------- /src/images/icon-01.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/images/icon-02.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/images/icon-03.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/images/user-36-05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cruip/vuejs-admin-dashboard-template/1306a8aa7308b66cbfb1020067a25ae4d42f7192/src/images/user-36-05.jpg -------------------------------------------------------------------------------- /src/images/user-36-06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cruip/vuejs-admin-dashboard-template/1306a8aa7308b66cbfb1020067a25ae4d42f7192/src/images/user-36-06.jpg -------------------------------------------------------------------------------- /src/images/user-36-07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cruip/vuejs-admin-dashboard-template/1306a8aa7308b66cbfb1020067a25ae4d42f7192/src/images/user-36-07.jpg -------------------------------------------------------------------------------- /src/images/user-36-08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cruip/vuejs-admin-dashboard-template/1306a8aa7308b66cbfb1020067a25ae4d42f7192/src/images/user-36-08.jpg -------------------------------------------------------------------------------- /src/images/user-36-09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cruip/vuejs-admin-dashboard-template/1306a8aa7308b66cbfb1020067a25ae4d42f7192/src/images/user-36-09.jpg -------------------------------------------------------------------------------- /src/images/user-avatar-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cruip/vuejs-admin-dashboard-template/1306a8aa7308b66cbfb1020067a25ae4d42f7192/src/images/user-avatar-32.png -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import router from './router' 3 | import App from './App.vue' 4 | 5 | import './css/style.css' 6 | 7 | const app = createApp(App) 8 | app.use(router) 9 | app.mount('#app') 10 | -------------------------------------------------------------------------------- /src/pages/Dashboard.vue: -------------------------------------------------------------------------------- 1 | 83 | 84 | -------------------------------------------------------------------------------- /src/partials/Banner.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /src/partials/Header.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | -------------------------------------------------------------------------------- /src/partials/SidebarLinkGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard01.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard02.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard03.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard04.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard05.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard06.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard07.vue: -------------------------------------------------------------------------------- 1 | 160 | 161 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard08.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard09.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard10.vue: -------------------------------------------------------------------------------- 1 | 60 | 61 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard11.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard12.vue: -------------------------------------------------------------------------------- 1 | 105 | 106 | -------------------------------------------------------------------------------- /src/partials/dashboard/DashboardCard13.vue: -------------------------------------------------------------------------------- 1 | 115 | 116 | -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from 'vue-router' 2 | import Dashboard from './pages/Dashboard.vue' 3 | 4 | const routerHistory = createWebHistory() 5 | 6 | const router = createRouter({ 7 | history: routerHistory, 8 | routes: [ 9 | { 10 | path: '/', 11 | component: Dashboard 12 | }, 13 | ] 14 | }) 15 | 16 | export default router 17 | -------------------------------------------------------------------------------- /src/utils/Utils.js: -------------------------------------------------------------------------------- 1 | export const formatValue = (value) => Intl.NumberFormat('en-US', { 2 | style: 'currency', 3 | currency: 'USD', 4 | maximumSignificantDigits: 3, 5 | notation: 'compact', 6 | }).format(value); 7 | 8 | export const formatThousands = (value) => Intl.NumberFormat('en-US', { 9 | maximumSignificantDigits: 3, 10 | notation: 'compact', 11 | }).format(value); 12 | 13 | export const getCssVariable = (variable) => { 14 | return getComputedStyle(document.documentElement).getPropertyValue(variable).trim(); 15 | }; 16 | 17 | const adjustHexOpacity = (hexColor, opacity) => { 18 | // Remove the '#' if it exists 19 | hexColor = hexColor.replace('#', ''); 20 | 21 | // Convert hex to RGB 22 | const r = parseInt(hexColor.substring(0, 2), 16); 23 | const g = parseInt(hexColor.substring(2, 4), 16); 24 | const b = parseInt(hexColor.substring(4, 6), 16); 25 | 26 | // Return RGBA string 27 | return `rgba(${r}, ${g}, ${b}, ${opacity})`; 28 | }; 29 | 30 | const adjustHSLOpacity = (hslColor, opacity) => { 31 | // Convert HSL to HSLA 32 | return hslColor.replace('hsl(', 'hsla(').replace(')', `, ${opacity})`); 33 | }; 34 | 35 | const adjustOKLCHOpacity = (oklchColor, opacity) => { 36 | // Add alpha value to OKLCH color 37 | return oklchColor.replace(/oklch\((.*?)\)/, (match, p1) => `oklch(${p1} / ${opacity})`); 38 | }; 39 | 40 | export const adjustColorOpacity = (color, opacity) => { 41 | if (color.startsWith('#')) { 42 | return adjustHexOpacity(color, opacity); 43 | } else if (color.startsWith('hsl')) { 44 | return adjustHSLOpacity(color, opacity); 45 | } else if (color.startsWith('oklch')) { 46 | return adjustOKLCHOpacity(color, opacity); 47 | } else { 48 | throw new Error('Unsupported color format'); 49 | } 50 | }; 51 | 52 | export const oklchToRGBA = (oklchColor) => { 53 | // Create a temporary div to use for color conversion 54 | const tempDiv = document.createElement('div'); 55 | tempDiv.style.color = oklchColor; 56 | document.body.appendChild(tempDiv); 57 | 58 | // Get the computed style and convert to RGB 59 | const computedColor = window.getComputedStyle(tempDiv).color; 60 | document.body.removeChild(tempDiv); 61 | 62 | return computedColor; 63 | }; -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | define: { 7 | 'process.env': process.env 8 | }, 9 | plugins: [vue()], 10 | build: { 11 | commonjsOptions: { 12 | transformMixedEsModules: true, 13 | } 14 | } 15 | }) 16 | --------------------------------------------------------------------------------