{"_id":"@auriel/peppertino","_rev":"6-68c75c873f241f2517484ee7a2a44663","name":"@auriel/peppertino","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@auriel/peppertino","version":"0.1.0","license":"MIT","_id":"@auriel/peppertino@0.1.0","maintainers":[{"name":"auriel","email":"debadityamalakar@aol.com"}],"dist":{"shasum":"400dc69247a4afce09e2b0f17f84a341a41bb3cb","tarball":"https://registry.npmjs.org/@auriel/peppertino/-/peppertino-0.1.0.tgz","fileCount":15,"integrity":"sha512-vuAXS7Md6Kse6AE5rPfTGy5W78GzhTWiUaaQEWA0vcH657qbyK7R3bp8z7PzWIqz+/CyZqrIhFDVTT9YsHgwfQ==","signatures":[{"sig":"MEQCIEJBxoUWKX/hj+2xigLZXeJ5aKtclhoz1nVns0iy24K3AiBoamqD5sqq53lttldZcVGZ8B26gcfeT3YK2a4TfsaTqA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42592},"gitHead":"bdb8efefce7e6ae99ff3eea7c91976c04c3906e2","scripts":{"dev":"bun run build && concurrently \"bun run watch:css\" \"bun run watch:js\" \"bun run serve\"","build":"bun run build:css && bun run build:js","serve":"bunx --bun serve . --port 3000","build:js":"node build.js","watch:js":"node build.js --watch","build:css":"sass src/scss/main.scss dist/main.css --style=expanded --source-map","watch:css":"sass --watch src/scss/main.scss:dist/main.css --style=expanded --source-map","build:css:min":"sass src/scss/main.scss dist/main.min.css --style=compressed --no-source-map"},"_npmUser":{"name":"auriel","email":"debadityamalakar@aol.com"},"repository":{"url":"https://codeberg.org/debaditya/Peppertino","type":"git"},"_npmVersion":"11.8.0","description":"An Apple-inspired CSS framework with a spicy red accent. Clean geometry, restrained elegance, zero Cupertino lawsuits.","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"devDependencies":{"sass":"^1.89.0","serve":"^14.2.4","esbuild":"^0.25.4","concurrently":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/peppertino_0.1.0_1779865315583_0.7101850259338283","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@auriel/peppertino","version":"0.1.1","license":"MIT","_id":"@auriel/peppertino@0.1.1","maintainers":[{"name":"auriel","email":"debadityamalakar@aol.com"}],"dist":{"shasum":"4bd36c33214a62d4339f8a123dbd8f74c97e95e0","tarball":"https://registry.npmjs.org/@auriel/peppertino/-/peppertino-0.1.1.tgz","fileCount":15,"integrity":"sha512-hhtMiMc355WJeo2Fg30TuxtDhnWqVLIV0wUpETHkKejh1YT9Kghu+bsHqUmlvd6JFT47GmDpJpPBdaM1zE6PZg==","signatures":[{"sig":"MEQCIAwDz6Tj+ahwIOVMbi9kZk27cIaR7p8fU1XTcWM6cUqnAiAxb84OZ1613IoTKR1HCjwK26MTePI6WlHdF3F8NOsN4w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42589},"gitHead":"51bbf241a16c5f6412a8ced420d968dc2cb5ad44","scripts":{"dev":"bun run build && concurrently \"bun run watch:css\" \"bun run watch:js\" \"bun run serve\"","build":"bun run build:css && bun run build:js","serve":"bunx --bun serve . --port 3000","build:js":"node build.js","watch:js":"node build.js --watch","build:css":"sass src/scss/main.scss dist/main.css --style=expanded --source-map","watch:css":"sass --watch src/scss/main.scss:dist/main.css --style=expanded --source-map","build:css:min":"sass src/scss/main.scss dist/main.min.css --style=compressed --no-source-map"},"_npmUser":{"name":"auriel","email":"debadityamalakar@aol.com"},"repository":{"url":"https://codeberg.org/debaditya/Peppertino","type":"git"},"_npmVersion":"11.8.0","description":"An Apple-inspired CSS framework with a spicy red accent. Clean geometry, restrained elegance, zero Cupertino lawsuits.","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"devDependencies":{"sass":"^1.89.0","serve":"^14.2.4","esbuild":"^0.25.4","concurrently":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/peppertino_0.1.1_1779866552819_0.03659656865705685","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@auriel/peppertino","version":"0.2.0","license":"MIT","_id":"@auriel/peppertino@0.2.0","maintainers":[{"name":"auriel","email":"debadityamalakar@aol.com"}],"dist":{"shasum":"ce992cb4c63e45e3d855b41f63dc0179ab10ff2a","tarball":"https://registry.npmjs.org/@auriel/peppertino/-/peppertino-0.2.0.tgz","fileCount":37,"integrity":"sha512-D0xu1c2zcU/fTG6zFASMqtJ3/83Q7x5z9b/z3VIy0izw77y0WY6wytphxv8sVw5O3mdme7EiE96D171Vc+/y8g==","signatures":[{"sig":"MEUCIC6xeUGubWjHlzLTkfSUhIkmFL2gMtb49lYcZVEbtsdeAiEAmxkQsG4ztgaCuHmN6/F8n3A5ZLW0eKpCBEI+IaAqbzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186025},"gitHead":"c4343558eb1dfaf2e6f5a28a3114d456b90ac5e4","scripts":{"dev":"bun run build && concurrently \"bun run watch:css\" \"bun run watch:js\" \"bun run serve\"","build":"bun run build:css && bun run build:js","serve":"bunx --bun serve . --port 3000","build:js":"node build.js","watch:js":"node build.js --watch","build:css":"sass src/scss/main.scss dist/main.css --style=expanded --source-map","watch:css":"sass --watch src/scss/main.scss:dist/main.css --style=expanded --source-map","build:css:min":"sass src/scss/main.scss dist/main.min.css --style=compressed --no-source-map"},"_npmUser":{"name":"auriel","email":"debadityamalakar@aol.com"},"repository":{"url":"https://codeberg.org/debaditya/Peppertino","type":"git"},"_npmVersion":"11.8.0","description":"An Apple-inspired CSS framework with a spicy red accent. Clean geometry, restrained elegance, zero Cupertino lawsuits.","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"devDependencies":{"sass":"^1.89.0","serve":"^14.2.4","esbuild":"^0.25.4","concurrently":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/peppertino_0.2.0_1780284003742_0.5405074906581415","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@auriel/peppertino","version":"0.3.0","license":"MIT","_id":"@auriel/peppertino@0.3.0","maintainers":[{"name":"auriel","email":"debadityamalakar@aol.com"}],"dist":{"shasum":"40fce0824e17a15a33857222c5d2ffbb9c72bb43","tarball":"https://registry.npmjs.org/@auriel/peppertino/-/peppertino-0.3.0.tgz","fileCount":50,"integrity":"sha512-cvmXygR8rbGgzZXwrC98POKZUJVNG+n2sH1eBKDsgJ/CGCAFSm32rRwoFnuUV0V7xQzSv7YzcWLwPELt5fVzxw==","signatures":[{"sig":"MEYCIQC23WfD0dkfNqpGlzVMgioyKYkKNMuziIi5elo75cjnVgIhAOIQ50FyH16bQWLrQ3TfTDdsLsSjUPVLR3eBRk8+wMrV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":436275},"gitHead":"bf77fed0e1b3727b5aed2fb35fab3688dac90fa6","scripts":{"dev":"bun run build && concurrently \"bun run watch:css\" \"bun run watch:js\" \"bun run serve\"","build":"bun run build:css && bun run build:js","serve":"bunx --bun serve . --port 3000","build:js":"node build.js","watch:js":"node build.js --watch","build:css":"sass src/scss/main.scss dist/main.css --style=expanded --source-map","watch:css":"sass --watch src/scss/main.scss:dist/main.css --style=expanded --source-map","build:css:min":"sass src/scss/main.scss dist/main.min.css --style=compressed --no-source-map"},"_npmUser":{"name":"auriel","email":"debadityamalakar@aol.com"},"repository":{"url":"https://codeberg.org/debaditya/Peppertino","type":"git"},"_npmVersion":"11.8.0","description":"An Apple-inspired CSS framework with a spicy red accent. Clean geometry, restrained elegance, zero Cupertino lawsuits.","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"devDependencies":{"sass":"^1.89.0","serve":"^14.2.4","esbuild":"^0.25.4","concurrently":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/peppertino_0.3.0_1780662713996_0.3978072711819105","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@auriel/peppertino","version":"0.4.0","license":"MIT","_id":"@auriel/peppertino@0.4.0","maintainers":[{"name":"auriel","email":"debadityamalakar@aol.com"}],"dist":{"shasum":"f1f7fa95084cefcb404ce48f64758151bbc87c28","tarball":"https://registry.npmjs.org/@auriel/peppertino/-/peppertino-0.4.0.tgz","fileCount":57,"integrity":"sha512-6DkGBYD8NaXsRvOV/IhjC2DFHQHQ5WJny+kGSWSKIyZRPMQuGZkd7BqLcgNe8yKdQNJPnWlaghVVVPVAaiM3NQ==","signatures":[{"sig":"MEQCIH6SNZvsayGNffZ94YUesnsH0o572RDsExhYoYV0Ipq+AiB72A/He2u5LTeAf5lSa1Q/3HZjQ/V6zn48vKJj7pHcow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":596829},"gitHead":"72bc71db66ad0f3c379c21adc2a82d33ca6c5d2e","scripts":{"dev":"bun run build && concurrently \"bun run watch:css\" \"bun run watch:js\" \"bun run serve\"","build":"bun run build:css && bun run build:js","serve":"bunx --bun serve . --port 3000","build:js":"node build.js","watch:js":"node build.js --watch","build:css":"sass src/scss/main.scss dist/main.css --style=expanded --source-map","watch:css":"sass --watch src/scss/main.scss:dist/main.css --style=expanded --source-map","build:css:min":"sass src/scss/main.scss dist/main.min.css --style=compressed --no-source-map"},"_npmUser":{"name":"auriel","email":"debadityamalakar@aol.com"},"repository":{"url":"https://codeberg.org/debaditya/Peppertino","type":"git"},"_npmVersion":"11.8.0","description":"An Apple-inspired CSS framework with a spicy red accent. Clean geometry, restrained elegance, zero Cupertino lawsuits.","directories":{},"_nodeVersion":"22.20.0","_hasShrinkwrap":false,"devDependencies":{"sass":"^1.89.0","serve":"^14.2.4","esbuild":"^0.25.4","concurrently":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/peppertino_0.4.0_1781122115328_0.20132272896083503","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@auriel/peppertino","version":"0.5.0","description":"An Apple-inspired CSS framework with a spicy red accent. Clean geometry, restrained elegance, zero Cupertino lawsuits.","repository":{"type":"git","url":"https://codeberg.org/debaditya/Peppertino"},"license":"MIT","scripts":{"build:css":"sass src/scss/main.scss dist/main.css --style=expanded --source-map","build:css:min":"sass src/scss/main.scss dist/main.min.css --style=compressed --no-source-map","build:js":"bun build.js","lint:colors":"bun scripts/lint-colors.mjs","lint:bem":"bun scripts/lint-bem.mjs","build":"bun run build:css && bun run build:js && bun run lint:colors && bun run lint:bem","watch:css":"sass --watch src/scss/main.scss:dist/main.css --style=expanded --source-map","watch:js":"bun build.js --watch","serve":"bunx --bun serve . --port 3000","dev":"bun run build && concurrently \"bun run watch:css\" \"bun run watch:js\" \"bun run serve\""},"devDependencies":{"concurrently":"^9.1.2","esbuild":"^0.25.4","sass":"^1.89.0","serve":"^14.2.4"},"gitHead":"72bc71db66ad0f3c379c21adc2a82d33ca6c5d2e","_id":"@auriel/peppertino@0.5.0","_nodeVersion":"24.16.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-XsmBFgayqJSVG+Kb0GjtdGuqtsu59DMJak2AxZr7pnetPq0BJ/FlIqAXpwyna+T+KcUSze9F4kZqcgPfAD88WA==","shasum":"e90f27803cb07e0f6f5a92bd382393cd3cc31a9a","tarball":"https://registry.npmjs.org/@auriel/peppertino/-/peppertino-0.5.0.tgz","fileCount":77,"unpackedSize":746905,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCpNXaZnJkF7Y5q2Y69e4f4UdXeCj2QLH4eD8QveZLs7wIgCItEwDDYyuNKfr5SORSJCg3zknU0XGBl90ctsaMH25s="}]},"_npmUser":{"name":"auriel","email":"debadityamalakar@aol.com"},"directories":{},"maintainers":[{"name":"auriel","email":"debadityamalakar@aol.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/peppertino_0.5.0_1781831391307_0.5968476308127451"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-27T07:01:55.383Z","modified":"2026-06-19T01:09:51.581Z","0.1.0":"2026-05-27T07:01:55.717Z","0.1.1":"2026-05-27T07:22:32.954Z","0.2.0":"2026-06-01T03:20:03.885Z","0.3.0":"2026-06-05T12:31:54.144Z","0.4.0":"2026-06-10T20:08:35.463Z","0.5.0":"2026-06-19T01:09:51.467Z"},"license":"MIT","repository":{"type":"git","url":"https://codeberg.org/debaditya/Peppertino"},"description":"An Apple-inspired CSS framework with a spicy red accent. Clean geometry, restrained elegance, zero Cupertino lawsuits.","maintainers":[{"name":"auriel","email":"debadityamalakar@aol.com"}],"readme":"﻿# PeppertinoCSS — An Apple-inspired CSS framework with a little spice.\n\nPeppertinoCSS is an Apple-inspired CSS framework built with SCSS, featuring the clean geometry and restrained elegance of Cupertino design — but with a spicy red accent instead of blue, because we're not Apple and we're not pretending to be.\n\n---\n\n## Getting started\n\n```bash\nbun add @auriel/peppertino\n```\n\nCDN — stylesheet only:\n\n```html\n<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@auriel/peppertino@latest/dist/main.min.css\" />\n```\n\nCDN — with JS components:\n\n```html\n<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@auriel/peppertino@latest/dist/main.min.css\" />\n<script src=\"https://cdn.jsdelivr.net/npm/@auriel/peppertino@latest/dist/peppertino.js\" defer></script>\n```\n\nSCSS import into your own build:\n\n```scss\n@use '@auriel/peppertino/src/scss/main';\n```\n\nClone and build locally:\n\n```bash\ngit clone https://codeberg.org/debaditya/Peppertino\ncd Peppertino\nbun install\nbun run dev\n```\n\nThen open `http://localhost:3000` in your browser.\n\n---\n\n## Build scripts\n\n| Command | Description |\n|---|---|\n| `bun run build` | Compile SCSS + JS to `dist/`, then run both linters |\n| `bun run build:css` | SCSS only, expanded with sourcemap |\n| `bun run build:css:min` | SCSS minified, no sourcemap |\n| `bun run build:js` | Bundle all `src/js/` components via esbuild |\n| `bun run lint:colors` | Fail if any component SCSS uses literal hex/SCSS color vars |\n| `bun run lint:bem` | Fail if any `.pp-*` class in `dist/main.css` violates BEM |\n| `bun run watch:css` | Watch and recompile SCSS on save |\n| `bun run watch:js` | Watch and rebundle JS on save |\n| `bun run serve` | Serve project on `http://localhost:3000` |\n| `bun run dev` | Build + watch CSS/JS + serve, all in parallel |\n\n---\n\n## Claude Code skill\n\nThe `agents/` directory ships a Claude Code skill that gives AI agents per-component reference documentation covering classes, variants, ARIA requirements, and JS APIs.\n\n### Install (project-level)\n\nCopy the skill into your project's Claude skills directory:\n\n```bash\ncp -r agents/peppertino .claude/skills/peppertino\n```\n\nThen invoke it in Claude Code:\n\n```\n/peppertino\n```\n\n### Install (user-level — available in all projects)\n\n```bash\ncp -r agents/peppertino ~/.claude/skills/peppertino\n```\n\n### What the skill contains\n\n| File | Covers |\n|---|---|\n| `skill.md` | Index, ARIA/WCAG requirements, conventions |\n| `base.md` | Design tokens, spacing, breakpoints, mixins |\n| `badge.md` | Badge variants, sizes, dot indicator |\n| `button.md` | All button variants |\n| `card.md` | Card parts, variants, grid |\n| `carousel.md` | Carousel markup, API, keyboard |\n| `footer.md` | Footer columns, social links |\n| `forms-fieldset.md` | Fieldset & legend |\n| `forms-form-instructions.md` | Pre-form instructions, hints |\n| `forms-label.md` | Label tiers, scale, icon row |\n| `forms-text-field.md` | Field wrapper, input, hint, validation |\n| `forms-validation.md` | Summary, confirmation checkbox, `ppValidation` API |\n| `gradient.md` | Gradient text |\n| `header.md` | Header, nav, dropdown, mobile drawer |\n| `modal.md` | Modal, actions, `ppModal` API |\n| `section.md` | Section variants, scrollbar |\n| `select.md` | Native select, custom dropdown |\n| `switch.md` | Toggle switch, sizes, `ppSwitch` events |\n| `table.md` | Table, column helpers |\n| `tabs.md` | Tabs, variants, keyboard nav |\n| `toast.md` | Toast positions, variants, `ppToast` API |\n| `tooltip.md` | Tooltip placements, CSS-only usage |\n| `typography.md` | All typography utility classes |\n\nThe skill's `skill.md` enforces ARIA and WCAG AA compliance rules and instructs the agent to fetch authoritative specs from w3.org when uncertain.\n\n---\n\n## What's inside\n\n### SCSS modules (`src/scss/`)\n\n| File | Purpose |\n|---|---|\n| `reset.scss` | Opinionated modern reset |\n| `base.scss` | Design tokens, CSS custom properties, helper functions, base element styles |\n| `accordion.scss` | `.pp-accordion` — collapsible panels; variants: `--flush`, `--dark`, `--primary` |\n| `alert.scss` | `.pp-alert` — inline feedback; variants: `--info/success/warning/error/primary/neutral`, `--filled` |\n| `badge.scss` | `.pp-badge` — pill badges; variants: `--primary/success/warning/error/info`, `--filled`, sizes `--sm/lg`, `--dot` |\n| `button.scss` | `.pp-button`, `.pp-button--outline`, semantic variants |\n| `card.scss` | `.pp-card` and variants |\n| `carousel.scss` | `.pp-carousel` — CSS scroll-snap carousel |\n| `dark-mode.scss` | `.dark` overrides for all `--pp-*` tokens — applied last |\n| `footer.scss` | `.pp-footer` — multi-column footer |\n| `forms.scss` | Aggregator for all form partials |\n| `forms/fieldset.scss` | `.pp-fieldset` + `.pp-legend` |\n| `forms/form-instructions.scss` | `.pp-form-instructions`, `.pp-form-hint` |\n| `forms/label.scss` | `.pp-label` — Apple HIG four-tier label system |\n| `forms/text-field.scss` | `.pp-field` — labelled input/textarea with validation states |\n| `forms/validation.scss` | `.pp-validation-summary`, `.pp-confirm`, `.pp-field--validate` |\n| `gradient.scss` | `.pp-gradient-text` |\n| `header.scss` | `.pp-header` — glassmorphism sticky header |\n| `modal.scss` | `.pp-modal-backdrop` + `.pp-modal` — glassmorphic modals |\n| `section.scss` | `.pp-section` — full-viewport sections + custom scrollbar |\n| `select.scss` | Native `<select>` restyling + `.pp-select` custom dropdown |\n| `switch.scss` | `.pp-switch` — iOS-style toggle; sizes `--sm/lg` |\n| `table.scss` | `.pp-table` — clean Apple-style data tables |\n| `tabs.scss` | `.pp-tabs` — pill-style tabs with icon + label |\n| `toast.scss` | `.pp-toast-container` + `.pp-toast` — auto-dismiss notifications |\n| `tooltip.scss` | `.pp-tooltip` — CSS-only tooltip; placements `--top/bottom/left/right` |\n| `typography.scss` | Utility classes for font, size, weight, spacing |\n| `utilities.scss` | Single-purpose layout/spacing/display/visibility classes |\n\n### JS components (`src/js/`)\n\nEach file is a self-contained IIFE. Import only what you need, or include `peppertino.js` for everything.\n\n| File | Purpose |\n|---|---|\n| `accordion.js` | `aria-expanded`/`aria-hidden`, keyboard nav (↑ ↓ Home End), `data-allow-multiple`; `ppAccordion.get(ref)` API |\n| `alert.js` | `data-alert-dismiss` wiring; `window.ppAlert.dismiss(idOrEl)` |\n| `carousel.js` | ARIA wiring, IntersectionObserver sync, `ppCarousel` API |\n| `header.js` | Mobile drawer, dropdown ARIA wiring for `.pp-header` |\n| `modal.js` | Open/close, focus trap, focus restore, ARIA for `.pp-modal` |\n| `select.js` | Keyboard nav, ARIA listbox/option for `.pp-select` |\n| `switch.js` | `aria-checked` toggle, Space key, `pp:switch:change` event |\n| `tabs.js` | Click + arrow key activation, ARIA tablist; `ppTabs.get(ref).activate(index)` |\n| `theme.js` | `window.ppTheme.set/get/toggle`; persists to `localStorage`; `data-theme-toggle` wiring |\n| `toast.js` | `window.ppToast.show({ message, title, variant, duration, position })`; auto-dismiss |\n| `validation.js` | `aria-invalid` wiring, summary focus, `ppValidation` API |\n| `peppertino.js` | Aggregator — imports all of the above |\n\nAll JS follows progressive enhancement — CSS provides the full visual baseline without JS. JS adds keyboard navigation, focus management, and ARIA state.\n\n---\n\n## Design tokens (`base.scss`)\n\n### Colors — HSL channel system\n\nAll color tokens are decomposed into H/S/L channel properties so any component can form alpha tints without `rgba()`:\n\n```css\n/* Each token ships three channel vars + a composite shorthand */\n--pp-primary-h: 356;\n--pp-primary-s: 99.2%;\n--pp-primary-l: 46.3%;\n--pp-primary:   hsl(var(--pp-primary-h) var(--pp-primary-s) var(--pp-primary-l));\n\n/* Alpha tints use the channels directly — no SCSS needed */\nbackground: hsl(var(--pp-primary-h) var(--pp-primary-s) var(--pp-primary-l) / 0.15);\n```\n\nAvailable token families: `--pp-primary`, `--pp-gradient-start`, `--pp-gradient-end`, neutral scale (`--pp-neutral-50` → `--pp-neutral-900`), semantic scales `--pp-success-*`, `--pp-warning-*`, `--pp-error-*`, `--pp-info-*` (each with 50/100/200/300/400/500/600/700/800/900 levels).\n\nDark mode overrides channel properties (`-l`, `-s`) rather than full hex values — single-token changes cascade everywhere.\n\n### Typography\n\n```scss\n$font-sans: 'Inter', system-ui, ...\n$font-mono: 'Kode Mono', ui-monospace, ...\n```\n\nBoth fonts are loaded from Google Fonts automatically via `base.scss`.\n\n### Spacing, radius, shadows, breakpoints\n\nAll defined as SCSS maps in `base.scss` and accessible via helper functions:\n\n```scss\nspacing(4)        // → 1rem\nfont-size('2xl')  // → 1.5rem\nradius('lg')      // → 0.5rem\nz('modal')        // → 200\n```\n\n### Responsive mixins\n\n```scss\n@include respond-to('md')           { /* min-width: 768px */ }\n@include respond-below('md')        { /* max-width: 767px */ }\n@include respond-between('sm','lg') { /* 640px – 1023px  */ }\n```\n\nTailwind breakpoints: `sm` 640px · `md` 768px · `lg` 1024px · `xl` 1280px · `2xl` 1536px\n\nApple device breakpoints: `iphone-se` · `iphone` · `iphone-plus` · `iphone-pro-max` · `ipad-mini` · `ipad-air` · `ipad-pro-11` · `ipad-pro-13` · `macbook-air-13` · `macbook-pro-14` · `macbook-pro-16` · `imac`\n\n---\n\n## Typography utilities\n\n```html\n<p class=\"font-sans font-700 text-2xl tracking-tight\">Hello</p>\n<p class=\"font-mono font-400 text-sm leading-relaxed\">code prose</p>\n```\n\n| Category | Classes |\n|---|---|\n| Family | `.font-sans` `.font-mono` |\n| Weight | `.font-100` → `.font-900` |\n| Size | `.text-xs` `.text-sm` `.text-base` `.text-lg` `.text-xl` `.text-2xl` `.text-3xl` `.text-4xl` `.text-5xl` |\n| Line height | `.leading-none` `.leading-tight` `.leading-snug` `.leading-normal` `.leading-relaxed` `.leading-loose` |\n| Tracking | `.tracking-tighter` `.tracking-tight` `.tracking-normal` `.tracking-wide` `.tracking-wider` `.tracking-widest` |\n| Alignment | `.text-left` `.text-center` `.text-right` |\n| Transform | `.uppercase` `.lowercase` `.capitalize` |\n| Decoration | `.underline` `.no-underline` `.line-through` |\n| Overflow | `.truncate` `.wrap-balance` |\n\n---\n\n## Components\n\n### Accordion\n\n```html\n<div class=\"pp-accordion\" data-allow-multiple>\n  <div class=\"pp-accordion__item\">\n    <button class=\"pp-accordion__trigger\" aria-expanded=\"false\" aria-controls=\"acc-1\">\n      Question\n      <svg class=\"pp-accordion__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><polyline points=\"6 9 12 15 18 9\"/></svg>\n    </button>\n    <div class=\"pp-accordion__panel\" id=\"acc-1\" aria-hidden=\"true\">\n      <p class=\"pp-accordion__content\">Answer text.</p>\n    </div>\n  </div>\n</div>\n<script src=\"dist/accordion.js\" defer></script>\n```\n\nVariants: `--flush` · `--dark` · `--primary`  \nAttribute: `data-allow-multiple` — allow multiple panels open at once  \nKeyboard: `↑` / `↓` arrows, `Home`, `End`\n\n### Alert\n\n```html\n<div class=\"pp-alert pp-alert--info\" role=\"note\">\n  <span class=\"pp-alert__icon\"><i data-lucide=\"info\" aria-hidden=\"true\"></i></span>\n  <div class=\"pp-alert__body\">\n    <p class=\"pp-alert__title\">Heads up</p>\n    <p class=\"pp-alert__message\">Your session expires in 10 minutes.</p>\n  </div>\n</div>\n\n<!-- Dismissible -->\n<div class=\"pp-alert pp-alert--success is-dismissible\" role=\"status\" id=\"a1\">\n  <span class=\"pp-alert__icon\"><i data-lucide=\"circle-check\" aria-hidden=\"true\"></i></span>\n  <div class=\"pp-alert__body\"><p class=\"pp-alert__message\">Saved.</p></div>\n  <button class=\"pp-alert__dismiss\" aria-label=\"Dismiss\"\n    onclick=\"const e=document.getElementById('a1');e.classList.add('is-dismissing');setTimeout(()=>e.remove(),200);\">\n    <i data-lucide=\"x\" aria-hidden=\"true\"></i>\n  </button>\n</div>\n```\n\nVariants: `--info` · `--success` · `--warning` · `--error` · `--primary` · `--neutral`  \nModifier: `--filled` (solid background instead of tint)  \nStates: `.is-dismissible` · `.is-dismissing` (slide-out before removal)\n\nJS API: `window.ppAlert.dismiss(idOrEl)` — accepts an element or its `id` string.  \nEvent: `pp:alert:dismiss` dispatched on the alert element before removal.\n\n### Badge\n\n```html\n<!-- Tint variants (default) -->\n<span class=\"pp-badge pp-badge--info\">New</span>\n<span class=\"pp-badge pp-badge--success\">Active</span>\n<span class=\"pp-badge pp-badge--warning\">Review</span>\n<span class=\"pp-badge pp-badge--error\">Error</span>\n<span class=\"pp-badge pp-badge--primary\">Beta</span>\n\n<!-- Filled (solid background) -->\n<span class=\"pp-badge pp-badge--success pp-badge--filled\">Active</span>\n\n<!-- Sizes -->\n<span class=\"pp-badge pp-badge--info pp-badge--sm\">Small</span>\n<span class=\"pp-badge pp-badge--info pp-badge--lg\">Large</span>\n\n<!-- Dot indicator (no text — pair with sr-only label) -->\n<span class=\"pp-badge pp-badge--error pp-badge--dot\" aria-label=\"3 unread\"></span>\n```\n\nVariants: `--primary` · `--success` · `--warning` · `--error` · `--info`  \nModifiers: `--filled` · `--sm` · `--lg` · `--dot`\n\n### Button\n\n```html\n<button class=\"pp-button\">Primary</button>\n<button class=\"pp-button--success\">Success</button>\n<button class=\"pp-button--warning\">Warning</button>\n<button class=\"pp-button--error\">Error</button>\n<button class=\"pp-button--dark\">Dark</button>\n<button class=\"pp-button--gradient\">Gradient</button>\n<button class=\"pp-button--ghost\">Ghost</button>\n\n<button class=\"pp-button--outline\">Primary</button>\n<button class=\"pp-button--outline pp-button--success\">Success</button>\n<button class=\"pp-button--outline pp-button--warning\">Warning</button>\n<button class=\"pp-button--outline pp-button--error\">Error</button>\n<button class=\"pp-button--outline pp-button--dark\">Dark</button>\n```\n\n### Card\n\n```html\n<div class=\"pp-card\">...</div>\n<div class=\"pp-card pp-card--dark\">...</div>\n<div class=\"pp-card pp-card--gradient\">...</div>\n<div class=\"pp-card pp-card--primary\">...</div>\n<div class=\"pp-card pp-card--ghost\">...</div>\n```\n\nGrid helpers: `.pp-card-grid--2` · `.pp-card-grid--3` · `.pp-card-grid--4`\n\n### Carousel\n\n```html\n<div class=\"pp-carousel\" id=\"my-carousel\" data-label=\"Featured\">\n  <div class=\"pp-carousel__track\">\n    <div class=\"pp-carousel__slide\" id=\"my-carousel-slide-0\">...</div>\n    <div class=\"pp-carousel__slide\" id=\"my-carousel-slide-1\">...</div>\n  </div>\n  <button class=\"pp-carousel__prev\" type=\"button\" aria-label=\"Previous slide\">\n    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><polyline points=\"15 18 9 12 15 6\"/></svg>\n  </button>\n  <button class=\"pp-carousel__next\" type=\"button\" aria-label=\"Next slide\">\n    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><polyline points=\"9 6 15 12 9 18\"/></svg>\n  </button>\n  <div class=\"pp-carousel__dots\" aria-label=\"Slide navigation\">\n    <button class=\"pp-carousel__dot\" type=\"button\" aria-label=\"Go to slide 1\" aria-controls=\"my-carousel-slide-0\"></button>\n    <button class=\"pp-carousel__dot\" type=\"button\" aria-label=\"Go to slide 2\" aria-controls=\"my-carousel-slide-1\"></button>\n  </div>\n  <div class=\"pp-carousel__announcer\" aria-live=\"polite\" aria-atomic=\"true\"></div>\n</div>\n<script src=\"dist/carousel.js\" defer></script>\n```\n\nVariants: `--peek-2` · `--peek-3` · `--dark` · `--flush`  \nAPI: `ppCarousel.get(id).goTo(n)`\n\n### Footer\n\n```html\n<footer class=\"pp-footer\" role=\"contentinfo\">\n  <div class=\"pp-footer__top\">\n    <div class=\"pp-footer__brand\">\n      <a href=\"#\" class=\"pp-footer__logo\">Brand</a>\n      <p class=\"pp-footer__tagline\">Tagline</p>\n    </div>\n    <div class=\"pp-footer__col\">\n      <p class=\"pp-footer__col-title\">Column</p>\n      <ul class=\"pp-footer__nav\" aria-label=\"Column links\">\n        <li><a href=\"#\" class=\"pp-footer__nav-link\">Link</a></li>\n      </ul>\n    </div>\n  </div>\n  <div class=\"pp-footer__bottom\">\n    <p class=\"pp-footer__legal\">&copy; 2026 Brand.</p>\n    <ul class=\"pp-footer__social\" aria-label=\"Social links\">\n      <li><a href=\"#\" class=\"pp-footer__social-link\" aria-label=\"GitHub\"><i data-lucide=\"github\"></i></a></li>\n    </ul>\n  </div>\n</footer>\n```\n\nVariants: `--dark` · `--accent`\n\n### Forms\n\n#### Label\n\n```html\n<span class=\"pp-label pp-label--primary\">Primary</span>\n<span class=\"pp-label pp-label--secondary pp-label--callout\">Secondary callout</span>\n<span class=\"pp-label pp-label--selectable\">Selectable text</span>\n<span class=\"pp-label-row pp-label\"><i data-lucide=\"wifi\" aria-hidden=\"true\"></i> Wi-Fi</span>\n```\n\nTiers: `--primary` · `--secondary` · `--tertiary` · `--quaternary`  \nScale: `--headline` · `--subheadline` · `--body` · `--callout` · `--footnote` · `--caption`\n\n#### Fieldset\n\n```html\n<fieldset class=\"pp-fieldset\">\n  <legend>Group name</legend>\n  <!-- controls -->\n</fieldset>\n```\n\nVariants: `--ghost` · `--filled` · `--primary` · `--error`  \nLegend modifiers: `--sm` · `--lg` · `--inline`\n\n#### Form Instructions\n\n```html\n<!-- Place BEFORE <form> -->\n<div class=\"pp-form-instructions\" role=\"note\" aria-label=\"Form instructions\">\n  <p class=\"pp-form-instructions__title\">Before you begin</p>\n  <ul class=\"pp-form-instructions__list\">\n    <li class=\"pp-form-instructions__item\">Fields marked * are required.</li>\n  </ul>\n</div>\n```\n\nVariants: `--neutral` · `--warning` · `--error` (use `role=\"alert\"` for errors)\n\n#### Text Field\n\n```html\n<div class=\"pp-field\">\n  <label class=\"pp-field__label\" for=\"name\">\n    Name\n    <abbr class=\"pp-field__required\" aria-label=\"required\" title=\"required\"></abbr>\n  </label>\n  <input class=\"pp-field__input\" type=\"text\" id=\"name\" name=\"name\"\n    required aria-required=\"true\" aria-describedby=\"name-hint\" />\n  <span class=\"pp-field__hint\" id=\"name-hint\">Your full legal name.</span>\n</div>\n```\n\nStates: `--error` · `--success` · `--warning` · `--validating`  \nSizes: `--sm` · `--lg`\n\n#### Validation\n\n```html\n<!-- Summary (place before or at top of form) -->\n<div class=\"pp-validation-summary\" role=\"alert\" aria-label=\"Form errors\">\n  <p class=\"pp-validation-summary__title\">Errors prevented submission</p>\n  <ul class=\"pp-validation-summary__list\"></ul>\n</div>\n\n<!-- Confirmation checkbox -->\n<label class=\"pp-confirm\">\n  <input class=\"pp-confirm__input\" type=\"checkbox\" />\n  <span class=\"pp-confirm__label\">I confirm this action.</span>\n</label>\n<button class=\"pp-button pp-submit--gated\" type=\"submit\">Submit</button>\n```\n\nJS API (optional — CSS works without it):\n\n```js\nppValidation.setError(input, 'Message')\nppValidation.clearError(input)\nppValidation.setSuccess(input, 'Message')\nppValidation.setValidating(input)\nppValidation.setSummary([{ input, message }], summaryEl)\n```\n\n### Gradient text\n\n```html\n<h1 class=\"pp-gradient-text\">PeppertinoCSS</h1>\n```\n\n### Header\n\n```html\n<header class=\"pp-header\">\n  <a href=\"#\" class=\"pp-header__brand\">Brand</a>\n  <nav aria-label=\"Main navigation\">\n    <ul class=\"pp-header__nav\" role=\"menubar\">\n      <li class=\"pp-header__nav-item\" role=\"none\">\n        <a href=\"#\" class=\"pp-header__nav-link\" role=\"menuitem\">Link</a>\n      </li>\n      <li class=\"pp-header__nav-item\" role=\"none\">\n        <a href=\"#\" class=\"pp-header__nav-link\" role=\"menuitem\" aria-haspopup=\"true\" aria-expanded=\"false\">Dropdown</a>\n        <ul class=\"pp-header__dropdown\" role=\"menu\">\n          <li role=\"none\"><a href=\"#\" class=\"pp-header__dropdown-link\" role=\"menuitem\">Item</a></li>\n        </ul>\n      </li>\n    </ul>\n  </nav>\n  <button class=\"pp-header__toggle\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n    <span></span><span></span><span></span>\n  </button>\n</header>\n<script src=\"dist/header.js\" defer></script>\n```\n\n### Modal\n\n```html\n<button data-modal-open=\"my-modal\">Open</button>\n\n<div id=\"my-modal\" class=\"pp-modal-backdrop\"\n     role=\"dialog\" aria-modal=\"true\"\n     aria-labelledby=\"my-modal-title\"\n     aria-describedby=\"my-modal-desc\"\n     aria-hidden=\"true\">\n  <div class=\"pp-modal\">\n    <button class=\"pp-modal__close\" data-modal-close=\"my-modal\" aria-label=\"Close\">✕</button>\n    <p class=\"pp-modal__title\" id=\"my-modal-title\">Title</p>\n    <p class=\"pp-modal__description\" id=\"my-modal-desc\">Description text.</p>\n    <ul class=\"pp-modal__actions\">\n      <li><button class=\"pp-modal__action\">Action</button></li>\n      <li><button class=\"pp-modal__action pp-modal__action--cancel\" data-modal-close=\"my-modal\">Cancel</button></li>\n    </ul>\n  </div>\n</div>\n<script src=\"dist/modal.js\" defer></script>\n```\n\n`window.ppModal.open(id)` / `.close(id)` / `.closeAll()`\n\n### Select\n\n```html\n<div class=\"pp-select\">\n  <button class=\"pp-select__trigger\" type=\"button\" aria-label=\"Choose option\">\n    <span class=\"pp-select__value\">Choose…</span>\n    <span class=\"pp-select__chevron\"></span>\n  </button>\n  <ul class=\"pp-select__panel\" role=\"listbox\">\n    <li role=\"option\"><button class=\"pp-select__option\" data-value=\"a\">Option A</button></li>\n    <li role=\"option\"><button class=\"pp-select__option\" data-value=\"b\">Option B</button></li>\n  </ul>\n</div>\n<script src=\"dist/select.js\" defer></script>\n```\n\nSizes: `.pp-select--sm` · `.pp-select--lg`\n\n### Switch\n\n```html\n<!-- Basic toggle -->\n<button class=\"pp-switch\" role=\"switch\" aria-checked=\"false\" aria-label=\"Enable notifications\"></button>\n\n<!-- Pre-checked -->\n<button class=\"pp-switch\" role=\"switch\" aria-checked=\"true\" aria-label=\"Dark mode\"></button>\n\n<!-- Sizes -->\n<button class=\"pp-switch pp-switch--sm\" role=\"switch\" aria-checked=\"false\" aria-label=\"Compact mode\"></button>\n<button class=\"pp-switch pp-switch--lg\" role=\"switch\" aria-checked=\"false\" aria-label=\"Accessibility features\"></button>\n```\n\nSizes: `--sm` (32×20px) · default (44×26px) · `--lg` (56×32px)  \nJS handles `aria-checked` toggle on click and Space key.  \nEvent: `pp:switch:change` with `{ checked: boolean }` on the switch element.\n\n### Tabs\n\n```html\n<div class=\"pp-tabs\" role=\"tablist\">\n  <button class=\"pp-tabs__item is-active\" role=\"tab\" aria-selected=\"true\">Tab 1</button>\n  <button class=\"pp-tabs__item\" role=\"tab\" aria-selected=\"false\">Tab 2</button>\n</div>\n<div data-tab-panel=\"tab1\" role=\"tabpanel\">Panel 1</div>\n<div data-tab-panel=\"tab2\" role=\"tabpanel\" hidden>Panel 2</div>\n<script src=\"dist/tabs.js\" defer></script>\n```\n\nVariants: default · `--outline` · `--gradient` · `--gradient-outline`  \nSizes: `--sm` · `--lg`  \nKeyboard: `←` / `→` arrows, `Home`, `End`  \nJS API: `ppTabs.get(ref).activate(index)` — programmatically activate a tab by index.  \nEvent: `pp:tabs:change` with `{ index }` on the `.pp-tabs` element.\n\n### Table\n\n```html\n<table class=\"pp-table pp-table--cols-3\">\n  <tbody>\n    <tr><td>Label</td><td>Value A</td><td>Value B</td></tr>\n  </tbody>\n</table>\n```\n\nColumn helpers: `.pp-table--cols-1` → `.pp-table--cols-4`\n\n### Toast\n\n```js\n// Show a toast (JS required)\nppToast.show({ message: 'File saved.', variant: 'success' });\nppToast.show({ message: 'Sync failed.', title: 'Error', variant: 'error', duration: 6000 });\nppToast.show({ message: 'Update available.', variant: 'info', position: 'bottom-center' });\n```\n\n```html\n<!-- Dismiss button with data attribute (no JS needed) -->\n<button data-toast-dismiss aria-label=\"Dismiss\">✕</button>\n```\n\nVariants: `--info` · `--success` · `--warning` · `--error` · `--neutral`  \nPositions: `top-right` (default) · `top-left` · `top-center` · `bottom-right` · `bottom-left` · `bottom-center`  \nOptions: `message` · `title` · `variant` · `duration` (ms, default 4000) · `position`  \nEvents: `pp:toast:show` / `pp:toast:dismiss` on the toast element.\n\n### Tooltip\n\n```html\n<!-- CSS-only: shows on hover and :focus-within -->\n<span class=\"pp-tooltip\">\n  Hover me\n  <span class=\"pp-tooltip__content\" role=\"tooltip\">Helpful hint</span>\n</span>\n\n<!-- Force-show via attribute (e.g. for testing) -->\n<span class=\"pp-tooltip\">\n  Click me\n  <span class=\"pp-tooltip__content pp-tooltip__content--bottom\" role=\"tooltip\" data-show>\n    Shown below\n  </span>\n</span>\n```\n\nPlacements: default (top) · `--bottom` · `--left` · `--right`  \nShown automatically on `:hover` and `:focus-within` — no JS required.  \nAdd `data-show` to force-display for testing.\n\n### Section\n\n```html\n<section class=\"pp-section\">\n  <div class=\"pp-section__inner\">\n    <!-- content -->\n  </div>\n</section>\n```\n\nVariants: `--primary` · `--dark` · `--muted` · `--gradient`\n\n---\n\n## Utilities\n\nSingle-purpose classes — no JavaScript required. Import `utilities.scss` or use the compiled CSS.\n\n| Group | Classes |\n|---|---|\n| Display | `.d-{block\\|inline\\|inline-block\\|flex\\|inline-flex\\|grid\\|inline-grid\\|none\\|contents}` |\n| Visibility | `.visible` `.invisible` `.sr-only` `.not-sr-only` |\n| Opacity | `.opacity-{0\\|25\\|50\\|75\\|100}` |\n| Margin | `.m-*` `.mt-*` `.mb-*` `.ml-*` `.mr-*` `.mx-*` `.my-*` (keys 0–32, `auto`) |\n| Padding | `.p-*` `.pt-*` `.pb-*` `.pl-*` `.pr-*` `.px-*` `.py-*` (keys 0–32) |\n| Gap | `.gap-*` `.gap-x-*` `.gap-y-*` (keys 0–32) |\n| Flex | direction, wrap, grow/shrink, justify-content, align-items, align-self |\n| Grid | `.grid-cols-{1–6,12}` `.grid-rows-{1–4}` `.col-span-*` `.row-span-*` |\n| Width | `.w-full` `.w-screen` `.w-auto` `.w-fit` `.w-min` `.w-max` `.w-half` |\n| Height | `.h-full` `.h-screen` `.h-auto` `.h-fit` |\n| Overflow | `.overflow-{auto\\|hidden\\|visible\\|scroll}`, x/y variants |\n| Position | `.static` `.relative` `.absolute` `.fixed` `.sticky` |\n| Z-index | `.z-{below\\|base\\|raised\\|overlay\\|modal\\|toast\\|tooltip}` |\n| Border-radius | `.rounded-{none\\|sm\\|base\\|md\\|lg\\|xl\\|2xl\\|full}` |\n| Shadow | `.shadow-{none\\|sm\\|md\\|lg\\|xl}` |\n| Cursor | `.cursor-{default\\|pointer\\|not-allowed\\|grab\\|text}` |\n| Responsive | `.sm-d-*` `.md-d-*` `.lg-d-*` `.xl-d-*` `.w2xl-d-*` (display only) |\n\n---\n\n## Dark mode\n\nAdd `class=\"dark\"` to `<html>` (or any ancestor element). All component tokens flip automatically via CSS custom properties — no extra classes needed on individual components.\n\n```html\n<html class=\"dark\">\n  <!-- everything inside uses dark surface tokens -->\n</html>\n```\n\nToggle from JS using the `ppTheme` API (requires `theme.js`):\n\n```js\nppTheme.set('dark');         // switch to dark mode\nppTheme.set('light');        // switch to light mode\nppTheme.toggle();            // flip current mode\nppTheme.get();               // → 'dark' | 'light'\n```\n\nOr add `data-theme-toggle` to any button — it wires automatically:\n\n```html\n<button data-theme-toggle aria-label=\"Toggle dark mode\">Dark</button>\n```\n\nThe preference is persisted to `localStorage` under `pp-theme` and restored on page load. Event: `pp:theme:change` with `{ theme: 'dark' | 'light' }` dispatched on `document`.\n\nAll `--pp-*` tokens are defined on `:root` as light defaults. `dark-mode.scss` overrides them under `.dark`. The neutral scale is fully inverted (50 ↔ 900), surfaces swap, and glass/shadow values are strengthened for dark backgrounds.\n\n---\n\n## CustomEvents reference\n\nAll JS components dispatch `pp:<component>:<event>` CustomEvents that bubble. Listen at any ancestor:\n\n| Event | Dispatched on | Detail |\n|---|---|---|\n| `pp:accordion:open` | `.pp-accordion` | `{ index, trigger, panel }` |\n| `pp:accordion:close` | `.pp-accordion` | `{ index, trigger, panel }` |\n| `pp:alert:dismiss` | `.pp-alert` | — |\n| `pp:carousel:change` | `.pp-carousel` | `{ index, total, label }` |\n| `pp:header:open` | `.pp-header` | — |\n| `pp:header:close` | `.pp-header` | — |\n| `pp:modal:open` | `.pp-modal-backdrop` | — |\n| `pp:modal:close` | `.pp-modal-backdrop` | — |\n| `pp:select:change` | `.pp-select` | `{ value }` |\n| `pp:switch:change` | `.pp-switch` | `{ checked: boolean }` |\n| `pp:tabs:change` | `.pp-tabs` | `{ index }` |\n| `pp:theme:change` | `document` | `{ theme: 'dark' \\| 'light' }` |\n| `pp:toast:show` | `.pp-toast` | — |\n| `pp:toast:dismiss` | `.pp-toast` | — |\n\n---\n\n## Changelog\n\nSee [CHANGELOG.txt](CHANGELOG.txt)\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE)\n\n---\n\n[Codeberg](https://codeberg.org/debaditya/Peppertino)\n","readmeFilename":"README.md"}