{"_id":"@0xhoneyjar/quests-ui","_rev":"5-ffc3db1276fbb524bd4201cb64bca669","name":"@0xhoneyjar/quests-ui","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@0xhoneyjar/quests-ui","version":"0.1.0","keywords":["freeside","quests","react","unstyled","primitives"],"license":"MIT","_id":"@0xhoneyjar/quests-ui@0.1.0","maintainers":[{"name":"janitooor","email":"jani@0xhoneyjar.xyz"},{"name":"zerkereth","email":"zerkereth@gmail.com"},{"name":"zksoju","email":"underrated@gmail.com"}],"homepage":"https://github.com/0xHoneyJar/freeside-quests/tree/master/packages/ui#readme","bugs":{"url":"https://github.com/0xHoneyJar/freeside-quests/issues"},"dist":{"shasum":"22ce42ad3992790375c8b900531d48d3879faad1","tarball":"https://registry.npmjs.org/@0xhoneyjar/quests-ui/-/quests-ui-0.1.0.tgz","fileCount":37,"integrity":"sha512-pCze4Uio5+/GDsRm1wER+Q36lwIlYa+pOoMx9PeY0YmjkHCTT95W9HLTqSWn8p5JNCfePo1/j1geig0PLGy5HA==","signatures":[{"sig":"MEQCIGxUic9Ts+TLVSUoI1SpXf1JWwk+sCGAV2t/h2aHZAoeAiAIgjvIkkzwUWUM11M7dxSq4z3xVwluZD4U75x6BHXILg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53872},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"3bb5274f0c104e88ac10184238496204bcf34a9f","private":false,"scripts":{"test":"vitest run","build":"tsc -b","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"zksoju","email":"underrated@gmail.com"},"deprecated":"broken: workspace:* dep specifier published verbatim. Use 0.1.1+.","repository":{"url":"git+https://github.com/0xHoneyJar/freeside-quests.git","type":"git","directory":"packages/ui"},"_npmVersion":"10.9.0","description":"Unstyled React primitives for quest UIs — slot-based composition, zero CSS, zero design tokens. Consumers (cubquests-dashboard · per-world bots · future Farcaster Mini App) ship their own skin. Per Cycle Q SDD §6 + PRD D2 anti-pattern guard.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"@0xhoneyjar/quests-protocol":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^18.3.0","vitest":"^2.1.0","happy-dom":"^15.0.0","react-dom":"^18.3.0","typescript":"^5.7.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@testing-library/react":"^16.0.0"},"peerDependencies":{"react":"^18.3.0"},"_npmOperationalInternal":{"tmp":"tmp/quests-ui_0.1.0_1777921730819_0.5841692795084095","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@0xhoneyjar/quests-ui","version":"0.1.1","keywords":["freeside","quests","react","unstyled","primitives"],"license":"MIT","_id":"@0xhoneyjar/quests-ui@0.1.1","maintainers":[{"name":"janitooor","email":"jani@0xhoneyjar.xyz"},{"name":"zerkereth","email":"zerkereth@gmail.com"},{"name":"zksoju","email":"underrated@gmail.com"}],"homepage":"https://github.com/0xHoneyJar/freeside-quests/tree/master/packages/ui#readme","bugs":{"url":"https://github.com/0xHoneyJar/freeside-quests/issues"},"dist":{"shasum":"3c1bb58e0c60e0aec4be4fd5fde91b82845ca589","tarball":"https://registry.npmjs.org/@0xhoneyjar/quests-ui/-/quests-ui-0.1.1.tgz","fileCount":9,"integrity":"sha512-fEXZ621K9qoMcj4Al1KbhotK3Cf7+ejDEJOeju7ktiA4aFz1OTh2ySVngWcyE3DfrGwIKu+tyM5WDcsyT3RfvQ==","signatures":[{"sig":"MEUCIH+AyofbmiMzZLEe4sc4nZH2d7vjKpiCnAsrZwfK66VoAiEAyx1dvVGwsCKZKmY/H9mpPQJfy3IbnvQTP4/tls1vfbc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21291},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"3bb5274f0c104e88ac10184238496204bcf34a9f","private":false,"scripts":{"test":"vitest run","build":"tsc -b","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"zksoju","email":"underrated@gmail.com"},"repository":{"url":"git+https://github.com/0xHoneyJar/freeside-quests.git","type":"git","directory":"packages/ui"},"_npmVersion":"10.9.0","description":"Unstyled React primitives for quest UIs — slot-based composition, zero CSS, zero design tokens. Consumers (cubquests-dashboard · per-world bots · future Farcaster Mini App) ship their own skin. Per Cycle Q SDD §6 + PRD D2 anti-pattern guard.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"@0xhoneyjar/quests-protocol":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^18.3.0","vitest":"^2.1.0","happy-dom":"^15.0.0","react-dom":"^18.3.0","typescript":"^5.7.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@testing-library/react":"^16.0.0"},"peerDependencies":{"react":"^18.3.0"},"_npmOperationalInternal":{"tmp":"tmp/quests-ui_0.1.1_1777922083774_0.7443176022153575","host":"s3://npm-registry-packages-npm-production"},"deprecated":"broken: dist/ missing from tarball. Use 0.1.2+."},"0.1.2":{"name":"@0xhoneyjar/quests-ui","version":"0.1.2","keywords":["freeside","quests","react","unstyled","primitives"],"license":"MIT","_id":"@0xhoneyjar/quests-ui@0.1.2","maintainers":[{"name":"janitooor","email":"jani@0xhoneyjar.xyz"},{"name":"zerkereth","email":"zerkereth@gmail.com"},{"name":"zksoju","email":"underrated@gmail.com"}],"homepage":"https://github.com/0xHoneyJar/freeside-quests/tree/master/packages/ui#readme","bugs":{"url":"https://github.com/0xHoneyJar/freeside-quests/issues"},"dist":{"shasum":"b6c0532cd88ff065ec0e42c42060422c3d43d4d1","tarball":"https://registry.npmjs.org/@0xhoneyjar/quests-ui/-/quests-ui-0.1.2.tgz","fileCount":37,"integrity":"sha512-S3gkm+AVrseT4QQfZNEB9LjgVx3S5QES5Yk/4nA3bcY30qCmrmvxp+wICfApN7PgN+zA1mJaP3DcvFQszQ7xLQ==","signatures":[{"sig":"MEQCIG5YlNDLI8ycMV8YWFdBTAoPrisORcXacaoGR40jBCAjAiBbNhXMzI1JoGGja8WQesgSmyM3nWUxLx6iec6jyRcZBQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53867},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"39d7809c0cbb7a60ec96cbd8c5aa091f6e1adf38","private":false,"scripts":{"test":"vitest run","build":"tsc -b","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"zksoju","email":"underrated@gmail.com"},"repository":{"url":"git+https://github.com/0xHoneyJar/freeside-quests.git","type":"git","directory":"packages/ui"},"_npmVersion":"10.9.0","description":"Unstyled React primitives for quest UIs — slot-based composition, zero CSS, zero design tokens. Consumers (cubquests-dashboard · per-world bots · future Farcaster Mini App) ship their own skin. Per Cycle Q SDD §6 + PRD D2 anti-pattern guard.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"@0xhoneyjar/quests-protocol":"^0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^18.3.0","vitest":"^2.1.0","happy-dom":"^15.0.0","react-dom":"^18.3.0","typescript":"^5.7.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@testing-library/react":"^16.0.0"},"peerDependencies":{"react":"^18.3.0"},"_npmOperationalInternal":{"tmp":"tmp/quests-ui_0.1.2_1777922229370_0.4619514397495019","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-05-04T19:08:50.752Z","modified":"2026-05-04T19:17:20.947Z","0.1.0":"2026-05-04T19:08:50.962Z","0.1.1":"2026-05-04T19:14:43.918Z","0.1.2":"2026-05-04T19:17:09.537Z"},"bugs":{"url":"https://github.com/0xHoneyJar/freeside-quests/issues"},"license":"MIT","homepage":"https://github.com/0xHoneyJar/freeside-quests/tree/master/packages/ui#readme","keywords":["freeside","quests","react","unstyled","primitives"],"repository":{"url":"git+https://github.com/0xHoneyJar/freeside-quests.git","type":"git","directory":"packages/ui"},"description":"Unstyled React primitives for quest UIs — slot-based composition, zero CSS, zero design tokens. Consumers (cubquests-dashboard · per-world bots · future Farcaster Mini App) ship their own skin. Per Cycle Q SDD §6 + PRD D2 anti-pattern guard.","maintainers":[{"name":"janitooor","email":"jani@0xhoneyjar.xyz"},{"name":"zerkereth","email":"zerkereth@gmail.com"},{"name":"zksoju","email":"underrated@gmail.com"}],"readme":"# `@0xhoneyjar/quests-ui` — unstyled React primitives\n\n5 slot-based React primitives for quest UIs. Shape, not chrome — every consumer (cubquests-dashboard, per-world bots, future Farcaster Mini App) ships its own skin atop these primitives.\n\n> **Cycle Q P1 SCAFFOLD (2026-05-04)** — primitives compile cleanly, zero CSS shipped, zero design tokens. Per Cycle Q SDD §6 + PRD D2.\n\n## Anti-pattern guard: NEVER ship a default skin\n\nThis package ships SHAPE not CHROME. If you find yourself wanting to add a default Tailwind class, a CSS module, a `style={...}` block, or a \"starter theme\" — STOP. Each consumer (cubquests-dashboard, per-world bots, future Farcaster Mini App) ships its own skin. A \"default skin\" becomes the only one used in practice, breaks the unstyled contract, and locks visual register at the wrong layer.\n\nPer `[[freeside-modules-as-installables]]` §\"What goes into a module's `packages/protocol/`\": presentation chrome belongs at the consumer; primitives belong in the module.\n\n**Test guard**: `__tests__/component-isolation.test.tsx` greps the package source for any `.css` import or `style=` attribute and FAILS the build if found.\n\n## Components (slot-based composition)\n\n| Component | Purpose | Slot pattern |\n|---|---|---|\n| `<QuestCard>` | Compact quest representation | `Title` · `Description` · `Reward` · `Actions` slots |\n| `<QuestDetailEmbed>` | Single-quest detail view | `Header` · `Body` · `Footer` · `Actions` slots |\n| `<BadgeShowcase>` | Badge artifact rendering · layout-only | `BadgeShowcase.Item` compound pattern |\n| `<ProgressTracker>` | QuestState phase visualizer · phase pills | `Phase` slot for per-phase render |\n| `<VerdictReveal>` | Curator-narrative reveal · phase-callbacks | `children` + `onPhaseEnter` callbacks |\n\n## Composition examples (illustrative · NOT shipped)\n\n```tsx\n// cubquests-dashboard (Tailwind skin)\nimport { QuestCard } from \"@0xhoneyjar/quests-ui\";\n<QuestCard\n  quest={quest}\n  Title={({ quest }) => <h2 className=\"text-2xl font-bold\">{quest.title}</h2>}\n  Description={({ quest }) => <p className=\"text-gray-600\">{quest.prompt}</p>}\n  Reward={({ badge_spec }) => <BadgeChip name={badge_spec.display_name} />}\n  Actions={({ onAccept }) => <button className=\"btn-primary\" onClick={onAccept}>Accept</button>}\n/>\n\n// per-world bot (server-side render · zero React runtime)\n// uses @0xhoneyjar/quests-discord-renderer · NOT @0xhoneyjar/quests-ui · this is the boundary\n\n// future Farcaster Mini App (Vite skin)\nimport { QuestCard } from \"@0xhoneyjar/quests-ui\";\n<QuestCard quest={quest} Title={MyTitle} Description={MyDescription} ... />\n```\n\n## What's NOT here\n\n- World-specific quest CONTENT renderers (each world's quest detail page is its own app code)\n- Operator-facing dashboard chrome (stays in consumer apps)\n- Auth wires (each world's Identity Component handles auth)\n- Discord rendering (use `@0xhoneyjar/quests-discord-renderer` — different boundary, different transport)\n- CSS / Tailwind / styled-components / design tokens (anti-pattern guard above)\n\n## Consumers (planned · post-Cycle Q)\n\n- `cubquests-dashboard/` — operator surface\n- `freeside-characters/apps/character-mongolian/` — per-world bot (uses `discord-renderer` · NOT this pkg)\n- Future world apps (Purupuru Year 2, Honey Port, Mibera quest UI) — install + skin\n\n## Doctrine references\n\n- `[[freeside-modules-as-installables]]` — sealed schemas + typed ports + presentation belongs at consumer\n- `[[chat-medium-presentation-boundary]]` — discord-renderer is a SIBLING boundary, not this package's concern\n- Cycle Q SDD §6 — sealed component contracts + slot pattern\n- Cycle Q PRD D2 — anti-pattern guard rationale\n","readmeFilename":"README.md"}