{"_id":"@duongthiu/onex-core","_rev":"2-a2389c4161f7e98b3aefcda740122090","name":"@duongthiu/onex-core","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@duongthiu/onex-core","version":"0.1.0","keywords":["onex","theme","cms","headless-cms","react","nextjs","visual-editor","page-builder","multi-tenant","saas","theme-system","component-library"],"author":{"name":"OneX Team","email":"contact@onex.dev"},"license":"MIT","_id":"@duongthiu/onex-core@0.1.0","maintainers":[{"name":"duongthiu","email":"tranduongthieuhcmute@gmail.com"}],"homepage":"https://github.com/onexapis/onex-website/tree/main/packages/core#readme","bugs":{"url":"https://github.com/onexapis/onex-website/issues"},"dist":{"shasum":"00f796adce3ea6826e3512ae021147bf1b5a9e1f","tarball":"https://registry.npmjs.org/@duongthiu/onex-core/-/onex-core-0.1.0.tgz","fileCount":31,"integrity":"sha512-jLD9+V3c0KPOnFxp2JxXtGMBL45NATOiHWfbBvI28M4yUtax1DG78CeVZwebw0i2twC9EUG+BYGp9iqqoKGdaQ==","signatures":[{"sig":"MEUCIQC2pMUt6qfKTJRVqJet051L84KybMBls+4MRqmUiicp7gIgB+Osoly37WLzDphlF8CO5Bh7ZDYpMd+bMEeueLKgL7Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2057780},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./package.json":"./package.json"},"gitHead":"710800a453c8991ff646ae0e77711fb067630fdc","scripts":{"dev":"tsup --watch","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","prepublishOnly":"pnpm run type-check && pnpm run lint && pnpm run build"},"_npmUser":{"name":"duongthiu","email":"tranduongthieuhcmute@gmail.com"},"repository":{"url":"git+https://github.com/onexapis/onex-website.git","type":"git","directory":"packages/core"},"_npmVersion":"10.8.2","description":"OneX Core - Theme rendering system and registry for building multi-tenant websites with visual editing","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"zod":"^4.1.13","clsx":"^2.1.1","tailwind-merge":"^3.4.0","@radix-ui/react-slot":"^1.2.4","@radix-ui/react-tabs":"^1.1.13","@radix-ui/react-label":"^2.1.8","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","@radix-ui/react-progress":"^1.1.8","class-variance-authority":"^0.7.1","@radix-ui/react-accordion":"^1.2.12","@radix-ui/react-separator":"^1.1.8"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9","vitest":"^4.0.16","typescript":"^5","@types/react":"^19","@types/react-dom":"^19"},"peerDependencies":{"next":">=14.0.0","react":"^19.2.1","react-dom":"^19.2.1","lucide-react":">=0.5.0"},"peerDependenciesMeta":{"next":{"optional":true},"lucide-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/onex-core_0.1.0_1769400859692_0.9639989890080578","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@duongthiu/onex-core","version":"0.1.1","description":"OneX Core - Theme rendering system and registry for building multi-tenant websites with visual editing","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.mjs","require":"./dist/client.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.mjs","require":"./dist/server.js"},"./internal":{"types":"./dist/internal.d.ts","import":"./dist/internal.mjs","require":"./dist/internal.js"},"./components":{"types":"./dist/components.d.ts","import":"./dist/components.mjs","require":"./dist/components.js"},"./wrappers":{"types":"./dist/wrappers.d.ts","import":"./dist/wrappers.mjs","require":"./dist/wrappers.js"},"./motion":{"types":"./dist/motion.d.ts","import":"./dist/motion.mjs","require":"./dist/motion.js"},"./icons":{"types":"./dist/icons.d.ts","import":"./dist/icons.mjs","require":"./dist/icons.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.mjs","require":"./dist/types.js"},"./utils":{"types":"./dist/utils.d.ts","import":"./dist/utils.mjs","require":"./dist/utils.js"},"./renderers":{"types":"./dist/renderers.d.ts","import":"./dist/renderers.mjs","require":"./dist/renderers.js"},"./registry":{"types":"./dist/registry.d.ts","import":"./dist/registry.mjs","require":"./dist/registry.js"},"./contexts":{"types":"./dist/contexts.d.ts","import":"./dist/contexts.mjs","require":"./dist/contexts.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.mjs","require":"./dist/config.js"},"./api":{"types":"./dist/api.d.ts","import":"./dist/api.mjs","require":"./dist/api.js"},"./auth":{"types":"./dist/auth.d.ts","import":"./dist/auth.mjs","require":"./dist/auth.js"},"./cart":{"types":"./dist/cart.d.ts","import":"./dist/cart.mjs","require":"./dist/cart.js"},"./products":{"types":"./dist/products.d.ts","import":"./dist/products.mjs","require":"./dist/products.js"},"./orders":{"types":"./dist/orders.d.ts","import":"./dist/orders.mjs","require":"./dist/orders.js"},"./finance":{"types":"./dist/finance.d.ts","import":"./dist/finance.mjs","require":"./dist/finance.js"},"./contact":{"types":"./dist/contact.d.ts","import":"./dist/contact.mjs","require":"./dist/contact.js"},"./blog":{"types":"./dist/blog.d.ts","import":"./dist/blog.mjs","require":"./dist/blog.js"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","build":"tsup","type-check":"tsc --noEmit","lint":"eslint src --ext .ts,.tsx","test":"vitest run","test:watch":"vitest","prepublishOnly":"pnpm run type-check && pnpm run lint && pnpm run build"},"keywords":["onex","theme","cms","headless-cms","react","nextjs","visual-editor","page-builder","multi-tenant","saas","theme-system","component-library"],"author":{"name":"OneX Team","email":"contact@onex.dev"},"repository":{"type":"git","url":"git+https://github.com/onexapis/onex-website.git","directory":"packages/core"},"homepage":"https://github.com/onexapis/onex-website/tree/main/packages/core#readme","bugs":{"url":"https://github.com/onexapis/onex-website/issues"},"license":"MIT","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"engines":{"node":">=18.0.0","pnpm":">=8.0.0"},"sideEffects":false,"peerDependencies":{"framer-motion":">=11.0.0","lucide-react":">=0.5.0","next":">=14.0.0","react":"^19.2.1","react-dom":"^19.2.1"},"peerDependenciesMeta":{"framer-motion":{"optional":true},"next":{"optional":true},"lucide-react":{"optional":true}},"dependencies":{"@hookform/resolvers":"^5.2.2","@radix-ui/react-accordion":"^1.2.12","@radix-ui/react-checkbox":"^1.3.3","@radix-ui/react-label":"^2.1.8","@radix-ui/react-progress":"^1.1.8","@radix-ui/react-select":"^2.2.6","@radix-ui/react-separator":"^1.1.8","@radix-ui/react-slot":"^1.2.4","@radix-ui/react-tabs":"^1.1.13","axios":"^1.13.2","class-variance-authority":"^0.7.1","clsx":"^2.1.1","react-hook-form":"^7.68.0","tailwind-merge":"^3.4.0","zod":"^4.1.13","zustand":"^5.0.10"},"devDependencies":{"@types/react":"^19","@types/react-dom":"^19","eslint":"^9","tsup":"^8.0.0","typescript":"^5","vitest":"^4.0.16"},"_id":"@duongthiu/onex-core@0.1.1","gitHead":"299240f6579aa17e4319b4f9f0c9c0edcf455f31","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-gkL/O7cxc8nC2o9tFESKkSfSfWNJVTqro3HEHaqjA5DDsQ9s7xel9kjl75G7wiw8aJqyAYu7jfcBIIaCMPk5Ew==","shasum":"8d34abb110d98af8bacc752a3fba54db0e58dbc8","tarball":"https://registry.npmjs.org/@duongthiu/onex-core/-/onex-core-0.1.1.tgz","fileCount":179,"unpackedSize":3374096,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDFUaKRljQzT7uxFyZD7SzYjbaEGGusVAfl9V8nAfrIZgIhAJFsYFLBFEz7sq2PnwH9Ydx4FQW5QE8QdgyBXFIEL22O"}]},"_npmUser":{"name":"duongthiu","email":"tranduongthieuhcmute@gmail.com"},"directories":{},"maintainers":[{"name":"duongthiu","email":"tranduongthieuhcmute@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/onex-core_0.1.1_1770092842524_0.7439570513425404"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-26T04:14:19.572Z","modified":"2026-02-03T04:27:22.835Z","0.1.0":"2026-01-26T04:14:19.885Z","0.1.1":"2026-02-03T04:27:22.728Z"},"bugs":{"url":"https://github.com/onexapis/onex-website/issues"},"author":{"name":"OneX Team","email":"contact@onex.dev"},"license":"MIT","homepage":"https://github.com/onexapis/onex-website/tree/main/packages/core#readme","keywords":["onex","theme","cms","headless-cms","react","nextjs","visual-editor","page-builder","multi-tenant","saas","theme-system","component-library"],"repository":{"type":"git","url":"git+https://github.com/onexapis/onex-website.git","directory":"packages/core"},"description":"OneX Core - Theme rendering system and registry for building multi-tenant websites with visual editing","maintainers":[{"name":"duongthiu","email":"tranduongthieuhcmute@gmail.com"}],"readme":"# @onex/core\n\nCore package for the OneX theme marketplace - provides types, components, and utilities for building third-party themes.\n\n## Installation\n\n```bash\nnpm install @onex/core react react-dom\n# or\npnpm add @onex/core react react-dom\n# or\nyarn add @onex/core react react-dom\n```\n\n## Quick Start\n\n### For Theme Developers\n\nCreate a new theme using `@onex/core`:\n\n```typescript\n// src/index.ts\nimport type { ThemeModule, SectionComponentProps } from \"@onex/core\"\nimport { ButtonComponent, Heading } from \"@onex/core/client\"\n\n// 1. Define your section components\nexport function HeroMinimal({ section }: SectionComponentProps) {\n  return (\n    <section className=\"hero\">\n      <Heading level={1}>{section.settings.title}</Heading>\n      <ButtonComponent href={section.settings.ctaUrl}>\n        {section.settings.ctaText}\n      </ButtonComponent>\n    </section>\n  )\n}\n\n// 2. Create theme manifest\nexport const manifest = {\n  id: \"my-theme\",\n  name: \"My Theme\",\n  version: \"1.0.0\",\n  author: {\n    name: \"Your Name\",\n    email: \"you@example.com\"\n  },\n  engine: \"^1.0.0\",\n  peerDependencies: {\n    react: \"^19.0.0\",\n    \"react-dom\": \"^19.0.0\"\n  },\n  sections: [\"hero-minimal\"],\n  config: themeConfig,\n  exports: {\n    main: \"./dist/index.mjs\"\n  }\n}\n\n// 3. Export theme module\nexport const theme: ThemeModule = {\n  manifest,\n  config: themeConfig,\n  sections: {\n    \"hero-minimal\": HeroMinimal\n  }\n}\n\nexport default theme\n```\n\n### Build Configuration\n\nUse esbuild with externalized dependencies:\n\n```javascript\n// esbuild.config.js\nconst esbuild = require(\"esbuild\");\n\nesbuild.build({\n  entryPoints: [\"src/index.ts\"],\n  bundle: true,\n  format: \"esm\",\n  outfile: \"dist/index.mjs\",\n  external: [\"@onex/core\", \"@onex/core/client\", \"react\", \"react-dom\"],\n  minify: true,\n  sourcemap: true,\n});\n```\n\n## Package Exports\n\n### Default Export (`@onex/core`)\n\n```typescript\nimport { ... } from \"@onex/core\"\n```\n\nRe-exports everything from `@onex/core/client` for convenience.\n\n### Client Export (`@onex/core/client`)\n\n```typescript\nimport { ... } from \"@onex/core/client\"\n```\n\nBrowser-safe exports with `\"use client\"` directive:\n\n- ✅ All type definitions\n- ✅ UI components (Button, Heading, Card, etc.)\n- ✅ Rendering engine (SectionRenderer, BlockRenderer, ComponentRenderer)\n- ✅ React contexts (ThemeContext, CartContext, ViewportContext, PageDataContext)\n- ✅ Utilities (cn, generateId, block-finder, etc.)\n- ✅ Registries (SectionRegistry, BlockRegistry, ComponentRegistry)\n\n### Server Export (`@onex/core/server`)\n\n```typescript\nimport { ... } from \"@onex/core/server\"\n```\n\nServer-only exports:\n\n- ✅ ThemeRegistryManager (uses Node.js fs APIs)\n- ✅ All types (re-exported for convenience)\n\n## Available Types\n\n### Theme Contract Types\n\n```typescript\nimport type {\n  ThemeManifest, // Theme metadata\n  ThemeModule, // What themes export\n  ThemeConfig, // Design tokens\n  ThemeUpload, // Upload metadata\n} from \"@onex/core\";\n```\n\n### Section Types\n\n```typescript\nimport type {\n  SectionComponentProps, // Props for section components\n  SectionInstance, // Section data\n  SectionSchema, // Section blueprint\n  TemplateDefinition, // Template variant\n} from \"@onex/core\";\n```\n\n### Component Types\n\n```typescript\nimport type {\n  ComponentInstance, // Component data\n  ComponentDefinition, // Component blueprint\n  StyleSettings, // Component styles\n} from \"@onex/core\";\n```\n\n### Block Types\n\n```typescript\nimport type {\n  BlockInstance, // Block data (supports nesting)\n  BlockDefinition, // Block blueprint\n} from \"@onex/core\";\n```\n\n### Validation Types\n\n```typescript\nimport type {\n  ValidationResult, // Validation result\n  ValidationError, // Validation error\n  ValidationWarning, // Validation warning\n} from \"@onex/core\";\n```\n\n## Available Components\n\n35+ pre-built UI components ready to use:\n\n### Layout Components\n\n```typescript\nimport {\n  GridContainer,\n  FullWidthSection,\n  Container,\n  Grid,\n  Columns,\n} from \"@onex/core/client\";\n```\n\n### Text Components\n\n```typescript\nimport { Heading, Paragraph, Quote, Badge } from \"@onex/core/client\";\n```\n\n### Interactive Components\n\n```typescript\nimport { ButtonComponent, Link, Divider, Spacer } from \"@onex/core/client\";\n```\n\n### Media Components\n\n```typescript\nimport { Image, Icon, Video, Gallery, Map } from \"@onex/core/client\";\n```\n\n### Form Components\n\n```typescript\nimport { Input, Textarea, Checkbox, Select } from \"@onex/core/client\";\n```\n\n### Advanced Components\n\n```typescript\nimport {\n  Card,\n  Alert,\n  Accordion,\n  Tabs,\n  Rating,\n  Progress,\n  Timer,\n  Table,\n  Code,\n} from \"@onex/core/client\";\n```\n\n## Utilities\n\n### cn() - Class Name Merger\n\nCombines Tailwind CSS classes with proper precedence:\n\n```typescript\nimport { cn } from \"@onex/core/client\";\n\nconst className = cn(\n  \"text-base\",\n  \"text-lg\", // This wins (last one)\n  condition && \"font-bold\",\n  section.settings.customClass\n);\n```\n\n### generateId() - UUID Generator\n\n```typescript\nimport { generateId } from \"@onex/core/client\";\n\nconst id = generateId(); // \"abc123-def456-...\"\n```\n\n### Block Finder\n\nFind and update nested blocks:\n\n```typescript\nimport { findBlockInSection, updateBlockInSection } from \"@onex/core/client\"\n\nconst block = findBlockInSection(section, blockId)\nconst updated = updateBlockInSection(section, blockId, { settings: {...} })\n```\n\n## Contexts\n\n### ThemeContext\n\nAccess theme configuration:\n\n```typescript\nimport { useTheme } from \"@onex/core/client\"\n\nfunction MyComponent() {\n  const { config } = useTheme()\n  return <div style={{ color: config.colors.light.primary }}>...</div>\n}\n```\n\n### CartContext\n\nShopping cart state management:\n\n```typescript\nimport { useCart } from \"@onex/core/client\"\n\nfunction AddToCartButton() {\n  const { addItem } = useCart()\n  return <button onClick={() => addItem(product)}>Add to Cart</button>\n}\n```\n\n### ViewportContext\n\nResponsive breakpoint detection:\n\n```typescript\nimport { useViewport } from \"@onex/core/client\"\n\nfunction ResponsiveComponent() {\n  const { isMobile, isTablet, isDesktop } = useViewport()\n  return isMobile ? <MobileView /> : <DesktopView />\n}\n```\n\n## Theme Development Workflow\n\n1. **Setup**: Install `@onex/core` and create theme structure\n2. **Develop**: Create section components using types and UI components\n3. **Build**: Bundle with esbuild, externalize `@onex/core`\n4. **Validate**: Run `onex theme validate` (CLI coming in Phase 4)\n5. **Test**: Test with local storefront instance\n6. **Publish**: Upload ZIP to OneX marketplace\n\n## Security Constraints\n\n### v1.0.0 - Static + Runtime Constraints\n\n**Allowed**:\n\n- ✅ Import from `@onex/core`, `react`, `react-dom`\n- ✅ Standard JavaScript/TypeScript\n- ✅ Tailwind CSS classes\n- ✅ Fetch API for CDN resources\n\n**Blocked** (detected via AST validation):\n\n- ❌ `eval()` or `new Function()`\n- ❌ Node.js APIs (`fs`, `path`, `child_process`, etc.)\n- ❌ Dynamic imports except from CDN\n- ❌ Bundle size > 1MB\n\n**Runtime Protection**:\n\n- Error boundaries catch render crashes\n- Engine version enforcement\n- Limited API surface\n\n⚠️ **Note**: v1 does NOT provide true sandboxing against memory leaks, infinite loops, or network abuse. v2 will add iframe sandbox for stronger isolation.\n\n## Engine Version Compatibility\n\nSpecify compatible `@onex/core` versions using semver:\n\n```typescript\n{\n  \"engine\": \"^1.0.0\"  // Compatible with 1.x\n}\n```\n\nThe platform enforces compatibility at runtime:\n\n```typescript\nif (!semver.satisfies(platformVersion, theme.engine)) {\n  throw new Error(\"Incompatible theme version\");\n}\n```\n\n## Documentation\n\n- **API Reference**: See [`THEME_API.md`](./THEME_API.md)\n- **Type Definitions**: See [`src/types/`](./src/types/)\n- **Component Docs**: Coming soon\n- **Examples**: See `onex-theme-template` repository\n\n## Development\n\n```bash\n# Install dependencies\npnpm install\n\n# Build package\npnpm build\n\n# Watch mode\npnpm dev\n\n# Type check\npnpm type-check\n\n# Run tests\npnpm test\n```\n\n## Versioning\n\nThis package follows [Semantic Versioning](https://semver.org/):\n\n- **Major** (2.0.0): Breaking changes to public API (`@public` types)\n- **Minor** (1.1.0): New features, backward compatible\n- **Patch** (1.0.1): Bug fixes, backward compatible\n\n## License\n\nMIT\n\n---\n\n**For theme developers**: Start with the [Theme API Reference](./THEME_API.md) for complete documentation.\n\n**For platform developers**: See internal documentation in `/docs`.\n","readmeFilename":"README.md"}