{"_id":"@damarkuncoro/agnostic-ui-contracts","name":"@damarkuncoro/agnostic-ui-contracts","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@damarkuncoro/agnostic-ui-contracts","description":"Agnostic UI Contracts","version":"0.1.0","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"sideEffects":false,"publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run"},"license":"MIT","keywords":["agnostic-ui","contracts","ui","typescript","design-system","a11y"],"author":{"name":"Damar Kuncoro"},"repository":{"type":"git","url":"git+https://github.com/damarkuncoro/agnostic-ui.git"},"bugs":{"url":"https://github.com/damarkuncoro/agnostic-ui/issues"},"homepage":"https://github.com/damarkuncoro/agnostic-ui#readme","engines":{"node":">=18","pnpm":">=8"},"devDependencies":{"vitest":"^3.0.0"},"_id":"@damarkuncoro/agnostic-ui-contracts@0.1.0","gitHead":"8209de956f8cfcb4fd176bf3a102490d2cfa79e0","_nodeVersion":"20.19.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-adQAksPwdhXK6nkgjJ04+/4HbiF4xF1SBgLxJWAE9lnkOebA268lZWqVV2QXerA5+RVKq9GFceu8nzMcUTTDcQ==","shasum":"a1fcc5ac7c8b9de576f2a47158e59ed1ae3df9fb","tarball":"https://registry.npmjs.org/@damarkuncoro/agnostic-ui-contracts/-/agnostic-ui-contracts-0.1.0.tgz","fileCount":167,"unpackedSize":55609,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIF07JAJwiAp6m60+d9rFWRAPcz5YuYqG+rMeAFNdwJMOAiBqVlLq2fKIqb/0oiJV/WFWioh+9jCw9EQXjvJrKSXl/g=="}]},"_npmUser":{"name":"damarkuncoro","email":"damarkuncoro@gmail.com"},"directories":{},"maintainers":[{"name":"damarkuncoro","email":"damarkuncoro@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/agnostic-ui-contracts_0.1.0_1766997922117_0.5359807858057977"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-29T08:45:22.011Z","0.1.0":"2025-12-29T08:45:22.242Z","modified":"2025-12-29T08:45:22.544Z"},"maintainers":[{"name":"damarkuncoro","email":"damarkuncoro@gmail.com"}],"description":"Agnostic UI Contracts","homepage":"https://github.com/damarkuncoro/agnostic-ui#readme","keywords":["agnostic-ui","contracts","ui","typescript","design-system","a11y"],"repository":{"type":"git","url":"git+https://github.com/damarkuncoro/agnostic-ui.git"},"author":{"name":"Damar Kuncoro"},"bugs":{"url":"https://github.com/damarkuncoro/agnostic-ui/issues"},"license":"MIT","readme":"# @damarkuncoro/agnostic-ui-contracts\n\nKontrak UI untuk seluruh ekosistem Agnostic UI. Paket ini mendefinisikan tipe, konstanta, props, state, a11y, dan guard/validator yang menjadi sumber kebenaran untuk Base, Theme, Skin, serta adapter React/Vue.\n\n## Ringkas\n- Import via alias: `@damarkuncoro/agnostic-ui/contracts`\n- Ekspor utama: `a11y`, `keyboard`, `state`, `ui/button`\n- Build ke `dist` (source murni di `src`)\n- Dependency: tidak bergantung ke paket lain (Contract-first)\n\n## Instalasi & Import\nMonorepo ini sudah memetakan alias ke source:\n\n```ts\n// Import tipe/kontrak\nimport {\n  type UiButtonProps,\n  type UiButtonVariant,\n  type UiButtonSize,\n} from '@damarkuncoro/agnostic-ui/contracts'\n```\n\nAlias diset di `tsconfig.base.json` agar IDE dan tooling resolve ke source:\n`tsconfig.base.json:11`\n\n## API Surface\n- `a11y`\n  - Konstanta ARIA/Role dan tipe: `A11Y_ROLES`, `A11Y_ATTRIBUTES`\n  - Sumber: `src/a11y.ts`\n- `keyboard`\n  - Konstanta tombol: `KEYBOARD_KEYS`\n  - Sumber: `src/keyboard.ts`\n- `state`\n  - Konstanta state UI: `UI_STATES`\n  - Sumber: `src/state.ts`\n- `ui/button`\n  - Tipe dan kontrak tombol: varian, size, props, state, a11y, events, slots, guards, validate\n  - Sumber: `src/ui/button/*` dan indeks `src/ui/button/index.ts:1`\n\n## Contoh Penggunaan\n### Di Base (logika)\n```ts\nimport { assertUiButtonProps, type UiButtonProps } from '@damarkuncoro/agnostic-ui/contracts'\n\nexport function resolveUiButtonProps(props: UiButtonProps) {\n  assertUiButtonProps(props)\n  // gabungkan default + props pengguna\n}\n```\n\n### Di Skin (visual)\n```ts\nimport { type UiButtonVariant, type UiButtonSize } from '@damarkuncoro/agnostic-ui/contracts'\n\nexport function getButtonClass(variant?: UiButtonVariant, size?: UiButtonSize) {\n  // mapping varian/size → kelas Tailwind\n}\n```\n\n### Di Adapter React/Vue (komponen)\n```ts\nimport { type UiButtonProps } from '@damarkuncoro/agnostic-ui/contracts'\n```\n\n## Build\nJalankan build untuk menghasilkan `dist`:\n```\npnpm --filter @damarkuncoro/agnostic-ui/contracts build\n```\n\nKonfigurasi build:\n- `packages/agnostic-ui-contracts/package.json` → `main: dist/index.js`, `types: dist/index.d.ts`\n- `packages/agnostic-ui-contracts/tsconfig.json` → `outDir: dist`, `rootDir: src`, `declaration: true`\n\n## Arsitektur & Aturan Dependency\n- Contract → ❌ tidak bergantung apa pun\n- Theme & Base → bergantung ke Contract\n- Skin → bergantung ke Contract + Theme\n- Adapter (React/Vue) → menggabungkan Base + Skin (+ Theme bila perlu)\n\nDengan pola ini, kontrak menjadi pusat stabilitas API, sementara layer lain dapat berevolusi tanpa memecah kesepakatan tipe/props.\n\n## Struktur Direktori\n```\npackages/agnostic-ui-contracts/\n├─ src/\n│  ├─ a11y.ts\n│  ├─ keyboard.ts\n│  ├─ state.ts\n│  └─ ui/\n│     └─ button/\n│        ├─ ui-button.types.ts\n│        ├─ ui-button.contract.ts\n│        ├─ ui-button.props.ts\n│        ├─ ui-button.state.ts\n│        ├─ ui-button.a11y.ts\n│        ├─ ui-button.events.ts\n│        ├─ ui-button.slots.ts\n│        ├─ ui-button.constants.ts\n│        ├─ ui-button.guards.ts\n│        ├─ ui-button.validate.ts\n│        └─ index.ts\n└─ dist/ (hasil build)\n```\n\n## Catatan\n- Entry ekspor paket: `packages/agnostic-ui-contracts/src/index.ts` mengekspor seluruh modul inti.\n- Gunakan alias `@damarkuncoro/agnostic-ui/contracts` di seluruh paket agar konsisten dan aman terhadap perubahan internal.\n","readmeFilename":"README.md","_rev":"1-8526dad66fc557bdaa7c3def8725642c"}