{"_id":"@codejoo/counter","_rev":"3-d439588a6659d6d9e3d038fa69b69b67","name":"@codejoo/counter","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"@codejoo/counter","version":"0.0.1","_id":"@codejoo/counter@0.0.1","maintainers":[{"name":"29982416","email":"29982416@qq.com"}],"dist":{"shasum":"c6233ff894cae7ce7c8062fb62bf7233b3fe37bc","tarball":"https://registry.npmjs.org/@codejoo/counter/-/counter-0.0.1.tgz","fileCount":52,"integrity":"sha512-4ZlJSJ5Xf+0MaRko7g1hYJZpUkb+9dWqfVRCHP8KqBuh4uxDCuis9PNUOY7uxBEN+vduav1uus5m8zExpnS2fA==","signatures":[{"sig":"MEYCIQDxgcAmmORsWDI+grD8L08tg5ki7Sl7czO9xoCeiU2CigIhANz8XRC6Vv41DH7g9vtjazlF1X+3zYPwOWjA/XBGwH1y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":279657},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./card":{"types":"./dist/card.d.mts","default":"./dist/card.mjs"},"./ring":{"types":"./dist/ring.d.mts","default":"./dist/ring.mjs"},"./card.css":"./dist/card.css","./count-up":{"types":"./dist/count-up.d.mts","default":"./dist/count-up.mjs"},"./odometer":{"types":"./dist/odometer.d.mts","default":"./dist/odometer.mjs"},"./ring.css":"./dist/ring.css","./count-down":{"types":"./dist/count-down.d.mts","default":"./dist/count-down.mjs"},"./package.json":"./package.json"},"gitHead":"89d71656a26f07611039d59f4f6e9e3e914af82d","scripts":{"ui":"vp dev","dev":"vp pack --watch","fmt":"vp fmt -c oxfmt.config.ts","lint":"vp lint -c oxlint.config.ts","test":"vp test","build":"vp pack && node scripts/copy-assets.mjs","check":"vp fmt -c oxfmt.config.ts --check && vp lint -c oxlint.config.ts"},"_npmUser":{"name":"29982416","email":"29982416@qq.com"},"_npmVersion":"11.6.2","description":"浏览器端的轻量高性能计数引擎。单个共享的 `requestAnimationFrame` 心跳驱动所有 **count-up** （数字滚动）与 **count-down**（倒计时），渲染方式可插拔——默认纯文本，也可用富 SVG/DOM 渲染插件 （翻牌、里程表、圆环）。","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","vitest":"catalog:","vite-plus":"catalog:","@types/node":"catalog:","@typescript/native-preview":"catalog:"},"_npmOperationalInternal":{"tmp":"tmp/counter_0.0.1_1781418091468_0.7024066477233684","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@codejoo/counter","version":"0.1.0","_id":"@codejoo/counter@0.1.0","maintainers":[{"name":"29982416","email":"29982416@qq.com"}],"dist":{"shasum":"5184ac0dd66babd2ae8c824c8594c3849b761cd9","tarball":"https://registry.npmjs.org/@codejoo/counter/-/counter-0.1.0.tgz","fileCount":55,"integrity":"sha512-8DNB6pLtqIzH8Z46pXSpnUc9WdVGd67G7pv5/9eMbtL3PEKAJ8DZEV3jGNB30k40XU1QwJFxHPyocoL8h6V18w==","signatures":[{"sig":"MEUCIQC9vSi0+AXio+wmCicosq76EXjB/DsuYd84odD2scwpGAIgOKvVL09ZLKXTveVnBfOfiwD3M+lwVIhdesMSyz8sUuI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":298340},"main":"./dist/index.mjs","type":"module","_from":"file:codejoo-counter-0.1.0.tgz","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./card":{"types":"./dist/card.d.mts","default":"./dist/card.mjs"},"./ring":{"types":"./dist/ring.d.mts","default":"./dist/ring.mjs"},"./card.css":"./dist/card.css","./count-up":{"types":"./dist/count-up.d.mts","default":"./dist/count-up.mjs"},"./odometer":{"types":"./dist/odometer.d.mts","default":"./dist/odometer.mjs"},"./ring.css":"./dist/ring.css","./count-down":{"types":"./dist/count-down.d.mts","default":"./dist/count-down.mjs"},"./package.json":"./package.json"},"scripts":{"ui":"vp dev","dev":"vp pack --watch","fmt":"vp fmt -c oxfmt.config.ts","lint":"vp lint -c oxlint.config.ts","test":"vp test","build":"vp pack && node scripts/copy-assets.mjs","check":"vp fmt -c oxfmt.config.ts --check && vp lint -c oxlint.config.ts"},"_npmUser":{"name":"29982416","email":"29982416@qq.com"},"_resolved":"C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\531a9fb1c54fe8a837c927e0d0c80b2c\\codejoo-counter-0.1.0.tgz","_integrity":"sha512-8DNB6pLtqIzH8Z46pXSpnUc9WdVGd67G7pv5/9eMbtL3PEKAJ8DZEV3jGNB30k40XU1QwJFxHPyocoL8h6V18w==","_npmVersion":"11.6.2","description":"浏览器端的轻量高性能计数引擎。单个共享的 `requestAnimationFrame` 心跳驱动所有 **count-up** （数字滚动）与 **count-down**（倒计时），渲染方式可插拔——默认纯文本，也可用富 SVG/DOM 渲染插件 （翻牌、里程表、圆环）。","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^25.0.1","vitest":"npm:@voidzero-dev/vite-plus-test@0.1.22","vite-plus":"0.1.22","@types/node":"^24","@typescript/native-preview":"beta"},"_npmOperationalInternal":{"tmp":"tmp/counter_0.1.0_1783269499298_0.7065120296471863","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-06-14T06:21:31.294Z","modified":"2026-07-16T22:57:24.516Z","0.0.1":"2026-06-14T06:21:31.596Z","0.1.0":"2026-07-05T16:38:19.438Z"},"description":"浏览器端的轻量高性能计数引擎。单个共享的 `requestAnimationFrame` 心跳驱动所有 **count-up** （数字滚动）与 **count-down**（倒计时），渲染方式可插拔——默认纯文本，也可用富 SVG/DOM 渲染插件 （翻牌、里程表、圆环）。","maintainers":[{"email":"29982416@qq.com","name":"29982416"},{"email":"gapkukb@gmail.com","name":"icodejoo"}],"readme":"# @codejoo/counter\n\n浏览器端的轻量高性能计数引擎。单个共享的 `requestAnimationFrame` 心跳驱动所有 **count-up**\n（数字滚动）与 **count-down**（倒计时），渲染方式可插拔——默认纯文本，也可用富 SVG/DOM 渲染插件\n（翻牌、里程表、圆环）。\n\n- **count-up** —— 数字从 `from → to` 动画，支持缓动、fps 节流、自定义格式/渲染、懒加载、分组、暂停/恢复。\n- **count-down** —— 倒计时到截止点（ms / 单位 / `Date` / 日期串），支持格式化、懒加载、分组、生命周期钩子；\n  渲染/钩子共用的 `ctx` 除当前 `value`（复用元组 `[d,h,m,s,ms]`）外还有 `ctx.oldValue`——上一次值真正变化前的独立快照，方便对比哪些位刚发生了进位。\n- **单心跳** —— 一个 rAF 循环跑所有任务，首个任务自动启动、空闲自动停止；热路径零分配。\n- **渲染插件** —— 按需引入、可独立 import（tree-shaking 友好）、运行时不依赖核心：\n  - **card** —— 翻牌 / 滑动 / 日历翻页 数字卡片。\n  - **odometer** —— 滚轮里程表（`minimal` / `full`）。\n  - **ring** —— 圆形七段倒计时：刻度环 + 双向装饰弧 + 逐秒排空进度环。\n\n## 安装\n\n```sh\npnpm add @codejoo/counter\n```\n\n## 快速上手\n\n```ts\nimport { countup, countdown } from \"@codejoo/counter\";\n\ncountup(1234, \"#total\"); // 0 → 1234\ncountup(0, 99.9, { duration: 2000, fmt: (n) => n.toFixed(1) });\ncountdown(60_000, \"#timer\", { fmt: \"mm:ss\" });\ncountdown(\"2026-12-31 23:59:59\", \"#newyear\", { fmt: \"DD HH:mm:ss\" });\n```\n\n## 渲染插件（独立入口，按需引入）\n\n```ts\nimport { countdown } from \"@codejoo/counter/count-down\";\nimport { createRingRender } from \"@codejoo/counter/ring\";\nimport \"@codejoo/counter/ring.css\";\ncountdown(300_000, \"#ring\", { fmt: \"mm:ss\", render: createRingRender() });\n```\n\n各插件选项与 API：[card](./docs/card.md) · [odometer](./docs/odometer.md) · [ring](./docs/ring.md)。\n\n## 入口\n\n| import                                            | 内容                                        |\n| ------------------------------------------------- | ------------------------------------------- |\n| `@codejoo/counter`                                | 全部（核心 + count-up + count-down + 插件） |\n| `@codejoo/counter/count-down`                     | `countdown`                                 |\n| `@codejoo/counter/count-up`                       | `countup`                                   |\n| `@codejoo/counter/card` `.../odometer` `.../ring` | 对应渲染插件                                |\n\n各渲染插件运行时独立（仅以 type 依赖 count-down），import `/ring` 只会打包 ring 本身。\n\n## 开发\n\n```sh\npnpm dev      # 监听构建\npnpm build    # 多入口 ESM 构建 + 拷贝 css\npnpm test     # vitest (jsdom)\npnpm check    # 格式化 + lint\n```\n\n全量 API 手动测试台：用 Vite dev server 打开根路径 `/`（index.html）。\n","readmeFilename":"README.zh-CN.md"}