@palate/cli 0.0.0-stage → 0.0.2
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/LICENSE +20 -0
- package/README.md +153 -2
- package/bin/palate.mjs +894 -0
- package/kb/anatomy/data-table.md +24 -0
- package/kb/anatomy/empty-state.md +16 -0
- package/kb/anatomy/filter-toolbar.md +19 -0
- package/kb/anatomy/meter.md +16 -0
- package/kb/anatomy/product-window.md +18 -0
- package/kb/anatomy/settings-page.md +18 -0
- package/kb/anatomy/status-indicator.md +17 -0
- package/kb/anatomy/toast-undo.md +16 -0
- package/kb/bench/briefs.json +618 -0
- package/kb/craft/SOURCES.md +48 -0
- package/kb/craft/creativity.md +55 -0
- package/kb/craft/details.md +75 -0
- package/kb/craft/landing-demos.md +46 -0
- package/kb/craft/mistakes.md +73 -0
- package/kb/craft/motion.md +53 -0
- package/kb/craft/principles.md +68 -0
- package/kb/index/discovery.json +1 -0
- package/kb/inspiration/index.json +79 -0
- package/kb/moves/animated-comparison-table.md +58 -0
- package/kb/moves/before-after-slider.md +58 -0
- package/kb/moves/bento-live-tiles.md +57 -0
- package/kb/moves/calm-motion-system.md +63 -0
- package/kb/moves/canvas-grain.md +58 -0
- package/kb/moves/changelog-as-magazine.md +56 -0
- package/kb/moves/code-drawn-diagram.md +56 -0
- package/kb/moves/colophon.md +54 -0
- package/kb/moves/command-palette-site-nav.md +58 -0
- package/kb/moves/confetti-free-celebration.md +58 -0
- package/kb/moves/console-easter-egg.md +57 -0
- package/kb/moves/copy-confirmation.md +57 -0
- package/kb/moves/cursor-reactive-light.md +57 -0
- package/kb/moves/dark-band-contrast-section.md +55 -0
- package/kb/moves/designed-dark-mode.md +58 -0
- package/kb/moves/duotone-photography.md +55 -0
- package/kb/moves/editorial-drop-cap.md +58 -0
- package/kb/moves/editorial-grid-pull-quotes.md +55 -0
- package/kb/moves/engraving-colour-lens.md +64 -0
- package/kb/moves/explorable-control.md +57 -0
- package/kb/moves/feature-films-on-painted-stages.md +58 -0
- package/kb/moves/first-win-onboarding.md +59 -0
- package/kb/moves/footer-live-status.md +56 -0
- package/kb/moves/footer-rewards-the-end.md +58 -0
- package/kb/moves/generative-brand-pattern.md +55 -0
- package/kb/moves/gentle-error-nudge.md +59 -0
- package/kb/moves/halftone-dot-imagery.md +55 -0
- package/kb/moves/hand-drawn-annotations.md +55 -0
- package/kb/moves/hero-paints-itself-in.md +65 -0
- package/kb/moves/honest-progress-narration.md +58 -0
- package/kb/moves/honest-testimonial-wall.md +57 -0
- package/kb/moves/inline-sparklines-in-copy.md +57 -0
- package/kb/moves/inspect-our-taste.md +58 -0
- package/kb/moves/interactive-pricing-calculator.md +59 -0
- package/kb/moves/isometric-illustration-system.md +56 -0
- package/kb/moves/kinetic-variable-type.md +57 -0
- package/kb/moves/konami-secret.md +59 -0
- package/kb/moves/layered-paper-depth.md +56 -0
- package/kb/moves/lightweight-3d-object-hero.md +59 -0
- package/kb/moves/line-engraving-from-image.md +63 -0
- package/kb/moves/link-preview-peek.md +57 -0
- package/kb/moves/live-data-ticker.md +61 -0
- package/kb/moves/made-with-proof.md +51 -0
- package/kb/moves/magnetic-buttons.md +55 -0
- package/kb/moves/marquee-done-right.md +58 -0
- package/kb/moves/moves.yaml +450 -0
- package/kb/moves/museum-painting-backdrop.md +59 -0
- package/kb/moves/one-colour-brand-world.md +56 -0
- package/kb/moves/playful-404.md +58 -0
- package/kb/moves/pointer-highlight-word.md +56 -0
- package/kb/moves/product-in-context.md +56 -0
- package/kb/moves/real-world-data.md +58 -0
- package/kb/moves/referral-reward-reveal.md +59 -0
- package/kb/moves/riso-print-texture.md +57 -0
- package/kb/moves/screenshot-detail-crops.md +56 -0
- package/kb/moves/scroll-progress-chapters.md +57 -0
- package/kb/moves/scroll-scrubbed-product-film.md +62 -0
- package/kb/moves/self-playing-product-demo.md +61 -0
- package/kb/moves/shape-continuity-morph.md +58 -0
- package/kb/moves/sliding-nav-indicator.md +58 -0
- package/kb/moves/sticky-scroll-story.md +56 -0
- package/kb/moves/story-led-long-scroll.md +56 -0
- package/kb/moves/tactile-button.md +63 -0
- package/kb/moves/technical-drawing-lines.md +57 -0
- package/kb/moves/time-of-day-theming.md +56 -0
- package/kb/moves/tiny-game-easter-egg.md +60 -0
- package/kb/moves/type-decode-reveal.md +57 -0
- package/kb/moves/typographic-numeral-hero.md +58 -0
- package/kb/moves/view-transitions-between-pages.md +57 -0
- package/kb/moves/waitlist-position-live.md +60 -0
- package/kb/patterns/app-team-members.md +27 -0
- package/kb/patterns/chat-agent-approvals.md +31 -0
- package/kb/patterns/commerce-product-page.md +34 -0
- package/kb/patterns/dashboard-entity-table.md +37 -0
- package/kb/patterns/dashboard-home-today.md +24 -0
- package/kb/patterns/docs-api-reference.md +31 -0
- package/kb/patterns/marketing-product-led-landing.md +30 -0
- package/kb/patterns/mobile-daily-checklist.md +26 -0
- package/kb/references/index.json +1 -0
- package/kb/references/thumbs/004c5e9072.jpg +0 -0
- package/kb/references/thumbs/008915eb21.jpg +0 -0
- package/kb/references/thumbs/0098cf66c2.jpg +0 -0
- package/kb/references/thumbs/012e61b31f.jpg +0 -0
- package/kb/references/thumbs/014d4e46fc.jpg +0 -0
- package/kb/references/thumbs/01e54f394a.jpg +0 -0
- package/kb/references/thumbs/01e99a579c.jpg +0 -0
- package/kb/references/thumbs/01fd014575.jpg +0 -0
- package/kb/references/thumbs/022778ca72.jpg +0 -0
- package/kb/references/thumbs/02717bf1e1.jpg +0 -0
- package/kb/references/thumbs/02a5cfdbe9.jpg +0 -0
- package/kb/references/thumbs/02c9823f8d.jpg +0 -0
- package/kb/references/thumbs/02f3974613.jpg +0 -0
- package/kb/references/thumbs/032427f1ce.jpg +0 -0
- package/kb/references/thumbs/03ba677d07.jpg +0 -0
- package/kb/references/thumbs/04f2476cfe.jpg +0 -0
- package/kb/references/thumbs/0563e7c52e.jpg +0 -0
- package/kb/references/thumbs/05fa6b8eef.jpg +0 -0
- package/kb/references/thumbs/065bce1517.jpg +0 -0
- package/kb/references/thumbs/06c017f113.jpg +0 -0
- package/kb/references/thumbs/0770e2d8d3.jpg +0 -0
- package/kb/references/thumbs/078a26c4cb.jpg +0 -0
- package/kb/references/thumbs/08679b6e84.jpg +0 -0
- package/kb/references/thumbs/088c45a34c.jpg +0 -0
- package/kb/references/thumbs/089e9fd4e4.jpg +0 -0
- package/kb/references/thumbs/08f773231e.jpg +0 -0
- package/kb/references/thumbs/093ca3e2e3.jpg +0 -0
- package/kb/references/thumbs/0963320f74.jpg +0 -0
- package/kb/references/thumbs/09fc1ded85.jpg +0 -0
- package/kb/references/thumbs/0a368f3963.jpg +0 -0
- package/kb/references/thumbs/0a9e0e5201.jpg +0 -0
- package/kb/references/thumbs/0aace67ee7.jpg +0 -0
- package/kb/references/thumbs/0b61ecf793.jpg +0 -0
- package/kb/references/thumbs/0bde18ae09.jpg +0 -0
- package/kb/references/thumbs/0bf7ee8143.jpg +0 -0
- package/kb/references/thumbs/0ca20a13e0.jpg +0 -0
- package/kb/references/thumbs/0cdc0198c4.jpg +0 -0
- package/kb/references/thumbs/0cf9790b28.jpg +0 -0
- package/kb/references/thumbs/0d0202904b.jpg +0 -0
- package/kb/references/thumbs/0d053aba18.jpg +0 -0
- package/kb/references/thumbs/0d0c2c13d2.jpg +0 -0
- package/kb/references/thumbs/0d30be99b0.jpg +0 -0
- package/kb/references/thumbs/0d503da1b7.jpg +0 -0
- package/kb/references/thumbs/0ddad7b740.jpg +0 -0
- package/kb/references/thumbs/0e0a148101.jpg +0 -0
- package/kb/references/thumbs/0e401b6b75.jpg +0 -0
- package/kb/references/thumbs/0e8f32ba0f.jpg +0 -0
- package/kb/references/thumbs/0ef1966a7d.jpg +0 -0
- package/kb/references/thumbs/0efd416d11.jpg +0 -0
- package/kb/references/thumbs/0f3af263ae.jpg +0 -0
- package/kb/references/thumbs/0f9644c3a5.jpg +0 -0
- package/kb/references/thumbs/1020552737.jpg +0 -0
- package/kb/references/thumbs/1037626587.jpg +0 -0
- package/kb/references/thumbs/10512b7e94.jpg +0 -0
- package/kb/references/thumbs/106dc4a7b5.jpg +0 -0
- package/kb/references/thumbs/108943f6f7.jpg +0 -0
- package/kb/references/thumbs/10a5551d51.jpg +0 -0
- package/kb/references/thumbs/10dd01076c.jpg +0 -0
- package/kb/references/thumbs/11b06e39da.jpg +0 -0
- package/kb/references/thumbs/11baa1ec83.jpg +0 -0
- package/kb/references/thumbs/11bbe12167.jpg +0 -0
- package/kb/references/thumbs/11ca37feb8.jpg +0 -0
- package/kb/references/thumbs/11f14d3f12.jpg +0 -0
- package/kb/references/thumbs/124530ceb5.jpg +0 -0
- package/kb/references/thumbs/1276402336.jpg +0 -0
- package/kb/references/thumbs/1280e5c9d6.jpg +0 -0
- package/kb/references/thumbs/12cac0d172.jpg +0 -0
- package/kb/references/thumbs/138be6623a.jpg +0 -0
- package/kb/references/thumbs/13a0c544d1.jpg +0 -0
- package/kb/references/thumbs/13a32cb94c.jpg +0 -0
- package/kb/references/thumbs/144035d641.jpg +0 -0
- package/kb/references/thumbs/1457e41924.jpg +0 -0
- package/kb/references/thumbs/14972e3a86.jpg +0 -0
- package/kb/references/thumbs/15a47f2e4c.jpg +0 -0
- package/kb/references/thumbs/15aa15d22e.jpg +0 -0
- package/kb/references/thumbs/160dcd24b7.jpg +0 -0
- package/kb/references/thumbs/1610978529.jpg +0 -0
- package/kb/references/thumbs/16db30ba37.jpg +0 -0
- package/kb/references/thumbs/16f19ae4f3.jpg +0 -0
- package/kb/references/thumbs/16f758b03f.jpg +0 -0
- package/kb/references/thumbs/1748e5b751.jpg +0 -0
- package/kb/references/thumbs/175d0b0e69.jpg +0 -0
- package/kb/references/thumbs/178f571a36.jpg +0 -0
- package/kb/references/thumbs/17c43dc025.jpg +0 -0
- package/kb/references/thumbs/17c7f05b50.jpg +0 -0
- package/kb/references/thumbs/17f97e61dd.jpg +0 -0
- package/kb/references/thumbs/1804e17365.jpg +0 -0
- package/kb/references/thumbs/195c162ed1.jpg +0 -0
- package/kb/references/thumbs/19e3699c29.jpg +0 -0
- package/kb/references/thumbs/1a48e0a4d5.jpg +0 -0
- package/kb/references/thumbs/1a6cda265e.jpg +0 -0
- package/kb/references/thumbs/1a7e012091.jpg +0 -0
- package/kb/references/thumbs/1a9173a172.jpg +0 -0
- package/kb/references/thumbs/1b34a6b4d2.jpg +0 -0
- package/kb/references/thumbs/1b5284f3b2.jpg +0 -0
- package/kb/references/thumbs/1b93fbd6d3.jpg +0 -0
- package/kb/references/thumbs/1c6728fef6.jpg +0 -0
- package/kb/references/thumbs/1c6f101618.jpg +0 -0
- package/kb/references/thumbs/1cf7011a94.jpg +0 -0
- package/kb/references/thumbs/1d1769e539.jpg +0 -0
- package/kb/references/thumbs/1d1fd23199.jpg +0 -0
- package/kb/references/thumbs/1d7b6602ac.jpg +0 -0
- package/kb/references/thumbs/1dbbc61b9e.jpg +0 -0
- package/kb/references/thumbs/1dbdd6d21d.jpg +0 -0
- package/kb/references/thumbs/1dd873744b.jpg +0 -0
- package/kb/references/thumbs/1df4dd7cf9.jpg +0 -0
- package/kb/references/thumbs/1ece8c35b8.jpg +0 -0
- package/kb/references/thumbs/1f0e5b9aa4.jpg +0 -0
- package/kb/references/thumbs/1f1419651b.jpg +0 -0
- package/kb/references/thumbs/1f2a6da92d.jpg +0 -0
- package/kb/references/thumbs/1f651f33c0.jpg +0 -0
- package/kb/references/thumbs/1f8b697d18.jpg +0 -0
- package/kb/references/thumbs/1fee3824cd.jpg +0 -0
- package/kb/references/thumbs/1ff7757853.jpg +0 -0
- package/kb/references/thumbs/2043182f01.jpg +0 -0
- package/kb/references/thumbs/2059dabcd5.jpg +0 -0
- package/kb/references/thumbs/209d9dbb95.jpg +0 -0
- package/kb/references/thumbs/20d8923554.jpg +0 -0
- package/kb/references/thumbs/210dd3b671.jpg +0 -0
- package/kb/references/thumbs/2120719116.jpg +0 -0
- package/kb/references/thumbs/21a7384429.jpg +0 -0
- package/kb/references/thumbs/225f187391.jpg +0 -0
- package/kb/references/thumbs/230caf7dd2.jpg +0 -0
- package/kb/references/thumbs/235afad355.jpg +0 -0
- package/kb/references/thumbs/2378066687.jpg +0 -0
- package/kb/references/thumbs/241faf68a1.jpg +0 -0
- package/kb/references/thumbs/24d9f1a9b9.jpg +0 -0
- package/kb/references/thumbs/2505c8b9a0.jpg +0 -0
- package/kb/references/thumbs/25593638ca.jpg +0 -0
- package/kb/references/thumbs/25dd454f18.jpg +0 -0
- package/kb/references/thumbs/2602e123e2.jpg +0 -0
- package/kb/references/thumbs/26095c0b11.jpg +0 -0
- package/kb/references/thumbs/26260d6238.jpg +0 -0
- package/kb/references/thumbs/26bba21836.jpg +0 -0
- package/kb/references/thumbs/26bde3520b.jpg +0 -0
- package/kb/references/thumbs/272e22067c.jpg +0 -0
- package/kb/references/thumbs/27421b3226.jpg +0 -0
- package/kb/references/thumbs/2769ebca41.jpg +0 -0
- package/kb/references/thumbs/27e2f6e8b0.jpg +0 -0
- package/kb/references/thumbs/28432ba373.jpg +0 -0
- package/kb/references/thumbs/2846626f19.jpg +0 -0
- package/kb/references/thumbs/28750e821e.jpg +0 -0
- package/kb/references/thumbs/289481230f.jpg +0 -0
- package/kb/references/thumbs/2897967408.jpg +0 -0
- package/kb/references/thumbs/28c0a5fa17.jpg +0 -0
- package/kb/references/thumbs/28c181fba5.jpg +0 -0
- package/kb/references/thumbs/29806f539f.jpg +0 -0
- package/kb/references/thumbs/2997f56ee7.jpg +0 -0
- package/kb/references/thumbs/29b34a10fb.jpg +0 -0
- package/kb/references/thumbs/29bd78cdb4.jpg +0 -0
- package/kb/references/thumbs/29c8c6c22a.jpg +0 -0
- package/kb/references/thumbs/2ac23f7fae.jpg +0 -0
- package/kb/references/thumbs/2b76e13f79.jpg +0 -0
- package/kb/references/thumbs/2b84226479.jpg +0 -0
- package/kb/references/thumbs/2bf2dbf737.jpg +0 -0
- package/kb/references/thumbs/2bf89abbf6.jpg +0 -0
- package/kb/references/thumbs/2c562cd534.jpg +0 -0
- package/kb/references/thumbs/2cfe9d48c4.jpg +0 -0
- package/kb/references/thumbs/2d49f19b27.jpg +0 -0
- package/kb/references/thumbs/2dc8670da7.jpg +0 -0
- package/kb/references/thumbs/2de947c469.jpg +0 -0
- package/kb/references/thumbs/2e075ca79f.jpg +0 -0
- package/kb/references/thumbs/2eb0820e6b.jpg +0 -0
- package/kb/references/thumbs/2ec56a9dc0.jpg +0 -0
- package/kb/references/thumbs/30bb4ad607.jpg +0 -0
- package/kb/references/thumbs/30d19b8444.jpg +0 -0
- package/kb/references/thumbs/3173c71d73.jpg +0 -0
- package/kb/references/thumbs/31e59e4518.jpg +0 -0
- package/kb/references/thumbs/322b8960e8.jpg +0 -0
- package/kb/references/thumbs/325c9be6f4.jpg +0 -0
- package/kb/references/thumbs/3273338982.jpg +0 -0
- package/kb/references/thumbs/32f8387f38.jpg +0 -0
- package/kb/references/thumbs/332f6b74c3.jpg +0 -0
- package/kb/references/thumbs/334b146b6a.jpg +0 -0
- package/kb/references/thumbs/339abd60e4.jpg +0 -0
- package/kb/references/thumbs/33e88ec295.jpg +0 -0
- package/kb/references/thumbs/340931b5d4.jpg +0 -0
- package/kb/references/thumbs/34165a93bd.jpg +0 -0
- package/kb/references/thumbs/34d0575dd7.jpg +0 -0
- package/kb/references/thumbs/3549e75f0a.jpg +0 -0
- package/kb/references/thumbs/35827f1561.jpg +0 -0
- package/kb/references/thumbs/37c50280ec.jpg +0 -0
- package/kb/references/thumbs/37e66ecf11.jpg +0 -0
- package/kb/references/thumbs/3841a04fdc.jpg +0 -0
- package/kb/references/thumbs/38490c088f.jpg +0 -0
- package/kb/references/thumbs/3850319e9f.jpg +0 -0
- package/kb/references/thumbs/3856a64166.jpg +0 -0
- package/kb/references/thumbs/3881f211c2.jpg +0 -0
- package/kb/references/thumbs/38c7dde2f3.jpg +0 -0
- package/kb/references/thumbs/38ce9e486c.jpg +0 -0
- package/kb/references/thumbs/390ea8e01b.jpg +0 -0
- package/kb/references/thumbs/391b7fc27c.jpg +0 -0
- package/kb/references/thumbs/395f7214dc.jpg +0 -0
- package/kb/references/thumbs/39e81a5db2.jpg +0 -0
- package/kb/references/thumbs/3a67c8d655.jpg +0 -0
- package/kb/references/thumbs/3a89c25e3b.jpg +0 -0
- package/kb/references/thumbs/3aa0837542.jpg +0 -0
- package/kb/references/thumbs/3aae18aa8a.jpg +0 -0
- package/kb/references/thumbs/3bdbe767db.jpg +0 -0
- package/kb/references/thumbs/3c0616fc7f.jpg +0 -0
- package/kb/references/thumbs/3c18e9db1d.jpg +0 -0
- package/kb/references/thumbs/3c5a14076c.jpg +0 -0
- package/kb/references/thumbs/3ca9ec15c6.jpg +0 -0
- package/kb/references/thumbs/3d7756fd35.jpg +0 -0
- package/kb/references/thumbs/3dd45bd33d.jpg +0 -0
- package/kb/references/thumbs/3de72d5414.jpg +0 -0
- package/kb/references/thumbs/3dede597af.jpg +0 -0
- package/kb/references/thumbs/3ea948619e.jpg +0 -0
- package/kb/references/thumbs/402c12054c.jpg +0 -0
- package/kb/references/thumbs/403ab4af90.jpg +0 -0
- package/kb/references/thumbs/40773a8c63.jpg +0 -0
- package/kb/references/thumbs/407d9583db.jpg +0 -0
- package/kb/references/thumbs/415dc1d84c.jpg +0 -0
- package/kb/references/thumbs/420b676a4f.jpg +0 -0
- package/kb/references/thumbs/42a1ee85eb.jpg +0 -0
- package/kb/references/thumbs/43059221aa.jpg +0 -0
- package/kb/references/thumbs/432fa0d22c.jpg +0 -0
- package/kb/references/thumbs/43826f20e3.jpg +0 -0
- package/kb/references/thumbs/43ac55c98a.jpg +0 -0
- package/kb/references/thumbs/43d098f3c3.jpg +0 -0
- package/kb/references/thumbs/4449d80c2c.jpg +0 -0
- package/kb/references/thumbs/44625727dc.jpg +0 -0
- package/kb/references/thumbs/4482bb87a1.jpg +0 -0
- package/kb/references/thumbs/44b078acdc.jpg +0 -0
- package/kb/references/thumbs/44d0305850.jpg +0 -0
- package/kb/references/thumbs/456bb6b59e.jpg +0 -0
- package/kb/references/thumbs/45df73ce48.jpg +0 -0
- package/kb/references/thumbs/45edb45d87.jpg +0 -0
- package/kb/references/thumbs/4671d57cd5.jpg +0 -0
- package/kb/references/thumbs/46cc108518.jpg +0 -0
- package/kb/references/thumbs/470022e614.jpg +0 -0
- package/kb/references/thumbs/4719a669ce.jpg +0 -0
- package/kb/references/thumbs/47404f5ad4.jpg +0 -0
- package/kb/references/thumbs/479d3eb977.jpg +0 -0
- package/kb/references/thumbs/479ed92ceb.jpg +0 -0
- package/kb/references/thumbs/47baed50c7.jpg +0 -0
- package/kb/references/thumbs/47fdcfd7b0.jpg +0 -0
- package/kb/references/thumbs/48fd5e94c5.jpg +0 -0
- package/kb/references/thumbs/493807917b.jpg +0 -0
- package/kb/references/thumbs/49a1c67293.jpg +0 -0
- package/kb/references/thumbs/49e2d7fafe.jpg +0 -0
- package/kb/references/thumbs/49f540fcb6.jpg +0 -0
- package/kb/references/thumbs/4a67ec4028.jpg +0 -0
- package/kb/references/thumbs/4a93275b04.jpg +0 -0
- package/kb/references/thumbs/4aae6f52da.jpg +0 -0
- package/kb/references/thumbs/4b1bae66bd.jpg +0 -0
- package/kb/references/thumbs/4b75da15a9.jpg +0 -0
- package/kb/references/thumbs/4b77789b88.jpg +0 -0
- package/kb/references/thumbs/4bc2f3f3a4.jpg +0 -0
- package/kb/references/thumbs/4c48f27b88.jpg +0 -0
- package/kb/references/thumbs/4c52bd8bfb.jpg +0 -0
- package/kb/references/thumbs/4c9b4acc60.jpg +0 -0
- package/kb/references/thumbs/4cbf0752d4.jpg +0 -0
- package/kb/references/thumbs/4cd2672517.jpg +0 -0
- package/kb/references/thumbs/4dd22a8181.jpg +0 -0
- package/kb/references/thumbs/4ee3447314.jpg +0 -0
- package/kb/references/thumbs/4ef29c8144.jpg +0 -0
- package/kb/references/thumbs/4f82fadfd6.jpg +0 -0
- package/kb/references/thumbs/4fc9b643d8.jpg +0 -0
- package/kb/references/thumbs/50549524b0.jpg +0 -0
- package/kb/references/thumbs/509a615883.jpg +0 -0
- package/kb/references/thumbs/50c03ef855.jpg +0 -0
- package/kb/references/thumbs/50cf9acad6.jpg +0 -0
- package/kb/references/thumbs/51131b025c.jpg +0 -0
- package/kb/references/thumbs/51da1124f0.jpg +0 -0
- package/kb/references/thumbs/524d5e7288.jpg +0 -0
- package/kb/references/thumbs/5251247c81.jpg +0 -0
- package/kb/references/thumbs/526b91b7ec.jpg +0 -0
- package/kb/references/thumbs/52f02f6c2e.jpg +0 -0
- package/kb/references/thumbs/530ab530dc.jpg +0 -0
- package/kb/references/thumbs/5335ee4404.jpg +0 -0
- package/kb/references/thumbs/5385b90939.jpg +0 -0
- package/kb/references/thumbs/53c54654cc.jpg +0 -0
- package/kb/references/thumbs/5420794c6c.jpg +0 -0
- package/kb/references/thumbs/542a9dce8b.jpg +0 -0
- package/kb/references/thumbs/5571530a5f.jpg +0 -0
- package/kb/references/thumbs/56cc68d804.jpg +0 -0
- package/kb/references/thumbs/577b7f7c44.jpg +0 -0
- package/kb/references/thumbs/57adf8f1bb.jpg +0 -0
- package/kb/references/thumbs/57c5f5e3a6.jpg +0 -0
- package/kb/references/thumbs/57ffe4e839.jpg +0 -0
- package/kb/references/thumbs/5817dfc7d6.jpg +0 -0
- package/kb/references/thumbs/581a182a7a.jpg +0 -0
- package/kb/references/thumbs/58807679c8.jpg +0 -0
- package/kb/references/thumbs/589a1d9111.jpg +0 -0
- package/kb/references/thumbs/59167391ab.jpg +0 -0
- package/kb/references/thumbs/5a70420166.jpg +0 -0
- package/kb/references/thumbs/5b10df1b8d.jpg +0 -0
- package/kb/references/thumbs/5b7a712fdb.jpg +0 -0
- package/kb/references/thumbs/5bc46b92ad.jpg +0 -0
- package/kb/references/thumbs/5c0546a120.jpg +0 -0
- package/kb/references/thumbs/5c2b6125a8.jpg +0 -0
- package/kb/references/thumbs/5c536b9e42.jpg +0 -0
- package/kb/references/thumbs/5c8e441d30.jpg +0 -0
- package/kb/references/thumbs/5cb6f1baa5.jpg +0 -0
- package/kb/references/thumbs/5ce6c1f21e.jpg +0 -0
- package/kb/references/thumbs/5cef052c0a.jpg +0 -0
- package/kb/references/thumbs/5d08438209.jpg +0 -0
- package/kb/references/thumbs/5d0f9af9b0.jpg +0 -0
- package/kb/references/thumbs/5d300ed332.jpg +0 -0
- package/kb/references/thumbs/5d708a4794.jpg +0 -0
- package/kb/references/thumbs/5de8826a98.jpg +0 -0
- package/kb/references/thumbs/5df7bff22c.jpg +0 -0
- package/kb/references/thumbs/5e087d0f00.jpg +0 -0
- package/kb/references/thumbs/5e44e70ca0.jpg +0 -0
- package/kb/references/thumbs/5eff5d80ce.jpg +0 -0
- package/kb/references/thumbs/5f015c96b1.jpg +0 -0
- package/kb/references/thumbs/5f3289b7c4.jpg +0 -0
- package/kb/references/thumbs/5f830c40eb.jpg +0 -0
- package/kb/references/thumbs/60c4c3527b.jpg +0 -0
- package/kb/references/thumbs/60e9e594dd.jpg +0 -0
- package/kb/references/thumbs/615421d7be.jpg +0 -0
- package/kb/references/thumbs/6176e4004f.jpg +0 -0
- package/kb/references/thumbs/61f0fe5e06.jpg +0 -0
- package/kb/references/thumbs/6213785db4.jpg +0 -0
- package/kb/references/thumbs/62a670ae09.jpg +0 -0
- package/kb/references/thumbs/63cc12981b.jpg +0 -0
- package/kb/references/thumbs/641f15cc71.jpg +0 -0
- package/kb/references/thumbs/642ab2081d.jpg +0 -0
- package/kb/references/thumbs/644a59bf6e.jpg +0 -0
- package/kb/references/thumbs/644da8a8e3.jpg +0 -0
- package/kb/references/thumbs/6458986897.jpg +0 -0
- package/kb/references/thumbs/64cfbd7b93.jpg +0 -0
- package/kb/references/thumbs/661a57686a.jpg +0 -0
- package/kb/references/thumbs/66355a813a.jpg +0 -0
- package/kb/references/thumbs/664396dd44.jpg +0 -0
- package/kb/references/thumbs/66d832d65f.jpg +0 -0
- package/kb/references/thumbs/66de9e9833.jpg +0 -0
- package/kb/references/thumbs/6750964fd9.jpg +0 -0
- package/kb/references/thumbs/67c7164832.jpg +0 -0
- package/kb/references/thumbs/681600b6cd.jpg +0 -0
- package/kb/references/thumbs/682e75afe4.jpg +0 -0
- package/kb/references/thumbs/69274bc952.jpg +0 -0
- package/kb/references/thumbs/696ec08c52.jpg +0 -0
- package/kb/references/thumbs/69760111cc.jpg +0 -0
- package/kb/references/thumbs/697e32664f.jpg +0 -0
- package/kb/references/thumbs/69df92544b.jpg +0 -0
- package/kb/references/thumbs/69e48c5229.jpg +0 -0
- package/kb/references/thumbs/6a5fb75de1.jpg +0 -0
- package/kb/references/thumbs/6a7389e472.jpg +0 -0
- package/kb/references/thumbs/6a9b041e02.jpg +0 -0
- package/kb/references/thumbs/6ab2fa93ee.jpg +0 -0
- package/kb/references/thumbs/6ae3400319.jpg +0 -0
- package/kb/references/thumbs/6b21344bf3.jpg +0 -0
- package/kb/references/thumbs/6bd1b67a8a.jpg +0 -0
- package/kb/references/thumbs/6c99156c4f.jpg +0 -0
- package/kb/references/thumbs/6cc9b65384.jpg +0 -0
- package/kb/references/thumbs/6d15830a73.jpg +0 -0
- package/kb/references/thumbs/6d4c33d180.jpg +0 -0
- package/kb/references/thumbs/6e36815799.jpg +0 -0
- package/kb/references/thumbs/6eddb9cbfc.jpg +0 -0
- package/kb/references/thumbs/6f97968a7c.jpg +0 -0
- package/kb/references/thumbs/6fa0716a7d.jpg +0 -0
- package/kb/references/thumbs/6facd57184.jpg +0 -0
- package/kb/references/thumbs/6fd57b785a.jpg +0 -0
- package/kb/references/thumbs/700b3cb185.jpg +0 -0
- package/kb/references/thumbs/71197443fa.jpg +0 -0
- package/kb/references/thumbs/72082bc9ee.jpg +0 -0
- package/kb/references/thumbs/72453db479.jpg +0 -0
- package/kb/references/thumbs/72cd64d500.jpg +0 -0
- package/kb/references/thumbs/72d1e75283.jpg +0 -0
- package/kb/references/thumbs/72e13f7f5b.jpg +0 -0
- package/kb/references/thumbs/7459f8e644.jpg +0 -0
- package/kb/references/thumbs/7470d55c79.jpg +0 -0
- package/kb/references/thumbs/74c468f02a.jpg +0 -0
- package/kb/references/thumbs/74fed6eb77.jpg +0 -0
- package/kb/references/thumbs/756e05080d.jpg +0 -0
- package/kb/references/thumbs/75df7e5f49.jpg +0 -0
- package/kb/references/thumbs/76226da6ef.jpg +0 -0
- package/kb/references/thumbs/76a34aa056.jpg +0 -0
- package/kb/references/thumbs/76c7076589.jpg +0 -0
- package/kb/references/thumbs/76cccc396c.jpg +0 -0
- package/kb/references/thumbs/774654789f.jpg +0 -0
- package/kb/references/thumbs/7746cc494d.jpg +0 -0
- package/kb/references/thumbs/7766e36aa3.jpg +0 -0
- package/kb/references/thumbs/78049331ef.jpg +0 -0
- package/kb/references/thumbs/78808a0ca5.jpg +0 -0
- package/kb/references/thumbs/7890b0a310.jpg +0 -0
- package/kb/references/thumbs/78911975e6.jpg +0 -0
- package/kb/references/thumbs/78d289d5a0.jpg +0 -0
- package/kb/references/thumbs/794126267e.jpg +0 -0
- package/kb/references/thumbs/7976eb9025.jpg +0 -0
- package/kb/references/thumbs/798519ec7c.jpg +0 -0
- package/kb/references/thumbs/7a6cc5eecc.jpg +0 -0
- package/kb/references/thumbs/7ac8a7cd4a.jpg +0 -0
- package/kb/references/thumbs/7b1341d61d.jpg +0 -0
- package/kb/references/thumbs/7b9c4031e3.jpg +0 -0
- package/kb/references/thumbs/7ba5ad3779.jpg +0 -0
- package/kb/references/thumbs/7be6eb2bd0.jpg +0 -0
- package/kb/references/thumbs/7c30864f5d.jpg +0 -0
- package/kb/references/thumbs/7c379b5e17.jpg +0 -0
- package/kb/references/thumbs/7c4050eb02.jpg +0 -0
- package/kb/references/thumbs/7ca47b3221.jpg +0 -0
- package/kb/references/thumbs/7d43516bd7.jpg +0 -0
- package/kb/references/thumbs/7da9dbb98a.jpg +0 -0
- package/kb/references/thumbs/7ddda8f57c.jpg +0 -0
- package/kb/references/thumbs/7ece6d215c.jpg +0 -0
- package/kb/references/thumbs/7eebf029de.jpg +0 -0
- package/kb/references/thumbs/7f45483c15.jpg +0 -0
- package/kb/references/thumbs/7fde06eaa5.jpg +0 -0
- package/kb/references/thumbs/80407b97e9.jpg +0 -0
- package/kb/references/thumbs/80f0a6cf4b.jpg +0 -0
- package/kb/references/thumbs/8118b451b8.jpg +0 -0
- package/kb/references/thumbs/816baed4a8.jpg +0 -0
- package/kb/references/thumbs/817d2d15d9.jpg +0 -0
- package/kb/references/thumbs/8260cb430d.jpg +0 -0
- package/kb/references/thumbs/827b562899.jpg +0 -0
- package/kb/references/thumbs/8293cf1e92.jpg +0 -0
- package/kb/references/thumbs/8294653169.jpg +0 -0
- package/kb/references/thumbs/83061f871f.jpg +0 -0
- package/kb/references/thumbs/833df778ca.jpg +0 -0
- package/kb/references/thumbs/83d3acaafc.jpg +0 -0
- package/kb/references/thumbs/844c6efeff.jpg +0 -0
- package/kb/references/thumbs/84563d482a.jpg +0 -0
- package/kb/references/thumbs/848082dd94.jpg +0 -0
- package/kb/references/thumbs/8494b1da94.jpg +0 -0
- package/kb/references/thumbs/84b71014be.jpg +0 -0
- package/kb/references/thumbs/84be4a5f3c.jpg +0 -0
- package/kb/references/thumbs/84fd0fd25a.jpg +0 -0
- package/kb/references/thumbs/853e488e22.jpg +0 -0
- package/kb/references/thumbs/858c91585d.jpg +0 -0
- package/kb/references/thumbs/85903e8fe9.jpg +0 -0
- package/kb/references/thumbs/86597d43fd.jpg +0 -0
- package/kb/references/thumbs/866eb99500.jpg +0 -0
- package/kb/references/thumbs/86ac050340.jpg +0 -0
- package/kb/references/thumbs/86afec7b64.jpg +0 -0
- package/kb/references/thumbs/87238127f5.jpg +0 -0
- package/kb/references/thumbs/87321df792.jpg +0 -0
- package/kb/references/thumbs/87460f70cd.jpg +0 -0
- package/kb/references/thumbs/8770dfeaec.jpg +0 -0
- package/kb/references/thumbs/8798451a8c.jpg +0 -0
- package/kb/references/thumbs/87da1f34a3.jpg +0 -0
- package/kb/references/thumbs/882cdf8c05.jpg +0 -0
- package/kb/references/thumbs/8839f4106f.jpg +0 -0
- package/kb/references/thumbs/8844455212.jpg +0 -0
- package/kb/references/thumbs/88abba0497.jpg +0 -0
- package/kb/references/thumbs/88b372435d.jpg +0 -0
- package/kb/references/thumbs/88bd4f35fa.jpg +0 -0
- package/kb/references/thumbs/88c71a075e.jpg +0 -0
- package/kb/references/thumbs/892e5f048e.jpg +0 -0
- package/kb/references/thumbs/893cc8e920.jpg +0 -0
- package/kb/references/thumbs/896c198814.jpg +0 -0
- package/kb/references/thumbs/8a8e22f756.jpg +0 -0
- package/kb/references/thumbs/8a9d8a35cb.jpg +0 -0
- package/kb/references/thumbs/8ab1d67fec.jpg +0 -0
- package/kb/references/thumbs/8ab201fe12.jpg +0 -0
- package/kb/references/thumbs/8ac372c102.jpg +0 -0
- package/kb/references/thumbs/8b15736d62.jpg +0 -0
- package/kb/references/thumbs/8b1d8d6a05.jpg +0 -0
- package/kb/references/thumbs/8bb6050e20.jpg +0 -0
- package/kb/references/thumbs/8c6c9d1577.jpg +0 -0
- package/kb/references/thumbs/8d337851e0.jpg +0 -0
- package/kb/references/thumbs/8d44b33cc5.jpg +0 -0
- package/kb/references/thumbs/8d4536ff3b.jpg +0 -0
- package/kb/references/thumbs/8d9b99454a.jpg +0 -0
- package/kb/references/thumbs/8dda2303ff.jpg +0 -0
- package/kb/references/thumbs/8dec722d62.jpg +0 -0
- package/kb/references/thumbs/8e0ea4ca74.jpg +0 -0
- package/kb/references/thumbs/8ebba84d69.jpg +0 -0
- package/kb/references/thumbs/8ef09140c0.jpg +0 -0
- package/kb/references/thumbs/8f2928a1b0.jpg +0 -0
- package/kb/references/thumbs/8f88f9ddba.jpg +0 -0
- package/kb/references/thumbs/8fa4451009.jpg +0 -0
- package/kb/references/thumbs/90109b0e02.jpg +0 -0
- package/kb/references/thumbs/90e854e5c9.jpg +0 -0
- package/kb/references/thumbs/914e79f893.jpg +0 -0
- package/kb/references/thumbs/9161369197.jpg +0 -0
- package/kb/references/thumbs/9165c87d6f.jpg +0 -0
- package/kb/references/thumbs/9193f6558a.jpg +0 -0
- package/kb/references/thumbs/91ac7df877.jpg +0 -0
- package/kb/references/thumbs/9216bd4931.jpg +0 -0
- package/kb/references/thumbs/922ae8a26a.jpg +0 -0
- package/kb/references/thumbs/92a70e6867.jpg +0 -0
- package/kb/references/thumbs/92c77ece22.jpg +0 -0
- package/kb/references/thumbs/92e5914fbf.jpg +0 -0
- package/kb/references/thumbs/92ee36419a.jpg +0 -0
- package/kb/references/thumbs/94153a60b0.jpg +0 -0
- package/kb/references/thumbs/9449666640.jpg +0 -0
- package/kb/references/thumbs/944be6a646.jpg +0 -0
- package/kb/references/thumbs/945831476e.jpg +0 -0
- package/kb/references/thumbs/94c1af82f4.jpg +0 -0
- package/kb/references/thumbs/9599d6d589.jpg +0 -0
- package/kb/references/thumbs/960710f4cf.jpg +0 -0
- package/kb/references/thumbs/9608f12d64.jpg +0 -0
- package/kb/references/thumbs/962dabfaa0.jpg +0 -0
- package/kb/references/thumbs/965a3a95c6.jpg +0 -0
- package/kb/references/thumbs/9672ed5ae4.jpg +0 -0
- package/kb/references/thumbs/96891ae9c1.jpg +0 -0
- package/kb/references/thumbs/96e1907c99.jpg +0 -0
- package/kb/references/thumbs/96f25b6578.jpg +0 -0
- package/kb/references/thumbs/97211df9ae.jpg +0 -0
- package/kb/references/thumbs/9769d763a5.jpg +0 -0
- package/kb/references/thumbs/9792bd6d05.jpg +0 -0
- package/kb/references/thumbs/97d2837e3e.jpg +0 -0
- package/kb/references/thumbs/97d90d1d85.jpg +0 -0
- package/kb/references/thumbs/97fcd5774a.jpg +0 -0
- package/kb/references/thumbs/980f68564e.jpg +0 -0
- package/kb/references/thumbs/98511fb393.jpg +0 -0
- package/kb/references/thumbs/98f8fa694d.jpg +0 -0
- package/kb/references/thumbs/9a42c6bb97.jpg +0 -0
- package/kb/references/thumbs/9ab3600a06.jpg +0 -0
- package/kb/references/thumbs/9ab48d9130.jpg +0 -0
- package/kb/references/thumbs/9ad519197d.jpg +0 -0
- package/kb/references/thumbs/9b1382c657.jpg +0 -0
- package/kb/references/thumbs/9b6cc1e077.jpg +0 -0
- package/kb/references/thumbs/9beede8480.jpg +0 -0
- package/kb/references/thumbs/9bf8976952.jpg +0 -0
- package/kb/references/thumbs/9cace7b75a.jpg +0 -0
- package/kb/references/thumbs/9cdcc5745e.jpg +0 -0
- package/kb/references/thumbs/9d0b269074.jpg +0 -0
- package/kb/references/thumbs/9d41788b48.jpg +0 -0
- package/kb/references/thumbs/9d475bd6af.jpg +0 -0
- package/kb/references/thumbs/9e6bc543d0.jpg +0 -0
- package/kb/references/thumbs/9ed0e0a206.jpg +0 -0
- package/kb/references/thumbs/9ef538de13.jpg +0 -0
- package/kb/references/thumbs/9efc373ab4.jpg +0 -0
- package/kb/references/thumbs/9f4a939fa5.jpg +0 -0
- package/kb/references/thumbs/9f8d12d7b9.jpg +0 -0
- package/kb/references/thumbs/9fd5e3efa7.jpg +0 -0
- package/kb/references/thumbs/a0a9b9c572.jpg +0 -0
- package/kb/references/thumbs/a29ca9b185.jpg +0 -0
- package/kb/references/thumbs/a2a42884af.jpg +0 -0
- package/kb/references/thumbs/a2f5064e34.jpg +0 -0
- package/kb/references/thumbs/a3112ce672.jpg +0 -0
- package/kb/references/thumbs/a3437736d1.jpg +0 -0
- package/kb/references/thumbs/a372667e76.jpg +0 -0
- package/kb/references/thumbs/a39bae94e9.jpg +0 -0
- package/kb/references/thumbs/a3fc75d94c.jpg +0 -0
- package/kb/references/thumbs/a440487631.jpg +0 -0
- package/kb/references/thumbs/a4993d5fb5.jpg +0 -0
- package/kb/references/thumbs/a500476a86.jpg +0 -0
- package/kb/references/thumbs/a55506bf46.jpg +0 -0
- package/kb/references/thumbs/a59a5f9843.jpg +0 -0
- package/kb/references/thumbs/a5bce0eede.jpg +0 -0
- package/kb/references/thumbs/a5d921e1f0.jpg +0 -0
- package/kb/references/thumbs/a5e19d4637.jpg +0 -0
- package/kb/references/thumbs/a5f92b97d5.jpg +0 -0
- package/kb/references/thumbs/a6562c210a.jpg +0 -0
- package/kb/references/thumbs/a6f61a8d09.jpg +0 -0
- package/kb/references/thumbs/a719fdf663.jpg +0 -0
- package/kb/references/thumbs/a724e5442f.jpg +0 -0
- package/kb/references/thumbs/a852b4319f.jpg +0 -0
- package/kb/references/thumbs/a896c08448.jpg +0 -0
- package/kb/references/thumbs/a8d190a4b8.jpg +0 -0
- package/kb/references/thumbs/a8dcdd57d7.jpg +0 -0
- package/kb/references/thumbs/a951347e18.jpg +0 -0
- package/kb/references/thumbs/a9a1a0bf7d.jpg +0 -0
- package/kb/references/thumbs/a9b72986a8.jpg +0 -0
- package/kb/references/thumbs/aa11555ba8.jpg +0 -0
- package/kb/references/thumbs/aa4aab9093.jpg +0 -0
- package/kb/references/thumbs/aa89b96658.jpg +0 -0
- package/kb/references/thumbs/aaeb3739b6.jpg +0 -0
- package/kb/references/thumbs/ab25a608ec.jpg +0 -0
- package/kb/references/thumbs/ab34b62268.jpg +0 -0
- package/kb/references/thumbs/ab3b0217bb.jpg +0 -0
- package/kb/references/thumbs/ac70c04afb.jpg +0 -0
- package/kb/references/thumbs/ace0879117.jpg +0 -0
- package/kb/references/thumbs/ad0515ae55.jpg +0 -0
- package/kb/references/thumbs/ad66b25b47.jpg +0 -0
- package/kb/references/thumbs/ad68229d2f.jpg +0 -0
- package/kb/references/thumbs/add6480693.jpg +0 -0
- package/kb/references/thumbs/ae5b8c3b8c.jpg +0 -0
- package/kb/references/thumbs/ae81247b47.jpg +0 -0
- package/kb/references/thumbs/af8aa54379.jpg +0 -0
- package/kb/references/thumbs/afa80dedd4.jpg +0 -0
- package/kb/references/thumbs/afe04d730f.jpg +0 -0
- package/kb/references/thumbs/b09a7dc315.jpg +0 -0
- package/kb/references/thumbs/b0c02629f6.jpg +0 -0
- package/kb/references/thumbs/b1cb4f91de.jpg +0 -0
- package/kb/references/thumbs/b1d4c13c92.jpg +0 -0
- package/kb/references/thumbs/b20eef86db.jpg +0 -0
- package/kb/references/thumbs/b3136ccdde.jpg +0 -0
- package/kb/references/thumbs/b3f5e8d7dd.jpg +0 -0
- package/kb/references/thumbs/b44adb81c9.jpg +0 -0
- package/kb/references/thumbs/b457a5894b.jpg +0 -0
- package/kb/references/thumbs/b461281e0f.jpg +0 -0
- package/kb/references/thumbs/b4942644f0.jpg +0 -0
- package/kb/references/thumbs/b49f8eccad.jpg +0 -0
- package/kb/references/thumbs/b56c69be23.jpg +0 -0
- package/kb/references/thumbs/b59786b33c.jpg +0 -0
- package/kb/references/thumbs/b5d368ce5a.jpg +0 -0
- package/kb/references/thumbs/b5eb442406.jpg +0 -0
- package/kb/references/thumbs/b7fdabf4ab.jpg +0 -0
- package/kb/references/thumbs/b88ee8d235.jpg +0 -0
- package/kb/references/thumbs/b8a4e5be8a.jpg +0 -0
- package/kb/references/thumbs/b8c85b661c.jpg +0 -0
- package/kb/references/thumbs/ba1b8e7435.jpg +0 -0
- package/kb/references/thumbs/ba9a593eed.jpg +0 -0
- package/kb/references/thumbs/baa7afc201.jpg +0 -0
- package/kb/references/thumbs/baf74398f7.jpg +0 -0
- package/kb/references/thumbs/bb3e947c10.jpg +0 -0
- package/kb/references/thumbs/bb4c1bb7c1.jpg +0 -0
- package/kb/references/thumbs/bbaa25cc8a.jpg +0 -0
- package/kb/references/thumbs/bc7e7f88cc.jpg +0 -0
- package/kb/references/thumbs/bc9d5b58f5.jpg +0 -0
- package/kb/references/thumbs/bcc99a51f7.jpg +0 -0
- package/kb/references/thumbs/bce13dd1c1.jpg +0 -0
- package/kb/references/thumbs/bd079a6130.jpg +0 -0
- package/kb/references/thumbs/bd2d70dda7.jpg +0 -0
- package/kb/references/thumbs/bd5895c5f2.jpg +0 -0
- package/kb/references/thumbs/bde8e31d62.jpg +0 -0
- package/kb/references/thumbs/be084e78f3.jpg +0 -0
- package/kb/references/thumbs/be94f170c8.jpg +0 -0
- package/kb/references/thumbs/bed33654f7.jpg +0 -0
- package/kb/references/thumbs/beeb9a0c18.jpg +0 -0
- package/kb/references/thumbs/bef42094dc.jpg +0 -0
- package/kb/references/thumbs/bf625496fa.jpg +0 -0
- package/kb/references/thumbs/bf771f1398.jpg +0 -0
- package/kb/references/thumbs/c0ddefa3d9.jpg +0 -0
- package/kb/references/thumbs/c0f01e536e.jpg +0 -0
- package/kb/references/thumbs/c1d592b678.jpg +0 -0
- package/kb/references/thumbs/c1e83e1b3e.jpg +0 -0
- package/kb/references/thumbs/c2168f8096.jpg +0 -0
- package/kb/references/thumbs/c249cd6b17.jpg +0 -0
- package/kb/references/thumbs/c2e3d4feed.jpg +0 -0
- package/kb/references/thumbs/c3cec01df1.jpg +0 -0
- package/kb/references/thumbs/c47bedb42d.jpg +0 -0
- package/kb/references/thumbs/c4b03b4680.jpg +0 -0
- package/kb/references/thumbs/c4e6d18ec3.jpg +0 -0
- package/kb/references/thumbs/c5477e2877.jpg +0 -0
- package/kb/references/thumbs/c566794674.jpg +0 -0
- package/kb/references/thumbs/c5b945afbb.jpg +0 -0
- package/kb/references/thumbs/c5e4659497.jpg +0 -0
- package/kb/references/thumbs/c622786702.jpg +0 -0
- package/kb/references/thumbs/c6250649ca.jpg +0 -0
- package/kb/references/thumbs/c6261a9526.jpg +0 -0
- package/kb/references/thumbs/c62e609076.jpg +0 -0
- package/kb/references/thumbs/c6602d3e85.jpg +0 -0
- package/kb/references/thumbs/c6c1a16e40.jpg +0 -0
- package/kb/references/thumbs/c77f932157.jpg +0 -0
- package/kb/references/thumbs/c79788f01e.jpg +0 -0
- package/kb/references/thumbs/c7a511ad1e.jpg +0 -0
- package/kb/references/thumbs/c7acfbc3c8.jpg +0 -0
- package/kb/references/thumbs/c7bb6d1bb8.jpg +0 -0
- package/kb/references/thumbs/c829eadcb9.jpg +0 -0
- package/kb/references/thumbs/c891fd9d85.jpg +0 -0
- package/kb/references/thumbs/c89f812ee3.jpg +0 -0
- package/kb/references/thumbs/c8a85b9f61.jpg +0 -0
- package/kb/references/thumbs/c8fdf85c9a.jpg +0 -0
- package/kb/references/thumbs/c961ac1031.jpg +0 -0
- package/kb/references/thumbs/c9fd3f88d8.jpg +0 -0
- package/kb/references/thumbs/ca0d6399c3.jpg +0 -0
- package/kb/references/thumbs/ca316c83e4.jpg +0 -0
- package/kb/references/thumbs/ca3b93aa0d.jpg +0 -0
- package/kb/references/thumbs/cb0596a85b.jpg +0 -0
- package/kb/references/thumbs/cb95a5c3ef.jpg +0 -0
- package/kb/references/thumbs/cbe238b656.jpg +0 -0
- package/kb/references/thumbs/cbf530e608.jpg +0 -0
- package/kb/references/thumbs/cc173494ec.jpg +0 -0
- package/kb/references/thumbs/ccb664bddf.jpg +0 -0
- package/kb/references/thumbs/ccf69d36cd.jpg +0 -0
- package/kb/references/thumbs/ccf759db42.jpg +0 -0
- package/kb/references/thumbs/cd2a285807.jpg +0 -0
- package/kb/references/thumbs/cd4a24a8ca.jpg +0 -0
- package/kb/references/thumbs/cdb3fe8938.jpg +0 -0
- package/kb/references/thumbs/cdce1b9bc6.jpg +0 -0
- package/kb/references/thumbs/cde3aa761a.jpg +0 -0
- package/kb/references/thumbs/ce9d5cd9c2.jpg +0 -0
- package/kb/references/thumbs/ceb01f8a34.jpg +0 -0
- package/kb/references/thumbs/cee15c98d0.jpg +0 -0
- package/kb/references/thumbs/cf6944ddae.jpg +0 -0
- package/kb/references/thumbs/d15dd21cd8.jpg +0 -0
- package/kb/references/thumbs/d1633bf2ed.jpg +0 -0
- package/kb/references/thumbs/d16a838000.jpg +0 -0
- package/kb/references/thumbs/d1cf87e9f0.jpg +0 -0
- package/kb/references/thumbs/d32511d913.jpg +0 -0
- package/kb/references/thumbs/d327e9dedd.jpg +0 -0
- package/kb/references/thumbs/d35bf6c85e.jpg +0 -0
- package/kb/references/thumbs/d37afc9d61.jpg +0 -0
- package/kb/references/thumbs/d3b66655c7.jpg +0 -0
- package/kb/references/thumbs/d40b4172b6.jpg +0 -0
- package/kb/references/thumbs/d4c40d1824.jpg +0 -0
- package/kb/references/thumbs/d4cb55a4b6.jpg +0 -0
- package/kb/references/thumbs/d4f0c30f7e.jpg +0 -0
- package/kb/references/thumbs/d51cce3ae5.jpg +0 -0
- package/kb/references/thumbs/d52948f9ba.jpg +0 -0
- package/kb/references/thumbs/d62bd3cba4.jpg +0 -0
- package/kb/references/thumbs/d668a21c92.jpg +0 -0
- package/kb/references/thumbs/d685072c52.jpg +0 -0
- package/kb/references/thumbs/d6d7b96093.jpg +0 -0
- package/kb/references/thumbs/d7cd874b21.jpg +0 -0
- package/kb/references/thumbs/d7e111736a.jpg +0 -0
- package/kb/references/thumbs/d88325f832.jpg +0 -0
- package/kb/references/thumbs/d9272ded76.jpg +0 -0
- package/kb/references/thumbs/d962e7c654.jpg +0 -0
- package/kb/references/thumbs/d97f000ee2.jpg +0 -0
- package/kb/references/thumbs/d9c1ae2543.jpg +0 -0
- package/kb/references/thumbs/d9ccb3cac8.jpg +0 -0
- package/kb/references/thumbs/da99019680.jpg +0 -0
- package/kb/references/thumbs/da9b8bc615.jpg +0 -0
- package/kb/references/thumbs/daafbee2c1.jpg +0 -0
- package/kb/references/thumbs/db0f11f143.jpg +0 -0
- package/kb/references/thumbs/db5dd367f5.jpg +0 -0
- package/kb/references/thumbs/db69677866.jpg +0 -0
- package/kb/references/thumbs/db87c1956e.jpg +0 -0
- package/kb/references/thumbs/dbb86d8bda.jpg +0 -0
- package/kb/references/thumbs/dbd3a8ff2a.jpg +0 -0
- package/kb/references/thumbs/dbdf4b2794.jpg +0 -0
- package/kb/references/thumbs/dd4c19b4b1.jpg +0 -0
- package/kb/references/thumbs/dd98d9f6fa.jpg +0 -0
- package/kb/references/thumbs/ddb00e3b6a.jpg +0 -0
- package/kb/references/thumbs/dde3541a5c.jpg +0 -0
- package/kb/references/thumbs/de2a4da502.jpg +0 -0
- package/kb/references/thumbs/de4c387a66.jpg +0 -0
- package/kb/references/thumbs/de5618fa82.jpg +0 -0
- package/kb/references/thumbs/de6bec2538.jpg +0 -0
- package/kb/references/thumbs/dea13cbb1f.jpg +0 -0
- package/kb/references/thumbs/deff9202aa.jpg +0 -0
- package/kb/references/thumbs/df12835f8d.jpg +0 -0
- package/kb/references/thumbs/df57acbb3d.jpg +0 -0
- package/kb/references/thumbs/df8265009e.jpg +0 -0
- package/kb/references/thumbs/dfc99a1e8e.jpg +0 -0
- package/kb/references/thumbs/dfc9fde460.jpg +0 -0
- package/kb/references/thumbs/e038348eee.jpg +0 -0
- package/kb/references/thumbs/e04c2ae1d5.jpg +0 -0
- package/kb/references/thumbs/e070345c43.jpg +0 -0
- package/kb/references/thumbs/e0a0c84d47.jpg +0 -0
- package/kb/references/thumbs/e0af1e6b9e.jpg +0 -0
- package/kb/references/thumbs/e1025942c4.jpg +0 -0
- package/kb/references/thumbs/e11b6f5b82.jpg +0 -0
- package/kb/references/thumbs/e1553de3fc.jpg +0 -0
- package/kb/references/thumbs/e162ebe7cd.jpg +0 -0
- package/kb/references/thumbs/e1f1e531d8.jpg +0 -0
- package/kb/references/thumbs/e20842e5c9.jpg +0 -0
- package/kb/references/thumbs/e24e7d949b.jpg +0 -0
- package/kb/references/thumbs/e2a3e5d10a.jpg +0 -0
- package/kb/references/thumbs/e2de02615a.jpg +0 -0
- package/kb/references/thumbs/e305dad7dd.jpg +0 -0
- package/kb/references/thumbs/e52e3ef97f.jpg +0 -0
- package/kb/references/thumbs/e570e92d06.jpg +0 -0
- package/kb/references/thumbs/e583932fb9.jpg +0 -0
- package/kb/references/thumbs/e5da3c038f.jpg +0 -0
- package/kb/references/thumbs/e657634af3.jpg +0 -0
- package/kb/references/thumbs/e67946e3e1.jpg +0 -0
- package/kb/references/thumbs/e69e0f3639.jpg +0 -0
- package/kb/references/thumbs/e6ebe66031.jpg +0 -0
- package/kb/references/thumbs/e7db9563c9.jpg +0 -0
- package/kb/references/thumbs/e84a4c3b7b.jpg +0 -0
- package/kb/references/thumbs/e84cf52c27.jpg +0 -0
- package/kb/references/thumbs/e8707cf6e8.jpg +0 -0
- package/kb/references/thumbs/e888890b40.jpg +0 -0
- package/kb/references/thumbs/e8a502b418.jpg +0 -0
- package/kb/references/thumbs/e8ba68371d.jpg +0 -0
- package/kb/references/thumbs/e9098f54cc.jpg +0 -0
- package/kb/references/thumbs/e9144deae9.jpg +0 -0
- package/kb/references/thumbs/e93e98d757.jpg +0 -0
- package/kb/references/thumbs/e9762dd435.jpg +0 -0
- package/kb/references/thumbs/e9db4544c8.jpg +0 -0
- package/kb/references/thumbs/e9ddffeacd.jpg +0 -0
- package/kb/references/thumbs/e9e2cf1d7e.jpg +0 -0
- package/kb/references/thumbs/ea1e23e623.jpg +0 -0
- package/kb/references/thumbs/ea41200f5e.jpg +0 -0
- package/kb/references/thumbs/eaf4916e1a.jpg +0 -0
- package/kb/references/thumbs/eb2c505fc8.jpg +0 -0
- package/kb/references/thumbs/eb47943693.jpg +0 -0
- package/kb/references/thumbs/eb4ffd6625.jpg +0 -0
- package/kb/references/thumbs/eb82ac0a4d.jpg +0 -0
- package/kb/references/thumbs/ebeb345ade.jpg +0 -0
- package/kb/references/thumbs/ec4e2aba0a.jpg +0 -0
- package/kb/references/thumbs/ed683bc9f7.jpg +0 -0
- package/kb/references/thumbs/ed9e236a84.jpg +0 -0
- package/kb/references/thumbs/ee45e1caea.jpg +0 -0
- package/kb/references/thumbs/ee50bbf2e7.jpg +0 -0
- package/kb/references/thumbs/eed6ad3b7b.jpg +0 -0
- package/kb/references/thumbs/eee247fd70.jpg +0 -0
- package/kb/references/thumbs/ef87b6cb99.jpg +0 -0
- package/kb/references/thumbs/ef87dccf04.jpg +0 -0
- package/kb/references/thumbs/ef941bba1e.jpg +0 -0
- package/kb/references/thumbs/effc14fb2c.jpg +0 -0
- package/kb/references/thumbs/f04aa5a191.jpg +0 -0
- package/kb/references/thumbs/f13f12485f.jpg +0 -0
- package/kb/references/thumbs/f16a5c0fd4.jpg +0 -0
- package/kb/references/thumbs/f1ba7a7a8f.jpg +0 -0
- package/kb/references/thumbs/f1bc4c9c19.jpg +0 -0
- package/kb/references/thumbs/f1ee827878.jpg +0 -0
- package/kb/references/thumbs/f21736aeff.jpg +0 -0
- package/kb/references/thumbs/f22bc41213.jpg +0 -0
- package/kb/references/thumbs/f266aaffcc.jpg +0 -0
- package/kb/references/thumbs/f2c0ed0d65.jpg +0 -0
- package/kb/references/thumbs/f32ac710fd.jpg +0 -0
- package/kb/references/thumbs/f32b697ff6.jpg +0 -0
- package/kb/references/thumbs/f39c883904.jpg +0 -0
- package/kb/references/thumbs/f3b9d55e6e.jpg +0 -0
- package/kb/references/thumbs/f3c1763e14.jpg +0 -0
- package/kb/references/thumbs/f40853fd43.jpg +0 -0
- package/kb/references/thumbs/f4fd07dc4d.jpg +0 -0
- package/kb/references/thumbs/f50b756ee5.jpg +0 -0
- package/kb/references/thumbs/f51272e9b3.jpg +0 -0
- package/kb/references/thumbs/f538895eee.jpg +0 -0
- package/kb/references/thumbs/f5d28081b5.jpg +0 -0
- package/kb/references/thumbs/f6046c9501.jpg +0 -0
- package/kb/references/thumbs/f62e4af316.jpg +0 -0
- package/kb/references/thumbs/f6f6bffeb8.jpg +0 -0
- package/kb/references/thumbs/f736e00af6.jpg +0 -0
- package/kb/references/thumbs/f7932da47d.jpg +0 -0
- package/kb/references/thumbs/f879e118ca.jpg +0 -0
- package/kb/references/thumbs/f88257215d.jpg +0 -0
- package/kb/references/thumbs/f88c45a6d7.jpg +0 -0
- package/kb/references/thumbs/f89a7b646e.jpg +0 -0
- package/kb/references/thumbs/f8a1e7a274.jpg +0 -0
- package/kb/references/thumbs/f9183cf2b6.jpg +0 -0
- package/kb/references/thumbs/f995de5ce9.jpg +0 -0
- package/kb/references/thumbs/f9ada2c3e1.jpg +0 -0
- package/kb/references/thumbs/f9d4616f89.jpg +0 -0
- package/kb/references/thumbs/f9f4307bb0.jpg +0 -0
- package/kb/references/thumbs/fa070122c7.jpg +0 -0
- package/kb/references/thumbs/fa29cc1369.jpg +0 -0
- package/kb/references/thumbs/fa791a4dab.jpg +0 -0
- package/kb/references/thumbs/fa8060509e.jpg +0 -0
- package/kb/references/thumbs/fafeed4003.jpg +0 -0
- package/kb/references/thumbs/fb1c024f38.jpg +0 -0
- package/kb/references/thumbs/fb77aa28b3.jpg +0 -0
- package/kb/references/thumbs/fb9f7f1966.jpg +0 -0
- package/kb/references/thumbs/fba8a8c2da.jpg +0 -0
- package/kb/references/thumbs/fce2754c36.jpg +0 -0
- package/kb/references/thumbs/fce2fb83df.jpg +0 -0
- package/kb/references/thumbs/fd4c51bb47.jpg +0 -0
- package/kb/references/thumbs/fd8c269817.jpg +0 -0
- package/kb/references/thumbs/fdb7b250ca.jpg +0 -0
- package/kb/references/thumbs/fe18088de8.jpg +0 -0
- package/kb/references/thumbs/fe4f742ba7.jpg +0 -0
- package/kb/references/thumbs/fe64742ce7.jpg +0 -0
- package/kb/references/thumbs/feb5d62161.jpg +0 -0
- package/kb/references/thumbs/fed21b3e98.jpg +0 -0
- package/kb/references/thumbs/fed2205951.jpg +0 -0
- package/kb/references/thumbs/ffdacf1715.jpg +0 -0
- package/kb/sections/_buttons.md +93 -0
- package/kb/sections/_finish.md +325 -0
- package/kb/sections/about-founder-note.md +85 -0
- package/kb/sections/about-team-roster.md +86 -0
- package/kb/sections/alternating-rows-live-tiles.md +110 -0
- package/kb/sections/annotated-product-shot.md +105 -0
- package/kb/sections/asymmetric-bento-dominant.md +114 -0
- package/kb/sections/before-after-features.md +104 -0
- package/kb/sections/before-after-repair.md +107 -0
- package/kb/sections/bento-lead-tile.md +112 -0
- package/kb/sections/book-a-slot-honest.md +116 -0
- package/kb/sections/capability-prompt-ledger.md +68 -0
- package/kb/sections/case-study-band.md +113 -0
- package/kb/sections/centred-stack-hero.md +107 -0
- package/kb/sections/closing-demo-final-state.md +81 -0
- package/kb/sections/closing-full-bleed-line-and-form.md +86 -0
- package/kb/sections/closing-result-previewed.md +88 -0
- package/kb/sections/closing-three-real-steps.md +87 -0
- package/kb/sections/command-reference-table.md +70 -0
- package/kb/sections/comparison-old-way-bars.md +88 -0
- package/kb/sections/comparison-same-task-two-ways.md +88 -0
- package/kb/sections/day-of-the-place.md +102 -0
- package/kb/sections/docs-reading-rail.md +88 -0
- package/kb/sections/editorial-columns-hero.md +107 -0
- package/kb/sections/editorial-essay-pull-quote.md +112 -0
- package/kb/sections/events-calendar-list.md +107 -0
- package/kb/sections/explorable-control-demo.md +102 -0
- package/kb/sections/faq-open-answers-editorial.md +85 -0
- package/kb/sections/faq-ruled-accordion-aside.md +87 -0
- package/kb/sections/footer-closing-scene.md +84 -0
- package/kb/sections/footer-editorial-sitemap.md +85 -0
- package/kb/sections/footer-minimal-credits.md +80 -0
- package/kb/sections/full-bleed-image-band.md +103 -0
- package/kb/sections/full-bleed-image-hero.md +105 -0
- package/kb/sections/gallery-first-hero.md +109 -0
- package/kb/sections/horizontal-scroll-strip.md +101 -0
- package/kb/sections/how-i-work-own-voice.md +111 -0
- package/kb/sections/how-it-works-in-place.md +109 -0
- package/kb/sections/impact-numbers-sourced.md +109 -0
- package/kb/sections/install-steps-per-agent.md +77 -0
- package/kb/sections/masonry-real-work.md +109 -0
- package/kb/sections/numbered-editorial-columns.md +105 -0
- package/kb/sections/object-first-hero.md +106 -0
- package/kb/sections/object-timeline.md +105 -0
- package/kb/sections/one-huge-number.md +100 -0
- package/kb/sections/one-person-story.md +103 -0
- package/kb/sections/order-ahead-ticket.md +119 -0
- package/kb/sections/press-strip-quoted.md +106 -0
- package/kb/sections/pricing-comparison-table-sticky.md +94 -0
- package/kb/sections/pricing-free-pro-upgrade-moment.md +85 -0
- package/kb/sections/pricing-plan-beside-product.md +88 -0
- package/kb/sections/pricing-plans-ledger.md +94 -0
- package/kb/sections/pricing-usage-calculator.md +93 -0
- package/kb/sections/printed-menu-card.md +110 -0
- package/kb/sections/process-happening.md +102 -0
- package/kb/sections/project-index-ruled.md +106 -0
- package/kb/sections/proof-logo-cloud-with-reasons.md +82 -0
- package/kb/sections/proof-measured-numbers.md +88 -0
- package/kb/sections/proof-output-wall.md +84 -0
- package/kb/sections/proof-single-honest-quote.md +81 -0
- package/kb/sections/resources-searchable-list.md +110 -0
- package/kb/sections/rooms-and-rates.md +107 -0
- package/kb/sections/ruled-facts-table.md +108 -0
- package/kb/sections/ruled-list-pinned-visual.md +107 -0
- package/kb/sections/scroll-scrubbed-product-demo.md +103 -0
- package/kb/sections/self-playing-run-demo.md +104 -0
- package/kb/sections/services-price-ledger.md +106 -0
- package/kb/sections/signup-form-with-next-steps.md +86 -0
- package/kb/sections/signup-waitlist-place-in-line.md +90 -0
- package/kb/sections/spec-sheet-features.md +108 -0
- package/kb/sections/split-hero-live-object.md +108 -0
- package/kb/sections/sticky-feature-narrative.md +104 -0
- package/kb/sections/todays-board-hero.md +112 -0
- package/kb/sections/touchable-tool-hero.md +111 -0
- package/kb/sections/typographic-statement-hero.md +99 -0
- package/kb/sections/visit-hours-map.md +110 -0
- package/kb/sections/ways-to-help-honest.md +115 -0
- package/kb/sources/design-reference.md +991 -0
- package/kb/sources/product-and-docs.md +37 -0
- package/kb/systems/1win/DESIGN.md +463 -0
- package/kb/systems/LICENSE-awesome-design-md +21 -0
- package/kb/systems/README.md +7 -0
- package/kb/systems/airbnb/DESIGN.md +545 -0
- package/kb/systems/airtable/DESIGN.md +554 -0
- package/kb/systems/aljazeera/DESIGN.md +594 -0
- package/kb/systems/apple/DESIGN.md +562 -0
- package/kb/systems/binance/DESIGN.md +634 -0
- package/kb/systems/bmw/DESIGN.md +544 -0
- package/kb/systems/bmw-m/DESIGN.md +503 -0
- package/kb/systems/bugatti/DESIGN.md +454 -0
- package/kb/systems/cal/DESIGN.md +542 -0
- package/kb/systems/categories.json +87 -0
- package/kb/systems/claude/DESIGN.md +589 -0
- package/kb/systems/clay/DESIGN.md +541 -0
- package/kb/systems/clickhouse/DESIGN.md +544 -0
- package/kb/systems/cohere/DESIGN.md +451 -0
- package/kb/systems/coinbase/DESIGN.md +570 -0
- package/kb/systems/composio/DESIGN.md +506 -0
- package/kb/systems/cursor/DESIGN.md +537 -0
- package/kb/systems/dell-1996/DESIGN.md +632 -0
- package/kb/systems/dji/DESIGN.md +882 -0
- package/kb/systems/elevenlabs/DESIGN.md +504 -0
- package/kb/systems/expo/DESIGN.md +526 -0
- package/kb/systems/ferrari/DESIGN.md +531 -0
- package/kb/systems/figma/DESIGN.md +578 -0
- package/kb/systems/framer/DESIGN.md +544 -0
- package/kb/systems/hashicorp/DESIGN.md +575 -0
- package/kb/systems/hp/DESIGN.md +670 -0
- package/kb/systems/ibm/DESIGN.md +550 -0
- package/kb/systems/intercom/DESIGN.md +546 -0
- package/kb/systems/jobright/DESIGN.md +525 -0
- package/kb/systems/kraken/DESIGN.md +125 -0
- package/kb/systems/lamborghini/DESIGN.md +288 -0
- package/kb/systems/linear.app/DESIGN.md +548 -0
- package/kb/systems/lovable/DESIGN.md +298 -0
- package/kb/systems/mastercard/DESIGN.md +365 -0
- package/kb/systems/mercury/DESIGN.md +568 -0
- package/kb/systems/meta/DESIGN.md +683 -0
- package/kb/systems/minimax/DESIGN.md +746 -0
- package/kb/systems/mintlify/DESIGN.md +852 -0
- package/kb/systems/miro/DESIGN.md +825 -0
- package/kb/systems/mistral.ai/DESIGN.md +773 -0
- package/kb/systems/mongodb/DESIGN.md +767 -0
- package/kb/systems/mydealz/DESIGN.md +551 -0
- package/kb/systems/nerdwallet/DESIGN.md +722 -0
- package/kb/systems/nike/DESIGN.md +575 -0
- package/kb/systems/nintendo-2001/DESIGN.md +649 -0
- package/kb/systems/notion/DESIGN.md +821 -0
- package/kb/systems/nvidia/DESIGN.md +640 -0
- package/kb/systems/ollama/DESIGN.md +539 -0
- package/kb/systems/opencode.ai/DESIGN.md +521 -0
- package/kb/systems/oracle/DESIGN.md +778 -0
- package/kb/systems/oura/DESIGN.md +616 -0
- package/kb/systems/pinterest/DESIGN.md +597 -0
- package/kb/systems/playstation/DESIGN.md +661 -0
- package/kb/systems/posthog/DESIGN.md +690 -0
- package/kb/systems/raycast/DESIGN.md +669 -0
- package/kb/systems/renault/DESIGN.md +589 -0
- package/kb/systems/replicate/DESIGN.md +616 -0
- package/kb/systems/resend/DESIGN.md +585 -0
- package/kb/systems/revolut/DESIGN.md +636 -0
- package/kb/systems/runwayml/DESIGN.md +244 -0
- package/kb/systems/sanity/DESIGN.md +357 -0
- package/kb/systems/sap/DESIGN.md +639 -0
- package/kb/systems/sentry/DESIGN.md +551 -0
- package/kb/systems/shopify/DESIGN.md +516 -0
- package/kb/systems/slack/DESIGN.md +482 -0
- package/kb/systems/spacex/DESIGN.md +363 -0
- package/kb/systems/spotify/DESIGN.md +246 -0
- package/kb/systems/starbucks/DESIGN.md +580 -0
- package/kb/systems/stripe/DESIGN.md +487 -0
- package/kb/systems/supabase/DESIGN.md +462 -0
- package/kb/systems/superhuman/DESIGN.md +448 -0
- package/kb/systems/tesla/DESIGN.md +286 -0
- package/kb/systems/theverge/DESIGN.md +339 -0
- package/kb/systems/together.ai/DESIGN.md +633 -0
- package/kb/systems/uber/DESIGN.md +636 -0
- package/kb/systems/vercel/DESIGN.md +736 -0
- package/kb/systems/vodafone/DESIGN.md +538 -0
- package/kb/systems/voltagent/DESIGN.md +521 -0
- package/kb/systems/warp/DESIGN.md +526 -0
- package/kb/systems/webflow/DESIGN.md +588 -0
- package/kb/systems/wired/DESIGN.md +497 -0
- package/kb/systems/wise/DESIGN.md +544 -0
- package/kb/systems/x.ai/DESIGN.md +465 -0
- package/kb/systems/zapier/DESIGN.md +537 -0
- package/kb/taste/garvit-by-job.md +46 -0
- package/kb/taste/garvit-portfolio.md +94 -0
- package/kb/universal/color-roles.md +26 -0
- package/kb/universal/copy.md +16 -0
- package/kb/universal/details.md +31 -0
- package/kb/universal/first-screen.md +30 -0
- package/kb/universal/fit-the-codebase.md +29 -0
- package/kb/universal/layout-width.md +28 -0
- package/kb/universal/motion-feedback.md +23 -0
- package/kb/universal/signature.md +29 -0
- package/kb/universal/states.md +17 -0
- package/kb/universal/type-app.md +33 -0
- package/kb/universal/type-marketing.md +28 -0
- package/package.json +37 -4
- package/scripts/pack-assets.mjs +58 -0
- package/skill/palate/SKILL.md +261 -0
- package/src/auth-recheck.mjs +4 -0
- package/src/auth.mjs +416 -0
- package/src/capture.mjs +182 -0
- package/src/catalog/classify.mjs +96 -0
- package/src/catalog/curated.mjs +128 -0
- package/src/catalog/index-build.mjs +67 -0
- package/src/catalog/literal.mjs +146 -0
- package/src/catalog/store.mjs +40 -0
- package/src/catalog/vibrant.mjs +126 -0
- package/src/check.mjs +93 -0
- package/src/concept.mjs +157 -0
- package/src/context.mjs +226 -0
- package/src/copy.mjs +188 -0
- package/src/devserver.mjs +135 -0
- package/src/fontgenre.mjs +44 -0
- package/src/guard-agents.mjs +213 -0
- package/src/guard.mjs +377 -0
- package/src/kb.mjs +91 -0
- package/src/look.mjs +312 -0
- package/src/loop/ambition.mjs +620 -0
- package/src/loop/animate.mjs +70 -0
- package/src/loop/artdirection.mjs +264 -0
- package/src/loop/bench.mjs +184 -0
- package/src/loop/benchpick.mjs +155 -0
- package/src/loop/blueprint.mjs +620 -0
- package/src/loop/board.html +180 -0
- package/src/loop/build.mjs +393 -0
- package/src/loop/buttons.mjs +413 -0
- package/src/loop/common.mjs +206 -0
- package/src/loop/cost.mjs +63 -0
- package/src/loop/craft.mjs +152 -0
- package/src/loop/craftchecks.mjs +148 -0
- package/src/loop/critique.mjs +393 -0
- package/src/loop/details.mjs +225 -0
- package/src/loop/direction.html +168 -0
- package/src/loop/direction.mjs +256 -0
- package/src/loop/directions.json +8 -0
- package/src/loop/explore.mjs +219 -0
- package/src/loop/fail.mjs +110 -0
- package/src/loop/fix.mjs +194 -0
- package/src/loop/floor.mjs +677 -0
- package/src/loop/forget.mjs +52 -0
- package/src/loop/gate.mjs +1053 -0
- package/src/loop/grid.html +123 -0
- package/src/loop/growth.mjs +118 -0
- package/src/loop/icons.mjs +109 -0
- package/src/loop/imagery.mjs +1280 -0
- package/src/loop/judge-api.mjs +245 -0
- package/src/loop/judge.mjs +167 -0
- package/src/loop/layouts.mjs +492 -0
- package/src/loop/library.mjs +82 -0
- package/src/loop/lookplan.mjs +182 -0
- package/src/loop/lookvec.mjs +645 -0
- package/src/loop/match.mjs +923 -0
- package/src/loop/matched.mjs +26 -0
- package/src/loop/myrefs.mjs +151 -0
- package/src/loop/pick.mjs +213 -0
- package/src/loop/picker.html +118 -0
- package/src/loop/plan.mjs +289 -0
- package/src/loop/polish.mjs +39 -0
- package/src/loop/research-learn.mjs +41 -0
- package/src/loop/research.mjs +1130 -0
- package/src/loop/rulereview.mjs +146 -0
- package/src/loop/rules-board.html +199 -0
- package/src/loop/rules.mjs +939 -0
- package/src/loop/similar.mjs +276 -0
- package/src/loop/states-source.mjs +258 -0
- package/src/loop/states.mjs +1547 -0
- package/src/loop/stats.mjs +78 -0
- package/src/loop/taste.mjs +81 -0
- package/src/loop/timeline.mjs +149 -0
- package/src/loop/variants.mjs +228 -0
- package/src/loop/vary.mjs +249 -0
- package/src/mcp/server.mjs +1246 -0
- package/src/motion.mjs +207 -0
- package/src/moves.mjs +242 -0
- package/src/novelty.mjs +116 -0
- package/src/page-ambition.js +181 -0
- package/src/page-craft.js +724 -0
- package/src/page-details.js +415 -0
- package/src/page-devices.js +365 -0
- package/src/page-fingerprint.js +281 -0
- package/src/page-gate.js +1307 -0
- package/src/page-look.js +698 -0
- package/src/page-metrics.js +78 -0
- package/src/page-principles.js +1167 -0
- package/src/page-rules.js +308 -0
- package/src/page-sections.js +211 -0
- package/src/page-states.js +703 -0
- package/src/paths.mjs +13 -0
- package/src/png.mjs +107 -0
- package/src/point/auto.mjs +224 -0
- package/src/point/locate.mjs +114 -0
- package/src/point/overlay.js +1516 -0
- package/src/point/server.mjs +1122 -0
- package/src/point/trail.mjs +219 -0
- package/src/pool.mjs +80 -0
- package/src/principles.mjs +279 -0
- package/src/refs.mjs +299 -0
- package/src/robots.mjs +145 -0
- package/src/sections.mjs +210 -0
- package/src/shoot.mjs +235 -0
- package/src/systems/apply.mjs +355 -0
- package/src/systems/load.mjs +251 -0
- package/src/systems/pick.mjs +213 -0
- package/templates/vite-react-tw/index.html +12 -0
- package/templates/vite-react-tw/package.json +25 -0
- package/templates/vite-react-tw/src/App.tsx +3 -0
- package/templates/vite-react-tw/src/index.css +1 -0
- package/templates/vite-react-tw/src/main.tsx +10 -0
- package/templates/vite-react-tw/tsconfig.app.json +26 -0
- package/templates/vite-react-tw/tsconfig.json +7 -0
- package/templates/vite-react-tw/tsconfig.node.json +23 -0
- package/templates/vite-react-tw/vite.config.ts +8 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: pointer-highlight-word
|
|
3
|
+
name: Pointer-highlight headline word
|
|
4
|
+
kind: type
|
|
5
|
+
fits: [saas, developer, ai, productivity, crafted, friendly, technical, launch]
|
|
6
|
+
avoid: [heritage, luxury, serious-news, crisis, finance-trust-first]
|
|
7
|
+
signature: false
|
|
8
|
+
effort: s
|
|
9
|
+
perf: "two CSS keyframe animations (clip-path on a box, transform/opacity on a cursor), one-time, ~2 s total; no JS"
|
|
10
|
+
a11y: "box and cursor are aria-hidden; the word stays plain text; under reduced motion both simply show"
|
|
11
|
+
pairs_with: [self-playing-product-demo, playful-404, calm-motion-system]
|
|
12
|
+
deps: none
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it is
|
|
16
|
+
|
|
17
|
+
One word in the headline gets a selection box drawn around it (the box reveals from its top-left corner), then a small cursor glides in and lands on the box's top-right corner, as if someone (an agent, a collaborator) just selected that word. Pure CSS, plays once on load.
|
|
18
|
+
|
|
19
|
+
## Why it works
|
|
20
|
+
|
|
21
|
+
- It puts the product's action into the headline: a design/agent tool *selects and works on things*, and the word that matters is the one being worked on.
|
|
22
|
+
- It directs the eye to the one word that carries the message, without colour shouting.
|
|
23
|
+
- It's small, quick and finishes: a flourish, not a show.
|
|
24
|
+
|
|
25
|
+
## When to use / when not
|
|
26
|
+
|
|
27
|
+
Use for tools whose core gesture is selecting, pointing, editing or collaborating (design tools, agents, editors, whiteboards). Highlight the one word that is the product's claim. Reuse it on the 404 or a closing line to make the site feel like one voice; never more than one per screen.
|
|
28
|
+
|
|
29
|
+
Not for: heritage, luxury or serious-news brands (it reads as software UI), or headlines where no single word carries the meaning. Avoid on long multi-line headlines where the box would break across lines.
|
|
30
|
+
|
|
31
|
+
## Recipe
|
|
32
|
+
|
|
33
|
+
1. Wrap the word: `<span class="relative inline-block">` containing (a) the box, `aria-hidden`, `absolute`, inset slightly beyond the word (`-inset-x-[0.1em] top-[0.06em] bottom-[-0.02em]`), 8 px radius, 1.5 px brand border, 5% brand fill; (b) the word in a `relative` span; (c) the cursor, `aria-hidden`, positioned `bottom: 100%; left: 100%` with a −10 px margin so its tip sits on the box's top-right corner.
|
|
34
|
+
2. The cursor: an arrow drawn in your own SVG, rotated so its tip points down-left at the corner, brand fill, 1.5 px white stroke, a soft drop shadow (`0 2px 4px` brand-deep at 25%).
|
|
35
|
+
3. Keyframes: box `clip-path: inset(0 100% 100% 0 round 8px)` → `inset(0 0 0 0 round 8px)` over 0.9 s, `cubic-bezier(0.22, 1, 0.36, 1)`, delay 0.55 s; cursor from `opacity:0; translate(44px, -28px)` to rest over 0.75 s, same curve, delay 1.2 s; both `both` fill.
|
|
36
|
+
4. Wrap both animations in `@media (prefers-reduced-motion: no-preference)`; otherwise they're simply visible. No JS, so server and client render identically.
|
|
37
|
+
5. On a painting or dark hero, a light tone: white border at 90%, white fill at 12%.
|
|
38
|
+
6. Keep the word unbroken: `inline-block` stops the box splitting across lines; check that the headline wraps well at 390 px with the word on one line.
|
|
39
|
+
|
|
40
|
+
## Pitfalls
|
|
41
|
+
|
|
42
|
+
- Highlighting a filler word, or two words: it must be the claim.
|
|
43
|
+
- A cursor that overlaps the line above at small widths: check the gap above the headline.
|
|
44
|
+
- Animating it on every scroll into view: once, on load.
|
|
45
|
+
- Using an icon library's cursor: draw your own arrow so it matches stroke weights.
|
|
46
|
+
|
|
47
|
+
## How to verify
|
|
48
|
+
|
|
49
|
+
- `palate animate --check`: box reveals then cursor arrives by ~2 s; no layout shift (both are absolute); reduced motion shows the final state immediately.
|
|
50
|
+
- `palate shoot` at 390: the word doesn't break; the cursor isn't clipped by the hero edge.
|
|
51
|
+
- Screen reader reads the headline as plain text.
|
|
52
|
+
|
|
53
|
+
## Examples
|
|
54
|
+
|
|
55
|
+
- palate's own site: "intelligence" in the hero headline and "exist" on the 404 (`PointerHighlight.tsx`).
|
|
56
|
+
- Seen on Aceternity UI (https://ui.aceternity.com): a component library that offers a pointer-highlight text effect; palate's version is its own CSS in its brand colour.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: product-in-context
|
|
3
|
+
name: Product in context, no device frame
|
|
4
|
+
kind: imagery
|
|
5
|
+
fits: [honest, saas, productivity, consumer, b2b, calm, crafted, ai]
|
|
6
|
+
avoid: [hardware, luxury, experimental]
|
|
7
|
+
signature: false
|
|
8
|
+
effort: m
|
|
9
|
+
perf: "real UI rendered as HTML or one optimised image per crop; no device-mockup PNGs; lazy below the fold"
|
|
10
|
+
a11y: "a caption says what the moment shows; live UI fragments are inert (inert or aria-hidden) with a text description"
|
|
11
|
+
pairs_with: [screenshot-detail-crops, hand-drawn-annotations, museum-painting-backdrop, bento-live-tiles]
|
|
12
|
+
deps: none
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it is
|
|
16
|
+
|
|
17
|
+
Instead of a laptop or phone mockup, the product appears as the actual moment it's used: a real notification over a real message, the invoice row sitting in the email it came from, a fragment of the UI cropped tight and placed on a meaningful background. No bezels, no stock hands, no floating devices.
|
|
18
|
+
|
|
19
|
+
## Why it works
|
|
20
|
+
|
|
21
|
+
- Device frames say "here is a screen"; the context says "here is your Tuesday with this product". The second is what people buy.
|
|
22
|
+
- Removing the frame frees the space for larger, readable UI.
|
|
23
|
+
- Mockup kits are a generic look; real context belongs to this product only.
|
|
24
|
+
|
|
25
|
+
## When to use / when not
|
|
26
|
+
|
|
27
|
+
Use for software where the value happens at a specific moment (a reply drafted, a payment matched, a deploy passing) and that moment can be shown in a fragment.
|
|
28
|
+
|
|
29
|
+
Not for hardware (show the device itself), and not for luxury brands where the photography is the product. Avoid if you can't show real UI: an invented fake UI in context is worse than a plain screenshot.
|
|
30
|
+
|
|
31
|
+
## Recipe
|
|
32
|
+
|
|
33
|
+
1. **List three moments** where the product does its job, in the user's words ("the meeting notes arrive before I'm back at my desk").
|
|
34
|
+
2. **Build each moment as a fragment.** Recreate the relevant piece of real UI in HTML/CSS at 1:1 (or render a crisp screenshot crop at 2x): one card, one row, one toast. Real names and values from the project's seed data, never lorem.
|
|
35
|
+
3. **Place it on context.** Behind the fragment: a calm surface that says where it lives (a blurred desktop wallpaper you own, a CC0 painting, a soft tint of the brand, or the neighbouring app it integrates with drawn as a quiet grey outline). Keep the background lower in contrast than the fragment.
|
|
36
|
+
4. **Depth without a device.** One soft shadow (`0 1px 2px rgba(0,0,0,.08), 0 24px 48px -16px rgba(0,0,0,.25)`), 12–16px radius, 1px hairline. The fragment may break out of its container slightly to feel placed, not pasted.
|
|
37
|
+
5. **Caption.** A one-line caption under each scene: what's happening and when.
|
|
38
|
+
6. **Optional life.** A single entrance (fragment rises 8px and fades in, 320ms, `cubic-bezier(0.23,1,0.32,1)`) when it scrolls in, once. Static under reduced motion; HTML fragments render complete without JS.
|
|
39
|
+
7. **Phone.** Scale fragments down with `font-size` in em units on a container (`font-size: calc(100cqw / 40)`) so the whole UI scales, not just the box.
|
|
40
|
+
|
|
41
|
+
## Pitfalls
|
|
42
|
+
|
|
43
|
+
- Mixing device mockups and frameless fragments on one page.
|
|
44
|
+
- Lorem, John Doe, or $1,234.56: fake data kills the honesty this move depends on.
|
|
45
|
+
- Busy backgrounds behind dense UI.
|
|
46
|
+
- Fragments too small to read: crop tighter instead of shrinking.
|
|
47
|
+
|
|
48
|
+
## How to verify
|
|
49
|
+
|
|
50
|
+
- `palate shoot` 1440/390: each fragment's text is ≥12px rendered and readable; no device frames anywhere.
|
|
51
|
+
- `palate details`: real names, avatars and values in every fragment.
|
|
52
|
+
- JS off: fragments are visible in their final state.
|
|
53
|
+
|
|
54
|
+
## Examples
|
|
55
|
+
|
|
56
|
+
- palate's own site: feature rows show real slices of palate's UI (the point overlay, critique board, triage verdicts) in windows on paintings rather than in device frames.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: real-world-data
|
|
3
|
+
name: The page knows the world outside
|
|
4
|
+
kind: data
|
|
5
|
+
fits: [local, travel, food, nature, events, sustainability, warm, friendly, crafted]
|
|
6
|
+
avoid: [enterprise-compliance, finance-trust-first, clinical, low-bandwidth, crisis]
|
|
7
|
+
signature: true
|
|
8
|
+
effort: m
|
|
9
|
+
perf: "one server-side fetch, cached 10–30 min; never block render on a third-party API; no client geolocation prompt"
|
|
10
|
+
a11y: "the live detail is plain text in the content; visual changes (sky tint, illustration) are decorative; static under reduced motion"
|
|
11
|
+
pairs_with: [time-of-day-theming, footer-live-status, live-data-ticker]
|
|
12
|
+
deps: "none; a free weather or sunrise API called from the server (check its terms and attribution requirement)"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it is
|
|
16
|
+
|
|
17
|
+
The page reflects a real, current fact about the physical world that matters to the product: the weather at the farm the coffee comes from, tonight's sunset at the venue, the tide at the surf school, the air quality where the studio is. One line of copy and, optionally, a small visual shift tied to it.
|
|
18
|
+
|
|
19
|
+
## Why it works
|
|
20
|
+
|
|
21
|
+
- It proves there is a real place and real people behind the screen; it's the opposite of a template.
|
|
22
|
+
- It changes between visits, which gives returning visitors a reason to look again.
|
|
23
|
+
- When it connects to the product's job ("good drying weather at the roastery: today's batch ships Friday"), it becomes information, not a gimmick.
|
|
24
|
+
|
|
25
|
+
## When to use / when not
|
|
26
|
+
|
|
27
|
+
Use for local businesses, hospitality, travel, food and drink, outdoor and nature brands, events, sustainability products, and studios with a sense of place.
|
|
28
|
+
|
|
29
|
+
Not for: products where the world outside is irrelevant (it reads as a gimmick), finance or compliance-heavy pages, crisis contexts, or when the API is flaky. Never ask the visitor for their location for this.
|
|
30
|
+
|
|
31
|
+
## Recipe
|
|
32
|
+
|
|
33
|
+
1. **Choose a fact tied to the product and a place you own** (your farm, venue, office), not the visitor's location. One fact. Write the sentence for each state first: sunny, rain, night, unknown.
|
|
34
|
+
2. **Fetch on the server** (Next: a route handler or server component with `fetch(url, { next: { revalidate: 1800 } })`; Vite: an edge function) and cache 10–30 minutes. Respect the API's rate limits and attribution rules; show attribution where required.
|
|
35
|
+
3. **Fallback first.** If the fetch fails or times out (> 800 ms), render the timeless sentence ("Our roastery is in the hills above Huila."). The page never waits on the API.
|
|
36
|
+
4. **Render as text** in the flow: "It's 18 °C and drizzling at the roastery right now." Include a `<time>` for when it was measured.
|
|
37
|
+
5. **Optional visual tie-in**: one CSS custom property set from the data on the server (`--sky: #cfd8dc` for overcast), used by a hero tint or illustration. No canvas weather effects, no particle rain.
|
|
38
|
+
6. **Units and locale**: format with `Intl.NumberFormat` and show both °C/°F only if your audience needs both.
|
|
39
|
+
7. **A11y and motion**: the information is in the sentence; the visual shift is decorative. Under reduced motion there is no animated weather.
|
|
40
|
+
8. **Privacy**: no client geolocation, no IP lookup. The place is yours.
|
|
41
|
+
|
|
42
|
+
## Pitfalls
|
|
43
|
+
|
|
44
|
+
- Data from the visitor's location: a permission prompt or an IP lookup for a novelty.
|
|
45
|
+
- Stale data presented as live (cache for hours, still says "right now"). Say "this morning" or show the time.
|
|
46
|
+
- A broken API leaving "undefined °C" in the hero.
|
|
47
|
+
- Weather particle effects that cost CPU and battery.
|
|
48
|
+
- A fact with no link to the product, which reads as a widget.
|
|
49
|
+
|
|
50
|
+
## How to verify
|
|
51
|
+
|
|
52
|
+
- Force the fetch to fail: the fallback sentence renders, no layout shift.
|
|
53
|
+
- `palate shoot` at both widths: the line wraps cleanly with the longest state ("Light thunderstorms").
|
|
54
|
+
- The rendered time is within the cache window of the API's timestamp.
|
|
55
|
+
|
|
56
|
+
## Examples
|
|
57
|
+
|
|
58
|
+
- No palate example yet. Describe it to the builder with the place, the fact and the four sentences.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: referral-reward-reveal
|
|
3
|
+
name: The referral link as the reward
|
|
4
|
+
kind: interaction
|
|
5
|
+
fits: [waitlist, launch, community, consumer, saas, ai, honest, friendly]
|
|
6
|
+
avoid: [enterprise-compliance, government, clinical, finance-trust-first, luxury]
|
|
7
|
+
signature: false
|
|
8
|
+
effort: m
|
|
9
|
+
perf: "the link comes back in the join response; no extra request; copy is local"
|
|
10
|
+
a11y: "the link is real selectable text with an sr-only label; the copy button keeps its size and announces 'Copied'"
|
|
11
|
+
pairs_with: [waitlist-position-live, copy-confirmation, confetti-free-celebration]
|
|
12
|
+
deps: none
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it is
|
|
16
|
+
|
|
17
|
+
Right after joining, the visitor gets their own link and one sentence about what it does: "Each designer who joins with your link moves you up." The link is shown, ready to copy, as part of the result rather than buried in a later email.
|
|
18
|
+
|
|
19
|
+
## Why it works
|
|
20
|
+
|
|
21
|
+
- The moment after a commitment is when people are most willing to act again; asking then converts far better than asking in an email days later.
|
|
22
|
+
- The reward is concrete and tied to the thing they just chose (their place in line), so sharing feels like helping themselves, not doing marketing.
|
|
23
|
+
- Showing the link (not just a "Share" button) makes it tangible and trustworthy: you can see exactly what you'd send.
|
|
24
|
+
|
|
25
|
+
## When to use / when not
|
|
26
|
+
|
|
27
|
+
Use for waitlists and invite-only launches where moving up is real, and for products where users naturally know others who'd want it.
|
|
28
|
+
|
|
29
|
+
Not for: regulated or enterprise products, anything where referrals could be read as spam incentives, or when you can't enforce fair counting. Never promise a reward the system doesn't deliver.
|
|
30
|
+
|
|
31
|
+
## Recipe
|
|
32
|
+
|
|
33
|
+
1. **Fair counting on the server.** A referral counts only if it isn't a self-referral (compare canonical emails, so aliases don't count), doesn't come from the referrer's own IP, and stays under caps (per IP per day, per company domain per referrer). Store `referred_by` and `ref_counted` on the new sign-up; the queue orders by counted referrals.
|
|
34
|
+
2. **Remember the incoming ref.** On page load, read `?ref=CODE`, validate it (`^[0-9A-Za-z]{8,16}$`) and keep it in `localStorage`, so it still counts if the friend joins later or from another page. Wrap storage in try/catch.
|
|
35
|
+
3. **The reveal.** In the result panel, under the position: the one-line promise, then the link as text, not an input (an input zooms phones on focus). Show it without `https://`; if it doesn't fit, truncate the domain and always keep the `?ref=CODE` part visible (two spans: a truncating one and a `shrink-0` one). `select-all` so one click selects it; `title` holds the full URL; an `sr-only` "Your link:" label.
|
|
36
|
+
4. **Copy button** beside it at the same 40 px height (see `copy-confirmation`): it confirms "Copied" for ~1.8 s without changing width.
|
|
37
|
+
5. **Native share where it exists** (optional): on touch devices with `navigator.share`, a "Share" button next to Copy; otherwise just Copy.
|
|
38
|
+
6. **Motion.** The share block arrives with the result panel (same cross-fade). No separate fanfare; under reduced motion everything is a plain fade.
|
|
39
|
+
7. **Say what happens next** in the confirmation email too, with the same link.
|
|
40
|
+
8. **No JS:** the server-rendered result page shows the same link as selectable text.
|
|
41
|
+
|
|
42
|
+
## Pitfalls
|
|
43
|
+
|
|
44
|
+
- Rewards that can be gamed with aliases (`you+1@`), so honest users fall behind.
|
|
45
|
+
- Share buttons for six networks: one link and Copy is enough.
|
|
46
|
+
- A long URL that wraps to three lines on a phone and hides the code.
|
|
47
|
+
- Promising "skip the line" when referrals only move you a little; say what it does.
|
|
48
|
+
- Putting the ref code in analytics with personal data.
|
|
49
|
+
|
|
50
|
+
## How to verify
|
|
51
|
+
|
|
52
|
+
- Unit tests on the counting rules: self-referral, same IP, alias and cap cases don't count.
|
|
53
|
+
- `palate shoot` at 320/390: the code part of the link is always visible.
|
|
54
|
+
- Copy works on an insecure origin (fallback) and the button never changes width.
|
|
55
|
+
- Visiting with `?ref=` then joining later in the same browser credits the referrer.
|
|
56
|
+
|
|
57
|
+
## Examples
|
|
58
|
+
|
|
59
|
+
- palate's own site (`Waitlist.tsx`, `lib/server/waitlist.ts`): after joining, "Each designer who joins with your link moves you up." with the link as selectable mono text and a Copy button; referrals only count when they aren't self-referrals, repeat IPs or aliases.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: riso-print-texture
|
|
3
|
+
name: Riso print texture
|
|
4
|
+
kind: texture
|
|
5
|
+
fits: [playful, crafted, artsy, retro, warm, cultural, events, music, publishing]
|
|
6
|
+
avoid: [finance-trust-first, enterprise-compliance, clinical, serious-news, data-dense-tool]
|
|
7
|
+
signature: true
|
|
8
|
+
effort: m
|
|
9
|
+
perf: "one tiny SVG noise tile (data URI, < 1 KB) per ink, static; mix-blend-mode on a few elements only, never on scrolling full-page layers"
|
|
10
|
+
a11y: "decorative; text keeps 4.5:1 against the paper colour ignoring the grain; misregistration never applied to body text"
|
|
11
|
+
pairs_with: [halftone-dot-imagery, hand-drawn-annotations, generative-brand-pattern, layered-paper-depth]
|
|
12
|
+
deps: none
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it is
|
|
16
|
+
|
|
17
|
+
The look of a risograph print on screen: two or three flat spot inks (fluorescent pink, blue, yellow, green) laid on off-white paper, overprinting where they cross, with grainy coverage and a slightly off registration between layers. Shapes, illustrations and headings are built from the inks, never from gradients.
|
|
18
|
+
|
|
19
|
+
## Why it works
|
|
20
|
+
|
|
21
|
+
- Spot inks and overprint read as *made*, physically and in a small run, which signals a person and a point of view rather than a template.
|
|
22
|
+
- A limited ink set is a real constraint: it forces a palette with a dominant colour and sharp accents, which the default look never has.
|
|
23
|
+
- Grain and misregistration add warmth and texture at almost no cost, and give flat illustrations depth through overlap instead of shadows.
|
|
24
|
+
|
|
25
|
+
## When to use / when not
|
|
26
|
+
|
|
27
|
+
Use for events, zines, music, publishing, cultural institutions, indie tools and launches that want a hand-made, slightly irreverent voice. Strong on posters-as-pages: a festival line-up, an issue launch, a book.
|
|
28
|
+
|
|
29
|
+
Not for: finance or health products that must look precise and safe, compliance-heavy enterprise, serious news, or dense tools (grain behind data reads as dirt). Don't combine with glossy 3D or glassmorphism: two material languages fight.
|
|
30
|
+
|
|
31
|
+
## Recipe
|
|
32
|
+
|
|
33
|
+
1. **Pick the inks.** Two or three, named after real riso colours: e.g. fluorescent pink `#ff48b0`, medium blue `#0078bf`, yellow `#ffe800`. Paper `#f4efe6` (warm off-white). Text in a dark ink, not black: blue `#1b2a6b` or a deep teal. Define them as CSS variables (`--ink-1`, `--ink-2`, `--paper`) and use nothing else for colour.
|
|
34
|
+
2. **Overprint with multiply.** Layer shapes and illustration parts in different inks with `mix-blend-mode: multiply` on the upper layer, so pink over blue makes a purple overlap, as real ink does. Keep blend modes on a handful of elements inside one `isolation: isolate` container.
|
|
35
|
+
3. **Grain the coverage.** One SVG tile with `feTurbulence` (`baseFrequency` ≈ 0.9, `numOctaves` 2) thresholded through `feComponentTransfer` (a steep `discrete` or `table` alpha), used as a `mask-image` on ink shapes, so solid fills break up into speckled coverage at the edges. Write your own filter; keep the tile 160–200px and `stitchTiles="stitch"`.
|
|
36
|
+
4. **Misregister.** Offset one ink layer by 1–3px (`translate(2px, -1px)`) and, on display headings only, render the word twice: the base in ink 1, a copy in ink 2 with `aria-hidden`, multiply, offset 2px. Never on body text.
|
|
37
|
+
5. **Halftone for tones.** Where you need shading, use dots (see `halftone-dot-imagery`) in one ink rather than opacity.
|
|
38
|
+
6. **Tailwind.** Add the inks to `@theme` (`--color-ink-pink` etc.) and a `.riso-grain` component class carrying the mask; React: an `<Ink color="pink" offset={[2,-1]}>` wrapper that sets the blend and offset.
|
|
39
|
+
7. **Fallbacks.** No JS is needed. If `mix-blend-mode` is unsupported, colours still show flat. Nothing moves, so reduced motion is unaffected; if you add a hover that shifts registration, wrap it in `prefers-reduced-motion: no-preference`.
|
|
40
|
+
|
|
41
|
+
## Pitfalls
|
|
42
|
+
|
|
43
|
+
- Too many inks: past three it stops looking like riso and starts looking like a theme.
|
|
44
|
+
- Grain on text or behind long copy: it hurts reading. Grain the shapes, keep text crisp on paper.
|
|
45
|
+
- Pure black: riso doesn't have a "black" look; use a dark ink.
|
|
46
|
+
- Blend modes on large fixed or scrolling layers: repaint cost on every scroll frame.
|
|
47
|
+
- Gradients sneaking in from the old palette.
|
|
48
|
+
|
|
49
|
+
## How to verify
|
|
50
|
+
|
|
51
|
+
- `palate shoot` both widths: only the declared inks appear (sample colours), overlaps show the multiplied third colour, text contrast passes on paper.
|
|
52
|
+
- Zoom 200% on a shape edge: speckled coverage, not a smooth antialiased edge.
|
|
53
|
+
- Scroll with the performance panel: no large repaint areas from blend layers.
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
- The pattern is common on independent publishers' and festival sites that print in riso; describe it to a builder as "two spot inks, multiply overprint, grainy coverage, 2px misregistration on headings".
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: screenshot-detail-crops
|
|
3
|
+
name: Detail crops instead of full screenshots
|
|
4
|
+
kind: imagery
|
|
5
|
+
fits: [crafted, developer, saas, productivity, honest, technical, minimal, premium]
|
|
6
|
+
avoid: [playful-kids, consumer, luxury]
|
|
7
|
+
signature: false
|
|
8
|
+
effort: s
|
|
9
|
+
perf: "small cropped images at 2x (AVIF/WebP), or live HTML fragments; each far lighter than a full screenshot"
|
|
10
|
+
a11y: "each crop has alt text describing the detail and why it matters; text inside crops is also in the caption"
|
|
11
|
+
pairs_with: [product-in-context, hand-drawn-annotations, bento-live-tiles, editorial-grid-pull-quotes]
|
|
12
|
+
deps: none
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it is
|
|
16
|
+
|
|
17
|
+
Show the product through tight, magnified crops of its best details (the keyboard shortcut hint, the empty state, the diff view's line numbers, the way a chart labels its last value) at 150–250% scale, each with a short caption. A full-screen screenshot appears at most once.
|
|
18
|
+
|
|
19
|
+
## Why it works
|
|
20
|
+
|
|
21
|
+
- Full screenshots shrink text to unreadable and show everything at the same priority. A crop chooses what matters.
|
|
22
|
+
- Magnified details demonstrate craft directly: people trust a product whose small parts are clearly cared for.
|
|
23
|
+
- Crops give a consistent rhythm of images that are easy to lay out on any grid.
|
|
24
|
+
|
|
25
|
+
## When to use / when not
|
|
26
|
+
|
|
27
|
+
Use for tools whose quality lives in details: developer tools, editors, design tools, productivity apps. Great for "what's new" pages and feature sections.
|
|
28
|
+
|
|
29
|
+
Not for consumer products where the emotional whole matters more than parts, or when the UI isn't yet polished (magnification exposes flaws). Not a replacement for showing the product working at least once.
|
|
30
|
+
|
|
31
|
+
## Recipe
|
|
32
|
+
|
|
33
|
+
1. **Shoot the real UI** at device pixel ratio 2 or 3 (palate shoot or Playwright `deviceScaleFactor: 2`), in a clean seed state with real content.
|
|
34
|
+
2. **Choose 4–6 details** that each prove one claim. Write the claim first, then find the pixels.
|
|
35
|
+
3. **Crop** each to a consistent aspect (4:3 or 1:1) with the detail roughly on a third, with some context around it. Export at the display size × 2 as AVIF/WebP, 40–120 KB each.
|
|
36
|
+
4. **Frame.** 12–16px radius, 1px hairline border (`rgba(0,0,0,.08)`), on the page background or a very light tint. No shadows stacking, no device chrome.
|
|
37
|
+
5. **Caption.** 14–15px under each crop: the claim in one line ("Every shortcut is shown where you need it").
|
|
38
|
+
6. **Optional:** for live detail, render the fragment as HTML scaled up with `transform: scale(1.75)` on a fixed-size inner box and `transform-origin` set to the detail; this stays crisp at any DPR. Make it inert.
|
|
39
|
+
7. No JS required; images use `loading="lazy"` and explicit `width`/`height`.
|
|
40
|
+
|
|
41
|
+
## Pitfalls
|
|
42
|
+
|
|
43
|
+
- Upscaling a 1x screenshot: blurry crops destroy the point.
|
|
44
|
+
- Crops with no caption: people don't know what they're looking at.
|
|
45
|
+
- Inconsistent zoom levels across crops: the set looks accidental.
|
|
46
|
+
- Cropping out every bit of context so it's unrecognisable as the product.
|
|
47
|
+
|
|
48
|
+
## How to verify
|
|
49
|
+
|
|
50
|
+
- `palate shoot` at 1440: crops are sharp (no visible resampling at 100%), all one aspect ratio, captions present.
|
|
51
|
+
- `palate details`: alt texts are specific, not "screenshot".
|
|
52
|
+
- Total image weight of the section is below the weight of one full-page screenshot.
|
|
53
|
+
|
|
54
|
+
## Examples
|
|
55
|
+
|
|
56
|
+
- No public example cited; widely used on changelogs and feature pages of developer and design tools.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: scroll-progress-chapters
|
|
3
|
+
name: Scroll progress as chapters
|
|
4
|
+
kind: navigation
|
|
5
|
+
fits: [editorial, publishing, media, education, calm, serious, docs, nonprofit]
|
|
6
|
+
avoid: [minimal, playful-kids, ecommerce, daily-tool]
|
|
7
|
+
signature: false
|
|
8
|
+
effort: s
|
|
9
|
+
perf: "CSS scroll-driven progress where supported; otherwise one IntersectionObserver for the active chapter and a passive, rAF-throttled scroll read for the bar"
|
|
10
|
+
a11y: "a real nav of anchor links with aria-current; the progress bar is decorative (aria-hidden); no motion under reduced motion beyond the bar's position"
|
|
11
|
+
pairs_with: [story-led-long-scroll, editorial-grid-pull-quotes, sticky-scroll-story, editorial-drop-cap]
|
|
12
|
+
deps: none
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it is
|
|
16
|
+
|
|
17
|
+
A thin progress indicator for a long read that is divided into named chapters: a slim rail (top or side) whose segments are the chapters, filling as you read, with the current chapter's name shown and every chapter one click away. It tells the reader where they are, how much is left and what's coming.
|
|
18
|
+
|
|
19
|
+
## Why it works
|
|
20
|
+
|
|
21
|
+
- Long pages lose people when the end is invisible; showing that the essay has five parts and they're in part three makes finishing feel achievable.
|
|
22
|
+
- Named chapters are a table of contents that stays with you: it doubles as navigation and as a preview of the argument.
|
|
23
|
+
- It respects readers who skim: they can jump to the part they care about.
|
|
24
|
+
|
|
25
|
+
## When to use / when not
|
|
26
|
+
|
|
27
|
+
Use on long essays, reports, case studies, manifestos, story-led landing pages and long docs guides (more than ~4 screens, at least 3 clear parts).
|
|
28
|
+
|
|
29
|
+
Not for: short pages (a progress bar on two screens is noise), shops, and minimal sites where any chrome is too much. Don't use a bare generic top progress bar without chapters; the chapters are the point.
|
|
30
|
+
|
|
31
|
+
## Recipe
|
|
32
|
+
|
|
33
|
+
1. **Structure.** Each chapter is a `<section id="…" aria-labelledby>` with an `<h2>`. Build the chapter list from the headings at render time (server), so the nav exists without JS.
|
|
34
|
+
2. **Rail.** Desktop: a fixed left rail (≥ 1280px wide viewports) listing chapter names in 13–14px, the current one in full ink, others at ~55% opacity, each with a 2px vertical track segment whose fill grows as you read it. Below that width: a 2px bar under the sticky header, split into segments with 2px gaps, plus the current chapter name in the header ("3 / 5 · The cost of waiting").
|
|
35
|
+
3. **Progress (CSS first).** Where scroll-driven animations exist (Chromium 115+, Safari 26+), each segment fill uses `animation: fill linear both; animation-timeline: view(); animation-range: contain 0% contain 100%` on a `view-timeline` named per section (`view-timeline-name: --ch3` on the section, `timeline-scope` on a common ancestor). `@keyframes fill { from { transform: scaleX(0) } to { transform: scaleX(1) } }` with `transform-origin: left`.
|
|
36
|
+
4. **Fallback (JS).** Feature-test `CSS.supports("animation-timeline: view()")`. Otherwise: passive scroll listener, read once per rAF, compute each section's `(viewportMid − top) / height` clamped 0–1, write `transform: scaleX(p)` per segment.
|
|
37
|
+
5. **Active chapter.** IntersectionObserver with `rootMargin: "-45% 0px -50% 0px"`; the intersecting section sets `aria-current="true"` on its link and updates the header label.
|
|
38
|
+
6. **Jump.** Links are plain `#anchors`; `scroll-margin-top` on sections equals the sticky header height + 16px. Smooth scrolling only under `prefers-reduced-motion: no-preference`.
|
|
39
|
+
7. **Reduced motion / no JS.** The rail and links work; fills just update (no easing needed, they track scroll). Without JS and without scroll timelines, segments stay empty and the links still navigate.
|
|
40
|
+
|
|
41
|
+
## Pitfalls
|
|
42
|
+
|
|
43
|
+
- Chapter names that are vague ("Introduction", "More"): the rail becomes useless. Name them like headlines.
|
|
44
|
+
- A fixed rail overlapping text on mid-size screens: only show it when there's a real gutter (≥ 200px).
|
|
45
|
+
- Animating `width` per scroll event: use `transform: scaleX`.
|
|
46
|
+
- Too many chapters (10+): group them, or this becomes a docs sidebar.
|
|
47
|
+
|
|
48
|
+
## How to verify
|
|
49
|
+
|
|
50
|
+
- `palate shoot` at 1440 and 390: rail or header bar visible, no overlap with the text column.
|
|
51
|
+
- Scroll through: the segment fill tracks reading position; the current chapter label changes at each heading.
|
|
52
|
+
- Keyboard: Tab to the chapter links, Enter jumps and the heading isn't hidden under the header.
|
|
53
|
+
- JS off: links present and working.
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
- The pattern: a long annual report where a hairline rail on the left lists its five chapters and fills each one as you read it.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: scroll-scrubbed-product-film
|
|
3
|
+
name: Scroll-scrubbed product film
|
|
4
|
+
kind: motion
|
|
5
|
+
fits: [cinematic, hardware, premium, bold, launch, consumer, crafted]
|
|
6
|
+
avoid: [low-bandwidth, data-dense-tool, accessibility-first, daily-tool, docs]
|
|
7
|
+
signature: true
|
|
8
|
+
effort: l
|
|
9
|
+
perf: "one muted H.264 with a keyframe every frame (or a WebP sequence ≤ 90 frames), decoded once; currentTime/drawImage only, throttled to rAF; nothing loads until the section is 1.5 screens away"
|
|
10
|
+
a11y: "decorative film with a text equivalent beside it; reduced motion and no JS show the key frame as a still; never traps scroll"
|
|
11
|
+
pairs_with: [sticky-scroll-story, product-in-context, calm-motion-system, story-led-long-scroll]
|
|
12
|
+
deps: none
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it is
|
|
16
|
+
|
|
17
|
+
A short product film whose playhead is the scroll position: as the reader scrolls through a tall pinned section, the object turns, opens, assembles or the screen state advances, frame by frame, and stops when they stop. The reader directs the film, so a three-second shot becomes something they explore.
|
|
18
|
+
|
|
19
|
+
## Why it works
|
|
20
|
+
|
|
21
|
+
- Agency: people trust what they control. Scrolling backwards to watch the hinge close again is a moment they choose, and that is what they remember.
|
|
22
|
+
- It turns the one gesture everyone already makes (scroll) into the product demo, with no buttons and no learning tax.
|
|
23
|
+
- A physical object rendered well, under the reader's hand, reads as premium in a way a looping video never does: the pace matches theirs.
|
|
24
|
+
|
|
25
|
+
## When to use / when not
|
|
26
|
+
|
|
27
|
+
Use for a launch page of a physical or visually rich product (hardware, a device-free app reveal, a generated artwork), once per page, where the film itself is the argument: "look how it unfolds".
|
|
28
|
+
|
|
29
|
+
Not for: tools people use daily (they want the facts, fast), docs, pages read on slow connections or old phones (the film is megabytes), or anything where the information inside the film is not also in text. Never two scrubbed films on one page.
|
|
30
|
+
|
|
31
|
+
## Recipe
|
|
32
|
+
|
|
33
|
+
1. **Shoot or render for scrubbing.** 2–4 seconds, 24–30 fps, one continuous camera move. Export two ways and pick one:
|
|
34
|
+
- *Video*: H.264 MP4, every frame a keyframe (`-g 1` in ffmpeg), muted, 1280 wide desktop / 720 wide phone, typically 2–6 MB. Seeking is instant because there's nothing to decode between keyframes.
|
|
35
|
+
- *Image sequence*: 60–90 WebP frames at 1200px, quality ~70; better on iOS Safari, which can seek MP4s jerkily.
|
|
36
|
+
2. **Section.** A wrapper `height: 300vh` (about 100vh of scroll per second of film) with a child `position: sticky; top: 0; height: 100vh` that holds the `<video>` or a `<canvas>`. Copy for each beat sits beside or over it (see `sticky-scroll-story`).
|
|
37
|
+
3. **Progress.** `p = clamp((scrollY − wrapperTop) / (wrapperHeight − innerHeight), 0, 1)`. Prefer CSS scroll-driven animations for anything purely visual (`animation-timeline: view()`), but the film needs JS: read progress in a passive scroll listener, store it, and apply it once per `requestAnimationFrame`.
|
|
38
|
+
4. **Apply.** Video: `video.currentTime = p * duration`, only if it changed by more than half a frame. Sequence: `ctx.drawImage(frames[Math.round(p * (n − 1))], …)` on a canvas sized to `devicePixelRatio` (cap at 2). Smooth a little: ease the displayed frame toward the target with `k = 1 − exp(−dt / 60ms)` so trackpad jitter doesn't stutter.
|
|
39
|
+
5. **Loading.** Nothing until an IntersectionObserver with `rootMargin: "150% 0px"` fires. Then `preload="auto"` the video (or fetch frames in order: every 8th frame first, then fill in, so early scrubs show something). Show the poster frame until enough has loaded.
|
|
40
|
+
6. **Fallbacks.** The server markup is the *key frame* as an `<img>` with real `alt` and the beat copy as plain text, wrapper at normal height. Only when JS runs, motion is allowed (`prefers-reduced-motion: no-preference`) and the media is ready does the wrapper become 300vh. Reduced motion and no JS keep the still. `prefers-reduced-data` (Chromium only) or `navigator.connection.saveData`: keep the still too.
|
|
41
|
+
7. **Phones.** Shorter wrapper (200vh), smaller asset, and test iOS Safari: if seeking stutters, switch that breakpoint to the image sequence.
|
|
42
|
+
|
|
43
|
+
React/Tailwind notes: one `useScrubbedFilm(ref, src)` hook owning the observer, listener and rAF; `className="relative h-[300vh]"` and `sticky top-0 h-svh` (use `svh` so mobile toolbars don't jump it).
|
|
44
|
+
|
|
45
|
+
## Pitfalls
|
|
46
|
+
|
|
47
|
+
- Default-encoded MP4 (keyframe every 2–10 s): every seek decodes from the last keyframe and the film lurches. Re-encode with all keyframes.
|
|
48
|
+
- Hijacking scroll (wheel listeners, `preventDefault`, smooth-scroll libraries) to "fix" pacing: it breaks trackpads, keyboards and assistive tech. Never.
|
|
49
|
+
- Making the section 600vh+: the reader feels stuck. About 100vh per second of film, max ~3 screens.
|
|
50
|
+
- Information only inside the film (a spec that appears at frame 40): it must also be text.
|
|
51
|
+
- Starting the download at page load: it fights the hero for bandwidth and hurts LCP.
|
|
52
|
+
|
|
53
|
+
## How to verify
|
|
54
|
+
|
|
55
|
+
- `palate animate --check`: scroll strip shows the frame advancing with scroll and holding when scroll stops; reduced motion and JS-off strips show the key frame still and the section at normal height; no layout shift when the media arrives.
|
|
56
|
+
- `palate shoot` at 390 and 1440: the sticky frame fills the viewport without cropping the object; copy readable.
|
|
57
|
+
- Network panel: no film bytes before the section is ~1.5 screens away; total under ~6 MB.
|
|
58
|
+
- Scroll backwards fast: no blank frames, no stutter on a trackpad.
|
|
59
|
+
|
|
60
|
+
## Examples
|
|
61
|
+
|
|
62
|
+
- Seen on Apple's product pages (https://www.apple.com): devices turn, open or come apart as you scroll through a pinned section, driven frame by frame by the scroll position.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: self-playing-product-demo
|
|
3
|
+
name: Self-playing product demo built in code
|
|
4
|
+
kind: hero
|
|
5
|
+
fits: [saas, developer, ai, productivity, b2b, technical, honest, crafted, launch]
|
|
6
|
+
avoid: [heritage, luxury, low-bandwidth, crisis]
|
|
7
|
+
signature: true
|
|
8
|
+
effort: l
|
|
9
|
+
perf: "HTML/CSS in the page (no video bytes); state machine on timers, paused off screen and while hovered; transforms and opacity for movement; one em grid so it scales with one font-size"
|
|
10
|
+
a11y: "an sr-only summary of the whole run plus an aria-live line naming the current step; finished state under reduced motion and without JS; pauses while hovered or focused"
|
|
11
|
+
pairs_with: [scroll-scrubbed-product-film, bento-live-tiles, product-in-context, honest-progress-narration]
|
|
12
|
+
deps: "optional: motion (framer-motion) if the project already uses it, for enter/exit; plain CSS transitions work"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it is
|
|
16
|
+
|
|
17
|
+
The product's main flow, rebuilt as real HTML and played by a small script: a request typed, the plan, the work happening, the result, a fix, a lesson learned. It loops on its own while in view, pauses when the visitor hovers or focuses inside it, and renders its finished state on the server, without JavaScript and under reduced motion. It is not a video: it is crisp at any size, themable, and real text.
|
|
18
|
+
|
|
19
|
+
## Why it works
|
|
20
|
+
|
|
21
|
+
- People believe what they see working. A demo that runs the real flow with real content beats every claim on the page.
|
|
22
|
+
- Code-built UI stays sharp, small and consistent with the brand; it can be updated with the product.
|
|
23
|
+
- Looping without controls (no Skip/Replay) keeps it ambient; pausing on hover lets a curious visitor study a frame.
|
|
24
|
+
|
|
25
|
+
## When to use / when not
|
|
26
|
+
|
|
27
|
+
Use when the product has a flow you can show in 15–30 seconds and the page's job is to make that flow understood: tools, agents, developer products. Make it the most premium thing on the page, right under the hero.
|
|
28
|
+
|
|
29
|
+
Not for: products whose value is physical or emotional (use photography), or when you can't keep it truthful (a demo that does things the product can't is a lie).
|
|
30
|
+
|
|
31
|
+
## Recipe
|
|
32
|
+
|
|
33
|
+
1. **Write the script as data.** A `DemoState` type with every visible variable (phase, step counters, cursor `{x, y, down} | null`, typed characters), a `START` state (never blank: the request already typed, the app as it is today) and an `END` state (everything done). The server renders `END`.
|
|
34
|
+
2. **One em grid.** Size the stage with a container (`@container`, fixed aspect like 16/10) and set the inner `font-size: calc(100cqw / 40)` so 1em = 1/40 of the width. Position every part, cursor and annotation in em: cursors land exactly on the parts they act on at every width.
|
|
35
|
+
3. **The engine** (`useDemo`): in a layout effect, if reduced motion, mark reduced and stay at `END`; else set `START` before first paint and observe the root with an IntersectionObserver (`rootMargin: "0px 0px -40% 0px"` so it starts once well up the screen). On first visibility start run 1.
|
|
36
|
+
4. **Beats.** An async function walks `[delayMs, patch][]` with `await sleep(ms)` and `setState(prev => ({...prev, ...patch}))`, checking a `dead` flag after each await; typing is a loop of 38 ms per character (160 ms for the first). Every patch sets absolute state, so pausing or remounting never leaves it inconsistent. Keep the whole run 15–25 s.
|
|
37
|
+
5. **Loop politely.** After the end, hold 4–5 s, then wait while the visitor is inside (pointerenter/focusin), it's off screen, or `document.hidden`; then increment the run counter to replay.
|
|
38
|
+
6. **Entrances only once playing.** A context flag `played`: before the first run, components render with no enter animation (`initial={false}`), so the server/no-JS view is complete and static.
|
|
39
|
+
7. **Craft the frames**: a real prompt box with a caret, a "Thinking…" shimmer, tool-call rows with spinners turning to checks, the product page building section by section, a pointer that travels and clicks (scale-down on press), states appearing. Ease-out curves (`cubic-bezier(.23,1,.32,1)`), 180–320 ms for UI changes.
|
|
40
|
+
8. **A11y.** An sr-only paragraph narrating the whole run, an sr-only `aria-live="polite"` line with the current step name, `aria-hidden` on the decorative stage, and a visible note under reduced motion ("Motion is reduced, so this is the finished run").
|
|
41
|
+
9. **CSS keyframes** for carets, shimmers, spinners, under `prefers-reduced-motion: reduce` turned off (spinners slowed instead).
|
|
42
|
+
10. **Prevent scroll jumps:** `overflow-anchor: none` on `html` if the demo changes height while playing.
|
|
43
|
+
|
|
44
|
+
## Pitfalls
|
|
45
|
+
|
|
46
|
+
- Starting from blank: the first frame visitors see must already say something.
|
|
47
|
+
- A demo that lies (instant results, features that don't exist): visitors who sign up find out.
|
|
48
|
+
- Skip/Replay buttons and progress bars: they make it a video player; let it loop.
|
|
49
|
+
- Layout that only works at one width: use the em grid, test at 390 px.
|
|
50
|
+
- Running when off screen: wasted CPU and the visitor arrives mid-run. Pause off screen.
|
|
51
|
+
|
|
52
|
+
## How to verify
|
|
53
|
+
|
|
54
|
+
- `palate animate --check`: the strip shows the run progressing; no layout shift; reduced motion and JS off show the complete end state.
|
|
55
|
+
- Scroll it in and out: it starts when well in view, pauses off screen, waits while hovered.
|
|
56
|
+
- `palate shoot` at 390: cursors still land on their targets; nothing is clipped.
|
|
57
|
+
- Screen reader: the summary and the current step are announced.
|
|
58
|
+
|
|
59
|
+
## Examples
|
|
60
|
+
|
|
61
|
+
- palate's own site: the demo under the hero, one run of palate's flow (request, plan, three subagents build a team page, polish, states, a pin fixed, a rule learned), built in code and looping (`Demo.tsx`, `engine.ts`).
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: shape-continuity-morph
|
|
3
|
+
name: Shape continuity (the control becomes its result)
|
|
4
|
+
kind: motion
|
|
5
|
+
fits: [crafted, friendly, premium, consumer, finance, productivity, tactile, calm]
|
|
6
|
+
avoid: [data-dense-tool, enterprise-compliance, low-bandwidth]
|
|
7
|
+
signature: true
|
|
8
|
+
effort: m
|
|
9
|
+
perf: "transform/opacity on one or two elements; FLIP measured once per change; no per-frame layout reads"
|
|
10
|
+
a11y: "focus moves to the new surface; the change is announced (role=status or dialog semantics); reduced motion swaps instantly"
|
|
11
|
+
pairs_with: [calm-motion-system, view-transitions-between-pages, confetti-free-celebration, first-win-onboarding]
|
|
12
|
+
deps: "none (View Transitions); motion's layoutId only if the project already uses Motion"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it is
|
|
16
|
+
|
|
17
|
+
The element you act on turns into what it opens or produces, instead of disappearing while something new appears elsewhere: a "Join" button stretches into the email field, a card grows into its detail view, "Continue" reshapes itself into "Confirm", a tray rises from the button that summoned it. One object, continuously.
|
|
18
|
+
|
|
19
|
+
## Why it works
|
|
20
|
+
|
|
21
|
+
- Object permanence: people track things that move continuously; a cut makes them search the screen again. Continuity tells them "this is the same thing, further along".
|
|
22
|
+
- It explains cause and effect without words: you can see where the new surface came from and where it will go back to.
|
|
23
|
+
- Done in one or two places, it becomes the product's motion identity; people describe it as "the way it feels".
|
|
24
|
+
|
|
25
|
+
## When to use / when not
|
|
26
|
+
|
|
27
|
+
Use for the two or three most important transitions in a flow: start a signup, open a detail, confirm a payment, expand a composer. Great for consumer and fintech flows where calm confidence matters.
|
|
28
|
+
|
|
29
|
+
Not for: every transition (it gets slow and theatrical), dense admin tools where people do the action 200 times a day (keep those instant), or when the source and target have nothing visually in common (morphing a tiny icon into a full page reads as a zoom, not continuity).
|
|
30
|
+
|
|
31
|
+
## Recipe
|
|
32
|
+
|
|
33
|
+
1. **Pick the pair.** Source and target must share something: a shape, a label, a colour, a position. Write it down: "the pill button becomes the pill input; the label slides out, the placeholder slides in".
|
|
34
|
+
2. **Same-document View Transitions (preferred).** Give both states the same `view-transition-name` (only one visible at a time), then wrap the state change: `document.startViewTransition(() => flushSync(() => setOpen(true)))`. Style the group: `::view-transition-group(join) { animation-duration: 280ms; animation-timing-function: cubic-bezier(.23,1,.32,1) }`. Cross-fade the inner text with `::view-transition-old/new(join-label)` at 150 ms. Supported in Chromium and Safari 18+; Firefox 144+ — feature-test `document.startViewTransition` and just set state otherwise.
|
|
35
|
+
3. **FLIP fallback without the API.** Measure source rect, render target, measure target rect, apply the inverse transform (`translate` + `scale`), then transition to none over 240–300 ms. Animate scale on a wrapper and counter-scale content, or cross-fade content so text doesn't stretch.
|
|
36
|
+
4. **Shared text.** When labels share letters ("Continue" → "Confirm"), split them into spans keyed by letter and position, keep shared letters, fade others (120 ms out, 180 ms in, 40 ms offset). Only do this for one hero action.
|
|
37
|
+
5. **Spring, not bounce.** If using a spring: stiffness ~400, damping ~38 (≈ 0 overshoot). Overshoot reads as playful; keep it for playful brands only.
|
|
38
|
+
6. **Focus and semantics.** After the morph, move focus into the new surface (the input, the dialog heading). The reverse morph returns focus to the trigger. Announce changes that aren't focus moves with `role="status"`.
|
|
39
|
+
7. **Reduced motion and no JS.** Under reduce, skip the transition (call the update directly) or cross-fade at 150 ms. Without JS, the control should be a real link or form that works (a `<form>` that posts, an `<a>` to the detail page).
|
|
40
|
+
|
|
41
|
+
React/Tailwind notes: `flushSync` from `react-dom` inside `startViewTransition` so React commits synchronously; if Motion is already in the project, `layoutId` on both elements does the same with less code, but don't add Motion just for this.
|
|
42
|
+
|
|
43
|
+
## Pitfalls
|
|
44
|
+
|
|
45
|
+
- Morphing between shapes with different border radii without animating radius: corners jump. Animate `border-radius` on the group, or keep radii equal.
|
|
46
|
+
- Text stretched during a scale transform: always counter-scale or cross-fade content.
|
|
47
|
+
- Two elements with the same `view-transition-name` visible at once: the transition is skipped with a console error.
|
|
48
|
+
- Durations over 400 ms on a frequent action: it starts to feel slow by the third time.
|
|
49
|
+
|
|
50
|
+
## How to verify
|
|
51
|
+
|
|
52
|
+
- `palate animate --check` on the flow: frame strip shows one continuous shape between states (no blank frame, no jump); reduced-motion strip shows an instant or faded change.
|
|
53
|
+
- Keyboard: Enter on the trigger moves focus into the new surface; Escape reverses and returns focus.
|
|
54
|
+
- Click rapidly open/close five times: no stuck intermediate state.
|
|
55
|
+
|
|
56
|
+
## Examples
|
|
57
|
+
|
|
58
|
+
- Seen in Family, the Ethereum wallet app (described at https://benji.org/family-values): buttons reshape into the next step and trays rise from the control that opened them, so the whole app feels like one continuous object.
|