{"_id":"@af-mobile/ui","_rev":"13-dda13bc16c06465bb11142db538df89f","name":"@af-mobile/ui","dist-tags":{"latest":"1.10.1"},"versions":{"1.3.1":{"name":"@af-mobile/ui","version":"1.3.1","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.3.1","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"dist":{"shasum":"e0f43a203b141122028b76fa435e71e57504cdc1","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.3.1.tgz","fileCount":62,"integrity":"sha512-Xf7gXA+uTZ6Xnc8iCvHp90fTAN/FiEb4G2Se/b0Q9Hu8dS6hZX98Rv7km1EeAbtb/pKxcVlZU/KOxSRan5BXGg==","signatures":[{"sig":"MEUCIQCgdTiQZJ0rjYP+wVWL+gAcyFRPpAKIDotV110ItY2e+QIgFjkw+4mohEaa3ETGfOzNHy7Cm7qxEa2q6FXmd+nRPyg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":605289},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","unpkg":"./dist/aiflow-ui.umd.js","module":"./src/index.js","browser":"./dist/aiflow-ui.umd.js","exports":{".":{"import":"./src/index.js","default":"./src/index.js"},"./css":"./src/index.css","./dist":"./dist/index.js","./lib/*":"./src/lib/*","./dist/css":"./dist/index.css","./dist/umd":"./dist/aiflow-ui.umd.js","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./aiflow-ui.css":"./src/index.css"},"gitHead":"d976c09ad2c79888ae6583fc5a7b4285eb61cea1","scripts":{"ci":"vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"vitest run","build":"node scripts/build.mjs","ai-fix":"node scripts/ai-fix.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","whitelist":"node scripts/gen-whitelist.mjs","demo:build":"vite build","perf:check":"node scripts/perf.mjs --budget","size:check":"node scripts/size-check.mjs","test:watch":"vitest","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/check-prompt-sync.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","whitelist:check":"node scripts/check-whitelist-sync.mjs"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"jsdelivr":"./dist/aiflow-ui.umd.js","workspaces":["vue","react","eslint-plugin-aiflow"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.4.0","vite":"^5.4.0","jsdom":"^24.0.0","react":"^18.3.1","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","react-dom":"^18.3.1","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.3.1_1786700637077_0.2174079600869927","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@af-mobile/ui","version":"1.3.2","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.3.2","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"dist":{"shasum":"1eb367902409aed12ff3c686861d21c319c0e549","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.3.2.tgz","fileCount":62,"integrity":"sha512-G9bHlX1rFPv1dq7U4wDP/34ZHHFdnfZgC6aI7xwBoum2KmrBl0sk7xcAE7cV5xam/3hJbv91v9SM9eoNV9S/fw==","signatures":[{"sig":"MEUCIFM/MYfE8RimSScouVpRBw2x10wMQoxatp3+NdwR82knAiEA9SWUFpu3m81xXXmGQFnw7hWG/XhjqKawrnxMLwQlYYw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":610822},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","unpkg":"./dist/aiflow-ui.umd.js","module":"./src/index.js","browser":"./dist/aiflow-ui.umd.js","exports":{".":{"import":"./src/index.js","default":"./src/index.js"},"./css":"./src/index.css","./dist":"./dist/index.js","./lib/*":"./src/lib/*","./dist/css":"./dist/index.css","./dist/umd":"./dist/aiflow-ui.umd.js","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./aiflow-ui.css":"./src/index.css"},"gitHead":"786a84a7a6d2a20a5269ef66dedecf2815e50e0d","scripts":{"ci":"vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"vitest run","build":"node scripts/build.mjs","ai-fix":"node scripts/ai-fix.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","whitelist":"node scripts/gen-whitelist.mjs","demo:build":"vite build","perf:check":"node scripts/perf.mjs --budget","size:check":"node scripts/size-check.mjs","test:watch":"vitest","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/check-prompt-sync.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","whitelist:check":"node scripts/check-whitelist-sync.mjs"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"jsdelivr":"./dist/aiflow-ui.umd.js","workspaces":["vue","react","eslint-plugin-aiflow"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.4.0","vite":"^5.4.0","jsdom":"^24.0.0","react":"^18.3.1","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","react-dom":"^18.3.1","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.3.2_1786706196550_0.7037970544016325","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@af-mobile/ui","version":"1.4.0","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.4.0","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"bin":{"aiflow":"scripts/aiflow.mjs"},"dist":{"shasum":"8f73f5ee62c1c3fd4efc0eb8aafc1e6aea7e2c58","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.4.0.tgz","fileCount":77,"integrity":"sha512-izZZc49YEuemKGNrcaMNFjW882dviVIGb6TG1kflM35/IGkcu8Eircp7YGiweHsqWKYZcLJGWzVhRvv58Fd5vw==","signatures":[{"sig":"MEUCIBPOlhOTPYE6zJnuoHDRzQogWfoVxv85BpBRWDPxwlf6AiEA//7/G+zjkbdYs5LZjWuXagpeO6P8ME9Vkh2ZDu79xr4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":667247},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","unpkg":"./dist/aiflow-ui.umd.js","module":"./src/index.js","browser":"./dist/aiflow-ui.umd.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js"},"./css":"./src/index.css","./dist":"./dist/index.js","./lib/*":"./src/lib/*","./charts":{"types":"./src/charts/index.d.ts","import":"./src/charts/index.js","default":"./src/charts/index.js"},"./dist/css":"./dist/index.css","./dist/umd":"./dist/aiflow-ui.umd.js","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./aiflow-ui.css":"./src/index.css"},"gitHead":"7fb489e0d4803722ea42da60011b9653231b6cda","scripts":{"ci":"vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"vitest run","build":"node scripts/build.mjs","ai-fix":"node scripts/ai-fix.mjs","create":"node scripts/create-app.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","build:mcp":"node scripts/build-mcp.mjs","skill:add":"node scripts/skill-add.mjs","whitelist":"node scripts/gen-whitelist.mjs","aria:check":"node scripts/check-aria-sync.mjs","demo:build":"vite build","perf:check":"node scripts/perf.mjs --budget","pkg:assets":"node scripts/sync-pkg-assets.mjs","size:check":"node scripts/size-check.mjs","test:watch":"vitest","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/check-prompt-sync.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","whitelist:check":"node scripts/check-whitelist-sync.mjs"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"jsdelivr":"./dist/aiflow-ui.umd.js","workspaces":["eslint-plugin-aiflow"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.4.0_1786926457893_0.9066143993887263","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@af-mobile/ui","version":"1.4.1","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.4.1","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"bin":{"aiflow":"scripts/aiflow.mjs"},"dist":{"shasum":"21468f40d6e1a3971919decd3daa470456e84dbf","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.4.1.tgz","fileCount":77,"integrity":"sha512-M5+SZ4IPsWMYYYE47yz5k2gef37Ryc2JgXp2fE5STQw7cySGzaTdQEepVKslobBO5SHUu17I2iFgxgtHIl64fg==","signatures":[{"sig":"MEYCIQCqFfmIxIPYEwasMeTiURMSx3QHRcIB2iJdR8X5CM7ltAIhAMCzxaT2Ws/oaFAvnIQN5mydC2A89tQwWJIF+b15lMLL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":668286},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","unpkg":"./dist/aiflow-ui.umd.js","module":"./src/index.js","browser":"./dist/aiflow-ui.umd.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js"},"./css":"./src/index.css","./dist":"./dist/index.js","./lib/*":"./src/lib/*","./charts":{"types":"./src/charts/index.d.ts","import":"./src/charts/index.js","default":"./src/charts/index.js"},"./dist/css":"./dist/index.css","./dist/umd":"./dist/aiflow-ui.umd.js","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./aiflow-ui.css":"./src/index.css"},"gitHead":"3626791eb43cc89a2b069a8f4929f14f6e844da5","scripts":{"ci":"vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"vitest run","build":"node scripts/build.mjs","ai-fix":"node scripts/ai-fix.mjs","create":"node scripts/create-app.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","build:mcp":"node scripts/build-mcp.mjs","skill:add":"node scripts/skill-add.mjs","whitelist":"node scripts/gen-whitelist.mjs","aria:check":"node scripts/check-aria-sync.mjs","demo:build":"vite build","perf:check":"node scripts/perf.mjs --budget","pkg:assets":"node scripts/sync-pkg-assets.mjs","size:check":"node scripts/size-check.mjs","test:watch":"vitest","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/check-prompt-sync.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","whitelist:check":"node scripts/check-whitelist-sync.mjs"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"jsdelivr":"./dist/aiflow-ui.umd.js","workspaces":["eslint-plugin-aiflow","create-af-mobile"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.4.1_1786938297132_0.08961749666879326","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"@af-mobile/ui","version":"1.4.2","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.4.2","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"bin":{"aiflow":"scripts/aiflow.mjs"},"dist":{"shasum":"76af95bf60874df5d57c7c61136250eca6489328","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.4.2.tgz","fileCount":77,"integrity":"sha512-CqFP4RQuXoPoholxtHhm5amEgI6C7VXcsVDq8F/ohw6ju8Lj3RS3ud9DprFo8yyzJBaYZ+8HR5NGmM/+hcpnaQ==","signatures":[{"sig":"MEYCIQDYFv230I6IyhjPd59BHkKB9jcO6UNlY81Uzx+uZBix2AIhAP5MxqDagj84pnJT9CRMxWDo1btjyuuXbvdaEzlhorKi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":672035},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","unpkg":"./dist/aiflow-ui.umd.js","module":"./src/index.js","browser":"./dist/aiflow-ui.umd.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js"},"./css":"./src/index.css","./dist":"./dist/index.js","./lib/*":"./src/lib/*","./charts":{"types":"./src/charts/index.d.ts","import":"./src/charts/index.js","default":"./src/charts/index.js"},"./dist/css":"./dist/index.css","./dist/umd":"./dist/aiflow-ui.umd.js","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./aiflow-ui.css":"./src/index.css"},"gitHead":"7ddd5f04edd186b9d0f139e1affce1b4a8b98592","scripts":{"ci":"vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"vitest run","build":"node scripts/build.mjs","ai-fix":"node scripts/ai-fix.mjs","create":"node scripts/create-app.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","build:mcp":"node scripts/build-mcp.mjs","skill:add":"node scripts/skill-add.mjs","whitelist":"node scripts/gen-whitelist.mjs","aria:check":"node scripts/check-aria-sync.mjs","demo:build":"vite build","perf:check":"node scripts/perf.mjs --budget","pkg:assets":"node scripts/sync-pkg-assets.mjs","size:check":"node scripts/size-check.mjs","test:watch":"vitest","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/check-prompt-sync.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","whitelist:check":"node scripts/check-whitelist-sync.mjs"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"jsdelivr":"./dist/aiflow-ui.umd.js","workspaces":["eslint-plugin-aiflow","create-af-mobile"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.4.2_1786964312704_0.5705919992938371","host":"s3://npm-registry-packages-npm-production"}},"1.4.3":{"name":"@af-mobile/ui","version":"1.4.3","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.4.3","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"bin":{"af-mobile":"scripts/af-mobile.mjs"},"dist":{"shasum":"345cfe834d33840828a590506dbc7c93d54465f1","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.4.3.tgz","fileCount":78,"integrity":"sha512-rVQDHUUBfY3lPYU+hphkr1s6+EMwH9iSdWRw3AShhSBO2brvOOpXgfs3lrfF/WzDmFi5/vtZxExnz5n0tS7Xqw==","signatures":[{"sig":"MEUCIQD1SUt+MAyBi/j3OKlGwEvgnXeCrYwbnIFES0GdygwLzAIgfeATDt4PJ8pttgT3QTSduHQCGh2iupht+avOoZCeEqM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":705714},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","module":"./src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js"},"./css":"./src/index.css","./dist":"./dist/index.js","./lib/*":"./src/lib/*","./charts":{"types":"./src/charts/index.d.ts","import":"./src/charts/index.js","default":"./src/charts/index.js"},"./dist/css":"./dist/index.css","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./af-mobile.css":"./src/index.css"},"gitHead":"20847ef8927a9d8a892cf3cf1e8f667b6221c942","scripts":{"ci":"vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"vitest run","build":"node scripts/build.mjs","ai-fix":"node scripts/ai-fix.mjs","create":"node scripts/create-app.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","docs:dev":"vitepress dev site","docs:gen":"node scripts/gen-docs.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","build:mcp":"node scripts/build-mcp.mjs","skill:add":"node scripts/skill-add.mjs","whitelist":"node scripts/gen-whitelist.mjs","aria:check":"node scripts/check-aria-sync.mjs","demo:build":"vite build","docs:build":"vitepress build site","perf:check":"node scripts/perf.mjs --budget","pkg:assets":"node scripts/sync-pkg-assets.mjs","size:check":"node scripts/size-check.mjs","test:watch":"vitest","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/check-prompt-sync.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","whitelist:check":"node scripts/check-whitelist-sync.mjs"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"workspaces":["eslint-plugin-af-mobile","create-af-mobile"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","vitepress":"^1.6.4","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.4.3_1787056131403_0.9035737599453726","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"@af-mobile/ui","version":"1.5.2","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.5.2","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"bin":{"af-mobile":"scripts/af-mobile.mjs"},"dist":{"shasum":"ae451a9f1616ad8627fe6359676ca847e44ff03e","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.5.2.tgz","fileCount":93,"integrity":"sha512-2b7RDFLhk/fngM6m6JkN4D2aUnOYkFTXilflkfr67TvIWY9kEiqX5mgOppI3ZB6OFF9v/nAtzhrqZzYPXsAgog==","signatures":[{"sig":"MEQCIHgJVyNOcL3l5IyEuNQcmgNVt6drnpx3CciEi5B4NtgQAiA4TMMt7TMlAK1eGhaOAIw7xzKqiXqECjCGJedQ4wxF7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":804871},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","module":"./src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js"},"./css":"./src/index.css","./chat":{"types":"./src/chat/index.d.ts","import":"./src/chat/index.js","default":"./src/chat/index.js"},"./dist":"./dist/index.js","./lib/*":"./src/lib/*","./charts":{"types":"./src/charts/index.d.ts","import":"./src/charts/index.js","default":"./src/charts/index.js"},"./dist/css":"./dist/index.css","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./af-mobile.css":"./src/index.css"},"gitHead":"ecc54817f459e4611bb772e290d61cc95e2991a2","scripts":{"ci":"node scripts/check-contrast.mjs && vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"node scripts/check-contrast.mjs && vitest run","build":"node scripts/build.mjs","ai-fix":"node scripts/ai-fix.mjs","create":"node scripts/create-app.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","docs:dev":"vitepress dev site","docs:gen":"node scripts/gen-docs.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","build:mcp":"node scripts/build-mcp.mjs","skill:add":"node scripts/skill-add.mjs","whitelist":"node scripts/gen-whitelist.mjs","aria:check":"node scripts/check-aria-sync.mjs","demo:build":"vite build","docs:build":"vitepress build site","perf:check":"node scripts/perf.mjs --budget","pkg:assets":"node scripts/sync-pkg-assets.mjs","size:check":"node scripts/size-check.mjs","test:watch":"vitest","skill:check":"node scripts/check-skill-exports.mjs","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/check-prompt-sync.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:contrast":"node scripts/check-contrast.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","whitelist:check":"node scripts/check-whitelist-sync.mjs"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"workspaces":["eslint-plugin-af-mobile","create-af-mobile"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css","src/chat/i18n.js"],"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","vitepress":"^1.6.4","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.5.2_1787142720052_0.3350452555273151","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@af-mobile/ui","version":"1.7.0","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.7.0","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"bin":{"af-mobile":"scripts/af-mobile.mjs"},"dist":{"shasum":"8802ec002cf826ecf3bc3e81fd5c56fb3f2b5940","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.7.0.tgz","fileCount":106,"integrity":"sha512-IMGlOV5S2S4Bo1aRGeAbOUfmkUMEZwuTTTBRL8ADX1EY55rDBqtZfDReGfWd+h3eplRcq2kvzK5XgX6XDR0lpg==","signatures":[{"sig":"MEQCIDft6spd13sSFsZYz8uQ6qrpnovC+u2jSXH73TA31ctdAiBI2GqrwgxZjVpAKVYNubiWjsY80tVdddcQiKjZNj/8Uw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":908368},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","module":"./src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js"},"./k":{"types":"./src/k/index.d.ts","import":"./src/k/index.js","default":"./src/k/index.js"},"./css":"./src/index.css","./chat":{"types":"./src/chat/index.d.ts","import":"./src/chat/index.js","default":"./src/chat/index.js"},"./dist":"./dist/index.js","./lib/*":"./src/lib/*","./blocks":{"types":"./src/blocks/index.d.ts","import":"./src/blocks/index.js","default":"./src/blocks/index.js"},"./charts":{"types":"./src/charts/index.d.ts","import":"./src/charts/index.js","default":"./src/charts/index.js"},"./blocks/*":"./src/blocks/*","./dist/css":"./dist/index.css","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./dist/blocks":"./dist/blocks.js","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./af-mobile.css":"./src/index.css","./dist/components.css":"./dist/components.css"},"gitHead":"41b243c2405eb0ee4e6380d221de13fdd592ee4b","scripts":{"ci":"node scripts/check-contrast.mjs && vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"node scripts/check-contrast.mjs && vitest run","build":"node scripts/build.mjs","entry":"node scripts/gen-entry.mjs","ai-fix":"node scripts/ai-fix.mjs","create":"node scripts/create-app.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","pub:mcp":"npm run build:mcp && npm publish --workspace=@af-mobile/mcp","release":"changeset publish","docs:dev":"vitepress dev site","docs:gen":"node scripts/gen-docs.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","build:mcp":"node scripts/build-mcp.mjs","changeset":"changeset","skill:add":"node scripts/skill-add.mjs","whitelist":"node scripts/gen-whitelist.mjs","aria:check":"node scripts/check-aria-sync.mjs","demo:build":"vite build","demo:check":"node scripts/check-demo.mjs","docs:build":"vitepress build site","i18n:check":"node scripts/check-i18n.mjs","perf:check":"node scripts/perf.mjs --budget","pkg:assets":"node scripts/sync-pkg-assets.mjs","pub:prompt":"npm run build:prompt && npm publish --workspace=@af-mobile/prompt","pub:tokens":"node scripts/build-tokens-pkg.mjs && npm publish --workspace=@af-mobile/tokens","size:check":"node scripts/size-check.mjs","test:watch":"vitest","entry:check":"node scripts/gen-entry.mjs --check","skill:check":"node scripts/check-skill-exports.mjs","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","fewshots:gen":"node scripts/gen-component-fewshots.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/gen-component-fewshots.mjs --check && node scripts/check-prompt-sync.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:contrast":"node scripts/check-contrast.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","registry:check":"node scripts/check-registry.mjs","changeset:check":"changeset status --since=main","whitelist:check":"node scripts/check-whitelist-sync.mjs","version-packages":"changeset version"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"overrides":{"@af-mobile/ui":"file:."},"workspaces":["eslint-plugin-af-mobile","create-af-mobile","mcp","prompt","adapters","tokens"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css","src/chat/i18n.js"],"_nodeVersion":"24.14.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","vitepress":"^1.6.4","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@changesets/cli":"^3.0.1","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.7.0_1787919602797_0.4351784994268004","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@af-mobile/ui","version":"1.8.0","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.8.0","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"homepage":"https://github.com/soulor8908/af-mobile#readme","bugs":{"url":"https://github.com/soulor8908/af-mobile/issues"},"bin":{"af-mobile":"scripts/af-mobile.mjs"},"dist":{"shasum":"ceca19ece00c7cbb5f1a96dbaeac10b2bbe827a8","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.8.0.tgz","fileCount":112,"integrity":"sha512-weh5nwr60afGI1c/gxJ8u+q8lVEyd6tz0gJiBVR2+puPz2Cdc+wdd7jWEYaAizzUyM+WpPfhDSd6OeieFSJ8Nw==","signatures":[{"sig":"MEUCIESqaQdQEHT0kGpgCKAHIN32/VXUp3frHHXGIkqOq5U2AiEAxQWOW1fMSOZrBY8Idegi+wuycda3bfCrRPHE0Of8Yu0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@af-mobile%2fui@1.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":864844},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","module":"./src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js"},"./k":{"types":"./src/k/index.d.ts","import":"./src/k/index.js","default":"./src/k/index.js"},"./css":"./src/index.css","./chat":{"types":"./src/chat/index.d.ts","import":"./src/chat/index.js","default":"./src/chat/index.js"},"./dist":"./dist/index.js","./lib/*":"./src/lib/*","./blocks":{"types":"./src/blocks/index.d.ts","import":"./src/blocks/index.js","default":"./src/blocks/index.js"},"./charts":{"types":"./src/charts/index.d.ts","import":"./src/charts/index.js","default":"./src/charts/index.js"},"./blocks/*":"./src/blocks/*","./dist/css":"./dist/index.css","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./dist/blocks":"./dist/blocks.js","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./af-mobile.css":"./src/index.css","./dist/components.css":"./dist/components.css"},"gitHead":"0e7b890c7285b11e32305f6161ecfa1c37ba9b96","scripts":{"ci":"node scripts/check-contrast.mjs && vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"node scripts/check-contrast.mjs && vitest run","build":"node scripts/build.mjs","entry":"node scripts/gen-entry.mjs","ai-fix":"node scripts/ai-fix.mjs","create":"node scripts/create-app.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","pub:mcp":"npm run build:mcp && npm publish --workspace=@af-mobile/mcp","release":"changeset publish","docs:dev":"vitepress dev site","docs:gen":"node scripts/gen-docs.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","build:mcp":"node scripts/build-mcp.mjs","changeset":"changeset","skill:add":"node scripts/skill-add.mjs","whitelist":"node scripts/gen-whitelist.mjs","aria:check":"node scripts/check-aria-sync.mjs","demo:build":"vite build","demo:check":"node scripts/check-demo.mjs","docs:build":"vitepress build site","i18n:check":"node scripts/check-i18n.mjs","perf:check":"node scripts/perf.mjs --budget","pkg:assets":"node scripts/sync-pkg-assets.mjs","pub:prompt":"npm run build:prompt && npm publish --workspace=@af-mobile/prompt","pub:tokens":"node scripts/build-tokens-pkg.mjs && npm publish --workspace=@af-mobile/tokens","size:check":"node scripts/size-check.mjs","test:watch":"vitest","entry:check":"node scripts/gen-entry.mjs --check","skill:check":"node scripts/check-skill-exports.mjs","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","fewshots:gen":"node scripts/gen-component-fewshots.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/gen-component-fewshots.mjs --check && node scripts/check-prompt-sync.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:contrast":"node scripts/check-contrast.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","registry:check":"node scripts/check-registry.mjs","scaffold:check":"node scripts/check-scaffold.mjs","changeset:check":"changeset status --since=main","whitelist:check":"node scripts/check-whitelist-sync.mjs","version-packages":"changeset version"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"repository":{"url":"git+https://github.com/soulor8908/af-mobile.git","type":"git"},"workspaces":[".","eslint-plugin-af-mobile","create-af-mobile","mcp","prompt","adapters","tokens"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css","src/chat/i18n.js"],"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","vitepress":"^1.6.4","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@changesets/cli":"^3.0.1","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.8.0_1788003144650_0.3061589769244195","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@af-mobile/ui","version":"1.9.0","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.9.0","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"homepage":"https://github.com/soulor8908/af-mobile#readme","bugs":{"url":"https://github.com/soulor8908/af-mobile/issues"},"bin":{"af-mobile":"scripts/af-mobile.mjs"},"dist":{"shasum":"f26281c07311180198163293f8294192cb74faa9","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.9.0.tgz","fileCount":113,"integrity":"sha512-SpS4JHLAwqG8K1sRJWhmbPDo5fOZtJeUOy1eXb0xpylcbNThKuL4mf0YWF4bbCJRR3BDZPVWiAe6XQ92BzSZFA==","signatures":[{"sig":"MEUCIBGTmNbS+JLfradn4YWqtgYd2/JIsPBsQrsviItjo15rAiEAznFZFojb7phVPJSdqU/RloK+aU5yGfCgCJqk6yERaL0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@af-mobile%2fui@1.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":876529},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","module":"./src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js"},"./k":{"types":"./src/k/index.d.ts","import":"./src/k/index.js","default":"./src/k/index.js"},"./css":"./src/index.css","./chat":{"types":"./src/chat/index.d.ts","import":"./src/chat/index.js","default":"./src/chat/index.js"},"./dist":"./dist/index.js","./test":"./src/test-setup.js","./lib/*":"./src/lib/*","./blocks":{"types":"./src/blocks/index.d.ts","import":"./src/blocks/index.js","default":"./src/blocks/index.js"},"./charts":{"types":"./src/charts/index.d.ts","import":"./src/charts/index.js","default":"./src/charts/index.js"},"./blocks/*":"./src/blocks/*","./dist/css":"./dist/index.css","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./dist/blocks":"./dist/blocks.js","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./af-mobile.css":"./src/index.css","./dist/components.css":"./dist/components.css"},"gitHead":"7c9095fb69d22903349ca96986d15a3df27fc724","scripts":{"ci":"node scripts/check-contrast.mjs && vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"node scripts/check-contrast.mjs && vitest run","build":"node scripts/build.mjs","entry":"node scripts/gen-entry.mjs","ai-fix":"node scripts/ai-fix.mjs","create":"node scripts/create-app.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","pub:mcp":"npm run build:mcp && npm publish --workspace=@af-mobile/mcp","release":"changeset publish","docs:dev":"vitepress dev site","docs:gen":"node scripts/gen-docs.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","build:mcp":"node scripts/build-mcp.mjs","changeset":"changeset","skill:add":"node scripts/skill-add.mjs","whitelist":"node scripts/gen-whitelist.mjs","aria:check":"node scripts/check-aria-sync.mjs","demo:build":"vite build","demo:check":"node scripts/check-demo.mjs","docs:build":"vitepress build site","i18n:check":"node scripts/check-i18n.mjs","perf:check":"node scripts/perf.mjs --budget","pkg:assets":"node scripts/sync-pkg-assets.mjs","pub:prompt":"npm run build:prompt && npm publish --workspace=@af-mobile/prompt","pub:tokens":"node scripts/build-tokens-pkg.mjs && npm publish --workspace=@af-mobile/tokens","size:check":"node scripts/size-check.mjs","test:watch":"vitest","entry:check":"node scripts/gen-entry.mjs --check","skill:check":"node scripts/check-skill-exports.mjs","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","fewshots:gen":"node scripts/gen-component-fewshots.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/gen-component-fewshots.mjs --check && node scripts/check-prompt-sync.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:contrast":"node scripts/check-contrast.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","registry:check":"node scripts/check-registry.mjs","scaffold:check":"node scripts/check-scaffold.mjs","changeset:check":"changeset status --since=main","whitelist:check":"node scripts/check-whitelist-sync.mjs","version-packages":"changeset version && node scripts/gen-whitelist.mjs"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"repository":{"url":"git+https://github.com/soulor8908/af-mobile.git","type":"git"},"workspaces":[".","eslint-plugin-af-mobile","create-af-mobile","mcp","prompt","adapters","tokens"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css","src/chat/i18n.js","src/test-setup.js"],"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","vitepress":"^1.6.4","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@changesets/cli":"^3.0.1","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.9.0_1788130740335_0.9372384673872587","host":"s3://npm-registry-packages-npm-production"}},"1.9.1":{"name":"@af-mobile/ui","version":"1.9.1","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.9.1","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"homepage":"https://github.com/soulor8908/af-mobile#readme","bugs":{"url":"https://github.com/soulor8908/af-mobile/issues"},"bin":{"af-mobile":"scripts/af-mobile.mjs"},"dist":{"shasum":"1abddca917c88f33042c0a809242131d8b3ec7e4","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.9.1.tgz","fileCount":115,"integrity":"sha512-jFMuGkXAP4YoFPNUC92oxFWh5avYA4E/imu8yXabQYxmupIjCZePPb4Umt3Oq4v8r2rVC1RY7n7ukQMo5C7Fow==","signatures":[{"sig":"MEYCIQD1B6Weqpaa78Kq20HYTt9Jyv347EIrA/781wFrWTBGmgIhAOxLLZdb/wp4QAxILBHVxVQp1CGd8geL96wDELKj7J4d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@af-mobile%2fui@1.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":888538},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","module":"./src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js"},"./k":{"types":"./src/k/index.d.ts","import":"./src/k/index.js","default":"./src/k/index.js"},"./css":"./src/index.css","./chat":{"types":"./src/chat/index.d.ts","import":"./src/chat/index.js","default":"./src/chat/index.js"},"./dist":"./dist/index.js","./test":"./src/test-setup.js","./lib/*":"./src/lib/*","./blocks":{"types":"./src/blocks/index.d.ts","import":"./src/blocks/index.js","default":"./src/blocks/index.js"},"./charts":{"types":"./src/charts/index.d.ts","import":"./src/charts/index.js","default":"./src/charts/index.js"},"./blocks/*":"./src/blocks/*","./dist/css":"./dist/index.css","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./dist/blocks":"./dist/blocks.js","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./af-mobile.css":"./src/index.css","./dist/components.css":"./dist/components.css"},"gitHead":"d7665c1c49387edb7c85061d6b490e39c5d5fbb6","scripts":{"ci":"node scripts/check-contrast.mjs && vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"node scripts/check-contrast.mjs && vitest run","build":"node scripts/build.mjs","entry":"node scripts/gen-entry.mjs","ai-fix":"node scripts/ai-fix.mjs","create":"node scripts/create-app.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","pub:mcp":"npm run build:mcp && npm publish --workspace=@af-mobile/mcp","release":"changeset publish","docs:dev":"vitepress dev site","docs:gen":"node scripts/gen-docs.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","build:mcp":"node scripts/build-mcp.mjs","changeset":"changeset","skill:add":"node scripts/skill-add.mjs","whitelist":"node scripts/gen-whitelist.mjs","aria:check":"node scripts/check-aria-sync.mjs","demo:build":"vite build","demo:check":"node scripts/check-demo.mjs","docs:build":"vitepress build site","i18n:check":"node scripts/check-i18n.mjs","perf:check":"node scripts/perf.mjs --budget","pkg:assets":"node scripts/sync-pkg-assets.mjs","pub:prompt":"npm run build:prompt && npm publish --workspace=@af-mobile/prompt","pub:tokens":"node scripts/build-tokens-pkg.mjs && npm publish --workspace=@af-mobile/tokens","size:check":"node scripts/size-check.mjs","test:watch":"vitest","entry:check":"node scripts/gen-entry.mjs --check","skill:check":"node scripts/check-skill-exports.mjs","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","fewshots:gen":"node scripts/gen-component-fewshots.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/gen-component-fewshots.mjs --check && node scripts/check-prompt-sync.mjs","register:e2e":"node scripts/check-register-e2e.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:contrast":"node scripts/check-contrast.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","registry:check":"node scripts/check-registry.mjs","scaffold:check":"node scripts/check-scaffold.mjs","changeset:check":"changeset status --since=main","whitelist:check":"node scripts/check-whitelist-sync.mjs","version-packages":"changeset version && node scripts/gen-whitelist.mjs"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"repository":{"url":"git+https://github.com/soulor8908/af-mobile.git","type":"git"},"workspaces":[".","eslint-plugin-af-mobile","create-af-mobile","mcp","prompt","adapters","tokens"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css","src/chat/i18n.js","src/test-setup.js"],"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","vitepress":"^1.6.4","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@changesets/cli":"^3.0.1","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.9.1_1788181732762_0.7072544011019226","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"@af-mobile/ui","version":"1.10.0","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","_id":"@af-mobile/ui@1.10.0","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"homepage":"https://github.com/soulor8908/af-mobile#readme","bugs":{"url":"https://github.com/soulor8908/af-mobile/issues"},"bin":{"af-mobile":"scripts/af-mobile.mjs"},"dist":{"shasum":"56aedc5ee6b1ed7cabda8058d7723421c479a033","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.10.0.tgz","fileCount":119,"integrity":"sha512-ev1IR8jFpefW/zdJkP1tY6aAe45g6gmgco743RW+ONguntByzPLNKiX7v6WgBpl0IJDCnNifxZKnTU1uRVf6Vg==","signatures":[{"sig":"MEYCIQDYmk9DpY03bULEPH8157x7/Dz+W0W4itnSEqJBzA+vcgIhAIpXMLEn+r2gRULQLWfMFzYuj5nSsrqgY0uDGDhrzsN/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@af-mobile%2fui@1.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":986768},"main":"./src/index.js","type":"module","types":"./src/index.d.ts","module":"./src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js"},"./k":{"types":"./src/k/index.d.ts","import":"./src/k/index.js","default":"./src/k/index.js"},"./css":"./src/index.css","./chat":{"types":"./src/chat/index.d.ts","import":"./src/chat/index.js","default":"./src/chat/index.js"},"./dist":"./dist/index.js","./test":"./src/test-setup.js","./vite":"./src/vite.js","./lib/*":"./src/lib/*","./blocks":{"types":"./src/blocks/index.d.ts","import":"./src/blocks/index.js","default":"./src/blocks/index.js"},"./charts":{"types":"./src/charts/index.d.ts","import":"./src/charts/index.js","default":"./src/charts/index.js"},"./blocks/*":"./src/blocks/*","./dist/css":"./dist/index.css","./atomic.css":"./src/atomic.css","./tokens.css":"./src/tokens.css","./dist/blocks":"./dist/blocks.js","./recipes.css":"./src/recipes.css","./tokens.json":"./src/tokens.json","./components/*":"./src/components/*","./af-mobile.css":"./src/index.css","./dist/components.css":"./dist/components.css"},"gitHead":"96cbaec2ff4d5bf63839dfbef6e6f63d517b2b41","scripts":{"ci":"node scripts/check-contrast.mjs && vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","mcp":"node mcp/index.mjs","demo":"vite","eval":"node eval/run.mjs","perf":"node scripts/perf.mjs","size":"node scripts/size-check.mjs","test":"node scripts/check-contrast.mjs && vitest run","build":"node scripts/build.mjs","entry":"node scripts/gen-entry.mjs","ai-fix":"node scripts/ai-fix.mjs","create":"node scripts/create-app.mjs","prompt":"bash scripts/build-prompt.sh","tokens":"node scripts/gen-tokens.mjs","pub:mcp":"npm run build:mcp && npm publish --workspace=@af-mobile/mcp","release":"changeset publish","docs:dev":"vitepress dev site","docs:gen":"node scripts/gen-docs.mjs","eval:dry":"node eval/run.mjs --dry-run","generate":"node scripts/generate.mjs","test:e2e":"playwright test","build:mcp":"node scripts/build-mcp.mjs","changeset":"changeset","skill:add":"node scripts/skill-add.mjs","whitelist":"node scripts/gen-whitelist.mjs","aria:check":"node scripts/check-aria-sync.mjs","demo:build":"vite build","demo:check":"node scripts/check-demo.mjs","docs:build":"vitepress build site","i18n:check":"node scripts/check-i18n.mjs","perf:check":"node scripts/perf.mjs --budget","pkg:assets":"node scripts/sync-pkg-assets.mjs","pub:prompt":"npm run build:prompt && npm publish --workspace=@af-mobile/prompt","pub:tokens":"node scripts/build-tokens-pkg.mjs && npm publish --workspace=@af-mobile/tokens","size:check":"node scripts/size-check.mjs","test:watch":"vitest","entry:check":"node scripts/gen-entry.mjs --check","skill:check":"node scripts/check-skill-exports.mjs","test:e2e:ui":"playwright test --ui","types:check":"node scripts/check-types-sync.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","fewshots:gen":"node scripts/gen-component-fewshots.mjs","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","prompt:check":"node scripts/gen-component-fewshots.mjs --check && node scripts/check-prompt-sync.mjs","register:e2e":"node scripts/check-register-e2e.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","eval:flywheel":"node eval/flywheel.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","publish:check":"node scripts/publish-check.mjs","test:contrast":"node scripts/check-contrast.mjs","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm run publish:check","registry:check":"node scripts/check-registry.mjs","scaffold:check":"node scripts/check-scaffold.mjs","changeset:check":"changeset status --since=main","whitelist:check":"node scripts/check-whitelist-sync.mjs","version-packages":"changeset version && node scripts/gen-whitelist.mjs"},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"repository":{"url":"git+https://github.com/soulor8908/af-mobile.git","type":"git"},"workspaces":[".","eslint-plugin-af-mobile","create-af-mobile","mcp","prompt","adapters","tokens"],"_npmVersion":"11.9.0","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","directories":{},"sideEffects":["**/*.css","src/chat/i18n.js","src/test-setup.js"],"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","jsdom":"^24.0.0","eslint":"^10.8.1","vitest":"^1.6.0","esbuild":"^0.28.2","postcss":"^8.5.26","vitepress":"^1.6.4","lighthouse":"^12.2.1","web-vitals":"^4.2.4","@changesets/cli":"^3.0.1","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","@modelcontextprotocol/sdk":"^1.30.0"},"_npmOperationalInternal":{"tmp":"tmp/ui_1.10.0_1788757016547_0.671002021488259","host":"s3://npm-registry-packages-npm-production"}},"1.10.1":{"name":"@af-mobile/ui","version":"1.10.1","description":"Mobile-first Web Components library with L1/L2/L3 layered design system","workspaces":[".","eslint-plugin-af-mobile","create-af-mobile","mcp","prompt","adapters","tokens"],"type":"module","main":"./src/index.js","module":"./src/index.js","types":"./src/index.d.ts","exports":{".":{"import":"./src/index.js","types":"./src/index.d.ts","default":"./src/index.js"},"./k":{"import":"./src/k/index.js","types":"./src/k/index.d.ts","default":"./src/k/index.js"},"./charts":{"import":"./src/charts/index.js","types":"./src/charts/index.d.ts","default":"./src/charts/index.js"},"./chat":{"import":"./src/chat/index.js","types":"./src/chat/index.d.ts","default":"./src/chat/index.js"},"./blocks":{"import":"./src/blocks/index.js","types":"./src/blocks/index.d.ts","default":"./src/blocks/index.js"},"./blocks/*":"./src/blocks/*","./test":"./src/test-setup.js","./vite":"./src/vite.js","./css":"./src/index.css","./af-mobile.css":"./src/index.css","./tokens.css":"./src/tokens.css","./tokens.json":"./src/tokens.json","./recipes.css":"./src/recipes.css","./atomic.css":"./src/atomic.css","./components/*":"./src/components/*","./lib/*":"./src/lib/*","./dist":"./dist/index.js","./dist/css":"./dist/index.css","./dist/components.css":"./dist/components.css","./dist/blocks":"./dist/blocks.js"},"bin":{"af-mobile":"scripts/af-mobile.mjs"},"sideEffects":["**/*.css","src/chat/i18n.js","src/test-setup.js"],"scripts":{"test":"node scripts/check-contrast.mjs && vitest run","test:contrast":"node scripts/check-contrast.mjs","test:watch":"vitest","test:coverage":"vitest run --coverage","test:e2e":"playwright test","test:e2e:ui":"playwright test --ui","perf":"node scripts/perf.mjs","perf:check":"node scripts/perf.mjs --budget","size":"node scripts/size-check.mjs","size:check":"node scripts/size-check.mjs","whitelist":"node scripts/gen-whitelist.mjs","whitelist:check":"node scripts/check-whitelist-sync.mjs","aria:check":"node scripts/check-aria-sync.mjs","i18n:check":"node scripts/check-i18n.mjs","tokens":"node scripts/gen-tokens.mjs","tokens:check":"node scripts/check-tokens-sync.mjs","fewshots:gen":"node scripts/gen-component-fewshots.mjs","prompt:check":"node scripts/gen-component-fewshots.mjs --check && node scripts/check-prompt-sync.mjs","demo:check":"node scripts/check-demo.mjs","scaffold:check":"node scripts/check-scaffold.mjs","skill:check":"node scripts/check-skill-exports.mjs","types:check":"node scripts/check-types-sync.mjs","entry":"node scripts/gen-entry.mjs","entry:check":"node scripts/gen-entry.mjs --check","prompt":"bash scripts/build-prompt.sh","prompt:build":"node scripts/build-prompt.mjs -o prompt/system-prompt.md","ai-fix":"node scripts/ai-fix.mjs","lint:flywheel":"node scripts/lint-flywheel.mjs","generate":"node scripts/generate.mjs","skill:add":"node scripts/skill-add.mjs","create":"node scripts/create-app.mjs","pkg:assets":"node scripts/sync-pkg-assets.mjs","build:mcp":"node scripts/build-mcp.mjs","build:prompt":"node scripts/build-prompt-pkg.mjs","pub:mcp":"npm run build:mcp && npm publish --workspace=@af-mobile/mcp","pub:prompt":"npm run build:prompt && npm publish --workspace=@af-mobile/prompt","pub:tokens":"node scripts/build-tokens-pkg.mjs && npm publish --workspace=@af-mobile/tokens","mcp":"node mcp/index.mjs","eval":"node eval/run.mjs","eval:dry":"node eval/run.mjs --dry-run","eval:flywheel":"node eval/flywheel.mjs","publish:check":"node scripts/publish-check.mjs","registry:check":"node scripts/check-registry.mjs","changeset":"changeset","changeset:check":"changeset status --since=main","version-packages":"changeset version && node scripts/gen-whitelist.mjs","release":"changeset publish","build":"node scripts/build.mjs","prepublishOnly":"npm run build && npm run publish:check","ci":"node scripts/check-contrast.mjs && vitest run && node scripts/size-check.mjs && node scripts/check-whitelist-sync.mjs && node scripts/check-tokens-sync.mjs && node scripts/check-types-sync.mjs && node scripts/check-aria-sync.mjs","demo":"vite","demo:build":"vite build","docs:dev":"vitepress dev site","docs:build":"vitepress build site","docs:gen":"node scripts/gen-docs.mjs","register:e2e":"node scripts/check-register-e2e.mjs"},"keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/soulor8908/af-mobile.git"},"devDependencies":{"@changesets/cli":"^3.0.1","@modelcontextprotocol/sdk":"^1.30.0","@playwright/test":"^1.62.1","@vitest/coverage-v8":"^1.6.0","esbuild":"^0.28.2","eslint":"^10.8.1","jsdom":"^24.0.0","lighthouse":"^12.2.1","postcss":"^8.5.26","vite":"^5.4.0","vitepress":"^1.6.4","vitest":"^1.6.0","web-vitals":"^4.2.4"},"gitHead":"88843d9b95122408ad794c6e0a61c84e89c469da","_id":"@af-mobile/ui@1.10.1","bugs":{"url":"https://github.com/soulor8908/af-mobile/issues"},"homepage":"https://github.com/soulor8908/af-mobile#readme","_nodeVersion":"24.20.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-H/BS5V3usag4ZuH8memXdzgKzf5AYsvxhIY6hp/mNZ3IayWINNVfenzlE9MlG6L/4Rk20QYy/1t2LCsDC92qZA==","shasum":"9f77309819d8be5c0720ea080cd474072749cf3a","tarball":"https://registry.npmjs.org/@af-mobile/ui/-/ui-1.10.1.tgz","fileCount":119,"unpackedSize":986773,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@af-mobile%2fui@1.10.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCKZtwRTbU1nNAfSkVeVjlUqCBT9T4J+++HTpfosotZPAIhAKPVvfoG8mt8BsecXwcWwJJG/6XMkf0swEc9wM+9Rgxc"}]},"_npmUser":{"name":"soulor8908","email":"871816706@qq.com"},"directories":{},"maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ui_1.10.1_1788758907867_0.09917019937489391"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-14T09:43:56.898Z","modified":"2026-09-07T05:28:28.376Z","1.3.1":"2026-08-14T09:43:57.226Z","1.3.2":"2026-08-14T11:16:36.751Z","1.4.0":"2026-08-17T00:27:38.013Z","1.4.1":"2026-08-17T03:44:57.300Z","1.4.2":"2026-08-17T10:58:32.898Z","1.4.3":"2026-08-18T12:28:51.556Z","1.5.2":"2026-08-19T12:32:00.209Z","1.7.0":"2026-08-28T12:20:02.953Z","1.8.0":"2026-08-29T11:32:24.793Z","1.9.0":"2026-08-30T22:59:00.486Z","1.9.1":"2026-08-31T13:08:52.926Z","1.10.0":"2026-09-07T04:56:56.753Z","1.10.1":"2026-09-07T05:28:28.032Z"},"bugs":{"url":"https://github.com/soulor8908/af-mobile/issues"},"license":"MIT","homepage":"https://github.com/soulor8908/af-mobile#readme","keywords":["web-components","custom-elements","shadow-dom","mobile","ui-library","design-system","tree-shaking"],"repository":{"type":"git","url":"git+https://github.com/soulor8908/af-mobile.git"},"description":"Mobile-first Web Components library with L1/L2/L3 layered design system","maintainers":[{"name":"soulor8908","email":"871816706@qq.com"}],"readme":"# @af-mobile/ui\n\nMobile-first Web Components library with **L1/L2/L3/L4 四层分层设计体系**。\n\n- **L1 Token**：96 个 CSS 变量（颜色/间距/字号/圆角/阴影/动效，含 8 档灰阶，关键组合 WCAG AA 对比度由 CI 断言）\n- **L2 配方 + 原子**：262 个白名单封闭集 class（172 配方 + 90 原子，`btn`/`card`/`p-4`/...）\n- **L3 真组件**：36 个原生 Custom Elements（30 通用组件 + 5 图表组件 + 1 会话组件，`af-list`/`af-dialog`/`...`），ESM 命名导出 + Tree Shaking\n- **L4 AI 约束层**：System Prompt 引导 + ESLint 24 条规则兜底 + CI 保护\n\n## 在线 Demo\n\n30 个核心/交互组件 + 5 个图表组件的可交互 demo，每个组件一页，含属性配置、事件演示与源码对照，覆盖核心组件、交互组件、图表组件与联动场景：\n\n👉 **<https://soulor8908.github.io/af-mobile/demo/index.html>**\n\n本地跑 demo：`npm run demo`（详见 [本地开发](#本地开发)）。\n\n## 快速开始（AI 对话式脚手架）\n\n> 面向小白：**一条命令生成可运行工程，然后用对话完成开发**，无需手工配置路由/打包器/ESLint。\n\n```bash\nnpm create af-mobile@latest my-app\ncd my-app && npm install && npm run dev\n```\n\n> `npm create af-mobile` 等价于 `npx create-af-mobile`（npm init 约定，vite/astro 同款）：按需下载并执行脚手架，无需先手动 `npm install`；第二步的 `npm install` 才是把库装进生成的工程。切勿写裸 `npx af-mobile`——npm 上存在同名第三方包，会装错。\n\n生成工程自带 `af-mobile-grill` skill（对话式脚手架）与消费端 ESLint 约束。打开任一 AI 编码工具（TRAE / Claude Code / Cursor 等），说一句\"我想做一个习惯打卡应用\"，skill 会引导你：**拷问需求 → 需求拆分 → demo 确认 → 一次性生成页面**。\n\n### CLI 用法\n\n```bash\nnpm create af-mobile@latest <目录名>    # 生成新工程（脚手架 + skill 自举）\nnpx create-af-mobile skill add [目录]   # 已建项目补装 / 升级 skill（幂等，默认当前目录）\n```\n\n### af-mobile-grill skill 装到哪里\n\nskill 是单文件 `SKILL.md`，随 `@af-mobile/ui` npm 包分发。`npm create af-mobile` / `npx create-af-mobile skill add` 把它写到**中立路径** `skills/af-mobile-grill/SKILL.md`，并在 `AGENTS.md` 追加指引段（marker 守卫，幂等）。\n\n不写 `.trae/skills/` / `.claude/skills/` 等工具特定目录——任何读 `AGENTS.md` 的 AI 工具（TRAE / Claude Code / Cursor / Codex / Copilot / Windsurf 等）都能通过 `AGENTS.md` 找到 skill，避免假设用户用某工具而污染项目。\n\n### 升级\n\n```bash\nnpm update @af-mobile/ui && npx create-af-mobile skill add   # 库升级 + skill 同步\n```\n\n> 工程依赖 npm 包版本（非内嵌源码），升级只换库版本，业务代码不动。\n\n## 安装（作为库依赖）\n\n```bash\nnpm install @af-mobile/ui\n```\n\n> **消费端需有打包器 + 组件一律按需引入（铁律）**：`package.json` 的 `main`/`module` 指向 `src/index.js`（源码分发，裸 ESM + CSS import）。直接用 Vite/webpack/Rollup 等打包器处理 `import { AfList, AfDialog } from '@af-mobile/ui'` 并 `customElements.define`（或 `register('af-list', 'af-dialog')`），**只引入页面用到的组件**。**禁止 UMD 直引**（`dist/af-mobile.umd.js`）、**禁止 `registerAll()`**（全量注册 = 全局引入）、**禁止全局对象**——所有项目与 demo 一律按需引入。\n\n## 快速上手\n\n```html\n<!doctype html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <link rel=\"stylesheet\" href=\"/node_modules/@af-mobile/ui/src/index.css\">\n</head>\n<body>\n  <main class=\"page\">\n    <header class=\"navbar navbar-fixed\">\n      <h1 class=\"title\">商品列表</h1>\n    </header>\n\n    <af-list id=\"list\"></af-list>\n\n    <af-dialog id=\"dialog\">\n      <div slot=\"body\">确认删除？</div>\n      <div slot=\"footer\">\n        <button class=\"btn btn-ghost btn-block\">取消</button>\n        <button class=\"btn btn-danger btn-block\">删除</button>\n      </div>\n    </af-dialog>\n  </main>\n\n  <script type=\"module\">\n    import { AfList, AfDialog, register } from '@af-mobile/ui';\n    register('af-list');\n    register('af-dialog');\n\n    const list = document.getElementById('list');\n    list.data = Array.from({ length: 100 }, (_, i) => ({\n      title: `商品 ${i + 1}`,\n      subtitle: `¥${(i + 1) * 9.9}`,\n    }));\n    list.addEventListener('af-list:itemclick', (e) => {\n      console.log('click', e.detail.index);\n    });\n\n    // 分页加载示例：必须设 total-count，否则永不显示「没有更多了」\n    list.totalCount = 256;          // 数据总条数（分页终止判断）\n    list.addEventListener('af-list:loadmore', async (e) => {\n      const page = e.detail.page;  // 从 1 开始，每次自动 +1\n      const more = await fetch(`/api/goods?page=${page}`).then(r => r.json());\n      list.data = [...list.data, ...more.items];\n      // 请求完成后必须调用，传入 hasMore 控制是否继续触发下一次\n      list.endLoadMore(list.data.length < list.totalCount);\n    });\n  </script>\n</body>\n</html>\n```\n\n## 组件 API 速查\n\n| 组件 | 标签 | 关键属性 | 关键事件 | 方法 / slot |\n|---|---|---|---|---|\n| 长列表（虚拟滚动） | `<af-list>` | `data` `item-height` `total-count` `page-size` `refresh` | `af-list:loadmore` `af-list:itemclick` `af-list:refresh` | `endLoadMore()` `endRefresh()` |\n| 轮播/滑动 | `<af-swiper>` | `autoplay` `loop` `active-index` | `af-swiper:change` | `goTo()` `next()` `prev()` |\n| 标签页 | `<af-tabs>` | `tabs` `active-index` | `af-tabs:change` | `setActive()`；slot `panel-{i}` |\n| 模态对话框 | `<af-dialog>` | `title` `close-on-esc` `close-on-backdrop` | `af-dialog:open` `af-dialog:close` | `open()` `close()` |\n| 轻提示 | `<af-toast>` | `duration` | `af-toast:dismiss` | `show(message, options)` `dismiss()` |\n| 底部操作面板 | `<af-action-sheet>` | `options` `title` `show-cancel` | `af-action-sheet:select` `af-action-sheet:close` | `showPopover()` `hidePopover()` |\n| 滚轮选择器 | `<af-picker>` | `columns` `values` `title` | `af-picker:change` `af-picker:confirm` | `open()` `close()` `setColumn()` |\n| 下拉菜单 | `<af-dropdown>` | `options` `value` `placeholder` | `af-dropdown:select` | `open()` `close()` |\n| 懒加载图片 | `<af-img>` | `src` `alt` `placeholder-src` `fail-src` | `af-img:load` `af-img:error` | — |\n| 回到顶部 | `<af-backtop>` | `threshold` `target` `position` | `af-backtop:click` | `scrollToTop()` |\n| 开关 | `<af-switch>` | `checked` `loading` `disabled` `size` | `af-switch:change` | `toggle()` |\n| 搜索栏 | `<af-search-bar>` | `value` `placeholder` `clearable` `debounce` | `af-search-bar:input` `af-search-bar:search` `af-search-bar:clear` | `focus()` |\n| 骨架屏页面 | `<af-skeleton-page>` | `variant` | — | — |\n| 文件上传 | `<af-upload>` | `accept` `multiple` `max-size` `max-count` `button-text` | `af-upload:change` `af-upload:error` | `clear()` |\n| 顶部导航栏 | `<af-navbar>` | `title` `show-back` `back-text` | `af-navbar:back` | — |\n| 底部标签栏 | `<af-tabbar>` | `tabs` `active-index` `fixed` | `af-tabbar:change` | `setActive()` |\n| 步进器 | `<af-stepper>` | `value` `min` `max` `step` `disabled` | `af-stepper:change` | `setValue()` |\n| 表单字段 | `<af-field>` | `label` `icon` `type` `input-type` `value` `placeholder` `help` `error` `disabled` `readonly` | `af-field:input` `af-field:change` | `setError()` `focus()`；slot `input`（透传自定义控件） |\n| 数字键盘 | `<af-number-keyboard>` | `value` `maxlength` `random` `title` | `af-number-keyboard:input` `af-number-keyboard:delete` `af-number-keyboard:complete` `af-number-keyboard:close` | `open()` `close()` |\n| 密码/验证码输入 | `<af-password-input>` | `value` `length` `mask` `focused` | `af-password-input:complete` | 配对 `af-number-keyboard` 驱动输入 |\n| 下拉刷新 | `<af-pull-refresh>` | `refreshing` | `af-pull-refresh:refresh` | `endRefresh()` |\n| 滑动单元格 | `<af-swipe-cell>` | `disabled` | `af-swipe-cell:action` | `open()` `close()`；slot `content` / `right` |\n| 级联选择器 | `<af-cascade-picker>` | `tree` `values` `title` | `af-cascade-picker:change` `af-cascade-picker:confirm` | — |\n| 徽章 | `<af-badge>` | `value` `max` `dot` `type` | — | — |\n| 日历 | `<af-calendar>` | `value` `min` `max` `first-day-of-week` | `af-calendar:change` `af-calendar:select` | — |\n| 评分 | `<af-rate>` | `value` `max` `allow-half` `readonly` `disabled` | `af-rate:change` | — |\n| 公告栏 | `<af-notice-bar>` | `text` `mode` `scrollable` | `af-notice-bar:close` | — |\n| 进度条 | `<af-progress>` | `value` `max` `show-text` `variant` | — | — |\n| 步骤条 | `<af-steps>` | `steps` `active-index` `direction` | — | — |\n| 倒计时 | `<af-countdown>` | `target` `format` `auto-start` | `af-countdown:change` `af-countdown:finish` | `start()` `pause()` `reset()` |\n\n事件名遵循 `af-{组件}:{动作}` 格式，`event.detail` 携带结构化数据。\n完整 API（属性默认值 / 方法签名 / 事件）以 `src/index.d.ts` 为准，文档站页面由 `npm run docs:gen` 从该文件自动生成，本表仅列高频项。\n\n## 图表子库（@af-mobile/ui/charts）\n\n> 独立入口，**不进主包**——不 `import './charts'` 就零字节加载，主库体积预算不受影响。SVG 原生渲染 + 2022+ 移动端基线，全量 ~15KB gzip 覆盖移动端 ~95% 高频图表场景。\n\n```js\nimport { registerChart } from '@af-mobile/ui/charts';\nregisterChart('af-chart-line');   // 或 registerCharts() 全量 5 个\n```\n\n```html\n<af-chart-line data='[{\"label\":\"1月\",\"value\":120},{\"label\":\"2月\",\"value\":150}]'\n               variant=\"area\" smooth legend></af-chart-line>\n\n<af-chart-pie data='[{\"label\":\"线上\",\"value\":62},{\"label\":\"线下\",\"value\":38}]'\n              variant=\"donut\" center-text=\"{total}\"></af-chart-pie>\n```\n\n| 组件 | 标签 | variant 覆盖 | 关键属性 | 关键事件 |\n|---|---|---|---|---|\n| 折线/面积/散点/迷你趋势 | `<af-chart-line>` | `line`/`area`/`scatter`/`spark` | `data` `labels` `series` `variant` `smooth` `show-axis` | `af-chart-line:select` |\n| 柱状/条形/堆叠/分组 | `<af-chart-bar>` | `column`/`bar`/`stacked`/`grouped` | `data` `labels` `series` `variant` `max-count` | `af-chart-bar:select` |\n| 饼/环形/半环/玫瑰 | `<af-chart-pie>` | `pie`/`donut`/`half`/`rose` | `data` `variant` `inner-radius` `center-text` | `af-chart-pie:select` |\n| 雷达 | `<af-chart-radar>` | — | `data` `series` `shape` | `af-chart-radar:select` |\n| 漏斗 | `<af-chart-funnel>` | — | `data` `show-rate` | `af-chart-funnel:select` |\n\n- **数据契约**：单序列 `data='[{\"label\":\"1月\",\"value\":120}]'`；多序列（line/bar）`labels` + `series='[{\"name\":\"今年\",\"values\":[...]}]'`；雷达 `data='[{\"label\":\"速度\",\"value\":80,\"max\":100}]'`\n- **五态**：`loading`（骨架）/ `error`（重试，派发 `af-chart-{x}:retry`）/ `data` 空自动空态\n- **主题**：取色读 `--c-brand/--c-success/--c-warn/--c-danger/--c-muted` token，深色模式免费跟随；数据项可带 `color` 覆盖\n- **无障碍**：`role=\"img\"` + 摘要 `aria-label` + 视觉隐藏数据表；动画响应 `prefers-reduced-motion`\n- **体积预算**（CI 阻断）：内核 `chartsRuntime` ≤ 4.5KB / 全量 `chartsTotal` ≤ 15KB / 单图表组件 ≤ 2.8KB gzip\n\n设计与分期详见 [docs/design/charts-sublibrary-detailed-design.md](docs/design/charts-sublibrary-detailed-design.md)。\n\n## AI 对话子库（@af-mobile/ui/chat）\n\n> 独立入口，**不进主包**——不 `import '@af-mobile/ui/chat'` 就零字节加载，主库体积预算不受影响。框架无关（无 DOM/CSS 依赖）的 OpenAI 兼容 SSE 会话核心：流式消息累积 + function calling 工具循环，可配任意 UI 层。\n\n```js\nimport { createSession, defineTool } from '@af-mobile/ui/chat';\n\nconst session = createSession({\n  endpoint: '/api/chat',            // OpenAI 兼容 /chat/completions\n  systemPrompt: '你是一名记账助手',\n  tools: [\n    defineTool({\n      name: 'get_balance',\n      description: '查询账户余额',\n      parameters: { type: 'object', properties: { id: { type: 'string' } } },\n      async execute(args) { return db.getBalance(args.id); },\n    }),\n  ],\n  onMessage: (msg) => console.log(msg), // 每产生一条消息回调（流式分片聚合后）\n});\n\nawait session.send('你好');\nconsole.log(session.messages);      // 会话历史（含工具调用/结果块）\n```\n\n| 导出 | 说明 |\n|---|---|\n| `createSession(opts)` | 会话：消息历史 + SSE 流式 + 工具调用循环（默认 ≤6 轮）+ `send`/`append`/`abort`/`subscribe` |\n| `createMessage(init?)` | 创建消息对象（`{ role, id, content: ContentBlock[] }`） |\n| `parseSSE(res)` | 解析 `Response` 为 OpenAI 标准 SSE 事件异步生成器 |\n| `defineTool(tool)` | 定义可注册工具（`name`/`description`/`parameters`/`execute`） |\n\n- **协议**：OpenAI 标准 SSE——`data: {\"choices\":[{\"delta\":{\"content\":\"你\"}}]}`；`delta.tool_calls` 按 index 聚合（name/arguments 可跨帧）\n- **传输**：默认 `fetch`，可传 `requestFn` 注入鉴权头 / 走代理 / 组装 URL；`systemPrompt` 支持函数（每轮动态取最新值）\n- **体积预算**（CI 阻断）：内核 `chatRuntime` ≤ 2.5KB gzip（独立预算，不计入主库 total）\n\n## k 渲染子库（@af-mobile/ui/k，演进中）\n\n声明式应用层：`html\\`\\`` 返回真实 DOM + signal 细粒度更新（10 词极简 API + Show/For/Switch 控制流）。\n\n```js\nimport { html, signal, render } from '@af-mobile/ui/k';\nconst n = signal(0);\nrender(html`<p @click=${() => n.set(v => v + 1)}>${() => n()}</p>`, '#app');\n```\n\n注意：k 的 `html\\`\\`` 与主包 `html\\`\\``（返回转义字符串）**同名不同义**，对比表与完整词表卡见 [src/k/README.md](./src/k/README.md)。定位与演进决策见 [docs/DECISIONS.md](./docs/DECISIONS.md)（D-001：推广为应用层）。\n\n## SSR / Hydration 使用指南\n\n@af-mobile/ui 是浏览器端 Custom Elements 库，`customElements` 在 Node 服务端不存在，直接 `import` 会抛错。本节给出 SSR 框架接入方式。\n\n### 核心问题\n\n| 问题 | 说明 |\n|---|---|\n| `customElements` 在服务端不存在 | Node 环境无 `customElements`，直接 `import` 会抛错 |\n| `connectedCallback` 不触发 | 服务端无 DOM，组件不 upgrade |\n| 属性 JSON 序列化 | `data`/`tabs` 等复杂属性需在 HTML 中预渲染 |\n\n### 1. 客户端条件注册\n\n仅在浏览器环境注册组件，避免服务端执行 `customElements.define`：\n\n```js\n// 仅在浏览器环境按需注册页面用到的组件（禁止 registerAll）\nif (typeof window !== 'undefined') {\n  const { AfList, AfDialog, register } = await import('@af-mobile/ui');\n  customElements.define('af-list', AfList);\n  register('af-dialog');\n}\n```\n\n### 2. SSR 预渲染 Light DOM（首屏占位）\n\nLight DOM 组件的结构（含 L2 class）可由服务端直接渲染到 HTML 作为**首屏占位**。客户端按需注册组件后 `connectedCallback` 触发，**会用组件内部模板重建 DOM 并接管交互**——这不是增量 hydration，SSR 子节点会被覆盖。因此 SSR 预渲染的价值是「避免白屏」，而非「复用服务端 DOM」。Shadow DOM 组件默认仅客户端挂载；实现了 `shadowHTML()` 的组件支持 **DSD（Declarative Shadow DOM）预渲染**——服务端调用 `el.dsdTemplate()` 输出 `<template shadowrootmode=\"open\">`，无 JS 时结构/样式即刻可见，客户端 upgrade 接管交互（见 §3 矩阵）。\n\n> ⚠️ **非增量 hydrate**：组件 `mounted()` 会用 `innerHTML` 重建内部结构（虚拟列表的 `.list` 外壳、tabbar 等）。SSR 输出的子节点仅作首屏占位，客户端 upgrade 后即被替换。若对首屏闪烁敏感，可在组件外加 `style=\"visibility:hidden\"` 占位，upgrade 后再显隐。\n\n```jsx\n// Next.js 示例：服务端预渲染首屏占位结构\nfunction ProductList({ items }) {\n  return (\n    <>\n      {/* 服务端预渲染首屏占位（upgrade 后会被组件内部模板替换） */}\n      <af-list data={JSON.stringify(items)} item-height={48}>\n        <div class=\"list\">\n          {items.map((item, i) => (\n            <div class=\"list-item\" key={i}>\n              <div class=\"body\">{item.title}</div>\n            </div>\n          ))}\n        </div>\n      </af-list>\n      {/* 客户端 lazy 加载组件库并按需注册（禁止 UMD 直引 / registerAll） */}\n      <Script strategy=\"lazyOnload\">\n        {`import('@af-mobile/ui').then(({ AfList, register }) => {\n          customElements.define('af-list', AfList);\n          register('af-dialog');\n        })`}\n      </Script>\n    </>\n  );\n}\n```\n\nNuxt / Remix 同理：服务端输出 Light DOM + L2 class 作首屏占位，客户端 hydration 阶段动态 `import('@af-mobile/ui')` 并按需注册，组件 `connectedCallback` 重建内部结构并接管交互。\n\n### 3. 组件 SSR 兼容性矩阵\n\n| 组件 | DOM | SSR 预渲染占位 | 客户端 upgrade | 注意 |\n|---|---|---|---|---|\n| af-list | Light | ✓ 渲染 .list 结构 | ✓ 重建外壳+接管虚拟滚动 | 需 data 属性；非增量 hydrate |\n| af-swiper | Shadow | ✓ DSD 预渲染结构 | ✓ 接管 touch | 需服务端调 dsdTemplate() |\n| af-tabs | Light | ✓ 渲染 tabbar + panels | ✓ 重建外壳+接管切换 | 非增量 hydrate |\n| af-dialog | Shadow | ✓ DSD 预渲染结构 | ✓ showModal | 需服务端调 dsdTemplate() |\n| af-toast | Light | ✗ 不预渲染（单例按需） | ✓ 单例 | 仅客户端 |\n| af-action-sheet | Light | ✗ 不预渲染（popover 按需） | ✓ popover | 仅客户端 |\n| af-picker | Shadow | ✓ DSD 预渲染结构 | ✓ 接管 | 需服务端调 dsdTemplate() |\n| af-dropdown | Light | ✗ 不预渲染（popover 按需） | ✓ popover | 仅客户端 |\n| af-img | Light | ✓ 渲染 img + 占位 | ✓ 重建外壳+懒加载 | 需 src 属性；非增量 hydrate |\n| af-backtop | Light | ✗ 不预渲染 | ✓ | 仅客户端 |\n| af-switch | Light | ✓ 渲染 switch 结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-search-bar | Light | ✓ 渲染搜索输入框 | ✓ 重建+接管 | 非增量 hydrate |\n| af-skeleton-page | Light | ✓ 渲染骨架屏 | ✓ 重建+接管 | 适合 SSR loading 态 |\n| af-navbar | Light | ✓ 渲染导航栏结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-tabbar | Light | ✓ 渲染标签栏结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-stepper | Light | ✓ 渲染步进器结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-field | Light | ✓ 渲染表单字段结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-upload | Light | ✓ 渲染上传触发器结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-pull-refresh | Light | ✓ 渲染刷新指示结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-swipe-cell | Light | ✓ 渲染滑动单元结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-badge | Light | ✓ 渲染徽章结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-rate | Light | ✓ 渲染评分结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-notice-bar | Light | ✓ 渲染公告栏结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-progress | Light | ✓ 渲染进度条结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-steps | Light | ✓ 渲染步骤条结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-countdown | Light | ✓ 渲染倒计时结构 | ✓ 重建+接管 | 非增量 hydrate |\n| af-cascade-picker | Shadow | ✓ DSD 预渲染结构 | ✓ 复用 AfPicker 内核 | 需服务端调 dsdTemplate() |\n| af-calendar | Shadow | ✗ Shadow 不预渲染 | ✓ 接管 | 仅客户端 |\n\n> 规则：**Light DOM + 有初始可见结构** 的组件支持 SSR 预渲染作首屏占位；**Shadow DOM 中实现 `shadowHTML()` 的组件支持 DSD 预渲染**（上表 ✓ DSD）；未实现 `shadowHTML()` 的 Shadow 与按需弹层类组件仅客户端渲染。所有仅经 `innerHTML` 重建的组件 upgrade 时均为「重建接管」而非「增量 hydrate」。\n\n## 框架集成（Vue 3 / React 原生直用）\n\n`@af-mobile/ui` 是标准 Web Components，框架无关，可直接在 Vue/React 中作为原生自定义元素使用，无需适配器包。\n\n### Vue 3\n\nVite 配置告知编译器哪些标签是自定义元素（避免当作原生元素解析），然后原生使用：\n\n```ts\n// vite.config.ts\nexport default {\n  plugins: [vue()],\n  template: { compilerOptions: { isCustomElement: (tag) => tag.startsWith('af-') } },\n};\n```\n\n```vue\n<script setup>\nimport { ref, onMounted } from 'vue';\nimport { register } from '@af-mobile/ui';\nregister('af-list');   // 按需注册（组件实现来自 @af-mobile/ui）\n\nconst items = ref([]);\nconst onLoadMore = (page) => { /* ... */ };\n</script>\n\n<template>\n  <af-list :data=\"items\" @itemclick=\"(e) => console.log(e.detail)\" @loadmore=\"onLoadMore\" />\n</template>\n```\n\n- 自定义事件 `af-list:itemclick` → Vue 用 `@itemclick`，payload 在 `e.detail`\n- 复杂属性（对象/数组）通过 property 传：`<af-list :data=\"items\">` 即可\n\n### React（19 完整支持自定义元素）\n\nReact 19（2024-12）已原生支持 Web Components：属性经 property 同步、无 `className→class` 手动映射问题，可直接使用。\n\n```jsx\nimport { register } from '@af-mobile/ui';\nregister('af-list');   // 按需注册（组件实现来自 @af-mobile/ui）\n\nfunction App() {\n  return (\n    <af-list\n      data={items}\n      onLoadmore={(e) => console.log(e.detail.page)}\n      onItemclick={(e) => console.log(e.detail.index)}\n    />\n  );\n}\n```\n\n- 自定义事件 `af-list:itemclick` → React 用 `onItemclick`（`on` + 动作名首字母大写），payload 在 `e.detail`\n- props 通过 property 同步，支持对象/数组\n\n> 曾有的 `@af-mobile/vue` / `@af-mobile/react` 适配器包已移除：它们从未发布、无外部消费者，且 React 19 / Vue 3 已原生支持 Web Components，薄包装失去价值。\n\n## 注册方式（一律按需引入，铁律）\n\n```js\n// A. 按需注册（推荐，Tree Shaking 友好）\nimport { AfList, AfDialog } from '@af-mobile/ui';\ncustomElements.define('af-list', AfList);\ncustomElements.define('af-dialog', AfDialog);\n\n// B. 单个注册辅助函数\nimport { register } from '@af-mobile/ui';\nregister('af-list');\nregister('af-dialog');\n```\n\n**禁止** `registerAll()`（全量注册 = 全局引入）、**禁止** UMD 直引（`dist/af-mobile.umd.js`）、**禁止** 全局对象（`window.AfMobile`）。所有项目与 demo 的组件必须按需引入。\n\n## 路由与部署\n\n路由器默认使用 **History 模式**（URL 形如 `/goods/123`，SEO 友好）。History 模式下用户刷新或直接访问子路径时，请求会先到达服务器——静态托管需要把所有路径 rewrite 回 `index.html`，否则刷新即 404。\n\n不想配服务器？用 **hash 模式**（URL 形如 `/#/goods/123`），任意静态托管零配置直跑：\n\n```js\nimport { route, start } from '@af-mobile/ui';\nroute('/', homeHandler);\nstart('#app', { hash: true });\n```\n\n| | History 模式（默认） | hash 模式 |\n|---|---|---|\n| URL 形态 | `/goods/123` | `/#/goods/123` |\n| 服务端配置 | 需要 fallback（见下） | **零配置** |\n| SEO | 好 | 差（`#` 后段不进索引） |\n| 页内锚点 | 可用（`#top`） | 不可用（`#` 段被路由占用） |\n\n### History 模式部署配置速查\n\n```nginx\n# nginx\nlocation / {\n  try_files $uri $uri/ /index.html;\n}\n```\n\n```json\n// Vercel — vercel.json\n{ \"rewrites\": [{ \"source\": \"/(.*)\", \"destination\": \"/index.html\" }] }\n```\n\n```\n# Netlify — _redirects（放 public/ 根目录）\n/*  /index.html  200\n```\n\n```js\n// Express / Node\napp.use(express.static('public'));\napp.get('*', (req, res) => res.sendFile(path.resolve('public/index.html')));\n```\n\n```caddy\n# Caddy\ntry_files {path} /index.html\n```\n\n```\n# Cloudflare Pages / Netlify — public/_redirects 文件（放产物根目录）\n/*  /index.html  200\n```\n\nCloudflare Pages 注意：构建产物根目录**不要放 `404.html`**，否则会关闭 SPA 自动兜底，子路由刷新变真 404。\n\n注意事项：\n\n- **静态资源不能被吞**：以上配置均先尝试真实文件（`try_files $uri` / Express `express.static` 前置），确保 `/assets/*.js`、CSS 返回文件本体而非 HTML，否则页面白屏且控制台报「MIME type 不匹配」。\n- **无需 fallback 的场景**：纯 MPA（页面间用原生 `<a>` 跳转）、hash 模式、登录后才用的内嵌 WebView 应用（用 hash 模式最省事）。\n\n## 主题切换\n\n提供 `initTheme` / `setTheme` / `toggleTheme` / `getTheme` 四个 API，通过 `data-theme` 属性控制 light/dark。\n\n```js\nimport { initTheme, toggleTheme } from '@af-mobile/ui';\ninitTheme();              // 从 localStorage 恢复（入口尽早调用）\ntoggleTheme();            // 切换并持久化\n```\n\n### 消除暗色模式 FOUC（首屏闪烁）\n\n`initTheme()` 在入口 JS 执行时才设 `data-theme`，系统暗色 + 用户存 light 时会先闪一下暗色再切回。**在 `<head>` 内联一段同步脚本，先于 paint 读取 localStorage 设 `data-theme`**：\n\n```html\n<head>\n  <script>\n    // 先于首次 paint 设定主题，避免 FOUC（无需等组件库加载）\n    try {\n      var t = localStorage.getItem('theme');\n      if (t === 'light' || t === 'dark') document.documentElement.dataset.theme = t;\n    } catch (e) {}\n  </script>\n</head>\n```\n\n> 该脚本不依赖 @af-mobile/ui，可独立内联；组件库的 `initTheme()` 仍可调用（幂等，重复设同值无副作用）。\n\n## L4 禁令（ESLint error 级，共 24 条规则）\n\n写 AI 生成代码时务必遵守：\n\n1. `tokens.css` 以外不可重定义 `--c-*/--s-*/--r-*/--t-*/--lh-*/--fw-*/--shadow-*/--z-*/--ease-*/--dur-*`\n2. `style=\"\"` 不可设置 `color/background*/padding*/margin*/font-size/border-radius/box-shadow`\n3. 不可使用 262 个白名单之外的 class 名或自定义组件标签\n4. `.btn`（非 ghost）不可叠加 `text-brand/text-danger/text-success`\n5. `.input` 不可叠加 `t-sm/t-xs`（iOS 聚焦 < 16px 自动放大页面）\n6. `.cell/.list-item` 不可叠加 `f/fc` 原子\n7. 不可用 Tailwind 任意值语法：`p-[13px]/bg-[#abc]/p-7`\n8. 不可互斥变体叠加：`btn-sm+btn-lg`、`tag-ok+tag-warn`、同属性原子重复\n9. `.list-item/.list-item-cp` 自带 border-top 由 `.list` 容器管理，不要单独设\n10. `.sheet` 显隐必须走原生 popover API `showPopover/hidePopover`\n11. `.tab-item` 选中态单一真相源是 `aria-selected=\"true\"`（视觉由属性选择器驱动，不可用 `active` class）\n12. **Light DOM 组件**（`af-list`/`af-tabs`/`af-toast`/`af-action-sheet`/`af-dropdown`/`af-backtop`/`af-img`/`af-switch`/`af-search-bar`/`af-skeleton-page`/`af-navbar`/`af-tabbar`/`af-stepper`/`af-field`/`af-upload`/`af-pull-refresh`/`af-swipe-cell`/`af-badge`/`af-rate`/`af-notice-bar`/`af-progress`/`af-steps`/`af-countdown`/`af-data` 共 24 个）不可含 `<style>` 或 `this.style.xxx=`\n13. **Shadow 组件** CSS 字符串不可硬编码颜色/间距/字号/圆角（`::backdrop` 遮罩 rgba(0,0,0,.5) 例外）\n14. 事件名必须 `af-{组件}:{动作}` 格式；`emit` 必须 `composed:true`\n15. `af-dialog/af-action-sheet` 必须有焦点陷阱（Tab 不逃出，关闭还原焦点）\n16. `af-tabs` 必须 `aria-selected/aria-controls/aria-labelledby`\n17. `.price` 不可叠加 `text-success/text-brand`（电商约定用 `--c-danger` 红色）\n18. `.empty` 与 `.center` 不可在同一语义场景混用\n19. `.hero` 不可用作内容区主体背景（仅用于页面顶部大留白标题区）\n20. `.actions` 内 `.btn` 与 `.btn-block` 不可同时出现\n21. `.tabbar-fixed/.cob/.input-bar` 必须含 `safe-area-inset-bottom`\n22. `af-swiper/af-tabs/af-picker` 方向键切换必须焦点跟随（roving tabindex）\n23. 不可手动创建 `.toast` 元素（必须通过 `af-toast.show()` 单例）\n24. 骨架屏 `style=\"\"` 不可设宽高（用 `.sk-ln` 配方或项目级扩展）\n25. 不可在 JS 事件回调内调用 `setAttribute` 修改自身 attribute（单向数据流）\n\n完整禁令详见 [docs/design/l4-detailed-design.md](docs/design/l4-detailed-design.md) §7.1。\n\n## 项目级扩展\n\nL4 设计支持三类扩展通道（不可混用）：\n\n| 扩展类型 | 场景 | 文件 | 登记 |\n|---|---|---|---|\n| L2 配方/原子变体 | `.avatar-lg`（大头像）、`.btn-gradient` | `recipes.project.css` | `extraClass` |\n| L1 token 值覆盖 | 项目品牌色 `--c-brand: #ff6b35` | `tokens.project.css` | ❌ |\n| L3 组件新增 | `<af-qrcode>` | `components/project-af-*.js` | `extraComponents` |\n\n```js\n// .eslintrc.cjs 项目级配置示例\nexport default [\n  ...af-mobileBaseConfig,\n  {\n    rules: {\n      'af-mobile/token-whitelist': ['error', {\n        extraClass: ['avatar-lg', 'search-with-icon', 'search-icon'],\n        extraComponents: ['af-qrcode'],\n        allowProjectTokens: true,\n      }],\n    },\n  },\n];\n```\n\n详细机制见 [docs/design/l4-detailed-design.md](docs/design/l4-detailed-design.md) §5。\n\n## CI 保护链路\n\nPR 触发 CI 检查链路（任一失败即阻断合并）：\n\n| Step | 检查项 | 命令 |\n|---|---|---|\n| 1 | 白名单三源同步（CSS/JS ↔ whitelist.json ↔ Prompt 注入） | `npm run whitelist:check` |\n| 1b | d.ts 与源码组件数同步（防类型声明漂移） | `npm run types:check` |\n| 1c | Prompt 快照与运行时构建一致性（防 prompt 过期） | `npm run prompt:check` |\n| 1d | ARIA 要求同步（JSON 声明 ↔ 规则检测分支） | `npm run aria:check` |\n| 1e | Skill 文档代码块 API 漂移检查 | `npm run skill:check` |\n| 1f | i18n key 注册与 zh-CN ↔ en-US 字典对齐 | `npm run i18n:check` |\n| 2 | 体积预算（L1+L2 CSS ≤ 6.0KB / 全量 30 组件+基类 ≤ 23.0KB / 按需2组件 ≤ 6.5KB / 单组件 JS ≤ 2.8KB / 基类 ≤ 2.0KB / 核心运行时 ≤ 6.8KB） | `npm run size` |\n| 3 | 单元测试（jsdom） | `npm test` |\n| 3b | e2e 冒烟（Playwright：showModal/popover/scroll-snap/touch 等浏览器原生行为） | `npm run test:e2e` |\n| 4 | ESLint 规则闸门（消费端 AI_RULES 24 条：16 error + 8 warn；分目录生效） | `npx eslint src/ test/ scripts/ eval/ mcp/ eslint-plugin-af-mobile/ adapters/ starter/src/ --max-warnings 0` |\n| 5 | 发布前检查（build + Tree Shaking + sideEffects + types-sync + npm pack） | `npm run publish:check` |\n| 6 | eval 集格式闸门（校验 prompts.jsonl 结构） | `npm run eval:dry` |\n\n> **测试栈说明**：单元测试基于 jsdom，**不覆盖** `popover`/`showModal` 真实行为、`ResizeObserver`/`IntersectionObserver`、`scroll-snap`、真实 touch 事件、`prefers-reduced-motion` 等浏览器原生 API。这些由 **Playwright e2e**（`e2e/`，随 CI Step 3b 运行）覆盖：`showModal`/popover 弹层、scroll-snap 滚轮、下拉、滑动、触摸拖拽等。两者的分工是——jsdom 断言逻辑层（派发事件/属性同步），e2e 验证浏览器原生行为。关键交互线上线下均有闸门。\n\n`.github/CODEOWNERS` 把关键文件分为 3 组 Owner：\n\n- L1 Owner：`tokens.css`\n- L3 Owner：`af-element.js`\n- L4 Owner：`whitelist-v*.json` / `system-prompt.*` / `eslint-plugin-af-mobile/rules/**`\n\n## 包生态（@af-mobile scope）\n\n| 包 | 用途 | 安装/接入 |\n|---|---|---|\n| `@af-mobile/ui` | 主包：30 组件（+ charts 图表子库 `/charts` 入口 5 图表组件 + chat 会话子库 `/chat` 入口）+ 路由/状态/主题/i18n + CLI | `npm i @af-mobile/ui` / `npm create af-mobile` |\n| `create-af-mobile` | 脚手架薄壳（npm create 约定入口，转发主包 CLI） | `npm create af-mobile@latest my-app` |\n| `@af-mobile/eslint-plugin` | 24 条 AI 约束规则（白名单/禁令/组件质量） | devDependency + flat config |\n| `@af-mobile/mcp` | MCP Server：`get_prompt` / `check_compliance` / `fix_code` / `generate_page` / `flywheel_report` | `npx @af-mobile/mcp`（注册进 TRAE / Claude Code / Cursor） |\n| `@af-mobile/prompt` | System Prompt 构建器（按需求裁剪白名单+组件 API+few-shot） | `import { buildPrompt } from '@af-mobile/prompt'` |\n| `@af-mobile/adapters` | 后端 scheme 适配器：`supabase://table?...` → PostgREST（零 BaaS SDK） | `npm i @af-mobile/adapters`（peer 依赖主包） |\n\n> MCP 五个工具的完整用法与数据飞轮机制见 [AGENTS.md §4](AGENTS.md)（细节：docs/incidents.md「四」）；CLI 与 skill 工作流见上文「快速开始」。\n\n## 本地开发\n\n```bash\n# 安装依赖\nnpm install\n\n# 跑测试\nnpm test\n\n# 跑 CI 全流程（whitelist 同步 + 体积 + 测试）\nnpm run ci\n\n# Lint 自检\nnpx eslint src/\n\n# 体积检查\nnpm run size\n\n# 发布前检查\nnpm run publish:check\n\n# 重新生成 whitelist-v1.json\nnpm run whitelist\n\n# 构建 System Prompt（注入白名单 + 项目扩展）\nnpm run prompt:build\n```\n\n## 设计文档\n\n**架构与分层**\n\n- [架构 RFC v3（总纲：AI 生成系统的完整方案）](docs/design/af-mobile-rfc-v3.md)\n- [L1+L2 详细设计](docs/design/l1-l2-detailed-design.md)（Token / 配方原子 / 白名单）\n- [L3 真组件详细设计](docs/design/l3-detailed-design.md)\n- [L4 AI 约束层详细设计](docs/design/l4-detailed-design.md)（Prompt / ESLint / CI 三层约束）\n- [DECISIONS.md](docs/DECISIONS.md) —— 砍/留/复活决策登记簿\n- [Charts 图表子库详细设计](docs/design/charts-sublibrary-detailed-design.md)（SVG 原生图表 / 独立入口 / 体积预算）\n- [Charts Demo 详细设计](docs/design/charts-demo-detailed-design.md)（5 组件 demo + 联动场景页 / `demo/index.html` 接入）\n\n**运行时与迁移**\n\n- [P0 生产刚需设计](docs/design/p0-production-essentials-design.md)（路由 / 状态 / 异步 / Prompt 4 要素）\n- [v2.0 迁移指南](docs/migration-guide.md)（definePage → createPage / RouterError / scrollBehavior）\n\n**AI 工程与生态**\n\n- [数据飞轮 v2 设计](docs/design/flywheel-v2-design.md)（源无关反馈闭环：MCP 遥测 → 白名单/Prompt 迭代）\n- [多包发布体系设计](docs/design/pkg-publish-mcp-prompt-design.md)（mcp / prompt 打包 + 资产快照闸门）\n\n## License\n\nMIT\n","readmeFilename":"README.md"}