- ship `src/` in the npm tarball alongside `dist/` — the emitted `.d.ts.map`
reference `../../src/*.ts`, so "go to definition" only lands on real code
if the source is there; also gives npm/JSR source parity. (+16 kB packed.)
- `sideEffects` becomes an explicit allowlist (`dist/index.js`,
`dist/index.npm.js`, `dist/components/*.js`) instead of `true`, so bundlers
can tree-shake the side-effect-free `elements/*` and `core/*`.
- add `scripts/sync-version.mjs`: copies `package.json` version into
`jsr.json`. Wired into the `version` npm lifecycle hook (so `npm version`
bumps and stages both) and re-run in `prepublishOnly`.
- add `repository` / `bugs` / `homepage`; `author` -> "Buddy Sandidge" (was
"buddy", now matches LICENSE); a few more `keywords`.
- note in README/CLAUDE/docs that per-component deep imports
(`./elements/*.js`, `./components/*.js`) are npm-only — JSR has no subpath
patterns, so `jsr.json` exposes just `.` and `./elements`.
- exclude `scripts/` and `CLAUDE.md` from the JSR tarball.
Verified: `typecheck`, `lint`, `test` (76), `build`, `jsr publish --dry-run`
("Success"), and a fresh `npm pack` consumer typecheck all pass.
|
2 weeks ago | |
|---|---|---|
| .. | ||
| 01-architecture.md | 2 weeks ago | |
| 02-props-and-attributes.md | 2 weeks ago | |
| 03-component-tree.md | 3 weeks ago | |
| 04-events.md | 2 weeks ago | |
| 05-special-cases.md | 2 weeks ago | |
| 06-load-order.md | 2 weeks ago | |
| 07-tooling-and-build.md | 2 weeks ago | |
| README.md | 2 weeks ago | |
README.md
Design docs
These describe how leaflet-components is built and why — the load-bearing
decisions, in their current form. They are not a usage guide (that's the
top-level README.md) and not a working cheat-sheet (that's
CLAUDE.md).
| Doc | Covers |
|---|---|
| 01 — Architecture | Element-per-Leaflet-object, the WithProps mixin, the lifecycle it owns |
| 02 — Props & attributes | The PropDef model, the codec factories, two-way attribute↔object sync |
| 03 — Component tree & registration | The leaflet-register bubbling protocol, attach modes, the other announcement events |
| 04 — Events | Re-emitting Leaflet events as leaflet:<type>, and how they're typed |
| 05 — Per-component special cases | Where a component does something the mixin can't express generically |
| 06 — Load order | Why the ./components/* import order in src/index.ts is load-bearing |
| 07 — Tooling & build | TypeScript 7, oxlint, oxfmt, Vitest, the no-bundle build, dual publish |
The one-paragraph version
Each leaflet-* custom element wraps exactly one Leaflet object. A mixin
(WithProps) generates the element class from a table of property
descriptors: it derives observedAttributes, builds the Leaflet options
object from the current attributes, calls the component's
createLeafletObject(), keeps attributes and the live object in sync in both
directions, and re-fires every Leaflet event on the element. Components join
each other through a DOM-event registration protocol that bubbles up to
<leaflet-map> at the root — no component ever reads another component's
state or queries the DOM for its relatives. The build is tsc with no
bundler; Leaflet is always external.