{"_id":"@agentaily/web-kit","_rev":"5-ce45c9a0f2517df7536cd3a748376aec","name":"@agentaily/web-kit","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@agentaily/web-kit","version":"0.1.0","keywords":["react","theme","dark-mode","i18n","cookie","persistence","ssr","agentaily"],"author":{"name":"agentaily"},"license":"MIT","_id":"@agentaily/web-kit@0.1.0","maintainers":[{"name":"yarnovo","email":"yarnb@qq.com"}],"homepage":"https://github.com/agentaily/web-kit#readme","bugs":{"url":"https://github.com/agentaily/web-kit/issues"},"dist":{"shasum":"49187ce8afa0c839936a16c8805da6975603bda4","tarball":"https://registry.npmjs.org/@agentaily/web-kit/-/web-kit-0.1.0.tgz","fileCount":8,"integrity":"sha512-R2iJYfdSH7V6kIj5sYkrlJE+uPo3E33mxLTPB8hVbfiZ0Y94ZDdEdKc6ophk00HsTO5wp5LEQG9EA2hS6kYS9A==","signatures":[{"sig":"MEQCICjfAh4IYcD0wTd/wApoduik/HiFqB9UTXjueYL0QnAkAiA5tYDHW29c9yxXhnjyTEcSiEDlS5wzhKaX/R239JR+qg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104561},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsup","format":"prettier --write .","prepare":"lefthook install","release":"changeset publish","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check ."},"_npmUser":{"name":"yarnovo","email":"yarnb@qq.com"},"repository":{"url":"git+https://github.com/agentaily/web-kit.git","type":"git"},"_npmVersion":"11.12.1","description":"跨产品共享的浏览器运行时库 —— 主题 + 国际化 + 跨子域 cookie 持久化(非视觉运行时)。","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","jsdom":"^25.0.1","react":"^18.3.1","vitest":"^2.1.8","lefthook":"^1.10.1","prettier":"^3.4.2","react-dom":"^18.3.1","typescript":"^5.7.2","@types/react":"^18.3.18","@changesets/cli":"^2.27.11","@types/react-dom":"^18.3.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","@changesets/changelog-github":"^0.5.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/web-kit_0.1.0_1781533894747_0.909640878454506","host":"s3://npm-registry-packages-npm-production"},"deprecated":"弃用中:theme/i18n 正并入 @agentaily/design-system(单一公共上游);现有消费方迁移中,勿新接入。"},"0.1.1":{"name":"@agentaily/web-kit","version":"0.1.1","keywords":["react","theme","dark-mode","i18n","cookie","persistence","ssr","agentaily"],"author":{"name":"agentaily"},"license":"MIT","_id":"@agentaily/web-kit@0.1.1","maintainers":[{"name":"yarnovo","email":"yarnb@qq.com"}],"homepage":"https://github.com/agentaily/web-kit#readme","bugs":{"url":"https://github.com/agentaily/web-kit/issues"},"dist":{"shasum":"6a6f69315eb5c1d304de5afb14895ab2707b0b82","tarball":"https://registry.npmjs.org/@agentaily/web-kit/-/web-kit-0.1.1.tgz","fileCount":2,"integrity":"sha512-QEsV4Dps6AqTaI4cfFOrky6PpyL89TH55hqf3DJkANbep7pkGkzpbdbvHm1RQ/K/wphR6Rp91EAI+Py5ioVVAQ==","signatures":[{"sig":"MEYCIQDAp1C3QkzbjhTYu5MKm6WxHtAmkqdaRWTOZbZ8lrB9iAIhAPo2q+9KPs3khQrDvnIxOmTCW3OG7LxNK90YIgSE/NCc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agentaily%2fweb-kit@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5112},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"gitHead":"abf3f1002d7060aadd50f9a2b601e5952f6b319f","scripts":{"test":"vitest run","build":"tsup","format":"prettier --write .","prepare":"lefthook install","release":"changeset publish","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check ."},"_npmUser":{"name":"yarnovo","email":"yarnb@qq.com"},"deprecated":"弃用中:theme/i18n 正并入 @agentaily/design-system(单一公共上游);现有消费方迁移中,勿新接入。","repository":{"url":"git+https://github.com/agentaily/web-kit.git","type":"git"},"_npmVersion":"10.9.8","description":"跨产品共享的浏览器运行时库 —— 主题 + 国际化 + 跨子域 cookie 持久化(非视觉运行时)。","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","jsdom":"^25.0.1","react":"^18.3.1","vitest":"^2.1.8","lefthook":"^1.10.1","prettier":"^3.4.2","react-dom":"^18.3.1","typescript":"^5.7.2","@types/react":"^18.3.18","@changesets/cli":"^2.27.11","@types/react-dom":"^18.3.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","@changesets/changelog-github":"^0.5.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/web-kit_0.1.1_1781536922840_0.25147274872823444","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@agentaily/web-kit","version":"0.1.2","keywords":["react","theme","dark-mode","i18n","cookie","persistence","ssr","agentaily"],"author":{"name":"agentaily"},"license":"MIT","_id":"@agentaily/web-kit@0.1.2","maintainers":[{"name":"yarnovo","email":"yarnb@qq.com"}],"homepage":"https://github.com/agentaily/web-kit#readme","bugs":{"url":"https://github.com/agentaily/web-kit/issues"},"dist":{"shasum":"cc03166cf0183804120ea5d946cf4e8a58c3c764","tarball":"https://registry.npmjs.org/@agentaily/web-kit/-/web-kit-0.1.2.tgz","fileCount":8,"integrity":"sha512-FnWtMS2jzbJFg5mxrtNcqwJ4I44XBGHgNo8b7acLW+rvGvCkdZHAXQaEC4PGYBywPEGE4RH+v62ra97+sdGiCA==","signatures":[{"sig":"MEUCIQClG2xxMVvcwIDinLY2aGyjj/wIbRbQDDnh0Lgs9kX+NwIgcQbZU7A/XLmI37TyWCbmoo6s1c/uhGX0H2/i2S8vfyI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agentaily%2fweb-kit@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":104702},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"gitHead":"64142c23bd41758731a396aae27623b957f0198e","scripts":{"test":"vitest run","build":"tsup","format":"prettier --write .","prepack":"npm run build","prepare":"lefthook install","release":"changeset publish","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check ."},"_npmUser":{"name":"yarnovo","email":"yarnb@qq.com"},"repository":{"url":"git+https://github.com/agentaily/web-kit.git","type":"git"},"_npmVersion":"10.9.8","description":"跨产品共享的浏览器运行时库 —— 主题 + 国际化 + 跨子域 cookie 持久化(非视觉运行时)。","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","jsdom":"^25.0.1","react":"^18.3.1","vitest":"^2.1.8","lefthook":"^1.10.1","prettier":"^3.4.2","react-dom":"^18.3.1","typescript":"^5.7.2","@types/react":"^18.3.18","@changesets/cli":"^2.27.11","@types/react-dom":"^18.3.5","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.1.0","@testing-library/jest-dom":"^6.6.3","@changesets/changelog-github":"^0.5.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/web-kit_0.1.2_1781541188374_0.07173739318691807","host":"s3://npm-registry-packages-npm-production"},"deprecated":"弃用中:theme/i18n 正并入 @agentaily/design-system(单一公共上游);现有消费方迁移中,勿新接入。"}},"time":{"created":"2026-06-15T14:31:34.579Z","modified":"2026-06-16T16:24:49.252Z","0.1.0":"2026-06-15T14:31:34.944Z","0.1.1":"2026-06-15T15:22:02.962Z","0.1.2":"2026-06-15T16:33:08.514Z"},"bugs":{"url":"https://github.com/agentaily/web-kit/issues"},"author":{"name":"agentaily"},"license":"MIT","homepage":"https://github.com/agentaily/web-kit#readme","keywords":["react","theme","dark-mode","i18n","cookie","persistence","ssr","agentaily"],"repository":{"url":"git+https://github.com/agentaily/web-kit.git","type":"git"},"description":"跨产品共享的浏览器运行时库 —— 主题 + 国际化 + 跨子域 cookie 持久化(非视觉运行时)。","maintainers":[{"name":"yarnovo","email":"yarnb@qq.com"}],"readme":"# @agentaily/web-kit\n\n[![npm](https://img.shields.io/npm/v/@agentaily/web-kit)](https://www.npmjs.com/package/@agentaily/web-kit)\n\n跨产品共享的**浏览器运行时**库 —— 把「主题切换 + 国际化 + 持久化」这套横切关注点统一到一处,所有 agentaily 产品(form-design、official-website、各产品宣传站…)消费它,别各自手搓。\n\n> **定位**:`@agentaily/design-system` 是**视觉/镜像组件**;`@agentaily/web-kit` 是**非视觉的 app 运行时**(状态/持久化/Provider)。两者都被产品消费,职责不重叠。React + TypeScript,changesets 自动发 npm(同 design-system 流程)。\n\n## 提供什么(v1 已发布)\n\n- **主题** `ThemeProvider` + `useTheme()` —— 三态 `system | light | dark`,默认 `system`(`prefers-color-scheme` + 监听变化),应用为 `<html data-theme>`;**防 FOUC**:导出 `themeInitScript`(首屏前阻塞执行的 `<head>` snippet,静态站注入 index.html / SSR 注入 document head)。\n- **国际化** `createI18n(config)` 工厂 → `LocaleProvider` + `useLocale()` + `useMessages()` —— **机制共享、catalog 每产品自己注入**(类型安全);`navigator.language` 探测 + 回退;设 `<html lang>`。\n- **持久化** `createStorage` / `persistentState` —— **跨子域 cookie**(`domain=.agentaily.com`、`SameSite=Lax`,用户在任一 agentaily 子域选的主题/语言全站一致;localhost dev 回退 localStorage);SSR/无 window 安全、隐私模式不抛错。\n\n## 安装\n\n```bash\nnpm i @agentaily/web-kit\n# react / react-dom 为 peerDependencies,自行安装(>=18)\n```\n\n## 用法\n\n```tsx\nimport { ThemeProvider, useTheme, themeInitScript, createI18n } from \"@agentaily/web-kit\";\n\n// 1) 主题:用 ThemeProvider 包裹应用\nfunction App() {\n  return (\n    <ThemeProvider defaultTheme=\"system\">\n      <Toolbar />\n    </ThemeProvider>\n  );\n}\nfunction Toolbar() {\n  const { theme, resolvedTheme, setTheme } = useTheme();\n  return (\n    <button onClick={() => setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\")}>{theme}</button>\n  );\n}\n\n// 2) 防 FOUC:把 themeInitScript() 的输出内联进 <head>(React 接管前同步执行)\n//    静态站:写进 index.html;SSR:注入 document head。\n//    <script>{themeInitScript()}</script>\n//    注:若给 ThemeProvider 传了自定义 storage.keyPrefix,要把同样的 key 传给\n//    themeInitScript({ storageKey: \"<prefix>theme\" }),两端读同一个存储键。\n\n// 3) i18n:每个产品注入自己的 catalog(类型安全)\nconst { LocaleProvider, useLocale, useMessages } = createI18n({\n  catalogs: { en: { greeting: \"Hello\" }, zh: { greeting: \"你好\" } },\n  defaultLocale: \"en\",\n});\n//    useMessages() 的返回类型 = 注入的 catalog 形状(编译期保证)。\n```\n\n## 技术栈\n\nTypeScript (strict) · 双格式产物(ESM + CJS + `.d.ts`,tsup)· vitest + @testing-library/react (jsdom) · changesets 自动发 npm · lefthook + Prettier · GitHub Actions(CI + release）。`react`/`react-dom` 为 peerDependencies(不打进产物)。done-gate 见 [TESTING.md](./TESTING.md),API 契约见 [SPEC.md](./SPEC.md)。\n","readmeFilename":"README.md"}