{"_id":"mgv-backoffice","_rev":"48-d6af8aa2df69dd1f4ebdfe8f25c7133a","name":"mgv-backoffice","dist-tags":{"latest":"1.42.0"},"versions":{"1.0.0":{"name":"mgv-backoffice","version":"1.0.0","_id":"mgv-backoffice@1.0.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"130fadbdb224a0970208efd2c64dce5824058916","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.0.tgz","fileCount":54,"integrity":"sha512-PrhCQ9sXmlkIX7BACVfN2Gc1qd69BgHw1OyZZISZ4bP36PdkW85WUHXhFgt+CjIrNOkMvI6MLE7rVE8KKbgVcw==","signatures":[{"sig":"MEUCIQCmemn6Fja0M044xG/FdnOtgla4ntyCaJ3jSlp4AJzZ1AIgIkC1vg9HQgQU9neKOFqeS5SHHOCxYoumniYXVCoYtD8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102087},"main":"./dist/ui-lib.js","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.0_1773499859637_0.8517090901000857","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"mgv-backoffice","version":"1.0.1","_id":"mgv-backoffice@1.0.1","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"234d78b2b6d9d3119f5fe2422cf1651c207355a4","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.1.tgz","fileCount":54,"integrity":"sha512-e9ZW8gNNKylMTMMJi229i0sO0Mvz2XViDfDrWDsa3HxFmwdVg9VohJJQmOBlJeW4TjB/N3CUhsuwmSHV3NFuvg==","signatures":[{"sig":"MEQCIGAgcbjpBCYUGPqhsVeGj5pqFK7RvJLiBJXr/UnpOyGRAiAxsI0gu2nShA9WJdr3DusgayRTZE6CxrTzSBEc1mT65Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100889},"main":"./dist/ui-lib.js","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.1_1773500774945_0.4016134842720025","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"mgv-backoffice","version":"1.0.2","_id":"mgv-backoffice@1.0.2","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"27509fa9fa64a99d6e075896e8d1ae38b04c39d7","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.2.tgz","fileCount":54,"integrity":"sha512-V/PsLWqktI8b80XaWDodmqj+nLTp6IXomhoWQkEmDkK7G3Zc2/z3J5A12sIS17QN+gUU8RwTWLI37QNj9jljpQ==","signatures":[{"sig":"MEUCIQDx2HixpQ9zSTtHaZQI9Vllq4vjtc3PRhI9pwXTj9jwQwIgBeE5OUuR+Lji/qy/kAO6huVgWv+iioX8E3kX0sWmDjM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98274},"main":"./dist/ui-lib.js","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.2_1773501113413_0.0828623060151259","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"mgv-backoffice","version":"1.0.3","_id":"mgv-backoffice@1.0.3","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"05544e30e7a0d45065d81bb25675119def959210","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.3.tgz","fileCount":54,"integrity":"sha512-wMFZWJdgJIv+ieWJhc7g8PyhzRKo3PpeFGO/9o2o2EIZNSXdVytvSpg1gDIEDeUZzDVwSzTPCLcd4kNNPD+dpg==","signatures":[{"sig":"MEYCIQD0Jc9v3j86lXDbJ/hEnIwaeCKXgHOLADXBhNbk/mosjgIhAIPwfuAnIwhsm4AoQ0EgIbIMMn3F6xqc+otrrsGBaKDp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98279},"main":"./dist/ui-lib.umd.js","types":"./dist/index.d.ts","module":"./dist/ui-lib.mjs","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.3_1773502077500_0.05339149245928043","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"mgv-backoffice","version":"1.0.4","_id":"mgv-backoffice@1.0.4","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"c88483b4575ad9cb83938135e692a74a00fd0593","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.4.tgz","fileCount":54,"integrity":"sha512-f+3njNEMa/PMLeriLIc8OFfHw0pYFfzIfHkxvqA1DmDTRhe1dNb1T8x6BgqXEGXwVpW/BdLSjcceLtTCWbQUSQ==","signatures":[{"sig":"MEYCIQDdKGSyJoyt7BLCAjOKSGn44qhq9bMV58+RHw1ccW079QIhAK7Mo+S3d+N5Zot6BAfNKANk5dva98qUINK0pCVslSMN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98481},"main":"./dist/ui-lib.umd.js","types":"./dist/index.d.ts","module":"./dist/ui-lib.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.mjs","require":"./dist/ui-lib.umd.js"},"./dist/style.css":"./dist/style.css"},"scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.4_1773502229918_0.0329252214718152","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"mgv-backoffice","version":"1.0.6","_id":"mgv-backoffice@1.0.6","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"73387e3c446fe5fd085f6a8d9686238b8a423adf","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.6.tgz","fileCount":57,"integrity":"sha512-Jem0VrTrofo+PZAlY/wtEZ6rPSEtQ0fgojlFxU236Rl1O5HfAUoXCMCn8T5KCFB4KbQ3/4gYs86AB8Xx94vb2Q==","signatures":[{"sig":"MEYCIQDRhIumZcf59fjfueoq005hqY6IbSOQq8lidBdW5ZhvzQIhAJ+HA+e52X6fkvwt7aOpWJ0mMWA5yCWvy95uy1v8Rjzz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109419},"main":"./dist/ui-lib.umd.js","types":"./dist/index.d.ts","module":"./dist/ui-lib.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.mjs","require":"./dist/ui-lib.umd.js"},"./dist/style.css":"./dist/style.css"},"gitHead":"8ed8cee735c1c9e34807c58791910b26fb1532c2","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.6_1774264103770_0.12386703178278058","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"mgv-backoffice","version":"1.0.7","_id":"mgv-backoffice@1.0.7","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"f894b8b46ed6b3a897f7938c232982663a2d2ea5","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.7.tgz","fileCount":57,"integrity":"sha512-WQ/EPcVN3/0vMd/LKy0QUkCtP3SrvLRMe5A2REp7Vdr/s//ce8GLLqSlGxp9c8uQlOTa1H9OMVmxiL+EeZkQrw==","signatures":[{"sig":"MEUCIBVVtRzL91QQ/ftmFt4G8qA3o4qFGMr/4A+DMxzCfA/aAiEAkAW6aHb9ZAwzat/oJD9HyjyDFSNrTRybNrc0vep4y1E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109419},"main":"./dist/ui-lib.umd.js","types":"./dist/index.d.ts","module":"./dist/ui-lib.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.mjs","require":"./dist/ui-lib.umd.js"},"./dist/style.css":"./dist/style.css"},"gitHead":"8ed8cee735c1c9e34807c58791910b26fb1532c2","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.7_1774265236897_0.10319047906116086","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"mgv-backoffice","version":"1.0.8","_id":"mgv-backoffice@1.0.8","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"440b3b8774e56ed7a632d7bcca99298abff2f2f9","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.8.tgz","fileCount":58,"integrity":"sha512-bpsyyhj//fYLj0fZgLClLIWGRVfANF7VxhBPgZYhnkke7VcvoqSbuLGqZJGFrztQSdE55Dck9CjsDDWUiKiy6g==","signatures":[{"sig":"MEUCIQC81wLH2/kXfpd2xp7h2OaB/vS5dRCeFtCysmtl8n8GDwIgcSi/yCwNj3clZ7nXTBHYamFBaUxXGzbIcYZRoiTS85k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116714},"main":"./dist/ui-lib.umd.js","types":"./dist/index.d.ts","module":"./dist/ui-lib.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.mjs","require":"./dist/ui-lib.umd.js"},"./dist/style.css":"./dist/style.css","./tailwind.safelist":"./tailwind.safelist.js"},"gitHead":"8ed8cee735c1c9e34807c58791910b26fb1532c2","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.8_1774265839989_0.5484088170798107","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"mgv-backoffice","version":"1.0.9","_id":"mgv-backoffice@1.0.9","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"a52a26ce16ab31d3e4e8a8d361683e9323a98595","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.9.tgz","fileCount":62,"integrity":"sha512-7TdktA655X9Sr5wCuVqfDQfsA7j1WgUaI/B4kaRlHPAT6SsjaxqOyHQk1S5p01KAgwiz18/3DM8fopj1CdJGHQ==","signatures":[{"sig":"MEQCIHydOXiMs0FjqjydewFUgTHhlBZQ+Q8QMnY9FTrAahXAAiB2SjWJB+nbwMq7on1hkLF/JgaQcaj0yLnf2lgXJo3Pww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150153},"main":"./dist/ui-lib.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.mjs","require":"./dist/ui-lib.umd.js"},"./dist/style.css":"./dist/style.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"c2e4347933ab95e0aab3ee611e952cac893dbbc0","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","tailwindcss":"^4.1.0","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@tailwindcss/vite":"^4.1.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.9_1774515840675_0.3029777670598184","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"mgv-backoffice","version":"1.0.10","_id":"mgv-backoffice@1.0.10","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"3ece16b8d183faff6b15c5fb165b288cfb968d6c","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.10.tgz","fileCount":62,"integrity":"sha512-Z1TNXiYwdWhPEpjepNEp2OICj/oyCopXcp/abFxXvYZozMOYPBcqs9Yn7TgOeFMKKN2aKuqh3lP4b+ovlj9Nuw==","signatures":[{"sig":"MEQCIGgGf25jk2eRfyKttHHHslWHzpue2nC1xBBCzXD0b6b1AiBhN8210bWaj/SXZ78qTTZIMpk6S3iPAGqyzOWyBkICcQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150401},"main":"./dist/ui-lib.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.mjs","require":"./dist/ui-lib.umd.js"},"./dist/style.css":"./dist/style.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"c2e4347933ab95e0aab3ee611e952cac893dbbc0","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","tailwindcss":"^4.1.0","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@tailwindcss/vite":"^4.1.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.10_1774517131112_0.8423243404238112","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"mgv-backoffice","version":"1.0.12","_id":"mgv-backoffice@1.0.12","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"1ce621fb58903e6beebc20b442f92e2783439e59","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.12.tgz","fileCount":62,"integrity":"sha512-j03QEv5AgZnJuE8JjAlJi/qtinqIFyjkyIBg+64XoHku+a/C8lDaKYFbeoGwcjw2+AJr+8FW9wIxbqCGXYf1rw==","signatures":[{"sig":"MEYCIQC7fQTZ8dAoNzIIM1AUs9S5gD9IkTvKi1ex92xWWmt4KQIhAKcQBiHUGLe9HIYAXBPYYWN3uUig10ILzdT2Rbaln5bq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150401},"main":"./dist/ui-lib.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.mjs","require":"./dist/ui-lib.umd.js"},"./dist/style.css":"./dist/style.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"c2e4347933ab95e0aab3ee611e952cac893dbbc0","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","tailwindcss":"^4.1.0","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@tailwindcss/vite":"^4.1.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.12_1774517628836_0.44766920122569664","host":"s3://npm-registry-packages-npm-production"}},"1.0.13":{"name":"mgv-backoffice","version":"1.0.13","_id":"mgv-backoffice@1.0.13","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"3c03b5c3ebcf79109a6f5f8c74513ef78111040d","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.0.13.tgz","fileCount":62,"integrity":"sha512-bBxeDn59oQs5IRqktUlDL1nnTZjJa/xmbHKlhxTghQ3PIr+Hfs5iMcuooJ8fXrSkHSjuJWDiAWwGflhMbjYdIA==","signatures":[{"sig":"MEUCIEqju4o9DYl3O4E+4rGvDOrxdpZ3UWOfIW2OMfei31G3AiEArhFWyEAAgIsLWxdl+m1tStA0+QdBH4Du7QQjw6K+vOo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150401},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/style.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"c2e4347933ab95e0aab3ee611e952cac893dbbc0","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.26","sass":"^1.97.1","vite":"^5.4.0","typescript":"^5.9.3","vue-router":"^4.6.4","tailwindcss":"^4.1.0","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.0","@tailwindcss/vite":"^4.1.0","@vitejs/plugin-vue":"^5.2.0"},"peerDependencies":{"vue":"^3.3.0","vue-router":"^4.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.0.13_1774518859148_0.8835675206929594","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"mgv-backoffice","version":"1.2.0","_id":"mgv-backoffice@1.2.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"a23ef1c587449acaf763a7ed46d03c5bb78dd9a1","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.2.0.tgz","fileCount":97,"integrity":"sha512-5QEv5m9XCykQx/a3YDBPtshcoor5FEpFTUSVTCQPpAdrznUHcEHIjO/fRv1rl28G4SNGD+N6jPNDPQx4s+SY7Q==","signatures":[{"sig":"MEYCIQCxz6cFOJK3FSup5W6NXywtOqGdrr+tFXwTVOEZjkJrPwIhAIHnt2m1wEgjpvO1Z8//rIR0kO6ioO7Wl9YacDO1eOtL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322900},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"2d5a28181f59a4b79c3b548bfb50f0f1c7db5920","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.2.0_1779082425937_0.930194116561444","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"mgv-backoffice","version":"1.3.0","_id":"mgv-backoffice@1.3.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"eb2937aeaf9148f82b3117ed821863761b2c3628","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.3.0.tgz","fileCount":97,"integrity":"sha512-ceq7DkeONE7GFUPLTS9V617mak4cFg74M+JsetuZOq+I5Nspk3AZ4QTY3UONnst4Zz5j7idQ+M6B/8yfawKYHQ==","signatures":[{"sig":"MEUCIQCB6WbMTZUwbCPzlDwZ/mS31nCpNWsCbXj5ZSkslrqpswIgMe1EsFEQn/Tz/Rv2PSMYd8BYShbEV+v+9gF2WTb4Npo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322900},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"2d5a28181f59a4b79c3b548bfb50f0f1c7db5920","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.3.0_1779254253672_0.7859053423625879","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"mgv-backoffice","version":"1.4.0","_id":"mgv-backoffice@1.4.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"0c7ee10e5bac72899acfdf20741c44bfa3843ac1","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.4.0.tgz","fileCount":97,"integrity":"sha512-6JM6xg4DROoEXtvYd6TyBjroXIgMN8yRlcqLiZ0lNIUofDkK9BFvxivaPklx/LKx62splVx/yxZKcn95FTawkA==","signatures":[{"sig":"MEQCIAgp7FP2fN37PYzy7Gp7yL9BnwzwVYbZCIdhgkYU18phAiAnLNGtHhtnr8a2/d/1jgUs05X/QtlOKShbkV9CwgL3QQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322900},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"f20b6c3e52a253176a7e572c92302fa436d25b62","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.4.0_1779338821316_0.5862767854402522","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"mgv-backoffice","version":"1.6.0","_id":"mgv-backoffice@1.6.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"a386ab88d6cc327260b12a312b3dc623d974c61e","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.6.0.tgz","fileCount":105,"integrity":"sha512-t0rs2POKxqW8xGKlQEny1WpDW01aHkIhF9UIhQ/Nmo37cKXEpvrzeQb148JNHbg8dfaN3csVkeJFuVUFlPUpCw==","signatures":[{"sig":"MEUCIQCiunfqTawxlUq4wkxewDQm0m4kyxCcYzEhfT2NTcqhHwIgevt6jMn1uT6vD6BborQow6RMzQZszw7SkEirjR3MPuA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":366900},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"15a1550e7da06bb6f49289fae74dd5746f34c41c","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.6.0_1780151956024_0.43485743234367846","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"mgv-backoffice","version":"1.8.0","_id":"mgv-backoffice@1.8.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"e6edc527c9455ba63ee9bede6ebe6a98628af351","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.8.0.tgz","fileCount":109,"integrity":"sha512-JciVjW3ohsOArV4c2tgc5MasRWBqGA6Q3wTvWwCYk0vS8OYr3mMeg3Nryk2tXu2N9JcWxxEhtB8EyYelkv2UpQ==","signatures":[{"sig":"MEUCIG21yq4eN8UZ7mhf3HzjzSmeUoDAE1MQMADn20agEelIAiEArnasjF3+hXTNVQn5/mDhMHVCqNfmdwrQiVbFy4qEjRs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":378426},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"15a1550e7da06bb6f49289fae74dd5746f34c41c","scripts":{"dev":"vite build --watch","build":"vite build"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.8.0_1780152998586_0.49364771377387284","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"mgv-backoffice","version":"1.9.0","_id":"mgv-backoffice@1.9.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"5c4ad9256edab56aaade5c849f20f3f816570a14","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.9.0.tgz","fileCount":114,"integrity":"sha512-j4Ifz5zCydglQPZ+8zqZwkmm/r5WgJ3aZjIzjGTgDTK/IGEDWVOKiAtHOXrlg6wx+czPEBRR4BNiG+aHw7m6wA==","signatures":[{"sig":"MEUCIQC+ksNtAN3Q9aQnfNY7UabKsKhTuS7klMEjHeSnmNRPJgIgM1jX3hO1xRt4TvLa2te8DgjCYPV05zGPS10wR35R/3U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":392598},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"15a1550e7da06bb6f49289fae74dd5746f34c41c","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","jsdom":"^25.0.1","vitest":"^3.2.4","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.9.0_1780154024428_0.27258933836706256","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"name":"mgv-backoffice","version":"1.11.0","_id":"mgv-backoffice@1.11.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"fc681ca9c13050b34e6d8c43430267f1e7f41196","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.11.0.tgz","fileCount":114,"integrity":"sha512-ai1gT7XAuNE1DpNmGhYfbVYeqTfLIYmvukL0df3IEMsYVjmGx4nfZ6jV16XecOan1yDKAuITrKiYkUROe4p12A==","signatures":[{"sig":"MEUCIDqlFY+tML0E884+YOZGdzO70eL0LcCk8vbkKPA0cn6/AiEAhuJdIvyQ7NkfqsGtFCuUB9RwtF9DwNFHnYEZO2VCziY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":397785},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"15a1550e7da06bb6f49289fae74dd5746f34c41c","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","jsdom":"^25.0.1","vitest":"^3.2.4","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.11.0_1780462956107_0.5045409063964019","host":"s3://npm-registry-packages-npm-production"}},"1.13.0":{"name":"mgv-backoffice","version":"1.13.0","_id":"mgv-backoffice@1.13.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"96a3fb3de0e8e184cb4c44773e45a9c6cc414407","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.13.0.tgz","fileCount":115,"integrity":"sha512-/Lv+GoA2KbtLZ3GMnWV4CwcR1Sw/r1nfcSewASYIR23w8ld4+TuALIYxFvlTULQ8bugf+RwLw6GcdQuJeLM/Mg==","signatures":[{"sig":"MEUCIE/2M58UniyFL70vSGA3DyD2/SGNHX9jtf5w44Cv2JYoAiEAkkw7YVxML6ZdiqRo9gTv93RfLk8/ne9Frqia+L3Cafw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":427190},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"15a1550e7da06bb6f49289fae74dd5746f34c41c","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","jsdom":"^25.0.1","vitest":"^3.2.4","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.13.0_1780635854277_0.9151240652460702","host":"s3://npm-registry-packages-npm-production"}},"1.16.0":{"name":"mgv-backoffice","version":"1.16.0","_id":"mgv-backoffice@1.16.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"198612577e9699243c7170ae1fd9cdff744a7e54","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.16.0.tgz","fileCount":117,"integrity":"sha512-50g43cZqQWtpCm11iOl7BHTueE0AVYn4/nG549Z+qChQYhGj8YU7Gj4TaEPEJlUFvMAqQ1uTj4q3jPgD6ppL3Q==","signatures":[{"sig":"MEYCIQCynv+32hq+JMAToBiHfyb1LsihmipwBG7lKGVA0NoesAIhAJ1ZuIJ2Bqi5oY84NwIuesonWdeM2OIiDv+WoHBq3G4j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":444310},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"5b1b04a5b80e0ad07f735f6d3c28ffb595905051","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","jsdom":"^25.0.1","vitest":"^3.2.4","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.16.0_1780670606412_0.7276363179256582","host":"s3://npm-registry-packages-npm-production"}},"1.17.0":{"name":"mgv-backoffice","version":"1.17.0","_id":"mgv-backoffice@1.17.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"76a067fb744cbf894401adfd89583dbafe8caf16","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.17.0.tgz","fileCount":117,"integrity":"sha512-GjN//XZk4MaLoD3+OdfWkVbRbka33gvxoiqnkBiwAtWkRVbmcyUHc7Cr3mkTFJWp/vRht5tK9WVeJ6ZWALOhrA==","signatures":[{"sig":"MEUCIQDLOsc1brzHUxOtY2a7nfRg4IGNe65uPjLf4jLWmcfDqAIgYG/TWmNiTqINvYCFe568xZFYCbu7OceP0FWZV8qJC3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":445185},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"629abfd609314a7a73e6e5961367363732609394","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","jsdom":"^25.0.1","vitest":"^3.2.4","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.17.0_1781009895224_0.8099541018080092","host":"s3://npm-registry-packages-npm-production"}},"1.18.0":{"name":"mgv-backoffice","version":"1.18.0","_id":"mgv-backoffice@1.18.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"a40f897fd60063fb60dde8dc402ee45bf39b87c2","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.18.0.tgz","fileCount":118,"integrity":"sha512-efm6kp66DYbLqthpYVURS9cbx6AOeEkakXotVtVBWl5HWpTMkQWYj1r/oNjbGjrpVZ09DbQGK++SvgtnOSdEjA==","signatures":[{"sig":"MEUCID+hs1udgOr1Dtslvnr3eWCjYrOP5sGQGoTIxW+XcslmAiEA9u9S6m7ELQs4AWRnKIU31R87w70Zp5jpuNj4y7DsnHE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":453306},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"df4644e29d145db22e099e29320886a788d14a22","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.32","sass":"^1.99.0","vite":"^8.0.8","jsdom":"^25.0.1","vitest":"^3.2.4","typescript":"^6.0.2","vue-router":"^5.0.4","tailwindcss":"^4.2.2","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^4.5.4","@tailwindcss/vite":"^4.2.2","@vitejs/plugin-vue":"^6.0.6"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^4.0.0 || ^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.18.0_1781240220424_0.898888039139164","host":"s3://npm-registry-packages-npm-production"}},"1.19.0":{"name":"mgv-backoffice","version":"1.19.0","_id":"mgv-backoffice@1.19.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"7c5763ded5d96763f538f9d7e017e540eca0411f","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.19.0.tgz","fileCount":117,"integrity":"sha512-tsbxcqOe0BRXstMhR6/dzSh7dl5htOIqxbnGZ65WWLaRr39w2uViGI9Kc4MXbty+btWAnKqtStpgcpyoUM5qlg==","signatures":[{"sig":"MEYCIQDism7pQt0e/IP2NGuQ7loPxSyFzDz6o0COb/QpKB5feAIhAMhawi9lEpWiyp8tXZnv8qe0I3RJrNNPVsjMUNYZWPhQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":452262},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"096f1b7db3c0220e37eaa57c8f6aec64ff29862e","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.19.0_1782310986046_0.16389808113269488","host":"s3://npm-registry-packages-npm-production"}},"1.20.0":{"name":"mgv-backoffice","version":"1.20.0","_id":"mgv-backoffice@1.20.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"7d3d21906a2283d9c937305b39110faff0f926b2","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.20.0.tgz","fileCount":133,"integrity":"sha512-PpVnv7rarFVCXK4Yq/QnZFrNNY8p4n1Rr/uaxl2BHWuh3l9x6UtrqBfqKC+y8BCWEUBk/BAc+Y5fkCPVajWrEA==","signatures":[{"sig":"MEUCIQDpk7DeTuD1uoMXhIn9LI9ZU+28qb1NdSHoiHxpePUvlgIgHK8Aj2NmTExJqh27Gr7cfbz1RjZdk213FCUAegpxBKA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":536831},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"97671ed3ea82359e9357310e44593fd125443ab3","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.20.0_1782641992442_0.03563013081332089","host":"s3://npm-registry-packages-npm-production"}},"1.21.0":{"name":"mgv-backoffice","version":"1.21.0","_id":"mgv-backoffice@1.21.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"1453a16f2b55e8c57ff11a18b4e1ff3a6a880a2c","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.21.0.tgz","fileCount":133,"integrity":"sha512-qq+pxvlTYoGEAC3VlZRyXfzJ8LeRXKxX1smCghcsitmXvSw4UUTuVa8f5/c7CjPH5uVCGKkeByxySfRRK1ImYA==","signatures":[{"sig":"MEUCIQDkYryEis6a3hYvB+hz5OMTlrqyjp/cNRbsDVg8tIy00wIgbi7h9BZip7FcXKqRISMx7TcAK4ZwkbPAOy3VpIvF8Qk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":544351},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"17b0c8b417f3c40fa74eba418026779af52c87aa","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.21.0_1782843259304_0.178698721980858","host":"s3://npm-registry-packages-npm-production"}},"1.22.0":{"name":"mgv-backoffice","version":"1.22.0","_id":"mgv-backoffice@1.22.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"b4feb12dc286c9704c07b916c82cd8b46190f29b","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.22.0.tgz","fileCount":154,"integrity":"sha512-8O7qP6ewvBocvXffmx9KN22AFKL7Ypg/jpCnwwPUFHSf3KWfKxPFV38rQ+ngfPubJE9wntxTR0Ppm/efnyn67g==","signatures":[{"sig":"MEYCIQDQdwc1c60G3Cm8UQu8xnS1h7Vh5YpXOSkvKlKLYkI+IQIhAJLc1EtqVb6d6dMjb4zNBEfasN8W09bsk6PkGUVJP3TQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":595605},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"d84b7ae7540f462d30374f0d85731966fea0c163","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.22.0_1783788947634_0.8538170812575172","host":"s3://npm-registry-packages-npm-production"}},"1.23.0":{"name":"mgv-backoffice","version":"1.23.0","_id":"mgv-backoffice@1.23.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"00c1a9cd7e23d69c5304128aab4b2f8f90f0b833","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.23.0.tgz","fileCount":154,"integrity":"sha512-Zrj4xKzEmOTz20CbUvRjzQEyiqrCABpJL+pVZoo/EOwSe1EyXHblKdzKuveb3nsUN5iUKtJEDt5iSkByEsCK2w==","signatures":[{"sig":"MEQCIGusPOYR816PrjR9hmd0dXI32LKE0PlZPGsNYTaDacvYAiBWCq5gEAu5n+d0AaGDTS7U/db5utk3x9qfFnRV+qmJpw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":598950},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"d84b7ae7540f462d30374f0d85731966fea0c163","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.23.0_1783851648507_0.3339927386805417","host":"s3://npm-registry-packages-npm-production"}},"1.24.0":{"name":"mgv-backoffice","version":"1.24.0","_id":"mgv-backoffice@1.24.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"aa94eb6867de6941bda915cf70481e1b428046f8","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.24.0.tgz","fileCount":159,"integrity":"sha512-y5+uErgprULQM4UMh7mNEeBUHZkKEsi3LivBHf75dmEGlx6lNiZnYwSE9h9jWlMB4/V81U4WIsBcWnn0XFoIag==","signatures":[{"sig":"MEYCIQCYtl0tahpZGPer0c9bBv/hI22S7Ypa9VmGlnCSgdV9AAIhAMP0LOScRsiCooIfHLajN8HwohDP8AC8u4g3OjL41WVV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":618824},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"f0d2b2587e28d439650bde529546ce1b9eca5f7b","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.24.0_1784611048903_0.30642944217730683","host":"s3://npm-registry-packages-npm-production"}},"1.25.0":{"name":"mgv-backoffice","version":"1.25.0","_id":"mgv-backoffice@1.25.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"5b4f9f76618c56535507e9b05e6384989bc52748","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.25.0.tgz","fileCount":159,"integrity":"sha512-sdOA8FtyiXRofXsPr/qz+dL1rCytc0dY6InzKfWO9jkmcQOz76DkDSX2tezh3n+IswvHR04Qv9vCw9/YPP9wEQ==","signatures":[{"sig":"MEUCIEZxBUo4Zj+Hpk8vTjSd0kQEPsR2D4WegzVHxjq4SBXLAiEAgTf3BrTfRHFSAo2jtrP58LNY4y/g+l/L/dEUdjXK8Y0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":628308},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"77cfd4371a7e27d22a047dbc403ed0ad1d4c46b2","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.25.0_1784611712095_0.9002691655581543","host":"s3://npm-registry-packages-npm-production"}},"1.27.0":{"name":"mgv-backoffice","version":"1.27.0","_id":"mgv-backoffice@1.27.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"af010a70237cb63f583a923273ef9d1b3c1cb356","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.27.0.tgz","fileCount":164,"integrity":"sha512-cAPQAPAucxd4z0OHJpAnHZl16d3EPUG2OJZ5y1N6AG0CeLMueEkR4f3IhfRnbuDkWx3J5kqBQLmGJK+JavW1xQ==","signatures":[{"sig":"MEYCIQCwBLUwrlFeT28Yug7xExOUkQpy9oew3pJgrVf/cN3q8gIhANdYYmDsNis5tLRYxNbkMsWD3Snm1MGapPLH0grCeh7J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":641397},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"c5312b97ab513bdc4ece427b1790df3713f0b365","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.27.0_1784733470336_0.6769261490341136","host":"s3://npm-registry-packages-npm-production"}},"1.28.0":{"name":"mgv-backoffice","version":"1.28.0","_id":"mgv-backoffice@1.28.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"a733be1a1bb2362fb1819616e11aa827b87904cb","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.28.0.tgz","fileCount":170,"integrity":"sha512-nKT6QGhmX6htxdDb22iSi2uI1wG6XzckNxjgwAdHG3M5SshZOEgNYW0jT5MLTQ6B4EVyTssX7aD1eKK/l3rbcw==","signatures":[{"sig":"MEQCIE3sH2wu7GmlyVEmvYfp60i+dTvezN02g1U63WZ758ogAiBOGcZ64ZaSr/iQLnQSVurFzqHpaTIQ7N8KdbcGdCy7Pw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":659225},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"c5312b97ab513bdc4ece427b1790df3713f0b365","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.28.0_1784734246530_0.4132018088535625","host":"s3://npm-registry-packages-npm-production"}},"1.29.0":{"name":"mgv-backoffice","version":"1.29.0","_id":"mgv-backoffice@1.29.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"09910fa718d3675113da7ff7785dda5d9109984c","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.29.0.tgz","fileCount":170,"integrity":"sha512-bgVmlui2MZM0X1J9FqKlMgUyg66gIaiyyQW2KF3tQ/wmImCS8RXvXrFyZiOCAKNBnnXyxLW7rJtUnEoHVFJ+og==","signatures":[{"sig":"MEUCIFDPbF4onUksw2pJs9SXCKKIV7asQjG998fQlsOmJ5R5AiEA50EXhuKu9WHqXbeovzgg2KBPanajfE6eh7drgrDMEQs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":661982},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"c5312b97ab513bdc4ece427b1790df3713f0b365","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.29.0_1784734839945_0.32084065984507126","host":"s3://npm-registry-packages-npm-production"}},"1.30.0":{"name":"mgv-backoffice","version":"1.30.0","_id":"mgv-backoffice@1.30.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"eea538c89f7bd3441978a81cc269f17dfb65fda1","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.30.0.tgz","fileCount":182,"integrity":"sha512-HEkR44vRXrJmFwpVGR8HiK46YaSyQ4k+E9JMGR3C8EpdS581VLv5gl4xYc04FPAgV848lZl51u0oFPVjB1Zx3A==","signatures":[{"sig":"MEUCIED3O8wHefkpEDw55EF+2wcjODt8EIowfQJucZ68NFWgAiEA/1Pqq8CTnp813OxEnhw8iBNeVnUWe/9o5JVQszFndJQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":720439},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"c5312b97ab513bdc4ece427b1790df3713f0b365","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.30.0_1784782901846_0.4733957084311613","host":"s3://npm-registry-packages-npm-production"}},"1.31.0":{"name":"mgv-backoffice","version":"1.31.0","_id":"mgv-backoffice@1.31.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"5ac269b10f68afd2695abe02897e035124b0c741","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.31.0.tgz","fileCount":188,"integrity":"sha512-JwVgD8yQ2taxblhWvQK617vl+y0CWc9nXwnfY0zLIe1b3Ju0PePV7b7FL75ZomzNXLjuukqRzd4QmVglTd93aQ==","signatures":[{"sig":"MEUCIQDCBtTurj3sCFQgV3OzM3R/0bSNISXn4TrKq4jBgspwHwIgKrUJuhltJL9ItjaJsxMk4Do09GVoimWYlu7OSbccmq8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":748517},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"c5312b97ab513bdc4ece427b1790df3713f0b365","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.31.0_1784784969905_0.4887676293854917","host":"s3://npm-registry-packages-npm-production"}},"1.32.0":{"name":"mgv-backoffice","version":"1.32.0","_id":"mgv-backoffice@1.32.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"18a59555ea0aca52b6bdd8fe1623e4ee84b514b3","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.32.0.tgz","fileCount":190,"integrity":"sha512-sVrZskyUpRhkMcxUmWPSIEDr8GrCzICnXkh1psX8akSRWmTMtTxYpUBY7YwkxhdbfqNKxmz7vq8VcTHbtjegYw==","signatures":[{"sig":"MEYCIQD9eatTkmNNjKcP9uN7KrwgyoU2up6yKwJjGt6u1k7WrwIhAPUwnZT90tKEguKM2/kdYfZdWcjvk8CwpwWUCvJF9SDf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":761806},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"1779702ba8f74937e179f9e3fa9fd88f1b8900d9","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.32.0_1784905848742_0.027327204848772935","host":"s3://npm-registry-packages-npm-production"}},"1.33.0":{"name":"mgv-backoffice","version":"1.33.0","_id":"mgv-backoffice@1.33.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"e0ac0a898b4219d818493d3df016ba809a398ca8","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.33.0.tgz","fileCount":190,"integrity":"sha512-D5YMpKubDKMIGtkcyfTY9ALMDryoSeEmthvsPe8b7LZby3QkQmvA67gp4T18240l2r+fh2iZBH/ZB9S4PuJ3WA==","signatures":[{"sig":"MEUCIHPjUqd+ziC3+GAQvfgu+rALQ+WfDEZ4LtBZsL/NFrSKAiEAiuTIwmwY/heIP9Iy/gfr/4uyB/mUWg9PgGCiUA4XIYA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":763756},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"1779702ba8f74937e179f9e3fa9fd88f1b8900d9","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.33.0_1784911710216_0.5766462395768701","host":"s3://npm-registry-packages-npm-production"}},"1.34.0":{"name":"mgv-backoffice","version":"1.34.0","_id":"mgv-backoffice@1.34.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"8acd3da72c2bc1e2e70152972174cc07afa46eaa","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.34.0.tgz","fileCount":200,"integrity":"sha512-WAMQ7eG3VxqnctA4G1YWBl6aWNxUQQn9v9JBMyrELaQNo35KlF6gsO0C2z4udDJhqM0Sqo3ifXptj6fJYajVzQ==","signatures":[{"sig":"MEUCIQD/IasCuOe7VDp66glbbqUz0wH7whqPbCMZj8ilA5ffRQIgWGvpAl/zXUL+Yk7EAb6eIms/Z0zxIAFvxFCPGh5Om8Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":795761},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"40ef272da4cb082f458f90df1dac15342ad8b05c","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.34.0_1788013278091_0.009703541768233626","host":"s3://npm-registry-packages-npm-production"}},"1.35.0":{"name":"mgv-backoffice","version":"1.35.0","_id":"mgv-backoffice@1.35.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"b8c3d84451cf034befed307d475762fb8889aeac","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.35.0.tgz","fileCount":206,"integrity":"sha512-c4yn6z6YQ7LNKGlkzruKQ64WnW5AvK/UI+bHDfllMAtXLlrEF+FrZtrTJB02mGotYOAH8t9tVtT3iGXLU3kn2Q==","signatures":[{"sig":"MEQCIFpF08I2ypaVWfFOK99/GVYRb6BfnrH610/+QI0iqgGyAiAXDEBQ/p84bUqGVO06GsedUK/4V0zQXLILSFefTzTfPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":821789},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"40ef272da4cb082f458f90df1dac15342ad8b05c","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.35.0_1788014950443_0.7680981601988097","host":"s3://npm-registry-packages-npm-production"}},"1.36.0":{"name":"mgv-backoffice","version":"1.36.0","_id":"mgv-backoffice@1.36.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"c965c0b276a7573b01bf431e32a9e6a14385ba42","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.36.0.tgz","fileCount":211,"integrity":"sha512-g7uhPJEz4NjTuY/+74qN4jdrJ/zf1BjX/E50v19b/ZS6UeDVSBdfUnLjglnZ3kf//c4GmSOjBEMMEMduPgNuwQ==","signatures":[{"sig":"MEUCIFA+TyOE2CtP2YSEw4ncLUWa3z0RtemTtJeWnL2I1+l6AiEAuRTqzbGcCxuSdpmvh/bgzLM//HqqGzf+l9h8ebBfqSM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":836119},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"1341eef1faaeb2d42f16a26fd31f44526575ce9a","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.36.0_1788077371884_0.03713918157970686","host":"s3://npm-registry-packages-npm-production"}},"1.36.1":{"name":"mgv-backoffice","version":"1.36.1","_id":"mgv-backoffice@1.36.1","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"eb424302e5d7ba804388ee9e788637242a85ecc4","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.36.1.tgz","fileCount":211,"integrity":"sha512-WK3RT9hljPjSSdTfNdFBu3qeyRKxIEP5YQrm+WxZk2TwygTSqmBlU6jotW/KKwXwCxELtuyu8/XWcf2Z109Kng==","signatures":[{"sig":"MEUCIFUI+SnDv/fCiYTQUFJ0awFKvpA5A+eQ5Yr/hpMgZ1BBAiEA2Jsggv8n8NqQALckdzrYX1OB1z3/aRXSckN4+Rw5E4I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":852089},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"2146cc468868e4532c38623bec8e42c44e343696","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.36.1_1788888054579_0.6285534305124358","host":"s3://npm-registry-packages-npm-production"}},"1.36.2":{"name":"mgv-backoffice","version":"1.36.2","_id":"mgv-backoffice@1.36.2","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"93f38c12158b5a43c02ffd3c088efd3542ec0e75","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.36.2.tgz","fileCount":211,"integrity":"sha512-++Gf58qDOehWJM5aaF7jG2jd4vK67NEnCKW7dSiBHXM7GKPNPZfhfxaO7Ezurh8aDr7dFp1HV6Hp1W8kqA6kqQ==","signatures":[{"sig":"MEYCIQDV5e+eEye5XqIlhQUCukSjlzxn3Cjzl3rK7k2r/Vnk+wIhANPc23QKJ0Wp128SuQV0CTR86N71AYu9bqeaN6TBJmTV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":852560},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"78150b74955e09540fa09796c2303bf434960a16","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.38","sass":"^1.101.0","vite":"^8.1.0","jsdom":"^29.1.1","vitest":"^4.1.9","typescript":"^6.0.3","vue-router":"^5.1.0","tailwindcss":"^4.3.1","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.4.11","vite-plugin-dts":"^5.0.3","@tailwindcss/vite":"^4.3.1","@vitejs/plugin-vue":"^6.0.7","@vue/language-core":"^3.3.5"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.36.2_1788932807179_0.6338744456334369","host":"s3://npm-registry-packages-npm-production"}},"1.36.3":{"name":"mgv-backoffice","version":"1.36.3","_id":"mgv-backoffice@1.36.3","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"b5d6233aa69721a0e01e4c1a191528866e4166fa","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.36.3.tgz","fileCount":211,"integrity":"sha512-ho4lMthwljPmb8FO60KiDKlLqFOqVszDG0m9XsLGS8rGveR3h9qC1TRp/03YEoQNpheJts4N8eweL2W5QlttwQ==","signatures":[{"sig":"MEUCIQDc3XKphARUlwo4RlfVrCeT45/xbIIZh7kCLXKPs2OwzwIgNuDKaoznEJ9/gtn0smBe6tch6U9ljKlxNKCEXd7FWyQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDD5IAoOn8FzY7ZgGkiKk1moX8fu8pRvVZ0QFAImwKr0gIgWfCMcLxEog57vJiaMO6sNFGsMhivU/MKvtmDX8lVF5o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":852263},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"4d2537ceef9e4004bb3a290cf23a416f63cff8c3","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.43","sass":"^1.105.0","vite":"^8.3.1","jsdom":"^29.1.1","vitest":"^5.0.2","typescript":"^7.0.2","vue-router":"^5.3.1","tailwindcss":"^4.3.3","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.5.1","vite-plugin-dts":"^5.1.1","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-vue":"^6.0.9","@vue/language-core":"^3.3.11","@typescript/typescript6":"^6.0.2"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.36.3_1790498759371_0.47862068366753086","host":"s3://npm-registry-packages-npm-production"}},"1.37.0":{"name":"mgv-backoffice","version":"1.37.0","_id":"mgv-backoffice@1.37.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"3ca5a21b1ee097b092b8462c49bb4343ca0d45a8","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.37.0.tgz","fileCount":214,"integrity":"sha512-8O0ciRpJHI+0hQJf5BtnXs+lEKVZoCEApSiklavtUJNTu/kZpADeBju8tFe2NdwoeYLhcSi1asjzrikKQB78Ow==","signatures":[{"sig":"MEYCIQD+u/PNsyFTRS8Etno+se2+gjzMMaSPnsTmaXCeeQYPxQIhAKl6cRJ/L4jtapMy1e4vIxIu16LTzaFLsBVLvDUp/LFf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDF59Sx2p4l5jfS/oK+MxStMOfh4znZ97tTnSa6Pk7qWAiEAuG0Mt2E6DSiHayOdBBr0WsEAiRqhbdL3dM3q/QyiEg8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":891365},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"4d2537ceef9e4004bb3a290cf23a416f63cff8c3","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","dependencies":{"@vuepic/vue-datepicker":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.43","sass":"^1.105.0","vite":"^8.3.1","jsdom":"^29.1.1","vitest":"^5.0.2","typescript":"^7.0.2","vue-router":"^5.3.1","tailwindcss":"^4.3.3","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.5.1","vite-plugin-dts":"^5.1.1","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-vue":"^6.0.9","@vue/language-core":"^3.3.11","@typescript/typescript6":"^6.0.2"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.37.0_1790501009753_0.3156057254480753","host":"s3://npm-registry-packages-npm-production"}},"1.38.0":{"name":"mgv-backoffice","version":"1.38.0","_id":"mgv-backoffice@1.38.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"02c688904a985c17edf06a1e71134768cb8be3a9","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.38.0.tgz","fileCount":226,"integrity":"sha512-XzE/cPIjLPdNxdhVbgGSqpPiCmeJUJSA7CtMio8JSo1jHFYytu7Ik4GFUoUftasoEDeKMFfTM34MCbW2CA0nMg==","signatures":[{"sig":"MEYCIQChfSkyFVipMBlw8xeuSbmZz8ha8+Hr9waI1II4D9OHBAIhAP7YTugg1HXZvajpaG1cNTwa3sFl1So1bKgScB+TpDsI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIF/AN/BdQZeoFGhqoDq9IGauRmI4mAWCM8qrKow4SuA4AiBATdEx12MfsdT/511NL9SQcuWj0UxEOYiYxH0wrfkP3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":966089},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"9ef451689a3a8813b9cfd41d404fdff970a60544","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","dependencies":{"@vuepic/vue-datepicker":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.43","sass":"^1.105.0","vite":"^8.3.1","jsdom":"^29.1.1","vitest":"^5.0.2","typescript":"^7.0.2","vue-router":"^5.3.1","tailwindcss":"^4.3.3","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.5.1","vite-plugin-dts":"^5.1.1","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-vue":"^6.0.9","@vue/language-core":"^3.3.11","@typescript/typescript6":"^6.0.2"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.38.0_1790694254181_0.334012587656934","host":"s3://npm-registry-packages-npm-production"}},"1.40.0":{"name":"mgv-backoffice","version":"1.40.0","_id":"mgv-backoffice@1.40.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"367114fbdf35c20d9bf101f86e57f991d554bc90","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.40.0.tgz","fileCount":239,"integrity":"sha512-S8a6SE3cmMA4/H0soWoWRYdSJjjRpUq2TpODqk7YpgTTVytdPkGpJEb15yRzwUDJCC5NNI87FhZ/thKlzaN30g==","signatures":[{"sig":"MEQCICMuXtfYK0Uv3vUk7SFDmEbxP7+A9U/BFe6ZX8nOBepAAiAw1Mz4Gz3gGsRQ5W/k7UoPe/MtP93l3P0MJjbAUlDxKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDWEryERsq3Z00CVq3ZBHGHcsBoApWcZ78WuNh5Ngn9HAiAZGGTF8HQLo8apMU22QpqvU63nVS+oNxMOpNFZPH/U/w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1005389},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"9ef451689a3a8813b9cfd41d404fdff970a60544","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","dependencies":{"@vuepic/vue-datepicker":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.43","sass":"^1.105.0","vite":"^8.3.1","jsdom":"^29.1.1","vitest":"^5.0.2","typescript":"^7.0.2","vue-router":"^5.3.1","tailwindcss":"^4.3.3","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.5.1","vite-plugin-dts":"^5.1.1","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-vue":"^6.0.9","@vue/language-core":"^3.3.11","@typescript/typescript6":"^6.0.2"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.40.0_1790696947058_0.4569021210516202","host":"s3://npm-registry-packages-npm-production"}},"1.41.0":{"name":"mgv-backoffice","version":"1.41.0","_id":"mgv-backoffice@1.41.0","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"dist":{"shasum":"b49f4917f205af9efc6624263199bd6b2037e515","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.41.0.tgz","fileCount":245,"integrity":"sha512-s3wkDe/SOdVLKuakqii+wE1RJ2veAnqFL4lpwL6KrqJR3cVzpOwaGKO07Ct2PHFzX3b4mcTTMXbd8ErWMsIZGQ==","signatures":[{"sig":"MEUCIQD/LRxWRRlgn9TefLQP01L4Z8syv6oXubHt3s8vzsgD3gIgW2baO08nMdlj57x/zYgTS1gmRIA3zDTIFbG209SMg9s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC+qo1Ob0Hnw2mpQZxjqqCILopakA/fIBgsfNMfRApw1QIgMTMF6NJQColqFylGtN9LQBv56jd1bE+KVcCZlEDkRCM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1022452},"main":"./dist/ui-lib.umd.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"9ef451689a3a8813b9cfd41d404fdff970a60544","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"_nodeVersion":"24.13.0","dependencies":{"@vuepic/vue-datepicker":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.43","sass":"^1.105.0","vite":"^8.3.1","jsdom":"^29.1.1","vitest":"^5.0.2","typescript":"^7.0.2","vue-router":"^5.3.1","tailwindcss":"^4.3.3","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.5.1","vite-plugin-dts":"^5.1.1","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-vue":"^6.0.9","@vue/language-core":"^3.3.11","@typescript/typescript6":"^6.0.2"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mgv-backoffice_1.41.0_1790699420770_0.3751157480602474","host":"s3://npm-registry-packages-npm-production"}},"1.42.0":{"_id":"mgv-backoffice@1.42.0","dist":{"shasum":"1b30a87bbd46e69a9fdf72a878d518fbc533a0e9","tarball":"https://registry.npmjs.org/mgv-backoffice/-/mgv-backoffice-1.42.0.tgz","fileCount":248,"integrity":"sha512-rExyeFamkwsq8phL0erriedeD8T0VFZGSKv0/rNxpNz9ivE4Md1pYRkLG1YjIFyOewxOAs65a4T+M+dYEcuJaw==","signatures":[{"sig":"MEQCIDjXx+AtkSktey/vR1OEqa19R7zQhQ9ISX5UlvXE6sTRAiAPmi6dzi/dI0BffinjTg44gAmMDkn/6WZbeXt2Gd4ZWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCMz78QHm6q6U/l4P2cdaXez7L68RGxNXhK4rWQvTDq7QIgTuqmqhc0hG5FDt/VZNREMkozFD24l81lZaRt64pphqQ="}],"unpackedSize":1031544},"main":"./dist/ui-lib.umd.cjs","name":"mgv-backoffice","type":"module","types":"./dist/index.d.ts","module":"./dist/ui-lib.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/ui-lib.js","require":"./dist/ui-lib.umd.cjs"},"./dist/style.css":"./dist/ui-lib.css","./tailwind.safelist":"./tailwind.safelist.js","./tailwind.safelist.css":"./tailwind.safelist.css"},"gitHead":"3b1972f02b9541cb5d39fa5d819211d04601bc67","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","prebuild":"npm run safelist","safelist":"node scripts/generate-safelist.mjs","test:watch":"vitest"},"version":"1.42.0","_npmUser":{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"},"_npmVersion":"11.6.2","description":"Shared Vue 3 UI component library","directories":{},"maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"_nodeVersion":"24.13.0","dependencies":{"@vuepic/vue-datepicker":"^14.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.43","sass":"^1.105.0","vite":"^8.3.1","jsdom":"^29.1.1","vitest":"^5.0.2","typescript":"^7.0.2","vue-router":"^5.3.1","tailwindcss":"^4.3.3","@heroicons/vue":"^2.2.0","@vue/test-utils":"^2.5.1","vite-plugin-dts":"^5.1.1","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-vue":"^6.0.9","@vue/language-core":"^3.3.11","@typescript/typescript6":"^6.0.2"},"peerDependencies":{"vue":"^3.5.0","vue-router":"^5.0.0","@heroicons/vue":"^2.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mgv-backoffice_1.42.0_1790746662476_0.33323018657311243"}}},"time":{"created":"2026-03-14T14:50:59.637Z","modified":"2026-09-30T05:37:42.794Z","1.0.0":"2026-03-14T14:50:59.795Z","1.0.1":"2026-03-14T15:06:15.086Z","1.0.2":"2026-03-14T15:11:53.552Z","1.0.3":"2026-03-14T15:27:57.639Z","1.0.4":"2026-03-14T15:30:30.091Z","1.0.6":"2026-03-23T11:08:23.911Z","1.0.7":"2026-03-23T11:27:17.022Z","1.0.8":"2026-03-23T11:37:20.138Z","1.0.9":"2026-03-26T09:04:00.806Z","1.0.10":"2026-03-26T09:25:31.274Z","1.0.12":"2026-03-26T09:33:48.980Z","1.0.13":"2026-03-26T09:54:19.319Z","1.2.0":"2026-05-18T05:33:46.080Z","1.3.0":"2026-05-20T05:17:33.810Z","1.4.0":"2026-05-21T04:47:01.489Z","1.6.0":"2026-05-30T14:39:16.181Z","1.8.0":"2026-05-30T14:56:38.794Z","1.9.0":"2026-05-30T15:13:44.586Z","1.11.0":"2026-06-03T05:02:36.254Z","1.13.0":"2026-06-05T05:04:14.467Z","1.16.0":"2026-06-05T14:43:26.554Z","1.17.0":"2026-06-09T12:58:15.382Z","1.18.0":"2026-06-12T04:57:00.575Z","1.19.0":"2026-06-24T14:23:06.177Z","1.20.0":"2026-06-28T10:19:52.588Z","1.21.0":"2026-06-30T18:14:19.459Z","1.22.0":"2026-07-11T16:55:47.810Z","1.23.0":"2026-07-12T10:20:48.676Z","1.24.0":"2026-07-21T05:17:29.094Z","1.25.0":"2026-07-21T05:28:32.292Z","1.27.0":"2026-07-22T15:17:50.560Z","1.28.0":"2026-07-22T15:30:46.743Z","1.29.0":"2026-07-22T15:40:40.194Z","1.30.0":"2026-07-23T05:01:41.994Z","1.31.0":"2026-07-23T05:36:10.084Z","1.32.0":"2026-07-24T15:10:48.913Z","1.33.0":"2026-07-24T16:48:30.373Z","1.34.0":"2026-08-29T14:21:18.229Z","1.35.0":"2026-08-29T14:49:10.586Z","1.36.0":"2026-08-30T08:09:32.034Z","1.36.1":"2026-09-08T17:20:54.775Z","1.36.2":"2026-09-09T05:46:47.370Z","1.36.3":"2026-09-27T08:45:59.467Z","1.37.0":"2026-09-27T09:23:29.849Z","1.38.0":"2026-09-29T15:04:14.379Z","1.40.0":"2026-09-29T15:49:07.162Z","1.41.0":"2026-09-29T16:30:20.862Z","1.42.0":"2026-09-30T05:37:42.575Z"},"description":"Shared Vue 3 UI component library","maintainers":[{"name":"mixaverros88","email":"mixalisverros@hotmail.gr"}],"readme":"# mgv-backoffice\r\n\r\nShared Vue 3 UI component library built with TypeScript and Tailwind CSS.\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install mgv-backoffice\r\n```\r\n\r\n### Peer Dependencies\r\n\r\nThese must be installed in your project:\r\n\r\n```bash\r\nnpm install vue@^3.5.0 vue-router@^5.0.0 @heroicons/vue@^2.0.0\r\n```\r\n\r\n> `vue-router` 5.x is required (peer range `^5.0.0`) — it's what the library is\r\n> developed and tested against. Upgrade from Router 4 before installing this library.\r\n\r\n### Import Styles\r\n\r\nInclude the library's stylesheet in your app entry point:\r\n\r\n```ts\r\nimport 'mgv-backoffice/dist/style.css'\r\n```\r\n\r\n### Tailwind Safelist\r\n\r\nIf your project uses Tailwind, import the safelist so dynamic classes used by this library are generated correctly:\r\n\r\n```js\r\n// In your Tailwind config\r\nimport safelist from 'mgv-backoffice/tailwind.safelist'\r\n```\r\n\r\nOr include the pre-built CSS safelist:\r\n\r\n```css\r\n@import 'mgv-backoffice/tailwind.safelist.css';\r\n```\r\n\r\n> Maintainers: `tailwind.safelist.js` is the single source of truth.\r\n> `tailwind.safelist.css` is generated from it via `npm run safelist`\r\n> (runs automatically before `npm run build`) — don't edit it by hand.\r\n\r\n---\r\n\r\n## Components\r\n\r\n### BaseAlert\r\n\r\nInline notice panel with color-coded variants (error / warning / success /\r\ninfo), theme-aware via the shared `isDark` ref. The optional default slot\r\nrenders body content under the title, and `compact` gives a slim text-xs\r\nvariant for in-form warnings.\r\n\r\n**Props:**\r\n\r\n| Prop      | Type        | Default            | Description              |\r\n| --------- | ----------- | ------------------ | ------------------------ |\r\n| `title`   | `String`    | `''`               | Bold headline (optional when the slot carries the message). |\r\n| `color`   | `AlertEnum` | `AlertEnum.ERROR`  | Alert color variant.     |\r\n| `compact` | `Boolean`   | `false`            | Slim variant: text-xs, smaller icon/padding. |\r\n\r\n**Slots:** default — body content rendered under the title.\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <BaseAlert title=\"Operation successful\" :color=\"AlertEnum.SUCCESS\" />\r\n  <BaseAlert title=\"Proxying is active.\" :color=\"AlertEnum.WARNING\">\r\n    <p class=\"mt-0.5 text-xs opacity-90\">The canned response below is ignored.</p>\r\n  </BaseAlert>\r\n  <BaseAlert compact :color=\"AlertEnum.WARNING\">\r\n    Chunked dribble is ignored while Fault Simulation is active.\r\n  </BaseAlert>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BaseAlert, AlertEnum } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseBadge\r\n\r\nColored status badge/pill. Renders nothing when the default slot is empty;\r\nan omitted or unrecognized `color` falls back to the red palette.\r\n\r\n**Props:**\r\n\r\n| Prop    | Type     | Default | Description                       |\r\n| ------- | -------- | ------- | --------------------------------- |\r\n| `color` | `String` | —       | Color variant (use `ColorsEnums`) |\r\n\r\n**Slots:** `default` — badge label content.\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <BaseBadge :color=\"ColorsEnums.GREEN\">Active</BaseBadge>\r\n  <BaseBadge :color=\"ColorsEnums.RED\">Inactive</BaseBadge>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BaseBadge, ColorsEnums } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseBreadcrumb\r\n\r\nBreadcrumb navigation. Provide items manually or pass a URL path for\r\nauto-generation; with neither prop it auto-generates from\r\n`window.location.pathname`. A \"Home\" crumb linking to `/` is always prepended.\r\n\r\n**Props:**\r\n\r\n| Prop    | Type            | Default     | Description                                |\r\n| ------- | --------------- | ----------- | ------------------------------------------ |\r\n| `items` | `BreadCrumb[]`  | `undefined` | Manual breadcrumb entries                  |\r\n| `path`  | `String`        | `undefined` | URL path for auto-generated breadcrumbs    |\r\n\r\n**BreadCrumb type:**\r\n\r\n```ts\r\ninterface BreadCrumb {\r\n  name: string\r\n  url: string\r\n}\r\n```\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <!-- Manual -->\r\n  <BaseBreadcrumb :items=\"[\r\n    { name: 'Home', url: '/' },\r\n    { name: 'Users', url: '/users' },\r\n    { name: 'Profile', url: '/users/1' }\r\n  ]\" />\r\n\r\n  <!-- Auto-generated from path -->\r\n  <BaseBreadcrumb path=\"/users/settings/profile\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BaseBreadcrumb } from 'mgv-backoffice'\r\nimport type { BreadCrumb } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseButton\r\n\r\nButton with color, size, loading state, and Vue Router integration.\r\n\r\n**Props:**\r\n\r\n| Prop          | Type                                | Default               | Description                          |\r\n| ------------- | ----------------------------------- | --------------------- | ------------------------------------ |\r\n| `description` | `String`                            | **required**          | Button label text                    |\r\n| `color`       | `String`                            | `BaseButtonEnum.GREEN` | Color variant (`BLUE`/`WHITE`/`DARK`/`GREEN`/`EMERALD`/`RED`/`YELLOW`/`PURPLE`/`SKY`/`GRAY`/`AMBER`) |\r\n| `outline`     | `Boolean`                           | `false`               | Outlined/secondary style — transparent fill, coloured text + border, tinted hover (theme-aware) |\r\n| `ghost`       | `Boolean`                           | `false`               | Ghost/borderless style — no border or fill, coloured text + tinted hover (theme-aware). For compact toolbar/action buttons |\r\n| `to`          | `String`                            | —                     | Vue Router path (renders `<router-link>`) |\r\n| `type`        | `'button' \\| 'submit' \\| 'reset'`  | `'button'`            | HTML button type                     |\r\n| `iconLeft`    | `Boolean`                           | `false`               | Render the slot icon before the label |\r\n| `isRounded`   | `Boolean`                           | —                     | Fully rounded corners                |\r\n| `isDisable`   | `Boolean`                           | —                     | Disabled state                       |\r\n| `size`        | `String`                            | —                     | Size variant (use `BaseButtonSizeEnum`) |\r\n| `isLoading`   | `Boolean`                           | —                     | Show loading spinner                 |\r\n\r\n**Slots:** `default`\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <BaseButton description=\"Submit\" :color=\"BaseButtonEnum.GREEN\" type=\"submit\" />\r\n  <BaseButton description=\"Go to Users\" :to=\"'/users'\" />\r\n  <BaseButton description=\"Saving...\" :isLoading=\"true\" :isDisable=\"true\" />\r\n  <BaseButton\r\n    description=\"Delete\"\r\n    :color=\"BaseButtonEnum.RED\"\r\n    :size=\"BaseButtonSizeEnum.SMALL\"\r\n  />\r\n  <!-- Outlined / secondary -->\r\n  <BaseButton description=\"Import\" :color=\"BaseButtonEnum.EMERALD\" outline iconLeft>\r\n    <ArrowUpTrayIcon class=\"w-4 h-4 mr-1.5\" />\r\n  </BaseButton>\r\n  <!-- Ghost / borderless toolbar action -->\r\n  <BaseButton description=\"Logs\" :color=\"BaseButtonEnum.SKY\" ghost iconLeft :size=\"BaseButtonSizeEnum.SMALL\">\r\n    <ClipboardDocumentListIcon class=\"w-4 h-4 mr-1.5\" />\r\n  </BaseButton>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BaseButton, BaseButtonEnum, BaseButtonSizeEnum } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseLine\r\n\r\nHorizontal divider with style variants.\r\n\r\n**Props:**\r\n\r\n| Prop   | Type     | Default         | Description       |\r\n| ------ | -------- | --------------- | ----------------- |\r\n| `mode` | `String` | `LineEnum.BASE` | Divider style     |\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <BaseLine />\r\n  <BaseLine :mode=\"LineEnum.SQUARE\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BaseLine, LineEnum } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseLogo\r\n\r\nSVG brand logo component.\r\n\r\n**Props:**\r\n\r\n| Prop   | Type     | Default                | Description  |\r\n| ------ | -------- | ---------------------- | ------------ |\r\n| `size` | `String` | `BaseLogoEnum.MEDIUM`  | Logo size    |\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <BaseLogo :size=\"BaseLogoEnum.LARGE\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BaseLogo, BaseLogoEnum } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseModal\r\n\r\n> ⚠️ **Deprecated.** Prefer [`BaseConfirmModal`](#baseconfirmmodal) for confirm/cancel\r\n> flows or [`BaseModalShell`](#basemodalshell) for custom dialogs — they support dark\r\n> mode, teleport to `<body>`, and slot-based composition. Kept for backward\r\n> compatibility.\r\n\r\nConfirmation dialog with support for delete and success modes. `DELETE` mode renders\r\nthe confirm/cancel pair; any other mode renders the title, optional `description`,\r\nthe default slot, and a single OK button that emits `closeModal`.\r\n\r\n**Props:**\r\n\r\n| Prop          | Type     | Default     | Description                         |\r\n| ------------- | -------- | ----------- |-------------------------------------|\r\n| `title`       | `String` | **required**| Modal heading                       |\r\n| `description` | `String` | —           | Body text                           |\r\n| `to`          | `String` | `\"/\"`       | Unused — declared for backward compatibility only; confirm just emits `confirmModal`, no navigation happens |\r\n| `mode`        | `String` | `'SUCCESS'` | Modal variant (use `BaseModalEnum`) |\r\n\r\n**Events:**\r\n\r\n| Event          | Description                     |\r\n| -------------- | ------------------------------- |\r\n| `closeModal`   | Emitted when modal is dismissed (cancel/OK button, backdrop click, or Escape) |\r\n| `confirmModal` | Emitted on confirm action       |\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <BaseModal\r\n    title=\"Delete this item?\"\r\n    description=\"This action cannot be undone.\"\r\n    :mode=\"BaseModalEnum.DELETE\"\r\n    @closeModal=\"showModal = false\"\r\n    @confirmModal=\"handleDelete\"\r\n  />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref } from 'vue'\r\nimport { BaseModal, BaseModalEnum } from 'mgv-backoffice'\r\n\r\nconst showModal = ref(true)\r\nconst handleDelete = () => { /* ... */ }\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseRow\r\n\r\nCard-like content container with border and shadow.\r\n\r\n**Props:**\r\n\r\n| Prop      | Type     | Default   | Description            |\r\n| --------- | -------- | --------- | ---------------------- |\r\n| `bgColor` | `String` | `\"bg-white\"` | Background color — a full Tailwind class (e.g. `\"bg-slate-50\"`), not a bare color name |\r\n\r\n**Slots:** `default` — row content.\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <BaseRow>\r\n    <p>Card content goes here</p>\r\n  </BaseRow>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BaseRow } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseSpinner\r\n\r\nAnimated loading spinner — a neutral ring with a coloured leading arc.\r\n\r\n**Props:**\r\n\r\n| Prop    | Type                                                                       | Default  | Description                                                  |\r\n|---------|----------------------------------------------------------------------------|----------|-------------------------------------------------------------|\r\n| `size`  | `'sm' \\| 'md' \\| 'lg' \\| 'xl'`                                              | `'sm'`   | Diameter + ring thickness — 16 / 24 / 32 / 48px.            |\r\n| `color` | `'blue' \\| 'emerald' \\| 'sky' \\| 'indigo' \\| 'teal' \\| 'purple' \\| 'red' \\| 'amber'` | `'emerald'` | Colour of the spinning arc. The track stays neutral gray.   |\r\n\r\nWith no props it renders a 16px emerald spinner. For page loaders use `size=\"xl\"` centered, e.g. `<div class=\"flex justify-center py-12\"><BaseSpinner size=\"xl\" /></div>`.\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <!-- legacy default -->\r\n  <BaseSpinner />\r\n  <!-- larger, themed -->\r\n  <BaseSpinner size=\"lg\" color=\"emerald\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BaseSpinner } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseToast\r\n\r\nToast notification with positioning and auto-dismiss.\r\n\r\n**Props:**\r\n\r\n| Prop           | Type             | Default   | Description                                |\r\n| -------------- | ---------------- | --------- | ------------------------------------------ |\r\n| `mode`         | `BaseToastEnum`  | **required** | Toast variant (SUCCESS, WARNING, ERROR) |\r\n| `description`  | `String`         | **required** | Message text                            |\r\n| `hasCloseIcon` | `Boolean`        | `true`    | Show close button                          |\r\n| `positioning`  | `String`         | `PositioningEnum.TOP_RIGHT` | Screen position (use `PositioningEnum`) |\r\n| `duration`     | `Number`         | `5000`    | Auto-dismiss delay in milliseconds         |\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <BaseToast\r\n    :mode=\"BaseToastEnum.SUCCESS\"\r\n    description=\"Changes saved successfully!\"\r\n    :positioning=\"PositioningEnum.TOP_RIGHT\"\r\n  />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BaseToast, BaseToastEnum, PositioningEnum } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### ColoredSquares\r\n\r\nColored square indicator with randomized pastel accent.\r\n\r\n**Props:**\r\n\r\n| Prop    | Type     | Default | Description                       |\r\n| ------- | -------- | ------- | --------------------------------- |\r\n| `color` | `String` | —       | Color variant (use `ColorsEnums`) |\r\n\r\n**Slots:** `default` — label content.\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <ColoredSquares :color=\"ColorsEnums.BLUE\">Category A</ColoredSquares>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ColoredSquares, ColorsEnums } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### EarningsCard\r\n\r\nEarnings summary card with formatted currency display. Supports a signed P&L\r\nmode that renders a red loss theme (and a downward trend glyph) for negative\r\namounts.\r\n\r\n**Props:**\r\n\r\n| Prop       | Type     | Default                 | Description          |\r\n| ---------- | -------- |-------------------------|----------------------|\r\n| `title`    | `String` | `'TOTAL EARNINGS'`      | Card heading         |\r\n| `amount`   | `Number` | `0`                     | Monetary value (a stringified number is coerced) |\r\n| `subtitle` | `String` | `'Lifetime commission'` | Subheading text      |\r\n| `badge`    | `String` | `''`                    | Optional badge label |\r\n| `currency` | `String` | `'$'`                   | Currency symbol      |\r\n| `decimals` | `Number` | `2`                     | Fraction digits shown for the amount |\r\n| `accent`   | `'orange' \\| 'emerald' \\| 'red'` | `'orange'` | Card theme. `emerald` tints it green; `red` is the loss theme. |\r\n| `signed`   | `Boolean` | `false`                | Treat `amount` as a signed P&L figure: a negative value automatically switches to the `red` loss theme and flips the trend glyph to point **down**; a non-negative value keeps the chosen `accent` and the upward glyph. |\r\n| `compact`  | `Boolean` | `false`                | Dense variant for dashboards that tile many cards on one row: tighter padding, smaller type, trend glyph shrunk into the top-right corner. Don't combine with `badge` — both occupy the top-right corner. |\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <!-- Always-positive total: original behaviour. -->\r\n  <EarningsCard\r\n    title=\"Monthly Revenue\"\r\n    :amount=\"12500\"\r\n    subtitle=\"April 2026\"\r\n    currency=\"€\"\r\n  />\r\n\r\n  <!-- Signed P&L: renders red + a down arrow when the amount is negative. -->\r\n  <EarningsCard\r\n    title=\"TOTAL P&L\"\r\n    :amount=\"-128.4\"\r\n    subtitle=\"Realised + unrealised\"\r\n    accent=\"emerald\"\r\n    signed\r\n  />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { EarningsCard } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### EuroAmount\r\n\r\nFormatted euro currency display with conditional color coding.\r\n\r\n**Props:**\r\n\r\n| Prop           | Type      | Default | Description                                     |\r\n| -------------- | --------- | ------- |-------------------------------------------------|\r\n| `amount`       | `Number`  | —       | Value to display                                |\r\n| `beforeAmount` | `Number`  | `null`  | Previous value: red if `amount < beforeAmount`, green if `amount >= beforeAmount`. When omitted, a non-negative amount renders neutral (never green); a negative amount is always red. |\r\n| `showCurrency` | `Boolean` | `true`  | Show euro symbol                                |\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <!-- Shows green (amount > beforeAmount) -->\r\n  <EuroAmount :amount=\"1500\" :beforeAmount=\"1200\" />\r\n\r\n  <!-- Shows red (negative) -->\r\n  <EuroAmount :amount=\"-300\" />\r\n\r\n  <!-- Without currency symbol -->\r\n  <EuroAmount :amount=\"800\" :showCurrency=\"false\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { EuroAmount } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### Pagination\r\n\r\nPage navigation with smart ellipsis for large page counts.\r\n\r\n**Props:**\r\n\r\n| Prop           | Type     | Default | Description             |\r\n| -------------- | -------- | ------- | ----------------------- |\r\n| `totalItems`   | `Number` | **required** | Total number of items   |\r\n| `itemsPerPage` | `Number` | `20`    | Items shown per page    |\r\n\r\n**Events:**\r\n\r\n| Event          | Payload  | Description                      |\r\n| -------------- | -------- |----------------------------------|\r\n| `page-changed` | `Number` | Emitted with the new page number |\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <Pagination\r\n    :totalItems=\"200\"\r\n    :itemsPerPage=\"10\"\r\n    @page-changed=\"onPageChange\"\r\n  />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { Pagination } from 'mgv-backoffice'\r\n\r\nconst onPageChange = (page: number) => {\r\n  console.log('Page:', page)\r\n}\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### TrendArrow\r\n\r\nUp/down trend indicator displayed as a colored badge.\r\n\r\n**Props:**\r\n\r\n| Prop     | Type     | Default | Description                                          |\r\n| -------- | -------- | ------- |------------------------------------------------------|\r\n| `number` | `Number` | —       | Positive = green arrow up, negative = red arrow down, zero = neutral gray dash |\r\n| `icon`   | `String` | —       | Optional suffix appended after the number (e.g. `\"%\"`) |\r\n\r\n**Example:**\r\n\r\n```vue\r\n<template>\r\n  <TrendArrow :number=\"12.5\" />   <!-- Green up arrow -->\r\n  <TrendArrow :number=\"-3.2\" />   <!-- Red down arrow -->\r\n  <TrendArrow :number=\"0\" />      <!-- Neutral gray dash -->\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { TrendArrow } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n## Enums\r\n\r\nAll enums are importable directly from the package:\r\n\r\n```ts\r\nimport {\r\n  AlertEnum,\r\n  BaseBadgeEnum,\r\n  BaseButtonEnum,\r\n  BaseButtonSizeEnum,\r\n  BaseLogoEnum,\r\n  BaseModalEnum,\r\n  BaseToastEnum,\r\n  ColorsEnums,\r\n  LineEnum,\r\n  PositioningEnum\r\n} from 'mgv-backoffice'\r\n```\r\n\r\n| Enum                 | Values                                                        |\r\n| -------------------- |---------------------------------------------------------------|\r\n| `AlertEnum`          | `WARNING`, `ERROR`, `SUCCESS`, `INFO`                         |\r\n| `BaseBadgeEnum`      | `WIN`, `LOSE`                                                 |\r\n| `BaseButtonEnum`     | `RED`, `BLUE`, `WHITE`, `DARK`, `GREEN`, `EMERALD`, `YELLOW`, `PURPLE`, `SKY`, `GRAY`, `AMBER` |\r\n| `BaseButtonSizeEnum` | `EXTRA_SMALL`, `SMALL`, `BASE`, `LARGE`, `EXTRA_LARGE`        |\r\n| `BaseLogoEnum`       | `SMALL`, `MEDIUM`, `LARGE` (`BaseLoginEnum` is a deprecated alias) |\r\n| `BaseModalEnum`      | `DELETE`, `SUCCESS`                                           |\r\n| `BaseToastEnum`      | `SUCCESS`, `WARNING`, `ERROR`                                 |\r\n| `ColorsEnums`        | `NONE`, `RED`, `YELLOW`, `BLACK`, `GRAY`, `GREEN`, `BLUE`     |\r\n| `LineEnum`           | `BASE`, `BASE_SHORTER`, `SQUARE`                              |\r\n| `PositioningEnum`    | `TOP_LEFT`, `TOP_RIGHT`, `BOTTOM_LEFT`, `BOTTOM_RIGHT`        |\r\n\r\n---\r\n\r\n## Types\r\n\r\n```ts\r\nimport type { BreadCrumb, DropdownOption, PnL, PnLInputs } from 'mgv-backoffice'\r\n```\r\n\r\n| Type             | Shape                                  |\r\n| ---------------- | -------------------------------------- |\r\n| `BreadCrumb`     | `{ name: string; url: string }`        |\r\n| `DropdownOption` | `{ value: string \\| number; label: string; title?: string; disabled?: boolean }` |\r\n| `PnLInputs`      | `{ buyPrice; lastPrice; filledQty }` (each `number \\| string \\| null \\| undefined`) |\r\n| `PnL`            | `{ pnlUsd: number \\| null; pnlPct: number \\| null }` |\r\n\r\nThe other exported types — `NavItem`, `NavSection`, `EntityPickerItem`,\r\n`LoginCredentials`, `NotificationItem`, `SegmentedOption`, `TableColumn`,\r\n`SpecField`, `SpecFieldType`, `SpecFieldValue`, `StatBreakdownItem`,\r\n`PillPickerItem`, `DistributionBar`, `CredentialsView`, `CredentialsUpdate` —\r\nare documented in their component's section.\r\n\r\n---\r\n\r\n## Utilities\r\n\r\n```ts\r\nimport { getBaseColor, getBaseColorOf } from 'mgv-backoffice'\r\n```\r\n\r\n| Function         | Signature                          | Returns                             |\r\n| ---------------- | ---------------------------------- | ----------------------------------- |\r\n| `getBaseColor`   | `(c: AlertEnum) => string`         | Tailwind color name for alert type  |\r\n| `getBaseColorOf` | `(c: ColorsEnums) => string`       | Tailwind color name for color enum  |\r\n\r\n### HTTP colours\r\n\r\n```ts\r\nimport {\r\n  methodBadgeSolid,\r\n  methodBadgeBright,\r\n  methodBadgeTinted,\r\n  statusBadgeSolid,\r\n  statusBadgeTinted,\r\n  statusBadgeSoft,\r\n} from 'mgv-backoffice'\r\n```\r\n\r\nTailwind class helpers for HTTP method and status code badges. `Solid` variants\r\nreturn saturated `bg-*-600` classes for use on neutral surfaces; `Bright` /\r\n`Tinted` variants return softer combinations suitable for cards. `statusBadgeTinted`\r\ntakes `(status, isDark)` to adapt between themes.\r\n\r\n`methodBadgeTinted(method, isDark)` gives each method its own hue on a soft\r\ntinted surface (`bg-*-500/15` dark / `bg-*-100` light; GET blue, POST emerald,\r\nPUT amber, DELETE red, PATCH purple, HEAD sky) — the card-chip palette used by\r\nWireMate's mock/stub cards. `statusBadgeSoft(status, isDark)` is its status\r\ncompanion keyed by status class (emerald 2xx / sky 3xx / amber 4xx / red 5xx).\r\n\r\n### Key/value row validators\r\n\r\n```ts\r\nimport { rowKeyMissing, rowValueMissing } from 'mgv-backoffice'\r\nimport type { KeyValueRowLike } from 'mgv-backoffice'\r\n```\r\n\r\n| Function          | Signature                                                              | Returns |\r\n| ----------------- | ---------------------------------------------------------------------- | ------- |\r\n| `rowValueMissing` | `(row: { key?, value?, matcherType? }) => boolean`                     | `true` when the row has a key but no value. |\r\n| `rowKeyMissing`   | `(row: { key?, value?, matcherType? }) => boolean`                     | `true` when the row has a value but no key. |\r\n\r\nConsistency checks for dynamic key/value grids (header lists, query params,\r\nmetadata rows). Rows with `matcherType: 'absent'` are exempt — an absent\r\nmatcher intentionally carries no value.\r\n\r\n### Input validators\r\n\r\n```ts\r\nimport { isValidAbsoluteUrl, isValidJson, isValidXml, isValidBase64 } from 'mgv-backoffice'\r\n```\r\n\r\nPure, dependency-free form-input validators. The payload validators treat\r\nempty/whitespace-only input as **valid** — required-ness is a separate rule\r\nfrom well-formedness; `isValidAbsoluteUrl` validates a value that must exist,\r\nso empty is invalid there.\r\n\r\n| Function             | Signature                    | Returns |\r\n| -------------------- | ---------------------------- | ------- |\r\n| `isValidAbsoluteUrl` | `(value: string) => boolean` | `true` for an absolute `http://` / `https://` URL (other schemes rejected). |\r\n| `isValidJson`        | `(str: string) => boolean`   | `true` when empty or parseable as JSON. |\r\n| `isValidXml`         | `(str: string) => boolean`   | `true` when empty or well-formed XML (DOMParser `<parsererror>` check; browser-only). |\r\n| `isValidBase64`      | `(str: string) => boolean`   | `true` when empty or well-formed base64 (whitespace stripped, length/alphabet checked, then `atob` as the final authority). |\r\n\r\n### HTML sanitizer\r\n\r\n```ts\r\nimport { sanitizeHtml, isSafeHref } from 'mgv-backoffice'\r\n```\r\n\r\n| Function       | Signature                                       | Returns |\r\n| -------------- | ----------------------------------------------- | ------- |\r\n| `sanitizeHtml` | `(raw: string \\| undefined \\| null) => string`  | Allow-list–sanitised HTML safe for `v-html`. |\r\n| `isSafeHref`   | `(value: string) => boolean`                    | `true` if the href uses a safe scheme (http/https/mailto/tel, root-relative, or anchor) or is empty/whitespace-only. |\r\n\r\nAllow-list sanitizer for strings bound into `v-html`. Keeps a small set of\r\nformatting tags (`a`, `b`/`strong`, `i`/`em`, `code`, `pre`, `p`, `ul`/`ol`/`li`,\r\n`span`, `div`, `br`), strips all other elements (unwrapping to text, or dropping\r\ncontent entirely for `script`/`style`/`iframe`/etc.), removes every attribute\r\nexcept `href`/`title` on anchors, keeps only allow-listed hrefs (http/https/\r\nmailto/tel, root-relative `/`, anchors `#`, or empty — every other scheme such\r\nas `javascript:`, `data:`, `ftp:` is stripped), and hardens surviving links with\r\n`rel=\"noopener noreferrer\" target=\"_blank\"`. Browser-only (uses `DOMParser`).\r\n\r\n```ts\r\nsanitizeHtml('<p>Hi<script>alert(1)<\\/script></p>') // '<p>Hi</p>'\r\n```\r\n\r\n### Display formatters\r\n\r\n```ts\r\nimport {\r\n  fmtNumber,\r\n  fmtDate,\r\n  fmtDateTime,\r\n  fmtDateShort,\r\n  fmtPrice,\r\n  fmtPct,\r\n  fmtUsd,\r\n  // …plus fmtDateTimeMs, fmtCalendarDate, fmtCalendarDateTime,\r\n  // fmtMsAsSeconds, fmtBytes, fmtDuration, formatJson, stringifyValue\r\n} from 'mgv-backoffice'\r\n```\r\n\r\nLocale-aware, pure, dependency-free formatters for tables, logs and charts.\r\n`fmtNumber`, `fmtDate`, `fmtCalendarDate`, `fmtCalendarDateTime` and\r\n`fmtDuration` handle missing/non-finite input gracefully (rendering an\r\nem-dash) so raw API values can be passed without pre-sanitising; the\r\nepoch/numeric formatters (`fmtDateTime`, `fmtDateShort`, `fmtDateTimeMs`,\r\n`fmtPrice`, `fmtPct`, `fmtUsd`) expect valid input and will render\r\n`\"Invalid Date\"` / `\"NaN\"` otherwise.\r\n\r\n| Function       | Signature                                                       | Returns |\r\n| -------------- | --------------------------------------------------------------- | ------- |\r\n| `fmtNumber`    | `(n: number \\| string \\| null \\| undefined, digits = 4) => string` | Fixed-fraction number; em-dash for null/undefined/non-finite. Accepts numeric strings. |\r\n| `fmtDate`      | `(s: string \\| number \\| null \\| undefined) => string`          | Locale date-time from ISO string or epoch; em-dash on empty, raw value on parse failure. |\r\n| `fmtDateTime`  | `(ms: number) => string`                                        | Compact `\"Mon D, HH:MM\"` label from epoch-millis (chart axes/tooltips). |\r\n| `fmtDateTimeMs`| `(s: string \\| number) => string`                               | Full 24-hour locale date-time WITH the millisecond fraction — for dense feeds where same-second rows must stay distinguishable. |\r\n| `fmtDateShort` | `(ms: number) => string`                                        | Short `\"Mon D\"` calendar label from epoch-millis. |\r\n| `fmtCalendarDate` | `(s: string \\| number \\| null \\| undefined) => string`       | `\"Mon D, YYYY\"` en-US calendar label; em-dash on empty, raw value on parse failure. |\r\n| `fmtCalendarDateTime` | `(s: string \\| number \\| null \\| undefined) => string`   | `\"Mon D, YYYY, HH:MM\"` en-US calendar label with time of day. |\r\n| `fmtMsAsSeconds` | `(ms: number \\| null \\| undefined) => string`                 | `\"= 1.50 s\"` magnitude hint for millisecond inputs (3 decimals below 1 s); `''` for non-positive input. |\r\n| `fmtBytes`     | `(bytes: number \\| null \\| undefined) => string`                | `\"512 B\"` / `\"1.5 KB\"` / `\"2.0 MB\"`; `''` for zero/falsy input. |\r\n| `fmtDuration`  | `(ms: number \\| null \\| undefined, maxUnits = 2) => string`     | Compact day/hour/minute duration, e.g. `\"3d 5h\"` / `\"5h 12m\"` / `\"12m\"`. Zero-value leading units are dropped; `maxUnits` caps how many units render. Em-dash for null/undefined/non-finite. |\r\n| `fmtPrice`     | `(n: number) => string`                                         | Price with precision that scales to magnitude (more decimals for sub-cent values). |\r\n| `fmtPct`       | `(n: number, digits = 2) => string`                             | Percentage with explicit sign, e.g. `\"+2.50%\"`. |\r\n| `fmtUsd`       | `(v: number) => string`                                         | Signed USD amount with leading sign, e.g. `\"+$5.00\"`. |\r\n| `formatJson`   | `(content: string) => string`                                   | Pretty-prints parseable JSON with 2-space indentation; returns anything else verbatim. |\r\n| `stringifyValue` | `(value: unknown) => string`                                  | Display string for an unknown value: strings pass through, null/undefined → `''`, everything else JSON-serialized (`String()` fallback). |\r\n\r\n### Spec-form helpers\r\n\r\n```ts\r\nimport { buildSpecParams, firstInvalidNumericSpec } from 'mgv-backoffice'\r\n```\r\n\r\nValue-map helpers for spec-driven forms (the state behind `BaseSpecFields`).\r\nA spec whose `default` is `null` is treated as OPTIONAL — blank means \"knob\r\ndisabled\" and passes validation.\r\n\r\n| Function                 | Signature | Returns |\r\n| ------------------------ | --------- | ------- |\r\n| `buildSpecParams`        | `(specs: SpecField[] \\| undefined, existing: Record<string, SpecFieldValue>) => Record<string, SpecFieldValue>` | Value map seeded from each spec's `default`, keeping non-null overlapping values the caller already has (an existing `null` is re-seeded from the spec's `default`). |\r\n| `firstInvalidNumericSpec`| `(specs: SpecField[] \\| undefined, params: Record<string, SpecFieldValue>) => string \\| null` | Label of the first blank / NaN numeric field, or `null` when all numerics are valid. |\r\n\r\n### Profit & loss\r\n\r\n```ts\r\nimport { computePnL } from 'mgv-backoffice'\r\nimport type { PnL, PnLInputs } from 'mgv-backoffice'\r\n```\r\n\r\n| Function     | Signature                       | Returns |\r\n| ------------ | ------------------------------- | ------- |\r\n| `computePnL` | `(row: PnLInputs) => PnL`       | Unrealised mark-to-market PnL in absolute USD and percent. Returns `{ pnlUsd: null, pnlPct: null }` when any input is missing, non-finite, or `buyPrice <= 0` / `lastPrice <= 0`. |\r\n\r\n```ts\r\ninterface PnLInputs {\r\n  buyPrice: number | string | null | undefined\r\n  lastPrice: number | string | null | undefined\r\n  filledQty: number | string | null | undefined\r\n}\r\n\r\ninterface PnL {\r\n  pnlUsd: number | null\r\n  pnlPct: number | null\r\n}\r\n```\r\n\r\n```ts\r\ncomputePnL({ buyPrice: 100, lastPrice: 110, filledQty: 5 })\r\n// { pnlUsd: 50, pnlPct: 10 }\r\n```\r\n\r\n---\r\n\r\n## Layout & shells (Tier 2 — full backoffice chrome)\r\n\r\n### BaseAppLayout\r\n\r\nRoot layout: dark/light page background, skip link, `<main>`-with-inert wrapper.\r\nThe `<main>` content offset tracks the sidebar width automatically —\r\n`lg:ml-60` when expanded, `lg:ml-16` when collapsed (via `useSidebarCollapse()`) —\r\nand adds `pt-14 lg:pt-0` for the mobile top bar while the sidebar is shown.\r\n\r\n**Props:**\r\n\r\n| Prop | Type | Default | Description |\r\n| ---- | ---- | ------- | ----------- |\r\n| `showSidebar` | `Boolean` | `true` | Render the `sidebar` slot. Set false for full-bleed pages. |\r\n| `skipLinkLabel` | `String` | `'Skip to main content'` | Label for the accessibility skip link. |\r\n\r\n**Slots:** `sidebar`, `default` (page content).\r\n\r\n```vue\r\n<BaseAppLayout :show-sidebar=\"route.name !== 'presentation'\">\r\n  <template #sidebar><AppSidebar /></template>\r\n  <RouterView />\r\n</BaseAppLayout>\r\n```\r\n\r\n### BaseSidebar\r\n\r\nResponsive sidebar with desktop fixed-positioning and mobile off-canvas\r\nbehavior, focus management, optional theme toggle, a desktop collapse\r\ntoggle (icon-only rail), an optional notifications bell, and configurable\r\nnav sections.\r\n\r\n**Props:**\r\n\r\n| Prop | Type | Default | Description |\r\n| ---- | ---- | ------- | ----------- |\r\n| `sections` | `NavSection[]` | **required** | Grouped nav items. |\r\n| `homeRouteName` | `String` | `'home'` | Route name for the logo / \"go home\" click. |\r\n| `appName` | `String` | `''` | Optional app name in the footer. |\r\n| `version` | `String` | `''` | Optional version string in the footer. |\r\n| `showThemeToggle` | `Boolean` | `true` | Toggle the dark/light switch in the footer. |\r\n| `collapsible` | `Boolean` | `true` | Show the desktop collapse toggle that shrinks the sidebar to an icon-only rail. |\r\n| `showNotifications` | `Boolean` | `false` | Show the notifications bell (with unread badge) that toggles `BaseNotificationPanel`. |\r\n\r\n> **Collapse state** is shared via `useSidebarCollapse()` (and persisted to\r\n> localStorage) so `BaseAppLayout` can shrink the content offset from\r\n> `lg:ml-60` to `lg:ml-16` in step with the rail. Collapsing only affects\r\n> desktop (`lg+`); on mobile the sidebar stays a full off-canvas panel.\r\n\r\n> **Notifications:** set `:show-notifications=\"true\"` to render the bell,\r\n> then drop a [`BaseNotificationPanel`](#basenotificationpanel) in your app.\r\n> Both share state through `useNotifications()`, so the unread badge and the\r\n> panel stay in sync.\r\n\r\n**Slots:**\r\n\r\n| Slot     | Slot props | Description |\r\n| -------- | ---------- | ----------- |\r\n| `logo`   | `{ size }` | Brand logo. Receives a `size` hint (28px in mobile bar, 52px in expanded sidebar, 36px in the collapsed rail). |\r\n| `status` | —          | Footer status row (e.g. health indicator, sync state). |\r\n| `footer` | —          | Replaces the default `appName` + `v{version}` line. |\r\n\r\n**Types:**\r\n\r\n```ts\r\nimport type { NavItem, NavSection } from 'mgv-backoffice'\r\n\r\ninterface NavItem {\r\n  name: string       // Vue Router route name\r\n  label: string      // display text\r\n  icon: Component    // typically a Heroicon\r\n}\r\n\r\ninterface NavSection {\r\n  title: string\r\n  items: NavItem[]\r\n}\r\n```\r\n\r\n```vue\r\n<BaseSidebar :sections=\"navSections\" home-route-name=\"projects\" app-name=\"WireMate UI\" :version=\"appVersion\">\r\n  <template #logo=\"{ size }\"><WireMateLogo :size=\"size\" /></template>\r\n  <template #status>\r\n    <HealthIndicator />\r\n  </template>\r\n</BaseSidebar>\r\n```\r\n\r\n---\r\n\r\n### BaseSidebarUser\r\n\r\nSigned-in user block for the `BaseSidebar` `footer` slot: initials avatar,\r\nname and email (a link to the profile page when `to` is set) and a Logout\r\nbutton that emits `logout`.\r\n\r\n**Props:** `name` (required), `email`, `to` (profile route), `showLogout` (`true`),\r\n`logoutLabel` (`'Logout'`), `profileLabel` (`'View profile'`, tooltip).\r\n**Emits:** `logout`.\r\n\r\n```vue\r\n<BaseSidebar :sections=\"nav\">\r\n  <template #footer>\r\n    <BaseSidebarUser :name=\"me.username\" :email=\"me.email\" :to=\"{ name: 'Profile' }\" @logout=\"logOut\" />\r\n  </template>\r\n</BaseSidebar>\r\n```\r\n\r\n### BaseNotificationPanel\r\n\r\nLeft-anchored notification drawer (teleported to `<body>`, slides in from\r\nthe left, backdrop + Escape to close). Open/close state and the list live\r\nin `useNotifications()`, so the sidebar bell and the panel stay in sync.\r\n\r\nEnable the bell on the sidebar with `:show-notifications=\"true\"`, drop one\r\n`<BaseNotificationPanel />` anywhere in your app, and feed it data via the\r\ncomposable.\r\n\r\n**Props:**\r\n\r\n| Prop              | Type      | Default                        | Description |\r\n| ----------------- | --------- | ------------------------------ | ----------- |\r\n| `title`           | `String`  | `'Notifications'`              | Panel heading. |\r\n| `emptyText`       | `String`  | `'You have no notifications.'` | Shown when the list is empty. |\r\n| `showMarkAllRead` | `Boolean` | `true`                         | Render the \"Mark all as read\" action when there are unread items. |\r\n\r\n**Emits:** `select` (the clicked notification's `id`; the row is also marked read).\r\n\r\n```vue\r\n<script setup lang=\"ts\">\r\nimport { BaseNotificationPanel, useNotifications } from 'mgv-backoffice'\r\nconst { setNotifications } = useNotifications()\r\nsetNotifications([\r\n  { id: 1, title: 'New comment', message: 'Alice replied to your post', time: '2m ago', type: 'info' },\r\n  { id: 2, title: 'Build passed', time: '1h ago', read: true, type: 'success' },\r\n])\r\n</script>\r\n\r\n<template>\r\n  <BaseSidebar :sections=\"navSections\" :show-notifications=\"true\" />\r\n  <BaseNotificationPanel @select=\"(id) => goTo(id)\" />\r\n</template>\r\n```\r\n\r\n```ts\r\nimport type { NotificationItem } from 'mgv-backoffice'\r\n\r\ninterface NotificationItem {\r\n  id: string | number\r\n  title: string\r\n  message?: string\r\n  time?: string                                   // pre-formatted by you\r\n  read?: boolean\r\n  type?: 'info' | 'success' | 'warning' | 'error' // status dot colour\r\n}\r\n```\r\n\r\n---\r\n\r\n## Authentication\r\n\r\n### BaseGoogleSignInButton\r\n\r\nGoogle-branded \"Sign in with Google\" button (official multi-colour \"G\",\r\ndark-mode surface swap). Purely presentational — it runs no OAuth itself;\r\nlisten on `click` and start your own Google Identity / Firebase / backend\r\nflow there.\r\n\r\n**Props:**\r\n\r\n| Prop       | Type      | Default                    | Description |\r\n| ---------- | --------- | -------------------------- | ----------- |\r\n| `label`    | `String`  | `'Sign in with Google'`    | Button text. |\r\n| `loading`  | `Boolean` | `false`                    | Disables and shows a spinner. |\r\n| `disabled` | `Boolean` | `false`                    | Disables without the spinner. |\r\n| `block`    | `Boolean` | `true`                     | Full-width layout. |\r\n\r\n**Emits:** `click` (only when not disabled/loading).\r\n\r\n### BaseLoginForm\r\n\r\nPresentational sign-in card: email + password (with show/hide), an optional\r\n\"Remember me\" checkbox, an error banner, the Google button + \"or\" divider,\r\nand `logo` / `forgot` / `footer` slots. Owns its input state and emits\r\n`submit` / `google-sign-in`; the app handles the actual request and feeds\r\nback `loading` / `error`.\r\n\r\n**Props:**\r\n\r\n| Prop            | Type      | Default     | Description |\r\n| --------------- | --------- | ----------- | ----------- |\r\n| `title`         | `String`  | `'Sign in'` | Card heading. |\r\n| `subtitle`      | `String`  | `''`        | Muted line under the heading. |\r\n| `submitLabel`   | `String`  | `'Sign in'` | Submit button text. |\r\n| `loading`       | `Boolean` | `false`     | Disables the form, spinner on submit. |\r\n| `googleLoading` | `Boolean` | `false`     | Disables the form, spinner on the Google button. |\r\n| `error`         | `String`  | `''`        | Error banner above the form. |\r\n| `showGoogle`    | `Boolean` | `true`      | Render the Google button + divider. |\r\n| `showRemember`  | `Boolean` | `false`     | Render the \"Remember me\" checkbox. |\r\n\r\n**Emits:** `submit` (`LoginCredentials`), `google-sign-in`.\r\n\r\n**Slots:** `logo`, `forgot` (next to the password label), `footer`.\r\n\r\n```vue\r\n<script setup lang=\"ts\">\r\nimport { BaseLoginForm } from 'mgv-backoffice'\r\nimport type { LoginCredentials } from 'mgv-backoffice'\r\n\r\nasync function onSubmit(creds: LoginCredentials) { /* call your API */ }\r\nfunction onGoogle() { /* start Google OAuth */ }\r\n</script>\r\n\r\n<template>\r\n  <BaseLoginForm\r\n    subtitle=\"Welcome back\"\r\n    :show-remember=\"true\"\r\n    @submit=\"onSubmit\"\r\n    @google-sign-in=\"onGoogle\"\r\n  >\r\n    <template #logo><MyLogo /></template>\r\n    <template #forgot><a href=\"/forgot\" class=\"text-sm text-emerald-600\">Forgot?</a></template>\r\n    <template #footer>No account? <a href=\"/signup\" class=\"text-emerald-600\">Sign up</a></template>\r\n  </BaseLoginForm>\r\n</template>\r\n```\r\n\r\n---\r\n\r\n## Modals & sections\r\n\r\n### BaseModalShell\r\n\r\nShared modal chrome — `Teleport` to body, backdrop, themed card, escape key,\r\naria-modal. Compose this rather than building modals from scratch.\r\n\r\n**Props:**\r\n\r\n| Prop            | Type      | Default     | Description |\r\n| --------------- | --------- | ----------- | ----------- |\r\n| `title`         | `String`  | **required** | Modal heading. |\r\n| `icon`          | `Component` | **required** | Heroicon rendered in a tinted circular chip left of the title (the `icon` slot can override the whole chip). |\r\n| `iconBgClass`   | `String`  | `''`        | Background classes of the icon chip; empty falls back to the emerald tint (dark-mode aware). |\r\n| `iconClass`     | `String`  | `'text-emerald-600'` | Classes applied to the icon itself. |\r\n| `maxWidthClass` | `String`  | `'max-w-md'` | Tailwind max-w utility for the card. |\r\n| `manualClose`   | `Boolean` | `false`     | If true, backdrop click and Escape do NOT auto-emit `cancel`. |\r\n| `scrollable`    | `Boolean` | `false`     | Switch to the large-content layout: a flex column capped at `90vh` with a fixed header/footer and a scrolling body. |\r\n| `subtitle`      | `String`  | `''`        | Muted line under the title (scrollable layout only). |\r\n\r\n**Slots:** `icon`, `default`, `footer`, and (scrollable layout) `header-actions` — content on the right of the header, e.g. a close button.\r\n**Events:** `cancel`, `backdrop`.\r\n\r\n### BaseConfirmModal\r\n\r\nConfirmation dialog built on `BaseModalShell`. Variant chooses red (danger) or\r\namber (warning) styling.\r\n\r\n**Props:** `title`, `message`, `confirmText`, `cancelText`, `submittingText`,\r\n`variant: 'danger' | 'warning'`, `submitting`. While `submitting` is true,\r\nbackdrop clicks and Escape stop dismissing the dialog.\r\n\r\n**Slots:** `message` — rich markup replacing the plain `message` string;\r\n`default` — extra content below the message (warning banner, opt-in checkbox).\r\n**Events:** `confirm`, `cancel`.\r\n\r\n### BaseTextInputModal\r\n\r\n\"Ask the user for a single string and confirm\" dialog. Preserves typed input\r\non stray backdrop clicks; Escape always cancels.\r\n\r\n**Props:** `title`, `message`, `initialValue`, `placeholder`, `inputLabel`,\r\n`confirmText`, `cancelText`, `submittingText`, `submitting`.\r\n\r\n**Slots:** `icon` — override the default emerald document icon.\r\n**Events:** `confirm(value: string)`, `cancel`.\r\n\r\n### BaseEntityPickerModal\r\n\r\nSearchable \"pick one from a list\" dialog. Pass `items` directly or an async\r\n`loader` that runs on mount.\r\n\r\n**Props:** `title`, `message?`, `items?: EntityPickerItem[]`,\r\n`loader?: () => Promise<EntityPickerItem[]>`, `excludeId?`,\r\n`variant: 'emerald' | 'purple' | 'blue' | 'red' | 'amber'`,\r\n`searchPlaceholder`, `emptyMessage`, `noMatchMessage`, `confirmText`,\r\n`cancelText`, `submittingText`, `submitting`.\r\n\r\n**Slots:** `icon` — override the default icon chip.\r\n**Events:** `confirm(itemId: string)`, `cancel`.\r\n\r\n```ts\r\ninterface EntityPickerItem { id: string; label: string }\r\n```\r\n\r\n### BaseCollapsibleSection\r\n\r\nSection wrapper with a clickable header, optional badge, and a `default` slot\r\nfor the body. Parent owns the `collapsed` state.\r\n\r\n**Props:** `title`, `collapsed`, `badge?`, `bodyClass?`.\r\n**Events:** `toggle`.\r\n\r\n### BaseNotFoundPage\r\n\r\nDrop-in 404 view.\r\n\r\n**Props:** `code` (`'404'`), `message` (`'Page not found'`),\r\n`homeRouteName` (`'home'`), `homeLabel` (`'Go home'`).\r\n\r\n### BasePageHeader\r\n\r\nPage-level header: icon badge + title/subtitle on the left, action\r\nbuttons on the right. Gives top-level views a consistent header shape\r\nand width. The icon badge only renders when the `icon` slot is filled,\r\nso icon-less apps get a plain title/subtitle header.\r\n\r\n**Props:**\r\n\r\n| Prop            | Type     | Default       | Description |\r\n| --------------- | -------- | ------------- | ----------- |\r\n| `title`         | `String` | **required**  | H1 text. |\r\n| `subtitle`      | `String` | `''`          | Muted line below the title. |\r\n| `iconColor`     | `String` | `'emerald'`   | Badge + icon colour: `'emerald' \\| 'sky' \\| 'red' \\| 'amber'`. |\r\n| `maxWidthClass` | `String` | `'max-w-4xl'` | Tailwind max-w utility constraining header width. Pass `''` to skip the width wrapper entirely — the header then spans its container. |\r\n| `align`         | `String` | `'center'`    | Vertical alignment of the title block vs the actions: `'center'` or `'end'` (actions sit on the title baseline). |\r\n| `marginClass`   | `String` | `'mb-8'`      | Space under the header. Pass `''` when the parent manages vertical rhythm (`space-y-*`). |\r\n| `accent`        | `Boolean` | `false`       | Brand-green gauge bar in front of the title (icon-less headers). |\r\n\r\n**Slots:**\r\n\r\n| Slot       | Slot props        | Description |\r\n| ---------- | ----------------- | ----------- |\r\n| `icon`     | `{ iconClass }`   | Page Heroicon. Bind `:class=\"iconClass\"` for the theme-aware colour. Badge square renders only when this slot is filled. |\r\n| `subtitle` | —                 | Rich subtitle content (links, `<strong>`, interpolation); overrides the `subtitle` prop. |\r\n| `actions`  | —                 | Buttons rendered on the right (refresh, destructive, etc.). |\r\n\r\n```vue\r\n<template>\r\n  <BasePageHeader title=\"Request Journal\" subtitle=\"Recent matched requests\" icon-color=\"sky\">\r\n    <template #icon=\"{ iconClass }\">\r\n      <DocumentTextIcon class=\"w-5 h-5\" :class=\"iconClass\" />\r\n    </template>\r\n    <template #actions>\r\n      <BaseButton description=\"Refresh\" @click=\"reload\" />\r\n    </template>\r\n  </BasePageHeader>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BasePageHeader, BaseButton } from 'mgv-backoffice'\r\nimport { DocumentTextIcon } from '@heroicons/vue/24/outline'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseToolbarButton\r\n\r\nBordered toolbar button — the \"Refresh / Delete All\" row that sits under\r\na page header. Optional leading icon (via slot) plus a label.\r\n\r\n**Props:**\r\n\r\n| Prop       | Type      | Default     | Description |\r\n| ---------- | --------- | ----------- | ----------- |\r\n| `label`    | `String`  | `''`        | Button text. Omit for an icon-only button. |\r\n| `variant`  | `String`  | `'neutral'` | `'neutral'` (grey), `'danger'` (solid red) or `'ghost'` (slate h-9 outline — toolbar/modal-footer buttons). |\r\n| `disabled` | `Boolean` | `false`     | Greys out and blocks the click. |\r\n| `title`    | `String`  | `undefined` | Native tooltip / a11y text. |\r\n| `type`     | `String`  | `'button'`  | Native button type. |\r\n\r\n**Slots:**\r\n\r\n| Slot   | Slot props      | Description |\r\n| ------ | --------------- | ----------- |\r\n| `icon` | `{ iconClass }` | Leading Heroicon. Bind `:class=\"iconClass\"` (`w-4 h-4`); add state classes as needed. |\r\n\r\n**Emits:** `click` (native `MouseEvent`).\r\n\r\n```vue\r\n<template>\r\n  <BaseToolbarButton label=\"Refresh\" :disabled=\"isLoading\" title=\"Refresh\" @click=\"reload\">\r\n    <template #icon=\"{ iconClass }\">\r\n      <ArrowPathIcon :class=\"[iconClass, { 'animate-spin': isLoading }]\" />\r\n    </template>\r\n  </BaseToolbarButton>\r\n  <BaseToolbarButton label=\"Delete All\" variant=\"danger\" @click=\"deleteAll\">\r\n    <template #icon=\"{ iconClass }\">\r\n      <TrashIcon :class=\"iconClass\" />\r\n    </template>\r\n  </BaseToolbarButton>\r\n</template>\r\n```\r\n\r\n---\r\n\r\n### BaseActionButton\r\n\r\nCompact ghost action button — the colour-coded \"Edit / Logs / Stub /\r\nDelete\" actions on a card footer or action row. No border/fill at rest;\r\na tinted hover background keyed to the semantic colour.\r\n\r\n**Props:**\r\n\r\n| Prop        | Type      | Default     | Description |\r\n| ----------- | --------- | ----------- | ----------- |\r\n| `label`     | `String`  | `''`        | Button text. Omit for an icon-only button. |\r\n| `color`     | `String`  | `'emerald'` | `'emerald' \\| 'sky' \\| 'indigo' \\| 'teal' \\| 'purple' \\| 'red' \\| 'amber' \\| 'amberStrong'`. |\r\n| `disabled`  | `Boolean` | `false`     | Dims via opacity and suppresses the hover tint. |\r\n| `fullWidth` | `Boolean` | `false`     | Stretch to fill its flex row (`flex-1`). |\r\n| `title`     | `String`  | `undefined` | Native tooltip. |\r\n| `ariaLabel` | `String`  | `undefined` | Accessible label. |\r\n| `type`      | `String`  | `'button'`  | Native button type. |\r\n\r\n**Slots:**\r\n\r\n| Slot   | Slot props      | Description |\r\n| ------ | --------------- | ----------- |\r\n| `icon` | `{ iconClass }` | Leading Heroicon. Bind `:class=\"iconClass\"` (`w-4 h-4`). |\r\n\r\n**Emits:** `click` (native `MouseEvent`).\r\n\r\n```vue\r\n<template>\r\n  <BaseActionButton label=\"Edit\" color=\"emerald\" full-width title=\"Edit this mock\" @click=\"edit\">\r\n    <template #icon=\"{ iconClass }\">\r\n      <PencilSquareIcon :class=\"iconClass\" />\r\n    </template>\r\n  </BaseActionButton>\r\n  <BaseActionButton label=\"Delete\" color=\"red\" @click=\"remove\">\r\n    <template #icon=\"{ iconClass }\">\r\n      <TrashIcon :class=\"iconClass\" />\r\n    </template>\r\n  </BaseActionButton>\r\n</template>\r\n```\r\n\r\n---\r\n\r\n### BaseCopyButton\r\n\r\nCopy-to-clipboard icon button with transient \"copied\" feedback — clicks\r\nwrite `text` to the clipboard, swap the clipboard icon for a checkmark\r\nfor `resetMs`, then revert. Uses the async Clipboard API with a\r\nhidden-textarea `execCommand` fallback for insecure origins. Emits\r\n`copied` / `error` so the parent can fire its own toast.\r\n\r\n**Props:**\r\n\r\n| Prop        | Type      | Default   | Description |\r\n| ----------- | --------- | --------- | ----------- |\r\n| `text`      | `String`  | **required** | Value written to the clipboard. |\r\n| `label`     | `String`  | `''`      | Used in the tooltip / aria-label (`Copy {label}`). |\r\n| `variant`   | `String`  | `'ghost'` | `'ghost'` (borderless `p-1` icon) or `'bordered'` (`w-9 h-9` boxed, turns emerald while copied). |\r\n| `resetMs`   | `Number`  | `1500`    | How long the checkmark stays before reverting. |\r\n| `iconClass` | `String`  | `'w-4 h-4'` | Icon size class. |\r\n\r\n**Emits:** `copied`, `error(err)`.\r\n\r\n```vue\r\n<template>\r\n  <!-- Inline ID copy, parent fires the toast -->\r\n  <BaseCopyButton\r\n    :text=\"stub.id\"\r\n    label=\"Stub ID\"\r\n    @copied=\"showToastMessage('Stub ID copied to clipboard', BaseToastEnum.SUCCESS)\"\r\n    @error=\"showToastMessage('Failed to copy stub ID', BaseToastEnum.ERROR)\"\r\n  />\r\n  <!-- Boxed copy next to a read-only input -->\r\n  <BaseCopyButton :text=\"mock.id\" label=\"Mock ID\" variant=\"bordered\" :reset-ms=\"2000\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { BaseCopyButton, BaseToastEnum } from 'mgv-backoffice'\r\n</script>\r\n```\r\n\r\n---\r\n\r\n### BaseChipButton\r\n\r\nSmall tinted emerald \"chip\" action button — the compact \"+ Add\" pill used\r\nabove repeatable form rows. Label comes from the default slot.\r\n\r\n**Props:**\r\n\r\n| Prop       | Type      | Default | Description |\r\n| ---------- | --------- | ------- | ----------- |\r\n| `size`     | `String`  | `'sm'`  | `'sm'` = `px-2.5 py-1`; `'xs'` = `px-2 py-0.5` for tight corners. |\r\n| `disabled` | `Boolean` | `false` | Dims the chip and blocks clicks. |\r\n\r\n**Emits:** `click`.\r\n\r\n```vue\r\n<BaseChipButton @click=\"addRow(rows)\">+ Add</BaseChipButton>\r\n<BaseChipButton size=\"xs\" @click=\"addNamespace\">+ Add</BaseChipButton>\r\n```\r\n\r\n---\r\n\r\n### BaseRemoveButton\r\n\r\nThe red \"×\" remove-row affordance used beside repeatable form rows. Name it\r\nfor screen readers via `aria-label`; `title`, `disabled` and extra classes\r\n(`pt-1`, `self-start`, …) fall through as attrs.\r\n\r\n**Emits:** `click`.\r\n\r\n```vue\r\n<BaseRemoveButton :aria-label=\"`Remove header ${i + 1}`\" @click=\"rows.splice(i, 1)\" />\r\n```\r\n\r\n---\r\n\r\n### BaseStatusPill\r\n\r\nConnection/health status pill: a colored dot (pulsing while `ok`) next to a\r\nshort label on a tinted background.\r\n\r\n**Props:**\r\n\r\n| Prop     | Type     | Default | Description |\r\n| -------- | -------- | ------- | ----------- |\r\n| `status` | `String` | **required** | `'ok'` (emerald, pulsing), `'error'` (red), `'unknown'` (gray). |\r\n| `label`  | `String` | **required** | Short text next to the dot, e.g. `WireMock Connected`. |\r\n\r\n```vue\r\n<BaseStatusPill :status=\"healthy ? 'ok' : 'error'\" :label=\"healthy ? 'Connected' : 'Disconnected'\" />\r\n```\r\n\r\n---\r\n\r\n### BaseFileDropzone\r\n\r\nDashed \"click to select a file\" upload zone (extracted from WireMate's\r\nPostman-import modal). Renders a document-arrow-up icon (overridable via the\r\n`#icon` slot), a label line, and an optional dimmed hint line. Clicking opens\r\nthe native file picker; dragging files onto the zone also works (the border\r\nhighlights emerald while dragging). The hidden input resets after every\r\nselection, so picking the same file twice still emits.\r\n\r\n**Props:**\r\n\r\n| Prop       | Type      | Default | Description |\r\n| ---------- | --------- | ------- | ----------- |\r\n| `label`    | `String`  | **required** | Main line, e.g. `Click to select a Postman collection (.json)`. |\r\n| `hint`     | `String`  | `''`    | Dimmed helper line below the label. |\r\n| `accept`   | `String`  | `''`    | Forwarded to the input's `accept`. Dropped files are **not** filtered by it. |\r\n| `multiple` | `Boolean` | `false` | Allow multi-select; when `false`, a multi-file drop emits only the first file. |\r\n| `disabled` | `Boolean` | `false` | Dims the zone and ignores clicks/drops. |\r\n\r\n**Emits:** `files` (`File[]`, never empty).\r\n\r\n**Slots:** `icon` — replaces the default upload icon.\r\n\r\n```vue\r\n<BaseFileDropzone\r\n  accept=\"application/json,.json\"\r\n  label=\"Click to select a Postman collection (.json)\"\r\n  hint=\"Exported from Postman → Export → Collection v2.1\"\r\n  @files=\"onFiles\"\r\n/>\r\n```\r\n\r\n### BaseCodeBlock\r\n\r\nThemed monospace `<pre>` for JSON payloads, request dumps and code snippets\r\n(extracted from WireMate's stub/request detail views). Preserves whitespace\r\nverbatim, scrolls both axes, and adapts to the theme. Extra classes (margins\r\netc.) fall through via the normal class merge.\r\n\r\n**Props:**\r\n\r\n| Prop             | Type     | Default  | Description |\r\n| ---------------- | -------- | -------- | ----------- |\r\n| `code`           | `String` | **required** | The raw text to render. |\r\n| `variant`        | `String` | `'soft'` | `'soft'` = tinted fill, no border (in-card look); `'bordered'` = bordered card fill (standalone look). |\r\n| `size`           | `String` | `'sm'`   | `'sm'` = `text-sm px-5 py-4`; `'xs'` = dense `text-xs p-3`. |\r\n| `maxHeightClass` | `String` | `''`     | Optional Tailwind max-height utility, e.g. `max-h-96`. |\r\n\r\n```vue\r\n<BaseCodeBlock :code=\"formatJson(response.body)\" size=\"xs\" max-height-class=\"max-h-64\" />\r\n```\r\n\r\n---\r\n\r\n## Forms & tables\r\n\r\nThese components use `dark:` Tailwind variants, so the consuming app must map\r\nthe `dark` variant to the `.dark` class that `useTheme()` toggles (see\r\n[Tailwind setup for consumers](#tailwind-setup-for-consumers)).\r\n\r\n### BaseInput\r\n\r\nThemed text/number input carrying the shared field skin (slate border,\r\n`bg-slate-50` / dark `bg-slate-900` surface). Everything else — `placeholder`,\r\n`id`, `disabled`, `step`/`min`, extra classes like `font-mono` or\r\n`placeholder:*` — falls through via attrs and Vue class merging.\r\n\r\n**Props:**\r\n\r\n| Prop         | Type               | Default  | Description |\r\n| ------------ | ------------------ | -------- | ----------- |\r\n| `modelValue` | `String \\| Number \\| null` | `''`     | `v-model` value. |\r\n| `type`       | `String`           | `'text'` | Native input type. |\r\n| `size`       | `String`           | `'md'`   | `'md'` = `px-3 py-2`, `'sm'` = `px-2 py-1.5`. |\r\n| `block`      | `Boolean`          | `true`   | Full-width (`w-full`); set `false` for inline fields. |\r\n\r\n**Emits:** `update:modelValue(value: string)` — always the raw string; parse\r\nnumbers in the owner.\r\n\r\n```vue\r\n<BaseInput v-model=\"query\" placeholder=\"e.g. AMD or BTC\" class=\"font-mono\" />\r\n```\r\n\r\n### BaseSelect\r\n\r\nThemed `<select>` sharing BaseInput's field skin. Options come from the\r\ndefault slot so callers keep full control of `<option>` rendering.\r\n\r\n**Props:**\r\n\r\n| Prop         | Type               | Default | Description |\r\n| ------------ | ------------------ | ------- | ----------- |\r\n| `modelValue` | `String \\| null`   | `undefined` | `v-model` value. When left undefined the browser keeps its own default selection. |\r\n| `size`       | `String`           | `'sm'`  | `'sm'` = `px-2 py-1.5`, `'md'` = `px-3 py-2`. |\r\n| `block`      | `Boolean`          | `true`  | Full-width; set `false` for inline selects. |\r\n\r\n**Slots:** `default` — the `<option>` elements.\r\n**Emits:** `update:modelValue(value: string)`.\r\n\r\n```vue\r\n<BaseSelect v-model=\"strategyType\">\r\n  <option v-for=\"e in catalog\" :key=\"e.type\" :value=\"e.type\" :title=\"e.description\">\r\n    {{ e.label }}\r\n  </option>\r\n</BaseSelect>\r\n```\r\n\r\n### BaseDropdown\r\n\r\nButton-style single-select dropdown (\"Select Social User ⌄\"). Unlike\r\n`BaseSelect` (a native `<select>`), this renders a trigger button plus a\r\nfloating menu, so the closed control shows a placeholder and a chevron that\r\nrotates while open — matching the app's filter dropdowns. Selecting a row\r\nemits its `value` and closes the menu; Escape and an outside click also close\r\nit.\r\n\r\n**Props:**\r\n\r\n| Prop          | Type                       | Default      | Description |\r\n| ------------- | -------------------------- | ------------ | ----------- |\r\n| `options`     | `DropdownOption[]`         | **required** | `{ value, label, title?, disabled? }` per row. |\r\n| `modelValue`  | `String \\| Number \\| null` | `null`       | Selected option's `value` (`v-model`). |\r\n| `placeholder` | `String`                   | `'Select'`   | Trigger text shown when nothing is selected. |\r\n| `size`        | `String`                   | `'md'`       | `'md'` = `px-4 py-2.5` (app filter height), `'sm'` = `px-3 py-2`. Ignored when `triggerClass` is set. |\r\n| `block`       | `Boolean`                  | `true`       | Full-width; set `false` for an inline, content-width dropdown. |\r\n| `disabled`    | `Boolean`                  | `false`      | Disables the trigger. |\r\n| `ariaLabel`   | `String`                   | `''`         | Accessible name for the trigger/listbox when there is no visible label. |\r\n| `triggerClass`| `String`                   | `''`         | Replaces the trigger's default slate skin entirely (including the `size` padding). |\r\n| `chevronClass`| `String`                   | `'w-5 h-5 text-slate-500 dark:text-slate-400'` | Classes for the chevron icon. |\r\n\r\n**Emits:** `update:modelValue(value)`.\r\n\r\n```vue\r\n<BaseDropdown\r\n  v-model=\"socialUserId\"\r\n  :options=\"socialUsers.map((u) => ({ value: u.id, label: u.name }))\"\r\n  placeholder=\"Select Social User\"\r\n  aria-label=\"Social user\"\r\n/>\r\n```\r\n\r\n### BaseDateTimePicker\r\n\r\nDate / date-time / time picker built on\r\n[@vuepic/vue-datepicker](https://vue3datepicker.com). The package is a regular\r\ndependency of this lib (installed automatically) and its CSS ships inside\r\n`ui-lib.css`, so consumers install and import nothing extra. Dark mode follows\r\n`useTheme()`; the skin matches BaseInput (slate surfaces, emerald accent).\r\n\r\n**Props:**\r\n\r\n| Prop         | Type               | Default      | Description |\r\n| ------------ | ------------------ | ------------ | ----------- |\r\n| `modelValue` | `ModelValue`       | `null`       | `v-model` value — `Date`, `Date[]` for ranges, a time object in `'time'` mode, or a string/number with `model-type`. |\r\n| `mode`       | `'date' \\| 'datetime' \\| 'time'` | `'datetime'` | Calendar only, calendar + time, or time only. |\r\n| `format`     | `String`           | per mode     | date-fns input pattern. Defaults: `dd/MM/yyyy`, `dd/MM/yyyy HH:mm`, `HH:mm` (`hh:mm a` when `is24` is false). |\r\n| `is24`       | `Boolean`          | `true`       | 24-hour clock. |\r\n| `autoApply`  | `Boolean`          | `false`      | Select on click, without the Cancel/Select row. |\r\n| `teleport`   | `Boolean \\| String \\| HTMLElement` | `true` | Menu mount target; `true` = body, so modals don't clip it. |\r\n| `timeConfig` | `Partial<TimeConfig>` | —         | Extra time options (seconds, increments…), merged over the defaults. |\r\n\r\nEvery other VueDatePicker prop (`range`, `min-date`, `max-date`,\r\n`disabled-dates`, `placeholder`, `model-type`, …), event and slot is passed\r\nstraight through.\r\n\r\n**Emits:** `update:modelValue(value)`.\r\n\r\n```vue\r\n<BaseDateTimePicker v-model=\"startsAt\" placeholder=\"Start\" />\r\n<BaseDateTimePicker v-model=\"day\" mode=\"date\" :min-date=\"new Date()\" auto-apply />\r\n<BaseDateTimePicker v-model=\"period\" mode=\"date\" range />\r\n```\r\n\r\n### BaseSegmentedControl\r\n\r\nSegmented button group (\"All | Stock | Crypto\"). One button per option; the\r\nselected one gets the filled treatment and `aria-pressed=\"true\"`.\r\n\r\n**Props:**\r\n\r\n| Prop          | Type                | Default  | Description |\r\n| ------------- | ------------------- | -------- | ----------- |\r\n| `options`     | `SegmentedOption[]` | **required** | `{ value, label, title? }` per button. |\r\n| `modelValue`  | `String \\| Number`  | **required** | Selected option's `value` (`v-model`). |\r\n| `variant`     | `String`            | `'base'` | `'base'` (`px-3 py-2`, emerald-500 fill), `'wide'` (`px-4 py-2`, emerald-600 fill), `'toolbar'` (`h-9` uppercase `text-xs` with focus-visible rings). |\r\n| `ariaLabel`   | `String`            | `''`     | When set, the wrapper renders `role=\"group\"` + `aria-label`. |\r\n| `optionClass` | `Function`          | —        | `(option, active) => string` override for per-button fill classes (e.g. severity colours); layout stays owned by the variant. |\r\n\r\n**Emits:** `update:modelValue(value)`.\r\n\r\n```vue\r\n<BaseSegmentedControl v-model=\"assetFilter\" :options=\"ASSET_FILTERS\" />\r\n<BaseSegmentedControl v-model=\"exchange\" :options=\"EXCHANGES\" variant=\"wide\" aria-label=\"Exchange\" />\r\n```\r\n\r\n### BaseTable\r\n\r\nStyling shell for data tables — **not** a data grid. Owns the table skin\r\n(slate header band, `px-4 py-3` header cells, row dividers + hover, empty-state\r\nrow); body rows are the caller's own `<tr>` markup via the default slot. Pass\r\n`card` for the rounded, bordered, horizontally scrolling card chrome, or wrap\r\nit yourself (e.g. a `BaseRow` with `overflow-x-auto`).\r\n\r\n**Props:**\r\n\r\n| Prop        | Type            | Default      | Description |\r\n| ----------- | --------------- | ------------ | ----------- |\r\n| `columns`   | `TableColumn[]` | **required** | `{ label, align? }`; `align: 'right'` right-aligns the header cell. |\r\n| `empty`     | `Boolean`       | `false`      | True renders the empty-state row spanning every column. |\r\n| `emptyText` | `String`        | `'No rows.'` | Fallback empty-state text. |\r\n| `card`      | `Boolean`       | `false`      | Wrap in the rounded, bordered, scrolling card. |\r\n\r\n**Slots:** `default` — the `<tr>` rows; `empty` — custom empty-state content.\r\n\r\n```vue\r\n<BaseTable :columns=\"COLUMNS\" :empty=\"rows.length === 0\">\r\n  <template #empty>No trades match your filters.</template>\r\n  <tr v-for=\"row in rows\" :key=\"row.id\" class=\"border-t border-slate-200 dark:border-slate-700\">\r\n    …\r\n  </tr>\r\n</BaseTable>\r\n```\r\n\r\n### BaseSpecFields\r\n\r\nSpec-driven form fields: renders a select / checkbox / number input per\r\n`SpecField`, with labels and help text, in a responsive two-column grid. Feed\r\nit a backend-described catalogue and every form editing those values stays in\r\nlockstep. Never mutates `params` — every edit is emitted as `(key, value)`\r\nand the owner writes it back into its own state.\r\n\r\n**Props:**\r\n\r\n| Prop     | Type                             | Default      | Description |\r\n| -------- | -------------------------------- | ------------ | ----------- |\r\n| `specs`  | `SpecField[]`                    | **required** | `{ key, label, type: 'decimal' \\| 'integer' \\| 'boolean' \\| 'select', default?, options?, step?, min?, help? }` (optional members are nullable). |\r\n| `params` | `Record<string, SpecFieldValue>` | **required** | Current values keyed by `spec.key`. |\r\n\r\n**Slots:** `after` (`{ spec }`) — extra content under each field (e.g. a live\r\npreview attached to one key).\r\n**Emits:** `update(key: string, value: SpecFieldValue)` — numbers are parsed\r\n(`parseFloat`); unparseable input passes through raw so the owner's\r\nvalidation can catch it.\r\n\r\n```vue\r\n<BaseSpecFields :specs=\"entry.params\" :params=\"form.params\"\r\n  @update=\"(key, value) => (form.params[key] = value)\" />\r\n```\r\n\r\n### BaseStatBreakdown\r\n\r\nCompact per-item breakdown meant to sit under a summary/stat card (pairs with\r\n[`EarningsCard`](#earningscard)). Each item renders on its own line — label\r\nleft, value right in monospace. A `null`/`undefined` value (a source that is\r\nunconfigured, unreachable, or has no matching rows) shows an em-dash rather\r\nthan a misleading 0. With `signed`, values gain an explicit \"+\" and are\r\ncoloured green/red by sign (same `\"-$3.00\"` / `\"+$5.00\"` shape as `fmtUsd`).\r\n\r\n**Props:**\r\n\r\n| Prop       | Type                  | Default      | Description |\r\n| ---------- | --------------------- | ------------ | ----------- |\r\n| `items`    | `StatBreakdownItem[]` | **required** | `{ label, value }` per row. |\r\n| `currency` | `String`              | `''`         | Currency symbol placed after the sign, e.g. `'$'`. |\r\n| `decimals` | `Number`              | `2`          | Fraction digits shown for each value. |\r\n| `signed`   | `Boolean`             | `false`      | Show an explicit \"+\" on non-negative values and colour rows green/red by sign. |\r\n\r\n```ts\r\nimport type { StatBreakdownItem } from 'mgv-backoffice'\r\n\r\ninterface StatBreakdownItem {\r\n  label: string                      // row label rendered on the left\r\n  value: number | null | undefined   // null/undefined renders as an em-dash\r\n}\r\n```\r\n\r\n```vue\r\n<EarningsCard title=\"TOTAL P&L\" :amount=\"totalPnl\" signed />\r\n<BaseStatBreakdown\r\n  :items=\"[\r\n    { label: 'Alpaca', value: 42.5 },\r\n    { label: 'Binance', value: -3.1 },\r\n    { label: 'Kraken', value: null },\r\n  ]\"\r\n  currency=\"$\"\r\n  signed\r\n/>\r\n```\r\n\r\n### BaseFilterChip\r\n\r\nColour-coded toggleable filter chip — one-click event/category filters above\r\na data feed. Idle renders a tinted border/background in the semantic colour;\r\nactive renders a solid fill with white text (`aria-pressed` reflects the\r\nstate). Layout classes ","readmeFilename":"README.md"}