{"_id":"@damien_ingrand/vueport","_rev":"3-83f930ecf2ae4203774164384843821e","name":"@damien_ingrand/vueport","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@damien_ingrand/vueport","version":"0.1.0","keywords":["vue","vue3","viewport","breakpoint","responsive","matchmedia","composable","pinia"],"author":{"name":"Damien Ingrand"},"license":"MIT","_id":"@damien_ingrand/vueport@0.1.0","maintainers":[{"name":"damien_ingrand","email":"damien.ingrand@gmail.com"}],"homepage":"https://github.com/damien-ingrand/vueport#readme","bugs":{"url":"https://github.com/damien-ingrand/vueport/issues"},"dist":{"shasum":"413728276950a9ed3e87a064f19101f09fc3e04e","tarball":"https://registry.npmjs.org/@damien_ingrand/vueport/-/vueport-0.1.0.tgz","fileCount":24,"integrity":"sha512-b/I+UalJ0m5fbE3KBNmGa9dHrr1dwBrNAWDuqztF8POVVFhR87Ig8JwBPJzUSmWTsYRCXQWhU6Nb/yWHph9ySw==","signatures":[{"sig":"MEQCICLiU+XBPp3qjPlJZCOTxVl5Oyt5dgpUr7QmS3rGiZchAiA4ZtC+P+JFG4WijdIRVTMFP7/jR+F4V9hHicQzNoBzhQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67491},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./core":{"types":"./dist/core.d.ts","import":"./dist/core.js","require":"./dist/core.cjs"},"./pinia":{"types":"./dist/pinia.d.ts","import":"./dist/pinia.js","require":"./dist/pinia.cjs"}},"gitHead":"880a3112ce01479ea860d7141d6a8647d47f9058","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"tsup","test:run":"vitest run","prepublishOnly":"npm run build"},"_npmUser":{"name":"damien_ingrand","email":"damien.ingrand@gmail.com"},"repository":{"url":"git+https://github.com/damien-ingrand/vueport.git","type":"git"},"_npmVersion":"10.9.0","description":"Reactive viewport breakpoint detection for Vue 3 and vanilla JS","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","tsup":"^8.0.0","jsdom":"^24.0.0","pinia":"^2.2.0","vitest":"^2.0.0","typescript":"^5.4.0","@vue/test-utils":"^2.4.0","@vitest/coverage-v8":"^2.1.9"},"peerDependencies":{"vue":">=3.3.0","pinia":">=2.1.0"},"peerDependenciesMeta":{"vue":{"optional":true},"pinia":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/vueport_0.1.0_1774748654613_0.7969148289712225","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@damien_ingrand/vueport","version":"0.1.1","keywords":["vue","vue3","viewport","breakpoint","responsive","matchmedia","composable","pinia"],"author":{"name":"Damien Ingrand"},"license":"MIT","_id":"@damien_ingrand/vueport@0.1.1","maintainers":[{"name":"damien_ingrand","email":"damien.ingrand@gmail.com"}],"homepage":"https://github.com/damien-ingrand/vueport#readme","bugs":{"url":"https://github.com/damien-ingrand/vueport/issues"},"dist":{"shasum":"f10a58447990c33e485847145d88b80ad6ffcbc6","tarball":"https://registry.npmjs.org/@damien_ingrand/vueport/-/vueport-0.1.1.tgz","fileCount":25,"integrity":"sha512-T4XvWiXA6nESaUMeM37TeFPJiyRnomQnZ9CmRx3X0vBGInmjCon2rgn7DJtYHB5phIfV6X/ODsUga/x0NXyV6w==","signatures":[{"sig":"MEUCICP2CYoyiyDsNRye26uHo6Ke03zn2c8zZYbj/GvO//xDAiEA/e4vSpsL3L2BJJ2aCX70MFavZL+9mVYupvJQpC4qaKo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68562},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./core":{"types":"./dist/core.d.ts","import":"./dist/core.js","require":"./dist/core.cjs"},"./pinia":{"types":"./dist/pinia.d.ts","import":"./dist/pinia.js","require":"./dist/pinia.cjs"}},"gitHead":"9d238e76d2593c9419f03bfc674f3a6897420fe7","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest","build":"tsup","test:run":"vitest run","prepublishOnly":"npm run build"},"_npmUser":{"name":"damien_ingrand","email":"damien.ingrand@gmail.com"},"repository":{"url":"git+https://github.com/damien-ingrand/vueport.git","type":"git"},"_npmVersion":"10.9.0","description":"Reactive viewport breakpoint detection for Vue 3 and vanilla JS","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","tsup":"^8.0.0","jsdom":"^24.0.0","pinia":"^2.2.0","vitest":"^2.0.0","typescript":"^5.4.0","@vue/test-utils":"^2.4.0","@vitest/coverage-v8":"^2.1.9"},"peerDependencies":{"vue":">=3.3.0","pinia":">=2.1.0"},"peerDependenciesMeta":{"vue":{"optional":true},"pinia":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/vueport_0.1.1_1774749325360_0.7960581275597767","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@damien_ingrand/vueport","version":"0.1.2","description":"Reactive viewport breakpoint detection for Vue 3 and vanilla JS","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./core":{"types":"./dist/core.d.ts","import":"./dist/core.js","require":"./dist/core.cjs"},"./pinia":{"types":"./dist/pinia.d.ts","import":"./dist/pinia.js","require":"./dist/pinia.cjs"}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest","test:run":"vitest run","lint":"eslint src/","prepublishOnly":"npm run build"},"publishConfig":{"access":"public"},"peerDependencies":{"pinia":">=2.1.0","vue":">=3.3.0"},"peerDependenciesMeta":{"vue":{"optional":true},"pinia":{"optional":true}},"devDependencies":{"@vitest/coverage-v8":"^2.1.9","@vue/test-utils":"^2.4.0","jsdom":"^24.0.0","pinia":"^2.2.0","tsup":"^8.0.0","typescript":"^5.4.0","vitest":"^2.0.0","vue":"^3.5.0"},"keywords":["vue","vue3","viewport","breakpoint","responsive","matchmedia","composable","pinia"],"author":{"name":"Damien Ingrand"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/damien-ingrand/vueport.git"},"_id":"@damien_ingrand/vueport@0.1.2","gitHead":"0a1cfa969f59ffad8b775023e017f5ab0effa787","bugs":{"url":"https://github.com/damien-ingrand/vueport/issues"},"homepage":"https://github.com/damien-ingrand/vueport#readme","_nodeVersion":"22.12.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-3nFMlu1vlhZZsjrKkcUYfqbxFHJZA5ilKT5+OuqlE770TeC1lD0Ejs8nGkwALbUIbEvamTrR5yiTLsCldu0uTQ==","shasum":"5e2f0684bf6312e0541f8b3bab05c238e3334adc","tarball":"https://registry.npmjs.org/@damien_ingrand/vueport/-/vueport-0.1.2.tgz","fileCount":25,"unpackedSize":68722,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBk79q/R1Gsx8iw3aFxs5MXjHAgf9mr6yXaLjF00IPqOAiB6HxoYAjPoM8aXTMO9zviS/UkpkDsXovv5F65ovimKXQ=="}]},"_npmUser":{"name":"damien_ingrand","email":"damien.ingrand@gmail.com"},"directories":{},"maintainers":[{"name":"damien_ingrand","email":"damien.ingrand@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vueport_0.1.2_1775240852026_0.6319418001285051"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-29T01:44:14.503Z","modified":"2026-04-03T18:27:32.289Z","0.1.0":"2026-03-29T01:44:14.788Z","0.1.1":"2026-03-29T01:55:25.511Z","0.1.2":"2026-04-03T18:27:32.175Z"},"bugs":{"url":"https://github.com/damien-ingrand/vueport/issues"},"author":{"name":"Damien Ingrand"},"license":"MIT","homepage":"https://github.com/damien-ingrand/vueport#readme","keywords":["vue","vue3","viewport","breakpoint","responsive","matchmedia","composable","pinia"],"repository":{"type":"git","url":"git+https://github.com/damien-ingrand/vueport.git"},"description":"Reactive viewport breakpoint detection for Vue 3 and vanilla JS","maintainers":[{"name":"damien_ingrand","email":"damien.ingrand@gmail.com"}],"readme":"# vueport\n\n[![CI](https://github.com/DamienIngrand/vueport/actions/workflows/ci.yml/badge.svg)](https://github.com/DamienIngrand/vueport/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/DamienIngrand/vueport/graph/badge.svg)](https://codecov.io/gh/DamienIngrand/vueport)\n[![npm version](https://img.shields.io/npm/v/@damien_ingrand/vueport.svg)](https://www.npmjs.com/package/@damien_ingrand/vueport)\n[![license](https://img.shields.io/github/license/DamienIngrand/vueport.svg)](https://github.com/DamienIngrand/vueport/blob/main/LICENSE)\n\nReactive viewport breakpoint detection for Vue 3 and vanilla JS. Uses `window.matchMedia` for reliable, performant breakpoint tracking with zero DOM injection.\n\n## Install\n\n```bash\nnpm install @damien_ingrand/vueport\n# or\nyarn add @damien_ingrand/vueport\n```\n\n## Usage\n\n### Vue 3 Composable\n\n```vue\n<script setup>\nimport { useVueport } from '@damien_ingrand/vueport'\n\nconst { breakpoint, is, isMobile, isDesktop } = useVueport()\n\nconst isLarge = is('>=lg')\n</script>\n\n<template>\n  <p>Current: {{ breakpoint }}</p>\n  <nav v-if=\"isDesktop\">Desktop nav</nav>\n  <nav v-else>Mobile nav</nav>\n  <aside v-if=\"isLarge.value\">Sidebar</aside>\n</template>\n```\n\n### Pinia Store\n\n```ts\nimport { useVueportStore } from '@damien_ingrand/vueport/pinia'\n\nconst vueport = useVueportStore()\nvueport.init()\n\n// Reactive in templates and computed\nvueport.breakpoint  // 'lg'\nvueport.is('>=md')  // true\nvueport.isMobile    // false\n```\n\n### Vanilla JS\n\n```ts\nimport { createVueport } from '@damien_ingrand/vueport/core'\n\nconst vueport = createVueport()\n\nvueport.current    // 'lg'\nvueport.is('>=md') // true\nvueport.isMobile   // true\n\nvueport.onChange((current, previous) => {\n  console.log(`${previous} → ${current}`)\n})\n```\n\n## Expression Syntax\n\nThe `is()` method accepts an intuitive expression syntax:\n\n| Expression | Meaning |\n|---|---|\n| `'md'` or `'==md'` | Exactly md |\n| `'>sm'` | Greater than sm |\n| `'<lg'` | Less than lg |\n| `'>=md'` | Greater than or equal to md |\n| `'<=sm'` | Less than or equal to sm |\n| `'!=xs'` | Not xs |\n\n## Custom Breakpoints\n\n```ts\nimport { useVueport } from '@damien_ingrand/vueport'\n\nconst { breakpoint } = useVueport({\n  breakpoints: {\n    mobile: 0,\n    tablet: 640,\n    desktop: 1024,\n    wide: 1440,\n  },\n})\n```\n\n## Default Breakpoints\n\n| Name | Min width |\n|---|---|\n| `xs` | 0px |\n| `sm` | 576px |\n| `md` | 768px |\n| `lg` | 992px |\n| `xl` | 1200px |\n\n## API\n\n### `useVueport(options?)`\n\nVue 3 composable. Returns:\n\n- `breakpoint` — `Ref<string>` current breakpoint\n- `is(expr)` — `ComputedRef<boolean>` reactive expression check\n- `isMobile` — `ComputedRef<boolean>` (xs or sm)\n- `isTablet` — `ComputedRef<boolean>` (md)\n- `isDesktop` — `ComputedRef<boolean>` (lg or xl)\n\n### `useVueportStore()` (from `@damien_ingrand/vueport/pinia`)\n\nPinia store. Call `init(options?)` before use. Same reactive properties.\n\n### `createVueport(options?)` (from `@damien_ingrand/vueport/core`)\n\nVanilla JS. Returns a `Vueport` instance:\n\n- `current` — current breakpoint name\n- `is(expr)` — boolean expression check\n- `isMobile` / `isTablet` / `isDesktop` — boolean getters\n- `onChange(fn)` — subscribe to changes, returns unsubscribe function\n- `destroy()` — cleanup all listeners\n\n## License\n\nMIT\n","readmeFilename":"README.md"}