{"_id":"@aeon-ui/core","name":"@aeon-ui/core","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@aeon-ui/core","version":"0.1.0","description":"Anatomy tokens, data-aeon attributes, and machine helpers for Aeon UI","license":"MIT","repository":{"type":"git","url":"git+https://github.com/GenericCPU/aeon-ui.git","directory":"packages/core"},"publishConfig":{"access":"public"},"keywords":["aeon-ui","statechart","xstate","headless","anatomy"],"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./theme-transition.css":"./theme-transition.css"},"dependencies":{"xstate":"^5.19.2"},"devDependencies":{"tsup":"^8.4.0","typescript":"^5.8.3","vitest":"^4.1.8"},"scripts":{"build":"tsup src/index.ts --format esm --dts --clean","typecheck":"tsc --noEmit","test":"vitest run"},"_id":"@aeon-ui/core@0.1.0","bugs":{"url":"https://github.com/GenericCPU/aeon-ui/issues"},"homepage":"https://github.com/GenericCPU/aeon-ui#readme","_integrity":"sha512-n2fdxN04PYfOiqpm1n37fvSXq8/1RYKfYfN9UlczqBWF0/jQHWLLJ0UY8rlKdjEs4+SWfpBICMa0O2kjE9/gdA==","_resolved":"/private/var/folders/wk/mtltqfc92hs4vf24ph9vhvc40000gn/T/58dac43e286aa57672fff56d1a54fe40/aeon-ui-core-0.1.0.tgz","_from":"file:aeon-ui-core-0.1.0.tgz","_nodeVersion":"22.22.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-n2fdxN04PYfOiqpm1n37fvSXq8/1RYKfYfN9UlczqBWF0/jQHWLLJ0UY8rlKdjEs4+SWfpBICMa0O2kjE9/gdA==","shasum":"389940735593cb3652b654e23f7f91bea4077f26","tarball":"https://registry.npmjs.org/@aeon-ui/core/-/core-0.1.0.tgz","fileCount":6,"unpackedSize":28314,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDkr/GZvXMpE32TRryYdu5QafujEi+SsR1D4IJ9vUUARgIgWsmTjkxQ3SgOIXk7wA2dR7CAuyocWkwq0f0PbtfUme0="}]},"_npmUser":{"name":"bgcryderman","email":"brandongcryderman@gmail.com"},"directories":{},"maintainers":[{"name":"bgcryderman","email":"brandongcryderman@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.1.0_1780612410271_0.18500516609197803"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-04T22:33:30.087Z","0.1.0":"2026-06-04T22:33:30.422Z","modified":"2026-06-04T22:33:30.667Z"},"maintainers":[{"name":"bgcryderman","email":"brandongcryderman@gmail.com"}],"description":"Anatomy tokens, data-aeon attributes, and machine helpers for Aeon UI","homepage":"https://github.com/GenericCPU/aeon-ui#readme","keywords":["aeon-ui","statechart","xstate","headless","anatomy"],"repository":{"type":"git","url":"git+https://github.com/GenericCPU/aeon-ui.git","directory":"packages/core"},"bugs":{"url":"https://github.com/GenericCPU/aeon-ui/issues"},"license":"MIT","readme":"# @aeon-ui/core\n\n**DOM contract and anatomy** — no React, no XState runtime in components.\n\nAgents: read [AGENTS.md](../../AGENTS.md) and [docs/FILE_MAP.md](../../docs/FILE_MAP.md).\n\n## Install\n\n```bash\npnpm add @aeon-ui/core\n```\n\nUsually consumed via `@aeon-ui/react` or `@aeon-ui/ui`.\n\n## Exports\n\n| Module | Purpose |\n|--------|---------|\n| `philosophy` | `UI_IS_FUNCTION_OF_STATE`, `AEON_PRINCIPLE` |\n| `anatomy` | `buttonAnatomy`, `asyncAnatomy`, `fieldAnatomy`, … |\n| `attrs` | `partAttrs`, `scopeAttrs`, `partOnlyAttrs`, `stateToAttr` |\n| `machine` | `createAeonMachine` — XState `setup` helper |\n| `scroll` | `getScrollSnapshot(element)` |\n| `layout` | Normalized coords, `ResponsiveLayoutSpec`, `layoutModeAttrs` |\n| `types` | Shared types |\n\n### Play-surface layout (coordinates)\n\n```ts\nimport {\n  playSurfaceAnatomy,\n  normFromClient,\n  layoutModeAttrs,\n  type ResponsiveLayoutSpec,\n} from '@aeon-ui/core'\n```\n\nSee [docs/LAYOUT_COORDINATES.md](../../docs/LAYOUT_COORDINATES.md).\n\n## Anatomy\n\n```ts\nimport { asyncAnatomy, partAttrs } from '@aeon-ui/core'\n\npartAttrs(asyncAnatomy.scope, asyncAnatomy.readout, {\n  state: 'loading',\n})\n// → data-aeon-scope=\"async\" data-aeon-part=\"readout\" data-aeon-state=\"loading\"\n```\n\n## Parallel regions\n\n```ts\nimport { stateToAttr } from '@aeon-ui/core'\n\nstateToAttr({ interaction: 'dirty', validation: 'invalid', submission: 'idle' })\n// → \"interaction:dirty validation:invalid submission:idle\"\n```\n\n## Adding a scope\n\n1. Add `myAnatomy = anatomy('my', ['root', ...] as const)` in `src/anatomy.ts`.\n2. Use in React via `partAttrs`.\n3. Follow [docs/COMPONENT_CHECKLIST.md](../../docs/COMPONENT_CHECKLIST.md).\n\n## Related\n\n- [STATES.md](../../STATES.md) — attribute contract\n- [packages/primitives/README.md](../primitives/README.md) — machines\n","readmeFilename":"README.md","_rev":"1-6a7ac116e9cb34985a5ac6ccbcfef775"}