{"_id":"@akanaka/eslint-config","_rev":"5-70f05aa0d795df00bf5426969dc93a2f","name":"@akanaka/eslint-config","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@akanaka/eslint-config","version":"0.1.0","keywords":["eslint","eslintconfig","design-system","akanaka","tailwind"],"license":"MIT","_id":"@akanaka/eslint-config@0.1.0","maintainers":[{"name":"akanaka","email":"markprodesigner@gmail.com"}],"dist":{"shasum":"31d6ef3a71cc8de0cce330c11beae22c99144868","tarball":"https://registry.npmjs.org/@akanaka/eslint-config/-/eslint-config-0.1.0.tgz","fileCount":7,"integrity":"sha512-o/9bc4dnlvACxlQDLkjegeNJtee344vEj2bdGBWXo6qWYhzgw27ALklKrLPBNj13GqUiP23j9JMnGfRxv9T0zg==","signatures":[{"sig":"MEUCIQDSJyKLDl20YgKtsNd7/QNkdAYJ1rJh9KZddwCctstthwIgeYU86RA4F86ZfayOKzXSy0OcHNCy/H1spFm8a+KK+HI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15318},"main":"index.js","_from":"file:akanaka-eslint-config-0.1.0.tgz","scripts":{"lint":"eslint .","test":"vitest run","lint:fix":"eslint . --fix","test:watch":"vitest"},"_npmUser":{"name":"akanaka","email":"markprodesigner@gmail.com"},"_resolved":"/private/var/folders/p8/_qb_r0pd24qc5gzvcmppg41c0000gn/T/79e08b3f3fd5a000dfbefe429d4a25df/akanaka-eslint-config-0.1.0.tgz","_integrity":"sha512-o/9bc4dnlvACxlQDLkjegeNJtee344vEj2bdGBWXo6qWYhzgw27ALklKrLPBNj13GqUiP23j9JMnGfRxv9T0zg==","_npmVersion":"11.8.0","description":"ESLint config for Akanaka Design System","directories":{},"_nodeVersion":"25.5.0","dependencies":{"@typescript-eslint/utils":"^8.0.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^2.0.0"},"peerDependencies":{"eslint":"^8.0.0 || ^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_0.1.0_1774873150050_0.004537499223204344","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@akanaka/eslint-config","version":"0.1.1","keywords":["eslint","eslintconfig","design-system","akanaka","tailwind"],"license":"MIT","_id":"@akanaka/eslint-config@0.1.1","maintainers":[{"name":"akanaka","email":"markprodesigner@gmail.com"}],"dist":{"shasum":"9ecc22c6bccff947cb69cbcccd6b884952a8beb7","tarball":"https://registry.npmjs.org/@akanaka/eslint-config/-/eslint-config-0.1.1.tgz","fileCount":7,"integrity":"sha512-dy8Fcj+mSoq1B1lRg2OTuiy6bKlIFLV3tbBYls2tjXIOvNN4xjYKZ7aDYoqSory7FIyjuzXOVa1eDIZsW5bC/A==","signatures":[{"sig":"MEUCIEFj9oNlfhXSp6ItdRuMkFo1TKgHRMQ9KlhpTOOBgd02AiEA3mD9ZePsRbOZhbdehTzShLTLG53Mje/gawl4Emj2Dy4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15553},"main":"index.js","_from":"file:akanaka-eslint-config-0.1.1.tgz","scripts":{"lint":"eslint .","test":"vitest run","lint:fix":"eslint . --fix","test:watch":"vitest"},"_npmUser":{"name":"akanaka","email":"markprodesigner@gmail.com"},"_resolved":"/private/var/folders/p8/_qb_r0pd24qc5gzvcmppg41c0000gn/T/3edff30749e0444dbc774c26b3c087cd/akanaka-eslint-config-0.1.1.tgz","_integrity":"sha512-dy8Fcj+mSoq1B1lRg2OTuiy6bKlIFLV3tbBYls2tjXIOvNN4xjYKZ7aDYoqSory7FIyjuzXOVa1eDIZsW5bC/A==","_npmVersion":"11.8.0","description":"ESLint config for Akanaka Design System","directories":{},"_nodeVersion":"25.5.0","dependencies":{"@typescript-eslint/utils":"^8.0.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^2.0.0"},"peerDependencies":{"eslint":"^8.0.0 || ^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_0.1.1_1774873780037_0.7707073669985263","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@akanaka/eslint-config","version":"0.2.0","keywords":["eslint","eslintconfig","design-system","akanaka","tailwind"],"license":"MIT","_id":"@akanaka/eslint-config@0.2.0","maintainers":[{"name":"akanaka","email":"markprodesigner@gmail.com"}],"dist":{"shasum":"53b5ed37a5958b153590ecccdfacb08fe779a104","tarball":"https://registry.npmjs.org/@akanaka/eslint-config/-/eslint-config-0.2.0.tgz","fileCount":8,"integrity":"sha512-Av9yREA/u9jAbBHAKODL27ywc/QOGKXObhrjDRtOGk+sZuICuFtJ1iW1FW2Gvrzilcy37jpLcjn2uAa/BA2bmw==","signatures":[{"sig":"MEUCIEhYoY8rMqXTAS8/sEFtFn5tRDfJCQwhu4lBLvSHYsE3AiEAuxgF/mQujWjZL4owAG39ilKGk0KIEsCSzFRf3bdXW+I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18899},"main":"index.js","_from":"file:akanaka-eslint-config-0.2.0.tgz","scripts":{"lint":"eslint .","test":"vitest run","lint:fix":"eslint . --fix","test:watch":"vitest"},"_npmUser":{"name":"akanaka","email":"markprodesigner@gmail.com"},"_resolved":"/private/var/folders/p8/_qb_r0pd24qc5gzvcmppg41c0000gn/T/e3f89e5a7b79dbeb548e30f7f132d23f/akanaka-eslint-config-0.2.0.tgz","_integrity":"sha512-Av9yREA/u9jAbBHAKODL27ywc/QOGKXObhrjDRtOGk+sZuICuFtJ1iW1FW2Gvrzilcy37jpLcjn2uAa/BA2bmw==","_npmVersion":"11.8.0","description":"ESLint config for Akanaka Design System","directories":{},"_nodeVersion":"25.5.0","dependencies":{"@typescript-eslint/utils":"^8.0.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^2.0.0"},"peerDependencies":{"eslint":"^8.0.0 || ^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_0.2.0_1774982453640_0.6131987703071917","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@akanaka/eslint-config","version":"0.2.1","keywords":["eslint","eslintconfig","design-system","akanaka","tailwind"],"license":"MIT","_id":"@akanaka/eslint-config@0.2.1","maintainers":[{"name":"akanaka","email":"markprodesigner@gmail.com"}],"dist":{"shasum":"1cba20507aadc349f90137d0fe500c21036a6ed7","tarball":"https://registry.npmjs.org/@akanaka/eslint-config/-/eslint-config-0.2.1.tgz","fileCount":8,"integrity":"sha512-vlFKlZ49jnH83UBvdEKkF2YinUaHbGnQWQ3cRfVO7IKL2wXSx+Zpy62AOBHsAM1oF3a5OncO7UJqg+oy2WrPtA==","signatures":[{"sig":"MEYCIQCv7AMFOx7neeOdVgTJoVOuRnjxRcHCXPAQrya3fhlBvwIhAMoUzDoHW7fAflRfknnHxPD26APOwKN/YaT9B6Hym0RT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18899},"main":"index.js","_from":"file:akanaka-eslint-config-0.2.1.tgz","scripts":{"lint":"eslint .","test":"vitest run","lint:fix":"eslint . --fix","test:watch":"vitest"},"_npmUser":{"name":"akanaka","email":"markprodesigner@gmail.com"},"_resolved":"/private/var/folders/p8/_qb_r0pd24qc5gzvcmppg41c0000gn/T/194d5ec16af0983b2d4725999d18e883/akanaka-eslint-config-0.2.1.tgz","_integrity":"sha512-vlFKlZ49jnH83UBvdEKkF2YinUaHbGnQWQ3cRfVO7IKL2wXSx+Zpy62AOBHsAM1oF3a5OncO7UJqg+oy2WrPtA==","_npmVersion":"11.8.0","description":"ESLint config for Akanaka Design System","directories":{},"_nodeVersion":"25.5.0","dependencies":{"@typescript-eslint/utils":"^8.0.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^2.0.0"},"peerDependencies":{"eslint":"^8.0.0 || ^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-config_0.2.1_1774982621524_0.880428536122229","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Use @akanaka-design/eslint-config instead; this scope is unmaintained."}},"time":{"created":"2026-03-30T12:19:09.674Z","modified":"2026-04-04T09:47:48.658Z","0.1.0":"2026-03-30T12:19:10.185Z","0.1.1":"2026-03-30T12:29:40.178Z","0.2.0":"2026-03-31T18:40:53.845Z","0.2.1":"2026-03-31T18:43:41.663Z"},"license":"MIT","keywords":["eslint","eslintconfig","design-system","akanaka","tailwind"],"description":"ESLint config for Akanaka Design System","maintainers":[{"name":"akanaka","email":"markprodesigner@gmail.com"}],"readme":"# @akanaka/eslint-config\n\nESLint configuration for enforcing Akanaka Design System rules.\n\n## Features\n\n- 🎨 **Prevents hardcoded colors** - enforces design token usage\n- 🧩 **Validates component imports** - ensures components exist in registry\n- 🎯 **Smart suggestions** - suggests nearest valid token based on color similarity\n- ⚡ **Fast & lightweight** - zero runtime dependencies\n- 🔧 **Works everywhere** - Cursor, VS Code, CI/CD pipelines\n\n## Installation\n```bash\npnpm add -D @akanaka/eslint-config\n# or\nnpm install --save-dev @akanaka/eslint-config\n```\n\n## Usage\n\n### Basic Setup\n\nIn your `.eslintrc.js` or `.eslintrc.cjs`:\n```javascript\nmodule.exports = {\n  extends: ['@akanaka/eslint-config'],\n};\n```\n\n### With Next.js\n```javascript\nmodule.exports = {\n  extends: [\n    '@akanaka/eslint-config',\n    'next/core-web-vitals',\n  ],\n};\n```\n\n### With TypeScript\n```javascript\nmodule.exports = {\n  extends: [\n    '@akanaka/eslint-config',\n    'plugin:@typescript-eslint/recommended',\n  ],\n  parser: '@typescript-eslint/parser',\n};\n```\n\n## Rules\n\n### `akanaka/no-hardcoded-colors`\n\nPrevents hardcoded color values. Enforces use of Akanaka design tokens.\n\n**Detects:**\n- Hex colors: `#E07A5F`, `#3B82F6`\n- RGB/RGBA: `rgb(224, 122, 95)`, `rgba(59, 130, 246, 0.5)`\n- HSL/HSLA: `hsl(12, 70%, 60%)`, `hsla(221, 83%, 53%, 0.8)`\n- Tailwind arbitrary values: `bg-[#E07A5F]`, `text-[rgb(59,130,246)]`\n- Inline styles: `style={{ color: 'red' }}`\n\n❌ **Bad:**\n```jsx\n// Hardcoded hex\n<div className=\"bg-[#E07A5F]\">Content</div>\n\n// Hardcoded RGB\n<div className=\"bg-[rgb(224,122,95)]\">Content</div>\n\n// Inline styles\n<button style={{ backgroundColor: '#3B82F6' }}>Click</button>\n```\n\n✅ **Good:**\n```jsx\n// Using design tokens\n<div className=\"bg-primary-500\">Content</div>\n<div className=\"bg-neutral-700 text-primary-500\">Content</div>\n<button className=\"bg-info\">Click</button>\n```\n\n**Smart Suggestions:**\n\nThe linter calculates color distance and suggests the nearest valid token:\n```jsx\n// Input: <div className=\"bg-[#E07A5F]\">\n// Error: Hardcoded color \"[#E07A5F]\". Use bg-primary-500 instead.\n\n// Input: <div className=\"bg-[#3B82F6]\">\n// Error: Hardcoded color \"[#3B82F6]\". Use bg-info instead.\n\n// Input: <div className=\"bg-[#44403C]\">\n// Error: Hardcoded color \"[#44403C]\". Use bg-neutral-700 instead.\n```\n\n### `akanaka/component-exists`\n\nEnsures imported components exist in the Akanaka component registry.\n\n❌ **Bad:**\n```jsx\nimport { SuperButton } from '@akanaka/components';\nimport { FancyCard } from '@akanaka/components';\n```\n\n✅ **Good:**\n```jsx\nimport { Button } from '@akanaka/components';\nimport { Card, CardTitle, CardContent } from '@akanaka/components';\n```\n\n**Error message includes available components:**\n```text\nComponent \"SuperButton\" does not exist in Akanaka.\nAvailable: Alert, Avatar, Badge, Button, Card...\n```\n\n## Available Tokens\n\n### Colors\n\n**Primary (Terracotta):**\n\n`primary-50`, `primary-100`, `primary-200`, `primary-500`, `primary-600`, `primary-700`\n\n**Neutrals (Warm Stone):**\n\n`neutral-50`, `neutral-100`, `neutral-200`, `neutral-300`, `neutral-500`, `neutral-700`, `neutral-900`\n\n**Semantic:**\n\n`success`, `warning`, `error`, `info`\n\n### Components\n\n`Alert`, `Avatar`, `Badge`, `Button`, `Card`, `CardTitle`, `CardDescription`, `CardContent`, `CardFooter`, `Checkbox`, `Input`, `Label`, `Progress`, `Select`, `Table`, `Tabs`, `Toggle`\n\n## Integration with Cursor\n\nThis config works seamlessly with Cursor:\n\n1. Install the package: `pnpm add -D @akanaka/eslint-config`\n2. Create `.eslintrc.cjs` in your project root (see Usage above)\n3. Cursor automatically shows errors in real-time as you type\n\nTip: add `.cursorrules` to reinforce design system usage:\n\n```markdown\n# Akanaka Design System Rules\n\n- NEVER use hardcoded colors\n- ALWAYS use Tailwind classes with Akanaka tokens\n- ONLY import components from @akanaka/components\n```\n\n## CI/CD Integration\n\n### GitHub Actions\n\n```yaml\nname: Design System Compliance\n\non:\n  pull_request:\n    branches: [main]\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: pnpm/action-setup@v2\n      - run: pnpm install\n      - run: pnpm lint\n```\n\n### Turbo (Monorepo)\n\nIf using Turborepo, add to `turbo.json`:\n\n```json\n{\n  \"tasks\": {\n    \"lint\": {\n      \"cache\": false,\n      \"outputs\": []\n    }\n  }\n}\n```\n\nThen run:\n\n```bash\npnpm turbo lint\n```\n\n## Development\n\n### Running Tests\n\n```bash\npnpm test          # Run once\npnpm test:watch    # Watch mode\n```\n\n### Test Coverage\n\n- Hex color detection\n- RGB/RGBA detection\n- HSL/HSLA detection\n- Tailwind arbitrary value detection\n- No double-reporting\n- Smart token suggestions\n- Component registry validation\n- Ignores non-Akanaka imports\n\n## Publishing\n\nPublish from package directory:\n\n```bash\npnpm publish --access public\n```\n\nPre-publish checklist:\n\n- `pnpm lint` passes\n- `pnpm test` passes\n- `CHANGELOG.md` updated for the release\n- `package.json` version bumped appropriately\n- `files` includes `README.md` and `CHANGELOG.md`\n\n## License\n\nMIT\n","readmeFilename":"README.md"}