{"repo":"ruucm/shadergradient","free":true,"listed":false,"github":"https://github.com/ruucm/shadergradient","clone":"git clone https://github.com/ruucm/shadergradient.git","description":"Create beautiful moving gradients on Framer, Figma and React","language":"TypeScript","stars":2114,"topics":["figma-plugin","framer","glsl-shaders","gradient","reactjs","threejs"],"license":null,"category":"dev_tool","readme_excerpt":"# Shader Gradient v2\n\nCustomizable 3D, moving gradient for React. The v2 package is lean: it only ships the `ShaderGradient` renderer (and its canvas helper), while the stateless UI pieces now live in the separate `@shadergradient/ui` package.\n\n![Intro](./assets/intro.gif)\n\n# Table of contents\n\n- 📦 [Installation](#installation)\n- 📦 [Packages](#packages)\n- 💻 [Usage](#usage)\n- 📚 [Examples](#examples)\n- 🎤 [Conference Talks](#conference-talks)\n- 📝 [Contributing](#contributing)\n- 🚀 [Future Plan](#future-plan)\n- ⚖️ [License](#license)\n\n# Installation\n\n## Figma\n\n[Figma Plugin](https://www.figma.com/community/plugin/1203016883447870818)\n\n## Framer\n\n[Framer Component (Copy this URL and paste it on Framer Canvas)](https://framer.com/m/ShaderGradient-oWuS.js)\n\n## React\n\nInstall the core renderer and its peer deps.\n\n```\n# with yarn\nyarn add @shadergradient/react @react-three/fiber three three-stdlib camera-controls\nyarn add -D @types/three\n\n# with npm\nnpm i @shadergradient/react @react-three/fiber three three-stdlib camera-controls\nnpm i -D @types/three\n\n# with pnpm\npnpm add @shadergradient/react @react-three/fiber three three-stdlib camera-controls\npnpm add -D @types/three\n```\n\nNeed the stateless control surfaces? Pull them from the `@shadergradient/ui` package (ESM build used by Framer/Figma), not from `@shadergradient/react`.\n\n### Compatibility matrix\n\n`@shadergradient/react` itself works on React 18 or 19, but the right `@react-three/fiber` version depends on your environment. **For Next.js 15 App Router specifically**, you must use R3F v9 + React 19 — R3F v8 is structurally incompatible with the App Router's vendored React 19 canary (see [#138](https://github.com/ruucm/shadergradient/issues/138) for the full trace).\n\n| Environment                           | React          | @react-three/fiber   | three       |\n| ------------------------------------- | -------------- | -------------------- | ----------- |\n| **Next 15 — App Router**              | `^19.0.0`      | `^9.0.0`             | `>=0.158.0` |\n| Next 14 / Next 15 Pages / Vite / etc. | `^18` or `^19` | matching `8.x`/`9.x` | `>=0.158.0` |\n\nNo `next.config` aliases or `transpilePackages` entries are required when you stay on these combinations.\n\n# Packages\n\n- `@shadergradient/react`\n  - Ships only the renderer: `ShaderGradient` and `ShaderGradientCanvas`.\n  - No built-in store or controls. Use your own state or pair with `@shadergradient/ui`.\n- `@shadergradient/ui`\n  - Stateless UI/control components extracted from the core package for Framer/Figma usage.\n  - Not published to npm; consumed as an ESM bundle (see `packages/ui`).\n- `shadergradient-old`\n  - Legacy v1 package that bundled store + UI. Keep using this only if you rely on the old with-store build.\n\n# Usage\n\nDrop `ShaderGradient` inside `ShaderGradientCanvas` and drive it with props or a query string.\n\n```tsx\nimport { ShaderGradientCanvas, ShaderGradient } from '@shadergradient/react'\n\nfunction App() {\n  return (\n    <ShaderGradientCanvas\n      style={{ position: 'absolute', inset: 0 }}\n      pixelDensity={1.5}\n      fov={45}\n    >\n      <ShaderGradient cDistance={32} cPolarAngle={125} />\n    </ShaderGradientCanvas>\n  )\n}\n```\n\nLoad settings from a URL (for example, one copied from [shadergradient.co/customize](https://www.shadergradient.co/customize)):\n\n```tsx\n<ShaderGradientCanvas>\n  <ShaderGradient\n    control='query'\n    urlString='https://www.shadergradient.co/customize?animate=on&cDistance=3.6&cPolarAngle=90&color1=%2352ff89&color2=%23dbba95&color3=%23d0bce1&lightType=3d&shader=defaults&type=plane&uFrequency=5.5&uSpeed=0.4&uStrength=4'\n  />\n</ShaderGradientCanvas>\n```\n\n### Available Gradient Properties (Types)\n\n```ts\ntype MeshT = {\n  type?: 'plane' | 'sphere' | 'waterPlane'\n  animate?: 'on' | 'off'\n  uTime?: number\n  uSpeed?: number\n  uStrength?: number\n  uDensity?: number\n  uFrequency?: number\n  uAmplitude?: number\n  range?: 'enabled' | 'disabled' | string\n  rangeStart?: number\n  rangeEnd?: number\n  loop?: 'on' | 'off'\n  loopDuration?: number\n  positionX?: number\n  positionY?: number\n  positionZ?: number\n  rotationX?: number\n  rotationY?: number\n  rotationZ?: number\n  color1?: string\n  color2?: string\n  color3?: string\n  reflection?: number\n  wireframe?: boolean\n  shader?: string\n  rotSpringOption?: any\n  posSpringOption?: any\n}\n\ntype GradientT = MeshT & {\n  control?: 'query' | 'props'\n  isFigmaPlugin?: boolean\n  smoothTime?: number\n  cAzimuthAngle?: number\n  cPolarAngle?: number\n  cDistance?: number\n  cameraZoom?: number\n  lightType?: '3d' | 'env'\n  brightness?: number\n  envPreset?: 'city' | 'dawn' | 'lobby'\n  grain?: 'on' | 'off'\n  grainBlending?: number\n  zoomOut?: boolean\n  toggleAxis?: boolean\n  hoverState?: string\n  enableTransition?: boolean\n  enableCameraUpdate?: boolean\n  urlString?: string\n  onCameraUpdate?: (updates: Partial<GradientT>) => void\n}\n```\n\n`ShaderGradientCanvas` also accepts `pixelDensity`, `fov`, `envBasePath`, GL overrides (`preserveDrawingBuffer`, `powerPreference`), and lazy-load controls (`lazyLoad`, `threshold`, `rootMargin`).\n\n# Examples\n\n- CRA Starter: [CodeSandbox](https://codesandbox.io/p/sandbox/github/ruucm/shadergradient/tree/main/apps/example-cra?file=%2Fsrc%2FApp.tsx)\n- Next.js Starter (App Router): [CodeSandbox](https://codesandbox.io/p/sandbox/github/ruucm/shadergradient/tree/main/apps/example-nextjs-approuter)\n- Next.js Starter: [CodeSandbox](https://codesandbox.io/p/sandbox/github/ruucm/shadergradient/tree/main/apps/example-nextjs)\n- Vite + React 19 Starter: [CodeSandbox](https://codesandbox.io/p/sandbox/github/ruucm/shadergradient/tree/main/apps/examples/example-vite-react)\n\nFigma and Framer demos still use the UI package internally:\n\n- [Figma GIF Example](https://framer.com/projects/shadergradient-co-package-origin--zugKWPH3hb4TzPLbtN8y-aV7Di?node=v1ySO756L)\n- [Framer Remix (Login required)](https://framer.com/projects/new?duplicate=sJitbgOn6on6Savojbyk)\n\n# Conference Talks\n\n[![FEConf 2024 ShaderGradient](./assets/feconf.png)](https://www.youtube.com/watch?v=CSChpoiRTIY)\n\n# Contributing\n\n## Setup\n\n```\npnpm install\n```\n\n## Start development\n\n```\npnpm dev\n```\n\n## Release\n\n```\npnpm changeset\npnpm version-packages\n```\n\nthen commit changes (message like v1.x.x)\n\n```sh\n# Release to npm\npnpm release\n\n# Release it as ES Module (Hosted by GitHub Pages)\ngit push origin main\n```\n\n# Future Plan\n\n- [x] Detatch framer-motion peer depenency (Seperate UI & Store Package)\n- [x] Figma GIF Support\n- [ ] More Shaders (Metalic, Glass, etc.)\n- [x] Three.js version upgrade\n- [x] Separate framer component bundles & shader gradient bundles\n- [ ] Separate shader codes as a separate package, and make it reusable for JS, Vue, etc.\n- [x] Framer Plugin\n- [ ] Webflow Support\n- [ ] Wix Support\n\n# License\n\nMIT © [ruucm](https://github.com/ruucm), [stone-skipper](https://github.com/stone-skipper)\n","default_branch":"main","files":541,"tree":[".changeset/config.json",".github/workflows/deploy.yml",".gitignore",".npmrc",".prettierignore",".prettierrc",".vscode/settings.json","README.md","apps/email-previews/.react-email/CHANGELOG.md","apps/email-previews/.react-email/emails/.gitkeep","apps/email-previews/.react-email/index.mjs","apps/email-previews/.react-email/jsx-runtime/jsx-dev-runtime.js","apps/email-previews/.react-email/license.md","apps/email-previews/.react-email/module-punycode.d.ts","apps/email-previews/.react-email/next-env.d.ts","apps/email-previews/.react-email/next.config.mjs","apps/email-previews/.react-email/package-lock.json","apps/email-previews/.react-email/package.json","apps/email-previews/.react-email/postcss.config.js","apps/email-previews/.react-email/readme.md","apps/email-previews/.react-email/scripts/build-preview-server.mts","apps/email-previews/.react-email/scripts/dev.mts","apps/email-previews/.react-email/scripts/fill-caniemail-data.mts","apps/email-previews/.react-email/scripts/seed.mts","apps/email-previews/.react-email/scripts/utils/default-seed/auth/account-confirmation.tsx","apps/email-previews/.react-email/scripts/utils/default-seed/auth/forgot-password.tsx","apps/email-previews/.react-email/scripts/utils/default-seed/communications/payment-overdue.tsx","apps/email-previews/.react-email/scripts/utils/default-seed/communications/team-invite.tsx","apps/email-previews/.react-email/scripts/utils/default-seed/communications/webhooks-failed.tsx","apps/email-previews/.react-email/scripts/utils/default-seed/feedback-request.tsx","apps/email-previews/.react-email/scripts/utils/default-seed/marketing/changelog.tsx","apps/email-previews/.react-email/src/actions/email-validation/__snapshots__/check-images.spec.tsx.snap","apps/email-previews/.react-email/src/actions/email-validation/caniemail-data.ts","apps/email-previews/.react-email/src/actions/email-validation/check-compatibility.ts","apps/email-previews/.react-email/src/actions/email-validation/check-images.spec.tsx","apps/email-previews/.react-email/src/actions/email-validation/check-images.ts","apps/email-previews/.react-email/src/actions/email-validation/check-links.spec.tsx","apps/email-previews/.react-email/src/actions/email-validation/check-links.ts","apps/email-previews/.react-email/src/actions/email-validation/get-code-location-from-ast-element.ts","apps/email-previews/.react-email/src/actions/email-validation/quick-fetch.ts","apps/email-previews/.react-email/src/actions/export-single-template.ts","apps/email-previews/.react-email/src/actions/get-email-path-from-slug.ts","apps/email-previews/.react-email/src/actions/get-emails-directory-metadata-action.ts","apps/email-previews/.react-email/src/actions/render-email-by-path.tsx","apps/email-previews/.react-email/src/actions/safe-action.ts","apps/email-previews/.react-email/src/animated-icons-data/help.json","apps/email-previews/.react-email/src/animated-icons-data/link.json","apps/email-previews/.react-email/src/animated-icons-data/load.json","apps/email-previews/.react-email/src/animated-icons-data/mail.json","apps/email-previews/.react-email/src/app/env.ts","apps/email-previews/.react-email/src/app/favicon.ico","apps/email-previews/.react-email/src/app/fonts.ts","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoBold.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoBoldItalic.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoHeavy.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoHeavyItalic.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoLight.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoLightItalic.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoMedium.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoMediumItalic.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoRegular.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoRegularItalic.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoSemibold.otf","apps/email-previews/.react-email/src/app/fonts/SFMono/SFMonoSemiboldItalic.otf","apps/email-previews/.react-email/src/app/globals.css","apps/email-previews/.react-email/src/app/layout.tsx","apps/email-previews/.react-email/src/app/logo.png","apps/email-previews/.react-email/src/app/page.tsx","apps/email-previews/.react-email/src/app/preview/[...slug]/email-frame.tsx","apps/email-previews/.react-email/src/app/preview/[...slug]/error-overlay.tsx","apps/email-previews/.react-email/src/app/preview/[...slug]/page.tsx","apps/email-previews/.react-email/src/app/preview/[...slug]/preview.tsx","apps/email-previews/.react-email/src/components/button.tsx","apps/email-previews/.react-email/src/components/code-container.tsx","apps/email-previews/.react-email/src/components/code-snippet.tsx","apps/email-previews/.react-email/src/components/code.tsx","apps/email-previews/.react-email/src/components/heading.tsx","apps/email-previews/.react-email/src/components/icons/icon-arrow-down.tsx","apps/email-previews/.react-email/src/components/icons/icon-base.tsx","apps/email-previews/.react-email/src/components/icons/icon-bug.tsx","apps/email-previews/.react-email/src/components/icons/icon-button.tsx","apps/email-previews/.react-email/src/components/icons/icon-check.tsx","apps/email-previews/.react-email/src/components/icons/icon-clipboard.tsx","apps/email-previews/.react-email/src/components/icons/icon-cloud-alert.tsx","apps/email-previews/.react-email/src/components/icons/icon-cloud-check.tsx","apps/email-previews/.react-email/src/components/icons/icon-download.tsx","apps/email-previews/.react-email/src/components/icons/icon-email.tsx","apps/email-previews/.react-email/src/components/icons/icon-file.tsx","apps/email-previews/.react-email/src/components/icons/icon-folder-open.tsx","apps/email-previews/.react-email/src/components/icons/icon-folder.tsx","apps/email-previews/.react-email/src/components/icons/icon-hide-sidebar.tsx","apps/email-previews/.react-email/src/components/icons/icon-image.tsx","apps/email-previews/.react-email/src/components/icons/icon-info.tsx","apps/email-previews/.react-email/src/components/icons/icon-link.tsx","apps/email-previews/.react-email/src/components/icons/icon-loader.tsx","apps/email-previews/.react-email/src/components/icons/icon-monitor.tsx","apps/email-previews/.react-email/src/components/icons/icon-moon.tsx","apps/email-previews/.react-email/src/components/icons/icon-phone.tsx","apps/email-previews/.react-email/src/components/icons/icon-reload.tsx","apps/email-previews/.react-email/src/components/icons/icon-source.tsx","apps/email-previews/.react-email/src/components/icons/icon-stamp.tsx","apps/email-previews/.react-email/src/components/icons/icon-sun.tsx","apps/email-previews/.react-email/src/components/icons/icon-warning.tsx","apps/email-previews/.react-email/src/components/index.ts","apps/email-previews/.react-email/src/components/logo.tsx","apps/email-previews/.react-email/src/components/resizable-wrapper.tsx","apps/email-previews/.react-email/src/components/send.tsx","apps/email-previews/.react-email/src/components/shell.tsx","apps/email-previews/.react-email/src/components/sidebar/file-tree-directory-children.tsx","apps/email-previews/.react-email/src/components/sidebar/file-tree-directory.tsx","apps/email-previews/.react-email/src/components/sidebar/file-tree.tsx","apps/email-previews/.react-email/src/components/sidebar/index.ts","apps/email-previews/.react-email/src/components/sidebar/sidebar.tsx","apps/email-previews/.react-email/src/components/text.tsx","apps/email-previews/.react-email/src/components/toolbar.tsx","apps/email-previews/.react-email/src/components/toolbar/checking-results.tsx","apps/email-previews/.react-email/src/components/toolbar/code-preview-line-link.tsx","apps/email-previews/.react-email/src/components/toolbar/compatibility.tsx","apps/email-previews/.react-email/src/components/toolbar/linter.tsx","apps/email-previews/.react-email/src/components/toolbar/resend.tsx","apps/email-previews/.react-email/src/components/toolbar/results-table.tsx","apps/email-previews/.react-email/src/components/toolbar/results.tsx","apps/email-previews/.react-email/src/components/toolbar/spam-assassin.tsx","apps/email-previews/.react-email/src/components/toolbar/toolbar-button.tsx","apps/email-previews/.react-email/src/components/toolbar/use-cached-state.ts","apps/email-previews/.react-email/src/components/tooltip-content.tsx","apps/email-previews/.react-email/src/components/tooltip.tsx","apps/email-previews/.react-email/src/components/topbar.tsx","apps/email-previews/.react-email/src/components/topbar/active-view-toggle-group.tsx","apps/email-previews/.react-email/src/components/topbar/emulated-dark-mode-toggle.tsx","apps/email-previews/.react-email/src/components/topbar/view-size-controls.tsx","apps/email-previews/.react-email/src/contexts/emails.tsx","apps/email-previews/.react-email/src/contexts/preview.tsx","apps/email-previews/.react-email/src/contexts/toolbar.tsx","apps/email-previews/.react-email/src/hooks/use-clamped-state.ts","apps/email-previews/.react-email/src/hooks/use-email-rendering-result.ts","apps/email-previews/.react-email/src/hooks/use-fragment-identifier.ts","apps/email-previews/.react-email/src/hooks/use-hot-reload.ts","apps/email-previews/.react-email/src/hooks/use-rendering-metadata.ts","apps/email-previews/.react-email/src/utils/__snapshots__/get-email-component.spec.ts.snap","apps/email-previews/.react-email/src/utils/caniemail/all-css-properties.ts","apps/email-previews/.react-email/src/utils/caniemail/ast/__snapshots__/get-object-variables.spec.ts.snap","apps/email-previews/.react-email/src/utils/caniemail/ast/get-object-variables.spec.ts","apps/email-previews/.react-email/src/utils/caniemail/ast/get-object-variables.ts","apps/email-previews/.react-email/src/utils/caniemail/ast/get-used-style-properties.spec.ts","apps/email-previews/.react-email/src/utils/caniemail/ast/get-used-style-properties.ts","apps/email-previews/.react-email/src/utils/caniemail/get-compatibility-stats-for-entry.ts","apps/email-previews/.react-email/src/utils/caniemail/get-css-functions.ts","apps/email-previews/.react-email/src/utils/caniemail/get-css-property-names.ts","apps/email-previews/.react-email/src/utils/caniemail/get-css-property-with-value.ts","apps/email-previews/.react-email/src/utils/caniemail/get-css-unit.ts","apps/email-previews/.react-email/src/utils/caniemail/get-element-attributes.ts","apps/email-previews/.react-email/src/utils/caniemail/get-element-names.ts","apps/email-previews/.react-email/src/utils/caniemail/tailwind/get-tailwind-config.spec.ts","apps/email-previews/.react-email/src/utils/caniemail/tailwind/get-tailwind-config.ts","apps/email-previews/.react-email/src/utils/caniemail/tailwind/get-tailwind-metadata.spec.ts","apps/email-previews/.react-email/src/utils/caniemail/tailwind/get-tailwind-metadata.ts","apps/email-previews/.react-email/src/utils/caniemail/tailwind/tests/dummy-email-template.tsx","apps/email-previews/.react-email/src/utils/caniemail/tailwind/tests/tailwind.config.ts","apps/email-previews/.react-email/src/utils/cn.ts","apps/email-previews/.react-email/src/utils/constants.ts","apps/email-previews/.react-email/src/utils/contains-email-template.spec.ts","apps/email-previews/.react-email/src/utils/contains-email-template.ts","apps/email-previews/.react-email/src/utils/convert-stack-with-sourcemap.ts","apps/email-previews/.react-email/src/utils/copy-text-to-clipboard.ts","apps/email-previews/.react-email/src/utils/create-jsx-runtime.ts","apps/email-previews/.react-email/src/utils/esbuild/escape-string-for-regex.ts","apps/email-previews/.react-email/src/utils/esbuild/renderring-utilities-exporter.ts","apps/email-previews/.react-email/src/utils/get-email-component.spec.ts","apps/email-previews/.react-email/src/utils/get-email-component.ts","apps/email-previews/.react-email/src/utils/get-emails-directory-metadata.spec.ts","apps/email-previews/.react-email/src/utils/get-emails-directory-metadata.ts","apps/email-previews/.react-email/src/utils/get-line-and-column-from-offset.spec.ts","apps/email-previews/.react-email/src/utils/get-line-and-column-from-offset.ts","apps/email-previews/.react-email/src/utils/index.ts","apps/email-previews/.react-email/src/utils/js-email-detection.spec.ts","apps/email-previews/.react-email/src/utils/language-map.ts","apps/email-previews/.react-email/src/utils/linting.ts","apps/email-previews/.react-email/src/utils/load-stream.ts","apps/email-previews/.react-email/src/utils/register-spinner-autostopping.ts","apps/email-previews/.react-email/src/utils/result.ts","apps/email-previews/.react-email/src/utils/run-bundled-code.ts","apps/email-previews/.react-email/src/utils/sanitize.ts","apps/email-previews/.react-email/src/utils/sleep.ts","apps/email-previews/.react-email/src/utils/snake-to-camel.ts","apps/email-previews/.react-email/src/utils/static-node-modules-for-vm.ts","apps/email-previews/.react-email/src/utils/style-text.ts","apps/email-previews/.react-email/src/utils/testing/js-email-export-default.js","apps/email-previews/.react-email/src/utils/testing/js-email-test.js","apps/email-previews/.react-email/src/utils/testing/mdx-email-test.js","apps/email-previews/.react-email/src/utils/testing/request-response-email.tsx","apps/email-previews/.react-email/src/utils/testing/vercel-invite-user.tsx","apps/email-previews/.react-email/src/utils/types/as.ts","apps/email-previews/.react-email/src/utils/types/email-template.ts","apps/email-previews/.react-email/src/utils/types/error-object.ts","apps/email-previews/.react-email/src/utils/types/hot-reload-change.ts","apps/email-previews/.react-email/src/utils/unreachable.ts","apps/email-previews/.react-email/tailwind.config.ts","apps/email-previews/.react-email/tsconfig.json","apps/email-previews/.react-email/vitest.config.ts","apps/email-previews/emails/ProductUpdateEmail.tsx","apps/email-previews/emails/ShaderGradientEmail.tsx","apps/email-previews/emails/ShaderGradientUpdateEmail.tsx","apps/email-previews/lib/emailContent.ts","apps/email-previews/package.json","apps/email-previews/tsconfig.json","apps/example-nextjs-dev/.eslintrc.json","apps/example-nextjs-dev/.gitignore","apps/example-nextjs-dev/CHANGELOG.md","apps/example-nextjs-dev/README.md","apps/example-nextjs-dev/app/customize-simple/page.tsx","apps/example-nextjs-dev/app/favicon.ico","apps/example-nextjs-dev/app/fonts/GeistMonoVF.woff","apps/example-nextjs-dev/app/fonts/GeistVF.woff","apps/example-nextjs-dev/app/globals.css","apps/example-nextjs-dev/app/layout.tsx","apps/example-nextjs-dev/app/loop/page.tsx","apps/example-nextjs-dev/app/page.tsx","apps/example-nextjs-dev/next.config.mjs","apps/example-nextjs-dev/package.json","apps/example-nextjs-dev/postcss.config.mjs","apps/example-nextjs-dev/tailwind.config.ts","apps/example-nextjs-dev/tsconfig.json","apps/examples/example-nextjs/.editorconfig","apps/examples/example-nextjs/.eslintignore","apps/examples/example-nextjs/.eslintrc","apps/examples/example-nextjs/.gitignore","apps/examples/example-nextjs/.prettierignore","apps/examples/example-nextjs/.prettierrc","apps/examples/example-nextjs/.vscode/settings.json","apps/examples/example-nextjs/LICENSE","apps/examples/example-nextjs/README.md","apps/examples/example-nextjs/app/global.css","apps/examples/example-nextjs/app/head.tsx","apps/examples/example-nextjs/app/layout.tsx","apps/examples/example-nextjs/app/page.tsx","apps/examples/example-nextjs/next-env.d.ts","apps/examples/example-nextjs/next.config.js","apps/examples/example-nextjs/package.json","apps/examples/example-nextjs/postcss.config.js","apps/examples/example-nextjs/public/icons/android-icon-192x192.png","apps/examples/example-nextjs/public/icons/android-icon-512x512.png","apps/examples/example-nextjs/public/icons/apple-touch-icon.png","apps/examples/example-nextjs/public/icons/favicon-16x16.png","apps/examples/example-nextjs/public/icons/favicon-32x32.png","apps/examples/example-nextjs/public/icons/favicon.ico","apps/examples/example-nextjs/public/icons/safari-pinned-tab.svg","apps/examples/example-nextjs/public/icons/share.png","apps/examples/example-nextjs/public/manifest.json","apps/examples/example-nextjs/sandbox.config.json","apps/examples/example-nextjs/src/components/canvas/Scene.tsx","apps/examples/example-nextjs/src/components/canvas/View.tsx","apps/examples/example-nextjs/src/components/dom/Layout.tsx","apps/examples/example-nextjs/src/helpers/components/Three.tsx","apps/examples/example-nextjs/src/helpers/global.ts","apps/examples/example-nextjs/src/index.d.ts","apps/examples/example-nextjs/tailwind.config.js","apps/examples/example-nextjs/tsconfig.json","apps/examples/example-vite-react/.gitignore","apps/examples/example-vite-react/README.md","apps/examples/example-vite-react/eslint.config.js","apps/examples/example-vite-react/index.html","apps/examples/example-vite-react/package-lock.json","apps/examples/example-vite-react/package.json","apps/examples/example-vite-react/pnpm-lock.yaml","apps/examples/example-vite-react/public/vite.svg","apps/examples/example-vite-react/src/App.css","apps/examples/example-vite-react/src/App.tsx","apps/examples/example-vite-react/src/assets/react.svg","apps/examples/example-vite-react/src/index.css","apps/examples/example-vite-react/src/main.tsx","apps/examples/example-vite-react/src/vite-env.d.ts","apps/examples/example-vite-react/tsconfig.app.json","apps/examples/example-vite-react/tsconfig.json","apps/examples/example-vite-react/tsconfig.node.json","apps/examples/example-vite-react/vite.config.ts","apps/figma-plugin/README.md","apps/figma-plugin/manifest.json","apps/figma-plugin/package.json","apps/figma-plugin/src/code.ts","apps/figma-plugin/src/ui.css","apps/figma-plugin/src/ui.html","apps/figma-plugin/src/ui.tsx","apps/figma-plugin/tsconfig.json","apps/figma-plugin/webpack.config.js","apps/framer-plugin/.gitignore","apps/framer-plugin/README.md","apps/framer-plugin/eslint.config.js","apps/framer-plugin/framer.json","apps/framer-plugin/index.html","apps/framer-plugin/package.json","apps/framer-plugin/public/icon.png","apps/framer-plugin/src/App.css","apps/framer-plugin/src/App.tsx","apps/framer-plugin/src/main.tsx","apps/framer-plugin/src/vite-env.d.ts","apps/framer-plugin/tsconfig.json","apps/framer-plugin/vite.config.ts","assets/feconf.png","assets/figma.gif","assets/framer.gif","assets/intro.gif","package.json","packages/eslint-config-custom/index.js","packages/eslint-config-custom/package.json","packages/shadergradient/.eslintrc.js","packages/shadergradient/.npmignore","packages/shadergradient/CHANGELOG.md","packages/shadergradient/package.json","packages/shadergradient/pnpm-lock.yaml","packages/shadergradient/src/FramerControls.ts","packages/shadergradient/src/FramerShaderGradient.tsx","packages/shadergradient/src/ShaderGradient/Axis/Axis.tsx","packages/shadergradient/src/ShaderGradient/Axis/CubicBezierLine.tsx","packages/shadergradient/src/ShaderGradient/Axis/GizmoHelper.tsx","packages/shadergradient/src/ShaderGradient/Axis/GizmoViewport.tsx","packages/shadergradient/src/ShaderGradient/Axis/Line.tsx","packages/shadergradient/src/ShaderGradient/Axis/OrthographicCamera.tsx","packages/shadergradient/src/ShaderGradient/Axis/index.ts","packages/shadergradient/src/ShaderGradient/Axis/mergeRefs.ts","packages/shadergradient/src/ShaderGradient/Axis/useCamera.tsx","packages/shadergradient/src/ShaderGradient/Axis/useFBO.tsx","packages/shadergradient/src/ShaderGradient/Controls/CameraControl.tsx","packages/shadergradient/src/ShaderGradient/Controls/Controls.tsx","packages/shadergradient/src/ShaderGradient/Controls/index.ts","packages/shadergradient/src/ShaderGradient/Controls/useCameraAnimation.ts","packages/shadergradient/src/ShaderGradient/Lights/Environment/EnvironmentMap.tsx","packages/shadergradient/src/ShaderGradient/Lights/Environment/environment-assets.ts","packages/shadergradient/src/ShaderGradient/Lights/Environment/index.ts","packages/shadergradient/src/ShaderGradient/Lights/Environment/useRGBELoader.ts","packages/shadergradient/src/ShaderGradient/Lights/Lights.tsx","packages/shadergradient/src/ShaderGradient/Lights/index.ts","packages/shadergradient/src/ShaderGradient/Mesh/Geometry.tsx","packages/shadergradient/src/ShaderGradient/Mesh/Materials.tsx","packages/shadergradient/src/ShaderGradient/Mesh/Mesh.tsx","packages/shadergradient/src/ShaderGradient/Mesh/index.ts","packages/shadergradient/src/ShaderGradient/PostProcessing/PostProcessing.tsx","packages/shadergradient/src/ShaderGradient/PostProcessing/index.ts","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/BlendFunction.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/HalftonePass.ts","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/HalftoneShader.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/Pass.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/BlendFunction.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/BlendMode.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/add/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/alpha/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/average/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/color-burn/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/color-dodge/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/darken/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/difference/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/divide/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/exclusion/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/lighten/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/multiply/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/negation/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/normal/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/overlay/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/reflect/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/screen/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/soft-light/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/glsl/subtract/shader.frag","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/blending/index.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/from-threejs/postprocessing/EffectComposer.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/from-threejs/postprocessing/MaskPass.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/from-threejs/postprocessing/Pass.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/from-threejs/postprocessing/RenderPass.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/from-threejs/postprocessing/ShaderPass.js","packages/shadergradient/src/ShaderGradient/PostProcessing/lib/pp/from-threejs/shaders/CopyShader.js","packages/shadergradient/src/ShaderGradient/ShaderGradient.tsx","packages/shadergradient/src/ShaderGradient/index.ts","packages/shadergradient/src/ShaderGradientCanvas.tsx","packages/shadergradient/src/consts.ts","packages/shadergradient/src/hooks/useInView.ts","packages/shadergradient/src/index.ts","packages/shadergradient/src/module.d.ts","packages/shadergradient/src/presets.ts","packages/shadergradient/src/shaders/base/fragment.glsl","packages/shadergradient/src/shaders/base/index.ts","packages/shadergradient/src/shaders/base/vertex.glsl","packages/shadergradient/src/shaders/cosmic/index.ts","packages/shadergradient/src/shaders/cosmic/plane/fragment.glsl","packages/shadergradient/src/shaders/cosmic/plane/index.ts","packages/shadergradient/src/shaders/cosmic/plane/vertex.glsl","packages/shadergradient/src/shaders/cosmic/sphere/fragment.glsl","packages/shadergradient/src/shaders/cosmic/sphere/index.ts","packages/shadergradient/src/shaders/cosmic/sphere/vertex.glsl","packages/shadergradient/src/shaders/cosmic/waterPlane/fragment.glsl","packages/shadergradient/src/shaders/cosmic/waterPlane/index.ts","packages/shadergradient/src/shaders/cosmic/waterPlane/vertex.glsl","packages/shadergradient/src/shaders/defaults/index.ts","packages/shadergradient/src/shaders/defaults/plane/fragment.glsl","packages/shadergradient/src/shaders/defaults/plane/index.ts","packages/shadergradient/src/shaders/defaults/plane/vertex.glsl","packages/shadergradient/src/shaders/defaults/sphere/fragment.glsl","packages/shadergradient/src/shaders/defaults/sphere/index.ts","packages/shadergradient/src/shaders/defaults/sphere/vertex.glsl","packages/shadergradient/src/shaders/defaults/waterPlane/fragment.glsl","packages/shadergradient/src/shaders/defaults/waterPlane/index.ts","packages/shadergradient/src/shaders/defaults/waterPlane/vertex.glsl"],"storefront":"/r/ruucm","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/ruucm/shadergradient/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}