{"_id":"@boobstrap/boobstrap","_rev":"12-96549b496bbed88263d443eb6c42d1f5","name":"@boobstrap/boobstrap","dist-tags":{"latest":"0.7.0"},"versions":{"0.1.1":{"name":"@boobstrap/boobstrap","version":"0.1.1","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.1.1","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.mroq.dev/docs.html","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"51ba51bd35f14ee3cccd2b1790db25a3b4728252","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.1.1.tgz","fileCount":19,"integrity":"sha512-db5MHvfcV4uCy/fOWUiQDWmfeFzf5XOystYHLnOKwKhgaV+k4fzLWeIhGNmRlJJT+kpLJh+mTu09n8FRPwjeqQ==","signatures":[{"sig":"MEUCIELgWtMAmFW+mmQlaDaZtzap76HbgyAUIqR4MWBtjgKyAiEA8/Tpclw6PO9HFVAYJE3jp7Vrb8B3M9/pvm1dm0uib8M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40479},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./css":"./dist/boobstrap.css","./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"6b3f346a4b2ff4005add498eb0ff33c275d96d0c","scripts":{"test":"npm run build && npm run test:contract && npm run test:css && npm run test:browser && npm run test:package","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:browser":"node tests/browser.mjs","test:package":"node scripts/verify-package.mjs","test:contract":"node scripts/verify-framework.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.1","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.1.1_1786054079216_0.7440548862283725","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@boobstrap/boobstrap","version":"0.1.2","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.1.2","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.org/docs.html","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"7fe21745c2e85b800bb35c087bc107c6e2a29f4e","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.1.2.tgz","fileCount":19,"integrity":"sha512-VOnVj4fzteVv66vCs3Knfo2e65+s0oSEiLGpDHq8i9HZNaYQ0Z3O72TvDfiSbBjKM/b3E7NONw9lgx1OsU0FvQ==","signatures":[{"sig":"MEQCICtyxTDmwqkBBSBo7tLzON4FEsn4fwHiqYfh/UEF1xnQAiBtZEbMGCDbabvWx5cUL8S8uJhlK7xcW2QDcWdT7FWVRQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40515},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./css":"./dist/boobstrap.css","./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"c113713794edb3818ab321dcd1711b5c6fcf5997","scripts":{"test":"npm run build && npm run test:contract && npm run test:css && npm run test:browser && npm run test:package","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:browser":"node tests/browser.mjs","test:package":"node scripts/verify-package.mjs","test:contract":"node scripts/verify-framework.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.1","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.1.2_1786056475431_0.44483836093441065","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@boobstrap/boobstrap","version":"0.1.3","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.1.3","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.org/docs.html","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"86bd088495bb01c4d5b12c3f0decc8bb2c78d1ea","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.1.3.tgz","fileCount":19,"integrity":"sha512-0B/Zywl2bd2iLBEoshj+431Gz9dWfCBR2WHHhaPBKpgdBNuVyHa9fV4Pq3D9TKUCtLrW+gjqLpNyCuKpUP6ZXw==","signatures":[{"sig":"MEUCIDHpijzV/1VcOLsMtdGb6F7dTbW7o+jwwLkvuhnhva9GAiEAv2KahoSOl6P8RBnQ+JE3dcCjEmz/Dx10bfNOI1fRSMg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40871},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./css":"./dist/boobstrap.css","./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"605db6e4704b30c2275bcf588d2d914aeb8164be","scripts":{"test":"npm run build && npm run test:contract && npm run test:css && npm run test:browser && npm run test:package","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:browser":"node tests/browser.mjs","test:package":"node scripts/verify-package.mjs","test:contract":"node scripts/verify-framework.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.1","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.1.3_1786058824692_0.36930484478114645","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@boobstrap/boobstrap","version":"0.1.4","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.1.4","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.org/docs.html","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"978448f93b0c61781771cbb9bf9f721e8a138069","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.1.4.tgz","fileCount":20,"integrity":"sha512-2aP/CUB6k+oZ+ZtGmEZfyigqyv2V43Wj7wwcQlA2/OZdbUrDEregnfqA8STII75A95wwFlEQ+9hwYlyGg+N7bA==","signatures":[{"sig":"MEUCICxI4x54whg2Drh9LpPSqZvEj+hQryA9aJck18+xWFsrAiEApil7y/0puncpsWpTybOsErwdeaC+jjV547pVXlrPk74=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42263},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./css":"./dist/boobstrap.css","./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"0f53240c35748283b2a54a15e025452372feb8d9","scripts":{"test":"npm run build && npm run test:contract && npm run test:css && npm run test:browser && npm run test:package","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:browser":"node tests/browser.mjs","test:package":"node scripts/verify-package.mjs","test:contract":"node scripts/verify-framework.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.1","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.1.4_1786060697270_0.1757971922118522","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@boobstrap/boobstrap","version":"0.2.0","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.2.0","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.org/docs","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"f13918f4dfc82dbdaacd7a95f9ee0525c1313098","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.2.0.tgz","fileCount":34,"integrity":"sha512-uJvW+84mh4//OmhjSphyXyNRwLo+JcRJZzm7i95nwoxrp5BgJ2wcomhn9w0jvWiVSlhevz37yUbYVWGb0rE2cQ==","signatures":[{"sig":"MEUCIGRg5XNjUorGMSp1TIRW05vCJHSqvBmgRgrNQgXr/S8QAiEA0/zVR2mF55ZIygjN1ekD7UozhyMmZA4bFB4b1sZ/2jo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boobstrap%2fboobstrap@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":78353},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./js":"./dist/boobstrap.js","./css":"./dist/boobstrap.css","./js/tabs":"./dist/js/tabs.js","./js/collapse":"./dist/js/collapse.js","./js/dropdown":"./dist/js/dropdown.js","./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"c67afd1c6cffd331d0cd8e6feef676a83121bc8c","scripts":{"test":"npm run build && npm run test:contract && npm run test:css && npm run test:browser && npm run test:package && npm run test:starter","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:browser":"node tests/browser.mjs && node tests/interactions.mjs && node tests/alpine.mjs","test:package":"node scripts/verify-package.mjs && node scripts/verify-alpine-package.mjs","test:starter":"npm --prefix examples/starter ci && npm --prefix examples/starter run validate","test:contract":"node scripts/verify-framework.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"workspaces":["packages/*"],"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"alpinejs":"^3.15.12","playwright":"^1.62.1","@alpinejs/csp":"^3.15.12","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.2.0_1786122624730_0.0014205219393876867","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@boobstrap/boobstrap","version":"0.2.1","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.2.1","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.org/docs","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"f14c4f742a43a27d54cbdf067f30506114762e99","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.2.1.tgz","fileCount":34,"integrity":"sha512-ayU6fYNtXk//cILmyFKfU2bOrdr4xwuBwQIOffsia1s+9JRDCsMXzNlFryQGImFA1xNPdKZ23soekshCZpPwig==","signatures":[{"sig":"MEUCIQCBCmoz5tPijuzBkH/DVVWPcXkScffD0mXRD5xjYWL3FgIgES6xC6Zs0Y5HkTqlU52tb3se5YTtf7Icd5V6eVo32+k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boobstrap%2fboobstrap@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":81734},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./js":"./dist/boobstrap.js","./css":"./dist/boobstrap.css","./js/tabs":"./dist/js/tabs.js","./js/collapse":"./dist/js/collapse.js","./js/dropdown":"./dist/js/dropdown.js","./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"5bca09e7bf3cad4e74821499414145fbf4795f7b","scripts":{"test":"npm run build && npm run test:contract && npm run test:css && npm run test:browser && npm run test:package && npm run test:starter","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:types":"tsc --noEmit --strict --jsx react-jsx --module NodeNext --moduleResolution NodeNext --target ES2022 --lib ES2022,DOM --skipLibCheck tests/react-types.tsx","test:browser":"node tests/browser.mjs && node tests/interactions.mjs && node tests/alpine.mjs && node tests/react.mjs","test:package":"node scripts/verify-package.mjs && node scripts/verify-alpine-package.mjs && node scripts/verify-react-package.mjs && npm run test:types","test:starter":"npm --prefix examples/starter ci && npm --prefix examples/starter run validate","test:contract":"node scripts/verify-framework.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"workspaces":["packages/*"],"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.8","esbuild":"^0.28.1","alpinejs":"^3.15.12","react-dom":"^19.2.8","playwright":"^1.62.1","typescript":"^7.0.2","@types/react":"^19.2.18","@alpinejs/csp":"^3.15.12","@types/react-dom":"^19.2.4","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.2.1_1786127769155_0.30235524331664343","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@boobstrap/boobstrap","version":"0.3.0","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.3.0","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.org/docs","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"2b47a767745beb82e8132fa905d43629a25ad9cc","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.3.0.tgz","fileCount":36,"integrity":"sha512-jLRBQ+YOIKja6W7Ixpo2dr9QVx/Z0cImgdnlWEGl6B7mVHbt5S5Jc2jZubUG7hl1m2re+QOnJjySlrGMVFpEfg==","signatures":[{"sig":"MEQCIFHbHoFD0J5Mkbfz9J8c5f3cTA94DvXCi1vAau5ey+NOAiB31r4subzaHLWMA0mTSGkUmEgFFioizpth0DrIL6YthA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boobstrap%2fboobstrap@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":98787},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./js":"./dist/boobstrap.js","./css":"./dist/boobstrap.css","./js/tabs":"./dist/js/tabs.js","./js/button":"./dist/js/button.js","./js/collapse":"./dist/js/collapse.js","./js/dropdown":"./dist/js/dropdown.js","./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"9799f1ab669c87d7e93bb4eaa8338cb0692e0095","scripts":{"test":"npm run build && npm run test:contract && npm run test:css && npm run test:browser && npm run test:package && npm run test:starter","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:types":"tsc --noEmit --strict --jsx react-jsx --module NodeNext --moduleResolution NodeNext --target ES2022 --lib ES2022,DOM --skipLibCheck tests/react-types.tsx","test:browser":"node tests/browser.mjs && node tests/interactions.mjs && node tests/alpine.mjs && node tests/react.mjs","test:package":"node scripts/verify-package.mjs && node scripts/verify-alpine-package.mjs && node scripts/verify-react-package.mjs && npm run test:types","test:starter":"npm --prefix examples/starter ci && npm --prefix examples/starter run validate","test:contract":"node scripts/verify-framework.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"workspaces":["packages/*"],"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.8","esbuild":"^0.28.1","alpinejs":"^3.15.12","react-dom":"^19.2.8","playwright":"^1.62.1","typescript":"^7.0.2","@types/react":"^19.2.18","@alpinejs/csp":"^3.15.12","@types/react-dom":"^19.2.4","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.3.0_1786150567701_0.22726546127892955","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@boobstrap/boobstrap","version":"0.3.1","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.3.1","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.org/docs","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"7f6b0cb692b2bcda7cd554875ec92b4ba7585388","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.3.1.tgz","fileCount":36,"integrity":"sha512-+H7WDbpqt8Ltjt2j9E82JUyqusqSbRj1+pNKliNrJq4Aj8wbAj8shmFtDQKQLFmbg5cs0v7s1nejIPMmvNfqlw==","signatures":[{"sig":"MEQCICP2537gSgGQqnmKiWy+VsTf9765qQNRuELQ4Fwt+iU4AiAisROKtVKubXWo5WMO3RqkSceCUyVe/hsSknDKUzmXvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boobstrap%2fboobstrap@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":98739},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./js":"./dist/boobstrap.js","./css":"./dist/boobstrap.css","./js/tabs":"./dist/js/tabs.js","./js/button":"./dist/js/button.js","./js/collapse":"./dist/js/collapse.js","./js/dropdown":"./dist/js/dropdown.js","./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"f06d1c36f107428f06ed4deed96a91459c2a319e","scripts":{"test":"npm run build && npm run test:contract && npm run test:css && npm run test:browser && npm run test:package && npm run test:starter","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:types":"tsc --noEmit --strict --jsx react-jsx --module NodeNext --moduleResolution NodeNext --target ES2022 --lib ES2022,DOM --skipLibCheck tests/react-types.tsx","test:browser":"node tests/browser.mjs && node tests/interactions.mjs && node tests/alpine.mjs && node tests/react.mjs","test:package":"node scripts/verify-package.mjs && node scripts/verify-alpine-package.mjs && node scripts/verify-react-package.mjs && npm run test:types","test:starter":"npm --prefix examples/starter ci && npm --prefix examples/starter run validate","test:contract":"node scripts/verify-framework.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"workspaces":["packages/*"],"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.8","esbuild":"^0.28.1","alpinejs":"^3.15.12","react-dom":"^19.2.8","playwright":"^1.62.1","typescript":"^7.0.2","@types/react":"^19.2.18","@alpinejs/csp":"^3.15.12","@types/react-dom":"^19.2.4","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.3.1_1786151264793_0.5028322305933495","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@boobstrap/boobstrap","version":"0.4.0","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.4.0","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.org/docs","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"559e4c4d3f91363b647e46d9189e849b3611aecd","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.4.0.tgz","fileCount":56,"integrity":"sha512-1DeKBG8HqvYWFw/1sHnUTmcqd3kYPJ0O3MfuLcJ51mj7DL1zMj4jDtvoAuWP5xrgcCLQ2pcGal/TV5lWq0ppMQ==","signatures":[{"sig":"MEUCIBqTVfaeEgoeLr3ynsQb2EqT4E+uGefRWu2HL737G6pHAiEA4WNjjhJ0cFqTgriEl8qYqsTHUH0R6KIa9Vmzn3X11hc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boobstrap%2fboobstrap@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":305351},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./js":"./dist/boobstrap.js","./css":"./dist/boobstrap.css","./js/otp":"./dist/js/otp.js","./js/tabs":"./dist/js/tabs.js","./js/banner":"./dist/js/banner.js","./js/button":"./dist/js/button.js","./js/dialog":"./dist/js/dialog.js","./js/sidebar":"./dist/js/sidebar.js","./js/collapse":"./dist/js/collapse.js","./js/combobox":"./dist/js/combobox.js","./js/dropdown":"./dist/js/dropdown.js","./js/password":"./dist/js/password.js","./js/input-mask":"./dist/js/input-mask.js","./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"eb359150061b2d4b969f3dc55fc911107377b6c7","scripts":{"test":"npm run build && npm run test:contract && npm run test:css && npm run test:browser && npm run test:package && npm run test:starter","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:types":"tsc --noEmit --strict --jsx react-jsx --module NodeNext --moduleResolution NodeNext --target ES2022 --lib ES2022,DOM --skipLibCheck tests/react-types.tsx","test:browser":"node tests/browser.mjs && node tests/interactions.mjs && node tests/alpine.mjs && node tests/react.mjs","test:package":"node scripts/verify-package.mjs && node scripts/verify-alpine-package.mjs && node scripts/verify-react-package.mjs && npm run test:types","test:starter":"npm --prefix examples/starter ci && npm --prefix examples/starter run validate","test:contract":"node scripts/verify-framework.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"workspaces":["packages/*"],"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.8","esbuild":"^0.28.1","alpinejs":"^3.15.12","react-dom":"^19.2.8","playwright":"^1.62.1","typescript":"^7.0.2","@types/react":"^19.2.18","@alpinejs/csp":"^3.15.12","@types/react-dom":"^19.2.4","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.4.0_1786571910319_0.5885405628424014","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@boobstrap/boobstrap","version":"0.5.0","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.5.0","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.org/docs","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"609744b709344c4aff792610fb8a2fab57dfd4a5","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.5.0.tgz","fileCount":81,"integrity":"sha512-/Xd2lAqfY1lMeyJqpe16+s8p0arm1zeDrkm5v2AqZoh8y6mcu0Tby5XmsiTaUkHKmvNBuJxeWaIJBuPfXu0HGw==","signatures":[{"sig":"MEUCIQDVcwNB68AZs8N82Dbz4XCvdrKkMGOLgIoTLwG35NPNtwIgW6MuA5L4voi2e/f4YnMsfjWUTKTxCC8aDfXVqtb9zX8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boobstrap%2fboobstrap@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":461692},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./js":{"types":"./dist/boobstrap.d.ts","default":"./dist/boobstrap.js"},"./css":"./dist/boobstrap.css","./js/otp":{"types":"./dist/js/index.d.ts","default":"./dist/js/otp.js"},"./tokens":{"types":"./dist/tokens.d.ts","default":"./dist/tokens.js"},"./js/tabs":{"types":"./dist/js/index.d.ts","default":"./dist/js/tabs.js"},"./js/toast":{"types":"./dist/js/index.d.ts","default":"./dist/js/toast.js"},"./js/banner":{"types":"./dist/js/index.d.ts","default":"./dist/js/banner.js"},"./js/button":{"types":"./dist/js/index.d.ts","default":"./dist/js/button.js"},"./js/dialog":{"types":"./dist/js/index.d.ts","default":"./dist/js/dialog.js"},"./js/popover":{"types":"./dist/js/index.d.ts","default":"./dist/js/popover.js"},"./js/sidebar":{"types":"./dist/js/index.d.ts","default":"./dist/js/sidebar.js"},"./js/tooltip":{"types":"./dist/js/index.d.ts","default":"./dist/js/tooltip.js"},"./js/collapse":{"types":"./dist/js/index.d.ts","default":"./dist/js/collapse.js"},"./js/combobox":{"types":"./dist/js/index.d.ts","default":"./dist/js/combobox.js"},"./js/dropdown":{"types":"./dist/js/index.d.ts","default":"./dist/js/dropdown.js"},"./js/password":{"types":"./dist/js/index.d.ts","default":"./dist/js/password.js"},"./tokens.json":"./dist/tokens.json","./js/accordion":{"types":"./dist/js/index.d.ts","default":"./dist/js/accordion.js"},"./js/input-mask":{"types":"./dist/js/index.d.ts","default":"./dist/js/input-mask.js"},"./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"59e6a5326e717cf683c435563fe9554fa3a61d37","scripts":{"test":"npm run build && npm run test:contract && npm run test:conformance && npm run test:docs && npm run test:css && npm run test:browser && npm run test:visual && npm run test:package && npm run test:starter","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:docs":"node scripts/verify-docs.mjs","test:types":"tsc --noEmit --strict --jsx react-jsx --module NodeNext --moduleResolution NodeNext --target ES2022 --lib ES2022,DOM --skipLibCheck tests/core-types.ts tests/alpine-types.ts tests/react-types.tsx tests/vue-types.ts","test:visual":"node tests/visual.mjs","test:browser":"node tests/browser.mjs && node tests/interactions.mjs && node tests/alpine.mjs && node tests/react.mjs && node tests/vue.mjs","test:package":"node scripts/verify-package.mjs && node scripts/verify-alpine-package.mjs && node scripts/verify-react-package.mjs && node scripts/verify-vue-package.mjs && npm run test:types","test:starter":"npm --prefix examples/starter ci && npm --prefix examples/starter run validate","test:contract":"node scripts/verify-framework.mjs","test:conformance":"node scripts/verify-interaction-contract.mjs","test:visual:update":"UPDATE_VISUAL=1 node tests/visual.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"workspaces":["packages/*"],"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","pngjs":"7.0.0","react":"^19.2.8","esbuild":"^0.28.1","alpinejs":"^3.15.12","react-dom":"^19.2.8","pixelmatch":"7.1.0","playwright":"^1.62.1","typescript":"^7.0.2","@types/react":"^19.2.18","@alpinejs/csp":"^3.15.12","@types/react-dom":"^19.2.4","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.5.0_1786661888599_0.5512534634483359","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@boobstrap/boobstrap","version":"0.6.0","keywords":["css","framework","components","utilities"],"license":"MIT","_id":"@boobstrap/boobstrap@0.6.0","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"homepage":"https://boobstrap.org/docs","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"dist":{"shasum":"3add33a3b285c527f9ae90b911f708bbad2c0f2e","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.6.0.tgz","fileCount":92,"integrity":"sha512-5q0gPW/bl63hKvn8aZw4n4+14/OTrlESyPd9GTfBFwJLtBdgs/NG13uaICe3ciMaCFXWea+Vrz11ihc+ZU8ZkA==","signatures":[{"sig":"MEUCIFksr8Yz6mzHooAzcH7cgAlZBOunQ7u2AX+CPpGX14ChAiEAwa29KVKaFAykqmCpq3nbZm5TLaM/J+4e/kM8+GdWZHo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boobstrap%2fboobstrap@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1023251},"type":"module","style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./js":{"types":"./dist/boobstrap.d.ts","default":"./dist/boobstrap.js"},"./css":"./dist/boobstrap.css","./js/otp":{"types":"./dist/js/index.d.ts","default":"./dist/js/otp.js"},"./tokens":{"types":"./dist/tokens.d.ts","default":"./dist/tokens.js"},"./js/tabs":{"types":"./dist/js/index.d.ts","default":"./dist/js/tabs.js"},"./min.css":"./dist/boobstrap.min.css","./js/toast":{"types":"./dist/js/index.d.ts","default":"./dist/js/toast.js"},"./js/banner":{"types":"./dist/js/index.d.ts","default":"./dist/js/banner.js"},"./js/button":{"types":"./dist/js/index.d.ts","default":"./dist/js/button.js"},"./js/dialog":{"types":"./dist/js/index.d.ts","default":"./dist/js/dialog.js"},"./js/navbar":{"types":"./dist/js/index.d.ts","default":"./dist/js/navbar.js"},"./js/popover":{"types":"./dist/js/index.d.ts","default":"./dist/js/popover.js"},"./js/sidebar":{"types":"./dist/js/index.d.ts","default":"./dist/js/sidebar.js"},"./js/tooltip":{"types":"./dist/js/index.d.ts","default":"./dist/js/tooltip.js"},"./js/collapse":{"types":"./dist/js/index.d.ts","default":"./dist/js/collapse.js"},"./js/combobox":{"types":"./dist/js/index.d.ts","default":"./dist/js/combobox.js"},"./js/dropdown":{"types":"./dist/js/index.d.ts","default":"./dist/js/dropdown.js"},"./js/password":{"types":"./dist/js/index.d.ts","default":"./dist/js/password.js"},"./tokens.json":"./dist/tokens.json","./js/accordion":{"types":"./dist/js/index.d.ts","default":"./dist/js/accordion.js"},"./js/scrollspy":{"types":"./dist/js/index.d.ts","default":"./dist/js/scrollspy.js"},"./js/input-mask":{"types":"./dist/js/index.d.ts","default":"./dist/js/input-mask.js"},"./dist/boobstrap.css":"./dist/boobstrap.css"},"gitHead":"94c2031c90a30e10a4ff4728c6ccf6680c38ba58","scripts":{"test":"npm run build && npm run test:contract && npm run test:conformance && npm run test:docs && npm run test:css && npm run test:size && npm run test:browser && npm run test:visual && npm run test:package && npm run test:starter","build":"node scripts/build-framework.mjs","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build","test:css":"csstree-validator dist/boobstrap.css","test:docs":"node scripts/verify-docs.mjs","test:size":"node scripts/verify-size.mjs","test:types":"tsc --noEmit --strict --jsx react-jsx --module NodeNext --moduleResolution NodeNext --target ES2022 --lib ES2022,DOM --skipLibCheck tests/core-types.ts tests/alpine-types.ts tests/react-types.tsx tests/vue-types.ts","test:visual":"node tests/visual.mjs","test:browser":"node tests/browser.mjs && node tests/rtl.mjs && node tests/a11y.mjs && node tests/interactions.mjs && node tests/alpine.mjs && node tests/react.mjs && node tests/vue.mjs","test:package":"node scripts/verify-package.mjs && node scripts/verify-alpine-package.mjs && node scripts/verify-react-package.mjs && node scripts/verify-vue-package.mjs && npm run test:types","test:starter":"npm --prefix examples/starter ci && npm --prefix examples/starter run validate","test:contract":"node scripts/verify-framework.mjs","test:conformance":"node scripts/verify-interaction-contract.mjs","test:visual:update":"UPDATE_VISUAL=1 node tests/visual.mjs"},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"repository":{"url":"git+https://github.com/mikeroq/boobstrap-framework.git","type":"git"},"workspaces":["packages/*"],"_npmVersion":"10.9.8","description":"A cheeky CSS framework that still means business.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","pngjs":"7.0.0","react":"^19.2.8","esbuild":"^0.28.1","alpinejs":"^3.15.12","react-dom":"^19.2.8","pixelmatch":"7.1.0","playwright":"^1.62.1","typescript":"^7.0.2","@types/react":"^19.2.18","@alpinejs/csp":"^3.15.12","@types/react-dom":"^19.2.4","csstree-validator":"^4.0.1","@axe-core/playwright":"^4.12.1"},"_npmOperationalInternal":{"tmp":"tmp/boobstrap_0.6.0_1787367415977_0.9681134718920608","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@boobstrap/boobstrap","version":"0.7.0","description":"A cheeky CSS framework that still means business.","type":"module","workspaces":["packages/*"],"sideEffects":["**/*.css"],"style":"dist/boobstrap.css","exports":{".":"./dist/boobstrap.css","./css":"./dist/boobstrap.css","./min.css":"./dist/boobstrap.min.css","./dist/boobstrap.css":"./dist/boobstrap.css","./js":{"types":"./dist/boobstrap.d.ts","default":"./dist/boobstrap.js"},"./js/accordion":{"types":"./dist/js/index.d.ts","default":"./dist/js/accordion.js"},"./js/banner":{"types":"./dist/js/index.d.ts","default":"./dist/js/banner.js"},"./js/button":{"types":"./dist/js/index.d.ts","default":"./dist/js/button.js"},"./js/collapse":{"types":"./dist/js/index.d.ts","default":"./dist/js/collapse.js"},"./js/combobox":{"types":"./dist/js/index.d.ts","default":"./dist/js/combobox.js"},"./js/dropdown":{"types":"./dist/js/index.d.ts","default":"./dist/js/dropdown.js"},"./js/dialog":{"types":"./dist/js/index.d.ts","default":"./dist/js/dialog.js"},"./js/input-mask":{"types":"./dist/js/index.d.ts","default":"./dist/js/input-mask.js"},"./js/navbar":{"types":"./dist/js/index.d.ts","default":"./dist/js/navbar.js"},"./js/otp":{"types":"./dist/js/index.d.ts","default":"./dist/js/otp.js"},"./js/password":{"types":"./dist/js/index.d.ts","default":"./dist/js/password.js"},"./js/popover":{"types":"./dist/js/index.d.ts","default":"./dist/js/popover.js"},"./js/scrollspy":{"types":"./dist/js/index.d.ts","default":"./dist/js/scrollspy.js"},"./js/sidebar":{"types":"./dist/js/index.d.ts","default":"./dist/js/sidebar.js"},"./js/tabs":{"types":"./dist/js/index.d.ts","default":"./dist/js/tabs.js"},"./js/toast":{"types":"./dist/js/index.d.ts","default":"./dist/js/toast.js"},"./js/tooltip":{"types":"./dist/js/index.d.ts","default":"./dist/js/tooltip.js"},"./tokens":{"types":"./dist/tokens.d.ts","default":"./dist/tokens.js"},"./tokens.json":"./dist/tokens.json"},"scripts":{"build":"node scripts/build-framework.mjs","test":"npm run build && npm run test:contract && npm run test:conformance && npm run test:docs && npm run test:css && npm run test:size && npm run test:browser && npm run test:visual && npm run test:package && npm run test:starter","test:contract":"node scripts/verify-framework.mjs","test:size":"node scripts/verify-size.mjs","test:conformance":"node scripts/verify-interaction-contract.mjs","test:docs":"node scripts/verify-docs.mjs","test:css":"csstree-validator dist/boobstrap.css","test:browser":"node tests/browser.mjs && node tests/rtl.mjs && node tests/a11y.mjs && node tests/interactions.mjs && node tests/alpine.mjs && node tests/react.mjs && node tests/vue.mjs","test:visual":"node tests/visual.mjs","test:visual:update":"UPDATE_VISUAL=1 node tests/visual.mjs","test:package":"node scripts/verify-package.mjs && node scripts/verify-alpine-package.mjs && node scripts/verify-react-package.mjs && node scripts/verify-vue-package.mjs && npm run test:types","test:types":"tsc --noEmit --strict --jsx react-jsx --module NodeNext --moduleResolution NodeNext --target ES2022 --lib ES2022,DOM --skipLibCheck tests/core-types.ts tests/alpine-types.ts tests/react-types.tsx tests/vue-types.ts","test:starter":"npm --prefix examples/starter ci && npm --prefix examples/starter run validate","prepack":"npm run build && npm run test:contract && npm run test:css","prepare":"npm run build"},"keywords":["css","framework","components","utilities"],"repository":{"type":"git","url":"git+https://github.com/mikeroq/boobstrap-framework.git"},"homepage":"https://boobstrap.org/docs","bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"license":"MIT","devDependencies":{"@alpinejs/csp":"^3.15.12","@axe-core/playwright":"^4.12.1","@types/react":"^19.2.18","@types/react-dom":"^19.2.4","alpinejs":"^3.15.12","csstree-validator":"^4.0.1","esbuild":"^0.28.1","pixelmatch":"7.1.0","playwright":"^1.62.1","pngjs":"7.0.0","react":"^19.2.8","react-dom":"^19.2.8","typescript":"^7.0.2","vue":"^3.5.0"},"_id":"@boobstrap/boobstrap@0.7.0","gitHead":"a7f5523b1c6fa9b729295fdc27a1dad170f00406","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-9O2dZV2J8TFZ+EaEE0Aj0drQosEkpShTPKE4XV+3R2/NxyK9r41b5EJG4OcAzIYE/MgrCvI+90PPl2aXWtz6dQ==","shasum":"1b4ac9d622f587aad47cb25c00e3822e954f0167","tarball":"https://registry.npmjs.org/@boobstrap/boobstrap/-/boobstrap-0.7.0.tgz","fileCount":92,"unpackedSize":1045658,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@boobstrap%2fboobstrap@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDeVIavclPJ8pfA2tTH4/VArUKhbnSz6amDVURZLB2u5QIhAPL8cN/W/RRKTx4lJvtgWOkrxQ212noaJ4WKXX8elIZu"}]},"_npmUser":{"name":"mikeroq","email":"me@mikeroq.xyz"},"directories":{},"maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/boobstrap_0.7.0_1787420984177_0.07874208093305013"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-06T22:07:59.113Z","modified":"2026-08-22T17:49:44.712Z","0.1.1":"2026-08-06T22:07:59.358Z","0.1.2":"2026-08-06T22:47:55.673Z","0.1.3":"2026-08-06T23:27:04.851Z","0.1.4":"2026-08-06T23:58:17.420Z","0.2.0":"2026-08-07T17:10:24.886Z","0.2.1":"2026-08-07T18:36:09.313Z","0.3.0":"2026-08-08T00:56:07.888Z","0.3.1":"2026-08-08T01:07:44.933Z","0.4.0":"2026-08-12T21:58:30.484Z","0.5.0":"2026-08-13T22:58:08.740Z","0.6.0":"2026-08-22T02:56:56.137Z","0.7.0":"2026-08-22T17:49:44.344Z"},"bugs":{"url":"https://github.com/mikeroq/boobstrap-framework/issues"},"license":"MIT","homepage":"https://boobstrap.org/docs","keywords":["css","framework","components","utilities"],"repository":{"type":"git","url":"git+https://github.com/mikeroq/boobstrap-framework.git"},"description":"A cheeky CSS framework that still means business.","maintainers":[{"name":"mikeroq","email":"me@mikeroq.xyz"}],"readme":"# Boobstrap\n\n**A cheeky CSS framework that still means business.**\n\nBoobstrap is a lightweight, class-based CSS framework for polished interfaces without a required JavaScript runtime. It provides themeable foundations, responsive layout primitives, components, focused utilities, and optional behavior layers under a predictable `bs-` prefix.\n\n[Documentation](https://boobstrap.org/docs) · [Live site](https://boobstrap.org) · [npm](https://www.npmjs.com/package/@boobstrap/boobstrap) · [Issues](https://github.com/mikeroq/boobstrap-framework/issues)\n\n## Starter template\n\nStart from the responsive [Vite starter](examples/starter), which imports Boobstrap and the recommended Lucide icon set from npm and includes theme customization, components, forms, and a production validation command. Download the packaged template from the [Boobstrap documentation](https://boobstrap.org/docs#starter).\n\n## Install\n\nChoose your package manager:\n\n```bash\nnpm install @boobstrap/boobstrap\nyarn add @boobstrap/boobstrap\npnpm add @boobstrap/boobstrap\nbun add @boobstrap/boobstrap\n```\n\nAll four commands install the same package from the npm registry. For a plain HTML page, use the version-pinned CDN build:\n\n```html\n<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@boobstrap/boobstrap@0.7.0/dist/boobstrap.css\" />\n```\n\nImport the compiled stylesheet once at your application entry point:\n\n```js\nimport \"@boobstrap/boobstrap/dist/boobstrap.css\";\n```\n\nYou can also copy `dist/boobstrap.css` from the package into your own assets and link it normally.\n\n## Icons\n\nUse [Lucide](https://lucide.dev/) as the default icon set for Boobstrap projects. Boobstrap remains CSS-only, so Lucide is an opt-in application dependency:\n\n```bash\nnpm install lucide\n```\n\nImport only the icons the page uses, then apply Boobstrap's sizing classes to the markers Lucide replaces:\n\n```html\n<i data-lucide=\"plus\" class=\"bs-icon bs-icon-lg\" aria-hidden=\"true\"></i>\n```\n\n```js\nimport { Plus, createIcons } from \"lucide\";\n\ncreateIcons({ icons: { Plus } });\n```\n\nOther SVG icon sources remain compatible when a project needs them, but Boobstrap documentation and starters use Lucide consistently.\n\n## Optional JavaScript\n\nThe default Boobstrap import remains CSS-only. For progressive enhancement, initialize the dependency-free interaction layer explicitly:\n\n```js\nimport \"@boobstrap/boobstrap\";\nimport { initBoobstrap } from \"@boobstrap/boobstrap/js\";\n\nconst boobstrap = initBoobstrap();\n```\n\nBoobstrap JS provides loading button, collapse, searchable combobox, dialog/drawer, dropdown, input-mask, responsive navbar, OTP, password, popover, composable sidebar, tabs, toast, and tooltip controllers with synchronized ARIA state, cancelable lifecycle events, keyboard behavior where applicable, and explicit cleanup. Every public controller has a component-level `/js/<name>` import.\n\nApplications can continue bringing their own behavior. The official Alpine adapter implements the same [interaction contract](docs/INTERACTIONS.md) without attaching Boobstrap JS:\n\n```bash\nnpm install @boobstrap/alpine alpinejs\n```\n\n```js\nimport Alpine from \"alpinejs\";\nimport boobstrap from \"@boobstrap/alpine\";\n\nAlpine.plugin(boobstrap);\nAlpine.start();\n```\n\nThe official React adapter exposes controlled and uncontrolled headless hooks without attaching Boobstrap JS:\n\n```bash\nnpm install @boobstrap/react react\n```\n\n```jsx\nimport { useButton, useCollapse } from \"@boobstrap/react\";\n\nfunction Details() {\n  const collapse = useCollapse({ id: \"details\" });\n  return <>\n    <button className=\"bs-btn\" {...collapse.getTriggerProps()}>Details</button>\n    <div className=\"bs-collapse\" {...collapse.getPanelProps()}>Content</div>\n  </>;\n}\n```\n\nThe official Vue adapter exposes matching headless composables and accepts Vue refs for controlled state:\n\n```bash\nnpm install @boobstrap/vue vue\n```\n\n```js\nimport { useCollapse } from \"@boobstrap/vue\";\n\nconst details = useCollapse({ id: \"details\" });\n```\n\n## Quick start\n\n```html\n<!doctype html>\n<html lang=\"en\" data-bs-theme=\"dark\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <link rel=\"stylesheet\" href=\"/assets/boobstrap.css\" />\n    <title>Boobstrap example</title>\n  </head>\n  <body>\n    <main class=\"bs-container bs-section\">\n      <div class=\"bs-grid bs-gap-4\">\n        <article class=\"bs-card bs-col-12 bs-col-md-6\">\n          <header class=\"bs-card-header\">\n            <h1 class=\"bs-card-title\">Look good. Ship fast.</h1>\n            <p class=\"bs-card-description\">Thoughtful defaults, ready to customize.</p>\n            <span class=\"bs-badge bs-badge-primary bs-card-action\">Boobstrap</span>\n          </header>\n          <div class=\"bs-card-content\">Build a polished interface from semantic, composable regions.</div>\n          <footer class=\"bs-card-footer\">\n            <button class=\"bs-btn bs-btn-primary\" type=\"button\">Get started</button>\n          </footer>\n        </article>\n      </div>\n    </main>\n  </body>\n</html>\n```\n\n## What ships\n\n- Composable dark/light modes, five color palettes, small/normal/large radius scales, and square corners\n- Reset and typography foundations\n- Fluid containers and a mobile-first 12-column CSS Grid\n- Buttons, cards with optional separated regions, badges, comprehensive form controls, alerts, and code windows with pill or underline tabs\n- Input groups and icons, native selects and date/time pickers, sizes, validation, checks, radios, switches, masks, password reveal, and six-digit OTP\n- Button groups, toolbars, split dropdowns, icon buttons, state variants, and loading buttons\n- A composable sidebar shell with groups, nested menus, badges, loading states, mobile drawers, and desktop collapse modes\n- Native modal dialogs and start/end drawers with composable regions, scroll containment, sizing, focus restoration, and optional backdrop dismissal\n- Semantic data tables with striped, hover, bordered, borderless, compact, sticky-header, sortable-header, footer, numeric, action, and empty-state treatments\n- Numbered pagination with current, disabled, ellipsis, responsive, and size variants, alongside separate previous/next page navigation\n- A scoped DataTables 3 adapter for generated search, page-length, information, sorting, overflow, processing, and pagination controls\n- Determinate, striped, animated, and indeterminate progress indicators with semantic variants and reduced-motion behavior\n- Toast regions, anchored tooltips, and accessible popovers that dismiss on outside interaction, page scroll, or `Escape`\n- Optional loading button, collapse, searchable combobox, dialog/drawer, dropdown, form-helper, sidebar, tabs, toast, tooltip, and popover controllers\n- Official Alpine, React, and Vue adapters with framework-owned state\n- Display, flex, sizing, positioning, spacing, typography, responsive breakpoint, and theme-aware scrollbars\n- A standalone `dist/boobstrap.css` bundle with no runtime dependencies\n\nThe complete component, class, and design-token reference lives in the [framework documentation](https://boobstrap.org/docs). The reference is derived from the compiled package used by the site.\n\n## Themes and customization\n\nDark mode, the rose palette, and rounded corners are the defaults. Mode, palette, and radius are independent attributes that can be combined on the document or scoped to any subtree:\n\n```html\n<html\n  data-bs-theme=\"light\"\n  data-bs-palette=\"blue\"\n  data-bs-radius=\"small\"\n>\n```\n\n- `data-bs-theme`: `dark` or `light`\n- `data-bs-palette`: `rose`, `violet`, `blue`, `teal`, or `amber`\n- `data-bs-radius`: `small`, `normal`, `large`, `rounded` (an alias for `normal`), or `square`\n- `data-bs-scrollbars`: component and element scroll regions are themed by default, while the document's own scrollbar stays platform-native so page layout and viewport overlays (dialogs, drawers) are never displaced. Set `native` on a subtree to opt out, use `.bs-scrollbar` to opt one scroll container back in, and set `themed` on `<html>` to opt the document scrollbar in explicitly.\n\nEach palette remaps semantic surfaces, text, primary states, borders, controls, focus, gradients, and shadows. Radius presets remap the complete `--bs-radius-*` scale, including scrollbar thumb corners, so `data-bs-radius=\"square\"` also produces square scrollbar thumbs. The default scrollbar treatment consumes the theme-aware `--bs-scrollbar-*` tokens. The existing `data-bs-scrollbars=\"themed\"` value remains compatible, but is no longer required.\n\nPreset attributes are optional. Override semantic tokens after importing Boobstrap when a product needs a custom system:\n\n```css\n:root {\n  --bs-color-primary: #6d4aff;\n  --bs-color-primary-hover: #8568ff;\n  --bs-color-primary-contrast: #ffffff;\n  --bs-color-focus-ring: rgb(109 74 255 / 30%);\n  --bs-radius-md: 0.5rem;\n  --bs-scrollbar-thumb: rgb(109 74 255 / 55%);\n}\n```\n\nBuild tools and design-system integrations can consume the same source-derived tokens as JSON or an ES module:\n\n```js\nimport tokenArtifact, { modes, tokens } from \"@boobstrap/boobstrap/tokens\";\nimport tokenJson from \"@boobstrap/boobstrap/tokens.json\" with { type: \"json\" };\n```\n\n`dist/tokens.json` follows the DTCG `$value` and alias shape. Exact CSS `var()` aliases become token references; CSS-native expressions such as `clamp()`, gradients, shadows, and font stacks remain lossless strings without a misleading `$type`. CSS custom properties remain the runtime styling API; these generated artifacts are interoperability data and must not be edited directly.\n\n## Loading skeletons\n\nSkeletons are CSS-only, content-shaped placeholders. Compose `.bs-skeleton` with `.bs-skeleton-text`, `.bs-skeleton-circle`, `.bs-skeleton-media`, size modifiers, and either `.bs-skeleton-pulse` or `.bs-skeleton-wave`. Set widths with `--bs-skeleton-width` or existing layout utilities. Mark the placeholder group `aria-hidden=\"true\"`, put `aria-busy=\"true\"` on the containing content region, and update that region when real content replaces it; skeletons are not progress bars. Both animations become static under reduced motion.\n\n## Browser support\n\nThe release test matrix covers current Chromium, Firefox, and WebKit engines at mobile and desktop viewport sizes. Browser contracts exercise both themes, responsive grid behavior, visible focus treatment, reduced-motion behavior, optional controller interactions, keyboard navigation, and automated Axe accessibility checks.\n\nLegacy browsers are not a target. Boobstrap uses modern CSS features including custom properties, Grid, `clamp()`, and modern color syntax.\n\nForced colors (Windows High Contrast) are exercised by the browser test matrix. Components that override native chrome opt into `forced-color-adjust: auto` so users keep a recognizable OS shape and high-contrast palette.\n\n## What's new in v0.6\n\nv0.6 completes the responsive grid, spacing, and layout utility surfaces, adds five new component controllers (banner, input-mask, otp, password, sidebar) with matching Alpine, React, and Vue adapters, and ships minified CSS and component-local customization hooks. It also fixes `aria-invalid=\"false\"` so it no longer applies success styling. See [docs/MIGRATING.md](docs/MIGRATING.md) for the migration notes, including the one deliberate breaking change, and [CHANGELOG.md](CHANGELOG.md) for the complete list.\n\n## Development\n\nFeature work targets the `dev` branch and is exercised by the website's hosted dev environment without publishing interim npm versions. See [DEVELOPMENT.md](DEVELOPMENT.md) for the cross-repository integration and release flow.\n\nRelease history and compatibility policy live in [CHANGELOG.md](CHANGELOG.md), [docs/VERSIONING.md](docs/VERSIONING.md), and [docs/MIGRATING.md](docs/MIGRATING.md).\n\n```bash\ngit clone https://github.com/mikeroq/boobstrap-framework.git\ncd boobstrap-framework\nnpm install\nnpx playwright install chromium\nnpm test\n```\n\nUseful commands:\n\n| Command | Purpose |\n|---|---|\n| `npm run build` | Compile source imports into `dist/boobstrap.css` |\n| `npm run test:contract` | Verify the exact public class/token contract and bundle metadata |\n| `npm run test:visual` | Compare focused Chromium component snapshots |\n| `npm run test:visual:update` | Regenerate visual baselines after reviewing an intentional visual change |\n| `npm run test:css` | Validate compiled CSS syntax |\n| `npm run test:browser` | Test themes, layout, interactions, keyboard behavior, focus, motion, and accessibility |\n| `npm run test:package` | Inspect the npm tarball contents without publishing |\n| `npm test` | Run the complete local release gate |\n\nWhen changing the public API intentionally, update `tests/api-contract.json` in the same pull request. Accidental selector or token changes fail the contract test.\n\n## Roadmap\n\n### v0.2 — Interaction foundation (shipped)\n\n- Dependency-free collapse, dropdown, responsive sidebar, and tabs controllers\n- Shared state, event, keyboard, and accessibility contract\n- Official Alpine and React adapters\n\n### v0.3 — Button system (shipped)\n\n- Button groups, wrapping toolbars, and split dropdown actions\n- Icon-only buttons with size-aware dimensions\n- Active, pressed, disabled, block, and loading states\n- Generic current-color spinners\n- Loading controllers for Boobstrap JS, Alpine, and React\n\n### v0.4 — Component breadth (shipped)\n\n- Navigation\n- Breadcrumbs and pagination\n- Tables\n- Native modal dialogs and drawers\n\n### v0.5 — Adapter parity, feedback, and interoperability\n\n- Progress indicators\n- Expanded responsive utilities\n- Official Vue adapter\n- Toast notifications\n- Tooltips and popovers\n- Core and Alpine TypeScript declarations\n- Machine-readable design token exports\n- Accordion and loading skeleton primitives\n- Adapter conformance and visual regression contracts\n\n### v0.6 — Responsive surface, component breadth, and resilience\n\n- Completed responsive 12-column grid with breakpoint tokens (`--bs-breakpoint-*`)\n- Completed spacing utility grammar (margin, padding, gap) with responsive variants\n- Added display, position, flex, sizing, text overflow, and media fit utilities\n- Added full semantic variants for alert, badge, button, and banner\n- Added compositional primitives (`.bs-separator`, `.bs-close`, dropdown helpers)\n- Added five controllers (banner, input-mask, otp, password, sidebar) with matching Alpine, React, and Vue adapters\n- Added structural tokens (`--bs-z-*`, `--bs-control-size-*`, `--bs-btn-size-*`, `--bs-overlay-backdrop`) and component-local hooks (`--bs-btn-*`, `--bs-card-*`, `--bs-dialog-*`, `--bs-control-*`, `--bs-banner-*`, `--bs-toast-*`, `--bs-sidebar-*`)\n- Shipped minified CSS at `@boobstrap/boobstrap/min.css` with size budgets\n- Fixed `aria-invalid=\"false\"` so it no longer applies success styling (migration required)\n\n### Future\n\n- Component-level distribution if bundle growth makes partial imports worthwhile\n- Stable-major preparation guided by the published compatibility and migration policy\n\n## Project structure\n\n```text\nsrc/\n├── base/         # reset, tokens, and typography\n├── components/   # reusable component classes\n├── js/           # optional dependency-free controllers\n├── layout/       # containers and the 12-column grid\n├── utilities/    # focused composition helpers\n└── boobstrap.css # ordered source entry point\n\ndist/             # published compiled CSS\nexamples/starter/ # downloadable Vite consumer project\ndocs/             # public behavior and adapter contracts\nscripts/          # build and release validation\ntests/            # API contract and browser fixture\n```\n\n## Contributing\n\nKeep changes focused, preserve the `bs-` namespace, document public API changes, and run `npm test` before opening a pull request. Accessibility and responsive behavior are part of the component contract, not follow-up work.\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md"}