A Lit-based web component for displaying Puzzmo streak stats from ATProto records.
Learn more about Puzzmo's ATProto integration
See the demo for an example.
Install the package and its peer dependency:
npm install puzzmo-stats lit @lit/taskFor local development in this repository:
npm installImport the component once in your application entrypoint:
import "puzzmo-stats";Then use the custom element in HTML:
<puzzmo-stats handle="cbennell.com"></puzzmo-stats>The handle attribute should be a Bluesky/ATProto handle that has Puzzmo streak records in the com.puzzmo.streak collection.
The package build includes an IIFE bundle for direct script usage:
<script src="./dist/puzzmo-stats.iife.min.js"></script>
<puzzmo-stats handle="cbennell.com"></puzzmo-stats>The IIFE bundle includes Lit and @lit/task. The ESM package build keeps those dependencies external.
- Add further visual customization with CSS custom properties
- Allow users to exclude certain games
- Customize date format
- Allow initialization with DID/PDS to save requests
- Compare mode: show sttats for two users
| Attribute | Property | Type | Required | Description |
|---|---|---|---|---|
handle |
handle |
string |
Yes | ATProto handle used to resolve and load Puzzmo streak records. |
The component ships with default shadow-DOM styles. Consumers can customize supported styling hooks with CSS custom properties applied to the host element.
puzzmo-stats {
--puzzmo-stats-spacing: 1rem;
--puzzmo-stats-font-size-stat: 2rem;
--puzzmo-stats-font-display: Georgia, serif;
--puzzmo-stats-color-label: #666;
--puzzmo-stats-border-color: #d8d8d8;
--puzzmo-stats-icon-size: 28px;
--puzzmo-stats-icon-foreground: #141620;
--puzzmo-stats-icon-background: #ececec;
}Icon color values may include or omit the leading #. If icon colors are not set, the component picks defaults from the user's preferred light/dark color scheme.
The component also falls back to these app-level design tokens when present:
| Component Variable | Default |
|---|---|
--puzzmo-stats-spacing |
1rem |
--puzzmo-stats-font-size-stat |
2rem |
--puzzmo-stats-font-display |
inherit |
--puzzmo-stats-label-color |
#666 |
--puzzmo-stats-border-color |
#d8d8d8 |
--puzzmo-stats-icon-size |
28px |
--puzzmo-stats-icon-foreground |
Light/dark scheme dependent |
--puzzmo-stats-icon-background |
Light/dark scheme dependent |
Start the dev server with automatic rebuilds and browser reloads:
npm run devOpen the /demo/ URL printed by the dev server. It uses port 3000 by default and falls back to another available port if needed.
Request a specific port:
PORT=3001 npm run devCreate distributable files:
npm run buildBuild outputs:
| File | Purpose |
|---|---|
dist/puzzmo-stats.js |
ESM package build with lit and @lit/task externalized. |
dist/puzzmo-stats.dev.js |
Bundled ESM build for the local demo page. |
dist/puzzmo-stats.iife.min.js |
Bundled/minified script build for direct browser usage. |
dist/*.d.ts |
TypeScript declaration files. |
dist/*.map |
Source maps and declaration maps. |
Run all checks:
npm run checknpm run check runs TypeScript typechecking, the test suite, and a full production build.
Run the test suite once:
npm testRun tests in watch mode while developing:
npm run test:watchTests use Vitest with happy-dom. The current suite prioritizes low-maintenance coverage for the most important behavior:
| Test File | Coverage |
|---|---|
test/format.test.ts |
Date display formatting. |
test/puzzmo-icons.test.ts |
Puzzmo icon URL generation and CSS-style hex color normalization. |
test/puzzmo-streaks.test.ts |
Record loading behavior, filtering, sorting, and normalization. |
test/puzzmo-stats.test.ts |
Custom-element registration and basic render states. |
The source is split by responsibility:
| File | Responsibility |
|---|---|
src/puzzmo-stats.ts |
Lit custom element and rendering. |
src/puzzmo-streaks.ts |
Puzzmo streak record loading, filtering, sorting, and normalization. |
src/puzzmo-icons.ts |
Puzzmo icon URL and color-scheme helpers. |
src/format.ts |
Display formatting helpers. |
src/lib/atproto.ts |
ATProto handle, PDS, and record APIs. |
The package targets modern browsers with native custom elements, shadow DOM, ES modules, and fetch support.