{"_id":"@astra-spec/ui","_rev":"7-967f8669bce64d56dde1d77e88c36a4c","name":"@astra-spec/ui","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"name":"@astra-spec/ui","version":"0.0.1","keywords":["astra","react","components","design-system","reproducible-research"],"license":"BSD-3-Clause","_id":"@astra-spec/ui@0.0.1","maintainers":[{"name":"eiffl","email":"fr.eiffel@gmail.com"}],"homepage":"https://github.com/LightconeResearch/astra-ui#readme","bugs":{"url":"https://github.com/LightconeResearch/astra-ui/issues"},"dist":{"shasum":"1d7d54de97bedd53c4764e3b5f8f68789fd0df99","tarball":"https://registry.npmjs.org/@astra-spec/ui/-/ui-0.0.1.tgz","fileCount":259,"integrity":"sha512-wjd9zPwdwSnx+eVugBjLE2R0uiJE/ONpslu/+Q/2G5fgNczEulUSC304hDxXSK4tMjvSi9/HJDopi5pZ/3Gr+g==","signatures":[{"sig":"MEQCICN5Zx06EKziZxOfQ2T7HzdVc8GaZ/mqQYMDzLHjCXjrAiAFwB9IzVkgE9Q+skppyzFQcEG5QiFXYqP78Zd2+lYlxg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":686959},"type":"module","style":"./styles.css","engines":{"node":">=20"},"exports":{"./model":{"types":"./dist/model/index.d.ts","import":"./dist/model/index.js","default":"./dist/model/index.js"},"./views":{"types":"./dist/views/index.d.ts","import":"./dist/views/index.js","default":"./dist/views/index.js"},"./blocks":{"types":"./dist/blocks/index.d.ts","import":"./dist/blocks/index.js","default":"./dist/blocks/index.js"},"./model/*":{"types":"./dist/model/*.d.ts","import":"./dist/model/*.js","default":"./dist/model/*.js"},"./views/*":{"types":"./dist/views/*.d.ts","import":"./dist/views/*.js","default":"./dist/views/*.js"},"./blocks/*":{"types":"./dist/blocks/*.d.ts","import":"./dist/blocks/*.js","default":"./dist/blocks/*.js"},"./styles/*":"./styles/*","./views.css":"./views.css","./blocks.css":"./blocks.css","./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","default":"./dist/components/index.js"},"./primitives":{"types":"./dist/primitives/index.d.ts","import":"./dist/primitives/index.js","default":"./dist/primitives/index.js"},"./styles.css":"./styles.css","./components/*":{"types":"./dist/components/*.d.ts","import":"./dist/components/*.js","default":"./dist/components/*.js"},"./package.json":"./package.json","./primitives/*":{"types":"./dist/primitives/*.d.ts","import":"./dist/primitives/*.js","default":"./dist/primitives/*.js"},"./components.css":"./components.css","./primitives.css":"./primitives.css"},"gitHead":"027ac3ffd1b9e8ba45ba1c6b66a15da12a0b8ce6","scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && tsc -b tsconfig.json --clean","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run check --prefix ../.."},"_npmUser":{"name":"eiffl","email":"fr.eiffel@gmail.com"},"repository":{"url":"git+https://github.com/LightconeResearch/astra-ui.git","type":"git","directory":"packages/react"},"_npmVersion":"11.18.0","description":"React components for rendering resolved ASTRA analyses","directories":{},"sideEffects":["*.css"],"_nodeVersion":"26.4.0","browserslist":["chrome >= 111","edge >= 111","firefox >= 113","safari >= 16.2","ios_saf >= 16.2"],"dependencies":{"katex":"^0.16.47"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=18 <20","react-dom":">=18 <20","@astra-spec/sdk":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/ui_0.0.1_1787904041109_0.3070154158308167","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@astra-spec/ui","version":"0.0.2","keywords":["astra","react","components","design-system","reproducible-research"],"license":"BSD-3-Clause","_id":"@astra-spec/ui@0.0.2","maintainers":[{"name":"eiffl","email":"fr.eiffel@gmail.com"}],"homepage":"https://github.com/LightconeResearch/astra-ui#readme","bugs":{"url":"https://github.com/LightconeResearch/astra-ui/issues"},"dist":{"shasum":"b87c5d3e0b263c56a4e73c52eb032c12d92481c9","tarball":"https://registry.npmjs.org/@astra-spec/ui/-/ui-0.0.2.tgz","fileCount":259,"integrity":"sha512-ukStk1SiseHZgnVlh3fR8aMHxjN9Nv2qTUrv7RpbpWiyWvccx7u/TaRqJ/9hF774hGgYOgXDRf3U40nn+6kNTw==","signatures":[{"sig":"MEQCIDdhzcGJ3TTYJhl5TwpMkfnJu2Xqtx4sfNDT/T4hmGOKAiAZu15rcufMGOxTR1loTQeP/DTuFft/tarphz+FQAO5JQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHDLnJRskhlCGfJUwT5tzp4VByPEJddFa/HTeYWq9GCrAiEAlBFp/a704zOGylie2eXwYH/3PfbFg0uoiJ2FpKrYQno=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@astra-spec%2fui@0.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":688121},"type":"module","style":"./styles.css","engines":{"node":">=20"},"exports":{"./model":{"types":"./dist/model/index.d.ts","import":"./dist/model/index.js","default":"./dist/model/index.js"},"./views":{"types":"./dist/views/index.d.ts","import":"./dist/views/index.js","default":"./dist/views/index.js"},"./blocks":{"types":"./dist/blocks/index.d.ts","import":"./dist/blocks/index.js","default":"./dist/blocks/index.js"},"./model/*":{"types":"./dist/model/*.d.ts","import":"./dist/model/*.js","default":"./dist/model/*.js"},"./views/*":{"types":"./dist/views/*.d.ts","import":"./dist/views/*.js","default":"./dist/views/*.js"},"./blocks/*":{"types":"./dist/blocks/*.d.ts","import":"./dist/blocks/*.js","default":"./dist/blocks/*.js"},"./styles/*":"./styles/*","./views.css":"./views.css","./blocks.css":"./blocks.css","./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","default":"./dist/components/index.js"},"./primitives":{"types":"./dist/primitives/index.d.ts","import":"./dist/primitives/index.js","default":"./dist/primitives/index.js"},"./styles.css":"./styles.css","./components/*":{"types":"./dist/components/*.d.ts","import":"./dist/components/*.js","default":"./dist/components/*.js"},"./package.json":"./package.json","./primitives/*":{"types":"./dist/primitives/*.d.ts","import":"./dist/primitives/*.js","default":"./dist/primitives/*.js"},"./components.css":"./components.css","./primitives.css":"./primitives.css"},"gitHead":"c4abfed58a375c5319d20ca0ab3871a4078d6433","scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && tsc -b tsconfig.json --clean","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run check --prefix ../.."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17a2d35d-f85c-483b-9be7-7ef0e182a34b"}},"repository":{"url":"git+https://github.com/LightconeResearch/astra-ui.git","type":"git","directory":"packages/react"},"_npmVersion":"11.17.0","description":"React components for rendering resolved ASTRA analyses","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.19.0","browserslist":["chrome >= 111","edge >= 111","firefox >= 113","safari >= 16.2","ios_saf >= 16.2"],"dependencies":{"katex":"^0.16.47"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=18 <20","react-dom":">=18 <20","@astra-spec/sdk":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/ui_0.0.2_1787922517065_0.589235670053412","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@astra-spec/ui","version":"0.0.3","keywords":["astra","react","components","design-system","reproducible-research"],"license":"BSD-3-Clause","_id":"@astra-spec/ui@0.0.3","maintainers":[{"name":"eiffl","email":"fr.eiffel@gmail.com"}],"homepage":"https://github.com/LightconeResearch/astra-ui#readme","bugs":{"url":"https://github.com/LightconeResearch/astra-ui/issues"},"dist":{"shasum":"081f7d348cd94c468f086ad13047d1023c557e73","tarball":"https://registry.npmjs.org/@astra-spec/ui/-/ui-0.0.3.tgz","fileCount":271,"integrity":"sha512-BZLAJ65NyFHyOX3neJ4rqd6qp3eOAQmVroARpC5tdZqGfhqjjdPXuCq2gsaLsdK/rjnKRlai8B9pBbcOH5vXUA==","signatures":[{"sig":"MEYCIQDjaNKbJ98tF1NiVQqoxw8ABOX+SibLPDx1HHw3mdj8iAIhALKIrwxiPy/S8MpJWROpMX9EyY0hKMCNDH4aVFgGAPTA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBwnXp3c4gbC+92fbkzWwmCh06y5YrSYsw+4yU2MybDNAiEA3f5nT6HeuMxOUHtaqoU3W+kNdkaMuQGQspdvhU/aEL4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@astra-spec%2fui@0.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":792061},"type":"module","style":"./styles.css","engines":{"node":">=20"},"exports":{"./model":{"types":"./dist/model/index.d.ts","import":"./dist/model/index.js","default":"./dist/model/index.js"},"./views":{"types":"./dist/views/index.d.ts","import":"./dist/views/index.js","default":"./dist/views/index.js"},"./blocks":{"types":"./dist/blocks/index.d.ts","import":"./dist/blocks/index.js","default":"./dist/blocks/index.js"},"./model/*":{"types":"./dist/model/*.d.ts","import":"./dist/model/*.js","default":"./dist/model/*.js"},"./views/*":{"types":"./dist/views/*.d.ts","import":"./dist/views/*.js","default":"./dist/views/*.js"},"./blocks/*":{"types":"./dist/blocks/*.d.ts","import":"./dist/blocks/*.js","default":"./dist/blocks/*.js"},"./styles/*":"./styles/*","./views.css":"./views.css","./blocks.css":"./blocks.css","./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","default":"./dist/components/index.js"},"./primitives":{"types":"./dist/primitives/index.d.ts","import":"./dist/primitives/index.js","default":"./dist/primitives/index.js"},"./styles.css":"./styles.css","./components/*":{"types":"./dist/components/*.d.ts","import":"./dist/components/*.js","default":"./dist/components/*.js"},"./package.json":"./package.json","./primitives/*":{"types":"./dist/primitives/*.d.ts","import":"./dist/primitives/*.js","default":"./dist/primitives/*.js"},"./components.css":"./components.css","./primitives.css":"./primitives.css"},"gitHead":"ee206a68b4bd446e7ea5323eb7246394fb8ddd2e","scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && tsc -b tsconfig.json --clean","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run check --prefix ../.."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17a2d35d-f85c-483b-9be7-7ef0e182a34b"}},"repository":{"url":"git+https://github.com/LightconeResearch/astra-ui.git","type":"git","directory":"packages/react"},"_npmVersion":"11.17.0","description":"React components for rendering resolved ASTRA analyses","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.19.0","browserslist":["chrome >= 111","edge >= 111","firefox >= 113","safari >= 16.2","ios_saf >= 16.2"],"dependencies":{"katex":"^0.16.47","@floating-ui/react":"^0.27.20"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=18 <20","react-dom":">=18 <20","@astra-spec/sdk":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/ui_0.0.3_1788109089377_0.9105375326703413","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@astra-spec/ui","version":"0.0.4","keywords":["astra","react","components","design-system","reproducible-research"],"license":"BSD-3-Clause","_id":"@astra-spec/ui@0.0.4","maintainers":[{"name":"eiffl","email":"fr.eiffel@gmail.com"}],"homepage":"https://github.com/LightconeResearch/astra-ui#readme","bugs":{"url":"https://github.com/LightconeResearch/astra-ui/issues"},"dist":{"shasum":"aaf54c072169f5a5b80e64ab6383246ddcf8d122","tarball":"https://registry.npmjs.org/@astra-spec/ui/-/ui-0.0.4.tgz","fileCount":307,"integrity":"sha512-tdBUuEJItkzEFL4zLV1mnWmzoXvkSpeUfvF9peX0WWNibSZ/gzU6KT9y0+2wbr/iIeV+Bp08a4wJtszo8Ybg5g==","signatures":[{"sig":"MEUCIQC5udn7C9eUFWo38ghA8y9c17b9YifcIbR4KVTlny9t0gIgfiUvgfD+SRcQzxZqE+YxynZ48kZDZmXh76jTu94kFog=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGiDtauLStLtIRDdCQi3HPHU1gT1aeSXDyCJhV3plXFrAiEAz4vsbkJYWb7FJIieykZ/YZtahQMbVhV8VXVrFwX2bgA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@astra-spec%2fui@0.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":908352},"type":"module","style":"./styles.css","engines":{"node":">=20"},"exports":{"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","default":"./dist/lib/index.js"},"./lib/*":{"types":"./dist/lib/*.d.ts","import":"./dist/lib/*.js","default":"./dist/lib/*.js"},"./model":{"types":"./dist/model/index.d.ts","import":"./dist/model/index.js","default":"./dist/model/index.js"},"./views":{"types":"./dist/views/index.d.ts","import":"./dist/views/index.js","default":"./dist/views/index.js"},"./blocks":{"types":"./dist/blocks/index.d.ts","import":"./dist/blocks/index.js","default":"./dist/blocks/index.js"},"./model/*":{"types":"./dist/model/*.d.ts","import":"./dist/model/*.js","default":"./dist/model/*.js"},"./views/*":{"types":"./dist/views/*.d.ts","import":"./dist/views/*.js","default":"./dist/views/*.js"},"./blocks/*":{"types":"./dist/blocks/*.d.ts","import":"./dist/blocks/*.js","default":"./dist/blocks/*.js"},"./styles/*":"./styles/*","./views.css":"./views.css","./blocks.css":"./blocks.css","./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","default":"./dist/components/index.js"},"./primitives":{"types":"./dist/primitives/index.d.ts","import":"./dist/primitives/index.js","default":"./dist/primitives/index.js"},"./styles.css":"./styles.css","./components/*":{"types":"./dist/components/*.d.ts","import":"./dist/components/*.js","default":"./dist/components/*.js"},"./package.json":"./package.json","./primitives/*":{"types":"./dist/primitives/*.d.ts","import":"./dist/primitives/*.js","default":"./dist/primitives/*.js"},"./components.css":"./components.css","./primitives.css":"./primitives.css"},"gitHead":"94a20f1464c01cad4ee7e9708809ac5c26a6a5b5","scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && tsc -b tsconfig.json --clean","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run check --prefix ../.."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17a2d35d-f85c-483b-9be7-7ef0e182a34b"}},"repository":{"url":"git+https://github.com/LightconeResearch/astra-ui.git","type":"git","directory":"packages/react"},"_npmVersion":"11.19.0","description":"React components for rendering resolved ASTRA analyses","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.20.0","browserslist":["chrome >= 111","edge >= 111","firefox >= 113","safari >= 16.2","ios_saf >= 16.2"],"dependencies":{"katex":"^0.16.47","@floating-ui/react":"^0.27.20"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=18 <20","react-dom":">=18 <20","@astra-spec/sdk":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/ui_0.0.4_1788833295340_0.16809733914535974","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@astra-spec/ui","version":"0.0.5","keywords":["astra","react","components","design-system","reproducible-research"],"license":"BSD-3-Clause","_id":"@astra-spec/ui@0.0.5","maintainers":[{"name":"eiffl","email":"fr.eiffel@gmail.com"}],"homepage":"https://github.com/LightconeResearch/astra-ui#readme","bugs":{"url":"https://github.com/LightconeResearch/astra-ui/issues"},"dist":{"shasum":"7eb8ad1e7d09ef33e5f76b67106acd8e9e77da27","tarball":"https://registry.npmjs.org/@astra-spec/ui/-/ui-0.0.5.tgz","fileCount":320,"integrity":"sha512-6G7xY92rOM1yXb1EuSzSFj7MVsNZsbOz7EZlvn67XhxumlYl21orh52B8KRfPe8nfMbDRl5kL+MBQoRtbIOzXA==","signatures":[{"sig":"MEUCIFEUvnf8pWR4Hokx+nta4wRWkmCp8S7CtwWRgvSS94bgAiEAgPTHKEZ6UyuruR5dllZVGZ4enuSs6xVjCy1ggpMCBdU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC1IRyZaoPf3uhGBytN7Iuma/q23+xEaABKk4bOplchCgIhAPP2D7Z+gJkj+Jbd6jadyrf4eqEqKcDLCiBzUeaO2Cct","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@astra-spec%2fui@0.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":922584},"type":"module","style":"./styles.css","engines":{"node":">=20"},"exports":{"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","default":"./dist/lib/index.js"},"./lib/*":{"types":"./dist/lib/*.d.ts","import":"./dist/lib/*.js","default":"./dist/lib/*.js"},"./model":{"types":"./dist/model/index.d.ts","import":"./dist/model/index.js","default":"./dist/model/index.js"},"./views":{"types":"./dist/views/index.d.ts","import":"./dist/views/index.js","default":"./dist/views/index.js"},"./blocks":{"types":"./dist/blocks/index.d.ts","import":"./dist/blocks/index.js","default":"./dist/blocks/index.js"},"./model/*":{"types":"./dist/model/*.d.ts","import":"./dist/model/*.js","default":"./dist/model/*.js"},"./views/*":{"types":"./dist/views/*.d.ts","import":"./dist/views/*.js","default":"./dist/views/*.js"},"./blocks/*":{"types":"./dist/blocks/*.d.ts","import":"./dist/blocks/*.js","default":"./dist/blocks/*.js"},"./styles/*":"./styles/*","./views.css":"./views.css","./blocks.css":"./blocks.css","./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","default":"./dist/components/index.js"},"./primitives":{"types":"./dist/primitives/index.d.ts","import":"./dist/primitives/index.js","default":"./dist/primitives/index.js"},"./styles.css":"./styles.css","./isolate.css":"./isolate.css","./components/*":{"types":"./dist/components/*.d.ts","import":"./dist/components/*.js","default":"./dist/components/*.js"},"./package.json":"./package.json","./primitives/*":{"types":"./dist/primitives/*.d.ts","import":"./dist/primitives/*.js","default":"./dist/primitives/*.js"},"./components.css":"./components.css","./primitives.css":"./primitives.css"},"gitHead":"778f3274273a6b7bf4902c1917e8ef7c57c7f7f0","scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && tsc -b tsconfig.json --clean","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run check --prefix ../.."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17a2d35d-f85c-483b-9be7-7ef0e182a34b"}},"repository":{"url":"git+https://github.com/LightconeResearch/astra-ui.git","type":"git","directory":"packages/react"},"_npmVersion":"11.19.0","description":"React components for rendering resolved ASTRA analyses","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.20.0","browserslist":["chrome >= 111","edge >= 111","firefox >= 113","safari >= 16.2","ios_saf >= 16.2"],"dependencies":{"katex":"^0.16.47","@floating-ui/react":"^0.27.20"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=18 <20","react-dom":">=18 <20","@astra-spec/sdk":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/ui_0.0.5_1788893528568_0.4415374009925557","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@astra-spec/ui","version":"0.0.6","keywords":["astra","react","components","design-system","reproducible-research"],"license":"BSD-3-Clause","_id":"@astra-spec/ui@0.0.6","maintainers":[{"name":"eiffl","email":"fr.eiffel@gmail.com"}],"homepage":"https://github.com/LightconeResearch/astra-ui#readme","bugs":{"url":"https://github.com/LightconeResearch/astra-ui/issues"},"dist":{"shasum":"ca7a51ba03ab425cbf43a200f1a40c518573cd40","tarball":"https://registry.npmjs.org/@astra-spec/ui/-/ui-0.0.6.tgz","fileCount":373,"integrity":"sha512-zrm7fPU7zo+XbUhZ5wiSllZinz4RPfEjPD7lp02AM9jXI+bPKAWa5ECQVv1DBM5mFuj+Av8RCmAXcpfUsBRWtA==","signatures":[{"sig":"MEYCIQCjshoGe/06XbObnbUzyJHnNgRI4hBmCm3rPmSgCJ+3kwIhAK81ZRO0Gp2uJ5ASAOpSDdGpQfQmMyygAVTwNhiSl7cZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDBxNPZQznQ40k4mTrcG7jhDt2DBgBB1nc0HbAxFSdOYgIhALEB6uzsXf0tyBc99wZAatkiNhNmzOA64DUjs8llH+HK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@astra-spec%2fui@0.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1021382},"type":"module","style":"./styles.css","engines":{"node":">=20"},"exports":{"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","default":"./dist/lib/index.js"},"./lib/*":{"types":"./dist/lib/*.d.ts","import":"./dist/lib/*.js","default":"./dist/lib/*.js"},"./model":{"types":"./dist/model/index.d.ts","import":"./dist/model/index.js","default":"./dist/model/index.js"},"./views":{"types":"./dist/views/index.d.ts","import":"./dist/views/index.js","default":"./dist/views/index.js"},"./blocks":{"types":"./dist/blocks/index.d.ts","import":"./dist/blocks/index.js","default":"./dist/blocks/index.js"},"./model/*":{"types":"./dist/model/*.d.ts","import":"./dist/model/*.js","default":"./dist/model/*.js"},"./views/*":{"types":"./dist/views/*.d.ts","import":"./dist/views/*.js","default":"./dist/views/*.js"},"./blocks/*":{"types":"./dist/blocks/*.d.ts","import":"./dist/blocks/*.js","default":"./dist/blocks/*.js"},"./styles/*":"./styles/*","./views.css":"./views.css","./blocks.css":"./blocks.css","./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","default":"./dist/components/index.js"},"./primitives":{"types":"./dist/primitives/index.d.ts","import":"./dist/primitives/index.js","default":"./dist/primitives/index.js"},"./styles.css":"./styles.css","./isolate.css":"./isolate.css","./components/*":{"types":"./dist/components/*.d.ts","import":"./dist/components/*.js","default":"./dist/components/*.js"},"./package.json":"./package.json","./primitives/*":{"types":"./dist/primitives/*.d.ts","import":"./dist/primitives/*.js","default":"./dist/primitives/*.js"},"./components.css":"./components.css","./primitives.css":"./primitives.css"},"gitHead":"a3abd244f3fee87c371489369ee15c60e5405aa0","scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && tsc -b tsconfig.json --clean","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run check --prefix ../.."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17a2d35d-f85c-483b-9be7-7ef0e182a34b"}},"repository":{"url":"git+https://github.com/LightconeResearch/astra-ui.git","type":"git","directory":"packages/react"},"_npmVersion":"11.19.0","description":"React components for rendering resolved ASTRA analyses","directories":{},"sideEffects":["*.css"],"_nodeVersion":"24.20.0","browserslist":["chrome >= 111","edge >= 111","firefox >= 113","safari >= 16.2","ios_saf >= 16.2"],"dependencies":{"katex":"^0.16.47","@floating-ui/react":"^0.27.20","react-zoom-pan-pinch":"^4.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=18 <20","react-dom":">=18 <20","@astra-spec/sdk":"^0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/ui_0.0.6_1789642336907_0.8907079131518274","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"_id":"@astra-spec/ui@0.0.7","bugs":{"url":"https://github.com/LightconeResearch/astra-ui/issues"},"dist":{"shasum":"76e9a109f3f0ff6c8585cb8ddc25c8c7f30a8125","tarball":"https://registry.npmjs.org/@astra-spec/ui/-/ui-0.0.7.tgz","fileCount":373,"integrity":"sha512-3anE3blI1aTRs4uSAHD/3/aYnra4J1XHRiiTHOzW53phb2WIqSYze5ro6D3N4x6Ij+zFS56wt3NkYNdvJzT47A==","signatures":[{"sig":"MEYCIQDDxAjuycwDN9sBGYdbp7L23KOXjn+9doOfV18AoNQj2QIhALns1GhWFQIH6fQ/rRINjPqQZhIbLtgwBWsMMKblYPRD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDFtW9DaoXo5ZLfMBnJSc11bLtmpvgaYSkp8ObBHlVaUwIhAKuyg5uNvZZ/ltlCs0ZTcsSXTjBrsuQA7tqRUr7OJm7K"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@astra-spec%2fui@0.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1023133},"name":"@astra-spec/ui","type":"module","style":"./styles.css","engines":{"node":">=20"},"exports":{"./lib":{"types":"./dist/lib/index.d.ts","import":"./dist/lib/index.js","default":"./dist/lib/index.js"},"./lib/*":{"types":"./dist/lib/*.d.ts","import":"./dist/lib/*.js","default":"./dist/lib/*.js"},"./model":{"types":"./dist/model/index.d.ts","import":"./dist/model/index.js","default":"./dist/model/index.js"},"./views":{"types":"./dist/views/index.d.ts","import":"./dist/views/index.js","default":"./dist/views/index.js"},"./blocks":{"types":"./dist/blocks/index.d.ts","import":"./dist/blocks/index.js","default":"./dist/blocks/index.js"},"./model/*":{"types":"./dist/model/*.d.ts","import":"./dist/model/*.js","default":"./dist/model/*.js"},"./views/*":{"types":"./dist/views/*.d.ts","import":"./dist/views/*.js","default":"./dist/views/*.js"},"./blocks/*":{"types":"./dist/blocks/*.d.ts","import":"./dist/blocks/*.js","default":"./dist/blocks/*.js"},"./styles/*":"./styles/*","./views.css":"./views.css","./blocks.css":"./blocks.css","./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js","default":"./dist/components/index.js"},"./primitives":{"types":"./dist/primitives/index.d.ts","import":"./dist/primitives/index.js","default":"./dist/primitives/index.js"},"./styles.css":"./styles.css","./isolate.css":"./isolate.css","./components/*":{"types":"./dist/components/*.d.ts","import":"./dist/components/*.js","default":"./dist/components/*.js"},"./package.json":"./package.json","./primitives/*":{"types":"./dist/primitives/*.d.ts","import":"./dist/primitives/*.js","default":"./dist/primitives/*.js"},"./components.css":"./components.css","./primitives.css":"./primitives.css"},"gitHead":"2656532f8baa65ad22462f59d1acc9a5a9bc6bf0","license":"BSD-3-Clause","scripts":{"build":"npm run clean && tsc -p tsconfig.json","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && tsc -b tsconfig.json --clean","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run check --prefix ../.."},"version":"0.0.7","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:17a2d35d-f85c-483b-9be7-7ef0e182a34b"}},"homepage":"https://github.com/LightconeResearch/astra-ui#readme","keywords":["astra","react","components","design-system","reproducible-research"],"repository":{"url":"git+https://github.com/LightconeResearch/astra-ui.git","type":"git","directory":"packages/react"},"_npmVersion":"11.19.0","description":"React components for rendering resolved ASTRA analyses","directories":{},"maintainers":[{"name":"eiffl","email":"fr.eiffel@gmail.com"}],"sideEffects":["*.css"],"_nodeVersion":"24.21.0","browserslist":["chrome >= 111","edge >= 111","firefox >= 113","safari >= 16.2","ios_saf >= 16.2"],"dependencies":{"katex":"^0.16.47","@floating-ui/react":"^0.27.20","react-zoom-pan-pinch":"^4.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=18 <20","react-dom":">=18 <20","@astra-spec/sdk":"^0.1.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ui_0.0.7_1790103927145_0.755126729657996"}}},"time":{"created":"2026-08-28T08:00:40.912Z","modified":"2026-09-22T19:05:27.694Z","0.0.1":"2026-08-28T08:00:41.255Z","0.0.2":"2026-08-28T13:08:37.158Z","0.0.3":"2026-08-30T16:58:09.498Z","0.0.4":"2026-09-08T02:08:15.473Z","0.0.5":"2026-09-08T18:52:08.669Z","0.0.6":"2026-09-17T10:52:16.984Z","0.0.7":"2026-09-22T19:05:27.258Z"},"bugs":{"url":"https://github.com/LightconeResearch/astra-ui/issues"},"license":"BSD-3-Clause","homepage":"https://github.com/LightconeResearch/astra-ui#readme","keywords":["astra","react","components","design-system","reproducible-research"],"repository":{"url":"git+https://github.com/LightconeResearch/astra-ui.git","type":"git","directory":"packages/react"},"description":"React components for rendering resolved ASTRA analyses","maintainers":[{"name":"eiffl","email":"fr.eiffel@gmail.com"}],"readme":"# `@astra-spec/ui`\n\nComposable, themable React components for resolved\n[ASTRA](https://astra-spec.org/) analyses.\n\n`@astra-spec/ui` renders `ResolvedAnalysisDocument` and the `Resolved*` records\nfrom [`@astra-spec/sdk`](https://github.com/LightconeResearch/astra-typescript).\nIt owns presentation: applications keep control of project loading, artifact\nbytes and URLs, paper fetching, routing, and state.\n\n| Layer | Responsibility |\n| --- | --- |\n| `@astra-spec/sdk` | Validate and resolve ASTRA projects; build canonical paths, provenance, artifact bindings, and indexes |\n| `@astra-spec/ui` | Render primitives, record details, dialogs, inventory blocks, full views, and the theming contract |\n| Your application | Provide a `ProjectReader`, load and refresh data, decode artifacts, fetch papers, and own navigation |\n\n## Installation\n\n```bash\nnpm install @astra-spec/ui @astra-spec/sdk react react-dom\n```\n\nThe package is ESM-only and requires Node.js 20 or newer. Its peer dependency\nranges are `@astra-spec/sdk@^0.1.1` and React/React DOM 18 or 19.\n\n## Quick start\n\nPass a document that has already been resolved by the SDK to `Inventory`, then\nload the stylesheet for the view layer. The `astra-ui` class is required: it\nscopes the package's styles and design tokens.\n\n```tsx\nimport type { ResolvedAnalysisDocument } from '@astra-spec/sdk';\nimport { Inventory } from '@astra-spec/ui/views';\nimport '@astra-spec/ui/styles.css';\n\nexport function AnalysisView({ document }: { document: ResolvedAnalysisDocument }) {\n  return (\n    <div className=\"astra-ui\">\n      <Inventory document={document} />\n    </div>\n  );\n}\n```\n\nResolving a project is deliberately outside the UI package. For example, a\nNode.js host can resolve one with the SDK before rendering it:\n\n```ts\nimport { resolveAnalysis } from '@astra-spec/sdk';\nimport { createNodeProjectReader } from '@astra-spec/sdk/node';\n\nconst reader = createNodeProjectReader('/path/to/astra-project');\nconst { document } = await resolveAnalysis(reader, { universeId: 'baseline' });\n```\n\n## Entry points\n\nThere is intentionally no root JavaScript entry point. Import the smallest\nlayer you need:\n\n| Import | Use it for | Main exports |\n| --- | --- | --- |\n| `@astra-spec/ui/views` | Complete, ready-made surfaces | `Inventory` |\n| `@astra-spec/ui/blocks` | Sections that can be assembled into a custom page | `AnalysisTree`, inventory lists, `InventorySection`, `InventoryOutline` |\n| `@astra-spec/ui/components` | One ASTRA record or paper at a time | `*Detail`, `*Dialog`, `RecordDialog`, `RecordPreview`, `ArtifactPreview`, `PaperPdfViewer` |\n| `@astra-spec/ui/primitives` | Generic presentation with no resolved ASTRA model dependency beyond record kinds | Buttons, badges, dialogs, `PreviewPopover`, detail-layout compounds, lists, `Prose` |\n| `@astra-spec/ui/model` | Pure, React-free derivations over SDK data | Record lookup, relationships, paper collection, display labels, record kinds, DOI helpers |\n| `@astra-spec/ui/lib` | The machinery behind the elements | `useDetailStack`, `LabelsProvider`, `renderProse`, preview-data builders, `pdfJsWithWorker` |\n\nEvery public file also has a direct subpath, such as\n`@astra-spec/ui/components/output-dialog` or\n`@astra-spec/ui/primitives/button`. TypeScript declarations are included.\n\n## Component guide\n\n### Full view\n\n`Inventory` is the highest-level component. It renders the selected analysis as\noutputs, decisions, inputs, findings, prior insights, and cited papers, with an\noptional outline and a drill-down detail stack.\n\nIts most useful options are:\n\n- Inventory shows the project hierarchy and handles navigation automatically; `<Inventory document={document} />` is sufficient.\n- Pass `analysisPath` with `onSelectAnalysis` to control selection from the host (`$` is the project root). The callback alone observes navigation without taking over state.\n- `sections` changes which inventory sections appear and their order.\n- `showOutline` and `idPrefix` control outline navigation.\n- `renderArtifact` and `renderText` replace host-owned content.\n- `loadPdfJs` enables the built-in PDF viewer; `onOpenPaperFile` overrides external PDF opening.\n- `paperMetadata` and `onFetchPaper` connect paper loading to host state.\n- `detail`, `defaultDetail`, and `onDetailChange` control the detail stack.\n- `showHierarchy={false}` hides project navigation independently of `showOutline`. On narrow panels the hierarchy moves above the sections so navigation remains available. Internal navigation preserves selection through refresh, falls back to the root when the selected analysis disappears, and closes uncontrolled record details on selection changes.\n- `detailMode=\"embedded\"` renders details as an inline panel instead of a modal.\n- `labels` overrides user-facing strings.\n- `index` accepts an `AnalysisIndex` the host has already built.\n\n### Inventory blocks\n\nUse blocks when your application owns the page layout or routing:\n\n| Component | Purpose |\n| --- | --- |\n| `AnalysisTree` | Recursive picker for the root analysis and its sub-analyses |\n| `OutputsList` | Figure and table galleries plus a list of other outputs, with optional compact artifact previews |\n| `DecisionsList` | Decision rows, selected options, and a controlled or uncontrolled tag filter |\n| `InputsList` | Inputs with their source and declared type |\n| `FindingsList` | Findings with claims and evidence counts |\n| `PapersList`, `PaperRows` | Cited papers derived with `collectInventoryPapers` |\n| `InventorySection`, `InventoryRecords`, `InventoryOutline` | Section chrome, kind-aware record layout, and anchor navigation for custom inventories |\n\nList components emit records through callbacks such as `onOpenRecord`; they do\nnot own application navigation.\n\n### Shared renderers\n\nThe blocks above are built from renderers you can place yourself, for one\nrecord at a time, when you own the run that holds them:\n\n| Component | What it renders |\n| --- | --- |\n| `OutputCard` | A gallery card: compact artifact preview, title, and a type label for non-figures |\n| `OutputEntry` | One output at a glance — a metric as its value, anything else as its name |\n| `PaperRow` | One cited paper: title, byline, and how much of the analysis leans on it |\n\nEach takes the record and an `onOpen` callback, forwards a ref to its button,\nand accepts `className` and `aria-label` overrides.\n\n### Record and paper details\n\nEach ASTRA record kind has both a dialog and a dialog-free detail body:\n\n| Family | What it renders |\n| --- | --- |\n| `OutputDialog`, `OutputDetail`, `OutputPreview`, `OutputDialogActions` | Output metadata, artifact content, provenance, related inputs and decisions, and open/expand actions |\n| `DecisionDialog`, `DecisionDetail` | Decision status, selected option, rationale, alternatives, tags, and supporting insights |\n| `InputDialog`, `InputDetail` | Input type, source, and authored description |\n| `FindingDialog`, `FindingDetail` | Finding claim, artifact-backed evidence, and literature evidence |\n| `InsightDialog`, `InsightDetail`, `InsightTrigger`, `InsightEvidenceTitle` | Prior-insight claims, quoted sources, evidence labels, and decisions informed by the insight |\n| `PaperDialog`, `PaperDetail`, `PaperDialogActions`, `PaperPdfViewer` | Paper metadata, in-place PDF reading with located passages, related insights and decisions, and DOI actions |\n\nUse a `*Dialog` when you already have the record and any derived relationship\ndata. Use the corresponding `*Detail` inside a sidebar, route, or your own\ndialog shell.\n\nFigure outputs zoom directly in the detail view, from the fitted view (100%) to\n400%. The zoom buttons overlay the bottom-right corner without reducing the\nfigure area. Drag to pan, scroll or pinch to zoom; the\nfocused figure also accepts arrow keys to pan, `+`/`-` to zoom and `0` to fit.\nReopening the output starts fitted again. These\ncontrols use `react-zoom-pan-pinch` to magnify the host's existing figure rendering;\nartifact loading stays with the host. Double-click toggles magnification. Labels\nare overridable through `labels.figure`.\n\n`RecordDialog` is the generic alternative. Given a `DetailEntry`, resolved\ndocument, and SDK index, it selects the correct detail UI and derives the\nrecord's relationships, evidence, insights, and papers. Pair it with\n`useDetailStack` for drill-down and back navigation. The same stack can be\ncontrolled by a router or left uncontrolled.\n\nDialogs support two modes:\n\n- `mode=\"modal\"` uses the native `<dialog>` element, including focus restoration\n  and Escape/backdrop dismissal.\n- `mode=\"embedded\"` renders the same chrome as an inline panel.\n\n### Record previews\n\n`RecordPreview` is compact, positioning-agnostic content for three entry\nshapes: a resolved record, an analysis node, or the contextual value emitted by\nan inline ASTRA value. It preserves kind-specific evidence and provenance while\nleaving artifact decoding, authored-text rendering, citation formatting, and\nnavigation with the host.\n\n`PreviewPopover` is the matching generic primitive. It opens after a short\npointer-hover delay or immediately on keyboard focus, remains open while the\npointer or focus is inside it, flips and shifts at viewport edges, and dismisses\nwith Escape. Preview content may contain links, buttons, and nested previews,\nso it is exposed as a non-modal dialog rather than a tooltip.\n\n```tsx\nimport { indexAnalysis, type ResolvedDecision } from '@astra-spec/sdk';\nimport { RecordPreview } from '@astra-spec/ui/components';\nimport { PreviewPopover } from '@astra-spec/ui/primitives';\nimport '@astra-spec/ui/components.css';\n\nconst index = indexAnalysis(document);\nconst decision = index.recordByPath.get('decisions.method') as ResolvedDecision;\nconst analysis = index.analysisByRecordPath.get(decision.canonicalPath)!;\n\n<PreviewPopover\n  label={`Decision preview: ${decision.label}`}\n  kind=\"decision\"\n  trigger={<button type=\"button\">{decision.label}</button>}\n  portalProps={{\n    // Portaled content cannot inherit classes or attributes from the trigger.\n    className: 'your-brand-scope',\n    'data-astra-color-scheme': 'light',\n  }}\n>\n  <RecordPreview\n    entry={{ kind: 'record', record: decision, analysis }}\n    document={document}\n    index={index}\n    renderArtifact={renderArtifact}\n    renderText={renderText}\n    renderCitation={(doi) => <Cite doi={doi} />}\n    onOpenRecord={openFullRecord}\n  />\n</PreviewPopover>\n```\n\nThe portal wrapper establishes an `astra-ui` scope when its mount does not\nalready inherit one. Use `portalProps` to add a brand scope and synchronize\n`data-astra-color-scheme` plus any brand-specific scheme attribute. Alternatively,\nmount it under an already-scoped element with `portalRoot`; with no `portalProps`,\nthe wrapper preserves that scope instead of creating a nested token root.\n`renderRecordReference` receives each related record and its default trigger so\na host can wrap decision insights and finding outputs in a nested\n`PreviewPopover` without copying preview markup.\n\n### Artifact previews\n\nThe UI package does not read artifact files. `ArtifactPreview` renders safe,\nhost-provided preview data in six states: table, image, metric, text, loading,\nor unavailable.\n\n```tsx\nimport { ArtifactPreview, type ArtifactRenderer } from '@astra-spec/ui/components';\nimport type { ArtifactPreviewData } from '@astra-spec/ui/lib';\n\nexport function createArtifactRenderer(\n  previews: ReadonlyMap<string, ArtifactPreviewData>,\n): ArtifactRenderer {\n  return (output, { compact }) => (\n    <ArtifactPreview\n      output={output}\n      preview={previews.get(output.canonicalPath)}\n      compact={compact}\n    />\n  );\n}\n```\n\n`tablePreviewFromDelimited`, `tablePreviewFromRows`, and\n`metricPreviewFromJson` from `@astra-spec/ui/lib` turn already-loaded host data\ninto preview values. They perform no I/O.\n\n### Primitives\n\nThe primitive layer is useful for building surfaces that match the library:\n\n| Components | Purpose |\n| --- | --- |\n| `Button`, `IconButton`, `Badge` | Controls and status/kind labels |\n| `PreviewPopover` | Accessible hover/focus positioning, viewport bounds, portal scoping, and nested preview coordination |\n| `SurfaceHeader` | Reusable title, eyebrow, identifier, leading, and action layout |\n| `Dialog`, `DialogProvider`, `DialogContent`, `DialogHeader`, `DialogBody`, `DialogClose`, `DialogBack`, `DialogAction` | Compound dialog context, state, and presentation building blocks |\n| `DetailDialog` | Preset dialog shell used by record and paper dialogs |\n| `DetailLayout`, `DetailMain`, `DetailRail`, `DetailSection`, `CountHeading` | Responsive detail-page structure |\n| `RecordList`, `RecordIdentity`, `EmptyState` | Accessible, column-aligned record lists |\n| `RelationList` | Counted related-record lists with optional navigation triggers |\n| `Prose` | Authored text with built-in inline code and KaTeX math rendering |\n\nThe layer also exports `Slot`, the dialog hooks, and their public types. Class\nname merging (`cn`), prose parsing and the label helpers are in `@astra-spec/ui/lib`.\n\n## Host extension points\n\n- `renderArtifact(output, { compact })` renders host-decoded artifact content.\n  Without it, outputs use `ArtifactPreview`'s unavailable state. Compact previews\n  ask it for every output type; the output detail frames only a figure or a table\n  and asks for a metric's value as a compact pill, so a data file or another\n  non-visual type is not rendered there.\n- `renderCodeLink(output)` adds an optional action beside Recipe. The host resolves\n  the current source file and opens it; return `null` when no file is available.\n- `getOutputStatus(output)` supplies optional execution status for inventory\n  results in the states `lc status` reports: `current`, `behind`, or `stale`,\n  with a `detail` reason. Only behind and stale results show a marker, with\n  `detail` on hover; current results stay quiet. Markers sit at card/pill\n  corners and inside file rows without changing result dimensions. The host owns lookup; unavailable status has no marker.\n  `OutputStatus` and `OutputStatusLookup` are in `@astra-spec/ui/model`, the\n  `OutputStatusGlyph` primitive draws the mark, and the marker's strings are\n  overridable through `labels.status`.\n- `renderProvenance(output)` adds recorded execution information below Recipe in\n  output details. `OutputProvenance` renders a compact status, last-run time and\n  Git revision, with a Details popup for the recorded recipe, input versions,\n  environment and CLI version. Hosts supply `OutputRun` data; `null` means no\n  recorded run, while `undefined` means loading. Copy is configurable through\n  `labels.provenance` and `labels.status`.\n- `renderText(text, { field })` replaces the built-in prose renderer. The\n  default understands inline code, `$inline$` math, and `$$display$$` math.\n  Hosts that only need custom math commands can reuse that renderer with\n  `renderProse(text, { macros })`; macro values are KaTeX expansion strings.\n- `loadPdfJs()` supplies pdf.js for reading papers in place and locating their quoted passages.\n- `onOpenPaperFile(paper)` opens a PDF through the host; otherwise the dialog uses a normal link.\n- `onFetchPaper(doi)` asks the host to load paper data. Feed the result and\n  `status: 'fetching' | 'error'` back through `paperMetadata`.\n- `labels` on `Inventory`, or `LabelsProvider` around lower-level components,\n  overrides the default UI copy.\n\nThe host owns paper discovery, downloading, authentication and resource URLs;\nthe viewer only loads the URL it is given.\n\n## PDF reading and passage navigation\n\n`Inventory`, `RecordDialog`, `PaperDialog` and `PaperDetail` read a paper in\nplace when its metadata carries a `pdfUrl` and the host supplies `loadPdfJs`:\n\n```tsx\n<Inventory\n  document={document}\n  paperMetadata={paperMetadata}\n  loadPdfJs={loadPdfJs}\n  onFetchPaper={fetchPaper}\n/>\n```\n\n`loadPdfJs` returns pdf.js itself. Import the module inside the callback, so\nserver rendering never touches browser APIs, and point\n`GlobalWorkerOptions.workerSrc` at the matching worker script:\n\n```ts\nimport type { PdfJsLoader } from '@astra-spec/ui/lib';\nimport workerUrl from 'pdfjs-dist/legacy/build/pdf.worker.min.mjs?url';\n\nexport const loadPdfJs: PdfJsLoader = async () => {\n  const pdfjs = await import('pdfjs-dist/legacy/build/pdf.mjs');\n  pdfjs.GlobalWorkerOptions.workerSrc = workerUrl;\n  return pdfjs;\n};\n```\n\npdf.js then starts one worker per open document, renders on the main thread\nif that worker cannot start, and terminates the worker when the viewer\nreleases the document. The package has no pdf.js dependency: `PdfJs` is the\nstructural subset of the module the viewer uses (`getDocument` and\n`TextLayer`), so any release whose module satisfies it can be supplied. The\nlegacy build of pdf.js 4.8.69 is the one validated in the package's browser\ntests; it and its worker polyfill the supported browser floor, so use the\nlegacy runtime and worker together.\n\n`workerSrc` is whatever URL your build serves the worker file from:\n\n- Vite: the `?url` import above.\n- webpack or rspack:\n  `new URL('pdfjs-dist/legacy/build/pdf.worker.min.mjs', import.meta.url).href`,\n  provided the build emits `.mjs` files referenced this way as assets. A build\n  whose rules process every `.mjs` file as JavaScript bundles the worker into\n  the main script instead. There, create the worker yourself with the\n  bundler-native form and let `pdfJsWithWorker` do the rest:\n\n  ```ts\n  import { pdfJsWithWorker, type PdfJsLoader } from '@astra-spec/ui/lib';\n\n  export const loadPdfJs: PdfJsLoader = async () => pdfJsWithWorker(\n    await import('pdfjs-dist/legacy/build/pdf.mjs'),\n    () => new Worker(new URL('pdfjs-dist/legacy/build/pdf.worker.min.mjs', import.meta.url), { type: 'module' }),\n  );\n  ```\n\n  It starts one worker per document, fails loading instead of hanging when\n  the script cannot start, and terminates the worker with the document.\n- A page served from a restricted origin, such as an editor's embedded web\n  view: copy `pdf.mjs` and the worker next to the page and import the runtime\n  by URL at load time. Start the worker from the document, where its origin\n  is known: fetch the worker script, wrap it in a blob URL, and hand that to\n  `pdfJsWithWorker` (`() => new Worker(blobUrl, { type: 'module' })`). This\n  needs only `worker-src blob:` in the page's content security policy. Using\n  the worker's resource URL as `workerSrc` also works where the host serves\n  fetches made from inside a worker, but pdf.js then starts it through a blob\n  wrapper that imports that URL, so `script-src` must cover the worker's\n  origin as well; under a strict policy there is no main-thread fallback\n  either way. Never set `GlobalWorkerOptions.workerPort`: it overrides\n  `workerSrc` and makes every document share one worker that is never\n  terminated.\n\nDecide the worker route once, before the first document opens: after a worker\nfails to start, pdf.js keeps every later document on the main thread for the\nlifetime of the page.\n\nDocument options such as `cMapUrl`, `standardFontDataUrl`, `httpHeaders` or\n`withCredentials` are added by wrapping `getDocument`:\n\n```ts\nreturn {\n  TextLayer: pdfjs.TextLayer,\n  getDocument: (options) => pdfjs.getDocument({ ...options, cMapUrl, cMapPacked: true }),\n};\n```\n\n### Locating passages\n\nEach quoted passage in the paper's insight rail has a Locate control, and a\ndialog opened with `focusInsightPath` locates that insight's first passage on\nits own. The viewer searches the cited physical page first, prefers a\ncomplete match anywhere in the document to a shortened prefix, and labels\npartial results. When nothing matches it shows the cited page if the document\nhas one, or reports that the quote was not found. Pages are one-based\nphysical page indices, not printed labels. Matching tolerates split text runs,\nligatures, whitespace, hyphenation, curly quotes and accents the PDF kept,\ndecomposed or lost; it marks the original text without interpreting it. Text\nis extracted once per page for the open document and shared between the\nselectable text layer and search. There is no OCR and no use of a quote's\nprefix or suffix to disambiguate repeated text, so scanned PDFs and quotes\nspanning pages fall back to the cited page. Matching is navigation\nassistance, not evidence verification.\n\n### The viewer on its own\n\n`PaperPdfViewer` from `@astra-spec/ui/components` takes `pdfUrl`, `title`,\n`loadPdfJs`, an optional `passage` (`{ key, quote?, page? }`; repeat a passage\nunder a new `key` to scroll to it again) and `onLoadStateChange(state, error?)`,\nwhich reports `'loading'`, `'ready'` or `'error'` with the failure reason.\nNeither callback needs a stable identity: `onLoadStateChange` always calls the\nlatest function, and `loadPdfJs` is read once when a document mounts, so a\nreplacement is ignored until `pdfUrl` changes or the viewer remounts. Give the\nviewer a container with a defined height and import `components.css` or a\nhigher bundle; it handles zoom, selectable text, nearby-page rendering, and\nreleases distant canvases while keeping page geometry. `PaperDetail` composes\nit with the insight rail and makes the Locate controls inert after a load\nfailure. A host that mounts `PaperDetail` outside a dialog adds\n`PaperDialogActions`, or its own link, to open the file elsewhere.\n\n`onOpenPaperFile(paper)` overrides the dialog header's open action, for a host\nthat cannot open the PDF URL in a browser tab. It receives the `InventoryPaper`\nwith its `pdfUrl`. It is distinct from `onOpenPaper`, which navigates to paper\ndetails. `onFetchPaper` remains an explicit acquisition request, with status\nand errors returned through `paperMetadata`; opening a dialog never downloads\na missing paper through that callback.\n\nAll viewer messages and accessible names are overridable through `labels.pdf`\non `Inventory`, or through `LabelsProvider` for standalone paper components.\nDynamic entries receive page numbers, counts, paper titles, or zoom\npercentages:\n\n```tsx\n<LabelsProvider labels={{ pdf: {\n  loading: 'Chargement…',\n  zoomIn: 'Agrandir',\n  quoteHighlighted: (page, total) => `Citation sur la page ${page}/${total}`,\n} }}>\n  <PaperDialog record={paper} loadPdfJs={loadPdfJs} onClose={close} />\n</LabelsProvider>\n```\n\n### Migrating from `renderPaper`\n\n- Replace `renderPaper` with `loadPdfJs`, and delete the host's page\n  rendering, quote matching and viewer stylesheet.\n- Replace any interception of the paper link with `onOpenPaperFile`.\n- Remove any `GlobalWorkerOptions.workerPort` assignment and any module-level\n  worker; pdf.js, or `pdfJsWithWorker`, owns one worker per document.\n- `PaperRenderOptions.focusEvidence` has no successor: `PaperDetail` builds the\n  viewer's `passage` from the evidence itself.\n\n## Styling and theming\n\nImport exactly one bundle for the highest layer you render:\n\n| Highest layer used | Stylesheet |\n| --- | --- |\n| Primitives | `@astra-spec/ui/primitives.css` |\n| Components | `@astra-spec/ui/components.css` |\n| Blocks | `@astra-spec/ui/blocks.css` |\n| Views | `@astra-spec/ui/styles.css` or its alias `@astra-spec/ui/views.css` |\n\nThe bundles are nested: `components.css` includes primitives, `blocks.css`\nincludes components, and `styles.css` includes everything. Their import order\nis part of the supported cascade.\n\nIndividual sheets are exported under `@astra-spec/ui/styles/*` for advanced\nintegrations, but they are not standalone bundles and are not one-to-one with\nsource components. Hosts normally should use one of the bundles above.\n\nComponents consume role-named `--astra-*` custom properties. Override them on\nthe same `.astra-ui` scope:\n\n```css\n.astra-ui {\n  --astra-color-accent: #7a3e9d;\n  --astra-font-heading: \"Fraunces\", serif;\n  --astra-radius-control: 0.375rem;\n}\n```\n\nThe bundled light and dark values are independent, brand-neutral fallbacks so\nthe package remains usable on its own. An external theme should map its own\nprimitives onto these semantic roles under an explicit opt-in scope; it should\nnot duplicate component selectors or make `@astra-spec/ui` depend on the brand.\n\nThe complete token list and default values are in [TOKENS.md](./TOKENS.md).\nSet `data-astra-color-scheme=\"light\"` or `\"dark\"` on `.astra-ui`; `\"dark\"`\nselects the built-in dark palette and `\"light\"` uses the base palette. Leaving\nthe attribute unset also uses the base palette. The package deliberately does\nnot inspect host-specific theme state. An integration maps its host theme to\nthis attribute and updates it when that theme changes.\n\nStyled roots and internal parts expose `data-slot` attributes. Kinds and\nvariants use attributes including `data-kind`, `data-mode`, `data-layout`,\n`data-density`, `data-variant`, `data-selected`, and `data-expanded`. Package\nrules live in CSS cascade layers and use zero-specificity `.astra-ui` scoping,\nso unlayered host CSS can override them predictably. The one exception is in\n`components.css` and the bundles above it: pdf.js appends its glyph-measuring\ncanvas to `<body>`, outside any scope, so one layered rule hides that\n`hiddenCanvasElement` class wherever it appears.\n\n## Platform support\n\n- React and React DOM 18 or 19\n- Chrome and Edge 111+\n- Firefox 113+\n- Safari and iOS Safari 16.2+\n\n## Development and examples\n\nThe [repository README](https://github.com/LightconeResearch/astra-ui#readme)\ndocuments the Ladle playground, integration examples, screenshots, and project\ndevelopment commands.\n\n## License\n\nBSD-3-Clause. See [LICENSE](./LICENSE).\n","readmeFilename":"README.md"}