A short story
Once there was a parrot who loved words. It read every page it could find, out loud, hopping from word to word so nobody lost their place.
Pals that step out of the page, do real interface jobs, or turn your site into a game.
pal="polly"Reads your page aloud, hopping along each word as it is spoken.
Once there was a parrot who loved words. It read every page it could find, out loud, hopping from word to word so nobody lost their place.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <button id="listen">Listen</button> <article> <piix-pal pal="polly" button="#listen"></piix-pal> <h1>My post</h1> <p>…</p> </article>
<!-- just polly (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/polly.min.js"></script> <button id="listen">Listen</button> <article> <piix-pal pal="polly" button="#listen"></piix-pal> <h1>My post</h1> <p>…</p> </article>
<!-- attaches itself to the first article: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/polly.min.js" data-pals="polly@article"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/polly.min.js");
Piixpal.add("polly", "article");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="polly" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/polly.json
import { Polly } from "@/components/piixpal/polly";
<h1>
Hello
<Polly />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="polly" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="polly"></piix-pal></h1>
onbuttonratepitchvoiceAPIel.ctl.read() el.ctl.pause() el.ctl.stop()eventspal="gist"An owl that sums up your article in a few key points.
Websites got very serious. Every page looks like every other page. Pixel pals give a site a little life without getting in the way. They never block a click and they stay out of the way of screen readers. They are small, free and made for anyone.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <article> <piix-pal pal="gist"></piix-pal> <h1>My long post</h1> <p>…</p> </article>
<!-- just gist (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/gist.min.js"></script> <article> <piix-pal pal="gist"></piix-pal> <h1>My long post</h1> <p>…</p> </article>
<!-- attaches itself to the first article: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/gist.min.js" data-pals="gist@article"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/gist.min.js");
Piixpal.add("gist", "article");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="gist" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/gist.json
import { Gist } from "@/components/piixpal/gist";
<h1>
Hello
<Gist />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="gist" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="gist"></piix-pal></h1>
onpointsbuttonAPIel.ctl.summarize()eventspal="tabby"A cat that lives in your browser tab’s icon and naps while you’re away.
<!-- once, anywhere on the page -->
<script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script>
<footer>
<piix-pal pal="tabby" progress
away="Come back! Tabby misses you"></piix-pal>
</footer>
<!-- just tabby (the shared engine loads itself, once) -->
<script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/tabby.min.js"></script>
<footer>
<piix-pal pal="tabby" progress
away="Come back! Tabby misses you"></piix-pal>
</footer>
<!-- attaches itself to the first footer: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/tabby.min.js" data-pals="tabby@footer"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/tabby.min.js");
Piixpal.add("tabby", "footer");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="tabby" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/tabby.json
import { Tabby } from "@/components/piixpal/tabby";
<h1>
Hello
<Tabby />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="tabby" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="tabby"></piix-pal></h1>
awayprogresspreviewpal="sprout"A focus-timer plant that pops out into its own always-on-top window.
A focus timer that grows. Click the plant.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <footer> <piix-pal pal="sprout" minutes="25" break="5"></piix-pal> </footer>
<!-- just sprout (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/sprout.min.js"></script> <footer> <piix-pal pal="sprout" minutes="25" break="5"></piix-pal> </footer>
<!-- attaches itself to the first footer: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/sprout.min.js" data-pals="sprout@footer"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/sprout.min.js");
Piixpal.add("sprout", "footer");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="sprout" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/sprout.json
import { Sprout } from "@/components/piixpal/sprout";
<h1>
Hello
<Sprout />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="sprout" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="sprout"></piix-pal></h1>
minutesbreakAPIel.ctl.open() el.ctl.popout()eventspal="nomad"A little traveller who walks between your browser windows.
Nomad walks out of this box and into the other window, then back again.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <!-- on every page of your site --> <piix-pal pal="nomad"></piix-pal>
<!-- just nomad (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/nomad.min.js"></script> <!-- on every page of your site --> <piix-pal pal="nomad"></piix-pal>
<!-- attaches itself to the first body: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/nomad.min.js" data-pals="nomad@body"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/nomad.min.js");
Piixpal.add("nomad", "body");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="nomad" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/nomad.json
import { Nomad } from "@/components/piixpal/nomad";
<h1>
Hello
<Nomad />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="nomad" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="nomad"></piix-pal></h1>
windowAPIel.ctl.invite()eventspal="bulb"A pull-chain light switch for dark mode.
Lights?
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <!-- anywhere: it hangs from the top of the screen --> <piix-pal pal="bulb" toggle="data-theme:dark|light"></piix-pal>
<!-- just bulb (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/bulb.min.js"></script> <!-- anywhere: it hangs from the top of the screen --> <piix-pal pal="bulb" toggle="data-theme:dark|light"></piix-pal>
<!-- attaches itself to the first body: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/bulb.min.js" data-pals="bulb@body"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/bulb.min.js");
Piixpal.add("bulb", "body");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="bulb" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/bulb.json
import { Bulb } from "@/components/piixpal/bulb";
<h1>
Hello
<Bulb />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="bulb" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="bulb"></piix-pal></h1>
toggleclass:dark (default) or an attribute cycle like data-theme:dark|light; the first value is lights-offtargetatlengthtopeventspal="pidge"Toast notifications, delivered by pigeon.
<!-- once, anywhere on the page -->
<script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/pidge.min.js"></script>
<script>
Piixpal.toast("Saved!", { type: "ok" });
</script>
<!-- just pidge (the shared engine loads itself, once) -->
<script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/pidge.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/pidge.min.js"></script>
<script>
Piixpal.toast("Saved!", { type: "ok" });
</script>
<!-- attaches itself to the first body: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/pidge.min.js" data-pals="pidge@body"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/pidge.min.js");
Piixpal.add("pidge", "body");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="pidge" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/pidge.json
import { Pidge } from "@/components/piixpal/pidge";
<h1>
Hello
<Pidge />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="pidge" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="pidge"></piix-pal></h1>
type{ type: "ok" | "error" | "info" }title{ title: "Mia" } a bold first linetime{ time: 6000 } ms on screen, 0 = until dismissed (default 4200)APIPiixpal.toast(msg, opts) el.ctl.toast(msg, opts) el.ctl.clear()pal="plane"A plane that tows your announcement banner across the page.
Banners are real links, so they work with keyboards and screen readers too.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <piix-pal pal="plane" text="v2 is out! Read the post →" href="/blog/v2"></piix-pal>
<!-- just plane (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/plane.min.js"></script> <piix-pal pal="plane" text="v2 is out! Read the post →" href="/blog/v2"></piix-pal>
<!-- attaches itself to the first body: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/plane.min.js" data-pals="plane@body"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/plane.min.js");
Piixpal.add("plane", "body");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="plane" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/plane.json
import { Plane } from "@/components/piixpal/plane";
<h1>
Hello
<Plane />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="plane" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="plane"></piix-pal></h1>
texthreftoprepeatalwaysAPIel.ctl.fly()pal="fetch"A dog that runs off on every fetch() and brings back the response.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <footer> … <piix-pal pal="fetch" match="/api/"></piix-pal> </footer>
<!-- just fetch (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/fetch.min.js"></script> <footer> … <piix-pal pal="fetch" match="/api/"></piix-pal> </footer>
<!-- attaches itself to the first footer: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/fetch.min.js" data-pals="fetch@footer"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/fetch.min.js");
Piixpal.add("fetch", "footer");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="fetch" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/fetch.json
import { Fetch } from "@/components/piixpal/fetch";
<h1>
Hello
<Fetch />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="fetch" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="fetch"></piix-pal></h1>
match/api/atAPIPiixpal.busy(promise)pal="scout"Onboarding tours, guided by a tiny explorer.
Click Scout to take the tour.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <button data-tour="Start a new project here">New</button> <input data-tour="Search everything"> <header> <piix-pal pal="scout"></piix-pal> </header>
<!-- just scout (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/scout.min.js"></script> <button data-tour="Start a new project here">New</button> <input data-tour="Search everything"> <header> <piix-pal pal="scout"></piix-pal> </header>
<!-- attaches itself to the first header: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/scout.min.js" data-pals="scout@header"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/scout.min.js");
Piixpal.add("scout", "header");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="scout" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/scout.json
import { Scout } from "@/components/piixpal/scout";
<h1>
Hello
<Scout />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="scout" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="scout"></piix-pal></h1>
data-tourdata-tour-step to order, data-tour-title for a heading)steps#new: Start here | #search: Find anythingstartAPIel.ctl.start(steps?) el.ctl.next() el.ctl.back() el.ctl.end()eventspal="drone"Flies the product picture into your cart when someone adds to cart.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <a id="cart">Cart <b class="count">0</b></a> <article data-product> <img src="tee.png" alt="Pixel tee"> <button class="add-to-cart">Add to cart</button> </article> <piix-pal pal="drone" on="#cart"></piix-pal>
<!-- just drone (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/drone.min.js"></script> <a id="cart">Cart <b class="count">0</b></a> <article data-product> <img src="tee.png" alt="Pixel tee"> <button class="add-to-cart">Add to cart</button> </article> <piix-pal pal="drone" on="#cart"></piix-pal>
<!-- attaches itself to the first #cart: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/drone.min.js" data-pals="drone@#cart"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/drone.min.js");
Piixpal.add("drone", "#cart");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="drone" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/drone.json
import { Drone } from "@/components/piixpal/drone";
<h1>
Hello
<Drone />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="drone" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="drone"></piix-pal></h1>
onfrom.add-to-cart, [data-add-to-cart])count.count, [data-count])eventspal="crumb"A mouse that eats your cookie banner when someone accepts or rejects.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <div id="cookie-banner"> We use cookies… <button>Accept</button> <button>Reject</button> <piix-pal pal="crumb"></piix-pal> </div>
<!-- just crumb (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/crumb.min.js"></script> <div id="cookie-banner"> We use cookies… <button>Accept</button> <button>Reject</button> <piix-pal pal="crumb"></piix-pal> </div>
<!-- attaches itself to the first #cookie-banner: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/crumb.min.js" data-pals="crumb@#cookie-banner"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/crumb.min.js");
Piixpal.add("crumb", "#cookie-banner");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="crumb" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/crumb.json
import { Crumb } from "@/components/piixpal/crumb";
<h1>
Hello
<Crumb />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="crumb" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="crumb"></piix-pal></h1>
onatevents<piix-avatar>A unique animated pixel avatar for any name.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <div class="comment"> <piix-avatar seed="mia" size="40"></piix-avatar> <p><b>mia</b> Hello!</p> </div>
<!-- just avatar (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/avatar.min.js"></script> <div class="comment"> <piix-avatar seed="mia" size="40"></piix-avatar> <p><b>mia</b> Hello!</p> </div>
<script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/avatar.min.js" data-pals="avatar@.comment?seed=someone"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/avatar.min.js");
Piixpal.add("avatar", ".comment", {seed: "someone"});
// npm install piixpal
import { PiixAvatar } from "piixpal/react";
<PiixAvatar />
npx shadcn@latest add https://piixpal.dvkk.dev/r/avatar.json
import { Avatar } from "@/components/piixpal/avatar";
<Avatar />
// main.js: app.use(Piixpal) from "piixpal/vue" <div class="comment"> <piix-avatar seed="mia" size="40"></piix-avatar> <p><b>mia</b> Hello!</p> </div>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <div class="comment"> <piix-avatar seed="mia" size="40"></piix-avatar> <p><b>mia</b> Hello!</p> </div>
seedsizerenderlookpal="buff"A password-strength meter that lifts heavier as the password gets stronger.
Choose a password:
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <label> Password <input type="password"> <piix-pal pal="buff"></piix-pal> </label>
<!-- just buff (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/buff.min.js"></script> <label> Password <input type="password"> <piix-pal pal="buff"></piix-pal> </label>
<!-- attaches itself to the first label: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/buff.min.js" data-pals="buff@label"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/buff.min.js");
Piixpal.add("buff", "label");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="buff" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/buff.json
import { Buff } from "@/components/piixpal/buff";
<h1>
Hello
<Buff />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="buff" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="buff"></piix-pal></h1>
onatAPIel.ctl.scoreeventspal="meh"A face that rides your rating slider, from furious to delighted.
How was your day?
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <label> How was it? <input type="range" min="0" max="10"> <piix-pal pal="meh"></piix-pal> </label>
<!-- just meh (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/meh.min.js"></script> <label> How was it? <input type="range" min="0" max="10"> <piix-pal pal="meh"></piix-pal> </label>
<!-- attaches itself to the first label: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/meh.min.js" data-pals="meh@label"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/meh.min.js");
Piixpal.add("meh", "label");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="meh" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/meh.json
import { Meh } from "@/components/piixpal/meh";
<h1>
Hello
<Meh />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="meh" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="meh"></piix-pal></h1>
oneventspal="squish"A marshmallow that gets squashed as the text nears its limit.
Write a very short bio:
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <label> Bio <textarea maxlength="140"></textarea> <piix-pal pal="squish"></piix-pal> </label>
<!-- just squish (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/squish.min.js"></script> <label> Bio <textarea maxlength="140"></textarea> <piix-pal pal="squish"></piix-pal> </label>
<!-- attaches itself to the first label: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/squish.min.js" data-pals="squish@label"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/squish.min.js");
Piixpal.add("squish", "label");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="squish" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/squish.json
import { Squish } from "@/components/piixpal/squish";
<h1>
Hello
<Squish />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="squish" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="squish"></piix-pal></h1>
onlimiteventspal="gulp"A pelican that gulps down files dropped on your drop zone.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <div id="drop">Drop files here</div> <piix-pal pal="gulp" on="#drop" accept></piix-pal>
<!-- just gulp (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/gulp.min.js"></script> <div id="drop">Drop files here</div> <piix-pal pal="gulp" on="#drop" accept></piix-pal>
<!-- attaches itself to the first #drop: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/gulp.min.js" data-pals="gulp@#drop"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/gulp.min.js");
Piixpal.add("gulp", "#drop");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="gulp" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/gulp.json
import { Gulp } from "@/components/piixpal/gulp";
<h1>
Hello
<Gulp />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="gulp" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="gulp"></piix-pal></h1>
onacceptateventspal="plug"Shows up when the connection drops, plugs back in when it returns.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <!-- anywhere: it waits in the corner --> <piix-pal pal="plug"></piix-pal>
<!-- just plug (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/plug.min.js"></script> <!-- anywhere: it waits in the corner --> <piix-pal pal="plug"></piix-pal>
<!-- attaches itself to the first body: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/plug.min.js" data-pals="plug@body"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/plug.min.js");
Piixpal.add("plug", "body");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="plug" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/plug.json
import { Plug } from "@/components/piixpal/plug";
<h1>
Hello
<Plug />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="plug" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="plug"></piix-pal></h1>
alwaysAPIel.ctl.offline() el.ctl.online()eventspal="pix"A tiny hero that lets visitors play your page as a platformer.
Every line of text is a platform. Bump the buttons from below.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <h1> Welcome to my site <piix-pal pal="pix"></piix-pal> </h1>
<!-- just pix (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/pix.min.js"></script> <h1> Welcome to my site <piix-pal pal="pix"></piix-pal> </h1>
<!-- attaches itself to the first h1: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/pix.min.js" data-pals="pix@h1"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/pix.min.js");
Piixpal.add("pix", "h1");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="pix" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/pix.json
import { Pix } from "@/components/piixpal/pix";
<h1>
Hello
<Pix />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="pix" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="pix"></piix-pal></h1>
coinslandplayAPIel.ctl.start() el.ctl.stop()events<piix-weather>Snow that settles on your letters, plus rain, leaves and petals.
Let it snow
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <!-- the whole page --> <piix-weather kind="snow"></piix-weather> <!-- or just inside one element --> <header class="hero"> <h1>Happy holidays</h1> <piix-weather kind="snow" amount="2"></piix-weather> </header>
<!-- just weather (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/weather.min.js"></script> <!-- the whole page --> <piix-weather kind="snow"></piix-weather> <!-- or just inside one element --> <header class="hero"> <h1>Happy holidays</h1> <piix-weather kind="snow" amount="2"></piix-weather> </header>
<script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/weather.min.js" data-pals="weather@body?kind=snow"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/weather.min.js");
Piixpal.add("weather", "body", {kind: "snow"});
// npm install piixpal
import { PiixWeather } from "piixpal/react";
<PiixWeather />
npx shadcn@latest add https://piixpal.dvkk.dev/r/weather.json
import { Weather } from "@/components/piixpal/weather";
<Weather />
// main.js: app.use(Piixpal) from "piixpal/vue" <!-- the whole page --> <piix-weather kind="snow"></piix-weather> <!-- or just inside one element --> <header class="hero"> <h1>Happy holidays</h1> <piix-weather kind="snow" amount="2"></piix-weather> </header>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <!-- the whole page --> <piix-weather kind="snow"></piix-weather> <!-- or just inside one element --> <header class="hero"> <h1>Happy holidays</h1> <piix-weather kind="snow" amount="2"></piix-weather> </header>
kindamountlandboxAPIel.clear()pal="hatch"Every visitor hatches their own one-of-a-kind pet.
Tap the egg. What hatches is yours alone.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <footer> <piix-pal pal="hatch" visits="3"></piix-pal> </footer>
<!-- just hatch (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/hatch.min.js"></script> <footer> <piix-pal pal="hatch" visits="3"></piix-pal> </footer>
<!-- attaches itself to the first footer: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/hatch.min.js" data-pals="hatch@footer"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/hatch.min.js");
Piixpal.add("hatch", "footer");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="hatch" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/hatch.json
import { Hatch } from "@/components/piixpal/hatch";
<h1>
Hello
<Hatch />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="hatch" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="hatch"></piix-pal></h1>
visitsatAPIel.ctl.hatch() el.ctl.reset() el.ctl.nameeventspal="gem"A treasure hunt across your whole site.
Gems hide on headings, on lines of text, on buttons, anywhere.
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <!-- one per gem, on any pages you like --> <piix-pal pal="gem" hunt="launch" gem="1" total="5" reward="PIX10"></piix-pal>
<!-- just gem (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/gem.min.js"></script> <!-- one per gem, on any pages you like --> <piix-pal pal="gem" hunt="launch" gem="1" total="5" reward="PIX10"></piix-pal>
<!-- attaches itself to the first footer: nothing else to add --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/gem.min.js" data-pals="gem@footer"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/gem.min.js");
Piixpal.add("gem", "footer");
// npm install piixpal
import { PiixPal } from "piixpal/react";
<h1>
Hello
<PiixPal pal="gem" />
</h1>
npx shadcn@latest add https://piixpal.dvkk.dev/r/gem.json
import { Gem } from "@/components/piixpal/gem";
<h1>
Hello
<Gem />
</h1>
// main.js: app.use(Piixpal) from "piixpal/vue" <h1> Hello <piix-pal pal="gem" /> </h1>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <h1>Hello <piix-pal pal="gem"></piix-pal></h1>
huntgemtotalrewardcolorAPIel.ctl.reset()events<piix-stickers>A sheet of stickers visitors peel off and stick anywhere on your page.
Stick it here
<!-- once, anywhere on the page --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/piixpal.min.js"></script> <piix-stickers names="heart,star,bolt,mochi,ufo"></piix-stickers>
<!-- just stickers (the shared engine loads itself, once) --> <script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/stickers.min.js"></script> <piix-stickers names="heart,star,bolt,mochi,ufo"></piix-stickers>
<script src="https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/stickers.min.js" data-pals="stickers@footer"></script>
await import("https://cdn.jsdelivr.net/npm/piixpal@0.4/dist/c/stickers.min.js");
Piixpal.add("stickers", "footer");
// npm install piixpal
import { PiixStickers } from "piixpal/react";
<PiixStickers />
npx shadcn@latest add https://piixpal.dvkk.dev/r/stickers.json
import { Stickers } from "@/components/piixpal/stickers";
<Stickers />
// main.js: app.use(Piixpal) from "piixpal/vue" <piix-stickers names="heart,star,bolt,mochi,ufo"></piix-stickers>
<script>import Piixpal from "piixpal/svelte";</script> <Piixpal /> <piix-stickers names="heart,star,bolt,mochi,ufo"></piix-stickers>
namesboxAPIel.clear()
mia These little guys are so good.
sam Mine has horns!