{"_id":"@ariefsn/svelte-countdown","_rev":"3-acf77c2bf25180594ba046c2d152f1b6","name":"@ariefsn/svelte-countdown","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"@ariefsn/svelte-countdown","version":"0.0.1","keywords":["svelte","countdown","timer","sveltekit"],"author":{"name":"Arief Setiyo Nugroho","email":"ayiexz22@gmail.com"},"license":"MIT","_id":"@ariefsn/svelte-countdown@0.0.1","maintainers":[{"name":"ariefsn","email":"ayiexz22@gmail.com"}],"homepage":"https://github.com/ariefsn/svelte-countdown","bugs":{"url":"https://github.com/ariefsn/svelte-countdown/issues"},"dist":{"shasum":"e03605ea777911ad3559a07b05ea04a9437b3b09","tarball":"https://registry.npmjs.org/@ariefsn/svelte-countdown/-/svelte-countdown-0.0.1.tgz","fileCount":6,"integrity":"sha512-Ox8Ro6NjHG0ad3BegafczEFNeLNLEZNWkNjTdutR4IvTzDd42WCrvtzhRUp0ggm5qYu+z2PcKJXrXu3pZrChhg==","signatures":[{"sig":"MEQCIEYb+q/zl5izfITAkvDwCbGAeuKk2xxEfyEVtMi+5GCDAiBxssLP1Wq+bq6HZuJvSlHmX0pxGMQ2zWiD/d9lFO+gNA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9642},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"}},"gitHead":"353b0db7371e29149269b6d251cd3bfb108b85fb","scripts":{"dev":"vite dev","lint":"prettier --check . && eslint .","test":"npm run test:unit -- --run","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","prepack":"svelte-kit sync && svelte-package && publint","prepare":"svelte-kit sync || echo ''","preview":"vite preview","test:unit":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"},"_npmUser":{"name":"ariefsn","email":"ayiexz22@gmail.com"},"repository":{"url":"git+ssh://git@github.com/ariefsn/svelte-countdown.git","type":"git"},"_npmVersion":"10.9.3","description":"A lightweight Svelte 5 timer component for counting down from a number or between two dates, with simple render via snippet and control methods.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.1.7","eslint":"^9.36.0","svelte":"^5.39.5","vitest":"^3.2.4","globals":"^16.4.0","publint":"^0.3.13","prettier":"^3.6.2","@eslint/js":"^9.36.0","playwright":"^1.55.1","typescript":"^5.9.2","@types/node":"^22","svelte-check":"^4.3.2","@sveltejs/kit":"^2.43.2","@eslint/compat":"^1.4.0","@vitest/browser":"^3.2.4","@sveltejs/package":"^2.5.4","typescript-eslint":"^8.44.1","eslint-plugin-svelte":"^3.12.4","vitest-browser-svelte":"^1.1.0","@sveltejs/adapter-auto":"^6.1.0","eslint-config-prettier":"^10.1.8","prettier-plugin-svelte":"^3.4.0","@testing-library/svelte":"^5.2.8","@sveltejs/vite-plugin-svelte":"^6.2.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/svelte-countdown_0.0.1_1760863871397_0.03359160179249199","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@ariefsn/svelte-countdown","version":"0.0.2","keywords":["svelte","countdown","timer","sveltekit"],"author":{"name":"Arief Setiyo Nugroho","email":"ayiexz22@gmail.com"},"license":"MIT","_id":"@ariefsn/svelte-countdown@0.0.2","maintainers":[{"name":"ariefsn","email":"ayiexz22@gmail.com"}],"homepage":"https://github.com/ariefsn/svelte-countdown","bugs":{"url":"https://github.com/ariefsn/svelte-countdown/issues"},"dist":{"shasum":"dc9ccb282f04f0a450f5208986f2f855c9710fcd","tarball":"https://registry.npmjs.org/@ariefsn/svelte-countdown/-/svelte-countdown-0.0.2.tgz","fileCount":6,"integrity":"sha512-/t4e8j5UJmdkQsl/DxBNzuY6lGtxgL1mehw/vnqWpJok4qX9hQQL2bjOqisF178kCCtJkioBi830GRVk/ohSmw==","signatures":[{"sig":"MEUCIH68WVXCdCqBSJAtYxqjsG71XPYSw3EVPeFOHzCGsW8lAiEAkUVnvWgzOIrlAvPtHc+g+gme+HiVGIBLEF6oBSJ5YUc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9763},"type":"module","types":"./dist/index.d.ts","svelte":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"}},"gitHead":"b6998a9e4582b9bc99432974bfe9acefa9bda60c","scripts":{"dev":"vite dev","lint":"prettier --check . && eslint .","test":"npm run test:unit -- --run","build":"vite build && npm run prepack","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","format":"prettier --write .","prepack":"svelte-kit sync && svelte-package && publint","prepare":"svelte-kit sync || echo ''","preview":"vite preview","publish":"npm publish --access public","test:unit":"vitest","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","publish:dry":"npm publish --dry-run"},"_npmUser":{"name":"ariefsn","email":"ayiexz22@gmail.com"},"repository":{"url":"git+ssh://git@github.com/ariefsn/svelte-countdown.git","type":"git"},"_npmVersion":"10.9.3","description":"A lightweight Svelte 5 timer component for counting down from a number or between two dates, with simple render via snippet and control methods.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.1.7","eslint":"^9.36.0","svelte":"^5.39.5","vitest":"^3.2.4","globals":"^16.4.0","publint":"^0.3.13","prettier":"^3.6.2","@eslint/js":"^9.36.0","playwright":"^1.55.1","typescript":"^5.9.2","@types/node":"^22","svelte-check":"^4.3.2","@sveltejs/kit":"^2.43.2","@eslint/compat":"^1.4.0","@vitest/browser":"^3.2.4","@sveltejs/package":"^2.5.4","typescript-eslint":"^8.44.1","eslint-plugin-svelte":"^3.12.4","vitest-browser-svelte":"^1.1.0","@sveltejs/adapter-auto":"^6.1.0","eslint-config-prettier":"^10.1.8","prettier-plugin-svelte":"^3.4.0","@testing-library/svelte":"^5.2.8","@sveltejs/vite-plugin-svelte":"^6.2.0"},"peerDependencies":{"svelte":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/svelte-countdown_0.0.2_1760866072099_0.05246486725149646","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@ariefsn/svelte-countdown","version":"0.0.3","scripts":{"dev":"vite dev","build":"vite build && npm run prepack","preview":"vite preview","prepare":"svelte-kit sync || echo ''","prepack":"svelte-kit sync && svelte-package && publint","check":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json","check:watch":"svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch","format":"prettier --write .","lint":"prettier --check . && eslint .","test:unit":"vitest","test":"npm run test:unit -- --run","publish:dry":"npm publish --dry-run","publish":"npm publish --access public"},"sideEffects":["**/*.css"],"svelte":"./dist/index.js","types":"./dist/index.d.ts","type":"module","exports":{".":{"types":"./dist/index.d.ts","svelte":"./dist/index.js"}},"peerDependencies":{"svelte":"^5.0.0"},"devDependencies":{"@eslint/compat":"^1.4.0","@eslint/js":"^9.36.0","@sveltejs/adapter-auto":"^6.1.0","@sveltejs/kit":"^2.43.2","@sveltejs/package":"^2.5.4","@sveltejs/vite-plugin-svelte":"^6.2.0","@testing-library/svelte":"^5.2.8","@types/node":"^22","@vitest/browser":"^3.2.4","eslint":"^9.36.0","eslint-config-prettier":"^10.1.8","eslint-plugin-svelte":"^3.12.4","globals":"^16.4.0","playwright":"^1.55.1","prettier":"^3.6.2","prettier-plugin-svelte":"^3.4.0","publint":"^0.3.13","svelte":"^5.39.5","svelte-check":"^4.3.2","typescript":"^5.9.2","typescript-eslint":"^8.44.1","vite":"^7.1.7","vitest":"^3.2.4","vitest-browser-svelte":"^1.1.0"},"keywords":["svelte","countdown","timer","sveltekit"],"description":"A lightweight Svelte 5 timer component for counting down from a number or between two dates, with simple render via snippet and control methods.","repository":{"type":"git","url":"git+ssh://git@github.com/ariefsn/svelte-countdown.git"},"author":{"name":"Arief Setiyo Nugroho","email":"ayiexz22@gmail.com"},"homepage":"https://github.com/ariefsn/svelte-countdown","license":"MIT","publishConfig":{"access":"public"},"_id":"@ariefsn/svelte-countdown@0.0.3","gitHead":"b6998a9e4582b9bc99432974bfe9acefa9bda60c","bugs":{"url":"https://github.com/ariefsn/svelte-countdown/issues"},"_nodeVersion":"22.20.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-se+doowIov7h8+VbWvGb0YmQWcr/MCPFO4BpwTt0y639usBSedUJTXuV5GtfPNUs8GnBKdfUFbJZnaUwah/77g==","shasum":"226f2feef3d266a15b6d96ec142d3e1b8afa0e27","tarball":"https://registry.npmjs.org/@ariefsn/svelte-countdown/-/svelte-countdown-0.0.3.tgz","fileCount":6,"unpackedSize":10395,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDOO7J6osD+k2AoGMsgQkzQd4YPMvd6XI0282BfT/53ZAIhAMZqM1ZjwG//bA0gVjzI4MM4PKzIb7jBKiVLvFio2X2q"}]},"_npmUser":{"name":"ariefsn","email":"ayiexz22@gmail.com"},"directories":{},"maintainers":[{"name":"ariefsn","email":"ayiexz22@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/svelte-countdown_0.0.3_1760871566785_0.9482165487056988"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-19T08:51:11.270Z","modified":"2025-10-19T10:59:27.221Z","0.0.1":"2025-10-19T08:51:11.603Z","0.0.2":"2025-10-19T09:27:52.303Z","0.0.3":"2025-10-19T10:59:27.048Z"},"bugs":{"url":"https://github.com/ariefsn/svelte-countdown/issues"},"author":{"name":"Arief Setiyo Nugroho","email":"ayiexz22@gmail.com"},"license":"MIT","homepage":"https://github.com/ariefsn/svelte-countdown","keywords":["svelte","countdown","timer","sveltekit"],"repository":{"type":"git","url":"git+ssh://git@github.com/ariefsn/svelte-countdown.git"},"description":"A lightweight Svelte 5 timer component for counting down from a number or between two dates, with simple render via snippet and control methods.","maintainers":[{"name":"ariefsn","email":"ayiexz22@gmail.com"}],"readme":"# Svelte Countdown\n\nA lightweight Svelte 5 timer component for counting down from a number or between two dates, with simple render via snippet and control methods.\n\n- GitHub: https://github.com/ariefsn/svelte-countdown\n- NPM: http://npmjs.com/package/@ariefsn/svelte-countdown\n\n## Install\n\n```sh\n# npm\nnpm install @ariefsn/svelte-countdown\n# yarn\nyarn add @ariefsn/svelte-countdown\n# bun\nbun add @ariefsn/svelte-countdown\n```\n\n## Usage\n\nImport the component from the package and render via the Svelte 5 `children` snippet. You can also bind the component instance to access `start`, `stop`, and `reset`.\n\n### Count down from a number\n\n```svelte\n<script lang=\"ts\">\n  import { Countdown } from '@ariefsn/svelte-countdown';\n</script>\n\n<Countdown value={10} autoStart>\n  {#snippet children(time, seconds)}\n    {seconds}\n  {/snippet}\n</Countdown>\n```\n\n### Count down between two dates\n\n```svelte\n<script lang=\"ts\">\n  import { Countdown } from '@ariefsn/svelte-countdown';\n\n  const from = new Date();\n  const to = new Date(Date.now() + 15000);\n</script>\n\n<Countdown value={{ from, to }}>\n  {#snippet children(time, seconds)}\n    {time.minutes}:{time.seconds}\n  {/snippet}\n</Countdown>\n```\n\n### Control methods and callbacks\n\n```svelte\n<script lang=\"ts\">\n  import { Countdown, type CountdownInstance } from '@ariefsn/svelte-countdown';\n\n  let timer: ReturnType<typeof Countdown> | null = null;\n\n  const handleStart = () => console.log('started');\n  const handleTick = (time, s: number) => console.log('tick', s, time);\n  const handleFinish = () => console.log('finished');\n</script>\n\n<Countdown\n  bind:this={timer}\n  value={5}\n  onStart={handleStart}\n  onTick={handleTick}\n  onFinish={handleFinish}\n>\n  {#snippet children(time, seconds)}\n    {seconds}\n  {/snippet}\n</Countdown>\n\n<button on:click={() => timer?.start()}>Start</button>\n<button on:click={() => timer?.stop()}>Stop</button>\n<button on:click={() => timer?.reset()}>Reset</button>\n```\n\n## Props\n\n| Name | Type | Description | Required | Default |\n| --- | --- | --- | --- | --- |\n| `value` | `number` or `{ from: Date; to: Date }` | Number of seconds to count down, or a date range. | Yes | — |\n| `children` | `Snippet<[time: Omit<CountdownState, 'totalSeconds'>, seconds: number]>` | Snippet to render the live countdown state. | Yes | — |\n| `autoStart` | `boolean` | Start automatically on mount. | No | `false` |\n| `onTick` | `(time: Omit<CountdownState, 'totalSeconds'>, seconds: number) => void` | Called every second with derived time and remaining seconds. | No | — |\n| `onStart` | `() => void` | Called when the countdown starts. | No | — |\n| `onFinish` | `() => void` | Called when remaining seconds reach `0`. | No | — |\n\n## Types\n\n`CountdownState` returned to the `children` snippet and `onTick`:\n\n```ts\n{\n  years: string;\n  months: string;\n  weeks: string;\n  days: string;\n  hours: string;\n  minutes: string;\n  seconds: string;\n}\n```\n\n## Local development\n\n- Start dev server: `npm run dev`\n- Run unit tests: `npm run test`\n  - Browser mode tests require Playwright browsers. If you see a browser error, install them with `npx playwright install` (or `npx playwright install chromium`).\n- Build package: `npm run build`\n\nEverything inside `src/lib` is part of the library; `src/routes` is a simple showcase.\n","readmeFilename":"README.md"}