{"_id":"@edujed/jedsvelted-ui","_rev":"7-45a0f839aeb0af4b953be312d33c63aa","name":"@edujed/jedsvelted-ui","dist-tags":{"latest":"0.1.0","alpha":"0.0.1-alpha.5"},"versions":{"0.0.1":{"name":"@edujed/jedsvelted-ui","version":"0.0.1","keywords":["svelte","svelte5","bits-ui","ui-components"],"author":{"name":"Eduardo Jedliczka","email":"edujed@gmail.com"},"license":"GPL-3.0-or-later","_id":"@edujed/jedsvelted-ui@0.0.1","maintainers":[{"name":"edujed","email":"edujed@gmail.com"}],"dist":{"shasum":"70ff804d85f2a5b2f8fdbbb372d76eb8414e6726","tarball":"https://registry.npmjs.org/@edujed/jedsvelted-ui/-/jedsvelted-ui-0.0.1.tgz","fileCount":119,"integrity":"sha512-/lF9zQZkufQbEA4wcbXN1tQhdcuHzkmD1xlBKnw0wQudh1iZJxSgntaG2W1S6Kpz3KENnP2vJvRLvM8DfPdzAA==","signatures":[{"sig":"MEUCIGeVumMGCd41GR3c+Yday0JRiF81QDmjyOB4BG9wJAllAiEA7OWl/Yt1NVS2BO4FDnNgvh+otU7Ov2g4/7Huv/IdEJ4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171544},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./ui/*":{"types":"./dist/ui/*.d.ts","svelte":"./dist/ui/*.svelte"},"./nav/*":{"types":"./dist/nav/*.d.ts","svelte":"./dist/nav/*.svelte"},"./info/*":{"types":"./dist/info/*.d.ts","svelte":"./dist/info/*.svelte"},"./tabs/*":{"types":"./dist/tabs/*.d.ts","svelte":"./dist/tabs/*.svelte"},"./forms/*":{"types":"./dist/forms/*.d.ts","svelte":"./dist/forms/*.svelte"},"./icons/*":{"types":"./dist/icons/*.d.ts","svelte":"./dist/icons/*.svelte"},"./pages/*":{"types":"./dist/pages/*.d.ts","svelte":"./dist/pages/*.svelte"},"./table/*":{"types":"./dist/table/*.d.ts","svelte":"./dist/table/*.svelte"},"./theme/*":{"types":"./dist/theme/*.d.ts","svelte":"./dist/theme/*.svelte"},"./container/*":{"types":"./dist/container/*.d.ts","svelte":"./dist/container/*.svelte"}},"gitHead":"0539f30a16b9aa48386d5d2f3dbdae38f9d091f5","scripts":{"dev":"vite dev","lint":"prettier --check . && eslint .","test":"vitest --ui","build":"npm run prepack","check":"svelte-check","format":"prettier --write .","prepack":"svelte-package","test:run":"vitest run","check:watch":"svelte-check --watch"},"_npmUser":{"name":"edujed","email":"edujed@gmail.com"},"_npmVersion":"11.19.0","description":"A collection of reusable UI components for Svelte 5 applications.","directories":{},"_nodeVersion":"20.20.2","allowScripts":{"esbuild@0.28.2":true,"svelte-preprocess@6.0.5":true},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.2","jsdom":"^29.1.1","eslint":"^10.4.1","svelte":"^5.56.8","vitest":"^3.2.7","bits-ui":"^2.19.0","globals":"^17.6.0","publint":"^0.3.21","prettier":"^3.8.3","happy-dom":"^20.11.7","@eslint/js":"^10.0.1","@vitest/ui":"^3.2.7","typescript":"^6.0.3","@types/node":"^24.13.3","svelte-check":"^4.7.3","@tsconfig/svelte":"^5.0.8","@sveltejs/package":"^2.5.8","svelte-preprocess":"^6.0.5","typescript-eslint":"^8.68.0","eslint-plugin-svelte":"^3.19.0","eslint-config-prettier":"^10.1.8","prettier-plugin-svelte":"^4.1.0","@sveltejs/vite-plugin-svelte":"^7.3.0"},"peerDependencies":{"svelte":"^5.0.0","bits-ui":"^2.19.0"},"_npmOperationalInternal":{"tmp":"tmp/jedsvelted-ui_0.0.1_1788014279419_0.7938613290849115","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-a":{"name":"@edujed/jedsvelted-ui","version":"0.0.1-a","keywords":["svelte","svelte5","bits-ui","ui-components"],"author":{"name":"Eduardo Jedliczka","email":"edujed@gmail.com"},"license":"GPL-3.0-or-later","_id":"@edujed/jedsvelted-ui@0.0.1-a","maintainers":[{"name":"edujed","email":"edujed@gmail.com"}],"dist":{"shasum":"7d4b3101ce058d1afffd7971b0cc898c0814c51c","tarball":"https://registry.npmjs.org/@edujed/jedsvelted-ui/-/jedsvelted-ui-0.0.1-a.tgz","fileCount":115,"integrity":"sha512-65edmi9jB50qBl0076LDTVVfDGWXrVeLY08RaYhoPZ4u85ayBA05lxCfKhHsbEXH7SO/bNUYMPP9Vyo+0NHJgQ==","signatures":[{"sig":"MEUCIQCGGK5LsmEwJUJw7loa9Pet8MzorWC+yrhpMg9QxkwgrgIgc9X9TpR3DEfrZpAV6shlPRA0SdA/5hbpIY3X/iLvqn4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172116},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js"},"./nav":{"types":"./dist/nav/index.d.ts","svelte":"./dist/nav/index.js"},"./info":{"types":"./dist/info/index.d.ts","svelte":"./dist/info/index.js"},"./tabs":{"types":"./dist/tabs/index.d.ts","svelte":"./dist/tabs/index.js"},"./ui/*":{"types":"./dist/ui/*.d.ts","svelte":"./dist/ui/*.svelte"},"./forms":{"types":"./dist/forms/index.d.ts","svelte":"./dist/forms/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","svelte":"./dist/icons/index.js"},"./nav/*":{"types":"./dist/nav/*.d.ts","svelte":"./dist/nav/*.svelte"},"./pages":{"types":"./dist/pages/index.d.ts","svelte":"./dist/pages/index.js"},"./table":{"types":"./dist/table/index.d.ts","svelte":"./dist/table/index.js"},"./theme":{"types":"./dist/theme/index.d.ts","svelte":"./dist/theme/index.js"},"./info/*":{"types":"./dist/info/*.d.ts","svelte":"./dist/info/*.svelte"},"./router":{"types":"./dist/router/index.d.ts","svelte":"./dist/router/index.js"},"./tabs/*":{"types":"./dist/tabs/*.d.ts","svelte":"./dist/tabs/*.svelte"},"./forms/*":{"types":"./dist/forms/*.d.ts","svelte":"./dist/forms/*.svelte"},"./icons/*":{"types":"./dist/icons/*.d.ts","svelte":"./dist/icons/*.svelte"},"./pages/*":{"types":"./dist/pages/*.d.ts","svelte":"./dist/pages/*.svelte"},"./table/*":{"types":"./dist/table/*.d.ts","svelte":"./dist/table/*.svelte"},"./theme/*":{"types":"./dist/theme/*.d.ts","svelte":"./dist/theme/*.svelte"},"./container":{"types":"./dist/container/index.d.ts","svelte":"./dist/container/index.js"},"./container/*":{"types":"./dist/container/*.d.ts","svelte":"./dist/container/*.svelte"}},"gitHead":"6373f5388feb44c14abbfb0a1dc04378f0a6b9c9","scripts":{"dev":"vite dev","lint":"prettier --check . && eslint .","test":"vitest --ui","build":"npm run prepack","check":"svelte-check","format":"prettier --write .","prepack":"svelte-package","test:run":"vitest run","check:watch":"svelte-check --watch"},"_npmUser":{"name":"edujed","email":"edujed@gmail.com"},"_npmVersion":"11.19.0","description":"A collection of reusable UI components for Svelte 5 applications.","directories":{},"_nodeVersion":"20.20.2","allowScripts":{"esbuild@0.28.2":true,"svelte-preprocess@6.0.5":true},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"^8.2.2","jsdom":"^29.1.1","eslint":"^10.4.1","svelte":"^5.56.8","vitest":"^3.2.7","bits-ui":"^2.19.0","globals":"^17.6.0","publint":"^0.3.21","prettier":"^3.8.3","happy-dom":"^20.11.7","@eslint/js":"^10.0.1","@vitest/ui":"^3.2.7","typescript":"^6.0.3","@types/node":"^24.13.3","svelte-check":"^4.7.3","@tsconfig/svelte":"^5.0.8","@sveltejs/package":"^2.5.8","svelte-preprocess":"^6.0.5","typescript-eslint":"^8.68.0","eslint-plugin-svelte":"^3.19.0","eslint-config-prettier":"^10.1.8","prettier-plugin-svelte":"^4.1.0","@sveltejs/vite-plugin-svelte":"^7.3.0"},"peerDependencies":{"svelte":"^5.0.0","bits-ui":"^2.19.0"},"_npmOperationalInternal":{"tmp":"tmp/jedsvelted-ui_0.0.1-a_1788033600743_0.5057764516279397","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.2":{"name":"@edujed/jedsvelted-ui","version":"0.0.1-alpha.2","_id":"@edujed/jedsvelted-ui@0.0.1-alpha.2","maintainers":[{"name":"edujed","email":"edujed@gmail.com"}],"dist":{"shasum":"2a7975707717e679b4a284aa6d42dd29ca48b338","tarball":"https://registry.npmjs.org/@edujed/jedsvelted-ui/-/jedsvelted-ui-0.0.1-alpha.2.tgz","fileCount":119,"integrity":"sha512-lZ0Gw//ZiV4S3eoILCO9AfZ/+yt2+VttzXwOV9qYI4TtsDRqN1hmEjNADQzZbV1JC7NsVYEezElqFzuOMQ1uxg==","signatures":[{"sig":"MEUCIQCCpCKcp++2yvaDJaMF8qlOvtL0uBJrfg+8+0mas7izcgIgdqsXom6Hy6B7nymdioTgIJ3Z/PFROmy6bsxpaBclYWs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179951},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js"},"./nav":{"types":"./dist/nav/index.d.ts","svelte":"./dist/nav/index.js"},"./info":{"types":"./dist/info/index.d.ts","svelte":"./dist/info/index.js"},"./tabs":{"types":"./dist/tabs/index.d.ts","svelte":"./dist/tabs/index.js"},"./ui/*":{"types":"./dist/ui/*.d.ts","svelte":"./dist/ui/*.svelte"},"./forms":{"types":"./dist/forms/index.d.ts","svelte":"./dist/forms/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","svelte":"./dist/icons/index.js"},"./nav/*":{"types":"./dist/nav/*.d.ts","svelte":"./dist/nav/*.svelte"},"./pages":{"types":"./dist/pages/index.d.ts","svelte":"./dist/pages/index.js"},"./table":{"types":"./dist/table/index.d.ts","svelte":"./dist/table/index.js"},"./theme":{"types":"./dist/theme/index.d.ts","svelte":"./dist/theme/index.js"},"./info/*":{"types":"./dist/info/*.d.ts","svelte":"./dist/info/*.svelte"},"./router":{"types":"./dist/router/index.d.ts","svelte":"./dist/router/index.js"},"./tabs/*":{"types":"./dist/tabs/*.d.ts","svelte":"./dist/tabs/*.svelte"},"./forms/*":{"types":"./dist/forms/*.d.ts","svelte":"./dist/forms/*.svelte"},"./icons/*":{"types":"./dist/icons/*.d.ts","svelte":"./dist/icons/*.svelte"},"./pages/*":{"types":"./dist/pages/*.d.ts","svelte":"./dist/pages/*.svelte"},"./table/*":{"types":"./dist/table/*.d.ts","svelte":"./dist/table/*.svelte"},"./theme/*":{"types":"./dist/theme/*.d.ts","svelte":"./dist/theme/*.svelte"},"./container":{"types":"./dist/container/index.d.ts","svelte":"./dist/container/index.js"},"./container/*":{"types":"./dist/container/*.d.ts","svelte":"./dist/container/*.svelte"}},"gitHead":"ad9f22783e071eda94d94b7980b588954df9e8a2","scripts":{"lint":"prettier --check . && eslint .","test":"vitest --ui","build":"npm run prepack","check":"svelte-check","format":"prettier --write .","dev:lib":"svelte-package --watch","prepack":"svelte-package","test:run":"vitest run","check:watch":"svelte-check --watch"},"_npmUser":{"name":"edujed","email":"edujed@gmail.com"},"_npmVersion":"11.19.0","description":"A collection of reusable UI components built for applications using **Svelte 5**.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdom":"^29.1.1","eslint":"^10.4.1","svelte":"^5.56.8","vitest":"^3.2.7","bits-ui":"^2.19.0","globals":"^17.6.0","nodemon":"^3.1.14","publint":"^0.3.21","prettier":"^3.8.3","happy-dom":"^20.11.7","@eslint/js":"^10.0.1","@vitest/ui":"^3.2.7","typescript":"^6.0.3","@types/node":"^24.13.3","svelte-check":"^4.7.3","@tsconfig/svelte":"^5.0.8","@sveltejs/package":"^2.5.8","svelte-preprocess":"^6.0.5","typescript-eslint":"^8.68.0","eslint-plugin-svelte":"^3.19.0","eslint-config-prettier":"^10.1.8","prettier-plugin-svelte":"^4.1.0"},"peerDependencies":{"svelte":"^5.0.0","bits-ui":"^2.19.0"},"_npmOperationalInternal":{"tmp":"tmp/jedsvelted-ui_0.0.1-alpha.2_1788347682714_0.8361674001030537","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.3":{"name":"@edujed/jedsvelted-ui","version":"0.0.1-alpha.3","_id":"@edujed/jedsvelted-ui@0.0.1-alpha.3","maintainers":[{"name":"edujed","email":"edujed@gmail.com"}],"dist":{"shasum":"19441bb6fdc1cee64770f059665615a50ae4b470","tarball":"https://registry.npmjs.org/@edujed/jedsvelted-ui/-/jedsvelted-ui-0.0.1-alpha.3.tgz","fileCount":144,"integrity":"sha512-76+SnwxPAIJmYr2DvM8gNyyQcj22qqP8iRSGxOmad0XC0MMowdgUi8rm9EsGWHKY8ximzS/+7iwvQtWzzTKxbg==","signatures":[{"sig":"MEUCIQDGHd7om7GfyhAphLIfHilII+wbgBcQadfM7uLYqxjPDAIgf+4hq0WjhDUWFCnr8AD02SpF2CPC2kf2ZRaMVvu8o48=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200214},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js"},"./nav":{"types":"./dist/nav/index.d.ts","svelte":"./dist/nav/index.js"},"./info":{"types":"./dist/info/index.d.ts","svelte":"./dist/info/index.js"},"./tabs":{"types":"./dist/tabs/index.d.ts","svelte":"./dist/tabs/index.js"},"./ui/*":{"types":"./dist/ui/*.d.ts","svelte":"./dist/ui/*.svelte"},"./forms":{"types":"./dist/forms/index.d.ts","svelte":"./dist/forms/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","svelte":"./dist/icons/index.js"},"./nav/*":{"types":"./dist/nav/*.d.ts","svelte":"./dist/nav/*.svelte"},"./pages":{"types":"./dist/pages/index.d.ts","svelte":"./dist/pages/index.js"},"./table":{"types":"./dist/table/index.d.ts","svelte":"./dist/table/index.js"},"./theme":{"types":"./dist/theme/index.d.ts","svelte":"./dist/theme/index.js"},"./info/*":{"types":"./dist/info/*.d.ts","svelte":"./dist/info/*.svelte"},"./router":{"types":"./dist/router/index.d.ts","svelte":"./dist/router/index.js"},"./tabs/*":{"types":"./dist/tabs/*.d.ts","svelte":"./dist/tabs/*.svelte"},"./actions":{"types":"./dist/actions/index.d.ts","svelte":"./dist/actions/index.js"},"./forms/*":{"types":"./dist/forms/*.d.ts","svelte":"./dist/forms/*.svelte"},"./icons/*":{"types":"./dist/icons/*.d.ts","svelte":"./dist/icons/*.svelte"},"./pages/*":{"types":"./dist/pages/*.d.ts","svelte":"./dist/pages/*.svelte"},"./table/*":{"types":"./dist/table/*.d.ts","svelte":"./dist/table/*.svelte"},"./theme/*":{"types":"./dist/theme/*.d.ts","svelte":"./dist/theme/*.svelte","default":"./dist/theme/*"},"./container":{"types":"./dist/container/index.d.ts","svelte":"./dist/container/index.js"},"./container/*":{"types":"./dist/container/*.d.ts","svelte":"./dist/container/*.svelte"}},"gitHead":"c08916e1f75e9c884926368b0905cfcb62820474","scripts":{"lint":"prettier --check . && eslint .","test":"vitest --ui","build":"npm run prepack","check":"svelte-check","format":"prettier --write .","dev:lib":"svelte-package --watch","prepack":"svelte-package","test:run":"vitest run","check:watch":"svelte-check --watch"},"_npmUser":{"name":"edujed","email":"edujed@gmail.com"},"_npmVersion":"11.19.0","description":"A collection of reusable UI components built for applications using **Svelte 5**.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdom":"^29.1.1","eslint":"^10.4.1","svelte":"^5.56.8","vitest":"^3.2.7","bits-ui":"^2.19.0","globals":"^17.6.0","nodemon":"^3.1.14","publint":"^0.3.21","prettier":"^3.8.3","happy-dom":"^20.11.7","@eslint/js":"^10.0.1","@vitest/ui":"^3.2.7","typescript":"^6.0.3","@types/node":"^24.13.3","svelte-check":"^4.7.3","@tsconfig/svelte":"^5.0.8","@sveltejs/package":"^2.5.8","svelte-preprocess":"^6.0.5","typescript-eslint":"^8.68.0","eslint-plugin-svelte":"^3.19.0","eslint-config-prettier":"^10.1.8","prettier-plugin-svelte":"^4.1.0"},"peerDependencies":{"svelte":"^5.0.0","bits-ui":"^2.19.0"},"_npmOperationalInternal":{"tmp":"tmp/jedsvelted-ui_0.0.1-alpha.3_1788566711794_0.8126147921957274","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.4":{"name":"@edujed/jedsvelted-ui","version":"0.0.1-alpha.4","_id":"@edujed/jedsvelted-ui@0.0.1-alpha.4","maintainers":[{"name":"edujed","email":"edujed@gmail.com"}],"dist":{"shasum":"833718091d9bccd4a91f4bbdd58263fdc8244761","tarball":"https://registry.npmjs.org/@edujed/jedsvelted-ui/-/jedsvelted-ui-0.0.1-alpha.4.tgz","fileCount":173,"integrity":"sha512-MwGVurkAI5NtyM1BoIj8vttoYNT6BR771OQKkRO8qWWcfGXbsLupmw+MmgW6H49uTm9V3Qq+wlKetsFMrdcDsQ==","signatures":[{"sig":"MEUCIQCv2oo6Go5+mjnuznJXgtTBhb8rd744lJYpUPPFQR3mJwIgNinFr+6AyOiWIqLcMQcBZkxR6E/44S43MqVh19stqGI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258730},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js"},"./nav":{"types":"./dist/nav/index.d.ts","svelte":"./dist/nav/index.js"},"./chat":{"types":"./dist/chat/index.d.ts","svelte":"./dist/chat/index.js"},"./i18n":{"types":"./dist/i18n/index.d.ts","svelte":"./dist/i18n/index.js"},"./info":{"types":"./dist/info/index.d.ts","svelte":"./dist/info/index.js"},"./tabs":{"types":"./dist/tabs/index.d.ts","svelte":"./dist/tabs/index.js"},"./ui/*":{"types":"./dist/ui/*.d.ts","svelte":"./dist/ui/*.svelte"},"./forms":{"types":"./dist/forms/index.d.ts","svelte":"./dist/forms/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","svelte":"./dist/icons/index.js"},"./nav/*":{"types":"./dist/nav/*.d.ts","svelte":"./dist/nav/*.svelte"},"./pages":{"types":"./dist/pages/index.d.ts","svelte":"./dist/pages/index.js"},"./table":{"types":"./dist/table/index.d.ts","svelte":"./dist/table/index.js"},"./theme":{"types":"./dist/theme/index.d.ts","svelte":"./dist/theme/index.js"},"./chat/*":{"types":"./dist/chat/*.d.ts","svelte":"./dist/chat/*.svelte"},"./info/*":{"types":"./dist/info/*.d.ts","svelte":"./dist/info/*.svelte"},"./router":{"types":"./dist/router/index.d.ts","svelte":"./dist/router/index.js"},"./tabs/*":{"types":"./dist/tabs/*.d.ts","svelte":"./dist/tabs/*.svelte"},"./actions":{"types":"./dist/actions/index.d.ts","svelte":"./dist/actions/index.js"},"./forms/*":{"types":"./dist/forms/*.d.ts","svelte":"./dist/forms/*.svelte"},"./icons/*":{"types":"./dist/icons/*.d.ts","svelte":"./dist/icons/*.svelte"},"./pages/*":{"types":"./dist/pages/*.d.ts","svelte":"./dist/pages/*.svelte"},"./table/*":{"types":"./dist/table/*.d.ts","svelte":"./dist/table/*.svelte"},"./theme/*":{"types":"./dist/theme/*.d.ts","svelte":"./dist/theme/*.svelte","default":"./dist/theme/*"},"./container":{"types":"./dist/container/index.d.ts","svelte":"./dist/container/index.js"},"./container/*":{"types":"./dist/container/*.d.ts","svelte":"./dist/container/*.svelte"}},"gitHead":"dcf6c171c7525ac8152b82589424904afa243e36","scripts":{"lint":"prettier --check . && eslint .","test":"vitest --ui","build":"npm run prepack","check":"svelte-check","format":"prettier --write .","dev:lib":"svelte-package --watch","prepack":"svelte-package","test:run":"vitest run","check:watch":"svelte-check --watch"},"_npmUser":{"name":"edujed","email":"edujed@gmail.com"},"_npmVersion":"11.19.0","description":"A collection of reusable UI components built for applications using **Svelte 5**.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdom":"^29.1.1","eslint":"^10.4.1","svelte":"^5.56.8","vitest":"^3.2.7","bits-ui":"^2.19.0","globals":"^17.6.0","nodemon":"^3.1.14","publint":"^0.3.21","prettier":"^3.8.3","happy-dom":"^20.11.7","@eslint/js":"^10.0.1","@vitest/ui":"^3.2.7","typescript":"^6.0.3","@types/node":"^24.13.3","svelte-check":"^4.7.3","@tsconfig/svelte":"^5.0.8","@sveltejs/package":"^2.5.8","svelte-preprocess":"^6.0.5","typescript-eslint":"^8.68.0","eslint-plugin-svelte":"^3.19.0","eslint-config-prettier":"^10.1.8","prettier-plugin-svelte":"^4.1.0"},"peerDependencies":{"svelte":"^5.0.0","bits-ui":"^2.19.0"},"_npmOperationalInternal":{"tmp":"tmp/jedsvelted-ui_0.0.1-alpha.4_1788660024842_0.24143396989614008","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-alpha.5":{"name":"@edujed/jedsvelted-ui","version":"0.0.1-alpha.5","_id":"@edujed/jedsvelted-ui@0.0.1-alpha.5","maintainers":[{"name":"edujed","email":"edujed@gmail.com"}],"dist":{"shasum":"358cbd1a5934b7f5de2a07adb10ad1358826a7bc","tarball":"https://registry.npmjs.org/@edujed/jedsvelted-ui/-/jedsvelted-ui-0.0.1-alpha.5.tgz","fileCount":227,"integrity":"sha512-4WuRgb0Opgoj3dL1Rs8QGOS0hOd+T0+NZ1Tvg/3M3m/cA1Sb2ZpE+t75dwLC09hMJOdi680+DKA3QjetrgD/2g==","signatures":[{"sig":"MEYCIQDqd4N1Q5lmUeGC3MOasJPYT8Z6noGXTU5lrOJhuK/yPwIhAIsnyDg8cAf4o6X9GwPhWGbem75/C6AzVED/+oDYZVHT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":362505},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js"},"./nav":{"types":"./dist/nav/index.d.ts","svelte":"./dist/nav/index.js"},"./chat":{"types":"./dist/chat/index.d.ts","svelte":"./dist/chat/index.js"},"./i18n":{"types":"./dist/i18n/index.d.ts","svelte":"./dist/i18n/index.js"},"./info":{"types":"./dist/info/index.d.ts","svelte":"./dist/info/index.js"},"./tabs":{"types":"./dist/tabs/index.d.ts","svelte":"./dist/tabs/index.js"},"./ui/*":{"types":"./dist/ui/*.d.ts","svelte":"./dist/ui/*.svelte"},"./forms":{"types":"./dist/forms/index.d.ts","svelte":"./dist/forms/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","svelte":"./dist/icons/index.js"},"./nav/*":{"types":"./dist/nav/*.d.ts","svelte":"./dist/nav/*.svelte"},"./pages":{"types":"./dist/pages/index.d.ts","svelte":"./dist/pages/index.js"},"./table":{"types":"./dist/table/index.d.ts","svelte":"./dist/table/index.js"},"./theme":{"types":"./dist/theme/index.d.ts","svelte":"./dist/theme/index.js"},"./chat/*":{"types":"./dist/chat/*.d.ts","svelte":"./dist/chat/*.svelte"},"./format":{"types":"./dist/format/index.d.ts","svelte":"./dist/format/index.js"},"./info/*":{"types":"./dist/info/*.d.ts","svelte":"./dist/info/*.svelte"},"./router":{"types":"./dist/router/index.d.ts","svelte":"./dist/router/index.js"},"./tabs/*":{"types":"./dist/tabs/*.d.ts","svelte":"./dist/tabs/*.svelte"},"./actions":{"types":"./dist/actions/index.d.ts","svelte":"./dist/actions/index.js"},"./forms/*":{"types":"./dist/forms/*.d.ts","svelte":"./dist/forms/*.svelte"},"./icons/*":{"types":"./dist/icons/*.d.ts","svelte":"./dist/icons/*.svelte"},"./pages/*":{"types":"./dist/pages/*.d.ts","svelte":"./dist/pages/*.svelte"},"./table/*":{"types":"./dist/table/*.d.ts","svelte":"./dist/table/*.svelte"},"./theme/*":{"types":"./dist/theme/*.d.ts","svelte":"./dist/theme/*.svelte","default":"./dist/theme/*"},"./container":{"types":"./dist/container/index.d.ts","svelte":"./dist/container/index.js"},"./container/*":{"types":"./dist/container/*.d.ts","svelte":"./dist/container/*.svelte"}},"gitHead":"7b56851018ab71c56f034c68878b0649ca4fc3b6","scripts":{"lint":"prettier --check . && eslint .","test":"vitest --ui","build":"npm run prepack","check":"svelte-check","format":"prettier --write .","dev:lib":"svelte-package --watch","prepack":"svelte-package","test:run":"vitest run","check:watch":"svelte-check --watch"},"_npmUser":{"name":"edujed","email":"edujed@gmail.com"},"_npmVersion":"11.19.0","description":"A collection of reusable UI components built for applications using **Svelte 5**.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdom":"^29.1.1","eslint":"^10.4.1","svelte":"^5.56.8","vitest":"^3.2.7","bits-ui":"^2.19.0","globals":"^17.6.0","nodemon":"^3.1.14","publint":"^0.3.21","prettier":"^3.8.3","happy-dom":"^20.11.7","@eslint/js":"^10.0.1","@vitest/ui":"^3.2.7","typescript":"^6.0.3","@types/node":"^24.13.3","svelte-check":"^4.7.3","@tsconfig/svelte":"^5.0.8","@sveltejs/package":"^2.5.8","svelte-preprocess":"^6.0.5","typescript-eslint":"^8.68.0","eslint-plugin-svelte":"^3.19.0","eslint-config-prettier":"^10.1.8","prettier-plugin-svelte":"^4.1.0"},"peerDependencies":{"svelte":"^5.0.0","bits-ui":"^2.19.0"},"_npmOperationalInternal":{"tmp":"tmp/jedsvelted-ui_0.0.1-alpha.5_1788905619614_0.6194814706577423","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"_id":"@edujed/jedsvelted-ui@0.1.0","dist":{"shasum":"5b7b45b7261ea4d8a6950386b0ed08aadb0f925f","tarball":"https://registry.npmjs.org/@edujed/jedsvelted-ui/-/jedsvelted-ui-0.1.0.tgz","fileCount":229,"integrity":"sha512-xcmXgXeHOAGxxA7Wx45Vo9sNSuY4jixo1mx6jAVImBwk9lMpA4ILrUzvT9F9a+wGx38rUslJtmIsxwEL6psh1Q==","signatures":[{"sig":"MEQCICPteeaEG6oiOg60EJiJNnSHOX8MbNrFeYKbl4lYP9okAiBumLJySD6WQ14Dq3Rw60YpqVA3Gph215ETVwttYPp3OQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCr1jhVWrUNlUFeiHA76ooa9h2+p0OlqL9C+5c/YwInuQIgcElrrNYdLXl9WaxnQOBxBe3Llu0O1AgitXuHetKQL/w="}],"unpackedSize":378810},"name":"@edujed/jedsvelted-ui","type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","svelte":"./dist/ui/index.js"},"./nav":{"types":"./dist/nav/index.d.ts","svelte":"./dist/nav/index.js"},"./chat":{"types":"./dist/chat/index.d.ts","svelte":"./dist/chat/index.js"},"./i18n":{"types":"./dist/i18n/index.d.ts","svelte":"./dist/i18n/index.js"},"./info":{"types":"./dist/info/index.d.ts","svelte":"./dist/info/index.js"},"./tabs":{"types":"./dist/tabs/index.d.ts","svelte":"./dist/tabs/index.js"},"./ui/*":{"types":"./dist/ui/*.d.ts","svelte":"./dist/ui/*.svelte"},"./forms":{"types":"./dist/forms/index.d.ts","svelte":"./dist/forms/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","svelte":"./dist/icons/index.js"},"./nav/*":{"types":"./dist/nav/*.d.ts","svelte":"./dist/nav/*.svelte"},"./pages":{"types":"./dist/pages/index.d.ts","svelte":"./dist/pages/index.js"},"./table":{"types":"./dist/table/index.d.ts","svelte":"./dist/table/index.js"},"./theme":{"types":"./dist/theme/index.d.ts","svelte":"./dist/theme/index.js"},"./chat/*":{"types":"./dist/chat/*.d.ts","svelte":"./dist/chat/*.svelte"},"./format":{"types":"./dist/format/index.d.ts","svelte":"./dist/format/index.js"},"./info/*":{"types":"./dist/info/*.d.ts","svelte":"./dist/info/*.svelte"},"./router":{"types":"./dist/router/index.d.ts","svelte":"./dist/router/index.js"},"./tabs/*":{"types":"./dist/tabs/*.d.ts","svelte":"./dist/tabs/*.svelte"},"./actions":{"types":"./dist/actions/index.d.ts","svelte":"./dist/actions/index.js"},"./forms/*":{"types":"./dist/forms/*.d.ts","svelte":"./dist/forms/*.svelte"},"./icons/*":{"types":"./dist/icons/*.d.ts","svelte":"./dist/icons/*.svelte"},"./pages/*":{"types":"./dist/pages/*.d.ts","svelte":"./dist/pages/*.svelte"},"./table/*":{"types":"./dist/table/*.d.ts","svelte":"./dist/table/*.svelte"},"./theme/*":{"types":"./dist/theme/*.d.ts","svelte":"./dist/theme/*.svelte","default":"./dist/theme/*"},"./container":{"types":"./dist/container/index.d.ts","svelte":"./dist/container/index.js"},"./container/*":{"types":"./dist/container/*.d.ts","svelte":"./dist/container/*.svelte"}},"gitHead":"60f61055cc85d0a16f30372743d3f172a2674e27","scripts":{"lint":"prettier --check . && eslint .","test":"vitest --ui","build":"npm run prepack","check":"svelte-check","format":"prettier --write .","dev:lib":"svelte-package --watch","prepack":"svelte-package","test:run":"vitest run","check:watch":"svelte-check --watch"},"version":"0.1.0","_npmUser":{"name":"edujed","email":"edujed@gmail.com"},"_npmVersion":"11.19.0","description":"A collection of reusable UI components built for applications using **Svelte 5**.","directories":{},"maintainers":[{"name":"edujed","email":"edujed@gmail.com"}],"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.1.1","eslint":"^10.4.1","svelte":"^5.56.8","vitest":"^3.2.7","bits-ui":"^2.19.0","globals":"^17.6.0","nodemon":"^3.1.14","publint":"^0.3.21","prettier":"^3.8.3","happy-dom":"^20.11.7","@eslint/js":"^10.0.1","@vitest/ui":"^3.2.7","typescript":"^6.0.3","@types/node":"^24.13.3","svelte-check":"^4.7.3","@tsconfig/svelte":"^5.0.8","@sveltejs/package":"^2.5.8","svelte-preprocess":"^6.0.5","typescript-eslint":"^8.68.0","eslint-plugin-svelte":"^3.19.0","eslint-config-prettier":"^10.1.8","prettier-plugin-svelte":"^4.1.0","@sveltejs/vite-plugin-svelte":"^6.0.0"},"peerDependencies":{"svelte":"^5.0.0","bits-ui":"^2.19.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jedsvelted-ui_0.1.0_1790520606113_0.7691727186057584"}}},"time":{"created":"2026-08-29T14:37:59.150Z","modified":"2026-09-27T14:50:06.375Z","0.0.1":"2026-08-29T14:37:59.581Z","0.0.1-a":"2026-08-29T20:00:00.890Z","0.0.1-alpha.2":"2026-09-02T11:14:42.863Z","0.0.1-alpha.3":"2026-09-05T00:05:11.963Z","0.0.1-alpha.4":"2026-09-06T02:00:24.983Z","0.0.1-alpha.5":"2026-09-08T22:13:39.748Z","0.1.0":"2026-09-27T14:50:06.218Z"},"description":"A collection of reusable UI components built for applications using **Svelte 5**.","maintainers":[{"name":"edujed","email":"edujed@gmail.com"}],"readme":"# jedSvelted-ui\n\nA collection of reusable UI components built for applications using **Svelte 5**.\n\n## 📦 Installation\n\n```bash\nnpm install @edujed/jedsvelted-ui\n# or\npnpm add @edujed/jedsvelted-ui\n# or\nyarn add @edujed/jedsvelted-ui\n```\n\n## ⚙️ Requirements\n\n- Node.js >= 18\n- npm/pnpm/yarn\n- Peer dependencies (automatic): `svelte ^5`, `bits-ui ^2.19`\n\n## 🚀 Setup\n\nThe library ships its own design tokens (CSS custom properties) and built-in\ntranslations. Initialize them once at app startup:\n\n```ts\n// main.ts\nimport { initTheme } from '@edujed/jedsvelted-ui/theme';\nimport { initI18n } from '@edujed/jedsvelted-ui/i18n';\nimport '@edujed/jedsvelted-ui/theme/theme.css';\n\ninitTheme(); // reads localStorage (s-theme / s-mode), applies data-* to <html>\ninitI18n(); // reads localStorage (s-locale), default 'en'\n```\n\nBoth accept an optional prefix to support multiple lib instances on the same\npage: `initTheme('app1')` → `app1-theme` / `app1-mode`, `initI18n('app1')`\n→ `app1-locale`.\n\nAvailable themes: `material-blue` (default), `humanity`, `rose`, `relax`,\n`office`, `candy`. Mode: `light` / `dark`.\n\n## 🧩 Modules\n\n| Module      | Description                                                                                                            |\n| ----------- | ---------------------------------------------------------------------------------------------------------------------- |\n| `actions`   | CRUD action handlers (`createHandleDetail`)                                                                            |\n| `chat`      | Chat UI (`ChatPanel`, `ChatMessage`)                                                                                   |\n| `container` | Panels and CRUD (`Panel`, `SearchPanel`, `DetailPanel`, `CrudPanel`)                                                   |\n| `format`    | Formatting utilities (`formatCurrency`, `formatNumber`, `formatDate`, `parseCurrency`)                                 |\n| `forms`     | Form controls (`EditField`, `NumericField`, `SelectField`, `SliderField`, `DateField`, `CurrencyField`, `SwitchField`, `FormActions`) |\n| `i18n`      | Built-in translations (`initI18n`, `t`, `localeStore`, `LangSelector`) + currency definitions                          |\n| `icons`     | SVG icons (`Icon`, `IconCheck`, `ChevronDownIcon`, etc.)                                                               |\n| `info`      | Visual feedback (`ToastContainer`, `toast`, `Message`, `FieldHint`)                                                    |\n| `nav`       | Navigation (`Navbar`, `Topbar`, `Sidenav`)                                                                             |\n| `pages`     | Page shells (`PageShell`, `DetailShell`, `PageState`)                                                                  |\n| `router`    | Routing and app layout (`HashRouter`, `Layout`)                                                                        |\n| `table`     | Interactive tables (`Table`)                                                                                           |\n| `tabs`      | Tab system (`Tabs`)                                                                                                    |\n| `theme`     | Theme management (`initTheme`, `ThemeSelector`)                                                                        |\n| `ui`        | General UI components (`Button`, `ButtonGroup`, `Badge`, `InfoGrid`, `DeleteConfirm`, `FileTree`, `Skeleton`)          |\n\n### Import styles\n\nThree levels of granularity are available:\n\n```ts\n// 1. Package root — everything in one import (convenience)\nimport { Button, Table, toast, HashRouter } from '@edujed/jedsvelted-ui';\n\n// 2. Module barrel (recommended) — scoped to one module\nimport { Button, Badge } from '@edujed/jedsvelted-ui/ui';\nimport { Table } from '@edujed/jedsvelted-ui/table';\nimport { toast, ToastContainer } from '@edujed/jedsvelted-ui/info';\n\n// 3. Individual file (where available) — most granular\nimport { Button } from '@edujed/jedsvelted-ui/ui/Button';\nimport { Table } from '@edujed/jedsvelted-ui/table/Table';\n```\n\nModule barrels are recommended for readability and tree-shaking; the root\nimport is a convenience for quick prototypes.\n\n> **Note:** `actions`, `format`, `i18n` and `router` only expose the barrel\n> export — use `import { ... } from '@edujed/jedsvelted-ui/<module>'` for those.\n\n### Public type contracts\n\nEvery module exports the **props interfaces** of its components (plus the\ndata shapes they work with), so you can build objects for binding/aggregating\nprops and compose new components on top of the lib's primitives:\n\n```ts\nimport type { ButtonProps, BadgeProps, FileNode } from '@edujed/jedsvelted-ui/ui';\nimport type { TableCol, TableAction } from '@edujed/jedsvelted-ui/table';\nimport type { CrudPanelProps } from '@edujed/jedsvelted-ui/container';\nimport type {\n\tEditFieldProps,\n\tSelectOption,\n\tCurrencyFieldProps,\n\tDateFieldProps,\n\tSwitchFieldProps\n} from '@edujed/jedsvelted-ui/forms';\nimport type { ChatMessageType, ChatPanelProps } from '@edujed/jedsvelted-ui/chat';\nimport type { PageShellProps, DetailAction } from '@edujed/jedsvelted-ui/pages';\nimport type { IconName } from '@edujed/jedsvelted-ui/icons';\nimport type { CurrencyCode, CurrencyDef } from '@edujed/jedsvelted-ui/i18n';\nimport type { SkeletonProps, SkeletonVariant } from '@edujed/jedsvelted-ui/ui';\n```\n\nEach module's types live in a dedicated file (`uiTypes`, `formsTypes`,\n`chatTypes`, …) and are re-exported from the module barrel.\n\n## 📖 Usage\n\n### App shell (router + layout)\n\n```svelte\n<script lang=\"ts\">\n\timport { HashRouter, Layout } from '@edujed/jedsvelted-ui/router';\n\timport { t } from '@edujed/jedsvelted-ui/i18n';\n\n\tconst router = new HashRouter();\n\trouter.add('/users', () => {}, {\n\t\tmoduleName: 'users',\n\t\ttitle: () => t('users'),\n\t\ticon: '👥',\n\t\tshowInMenu: true\n\t});\n\trouter.init();\n</script>\n\n<Layout {router}>\n\t<!-- page content -->\n</Layout>\n```\n\n`RouteMetadata` options: `title` (string or getter for locale reactivity),\n`moduleName`, `icon`, `showInMenu`. The menu-relevant subset of a registered\nroute is typed as `RegisteredRouteItem` (exported by both `router` and `nav`).\n\n### Buttons & badges\n\n```svelte\n<script lang=\"ts\">\n\timport { Button, Badge } from '@edujed/jedsvelted-ui/ui';\n</script>\n\n<Button variant=\"primary\" icon=\"plus\">Add</Button>\n<Button variant=\"danger\" icon=\"trash\">Delete</Button>\n<Badge variant=\"primary\" dismissible onDismiss={() => {}}>label</Badge>\n```\n\n### Panels\n\n```svelte\n<script lang=\"ts\">\n\timport { Panel, SearchPanel, DetailPanel } from '@edujed/jedsvelted-ui/container';\n</script>\n\n<!-- Collapsible panel -->\n<Panel title=\"Settings\" iconName=\"settings\" bind:isOpen>\n\t<!-- content -->\n</Panel>\n\n<!-- Slide-in detail panel -->\n<DetailPanel show={true} title=\"Details\" onClose={() => (show = false)}>\n\t<!-- content -->\n</DetailPanel>\n```\n\n### CRUD panel\n\n`CrudPanel` combines a `Table` with form/view/delete detail panels. It fires a\nsingle `onAction` event on confirmed mutations only:\n\n```svelte\n<script lang=\"ts\">\n\timport { CrudPanel } from '@edujed/jedsvelted-ui/container';\n\timport { FormActions } from '@edujed/jedsvelted-ui/forms';\n\timport type { TableCol } from '@edujed/jedsvelted-ui/table';\n\n\tconst columns: TableCol[] = [\n\t\t{ key: 'name', title: 'Name', sortable: true, filterable: true },\n\t\t{ key: 'email', title: 'Email' }\n\t];\n</script>\n\n<CrudPanel title=\"Users\" csvFileName=\"users.csv\" {columns} {data} onAction={handleAction}>\n\t{#snippet renderForm(onComplete)}\n\t\t<!-- form fields -->\n\t\t<FormActions onSave={() => save(onComplete)} onCancel={() => cancel(onComplete)} />\n\t{/snippet}\n</CrudPanel>\n```\n\n`onAction` receives `(action: 'create' | 'update' | 'delete', item)`.\n\n### Table\n\n```svelte\n<script lang=\"ts\">\n\timport { Table } from '@edujed/jedsvelted-ui/table';\n\timport type { TableCol, TableAction } from '@edujed/jedsvelted-ui/table';\n\n\tconst columns: TableCol[] = [\n\t\t{ key: 'name', title: 'Name', sortable: true, filterable: true, exportable: true },\n\t\t{ key: 'age', title: 'Age', align: 'right', formatter: (v) => String(v) }\n\t];\n\tconst actions: TableAction[] = [{ title: 'View', icon: 'eye', onClick: (row) => view(row) }];\n</script>\n\n<Table\n\tid=\"users\"\n\tcaption=\"Users\"\n\t{data}\n\t{columns}\n\t{actions}\n\trowKey=\"id\"\n\tcsvFileName=\"users.csv\"\n\tonAdd={handleAdd}\n/>\n```\n\n### Forms\n\n```svelte\n<script lang=\"ts\">\n\timport {\n\t\tEditField,\n\t\tNumericField,\n\t\tSelectField,\n\t\tSliderField,\n\t\tDateField,\n\t\tCurrencyField,\n\t\tSwitchField,\n\t\tFormActions\n\t} from '@edujed/jedsvelted-ui/forms';\n</script>\n\n<EditField label=\"Name\" bind:value={name} placeholder=\"Full name\" />\n<NumericField label=\"Top K\" bind:value={topK} min={0} step={1} />\n<SelectField\n\tlabel=\"Role\"\n\tbind:value={role}\n\toptions={[\n\t\t{ key: 'admin', label: 'Admin' },\n\t\t{ key: 'user', label: 'User' }\n\t]}\n/>\n<SliderField label=\"Temperature\" bind:value={temp} min={0.1} max={2} step={0.1} decimals={2} />\n<DateField label=\"Hiring Date\" bind:value={hiringDate} />\n<CurrencyField label=\"Annual Budget\" bind:value={budget} currency=\"BRL\" />\n<SwitchField label=\"Active\" bind:value={active} />\n<FormActions onSave={save} onCancel={cancel} />\n```\n\n### DateField\n\nA date picker (built on `bits-ui` `DatePicker`) with a native `Date` value\n(date-only, no time component). The calendar is portaled to `<body>` so it\nis never clipped by parent overflow.\n\n```svelte\n<script lang=\"ts\">\n\timport { DateField } from '@edujed/jedsvelted-ui/forms';\n\n\tlet hiringDate = $state<Date | undefined>(undefined);\n</script>\n\n<DateField\n\tlabel=\"Hiring Date\"\n\tbind:value={hiringDate}\n\tmin={new Date(2000, 0, 1)}\n\tmax={new Date()}\n/>\n```\n\n### CurrencyField\n\nA monetary value input with locale-aware formatting. The bound `value` is a\nplain `number` (e.g. `1234.56`); the display is formatted with the locale's\ncurrency symbol, thousands separator, and fixed decimal places.\n\n```svelte\n<script lang=\"ts\">\n\timport { CurrencyField } from '@edujed/jedsvelted-ui/forms';\n\timport type { CurrencyCode } from '@edujed/jedsvelted-ui/i18n';\n\n\tlet budget = $state(0);\n\tlet currency = $state<CurrencyCode>('BRL');\n</script>\n\n<CurrencyField label=\"Annual Budget\" bind:value={budget} {currency} />\n<CurrencyField label=\"Price (USD)\" bind:value={price} currency=\"USD\" />\n<CurrencyField label=\"BTC\" bind:value={btc} currency=\"BTC\" />\n```\n\n### SwitchField\n\nA boolean toggle (built on `bits-ui` `Switch`) with a `Yes`/`No` state label\nnext to the track. The bound `value` is a plain `boolean`.\n\n```svelte\n<script lang=\"ts\">\n\timport { SwitchField } from '@edujed/jedsvelted-ui/forms';\n\n\tlet active = $state(false);\n</script>\n\n<SwitchField label=\"Active\" bind:value={active} />\n<SwitchField label=\"Enabled\" bind:value={enabled} disabled />\n```\n\nBehavior:\n\n- **On focus** — the thousands mask is stripped so the user sees a clean number to edit (e.g. `2.100.000,00` → `2100000,00` in pt-BR).\n- **On input** — the bound `value` updates in real time; the display is not re-formatted while typing.\n- **On blur** — the value is committed and the display is re-formatted with thousands separators and fixed decimals.\n- **`decimals`** is optional — defaults to the currency's standard (e.g. `2` for BRL, `0` for JPY, `8` for BTC).\n- **`currency`** accepts any `CurrencyCode` (`USD`, `EUR`, `JPY`, `GBP`, `AUD`, `CAD`, `CHF`, `CNY`, `BRL`, `BTC`, `ETH`).\n- The symbol is reactive to locale changes (e.g. USD shows `$` in en, `US$` in pt-BR).\n\nAll form fields support an optional **rich hint** (3-part popover: title, description, impact):\n\n```svelte\n<SliderField\n\tlabel=\"Temperature\"\n\thintTitle=\"Temperature\"\n\thint=\"Controls randomness of the output.\"\n\thintImpact=\"Lower values make output more focused and deterministic.\"\n\tbind:value={temp}\n\tmin={0.1}\n\tmax={2}\n\tstep={0.1}\n/>\n```\n\nThe hint renders as a `?` icon next to the label. On hover (desktop) or click (mobile) it opens a popover with the three sections. Fields without a hint show a plain label.\n\n### Chat\n\n```svelte\n<script lang=\"ts\">\n\timport { ChatPanel } from '@edujed/jedsvelted-ui/chat';\n\timport type { ChatMessageType } from '@edujed/jedsvelted-ui/chat';\n\n\tlet messages = $state<ChatMessageType[]>([]);\n</script>\n\n<ChatPanel\n\ttitle=\"Chat\"\n\t{messages}\n\t{loading}\n\trenderContent={(msg) => marked.parse(msg.content || '') as string}\n\tonFork={(i) => fork(i)}\n\tonDelete={(i) => del(i)}\n>\n\t<!-- input area as children snippet -->\n</ChatPanel>\n```\n\n`ChatMessageType`:\n\n```ts\n{\n\trole: 'user' | 'assistant' | 'tool' | 'system' | 'error';\n\tcontent: string;\n\tattachedFiles?: string[];\n\tmetrics?: { prompt_tokens?; completion_tokens?; total_tokens?; total_time_ms?; token_speed? };\n\tisStreaming?: boolean;\n\tthoughtContent?: string;\n\ttextHtml?: string;   // pre-rendered HTML (streaming)\n\ttoolName?: string;\n}\n```\n\n### FileTree\n\n```svelte\n<script lang=\"ts\">\n\timport { FileTree } from '@edujed/jedsvelted-ui/ui';\n\timport type { FileNode } from '@edujed/jedsvelted-ui/ui';\n\n\tconst root: FileNode = {\n\t\tname: 'project',\n\t\tpath: '/project',\n\t\tis_dir: true,\n\t\tchildren: [{ name: 'main.ts', path: '/project/main.ts', is_dir: false }]\n\t};\n</script>\n\n<FileTree\n\tnode={root}\n\tselectedFiles={selected}\n\ttoggleFile={toggle}\n\tonViewFile={(path, name) => open(path)}\n/>\n```\n\n### Toasts\n\n```svelte\n<script lang=\"ts\">\n\timport { toast, ToastContainer } from '@edujed/jedsvelted-ui/info';\n</script>\n\n<!-- render once in App -->\n<ToastContainer />\n```\n\n```ts\ntoast.success('Saved!');\ntoast.warning('Item deleted');\ntoast.error('Something went wrong');\n```\n\n`FieldHint` renders a label with a `?` popover hint (used internally by form fields):\n\n```svelte\n<FieldHint label=\"Temperature\" hint=\"Sampling temperature\" labelFor=\"temp\" />\n\n<!-- Rich variant (title + description + impact) -->\n<FieldHint\n\tlabel=\"Temperature\"\n\thintTitle=\"Temperature\"\n\thint=\"Controls randomness of the output.\"\n\thintImpact=\"Lower values make output more focused.\"\n\tlabelFor=\"temp\"\n/>\n```\n\n### Navigation\n\n```svelte\n<script lang=\"ts\">\n\timport { Navbar, Sidenav, Topbar } from '@edujed/jedsvelted-ui/nav';\n</script>\n\n<Navbar {router} onMenuClick={toggleSidenav} />\n<Sidenav {router} isOpen={sidenavOpen} onOverlayClick={closeSidenav} />\n```\n\n`Navbar` wraps `Topbar` (title from the router, theme/lang selectors, mode\ntoggle) and receives the `router` instance. `Sidenav` renders the menu from\nroutes registered with `showInMenu: true`.\n\n### Page shells\n\n```svelte\n<script lang=\"ts\">\n\timport { PageShell, DetailShell } from '@edujed/jedsvelted-ui/pages';\n</script>\n\n<PageShell title=\"Users\" onSearch={search} onClear={clear} skeletonVariant=\"table\" skeletonRows={5}>\n\t{#snippet content(state)}\n\t\t<!-- table / list — state.show(row) opens the detail panel -->\n\t{/snippet}\n\t{#snippet detailContent(state)}\n\t\t<!-- detail / edit / delete content -->\n\t{/snippet}\n</PageShell>\n```\n\n`PageShell` owns a `PageState` instance (passed to the snippets) holding\n`loading`, `error`, `showDetail`, `selectedItem`, `detailAction` — with\n`show()`, `edit()`, `deleteRow()`, `close()`, `setLoading()`, `setError()`,\n`setLoadingFor(ms)` and `subscribe()`.\n\nWhile `loading` is true, `PageShell` renders a `Skeleton` placeholder\n(configurable via `skeletonVariant` and `skeletonRows`). `setLoadingFor(ms)`\nis a convenience for demoing the loading state with synchronous/mock data.\n\n`DetailShell` is a standalone detail panel manager (modes: `detail` / `edit`\n/ `delete`) with title derivation and close delegation. It also supports a\n`loading` prop that renders a `Skeleton` (default variant: `list`) while the\ndetail content is being fetched.\n\n### Skeleton\n\nA placeholder block shown while content is loading. Supports five variants:\n`text`, `circle`, `rect`, `list`, and `table`.\n\n```svelte\n<script lang=\"ts\">\n\timport { Skeleton } from '@edujed/jedsvelted-ui/ui';\n</script>\n\n<!-- Single text line -->\n<Skeleton variant=\"text\" width=\"60%\" />\n\n<!-- Circular avatar placeholder -->\n<Skeleton variant=\"circle\" height={40} />\n\n<!-- List of rows (avatar + two text lines) -->\n<Skeleton variant=\"list\" rows={4} />\n\n<!-- Table placeholder (header + rows) -->\n<Skeleton variant=\"table\" rows={5} />\n\n<!-- Static (no shimmer) -->\n<Skeleton variant=\"text\" animated={false} />\n```\n\nAll variants support `width`, `height`, `rows` (for `list`/`table`),\n`circular`, `animated` (default: `true`), and `class`.\n\n### Tabs\n\n```svelte\n<script lang=\"ts\">\n\timport { Tabs } from '@edujed/jedsvelted-ui/tabs';\n\timport type { TabItem } from '@edujed/jedsvelted-ui/tabs';\n\n\tconst tabs: TabItem[] = [\n\t\t{ value: 'chat', label: '💬 Chat' },\n\t\t{ value: 'terminal', label: '🖥️ Terminal' }\n\t];\n\tlet active = $state('chat');\n</script>\n\n<Tabs {tabs} bind:activeTab={active}>\n\t{#snippet tabContent(tab)}\n\t\t<!-- per-tab content -->\n\t{/snippet}\n</Tabs>\n```\n\n### Theme & language selectors\n\n```svelte\n<script lang=\"ts\">\n\timport { ThemeSelector } from '@edujed/jedsvelted-ui/theme';\n\timport { LangSelector } from '@edujed/jedsvelted-ui/i18n';\n</script>\n\n<ThemeSelector />\n<LangSelector />\n```\n\n### i18n\n\n```ts\nimport { t, localeStore, setLocale, LOCALES } from '@edujed/jedsvelted-ui/i18n';\n\nt('add'); // \"Add\" (en) / \"Adicionar\" (pt-BR)\nt('rows', { count: 5 }); // parameterized\nsetLocale('pt-BR'); // runtime switch — UI reacts automatically\n```\n\n`t()` reads `localeStore` on every call, so it stays in sync with the current\nlocale (components that render `t(...)` inside `$derived`/templates re-evaluate\non locale change).\n\n### Currencies\n\nThe lib ships a built-in currency registry (`i18n/currencies.ts`) with 11\nglobal currencies. Each currency has a per-locale symbol and a default\ndecimal count:\n\n| Code | Name              | en   | pt-BR | Decimals |\n| ---- | ----------------- | ---- | ----- | -------- |\n| USD  | US Dollar         | `$`  | `US$` | 2        |\n| EUR  | Euro              | `€`  | `€`   | 2        |\n| JPY  | Japanese Yen      | `¥`  | `¥`   | 0        |\n| GBP  | British Pound     | `£`  | `£`   | 2        |\n| AUD  | Australian Dollar | `A$` | `A$`  | 2        |\n| CAD  | Canadian Dollar   | `C$` | `C$`  | 2        |\n| CHF  | Swiss Franc       | `Fr` | `CHF` | 2        |\n| CNY  | Chinese Yuan      | `¥`  | `¥`   | 2        |\n| BRL  | Brazilian Real    | `R$` | `R$`  | 2        |\n| BTC  | Bitcoin           | `₿`  | `₿`   | 8        |\n| ETH  | Ethereum          | `Ξ`  | `Ξ`   | 6        |\n\n```ts\nimport {\n\tgetCurrencySymbol,\n\tgetCurrencyDecimals,\n\tgetSupportedCurrencies,\n\tCURRENCIES\n} from '@edujed/jedsvelted-ui/i18n';\nimport type { CurrencyCode } from '@edujed/jedsvelted-ui/i18n';\n\ngetCurrencySymbol('USD', 'pt-BR'); // \"US$\"\ngetCurrencySymbol('USD', 'en'); // \"$\"\ngetCurrencyDecimals('JPY'); // 0\ngetSupportedCurrencies(); // [{ code: 'USD', name: 'US Dollar', symbol: '$' }, …]\n```\n\n`CurrencyField` and `formatCurrency` both use this registry, so the symbol\nand decimal count stay consistent across the app and react to locale changes.\n\n### Formatting utilities\n\nPure functions for locale-aware display formatting (no reactive state):\n\n```ts\nimport {\n\tformatCurrency,\n\tformatNumber,\n\tformatDate,\n\tformatDateTime,\n\tparseCurrency,\n\tstripThousands\n} from '@edujed/jedsvelted-ui/format';\nimport { localeStore } from '@edujed/jedsvelted-ui/i18n';\n\nconst locale = $localeStore; // reactive in components\n\nformatCurrency(1234.56, locale); // \"R$ 1.234,56\" (pt-BR) / \"$1,234.56\" (en)\nformatCurrency(1234.56, locale, { currency: 'USD' }); // \"US$ 1.234,56\" (pt-BR) / \"$ 1,234.56\" (en)\nformatCurrency(0.00123456, locale, { currency: 'BTC' }); // \"₿ 0,00000012\" (pt-BR)\nformatNumber(1234.56, locale, 2); // \"1.234,56\" (pt-BR) / \"1,234.56\" (en)\nformatDate('2024-03-15', locale); // \"15/03/2024\" (pt-BR) / \"3/15/2024\" (en)\nformatDateTime('2024-03-15T14:30:00Z', locale); // \"15/03/2024 14:30\" (pt-BR)\nparseCurrency('1.234,56'); // 1234.56\nparseCurrency('1,234.56'); // 1234.56\nstripThousands('2.100.000,00', 'pt-BR'); // \"2100000,00\"\n```\n\nAll functions return `'—'` for `undefined`/`null`/invalid values.\n\nUse them in `Table` column formatters and `InfoGrid` items for consistent\ndisplay:\n\n```svelte\n<script lang=\"ts\">\n\timport { Table } from '@edujed/jedsvelted-ui/table';\n\timport { formatCurrency, formatDate } from '@edujed/jedsvelted-ui/format';\n\timport { localeStore } from '@edujed/jedsvelted-ui/i18n';\n\n\tconst columns = [\n\t\t{ key: 'name', title: 'Name' },\n\t\t{\n\t\t\tkey: 'budget',\n\t\t\ttitle: 'Budget',\n\t\t\talign: 'right',\n\t\t\tformatter: (v: number) => formatCurrency(v, $localeStore, { currency: 'BRL' })\n\t\t},\n\t\t{ key: 'hiringDate', title: 'Hired', formatter: (v: string) => formatDate(v, $localeStore) }\n\t];\n</script>\n\n<Table {columns} {data} />\n```\n\n### CRUD action handler\n\n```ts\nimport { createHandleDetail } from '@edujed/jedsvelted-ui/actions';\nimport { toast } from '@edujed/jedsvelted-ui/info';\n\nconst { handleDetailAction } = createHandleDetail<Permission>({\n\tdataRef: { data: rawPermissions },\n\ttoast,\n\titemName: () => t('permissions'),\n\tdisplayFields: ['module', 'action']\n});\n\n// wire to CrudPanel:\n<CrudPanel ... onAction={handleDetailAction} />\n```\n\n`handleDetailAction(action, item)` handles `'create' | 'update' | 'delete'`\nand fires the appropriate toast. `createHandleDetail` also returns\n`handleSave` and `handleDelete` for direct use.\n\n### Icons\n\n```svelte\n<script lang=\"ts\">\n\timport { Icon, IconCheck, IconTrash } from '@edujed/jedsvelted-ui/icons';\n</script>\n\n<Icon name=\"user\" size={16} />\n<IconCheck size={16} />\n```\n\n`Icon` accepts a `name` from the registry (`user`, `trash`, `edit`, `eye`,\n`plus`, `search`, `settings`, `sun`, `moon`, `filter`, `sort`, `download`,\n`menu`, `more`, `check`, `x`, `wallet`, `bank`, `clock`, `file`, `folder`,\n`folder-open`, `chevron-right`, `chevron-down`, `circle`, `user-alt`,\n`calendar`).\nIndividual icon components are also exported (`IconCheck`, `IconTrash`,\n`IconCalendar`, …).\n\n## 🛠 Local development\n\n```bash\ngit clone https://github.com/edujed/jedSvelted-ui.git\ncd jedsvelted-ui\nnpm install\n\nnpm run build        # compile the library into dist/ (svelte-package)\nnpm run dev:lib      # watch mode — rebuilds on change\nnpm run check        # type-check (svelte-check)\nnpm run check:watch  # type-check in watch mode\nnpm run lint         # prettier --check + eslint\nnpm run format       # prettier --write\nnpm run test         # vitest (UI)\nnpm run test:run     # vitest (single run, CI)\n```\n\n### Demo Application\n\n```bash\ngit clone https://github.com/edujed/jedSvelted-demo-app.git\n```\n\n## 🌐 Live Demo\n\n> To open a Live Demo for this lib:\n> [![Live Demo](https://shields.io)](https://edujed.github.io/jedSvelted-demo-app/)\n\n## 📄 License\n\nThis project is licensed under the [GNU General Public License v3](./LICENSE).\n\n---\n\nDeveloped by **Eduardo Jedliczka** — [edujed@gmail.com](mailto:edujed@gmail.com)\n","readmeFilename":"README.md"}