paperlab 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -6
- package/dist/{chunk-HRXQTJFS.js → chunk-E22ILEDO.js} +2408 -486
- package/dist/chunk-E22ILEDO.js.map +1 -0
- package/dist/index.cjs +2365 -435
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +175 -29
- package/dist/index.d.ts +175 -29
- package/dist/index.js +20 -4
- package/dist/index.js.map +1 -1
- package/dist/slots-C5PqY0Q5.d.cts +2297 -0
- package/dist/slots-C5PqY0Q5.d.ts +2297 -0
- package/dist/stage.cjs +2358 -449
- package/dist/stage.cjs.map +1 -1
- package/dist/stage.d.cts +78 -636
- package/dist/stage.d.ts +78 -636
- package/dist/stage.js +11 -11
- package/dist/stage.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-HRXQTJFS.js.map +0 -1
- package/dist/slots-CIo7FnlY.d.cts +0 -13357
- package/dist/slots-CIo7FnlY.d.ts +0 -13357
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
A hero image that peels, a receipt that unrolls, a letter that folds, a poster rippling in wind, a gallery ring of prints. A sheet is real 3D geometry, not a CSS trick and not a video — content is a texture on a mesh that genuinely bends, so text and imagery curl with perfect continuity.
|
|
10
10
|
|
|
11
|
-
**[Try it →](https://paperlab.nawwara.studio/)** · [the editor](https://paperlab.nawwara.studio/editor/) (desktop) · [the reference](https://paperlab.nawwara.studio/docs/) · [for coding agents](https://github.com/NourMtir0722/Paperlab/blob/main/AGENTS.md)
|
|
11
|
+
**[Try it →](https://paperlab.nawwara.studio/)** · [the editor](https://paperlab.nawwara.studio/editor/) (desktop) · [the reference](https://paperlab.nawwara.studio/docs/) · [with your hands](https://paperlab.nawwara.studio/hands/) (webcam) · [for coding agents](https://github.com/NourMtir0722/Paperlab/blob/main/AGENTS.md)
|
|
12
12
|
|
|
13
13
|
| | |
|
|
14
14
|
|---|---|
|
|
@@ -98,6 +98,16 @@ Underneath them are seven **deformers** — `roll`, `curl`, `bend`, `fold`, `wav
|
|
|
98
98
|
|
|
99
99
|
One sheet of words, seven papers. Stock is not a colour swap: thermal takes on banding, newsprint takes grain, vellum goes translucent and lets the light through it. On top of stock sit composable surface effects — grain, torn deckle edges, crease lines, perforation, aging — as shader chunks. Alpha-affecting effects use `alphaTest` rather than blending, so shadows stay correct.
|
|
100
100
|
|
|
101
|
+
### Memory — the paper keeps what you do to it
|
|
102
|
+
|
|
103
|
+
Paper is plastic where cloth is elastic. Every deformer here is a pure function of its options, so a sheet folded to 180° and back to 0° used to come out pristine — right for cloth, wrong for the one material this library models. Now it creases.
|
|
104
|
+
|
|
105
|
+
A fold that closes past 45° at a line that stays put leaves a crease behind at `peak × set`, where `set` is how much that paper keeps: kraft holds one hard, vellum springs back. A fold whose line *travels* leaves nothing, which is why paper coming off a roll is bent at the floor rather than creased along it. Creases bend the sheet as well as marking it, they can be handed to a paper that was never folded (a letter that arrives having been folded once), and they serialize — into a preset, and down a share link.
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
<Paper preset="letter-fold" memory={{ set: 0.6 }} onCrease={save} />
|
|
109
|
+
```
|
|
110
|
+
|
|
101
111
|
### Layouts — 12
|
|
102
112
|
|
|
103
113
|

|
|
@@ -144,7 +154,7 @@ And it is navigable rather than a video. It drifts on its own until you touch it
|
|
|
144
154
|
- **Physics** — curated idle motion (`float`, `tumble`, `dangle`, `taped`, `breeze`) that composes with behaviors, and a verlet **cloth** mode: pin the top edge, add wind, grab the sheet and pull. Cloth and behaviors are mutually exclusive by schema — cloth owns the vertices.
|
|
145
155
|
- **Interaction states** — a preset can carry `states`: overrides-on-base diffs keyed `rest` / `hover` / `pressed` / `picked` / `placed`, with the triggers built in. Drag a stamp past its threshold and it tears off its sheet (the perforation edges facing its neighbours flip to torn), release it over a `<DropZone>` and it settles, release it anywhere else and it flutters home. The whole flow is reachable from the keyboard: focus a paper, Enter picks, arrows move between zones, Enter places, Escape returns it.
|
|
146
156
|
- **Hardware that holds the paper up** — thread to the ceiling or a rod across the top edge, gripped by a clip or a peg. A hung thing that shows what holds it stops reading as a rectangle that happens to float.
|
|
147
|
-
- **Presets** —
|
|
157
|
+
- **Presets** — 18 paper presets and 6 stage presets, and everything serializes to `.paper` JSON validated by a zod schema. Diffable, forkable, shareable.
|
|
148
158
|
- **Agent-first export** — the editor's **Copy for AI** button produces a self-contained brief you paste into a coding agent: install line, inlined component, placement contract, and a verification step the agent can self-check. See [AGENTS.md](https://github.com/NourMtir0722/Paperlab/blob/main/AGENTS.md) and [docs/llms.txt](https://github.com/NourMtir0722/Paperlab/blob/main/docs/llms.txt).
|
|
149
159
|
- **Accessible by default** — `prefers-reduced-motion` freezes behaviors at their pose and disables physics and entrances, a hidden DOM mirror carries the content for screen readers and find-in-page, and a flat DOM fallback renders when WebGL isn't available.
|
|
150
160
|
|
|
@@ -179,7 +189,7 @@ That's the whole loop: **make → send → remix → ship.** If you'd rather you
|
|
|
179
189
|
|
|
180
190
|
## The apps
|
|
181
191
|
|
|
182
|
-
|
|
192
|
+
Four surfaces ship alongside the library, all built on its public API only.
|
|
183
193
|
|
|
184
194
|
**[The playground](https://paperlab.nawwara.studio/playground/)** — one input, one scene, shareable by link. Type a sentence and it builds you a room out of it. Built for a phone.
|
|
185
195
|
|
|
@@ -195,6 +205,10 @@ Field mode composes galleries against the same panel — swap the layout, watch
|
|
|
195
205
|
|
|
196
206
|
**[The reference](https://paperlab.nawwara.studio/docs/)** — the whole catalogue with every behavior, deformer, layout, stock and surface rendering live. The catalogue is generated from the registries, so it cannot advertise something the library doesn't have.
|
|
197
207
|
|
|
208
|
+
**[Your hands](https://paperlab.nawwara.studio/hands/)** — the same paper, driven by a webcam instead of a mouse. Pinch to take hold and pull, point to score a line, make a fist to fold along it, turn your palm to change the stock, flick paint at it, blow at it to raise the wind, pull an edge to tear it. Every gesture lands on a feature the library already ships — the page is a hundred percent public API, and `packages/paperlab` doesn't know it exists.
|
|
209
|
+
|
|
210
|
+
The tracking is [MediaPipe](https://ai.google.dev/edge/mediapipe) (`@mediapipe/tasks-vision`, Apache-2.0) and it runs entirely in your browser: the models download from Google once, and after that no video and no measurement taken from it leaves the device. There is no server to send it to, and a `connect-src` CSP on the page makes that enforceable rather than a promise — including against MediaPipe's own usage telemetry, which the page blocks. Needs a camera, and asks before it takes one.
|
|
211
|
+
|
|
198
212
|
## Development
|
|
199
213
|
|
|
200
214
|
pnpm + Turborepo, Node 22, [Biome](https://biomejs.dev) for lint and format.
|
|
@@ -207,7 +221,7 @@ pnpm dev # the editor at localhost:5173
|
|
|
207
221
|
| | |
|
|
208
222
|
|---|---|
|
|
209
223
|
| [`packages/paperlab`](https://github.com/NourMtir0722/Paperlab/blob/main/packages/paperlab/) | the npm library — the only published artifact |
|
|
210
|
-
| [`apps/editor`](https://github.com/NourMtir0722/Paperlab/blob/main/apps/editor/) | the editor — every knob, and the export |
|
|
224
|
+
| [`apps/editor`](https://github.com/NourMtir0722/Paperlab/blob/main/apps/editor/) | the editor — every knob, and the export. Also the `/hands` page, built from the same app in a second pass |
|
|
211
225
|
| [`apps/playground`](https://github.com/NourMtir0722/Paperlab/blob/main/apps/playground/) | the playground — one input, one scene, shareable by link |
|
|
212
226
|
| [`apps/docs`](https://github.com/NourMtir0722/Paperlab/blob/main/apps/docs/) | the reference site, with every behavior running live |
|
|
213
227
|
| [`tools/`](https://github.com/NourMtir0722/Paperlab/blob/main/tools/) | browser harnesses — parity, perf, screenshots, the README's motion |
|
|
@@ -222,14 +236,15 @@ pnpm test:parity # 37 golden-vector cases: every deformer's GLSL twin vs its
|
|
|
222
236
|
pnpm test:drive # the stage really walks when you drag, wheel or arrow it
|
|
223
237
|
pnpm test:share # sculpt → link → a browser that has never seen the paper
|
|
224
238
|
pnpm test:dropdown # every dropdown option is reachable, including below the fold
|
|
225
|
-
pnpm test:route # the site root
|
|
239
|
+
pnpm test:route # the site root routes by device, and links every route it deploys
|
|
240
|
+
pnpm test:hands # scripted gestures really reach the paper (needs a camera-less Chromium)
|
|
226
241
|
pnpm typecheck
|
|
227
242
|
pnpm lint
|
|
228
243
|
pnpm knip # dead code and unused exports
|
|
229
244
|
pnpm build
|
|
230
245
|
```
|
|
231
246
|
|
|
232
|
-
Anything that needs a real GPU, real pointer events or a second browser profile is a browser harness in `tools/` rather than a unit test. All
|
|
247
|
+
Anything that needs a real GPU, real pointer events or a second browser profile is a browser harness in `tools/` rather than a unit test. All of them but `test:hands` are CI gates, along with `publint` and `are-the-types-wrong` on the published package. `test:hands` runs in [its own workflow](https://github.com/NourMtir0722/Paperlab/blob/main/.github/workflows/hands.yml) instead — on the paths that can break it, and weekly — because it fetches its models from Google and a required gate would let someone else's CDN block every unrelated PR. A red X you have to read, rather than a veto.
|
|
233
248
|
|
|
234
249
|
### Measurement
|
|
235
250
|
|