{"_id":"@bluerobotics/bluevue","_rev":"6-270f61790e60cfc163010ddff589b5ce","name":"@bluerobotics/bluevue","dist-tags":{"latest":"0.2.3"},"versions":{"0.1.0":{"name":"@bluerobotics/bluevue","version":"0.1.0","keywords":["vue","components","blueos","blue-robotics","tailwind"],"license":"MIT","_id":"@bluerobotics/bluevue@0.1.0","maintainers":[{"name":"patrickelectric","email":"patrickelectric@gmail.com"},{"name":"arturomanzoli","email":"arturomanzoli@gmail.com"},{"name":"bluerobotics-software","email":"software@bluerobotics.com"}],"homepage":"https://github.com/bluerobotics/BlueVue#readme","bugs":{"url":"https://github.com/bluerobotics/BlueVue/issues"},"dist":{"shasum":"336375273d54bfa8ead2f421c3d6793891d3d2d6","tarball":"https://registry.npmjs.org/@bluerobotics/bluevue/-/bluevue-0.1.0.tgz","fileCount":30,"integrity":"sha512-sACtUgAq0wbifPpsy3kzDuloBL2151sBLwBNYgzmgHQ3H3Ugmc1Ip68+StscMOES6CCOScUVHK3xXerG5SrTnA==","signatures":[{"sig":"MEYCIQD9mzHhgvY6WNnXraQAw7W0ZNh6OkQM3+q4wlIaJ2gOQgIhAOik1W6iTZGbv1M2P1NBplAVKUpEqYFvkqjte9QTyJgT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":211435},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/bluevue.js"},"./style.css":"./dist/style.css","./bluevue.css":"./src/styles/bluevue.css"},"gitHead":"089259b308cf24e812ed6f992ef20ed28e719a84","scripts":{"dev":"vite","lint":"eslint . --ext .vue,.ts","build":"npm run typecheck && vite build && npm run build:css","build:css":"tailwindcss --input src/styles/bundled.css --output dist/style.css --minify","typecheck":"vue-tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"arturomanzoli","email":"arturomanzoli@gmail.com"},"repository":{"url":"git+https://github.com/bluerobotics/BlueVue.git","type":"git"},"_npmVersion":"10.9.3","description":"Blue Robotics Vue components for common UI","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.19.0","dependencies":{"@floating-ui/vue":"2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vue":"3.4.38","vite":"5.4.2","eslint":"8.57.0","vue-tsc":"2.0.29","typescript":"5.5.4","tailwindcss":"4.1.11","vite-plugin-dts":"4.5.4","@tailwindcss/cli":"4.1.11","@tailwindcss/vite":"4.1.11","eslint-plugin-vue":"9.27.0","@vitejs/plugin-vue":"5.1.3","@typescript-eslint/parser":"7.18.0","@typescript-eslint/eslint-plugin":"7.18.0"},"peerDependencies":{"vue":"^3.4","@mdi/font":">=7"},"_npmOperationalInternal":{"tmp":"tmp/bluevue_0.1.0_1786621037202_0.011041997547972526","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bluerobotics/bluevue","version":"0.1.1","keywords":["vue","components","blueos","blue-robotics","tailwind"],"license":"MIT","_id":"@bluerobotics/bluevue@0.1.1","maintainers":[{"name":"patrickelectric","email":"patrickelectric@gmail.com"},{"name":"arturomanzoli","email":"arturomanzoli@gmail.com"},{"name":"bluerobotics-software","email":"software@bluerobotics.com"}],"homepage":"https://github.com/bluerobotics/BlueVue#readme","bugs":{"url":"https://github.com/bluerobotics/BlueVue/issues"},"dist":{"shasum":"6a4c5ab9ac8107c5e1b23a8bb421b765c4264ea8","tarball":"https://registry.npmjs.org/@bluerobotics/bluevue/-/bluevue-0.1.1.tgz","fileCount":30,"integrity":"sha512-lc3wGLN1fxw114YERvxzaPSWe16EeNfKmIlrM/vLl+AXLQbZ7U49l1mvxMosdCnoD9HpCe5uvdG+lkuULUCN9w==","signatures":[{"sig":"MEQCIDrWSdcLvQlLRW8gKjvTq5uzU1bEHQvKtjCPOfW1M3trAiA0zs4kZHoACMMwWZBWjADd3FWK8w4M7iBw02XEL98R5Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bluerobotics%2fbluevue@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":211435},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/bluevue.js"},"./style.css":"./dist/style.css","./bluevue.css":"./src/styles/bluevue.css"},"gitHead":"78cc39a6b718a97e3cffae1de25242cdd3b0e109","scripts":{"dev":"vite","lint":"eslint . --ext .vue,.ts","build":"npm run typecheck && vite build && npm run build:css","build:css":"tailwindcss --input src/styles/bundled.css --output dist/style.css --minify","typecheck":"vue-tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8bdacb4c-6220-42cd-8572-19755ab65111"}},"repository":{"url":"git+https://github.com/bluerobotics/BlueVue.git","type":"git"},"_npmVersion":"11.16.0","description":"Blue Robotics Vue components for common UI","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.18.0","dependencies":{"@floating-ui/vue":"2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vue":"3.4.38","vite":"5.4.2","eslint":"8.57.0","vue-tsc":"2.0.29","typescript":"5.5.4","tailwindcss":"4.1.11","vite-plugin-dts":"4.5.4","@tailwindcss/cli":"4.1.11","@tailwindcss/vite":"4.1.11","eslint-plugin-vue":"9.27.0","@vitejs/plugin-vue":"5.1.3","@typescript-eslint/parser":"7.18.0","@typescript-eslint/eslint-plugin":"7.18.0"},"peerDependencies":{"vue":"^3.4","@mdi/font":">=7"},"_npmOperationalInternal":{"tmp":"tmp/bluevue_0.1.1_1786623028495_0.6773578081333278","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bluerobotics/bluevue","version":"0.2.0","keywords":["vue","components","blueos","blue-robotics","tailwind"],"license":"MIT","_id":"@bluerobotics/bluevue@0.2.0","maintainers":[{"name":"patrickelectric","email":"patrickelectric@gmail.com"},{"name":"arturomanzoli","email":"arturomanzoli@gmail.com"},{"name":"bluerobotics-software","email":"software@bluerobotics.com"}],"homepage":"https://github.com/bluerobotics/BlueVue#readme","bugs":{"url":"https://github.com/bluerobotics/BlueVue/issues"},"bin":{"create-blueos-extension":"bin/create-blueos-extension.mjs"},"dist":{"shasum":"64ae8cccf9415b1e9aa52d664f76348721fc4918","tarball":"https://registry.npmjs.org/@bluerobotics/bluevue/-/bluevue-0.2.0.tgz","fileCount":106,"integrity":"sha512-gazI5pPEHLS8g1Xsv1gkIpK9NDBNkAka9sjXWbNgwzBXFbStTG8apBLygUSZ95wf8mnc+CpNOFU8h6rGvJ12Tw==","signatures":[{"sig":"MEUCIQDlv0pJGqXDXGiW7T5LoaYCyAun/R/BaOUQasj/cUNzuQIgcMEcdo/SmzRoRv9mA1FpWe1iDIGN5Bg4boCHyJUGRk0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":440809},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/bluevue.js"},"./style.css":"./dist/style.css","./bluevue.css":"./src/styles/bluevue.css"},"gitHead":"c8e9e2f2f0e3e6655c70c6ab9d74dfa65e0904e0","scripts":{"dev":"vite","lint":"eslint . --ext .vue,.ts","build":"npm run typecheck && vite build && npm run build:css","build:css":"tailwindcss --input src/styles/bundled.css --output dist/style.css --minify","typecheck":"vue-tsc --noEmit","docs:build":"vite build --mode docs","prepublishOnly":"npm run build"},"_npmUser":{"name":"arturomanzoli","email":"arturomanzoli@gmail.com"},"repository":{"url":"git+https://github.com/bluerobotics/BlueVue.git","type":"git"},"_npmVersion":"10.9.3","description":"Blue Robotics Vue components for common UI","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.19.0","dependencies":{"@floating-ui/vue":"2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vue":"3.4.38","vite":"5.4.2","eslint":"8.57.0","vue-tsc":"2.0.29","typescript":"5.5.4","tailwindcss":"4.1.11","vite-plugin-dts":"4.5.4","@tailwindcss/cli":"4.1.11","@tailwindcss/vite":"4.1.11","eslint-plugin-vue":"9.27.0","@vitejs/plugin-vue":"5.1.3","@typescript-eslint/parser":"7.18.0","@typescript-eslint/eslint-plugin":"7.18.0"},"peerDependencies":{"vue":"^3.4","@mdi/font":">=7"},"_npmOperationalInternal":{"tmp":"tmp/bluevue_0.2.0_1786712085010_0.7305106103180714","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bluerobotics/bluevue","version":"0.2.1","keywords":["vue","components","blueos","blue-robotics","tailwind"],"license":"MIT","_id":"@bluerobotics/bluevue@0.2.1","maintainers":[{"name":"patrickelectric","email":"patrickelectric@gmail.com"},{"name":"arturomanzoli","email":"arturomanzoli@gmail.com"},{"name":"bluerobotics-software","email":"software@bluerobotics.com"}],"homepage":"https://github.com/bluerobotics/BlueVue#readme","bugs":{"url":"https://github.com/bluerobotics/BlueVue/issues"},"bin":{"create-blueos-extension":"bin/create-blueos-extension.mjs"},"dist":{"shasum":"811469d7544498989949ff0489afa6ed6d7dd2db","tarball":"https://registry.npmjs.org/@bluerobotics/bluevue/-/bluevue-0.2.1.tgz","fileCount":106,"integrity":"sha512-vkuf/OLcYudrAbgpUqaVimcVXIRZErO3BNLQKg+QLVKdaVz0BewNzN2UvgTbnIRVprkxc7O9pqgu2dUMgAz8hA==","signatures":[{"sig":"MEYCIQCY+404lOc2coisijmmUeFK3NBjUCfgA9oVQnd5hFEMPAIhAIoC33vDiTsSJGv4znua/edRclySo0nH1WfimoaHvC7B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":441986},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/bluevue.js"},"./style.css":"./dist/style.css","./bluevue.css":"./src/styles/bluevue.css"},"gitHead":"731f937dbc12bb80f4406304fc6d9fe5122560ff","scripts":{"dev":"vite","lint":"eslint . --ext .vue,.ts","build":"npm run typecheck && vite build && npm run build:css","build:css":"tailwindcss --input src/styles/bundled.css --output dist/style.css --minify","typecheck":"vue-tsc --noEmit","docs:build":"vite build --mode docs","prepublishOnly":"npm run build"},"_npmUser":{"name":"arturomanzoli","email":"arturomanzoli@gmail.com"},"repository":{"url":"git+https://github.com/bluerobotics/BlueVue.git","type":"git"},"_npmVersion":"10.9.3","description":"Blue Robotics Vue components for common UI","directories":{},"sideEffects":["*.css"],"_nodeVersion":"22.19.0","dependencies":{"@floating-ui/vue":"2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vue":"3.4.38","vite":"5.4.2","eslint":"8.57.0","vue-tsc":"2.0.29","typescript":"5.5.4","tailwindcss":"4.1.11","vite-plugin-dts":"4.5.4","@tailwindcss/cli":"4.1.11","@tailwindcss/vite":"4.1.11","eslint-plugin-vue":"9.27.0","@vitejs/plugin-vue":"5.1.3","@typescript-eslint/parser":"7.18.0","@typescript-eslint/eslint-plugin":"7.18.0"},"peerDependencies":{"vue":"^3.4","@mdi/font":">=7"},"_npmOperationalInternal":{"tmp":"tmp/bluevue_0.2.1_1787078548724_0.36666046809002917","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bluerobotics/bluevue","version":"0.2.2","keywords":["vue","components","blueos","blue-robotics","tailwind"],"license":"MIT","_id":"@bluerobotics/bluevue@0.2.2","maintainers":[{"name":"patrickelectric","email":"patrickelectric@gmail.com"},{"name":"arturomanzoli","email":"arturomanzoli@gmail.com"},{"name":"bluerobotics-software","email":"software@bluerobotics.com"}],"homepage":"https://github.com/bluerobotics/BlueVue#readme","bugs":{"url":"https://github.com/bluerobotics/BlueVue/issues"},"bin":{"create-blueos-extension":"bin/create-blueos-extension.mjs"},"dist":{"shasum":"bba61dc6291c07556361017e41589722a55ebc4e","tarball":"https://registry.npmjs.org/@bluerobotics/bluevue/-/bluevue-0.2.2.tgz","fileCount":114,"integrity":"sha512-E1lC6w1RWZ58fLKCMypPBINDmOQqw/OjZMt8Jq/qyUIeN+OoDU8t1gLiVZ8N9ECQw9NhwJ9zuBBRfefptt7jEg==","signatures":[{"sig":"MEUCIB0RCivAXFk4zXpML4YiRSy9JBUdsqFY0mQ70fU7H3B4AiEA6RQBW/b6aHEpOyQSmn0SdVg3TSNrCfshoB/TTYk7A3g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD2+DuaFvXpVsMTvtgxU2rRfmnFBxdIO7wDtt1gSpdeUAIhAJ1QMwjNbldn9+VW3cYW08QopGY8mMO0O9MoJtL3XdTw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bluerobotics%2fbluevue@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":483771},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/bluevue.js"},"./style.css":"./dist/style.css","./bluevue.css":"./src/styles/bluevue.css"},"gitHead":"9c9fd16a40092ef388ea0560740dfbab651c9243","scripts":{"dev":"vite","lint":"eslint . --ext .vue,.ts","build":"npm run typecheck && vite build && npm run build:css","build:css":"tailwindcss --input src/styles/bundled.css --output dist/style.css --minify","typecheck":"vue-tsc --noEmit","docs:build":"vite build --mode docs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8bdacb4c-6220-42cd-8572-19755ab65111"}},"repository":{"url":"git+https://github.com/bluerobotics/BlueVue.git","type":"git"},"_npmVersion":"11.19.0","description":"Blue Robotics Vue components for common UI","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.20.0","dependencies":{"@floating-ui/vue":"2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vue":"3.4.38","vite":"5.4.2","eslint":"8.57.0","vue-tsc":"2.0.29","typescript":"5.5.4","tailwindcss":"4.1.11","vite-plugin-dts":"4.5.4","@tailwindcss/cli":"4.1.11","@tailwindcss/vite":"4.1.11","eslint-plugin-vue":"9.27.0","@vitejs/plugin-vue":"5.1.3","@typescript-eslint/parser":"7.18.0","@typescript-eslint/eslint-plugin":"7.18.0"},"peerDependencies":{"vue":"^3.4","@mdi/font":">=7"},"_npmOperationalInternal":{"tmp":"tmp/bluevue_0.2.2_1788541176627_0.28234631515628217","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"_id":"@bluerobotics/bluevue@0.2.3","bin":{"create-blueos-extension":"bin/create-blueos-extension.mjs"},"bugs":{"url":"https://github.com/bluerobotics/BlueVue/issues"},"dist":{"shasum":"ef99e7c2c35f8134cf4efaacfe440f51e081e290","tarball":"https://registry.npmjs.org/@bluerobotics/bluevue/-/bluevue-0.2.3.tgz","fileCount":114,"integrity":"sha512-XIt69vMYmXts0084EMu2zT0Cg2SCu7+OrBgYbuzrqCOYpmaa6z9B3b9OlfhhlWxenwD515C4tS+xMecKWJdS4g==","signatures":[{"sig":"MEYCIQDzReiOGmCrehUXOecAqy/NvOf6Qht1rBj4sMiFDflwdAIhALKkSVvENh7CgnBEaDxUOEgavt+sRTU04v1W+xC1mm0D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCD2tANn6xQGe7gDA2yjRP01A8ef4J9V+WMcrUvZjMlxQIgI3ItjQHXPK2sctwiyN8hz3fTo6/yfNm3LTb5Nq1ph2A="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bluerobotics%2fbluevue@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":485029},"name":"@bluerobotics/bluevue","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/bluevue.js"},"./style.css":"./dist/style.css","./bluevue.css":"./src/styles/bluevue.css"},"gitHead":"e38a14649c495d11f60ed131b7480c148411cd66","license":"MIT","scripts":{"dev":"vite","lint":"eslint . --ext .vue,.ts","build":"npm run typecheck && vite build && npm run build:css","build:css":"tailwindcss --input src/styles/bundled.css --output dist/style.css --minify","typecheck":"vue-tsc --noEmit","docs:build":"vite build --mode docs","prepublishOnly":"npm run build"},"version":"0.2.3","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8bdacb4c-6220-42cd-8572-19755ab65111"}},"homepage":"https://github.com/bluerobotics/BlueVue#readme","keywords":["vue","components","blueos","blue-robotics","tailwind"],"repository":{"url":"git+https://github.com/bluerobotics/BlueVue.git","type":"git"},"_npmVersion":"11.19.0","description":"Blue Robotics Vue components for common UI","directories":{},"maintainers":[{"name":"patrickelectric","email":"patrickelectric@gmail.com"},{"name":"arturomanzoli","email":"arturomanzoli@gmail.com"},{"name":"bluerobotics-software","email":"software@bluerobotics.com"}],"sideEffects":["*.css"],"_nodeVersion":"24.20.0","dependencies":{"@floating-ui/vue":"2.0.1"},"_hasShrinkwrap":false,"devDependencies":{"vue":"3.4.38","vite":"5.4.2","eslint":"8.57.0","vue-tsc":"2.0.29","typescript":"5.5.4","tailwindcss":"4.1.11","vite-plugin-dts":"4.5.4","@tailwindcss/cli":"4.1.11","@tailwindcss/vite":"4.1.11","eslint-plugin-vue":"9.27.0","@vitejs/plugin-vue":"5.1.3","@typescript-eslint/parser":"7.18.0","@typescript-eslint/eslint-plugin":"7.18.0"},"peerDependencies":{"vue":"^3.4","@mdi/font":">=7"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bluevue_0.2.3_1788556310480_0.5628278537619691"}}},"time":{"created":"2026-08-13T11:37:16.986Z","modified":"2026-09-04T21:11:50.938Z","0.1.0":"2026-08-13T11:37:17.341Z","0.1.1":"2026-08-13T12:10:28.650Z","0.2.0":"2026-08-14T12:54:45.191Z","0.2.1":"2026-08-18T18:42:28.839Z","0.2.2":"2026-09-04T16:59:36.717Z","0.2.3":"2026-09-04T21:11:50.569Z"},"bugs":{"url":"https://github.com/bluerobotics/BlueVue/issues"},"license":"MIT","homepage":"https://github.com/bluerobotics/BlueVue#readme","keywords":["vue","components","blueos","blue-robotics","tailwind"],"repository":{"url":"git+https://github.com/bluerobotics/BlueVue.git","type":"git"},"description":"Blue Robotics Vue components for common UI","maintainers":[{"name":"patrickelectric","email":"patrickelectric@gmail.com"},{"name":"arturomanzoli","email":"arturomanzoli@gmail.com"},{"name":"bluerobotics-software","email":"software@bluerobotics.com"}],"readme":"# BlueVue\n\nThe Blue Robotics look, for BlueOS extensions.\n\nA Vue 3 kit that gives an extension the page it is laid out on, the controls that go on it, the\ndialogs and notices it talks through, and the calls that reach BlueOS itself. It is built with\nTailwind and depends on no UI framework: Vue, the Material Design Icons font, and nothing else.\n\nEvery component has a page of its own, with a live demo and its API, in the\n[component gallery](https://bluerobotics.github.io/BlueVue/).\n\n## Install\n\n```bash\nnpm install @bluerobotics/bluevue\n```\n\nVue and [`@mdi/font`](https://pictogrammers.com/library/mdi/) are peer dependencies, so the app\nprovides them:\n\n```bash\nnpm install vue @mdi/font\n```\n\n## Use\n\n```ts\nimport '@mdi/font/css/materialdesignicons.css'\nimport '@bluerobotics/bluevue/style.css'\n```\n\nAn extension is a `BlueApp` with your panels inside it:\n\n```vue\n<script setup lang=\"ts\">\nimport { BlueApp, BlueExpansiblePanel, BlueInput, BlueSwitch, useBlueOs, useBlueSnackbar } from '@bluerobotics/bluevue'\nimport { ref } from 'vue'\n\nconst { vehicleName } = useBlueOs()\nconst { notify } = useBlueSnackbar()\n\nconst name = ref('BlueBoat')\nconst armed = ref(false)\n</script>\n\n<template>\n  <BlueApp :title=\"vehicleName ?? 'My extension'\">\n    <BlueExpansiblePanel title=\"Vehicle\" theme=\"dark\" :expanded=\"true\">\n      <BlueInput v-model=\"name\" name=\"name\" label=\"Name\" theme=\"dark\" />\n      <BlueSwitch v-model=\"armed\" name=\"armed\" label=\"Start armed\" label-on=\"Armed\" label-off=\"Safe\" theme=\"dark\" />\n    </BlueExpansiblePanel>\n  </BlueApp>\n</template>\n```\n\nEvery control takes a `theme` of `light` or `dark`. Extensions are dark.\n\n## Styles\n\nThere are two ways to get the styles in, depending on whether your app runs Tailwind.\n\n**Without Tailwind**, import the ready-made stylesheet. It carries the tokens, the component\nclasses and the Tailwind utilities the components use, and deliberately leaves out Tailwind's\nPreflight so it cannot reset your app's base styles:\n\n```ts\nimport '@bluerobotics/bluevue/style.css'\n```\n\n**With Tailwind v4**, let your own build compile the utilities, and import only the tokens and\ncomponent classes. This avoids shipping a second copy of the utilities you already have:\n\n```css\n@import \"tailwindcss\";\n@import \"@bluerobotics/bluevue/bluevue.css\";\n\n@source \"../node_modules/@bluerobotics/bluevue/dist\";\n```\n\nThe `@source` line is required: Tailwind does not scan `node_modules` unless it is told to, and\nwithout it the components' classes are never generated.\n\nDoing both works and costs only the duplicated utility bytes.\n\n### Theming\n\nThe colours and shadows are CSS custom properties, so an app can restate them, either in CSS or\nthrough `applyBlueTheme({ primary: '#0B5087' })`:\n\n```css\n:root {\n  --bluevue-primary: #0B5087;\n  --bluevue-error: #CF6679;\n  --bluevue-surface: #363636;\n  --bluevue-accent: #6699CC;\n}\n```\n\n## What is in it\n\n**The page**\n\n| Component | What it is |\n| --- | --- |\n| `BlueApp` | The whole page: backdrop, card, and the notices and waits mounted once |\n| `BlueCard` | The sheet a page is laid out on, with a title bar and a footer |\n| `BlueExpansiblePanel` | Titled section that collapses |\n| `BlueSection` | A subject inside a panel |\n\n**Controls**\n\n| Component | What it is |\n| --- | --- |\n| `BlueButton` | Filled, tonal, text or icon, with a loading state |\n| `BlueButtonGroup` | Segmented switch or multi-toggle, with an optional overflow menu |\n| `BlueCheckbox` | A plain yes or no, indeterminate included |\n| `BlueFileDrop` | A place to drop a file on, or press to choose one |\n| `BlueInput` | Text or number field, with a suffix, bounds and validation messages |\n| `BlueWindRose` | A heading, typed or pointed on a compass rose |\n| `BlueRadioGroup` | One choice out of a few, each spelled out |\n| `BlueSelect` | Single or multiple selection from a list |\n| `BlueSlider` | Range with a value pill, editable on double-click |\n| `BlueSwitch` | Two-state switch with its own labels |\n| `BlueTabs` | The strip that switches between the pages of a view |\n| `BlueTextarea` | A `BlueInput` with room for several lines |\n\n**Display**\n\n| Component | What it is |\n| --- | --- |\n| `BlueBanner` / `BlueBannerGroup` | A one-line note that expands, and a stack of them |\n| `BlueChip` | A small standing label: a state, a tag, a count |\n| `BlueIcon` | A Material Design Icon in a square box |\n| `BlueStat` | One read-only fact, in a row of them |\n| `BlueTable` | Rows of records under a header that stays put, ordered by pressing it |\n\n**Overlays**\n\n| Component | What it is |\n| --- | --- |\n| `BlueDialog` | The base every dialog is built on, over the native `<dialog>` |\n| `BlueConfirmDialog` | Asks before something irreversible |\n| `BlueStepsDialog` | Reports work of several steps, with its log |\n| `BlueMenu` | Action dropdown, anchored to an activator or to a pointer position |\n| `BluePromptDialog` | Asks for a name, and optionally a note |\n| `BlueTooltip` | A hint on hover or focus |\n\n**Feedback**\n\n| Component | What it is |\n| --- | --- |\n| `BlueLoadingDialog` | Blocking overlay, under a turning propeller, for an operation in progress |\n| `BlueProgressBar` | How far along something is, or that it is going at all |\n| `BlueSnackbar` | The corner notices are shown in, raised from anywhere |\n| `BlueSpinner` | A turning ring, for a wait with no measure |\n\n**Composables and helpers**\n\n| Export | What it does |\n| --- | --- |\n| `useBlueSnackbar` | Raises a notice, or reports a failed call, from anywhere |\n| `useBlueLoading` | Blocks the page while something is running |\n| `useBlueOs` | What the vehicle calls itself, its version, and its look |\n| `useBlueOsSetting` | A value kept on the vehicle rather than in this browser |\n| `blueOsService` | Any BlueOS service by name, with JSON and errors handled |\n| `useBluePopover` | The top-layer placement the menus and tooltips are built on |\n| `applyBlueTheme` | Restates the tokens at runtime |\n| `downloadJson` / `pickJsonFile` | Saves a profile to disk, and reads one back |\n\n## Browser support\n\nThe menus use the [popover API](https://developer.mozilla.org/docs/Web/API/Popover_API) and the\ndialogs use `<dialog>`, so they need Chrome 114, Edge 114, Firefox 125 or Safari 17 and up.\n\n## Develop\n\n```bash\nnpm install\nnpm run dev         # the gallery on http://localhost:8090\nnpm run build       # dist/bluevue.js, dist/index.d.ts and dist/style.css\nnpm run docs:build  # the gallery as a static site, in docs-dist\n```\n\n## Start an extension\n\n```bash\nnpx @bluerobotics/bluevue my-extension\n```\n\nThat copies a Vite + Vue frontend already wired to this package, a FastAPI backend that answers\n`/register_service` with `works_in_relative_paths`, a Dockerfile carrying the labels BlueOS\ninstalls from, and a GitHub workflow that builds the image.\n","readmeFilename":"README.md"}