{"_id":"@aspect-ops/exon-ui","_rev":"13-97a3bbd893f8f4e22637b6217695baca","name":"@aspect-ops/exon-ui","dist-tags":{"latest":"0.4.4"},"versions":{"0.0.1":{"name":"@aspect-ops/exon-ui","version":"0.0.1","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.0.1","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"fd427caa3c17b69265868ba247277afb4de6649a","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.0.1.tgz","fileCount":106,"integrity":"sha512-hQ0N1sXBCico9eqWpkPD1WYaDNcOfu1Mqc0WgFWqERSoL3A6w+U8+zt+JaQn8fqK8O2ahud/16eaO+dHml63vg==","signatures":[{"sig":"MEYCIQCLJOeiUVgeF9nkMEQCq/CO0426EXUx2EoHvjri+oQHNQIhAPByKjdc6s27j23rt9sw1mtFSMRS+hd28liTlSDHSWcS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121167},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./package.json":"./package.json"},"gitHead":"4080b1019d26d635bc11232636be7a9feabd7471","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.0.1_1767556143218_0.716574877694397","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@aspect-ops/exon-ui","version":"0.0.2","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.0.2","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"d5b797eee9e20c951dbaa213816f01539db148aa","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.0.2.tgz","fileCount":107,"integrity":"sha512-EmKX2A0Oes+D9IkXOwf9XhU9YWIHzG2fNc3UMmDsDGVaAcgyqVReaOYUONMsxAGBM/PhpuN2J6e69VOySKRMPQ==","signatures":[{"sig":"MEUCICExzplQwTjf1YQOCzkD2XMjNmzKg85ghUx+ejpKIKQlAiEAlyoc9g0DREtP/XdRAeJPeAFx1SFv0HNbq2NAKsYSue4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131601},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./package.json":"./package.json"},"gitHead":"ed4836a2969160a145738579a49be4a73543a266","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.0.2_1767556703112_0.7475501930587003","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@aspect-ops/exon-ui","version":"0.0.3","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.0.3","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"6e69c0182bdbe7f8947c2b4ee420bae7ca99eca2","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.0.3.tgz","fileCount":277,"integrity":"sha512-LHRORfnygqk6BWOnQsC/4i+eqmKeWkG28njh4hvOlGpxtTGRQYjPpnh5QPsgTfHTwvoplGArFi9QHrHKCok3sg==","signatures":[{"sig":"MEQCIElZrdJ/qD9TqoU/5rQIDu2TlmJM87ienOyvyc7+t3+VAiAHV/k6HNvSAYIfOFlet3ubhlUKngeBAlbIABv07W6NNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":334299},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./package.json":"./package.json"},"gitHead":"b506e958b457ec3902e8f45d1e4e39092e835c9e","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.0.3_1767629468075_0.7568010220438226","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@aspect-ops/exon-ui","version":"0.1.0","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.1.0","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"787de60de7a08e5d8921e1cbc9fdf29cfa7d5fe4","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.1.0.tgz","fileCount":335,"integrity":"sha512-3CO6y+b9QVvPund4ti+u6D10VfPkm2jjYFxZvndNG3rnX4L9lG08JOAqFo+GXGQceDbJGs2INky5dn1y8m7oOg==","signatures":[{"sig":"MEUCIQD3jEB6lRjK4S6J1eKiSJet63josHyNDRbsUb+dbXse7gIgXr8TOxVaBgGmr0E30i2HZ0CibT54ITQVnNuwtlyd0/M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":501470},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./package.json":"./package.json"},"gitHead":"09a041aa923cf41696da86affe378e60f4ea5e0e","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.1.0_1767633153329_0.7272030702388459","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aspect-ops/exon-ui","version":"0.2.0","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.2.0","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"8291952df7b9baaaa64408c9ebe1c392f1e41533","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.2.0.tgz","fileCount":349,"integrity":"sha512-bkw98Lbt1/rxq5xzYnc24L6bjoQ78DXSRKODUY1p022PUZBLuqaLmdBlhL2nfrcG8bMVukQZBJnYozK7OjKS/Q==","signatures":[{"sig":"MEUCIGxvriz76PjpMNuXFr/asIXsnTiA++WHuMoxbj+ZvLwIAiEAs+ub0NYaHcST+xOvzeU7dq250nW3SWDZjstB0g1pXSM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":527339},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./package.json":"./package.json"},"gitHead":"60400d8e2d6d183de96ba4846edcbd83f79dd399","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.2.0_1767635055777_0.9668884313131576","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@aspect-ops/exon-ui","version":"0.2.1","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.2.1","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"709523948857a0cb90cbd2c52b512e7450c05100","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.2.1.tgz","fileCount":374,"integrity":"sha512-/7gj9fv3QjLxd/zl+bfWTGXTM3ipoUPspQ42a6vTczolQfTHr3qL77/J+62lMIJDXsVvDOKYZM6eQlqVfrAzwg==","signatures":[{"sig":"MEQCIBaJDYNBbWlgPwowtw35JE96TD7MuONM07k5LES6O4CgAiBWwl2R3hPjxzHV+PNRnE1ooz7qOD7cytd9lSJ+nJAj2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":593120},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./package.json":"./package.json"},"gitHead":"bb49c79ec79d49b5bdaf18a68a983f72d228c9b2","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","mermaid":"^11.12.2","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.2.1_1767685238359_0.41187684010313164","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@aspect-ops/exon-ui","version":"0.2.2","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.2.2","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"e37141fa1907e20232416fc116147e7579f42545","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.2.2.tgz","fileCount":400,"integrity":"sha512-+aT/rFrPiAoj/FoX1Owu7m/J5S3UglePEZD1YwzGqH9mVqsneEllJQ20A/OlnhlHzDmDJoGcW2TH86CUoiMk0A==","signatures":[{"sig":"MEUCIQCbISvbQXWCf+IFR1GeY7OlBEwcYuOt2Abq4UEJ1q3IKgIgOzUaMJHWYonOWmOpingSnVFJA4O6IrNouAH2VLYmFGc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":650651},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./package.json":"./package.json"},"gitHead":"db047f4e8e7f29522f9c4a4040619603a46a3834","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0","lucide-svelte":"^0.562.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","mermaid":"^11.12.2","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.2.2_1767721399243_0.302243188426792","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aspect-ops/exon-ui","version":"0.3.0","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.3.0","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"15cf34754a5ab36303686c57627a82045e4c4a9c","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.3.0.tgz","fileCount":432,"integrity":"sha512-2z8KxWItCU+BCaZe5Ymyg2e85twRXyVWjBwoQSTaw3f+FOGZzIc1SABnuUl9atRlV3PCrrqWn/IrkBrYF5kLIw==","signatures":[{"sig":"MEYCIQDIxG4LYtIAoypmljIXqETqRPfcE+psQfHZmY4UDOTtPAIhANZrhZRI0m/IGta+0ERSPrjJ5mOS+tee8qVATyfIGAex","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":721171},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./package.json":"./package.json"},"gitHead":"247ae88469805417402018d901f1311de8ae0b7d","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0","lucide-svelte":"^0.562.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","mermaid":"^11.12.2","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.3.0_1767728142690_0.2895504090965755","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aspect-ops/exon-ui","version":"0.4.0","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.4.0","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"77815bb4921b229f8f9f8f628f729eb2da31788d","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.4.0.tgz","fileCount":447,"integrity":"sha512-nZL1IC9n/hzTRkIxRdb4q2YhhjZo7c2Zyc8/TOO9rwb6vEm0oYZ4GEoxGvFHtPeZqCQJiDkOOmNNVx9L5hrThQ==","signatures":[{"sig":"MEUCIHqx4tnekx3g/N6wbNN8jV+zzLQm7W3R28JN7oV167P9AiEA+BZ5OuA5OJVcVMstlOnCjZwsowkOW4Q02wj8MR5GlPc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":754155},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./FlexibleGrid":{"types":"./dist/components/FlexibleGrid/index.d.ts","svelte":"./dist/components/FlexibleGrid/index.js"},"./package.json":"./package.json","./HeroLeftAligned":{"types":"./dist/components/HeroLeftAligned/index.d.ts","svelte":"./dist/components/HeroLeftAligned/index.js"}},"gitHead":"a13f56280686a5b6e79951ec503fc76d8086b325","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0","lucide-svelte":"^0.562.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.4.0_1768904097709_0.4556796839272428","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@aspect-ops/exon-ui","version":"0.4.1","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.4.1","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"1b769fa6e64af1d8852ae18e3d0787723d59d00b","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.4.1.tgz","fileCount":447,"integrity":"sha512-bUPyTPeXwhJwaK6AxhWeqFinbpxF32cLQr23BlP7lPzusUFRNY23Oua11Otd0H8TWeKHmyuYxMNBpO82zGW+QA==","signatures":[{"sig":"MEUCIEVu3aDgsIqRcI2RG+/wXF4SDqwivWyvCH1jKW9h/TQvAiEAnJ/pYt6Bt9dXCxXyJ80f/4LZBBZXOKxNVBxTL190RIk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":754219},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./FlexibleGrid":{"types":"./dist/components/FlexibleGrid/index.d.ts","svelte":"./dist/components/FlexibleGrid/index.js"},"./package.json":"./package.json","./HeroLeftAligned":{"types":"./dist/components/HeroLeftAligned/index.d.ts","svelte":"./dist/components/HeroLeftAligned/index.js"}},"gitHead":"e0fa3e7bc768af2d0e94a98903c13851ff5abcd1","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0","lucide-svelte":"^0.562.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.4.1_1769234029720_0.511083144962666","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@aspect-ops/exon-ui","version":"0.4.2","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.4.2","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"71518d3346d8432b40f1076b0c552d72073693df","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.4.2.tgz","fileCount":447,"integrity":"sha512-j7ccTRH/thHFjXXbXX2gscX5jJZQDJJIb98+5Bs3GzvMyUSjxFUUX0nXRiYY8WvztGzA8iiA3Cif2iq9cGY8Tg==","signatures":[{"sig":"MEYCIQDAgmBfZ2cRPyjYbRkS+uhTJedNsG0N4LywAGzkZhV3+AIhAKWoob7sYTaIQintw81osAd11j6RjYZDb0pTvZC0fii+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":754968},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./FlexibleGrid":{"types":"./dist/components/FlexibleGrid/index.d.ts","svelte":"./dist/components/FlexibleGrid/index.js"},"./package.json":"./package.json","./HeroLeftAligned":{"types":"./dist/components/HeroLeftAligned/index.d.ts","svelte":"./dist/components/HeroLeftAligned/index.js"}},"gitHead":"11fc917e1ec0672d24498c276aff33291625878a","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0","lucide-svelte":"^0.562.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.4.2_1769234398805_0.37787097482481213","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@aspect-ops/exon-ui","version":"0.4.3","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"author":{"name":"Exon Team"},"license":"MIT","_id":"@aspect-ops/exon-ui@0.4.3","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"dist":{"shasum":"4933a2a92e4462ccedd2c8932edcbaced679e281","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.4.3.tgz","fileCount":447,"integrity":"sha512-vtK3vTJJ9sQkuCIM9FPviDF6RQrcpaYCUAnYBgLIQxDpVkZhI/0ZLM2DrVqHC2KQ1X1WKu7Vm5DsR+/TOrSgpA==","signatures":[{"sig":"MEQCIEl8HvpxLoURzr2as6b8mTjAaAWq99BM7bNFDqgFBBYZAiAp0XKf1n+gXF0scWQxv9gkF0A08m/Y2helEonBLHEzhA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":755488},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","svelte":"./dist/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./styles":"./dist/styles/tokens.css","./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./FlexibleGrid":{"types":"./dist/components/FlexibleGrid/index.d.ts","svelte":"./dist/components/FlexibleGrid/index.js"},"./package.json":"./package.json","./HeroLeftAligned":{"types":"./dist/components/HeroLeftAligned/index.d.ts","svelte":"./dist/components/HeroLeftAligned/index.js"}},"gitHead":"11fc917e1ec0672d24498c276aff33291625878a","scripts":{"dev":"vite dev","lint":"eslint . --fix","size":"size-limit","test":"vitest run","build":"vite build && npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","package":"svelte-kit sync && svelte-package && publint","prepare":"husky","preview":"vite preview","release":"release-it","test:watch":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","release:dry":"release-it --dry-run","test:coverage":"vitest run --coverage","prepublishOnly":"npm run package"},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"repository":{"url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git","type":"git"},"_npmVersion":"11.4.2","description":"Reusable Svelte UI components for web and Capacitor mobile apps","directories":{},"lint-staged":{"*.{json,css,md}":["prettier --write"],"*.{js,ts,svelte}":["eslint --fix","prettier --write"]},"sideEffects":["**/*.css"],"_nodeVersion":"23.7.0","dependencies":{"bits-ui":"^1.0.0","lucide-svelte":"^0.562.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.0","husky":"^9.1.7","jsdom":"^25.0.0","eslint":"^9.0.0","svelte":"^5.0.0","vitest":"^2.0.0","globals":"^17.0.0","publint":"^0.2.0","prettier":"^3.0.0","release-it":"^17.0.0","size-limit":"^11.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","svelte-check":"^4.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@vitest/coverage-v8":"^2.0.0","eslint-plugin-svelte":"^2.0.0","@sveltejs/adapter-auto":"^3.0.0","prettier-plugin-svelte":"^3.0.0","@testing-library/svelte":"^5.0.0","@testing-library/jest-dom":"^6.9.1","@typescript-eslint/parser":"^8.0.0","@size-limit/preset-small-lib":"^11.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/exon-ui_0.4.3_1769235395198_0.4190998699915891","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@aspect-ops/exon-ui","version":"0.4.4","description":"Reusable Svelte UI components for web and Capacitor mobile apps","author":{"name":"Exon Team"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git"},"bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","type":"module","svelte":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js","import":"./dist/index.js"},"./Button":{"types":"./dist/components/Button/index.d.ts","svelte":"./dist/components/Button/index.js"},"./Typography":{"types":"./dist/components/Typography/index.d.ts","svelte":"./dist/components/Typography/index.js"},"./Icon":{"types":"./dist/components/Icon/index.d.ts","svelte":"./dist/components/Icon/index.js"},"./Badge":{"types":"./dist/components/Badge/index.d.ts","svelte":"./dist/components/Badge/index.js"},"./Link":{"types":"./dist/components/Link/index.d.ts","svelte":"./dist/components/Link/index.js"},"./FlexibleGrid":{"types":"./dist/components/FlexibleGrid/index.d.ts","svelte":"./dist/components/FlexibleGrid/index.js"},"./HeroLeftAligned":{"types":"./dist/components/HeroLeftAligned/index.d.ts","svelte":"./dist/components/HeroLeftAligned/index.js"},"./styles":"./dist/styles/tokens.css","./package.json":"./package.json"},"keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"scripts":{"dev":"vite dev","build":"vite build && npm run package","preview":"vite preview","package":"svelte-kit sync && svelte-package && publint","prepublishOnly":"npm run package","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","lint":"eslint . --fix","format":"prettier --write .","size":"size-limit","release":"release-it","release:dry":"release-it --dry-run","prepare":"husky"},"peerDependencies":{"svelte":"^5.0.0"},"devDependencies":{"@size-limit/preset-small-lib":"^11.0.0","@sveltejs/adapter-auto":"^3.0.0","@sveltejs/kit":"^2.0.0","@sveltejs/package":"^2.0.0","@sveltejs/vite-plugin-svelte":"^4.0.0","@testing-library/jest-dom":"^6.9.1","@testing-library/svelte":"^5.0.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.0.0","@typescript-eslint/parser":"^8.0.0","@vitest/coverage-v8":"^2.0.0","eslint":"^9.0.0","eslint-plugin-svelte":"^2.0.0","globals":"^17.0.0","husky":"^9.1.7","jsdom":"^25.0.0","lint-staged":"^16.2.7","prettier":"^3.0.0","prettier-plugin-svelte":"^3.0.0","publint":"^0.2.0","release-it":"^17.0.0","size-limit":"^11.0.0","svelte":"^5.0.0","svelte-check":"^4.0.0","typescript":"^5.0.0","vite":"^5.0.0","vitest":"^2.0.0"},"dependencies":{"bits-ui":"^1.0.0","lucide-svelte":"^0.562.0"},"publishConfig":{"access":"public"},"sideEffects":["**/*.css"],"lint-staged":{"*.{js,ts,svelte}":["eslint --fix","prettier --write"],"*.{json,css,md}":["prettier --write"]},"_id":"@aspect-ops/exon-ui@0.4.4","gitHead":"6fe1d1b02910346b946c0aab02bdb1aebbe19e68","_nodeVersion":"23.7.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-kCLHTMugDKBPdXpCBmi8eQAwsXvvSwIJx8vJfnfZW80ACRHwqZjdVRkVW24PWKc/5tbvDswT9STVa9AT9E1yow==","shasum":"75b5bea2daabf33f69cb9663cdd0a1ed3c5a8789","tarball":"https://registry.npmjs.org/@aspect-ops/exon-ui/-/exon-ui-0.4.4.tgz","fileCount":447,"unpackedSize":755488,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG/ujEOsWNj8+tZls1xJxRVfRnNxgFe7l7p3IXueQ68BAiEAy4VYe+fEPCANSVRL7HvnbhL5VDzNYyGeUOY30ZDp2jk="}]},"_npmUser":{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"},"directories":{},"maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/exon-ui_0.4.4_1770202086408_0.6721198011924672"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-04T19:49:03.115Z","modified":"2026-02-04T10:48:06.754Z","0.0.1":"2026-01-04T19:49:03.372Z","0.0.2":"2026-01-04T19:58:23.259Z","0.0.3":"2026-01-05T16:11:08.267Z","0.1.0":"2026-01-05T17:12:33.542Z","0.2.0":"2026-01-05T17:44:15.952Z","0.2.1":"2026-01-06T07:40:38.505Z","0.2.2":"2026-01-06T17:43:19.442Z","0.3.0":"2026-01-06T19:35:42.940Z","0.4.0":"2026-01-20T10:14:58.037Z","0.4.1":"2026-01-24T05:53:49.961Z","0.4.2":"2026-01-24T05:59:58.964Z","0.4.3":"2026-01-24T06:16:35.428Z","0.4.4":"2026-02-04T10:48:06.616Z"},"bugs":{"url":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library/issues"},"author":{"name":"Exon Team"},"license":"MIT","homepage":"https://github.com/ExonPro-Innovations-LLP/exon-ui-library#readme","keywords":["svelte","svelte5","components","ui","capacitor","mobile","accessible","headless"],"repository":{"type":"git","url":"git+https://github.com/ExonPro-Innovations-LLP/exon-ui-library.git"},"description":"Reusable Svelte UI components for web and Capacitor mobile apps","maintainers":[{"name":"kusaldip.das","email":"kusaldip.das@exonpro.com"}],"readme":"# @aspect-ops/exon-ui\n\nA modern, accessible UI component library for **Svelte 5** with first-class support for **Capacitor** mobile apps.\n\n[![npm version](https://img.shields.io/npm/v/@aspect-ops/exon-ui.svg)](https://www.npmjs.com/package/@aspect-ops/exon-ui)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n\n## Features\n\n- **Svelte 5** - Built with runes and modern Svelte patterns\n- **Mobile-first** - Designed for Capacitor native app conversion\n- **Accessible** - WCAG 2.1 compliant with proper ARIA attributes\n- **Themeable** - CSS custom properties for light/dark themes\n- **Tree-shakeable** - Import only what you need\n- **TypeScript** - Full type definitions included\n\n## Installation\n\n```bash\nnpm install @aspect-ops/exon-ui\n```\n\n## Quick Start\n\n```svelte\n<script>\n\timport { Button, Typography } from '@aspect-ops/exon-ui';\n\timport '@aspect-ops/exon-ui/styles';\n</script>\n\n<Typography variant=\"h1\">Hello World</Typography>\n<Button variant=\"primary\">Click Me</Button>\n```\n\n## Components\n\n### Core Components\n\n| Component    | Description                                   |\n| ------------ | --------------------------------------------- |\n| `Button`     | Buttons with variants, sizes, loading states  |\n| `Typography` | Semantic text with heading and body variants  |\n| `Icon`       | SVG icon component with size options          |\n| `Badge`      | Status badges with color variants             |\n| `Link`       | Accessible links with external link detection |\n\n### Form Components\n\n| Component       | Description                                |\n| --------------- | ------------------------------------------ |\n| `TextInput`     | Text input with validation states          |\n| `Textarea`      | Multi-line input with auto-resize          |\n| `Select`        | Dropdown select with keyboard navigation   |\n| `Checkbox`      | Single checkbox with indeterminate state   |\n| `CheckboxGroup` | Group of checkboxes with shared state      |\n| `Radio`         | Single radio button                        |\n| `RadioGroup`    | Radio button group with orientation        |\n| `Switch`        | Toggle switch component                    |\n| `FormField`     | Label wrapper with helper/error text       |\n| `SearchInput`   | Search with autocomplete suggestions       |\n| `DatePicker`    | Date selection with calendar popup         |\n| `TimePicker`    | Time selection with hour/minute picker     |\n| `FileUpload`    | Drag-drop file upload with previews        |\n| `OTPInput`      | One-time password input                    |\n| `NumberInput`   | Number input with +/- buttons and keyboard |\n| `ToggleGroup`   | Single/multi select button group           |\n\n### Navigation Components\n\n| Component                                        | Description                        |\n| ------------------------------------------------ | ---------------------------------- |\n| `Tabs`, `TabList`, `TabTrigger`, `TabContent`    | Accessible tabs with Bits UI       |\n| `Menu`, `MenuTrigger`, `MenuContent`, `MenuItem` | Dropdown menus with submenus       |\n| `Breadcrumbs`, `BreadcrumbItem`                  | Navigation breadcrumbs             |\n| `BottomNav`, `BottomNavItem`                     | Mobile bottom navigation           |\n| `Navbar`, `NavItem`                              | Responsive header with mobile menu |\n| `Sidebar`, `SidebarItem`, `SidebarGroup`         | Collapsible sidebar navigation     |\n| `Stepper`, `StepperStep`                         | Multi-step progress indicator      |\n| `Pagination`                                     | Page navigation with ellipsis      |\n\n### Data Display Components\n\n| Component                    | Description                                  |\n| ---------------------------- | -------------------------------------------- |\n| `Accordion`, `AccordionItem` | Collapsible content panels                   |\n| `Slider`                     | Range slider with drag/keyboard support      |\n| `Carousel`, `CarouselSlide`  | Image/content carousel with swipe            |\n| `Image`                      | Lazy loading image with placeholder/fallback |\n| `Rating`                     | Star rating display/input                    |\n| `Chip`, `ChipGroup`          | Tag/filter chips with selection              |\n\n### Mobile Components\n\n| Component                                             | Description                                 |\n| ----------------------------------------------------- | ------------------------------------------- |\n| `ActionSheet`, `ActionSheetItem`                      | iOS/Android-style bottom action menu        |\n| `BottomSheet`, `BottomSheetHeader`, `BottomSheetBody` | Draggable bottom sheet with snap points     |\n| `FAB`                                                 | Floating action button with positions       |\n| `FABGroup`                                            | Speed dial FAB with expandable actions      |\n| `PullToRefresh`                                       | Pull-to-refresh gesture for lists           |\n| `SwipeActions`                                        | Swipe-to-reveal actions on list items       |\n| `SafeArea`                                            | Safe area inset wrapper for notched devices |\n\n## Usage Examples\n\n### Button\n\n```svelte\n<script>\n\timport { Button } from '@aspect-ops/exon-ui';\n</script>\n\n<!-- Variants -->\n<Button variant=\"primary\">Primary</Button>\n<Button variant=\"secondary\">Secondary</Button>\n<Button variant=\"outline\">Outline</Button>\n<Button variant=\"ghost\">Ghost</Button>\n<Button variant=\"destructive\">Delete</Button>\n\n<!-- Sizes -->\n<Button size=\"sm\">Small</Button>\n<Button size=\"md\">Medium</Button>\n<Button size=\"lg\">Large</Button>\n\n<!-- States -->\n<Button loading>Loading...</Button>\n<Button disabled>Disabled</Button>\n<Button fullWidth>Full Width</Button>\n```\n\n### Typography\n\n```svelte\n<script>\n\timport { Typography } from '@aspect-ops/exon-ui';\n</script>\n\n<Typography variant=\"h1\">Heading 1</Typography>\n<Typography variant=\"h2\">Heading 2</Typography>\n<Typography variant=\"body\">Body text</Typography>\n<Typography variant=\"body-sm\">Small text</Typography>\n<Typography variant=\"caption\">Caption text</Typography>\n```\n\n### Form Components\n\n```svelte\n<script>\n\timport { FormField, TextInput, Select, Checkbox, Switch } from '@aspect-ops/exon-ui';\n\n\tlet email = $state('');\n\tlet country = $state('');\n\tlet newsletter = $state(false);\n\tlet darkMode = $state(false);\n</script>\n\n<FormField label=\"Email\" required helperText=\"We'll never share your email\">\n\t<TextInput type=\"email\" bind:value={email} placeholder=\"you@example.com\" />\n</FormField>\n\n<FormField label=\"Country\">\n\t<Select\n\t\tbind:value={country}\n\t\toptions={[\n\t\t\t{ value: 'us', label: 'United States' },\n\t\t\t{ value: 'uk', label: 'United Kingdom' },\n\t\t\t{ value: 'in', label: 'India' }\n\t\t]}\n\t/>\n</FormField>\n\n<Checkbox bind:checked={newsletter}>\n\t{#snippet children()}\n\t\tSubscribe to newsletter\n\t{/snippet}\n</Checkbox>\n\n<Switch bind:checked={darkMode}>\n\t{#snippet children()}\n\t\tDark Mode\n\t{/snippet}\n</Switch>\n```\n\n### Tabs\n\n```svelte\n<script>\n\timport { Tabs, TabList, TabTrigger, TabContent } from '@aspect-ops/exon-ui';\n\n\tlet activeTab = $state('tab1');\n</script>\n\n<Tabs bind:value={activeTab}>\n\t<TabList>\n\t\t<TabTrigger value=\"tab1\">Account</TabTrigger>\n\t\t<TabTrigger value=\"tab2\">Security</TabTrigger>\n\t\t<TabTrigger value=\"tab3\">Notifications</TabTrigger>\n\t</TabList>\n\n\t<TabContent value=\"tab1\">\n\t\t<p>Account settings content</p>\n\t</TabContent>\n\t<TabContent value=\"tab2\">\n\t\t<p>Security settings content</p>\n\t</TabContent>\n\t<TabContent value=\"tab3\">\n\t\t<p>Notification preferences</p>\n\t</TabContent>\n</Tabs>\n\n<!-- Scrollable tabs -->\n<Tabs>\n\t<TabList scrollable>\n\t\t{#each Array(10) as _, i}\n\t\t\t<TabTrigger value=\"tab-{i}\">Tab {i + 1}</TabTrigger>\n\t\t{/each}\n\t</TabList>\n</Tabs>\n\n<!-- Vertical tabs -->\n<Tabs orientation=\"vertical\">\n\t<TabList>\n\t\t<TabTrigger value=\"v1\">Item 1</TabTrigger>\n\t\t<TabTrigger value=\"v2\">Item 2</TabTrigger>\n\t</TabList>\n</Tabs>\n```\n\n### Menu / Dropdown\n\n```svelte\n<script>\n\timport {\n\t\tMenu,\n\t\tMenuTrigger,\n\t\tMenuContent,\n\t\tMenuItem,\n\t\tMenuSeparator,\n\t\tMenuSub,\n\t\tMenuSubTrigger,\n\t\tMenuSubContent\n\t} from '@aspect-ops/exon-ui';\n</script>\n\n<Menu>\n\t<MenuTrigger>\n\t\t<button>Open Menu</button>\n\t</MenuTrigger>\n\t<MenuContent>\n\t\t<MenuItem icon=\"📝\">Edit</MenuItem>\n\t\t<MenuItem icon=\"📋\">Copy</MenuItem>\n\t\t<MenuSeparator />\n\t\t<MenuSub>\n\t\t\t<MenuSubTrigger>More Options</MenuSubTrigger>\n\t\t\t<MenuSubContent>\n\t\t\t\t<MenuItem>Option 1</MenuItem>\n\t\t\t\t<MenuItem>Option 2</MenuItem>\n\t\t\t</MenuSubContent>\n\t\t</MenuSub>\n\t\t<MenuSeparator />\n\t\t<MenuItem icon=\"🗑️\">Delete</MenuItem>\n\t</MenuContent>\n</Menu>\n```\n\n### Breadcrumbs\n\n```svelte\n<script>\n\timport { Breadcrumbs } from '@aspect-ops/exon-ui';\n\n\tconst items = [\n\t\t{ label: 'Home', href: '/' },\n\t\t{ label: 'Products', href: '/products' },\n\t\t{ label: 'Category', href: '/products/category' },\n\t\t{ label: 'Current Page' }\n\t];\n</script>\n\n<Breadcrumbs {items} />\n\n<!-- Custom separator -->\n<Breadcrumbs {items}>\n\t{#snippet separator()}\n\t\t→\n\t{/snippet}\n</Breadcrumbs>\n```\n\n### Bottom Navigation (Mobile)\n\n```svelte\n<script>\n\timport { BottomNav } from '@aspect-ops/exon-ui';\n\n\tlet activeIndex = $state(0);\n\n\tconst items = [\n\t\t{ label: 'Home', icon: '🏠' },\n\t\t{ label: 'Search', icon: '🔍' },\n\t\t{ label: 'Inbox', icon: '📬', badge: 5 },\n\t\t{ label: 'Profile', icon: '👤' }\n\t];\n</script>\n\n<BottomNav {items} {activeIndex} onchange={(index) => (activeIndex = index)} />\n```\n\n### Navbar\n\n```svelte\n<script>\n\timport { Navbar, NavItem, Button } from '@aspect-ops/exon-ui';\n</script>\n\n<Navbar>\n\t{#snippet logo()}\n\t\t<span>MyApp</span>\n\t{/snippet}\n\n\t<NavItem label=\"Home\" href=\"/\" active />\n\t<NavItem label=\"Products\" href=\"/products\" />\n\t<NavItem label=\"About\" href=\"/about\" />\n\n\t{#snippet actions()}\n\t\t<Button size=\"sm\">Sign In</Button>\n\t{/snippet}\n</Navbar>\n```\n\n### Sidebar\n\n```svelte\n<script>\n\timport { Sidebar, SidebarItem, SidebarGroup } from '@aspect-ops/exon-ui';\n\n\tlet collapsed = $state(false);\n</script>\n\n<Sidebar bind:collapsed>\n\t<SidebarGroup label=\"Main\">\n\t\t<SidebarItem icon=\"🏠\" label=\"Dashboard\" active />\n\t\t<SidebarItem icon=\"📊\" label=\"Analytics\" badge={3} />\n\t\t<SidebarItem icon=\"📁\" label=\"Projects\" />\n\t</SidebarGroup>\n\n\t<SidebarGroup label=\"Settings\" collapsible>\n\t\t<SidebarItem icon=\"👤\" label=\"Profile\" />\n\t\t<SidebarItem icon=\"🔒\" label=\"Security\" />\n\t</SidebarGroup>\n</Sidebar>\n```\n\n## Advanced Form Components\n\n### SearchInput\n\nSearch input with autocomplete suggestions and keyboard navigation.\n\n**Props:**\n\n| Prop             | Type        | Default    | Description                       |\n| ---------------- | ----------- | ---------- | --------------------------------- |\n| `value`          | `string`    | `''`       | Bindable search value             |\n| `placeholder`    | `string`    | `'Search'` | Input placeholder text            |\n| `suggestions`    | `string[]`  | `[]`       | Array of autocomplete suggestions |\n| `size`           | `InputSize` | `'md'`     | Input size: sm, md, lg            |\n| `disabled`       | `boolean`   | `false`    | Disabled state                    |\n| `loading`        | `boolean`   | `false`    | Show loading spinner              |\n| `maxSuggestions` | `number`    | `5`        | Maximum suggestions to display    |\n| `onselect`       | `function`  | -          | Callback when suggestion selected |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { SearchInput } from '@aspect-ops/exon-ui';\n\n\tlet query = $state('');\n\tconst suggestions = ['Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'];\n</script>\n\n<SearchInput bind:value={query} {suggestions} onselect={(val) => console.log('Selected:', val)} />\n```\n\n### DatePicker\n\nDate selection with calendar popup and keyboard navigation.\n\n**Props:**\n\n| Prop          | Type        | Default         | Description             |\n| ------------- | ----------- | --------------- | ----------------------- |\n| `value`       | `Date`      | `null`          | Bindable selected date  |\n| `placeholder` | `string`    | `'Select date'` | Input placeholder       |\n| `min`         | `Date`      | `null`          | Minimum selectable date |\n| `max`         | `Date`      | `null`          | Maximum selectable date |\n| `disabled`    | `boolean`   | `false`         | Disabled state          |\n| `size`        | `InputSize` | `'md'`          | Input size: sm, md, lg  |\n| `format`      | `string`    | `'yyyy-MM-dd'`  | Date format string      |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { DatePicker } from '@aspect-ops/exon-ui';\n\n\tlet selectedDate = $state(null);\n</script>\n\n<DatePicker bind:value={selectedDate} placeholder=\"Choose a date\" />\n```\n\n### TimePicker\n\nTime selection with scrollable hour/minute/period picker.\n\n**Props:**\n\n| Prop         | Type             | Default | Description                 |\n| ------------ | ---------------- | ------- | --------------------------- |\n| `value`      | `string`         | `''`    | Bindable time value (HH:mm) |\n| `format`     | `'12h' \\| '24h'` | `'24h'` | Time format                 |\n| `minuteStep` | `number`         | `1`     | Minute increment step       |\n| `min`        | `string`         | -       | Minimum selectable time     |\n| `max`        | `string`         | -       | Maximum selectable time     |\n| `disabled`   | `boolean`        | `false` | Disabled state              |\n| `size`       | `InputSize`      | `'md'`  | Input size: sm, md, lg      |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { TimePicker } from '@aspect-ops/exon-ui';\n\n\tlet time = $state('');\n</script>\n\n<TimePicker bind:value={time} format=\"12h\" minuteStep={15} />\n```\n\n### FileUpload\n\nDrag-and-drop file upload with image previews and validation.\n\n**Props:**\n\n| Prop          | Type      | Default | Description                      |\n| ------------- | --------- | ------- | -------------------------------- |\n| `files`       | `File[]`  | `[]`    | Bindable array of uploaded files |\n| `accept`      | `string`  | `''`    | Accepted file types              |\n| `multiple`    | `boolean` | `false` | Allow multiple file selection    |\n| `maxSize`     | `number`  | `10MB`  | Maximum file size in bytes       |\n| `maxFiles`    | `number`  | `10`    | Maximum number of files          |\n| `showPreview` | `boolean` | `true`  | Show image previews              |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { FileUpload } from '@aspect-ops/exon-ui';\n\n\tlet files = $state([]);\n</script>\n\n<FileUpload bind:files multiple accept=\"image/*\" maxSize={5242880} />\n```\n\n### OTPInput\n\nOne-time password input with auto-focus and paste support.\n\n**Props:**\n\n| Prop         | Type                          | Default     | Description                      |\n| ------------ | ----------------------------- | ----------- | -------------------------------- |\n| `value`      | `string`                      | `''`        | Bindable OTP value               |\n| `length`     | `number`                      | `6`         | Number of OTP digits             |\n| `type`       | `'numeric' \\| 'alphanumeric'` | `'numeric'` | Input validation type            |\n| `masked`     | `boolean`                     | `false`     | Show dots instead of characters  |\n| `disabled`   | `boolean`                     | `false`     | Disabled state                   |\n| `size`       | `Size`                        | `'md'`      | Input size: sm, md, lg           |\n| `oncomplete` | `function`                    | -           | Callback when all digits entered |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { OTPInput } from '@aspect-ops/exon-ui';\n\n\tlet otp = $state('');\n</script>\n\n<OTPInput bind:value={otp} length={6} oncomplete={(code) => console.log('OTP:', code)} />\n```\n\n### NumberInput\n\nNumber input with increment/decrement buttons and keyboard support.\n\n**Props:**\n\n| Prop            | Type                      | Default | Description                 |\n| --------------- | ------------------------- | ------- | --------------------------- |\n| `value`         | `number \\| null`          | `null`  | Bindable number value       |\n| `min`           | `number`                  | -       | Minimum allowed value       |\n| `max`           | `number`                  | -       | Maximum allowed value       |\n| `step`          | `number`                  | `1`     | Increment/decrement step    |\n| `disabled`      | `boolean`                 | `false` | Disabled state              |\n| `placeholder`   | `string`                  | -       | Input placeholder           |\n| `error`         | `boolean`                 | `false` | Error state styling         |\n| `onValueChange` | `(value: number) => void` | -       | Callback when value changes |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { NumberInput } from '@aspect-ops/exon-ui';\n\n\tlet quantity = $state(1);\n</script>\n\n<NumberInput bind:value={quantity} min={1} max={99} step={1} />\n\n<!-- With error state -->\n<NumberInput bind:value={quantity} min={0} max={10} error={quantity > 10} />\n```\n\n### ToggleGroup\n\nButton group for single or multiple selection.\n\n**Props (ToggleGroup):**\n\n| Prop            | Type                         | Default        | Description                 |\n| --------------- | ---------------------------- | -------------- | --------------------------- |\n| `type`          | `'single' \\| 'multiple'`     | `'single'`     | Selection mode              |\n| `value`         | `string \\| string[]`         | `'' \\| []`     | Bindable selected value(s)  |\n| `onValueChange` | `(value) => void`            | -              | Callback when value changes |\n| `disabled`      | `boolean`                    | `false`        | Disabled state              |\n| `orientation`   | `'horizontal' \\| 'vertical'` | `'horizontal'` | Layout direction            |\n\n**Props (ToggleGroupItem):**\n\n| Prop       | Type      | Default | Description           |\n| ---------- | --------- | ------- | --------------------- |\n| `value`    | `string`  | -       | Item value (required) |\n| `disabled` | `boolean` | `false` | Disabled state        |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { ToggleGroup, ToggleGroupItem } from '@aspect-ops/exon-ui';\n\n\tlet alignment = $state('left');\n\tlet formats = $state([]);\n</script>\n\n<!-- Single selection (radio-like) -->\n<ToggleGroup bind:value={alignment} type=\"single\">\n\t{#snippet children()}\n\t\t<ToggleGroupItem value=\"left\">Left</ToggleGroupItem>\n\t\t<ToggleGroupItem value=\"center\">Center</ToggleGroupItem>\n\t\t<ToggleGroupItem value=\"right\">Right</ToggleGroupItem>\n\t{/snippet}\n</ToggleGroup>\n\n<!-- Multiple selection (checkbox-like) -->\n<ToggleGroup bind:value={formats} type=\"multiple\">\n\t{#snippet children()}\n\t\t<ToggleGroupItem value=\"bold\">B</ToggleGroupItem>\n\t\t<ToggleGroupItem value=\"italic\">I</ToggleGroupItem>\n\t\t<ToggleGroupItem value=\"underline\">U</ToggleGroupItem>\n\t{/snippet}\n</ToggleGroup>\n```\n\n### Pagination\n\nPage navigation with ellipsis for large page ranges.\n\n**Props:**\n\n| Prop           | Type                     | Default | Description                       |\n| -------------- | ------------------------ | ------- | --------------------------------- |\n| `currentPage`  | `number`                 | -       | Current page number (required)    |\n| `totalPages`   | `number`                 | -       | Total number of pages (required)  |\n| `siblingCount` | `number`                 | `1`     | Pages to show around current page |\n| `onPageChange` | `(page: number) => void` | -       | Callback when page changes        |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { Pagination } from '@aspect-ops/exon-ui';\n\n\tlet currentPage = $state(1);\n\tconst totalPages = 20;\n</script>\n\n<Pagination {currentPage} {totalPages} onPageChange={(page) => (currentPage = page)} />\n\n<!-- With more visible siblings -->\n<Pagination\n\t{currentPage}\n\t{totalPages}\n\tsiblingCount={2}\n\tonPageChange={(page) => (currentPage = page)}\n/>\n```\n\n**Keyboard Navigation:**\n\n- `←` / `→`: Previous / Next page\n- `Home`: First page\n- `End`: Last page\n\n## Data Display Components\n\n### Accordion\n\nCollapsible content panels with single or multiple expansion.\n\n**Props:**\n\n| Prop       | Type                 | Default | Description                     |\n| ---------- | -------------------- | ------- | ------------------------------- |\n| `value`    | `string \\| string[]` | `[]`    | Bindable expanded item value(s) |\n| `multiple` | `boolean`            | `false` | Allow multiple panels open      |\n| `disabled` | `boolean`            | `false` | Disabled state                  |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { Accordion, AccordionItem } from '@aspect-ops/exon-ui';\n\n\tlet expanded = $state([]);\n</script>\n\n<Accordion bind:value={expanded} multiple>\n\t{#snippet children()}\n\t\t<AccordionItem value=\"item1\" title=\"Section 1\">Content for section 1</AccordionItem>\n\t\t<AccordionItem value=\"item2\" title=\"Section 2\">Content for section 2</AccordionItem>\n\t{/snippet}\n</Accordion>\n```\n\n### Slider\n\nRange slider with drag, keyboard support, and optional value display.\n\n**Props:**\n\n| Prop        | Type      | Default | Description           |\n| ----------- | --------- | ------- | --------------------- |\n| `value`     | `number`  | `0`     | Bindable slider value |\n| `min`       | `number`  | `0`     | Minimum value         |\n| `max`       | `number`  | `100`   | Maximum value         |\n| `step`      | `number`  | `1`     | Value increment step  |\n| `disabled`  | `boolean` | `false` | Disabled state        |\n| `showValue` | `boolean` | `false` | Show value tooltip    |\n| `showTicks` | `boolean` | `false` | Show tick marks       |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { Slider } from '@aspect-ops/exon-ui';\n\n\tlet volume = $state(50);\n</script>\n\n<Slider bind:value={volume} min={0} max={100} showValue />\n```\n\n### Carousel\n\nImage/content carousel with swipe gestures and autoplay.\n\n**Props:**\n\n| Prop               | Type      | Default | Description                 |\n| ------------------ | --------- | ------- | --------------------------- |\n| `activeIndex`      | `number`  | `0`     | Bindable active slide index |\n| `autoplay`         | `boolean` | `false` | Enable autoplay             |\n| `autoplayInterval` | `number`  | `5000`  | Autoplay interval (ms)      |\n| `loop`             | `boolean` | `true`  | Loop slides                 |\n| `showIndicators`   | `boolean` | `true`  | Show dot indicators         |\n| `showArrows`       | `boolean` | `true`  | Show navigation arrows      |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { Carousel, CarouselSlide } from '@aspect-ops/exon-ui';\n\n\tlet activeSlide = $state(0);\n</script>\n\n<Carousel bind:activeIndex={activeSlide} autoplay loop>\n\t{#snippet children()}\n\t\t<CarouselSlide><img src=\"slide1.jpg\" alt=\"Slide 1\" /></CarouselSlide>\n\t\t<CarouselSlide><img src=\"slide2.jpg\" alt=\"Slide 2\" /></CarouselSlide>\n\t\t<CarouselSlide><img src=\"slide3.jpg\" alt=\"Slide 3\" /></CarouselSlide>\n\t{/snippet}\n</Carousel>\n```\n\n### Image\n\nLazy-loading image with placeholder and fallback support.\n\n**Props:**\n\n| Prop          | Type                | Default   | Description                     |\n| ------------- | ------------------- | --------- | ------------------------------- |\n| `src`         | `string`            | -         | Image source URL (required)     |\n| `alt`         | `string`            | -         | Alt text (required)             |\n| `loading`     | `'lazy' \\| 'eager'` | `'lazy'`  | Loading strategy                |\n| `objectFit`   | `string`            | `'cover'` | CSS object-fit value            |\n| `placeholder` | `string`            | -         | Placeholder image or color      |\n| `fallback`    | `string`            | -         | Fallback image on error         |\n| `rounded`     | `boolean \\| string` | `false`   | Border radius: sm, md, lg, full |\n| `aspectRatio` | `string`            | -         | CSS aspect ratio                |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { Image } from '@aspect-ops/exon-ui';\n</script>\n\n<Image\n\tsrc=\"profile.jpg\"\n\talt=\"User profile\"\n\trounded=\"full\"\n\taspectRatio=\"1/1\"\n\tplaceholder=\"#e5e7eb\"\n\tfallback=\"default-avatar.png\"\n/>\n```\n\n### Rating\n\nStar rating display and input with half-star support.\n\n**Props:**\n\n| Prop        | Type      | Default | Description             |\n| ----------- | --------- | ------- | ----------------------- |\n| `value`     | `number`  | `0`     | Bindable rating value   |\n| `max`       | `number`  | `5`     | Maximum rating          |\n| `allowHalf` | `boolean` | `false` | Allow half-star ratings |\n| `readonly`  | `boolean` | `false` | Read-only display mode  |\n| `disabled`  | `boolean` | `false` | Disabled state          |\n| `size`      | `Size`    | `'md'`  | Star size: sm, md, lg   |\n| `showValue` | `boolean` | `false` | Show numeric value      |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { Rating } from '@aspect-ops/exon-ui';\n\n\tlet rating = $state(4.5);\n</script>\n\n<Rating bind:value={rating} allowHalf showValue />\n```\n\n## Navigation & Feedback Components\n\n### Stepper\n\nMulti-step progress indicator with linear or non-linear navigation.\n\n**Props:**\n\n| Prop          | Type                         | Default        | Description                   |\n| ------------- | ---------------------------- | -------------- | ----------------------------- |\n| `activeStep`  | `number`                     | `0`            | Bindable active step index    |\n| `orientation` | `'horizontal' \\| 'vertical'` | `'horizontal'` | Layout orientation            |\n| `linear`      | `boolean`                    | `true`         | Enforce sequential navigation |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { Stepper, StepperStep } from '@aspect-ops/exon-ui';\n\n\tlet currentStep = $state(0);\n</script>\n\n<Stepper bind:activeStep={currentStep}>\n\t{#snippet children()}\n\t\t<StepperStep label=\"Personal Info\" description=\"Enter your details\" />\n\t\t<StepperStep label=\"Address\" description=\"Shipping information\" />\n\t\t<StepperStep label=\"Review\" description=\"Confirm your order\" />\n\t{/snippet}\n</Stepper>\n```\n\n### Chip\n\nCompact tag/filter chips with selection and removal.\n\n**Props:**\n\n| Prop        | Type          | Default     | Description                                      |\n| ----------- | ------------- | ----------- | ------------------------------------------------ |\n| `variant`   | `ChipVariant` | `'filled'`  | Chip style: filled, outlined, soft               |\n| `color`     | `ChipColor`   | `'default'` | Color: default, primary, success, warning, error |\n| `size`      | `ChipSize`    | `'md'`      | Size: sm, md, lg                                 |\n| `removable` | `boolean`     | `false`     | Show remove button                               |\n| `selected`  | `boolean`     | `false`     | Selected state                                   |\n| `disabled`  | `boolean`     | `false`     | Disabled state                                   |\n\n**Usage:**\n\n```svelte\n<script>\n\timport { Chip, ChipGroup } from '@aspect-ops/exon-ui';\n\n\tlet selected = $state(['tag1']);\n</script>\n\n<ChipGroup>\n\t<Chip onclick={() => console.log('clicked')}>JavaScript</Chip>\n\t<Chip color=\"primary\" removable onremove={() => console.log('removed')}>Svelte</Chip>\n\t<Chip variant=\"outlined\" color=\"success\">TypeScript</Chip>\n</ChipGroup>\n```\n\n## Mobile Components\n\nComponents optimized for Capacitor mobile apps with gesture support, haptic feedback, and safe area handling.\n\n| Component       | Description                                 |\n| --------------- | ------------------------------------------- |\n| `ActionSheet`   | iOS/Android-style bottom action menu        |\n| `BottomSheet`   | Draggable bottom sheet with snap points     |\n| `FAB`           | Floating action button with positions       |\n| `FABGroup`      | Speed dial FAB with expandable actions      |\n| `PullToRefresh` | Pull-to-refresh gesture for lists           |\n| `SwipeActions`  | Swipe-to-reveal actions on list items       |\n| `SafeArea`      | Safe area inset wrapper for notched devices |\n\n### ActionSheet\n\n```svelte\n<script>\n\timport { ActionSheet, ActionSheetItem, Button } from '@aspect-ops/exon-ui';\n\n\tlet open = $state(false);\n</script>\n\n<Button onclick={() => (open = true)}>Show Actions</Button>\n\n<ActionSheet bind:open title=\"Choose an action\" description=\"Select what you want to do\">\n\t{#snippet actions()}\n\t\t<ActionSheetItem onclick={() => console.log('Edit')}>Edit</ActionSheetItem>\n\t\t<ActionSheetItem onclick={() => console.log('Share')}>Share</ActionSheetItem>\n\t\t<ActionSheetItem destructive onclick={() => console.log('Delete')}>Delete</ActionSheetItem>\n\t{/snippet}\n</ActionSheet>\n```\n\n**Props:**\n\n- `open` - Bindable open state\n- `title` - Optional header title\n- `description` - Optional header description\n- `cancelLabel` - Cancel button text (default: \"Cancel\")\n- `showCancel` - Show cancel button (default: true)\n- `closeOnSelect` - Close when action selected (default: true)\n\n### BottomSheet\n\n```svelte\n<script>\n\timport { BottomSheet, BottomSheetHeader, BottomSheetBody, Button } from '@aspect-ops/exon-ui';\n\n\tlet open = $state(false);\n</script>\n\n<Button onclick={() => (open = true)}>Open Sheet</Button>\n\n<BottomSheet bind:open snapPoints={['half', 'full']} defaultSnapPoint=\"half\">\n\t<BottomSheetHeader>\n\t\t<h3>Sheet Title</h3>\n\t</BottomSheetHeader>\n\t<BottomSheetBody>\n\t\t<p>Drag the handle to resize or swipe down to close.</p>\n\t</BottomSheetBody>\n</BottomSheet>\n```\n\n**Props:**\n\n- `open` - Bindable open state\n- `snapPoints` - Array of snap points: `'min'` | `'half'` | `'full'` | number (px)\n- `defaultSnapPoint` - Initial snap point (default: 'half')\n- `showHandle` - Show drag handle (default: true)\n- `closeOnBackdrop` - Close on backdrop click (default: true)\n- `closeOnEscape` - Close on Escape key (default: true)\n\n### FAB (Floating Action Button)\n\n```svelte\n<script>\n\timport { FAB } from '@aspect-ops/exon-ui';\n</script>\n\n<!-- Basic FAB -->\n<FAB onclick={() => console.log('clicked')}>+</FAB>\n\n<!-- Positioned FAB -->\n<FAB position=\"bottom-left\" size=\"lg\">📝</FAB>\n\n<!-- Extended FAB with label -->\n<FAB extended position=\"bottom-right\">\n\t{#snippet children()}➕{/snippet}\n\t{#snippet label()}Add Item{/snippet}\n</FAB>\n```\n\n**Props:**\n\n- `size` - `'sm'` | `'md'` | `'lg'` (44px, 56px, 72px)\n- `position` - `'bottom-right'` | `'bottom-left'` | `'bottom-center'` | `'top-right'` | `'top-left'`\n- `extended` - Extended FAB with label\n- `disabled` - Disable the button\n\n### FABGroup (Speed Dial)\n\n```svelte\n<script>\n\timport { FABGroup } from '@aspect-ops/exon-ui';\n\n\tconst actions = [\n\t\t{ icon: '📷', label: 'Camera', onAction: () => console.log('Camera') },\n\t\t{ icon: '🖼️', label: 'Gallery', onAction: () => console.log('Gallery') },\n\t\t{ icon: '📎', label: 'Attach', onAction: () => console.log('Attach') }\n\t];\n</script>\n\n<FABGroup {actions} icon=\"+\" closeIcon=\"×\" position=\"bottom-right\" direction=\"up\" />\n```\n\n**Props:**\n\n- `actions` - Array of `{ icon, label, onAction }` objects\n- `icon` - Main FAB icon (default: '+')\n- `closeIcon` - Icon when open (default: '×')\n- `position` - Same as FAB positions\n- `direction` - `'up'` | `'down'` | `'left'` | `'right'`\n\n### PullToRefresh\n\n```svelte\n<script>\n\timport { PullToRefresh } from '@aspect-ops/exon-ui';\n\n\tlet refreshing = $state(false);\n\n\tasync function handleRefresh() {\n\t\t// Fetch new data\n\t\tawait new Promise((r) => setTimeout(r, 2000));\n\t\trefreshing = false;\n\t}\n</script>\n\n<PullToRefresh bind:refreshing onrefresh={handleRefresh}>\n\t<div class=\"content\">\n\t\t<p>Pull down to refresh...</p>\n\t\t<!-- Your scrollable content -->\n\t</div>\n</PullToRefresh>\n```\n\n**Props:**\n\n- `refreshing` - Bindable loading state\n- `threshold` - Pull distance to trigger (default: 80px)\n- `maxPull` - Maximum pull distance (default: 150px)\n- `disabled` - Disable pull-to-refresh\n- `onrefresh` - Callback when threshold reached\n\n### SwipeActions\n\n```svelte\n<script>\n\timport { SwipeActions } from '@aspect-ops/exon-ui';\n\n\tconst leftActions = [\n\t\t{ icon: '📌', label: 'Pin', color: '#3b82f6', onAction: () => console.log('Pin') }\n\t];\n\n\tconst rightActions = [\n\t\t{ icon: '🗑️', label: 'Delete', color: '#ef4444', onAction: () => console.log('Delete') }\n\t];\n</script>\n\n<SwipeActions {leftActions} {rightActions}>\n\t<div class=\"list-item\">\n\t\t<p>Swipe me left or right</p>\n\t</div>\n</SwipeActions>\n```\n\n**Props:**\n\n- `leftActions` - Actions revealed on swipe right\n- `rightActions` - Actions revealed on swipe left\n- `threshold` - Swipe distance to reveal (default: 60px)\n- `disabled` - Disable swipe gestures\n\n**Action object:**\n\n- `icon` - Icon string or emoji\n- `label` - Action label text\n- `color` - Background color\n- `onAction` - Callback when tapped\n\n### SafeArea\n\n```svelte\n<script>\n\timport { SafeArea } from '@aspect-ops/exon-ui';\n</script>\n\n<!-- All edges (default) -->\n<SafeArea>\n\t<main>Content with safe area padding on all sides</main>\n</SafeArea>\n\n<!-- Specific edges -->\n<SafeArea edges={['top', 'bottom']}>\n\t<main>Only top and bottom safe area</main>\n</SafeArea>\n```\n\n**Props:**\n\n- `edges` - Array of edges: `'top'` | `'right'` | `'bottom'` | `'left'` (default: all)\n\n## Website Components\n\n### Chatbot\n\nAI-ready chat widget with session management, typing indicators, and lead capture.\n\n```svelte\n<script>\n\timport { Chatbot } from '@aspect-ops/exon-ui';\n\n\tasync function handleMessage(message, sessionId) {\n\t\t// Call your AI backend (OpenAI, Claude, etc.)\n\t\tconst response = await fetch('/api/chat', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify({ message, sessionId })\n\t\t});\n\t\treturn (await response.json()).reply;\n\t}\n\n\tasync function handleLeadCapture(data, sessionId) {\n\t\t// Send to your CRM\n\t\tawait fetch('/api/leads', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify({ ...data, sessionId })\n\t\t});\n\t}\n</script>\n\n<Chatbot\n\ttitle=\"Support Chat\"\n\tsubtitle=\"We typically reply within minutes\"\n\twelcomeMessage=\"Hello! How can I help you today?\"\n\tonSendMessage={handleMessage}\n\tonLeadCapture={handleLeadCapture}\n\tposition=\"bottom-right\"\n/>\n```\n\n**Props:**\n\n| Prop                | Type       | Default          | Description                               |\n| ------------------- | ---------- | ---------------- | ----------------------------------------- |\n| `title`             | `string`   | `'Chat Support'` | Chat header title                         |\n| `subtitle`          | `string`   | -                | Chat header subtitle                      |\n| `welcomeMessage`    | `string`   | -                | Initial welcome message                   |\n| `placeholder`       | `string`   | `'Type...'`      | Input placeholder text                    |\n| `defaultOpen`       | `boolean`  | `false`          | Open chat on mount                        |\n| `position`          | `string`   | `'bottom-right'` | Position: bottom-right, bottom-left       |\n| `inactivityTimeout` | `number`   | `40000`          | Auto-open after inactivity (ms), 0=off    |\n| `onSendMessage`     | `function` | -                | Callback: `(msg, sessionId) => reply`     |\n| `onLeadCapture`     | `function` | -                | Callback: `(data, sessionId) => void`     |\n| `onEscalate`        | `function` | -                | Callback: `(sessionId, messages) => void` |\n\n### ContactForm\n\nCustomizable contact form with real-time validation and UTM tracking.\n\n```svelte\n<script>\n\timport { ContactForm } from '@aspect-ops/exon-ui';\n\n\tasync function handleSubmit(data) {\n\t\tconst response = await fetch('/api/contact', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify(data)\n\t\t});\n\t\treturn { success: response.ok };\n\t}\n</script>\n\n<ContactForm\n\tsubmitText=\"Send Message\"\n\tsuccessMessage=\"Thank you! We'll be in touch soon.\"\n\tonSubmit={handleSubmit}\n/>\n```\n\n**Props:**\n\n| Prop               | Type            | Default        | Description                           |\n| ------------------ | --------------- | -------------- | ------------------------------------- |\n| `fields`           | `FieldConfig[]` | Default fields | Array of field configurations         |\n| `initialValues`    | `object`        | `{}`           | Initial form values                   |\n| `submitText`       | `string`        | `'Submit'`     | Submit button text                    |\n| `successMessage`   | `string`        | `'Thank you!'` | Success message after submit          |\n| `privacyNotice`    | `string`        | -              | Privacy policy text                   |\n| `extractUtmParams` | `boolean`       | `true`         | Extract UTM params from URL           |\n| `onSubmit`         | `function`      | -              | Callback: `(data) => { success }`     |\n| `onValidate`       | `function`      | -              | Callback: `(isValid, errors) => void` |\n\n**Default fields:** firstName, lastName, email, phone, company, message\n\n### ViewCounter\n\nTrack and display page views with session-based deduplication.\n\n```svelte\n<script>\n\timport { ViewCounter } from '@aspect-ops/exon-ui';\n\n\tasync function getCount(slug) {\n\t\tconst res = await fetch(`/api/views/${slug}`);\n\t\treturn (await res.json()).count;\n\t}\n\n\tasync function trackView(slug) {\n\t\tconst res = await fetch(`/api/views/${slug}`, { method: 'POST' });\n\t\treturn (await res.json()).count;\n\t}\n</script>\n\n<ViewCounter slug=\"blog-post-123\" onGetCount={getCount} onTrackView={trackView} />\n```\n\n**Props:**\n\n| Prop          | Type       | Default | Description                  |\n| ------------- | ---------- | ------- | ---------------------------- |\n| `slug`        | `string`   | -       | Unique content identifier    |\n| `showLabel`   | `boolean`  | `true`  | Show \"views\" label           |\n| `trackView`   | `boolean`  | `true`  | Track view (or just display) |\n| `onGetCount`  | `function` | -       | Callback: `(slug) => count`  |\n| `onTrackView` | `function` | -       | Callback: `(slug) => count`  |\n\n### DoughnutChart\n\nPure SVG doughnut chart with interactive legend (no external dependencies).\n\n```svelte\n<script>\n\timport { DoughnutChart } from '@aspect-ops/exon-ui';\n\n\tconst data = [\n\t\t{ label: 'Direct', value: 45000 },\n\t\t{ label: 'Referral', value: 28000 },\n\t\t{ label: 'Organic', value: 32000 },\n\t\t{ label: 'Social', value: 15000 }\n\t];\n</script>\n\n<DoughnutChart title=\"Traffic Sources\" {data} size={200} showLegend showTotal />\n```\n\n**Props:**\n\n| Prop         | Type       | Default         | Description               |\n| ------------ | ---------- | --------------- | ------------------------- |\n| `title`      | `string`   | -               | Chart title               |\n| `data`       | `array`    | `[]`            | `[{ label, value }, ...]` |\n| `size`       | `number`   | `200`           | Chart size in pixels      |\n| `thickness`  | `number`   | `0.6`           | Doughnut thickness (0-1)  |\n| `colors`     | `string[]` | Default palette | Custom color array        |\n| `showLegend` | `boolean`  | `true`          | Show legend               |\n| `showTotal`  | `boolean`  | `true`          | Show center total         |\n\n## Theming & Customization\n\n### Quick Setup\n\n```svelte\n<script>\n\t// In your root layout (+layout.svelte)\n\timport '@aspect-ops/exon-ui/styles';\n</script>\n```\n\n### Custom Brand Colors\n\nOverride CSS variables in your app's global styles:\n\n```css\n/* src/app.css or global styles */\n:root {\n\t/* Primary brand color */\n\t--color-primary: #8b5cf6; /* Purple */\n\t--color-primary-hover: #7c3aed;\n\t--color-primary-active: #6d28d9;\n\t--color-primary-bg: #ede9fe;\n\n\t/* Secondary */\n\t--color-secondary: #64748b;\n\t--color-secondary-hover: #475569;\n\n\t/* Destructive/Error */\n\t--color-destructive: #dc2626;\n\t--color-error: #dc2626;\n\n\t/* Success */\n\t--color-success: #16a34a;\n\n\t/* Warning */\n\t--color-warning: #d97706;\n}\n```\n\n### Full Design Token Reference\n\n```css\n:root {\n\t/* ===== COLORS ===== */\n\n\t/* Backgrounds */\n\t--color-bg: #fcfcfc; /* Main background */\n\t--color-bg-muted: #f9f9f9; /* Subtle background */\n\t--color-bg-subtle: #f0f0f0; /* More contrast */\n\t--color-bg-hover: #e8e8e8; /* Hover state */\n\t--color-bg-active: #e0e0e0; /* Active/pressed */\n\t--color-bg-elevated: #ffffff; /* Cards, modals */\n\t--color-bg-card: #ffffff; /* Card backgrounds */\n\n\t/* Text */\n\t--color-text: #202020; /* Primary text */\n\t--color-text-muted: #646464; /* Secondary text */\n\t--color-text-subtle: #838383; /* Tertiary text */\n\t--color-text-inverse: #ffffff; /* Text on dark backgrounds */\n\n\t/* Borders */\n\t--color-border: #d9d9d9;\n\t--color-border-hover: #cecece;\n\t--color-border-active: #bbbbbb;\n\n\t/* ===== TYPOGRAPHY ===== */\n\n\t--font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\n\t--font-family-mono: ui-monospace, 'SF Mono', Menlo, Monaco, monospace;\n\n\t/* Fluid type scale (responsive) */\n\t--text-xs: clamp(0.69rem, 0.66rem + 0.14vw, 0.78rem); /* ~11-12px */\n\t--text-sm: clamp(0.83rem, 0.79rem + 0.21vw, 0.97rem); /* ~13-16px */\n\t--text-base: clamp(1rem, 0.93rem + 0.33vw, 1.125rem); /* 16-18px */\n\t--text-lg: clamp(1.13rem, 1.03rem + 0.47vw, 1.41rem); /* ~18-23px */\n\t--text-xl: clamp(1.27rem, 1.14rem + 0.65vw, 1.76rem); /* ~20-28px */\n\t--text-2xl: clamp(1.42rem, 1.25rem + 0.89vw, 2.2rem); /* ~23-35px */\n\t--text-3xl: clamp(1.6rem, 1.37rem + 1.19vw, 2.75rem); /* ~26-44px */\n\t--text-4xl: clamp(1.8rem, 1.49rem + 1.57vw, 3.43rem); /* ~29-55px */\n\n\t/* Font weights */\n\t--font-normal: 400;\n\t--font-medium: 500;\n\t--font-semibold: 600;\n\t--font-bold: 700;\n\n\t/* ===== SPACING ===== */\n\n\t--space-xs: clamp(0.25rem, 0.23rem + 0.11vw, 0.31rem); /* 4-5px */\n\t--space-sm: clamp(0.5rem, 0.46rem + 0.22vw, 0.63rem); /* 8-10px */\n\t--space-md: clamp(1rem, 0.93rem + 0.33vw, 1.125rem); /* 16-18px */\n\t--space-lg: clamp(1.5rem, 1.39rem + 0.54vw, 1.75rem); /* 24-28px */\n\t--space-xl: clamp(2rem, 1.85rem + 0.76vw, 2.5rem); /* 32-40px */\n\t--space-2xl: clamp(3rem, 2.78rem + 1.09vw, 3.75rem); /* 48-60px */\n\n\t/* ===== BORDER RADIUS ===== */\n\n\t--radius-sm: 0.25rem; /* 4px */\n\t--radius-md: 0.375rem; /* 6px */\n\t--radius-lg: 0.5rem; /* 8px */\n\t--radius-xl: 0.75rem; /* 12px */\n\t--radius-2xl: 1rem; /* 16px */\n\t--radius-full: 9999px; /* Pill/circle */\n\n\t/* ===== SHADOWS ===== */\n\n\t--shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1);\n\t--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);\n\t--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);\n\t--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1);\n\n\t/* ===== TRANSITIONS ===== */\n\n\t--transition-fast: 150ms ease;\n\t--transition-base: 200ms ease;\n\t--transition-slow: 300ms ease;\n\n\t/* ===== MOBILE ===== */\n\n\t--touch-target-min: 44px;\n\t--safe-area-top: env(safe-area-inset-top, 0px);\n\t--safe-area-bottom: env(safe-area-inset-bottom, 0px);\n}\n```\n\n### Dark Mode\n\nThe library supports dark mode via `data-theme` attribute or system preference:\n\n```svelte\n<script>\n\tlet isDark = $state(false);\n\n\tfunction toggleTheme() {\n\t\tisDark = !isDark;\n\t\tdocument.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light');\n\t}\n\n\t// Respect system preference on load\n\timport { onMount } from 'svelte';\n\tonMount(() => {\n\t\tif (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n\t\t\tisDark = true;\n\t\t\tdocument.documentElement.setAttribute('data-theme', 'dark');\n\t\t}\n\t});\n</script>\n\n<Switch bind:checked={isDark} onchange={toggleTheme}>\n\t{#snippet children()}Dark Mode{/snippet}\n</Switch>\n```\n\nDark theme automatically adjusts all colors:\n\n```css\n[data-theme='dark'] {\n\t--color-bg: #111111;\n\t--color-bg-muted: #191919;\n\t--color-bg-elevated: #222222;\n\t--color-text: #eeeeee;\n\t--color-text-muted: #b4b4b4;\n\t--color-border: #3a3a3a;\n\t/* All other colors auto-adapt */\n}\n```\n\n### Component-Level Customization\n\nOverride styles for specific components using CSS classes:\n\n```svelte\n<Button class=\"my-custom-button\" variant=\"primary\">Custom Button</Button>\n\n<style>\n\t:global(.my-custom-button) {\n\t\t--color-primary: #10b981;\n\t\tborder-radius: var(--radius-full);\n\t\ttext-transform: uppercase;\n\t}\n</style>\n```\n\n### Platform-Specific Styling\n\nComponents adapt to iOS/Android automatically. Set platform manually:\n\n```svelte\n<script>\n\timport { onMount } from 'svelte';\n\n\tonMount(() => {\n\t\t// Auto-detect or set manually\n\t\tconst isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\n\t\tdocument.documentElement.setAttribute('data-platform', isIOS ? 'ios' : 'android');\n\t});\n</script>\n```\n\n## Mobile / Capacitor Support\n\nComponents are designed with mobile-first principles:\n\n- **44px minimum touch targets** for buttons and interactive elements\n- **Safe area inset handling** for notched devices (iPhone, Android gesture bar)\n- **Responsive breakpoints** for adaptive layouts\n- **Hardware-accelerated animations** for smooth 60fps performance\n- **Haptic feedback** integration (requires Capacitor Haptics plugin)\n- **Platform-adaptive styling** for iOS and Android\n\n### Capacitor Integration\n\n```bash\n# Install Capacitor plugins for full mobile support\nnpm install @capacitor/haptics @capacitor/status-bar\n```\n\n```svelte\n<script>\n\timport { SafeArea, BottomNav, PullToRefresh } from '@aspect-ops/exon-ui';\n</script>\n\n<SafeArea edges={['top', 'bottom']}>\n\t<PullToRefresh onrefresh={handleRefresh}>\n\t\t<main>Your content here</main>\n\t</PullToRefresh>\n\t<BottomNav {items} />\n</SafeArea>\n```\n\n## TypeScript\n\nAll components include TypeScript definitions:\n\n```typescript\nimport type {\n\tButtonProps,\n\tButtonVariant,\n\tTypographyProps,\n\tTabsProps,\n\tMenuItemProps\n} from '@aspect-ops/exon-ui';\n```\n\n## Browser Support\n\n- Chrome/Edge 88+\n- Firefox 78+\n- Safari 14+\n- iOS Safari 14+\n- Chrome for Android 88+\n\n## Contributing\n\nContributions are welcome! Please read our contributing guidelines before submitting a PR.\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n---\n\nBuilt with Svelte 5 and Bits UI\n","readmeFilename":"README.md"}