{"_id":"@baghel/goey-toast","_rev":"4-7d8a40d8c27a2b38c4d5833800ae1abe","name":"@baghel/goey-toast","dist-tags":{"latest":"0.3.3"},"versions":{"0.3.0":{"name":"@baghel/goey-toast","version":"0.3.0","keywords":["toast","notification","sonner","framer-motion","animation","morph"],"license":"MIT","_id":"@baghel/goey-toast@0.3.0","maintainers":[{"name":"baghel","email":"devanshbaghel85@gmail.com"}],"homepage":"https://goey-toast.vercel.app","bugs":{"url":"https://github.com/Devansh-Baghel/goey-toast-fork/issues"},"dist":{"shasum":"629a55f5900ca1f0f546d5e224017cf164bf86f0","tarball":"https://registry.npmjs.org/@baghel/goey-toast/-/goey-toast-0.3.0.tgz","fileCount":11,"integrity":"sha512-IWHbn/3wXbSp6UkxpkOhSiqgYQafZchi9ieYv+AjuoO2psJRUXD7rOJ3K1x/o0W9E6eTHG972+C42wt3LoSVkA==","signatures":[{"sig":"MEQCICjLj+QKE0lBzx5WLfRNLo76wDzEGQslDWFtTPSJcz2QAiBOo4Cdt9xUa8UhpBy0NDJdyzRjTLsqEGuCABRvCwCz3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":494224},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/index.css"},"gitHead":"009c4d4228d42cab4833f565396341eb54519820","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"baghel","email":"devanshbaghel85@gmail.com"},"repository":{"url":"git+https://github.com/Devansh-Baghel/goey-toast-fork.git","type":"git"},"_npmVersion":"10.9.4","description":"A gooey, morphing toast component built on Sonner with Framer Motion animations","directories":{},"sideEffects":["*.css"],"_nodeVersion":"20.15.1","dependencies":{"sonner":"^2.0.7"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^28.0.0","react":"^19.2.4","vitest":"^4.0.18","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.2.3","@types/react":"^19.2.14","framer-motion":"^12.34.0","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.4","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","framer-motion":">=10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/goey-toast_0.3.0_1773208872543_0.5937727582986885","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@baghel/goey-toast","version":"0.3.1","keywords":["toast","notification","sonner","framer-motion","animation","morph"],"license":"MIT","_id":"@baghel/goey-toast@0.3.1","maintainers":[{"name":"baghel","email":"devanshbaghel85@gmail.com"}],"homepage":"https://goey-toast.vercel.app","bugs":{"url":"https://github.com/Devansh-Baghel/goey-toast-fork/issues"},"dist":{"shasum":"e97e10037033e8bb1382c84a0f7e63d8ad309dda","tarball":"https://registry.npmjs.org/@baghel/goey-toast/-/goey-toast-0.3.1.tgz","fileCount":11,"integrity":"sha512-yl657qPnk7hyhpxNS2QBgXrXmS/7hTVqZj2e9DHExDZgRZ3QMD0L4nZN8duUftxEDOw1UiE+Lmr0pMvfz+/pqg==","signatures":[{"sig":"MEUCIEaplIXm5CarhY+mInqCQkquEAnZar3W1PzEigSZ8Db9AiEA7YDSN2RzEiXvqIqHNjiYJwaRyfJafF2h73tDN2Ovmwk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":493663},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/index.css"},"gitHead":"b0d61417087e62258bddf18e98256cb8dbda062d","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"baghel","email":"devanshbaghel85@gmail.com"},"repository":{"url":"git+https://github.com/Devansh-Baghel/goey-toast-fork.git","type":"git"},"_npmVersion":"10.9.4","description":"A gooey, morphing toast component built on Sonner with Framer Motion animations","directories":{},"sideEffects":["*.css"],"_nodeVersion":"20.15.1","dependencies":{"sonner":"^2.0.7"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^28.0.0","react":"^19.2.4","vitest":"^4.0.18","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.2.3","@types/react":"^19.2.14","framer-motion":"^12.34.0","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.4","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","framer-motion":">=10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/goey-toast_0.3.1_1773209778884_0.7722020389537332","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@baghel/goey-toast","version":"0.3.2","keywords":["toast","notification","sonner","framer-motion","animation","morph"],"license":"MIT","_id":"@baghel/goey-toast@0.3.2","maintainers":[{"name":"baghel","email":"devanshbaghel85@gmail.com"}],"homepage":"https://goey-toast.vercel.app","bugs":{"url":"https://github.com/Devansh-Baghel/goey-toast-fork/issues"},"dist":{"shasum":"beced66699aafec08e96b716fd474f64b67c9c27","tarball":"https://registry.npmjs.org/@baghel/goey-toast/-/goey-toast-0.3.2.tgz","fileCount":11,"integrity":"sha512-Nx++5r2qSWXnrhINzFeKVa7SnXI3t7qhnQLmFVKuy7m2f9Ys4XXnHKPm3yKRg4b1B+MrM2nnuVbmNSc69et25w==","signatures":[{"sig":"MEMCHwcQQLJBNj/+3E+WGZsNerbB8Q6lovKY0VyPvcr3VCUCIEZtO6bFXKBkAS7gXHAreG3NugbHL9X7ZEws/s3Kn58V","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":493663},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/index.css"},"gitHead":"9fdd424ebe8e634c3749b40044c1c4dffab1aa32","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"baghel","email":"devanshbaghel85@gmail.com"},"repository":{"url":"git+https://github.com/Devansh-Baghel/goey-toast-fork.git","type":"git"},"_npmVersion":"10.9.4","description":"A gooey, morphing toast component built on Sonner with Framer Motion animations","directories":{},"sideEffects":["*.css"],"_nodeVersion":"20.15.1","dependencies":{"sonner":"^2.0.7"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^28.0.0","react":"^19.2.4","vitest":"^4.0.18","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.2.3","@types/react":"^19.2.14","framer-motion":"^12.34.0","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.4","@testing-library/react":"^16.3.2","@testing-library/jest-dom":"^6.9.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","framer-motion":">=10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/goey-toast_0.3.2_1773239786205_0.14759728390853555","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@baghel/goey-toast","version":"0.3.3","description":"A gooey, morphing toast component built on Sonner with Framer Motion animations","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":"./dist/index.css"},"sideEffects":["*.css"],"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit"},"peerDependencies":{"framer-motion":">=10.0.0","react":">=18.0.0","react-dom":">=18.0.0"},"dependencies":{"sonner":"^2.0.7"},"devDependencies":{"@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@types/node":"^25.2.3","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.4","framer-motion":"^12.34.0","jsdom":"^28.0.0","react":"^19.2.4","react-dom":"^19.2.4","tsup":"^8.5.1","typescript":"^5.9.3","vitest":"^4.0.18"},"keywords":["toast","notification","sonner","framer-motion","animation","morph"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Devansh-Baghel/goey-toast-fork.git"},"homepage":"https://goey-toast.vercel.app","bugs":{"url":"https://github.com/Devansh-Baghel/goey-toast-fork/issues"},"engines":{"node":">=18.0.0"},"_id":"@baghel/goey-toast@0.3.3","gitHead":"9d74e55202ccc7b8d68deb6b0e52db79689951b7","_nodeVersion":"20.15.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-Z7CfFcnpCIsTdO8Gzv2Uqe0itRVecL2Zy/LsJusN1QUCddjnU3p0CDIUW2+FbGIGQsOAF8gSX1A1V5gZlh3Xbw==","shasum":"f110d52294c663278d40953c8d13655c8748a52e","tarball":"https://registry.npmjs.org/@baghel/goey-toast/-/goey-toast-0.3.3.tgz","fileCount":11,"unpackedSize":493663,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCKt5KtvCUBwLLYdUPUQRZrxTf77Xg055pWzt+1YSXXGwIhAPISNxYy3ddIMpLLhdz506f46ryIZdghKcaU2Z/d4tEN"}]},"_npmUser":{"name":"baghel","email":"devanshbaghel85@gmail.com"},"directories":{},"maintainers":[{"name":"baghel","email":"devanshbaghel85@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/goey-toast_0.3.3_1773249242244_0.8485943098188902"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-11T06:01:12.398Z","modified":"2026-03-11T17:14:02.628Z","0.3.0":"2026-03-11T06:01:12.690Z","0.3.1":"2026-03-11T06:16:19.090Z","0.3.2":"2026-03-11T14:36:26.416Z","0.3.3":"2026-03-11T17:14:02.526Z"},"bugs":{"url":"https://github.com/Devansh-Baghel/goey-toast-fork/issues"},"license":"MIT","homepage":"https://goey-toast.vercel.app","keywords":["toast","notification","sonner","framer-motion","animation","morph"],"repository":{"type":"git","url":"git+https://github.com/Devansh-Baghel/goey-toast-fork.git"},"description":"A gooey, morphing toast component built on Sonner with Framer Motion animations","maintainers":[{"name":"baghel","email":"devanshbaghel85@gmail.com"}],"readme":"# gooey-toast\n\n[![gooey-toast](https://goey-toast.vercel.app/og-image.png)](https://goey-toast.vercel.app)\n\n**[Live Demo & Docs](https://goey-toast.vercel.app)**\n\n## Features\n\n- Organic blob morph animation (pill &rarr; blob &rarr; pill)\n- Five toast types: default, success, error, warning, info\n- Promise toasts with loading &rarr; success/error transitions\n- Action buttons with optional success label morph-back\n- Description body supporting strings and React components\n- Configurable display duration and bounce intensity\n- Custom fill color, border color, and border width\n- CSS class overrides via `classNames` prop\n- 6 positions with automatic horizontal mirroring for right-side positions\n- Center positions with symmetric morph animation\n- Hover pause: hovering an expanded toast pauses the dismiss timer\n- Hover re-expand: hovering a collapsed pill re-expands the toast\n- Pre-dismiss collapse animation\n- In-place toast updates via `gooeyToast.update()`\n- Dismiss by type filter: `gooeyToast.dismiss({ type: 'error' })`\n- Dark mode and RTL layout support\n- Animation presets: smooth, bouncy, subtle, snappy\n- Timestamp display on expanded toasts\n- Countdown progress bar with hover-pause and re-expand\n- Keyboard dismiss (Escape) and swipe-to-dismiss on mobile\n- Toast queue with configurable overflow strategy\n- Dismiss callbacks: `onDismiss` and `onAutoClose`\n\n## Installation\n\n```bash\nnpm install goey-toast\n```\n\n### shadcn/ui\n\n```bash\nnpx shadcn@latest add https://goey-toast.vercel.app/r/goey-toaster.json\n```\n\nThis installs a thin wrapper component at `components/ui/goey-toaster.tsx` and auto-installs the `goey-toast` and `framer-motion` packages.\n\n### Peer Dependencies\n\ngoey-toast requires the following peer dependencies:\n\n```bash\nnpm install react react-dom framer-motion\n```\n\n| Package        | Version    |\n| -------------- | ---------- |\n| react          | >= 18.0.0  |\n| react-dom      | >= 18.0.0  |\n| framer-motion  | >= 10.0.0  |\n\n### CSS Import (Required)\n\nYou **must** import the goey-toast stylesheet for the component to render correctly:\n\n```tsx\nimport 'goey-toast/styles.css'\n```\n\nAdd this import once in your app's entry point (e.g., `main.tsx` or `App.tsx`). Without it, toasts will appear unstyled.\n\n## Quick Start\n\n```tsx\nimport { GooeyToaster, gooeyToast } from 'goey-toast'\nimport 'goey-toast/styles.css'\n\nfunction App() {\n  return (\n    <>\n      <GooeyToaster position=\"bottom-right\" />\n      <button onClick={() => gooeyToast.success('Saved!')}>\n        Save\n      </button>\n    </>\n  )\n}\n```\n\n## API Reference\n\n### `gooeyToast` Methods\n\n```ts\ngooeyToast(title, options?)              // default (neutral)\ngooeyToast.success(title, options?)      // green\ngooeyToast.error(title, options?)        // red\ngooeyToast.warning(title, options?)      // yellow\ngooeyToast.info(title, options?)         // blue\ngooeyToast.promise(promise, data)        // loading -> success/error\ngooeyToast.update(id, options)           // update an existing toast in-place\ngooeyToast.dismiss(idOrFilter?)          // dismiss one, by type, or all toasts\n```\n\n#### `gooeyToast.update(id, options)`\n\nUpdates an existing toast in-place without removing and re-creating it.\n\n```tsx\nconst id = gooeyToast('Uploading...', {\n  icon: <SpinnerIcon />,\n})\n\n// Later, update the toast\ngooeyToast.update(id, {\n  title: 'Upload complete',\n  type: 'success',\n  description: '3 files uploaded.',\n  icon: null, // clears the custom icon\n})\n```\n\n**`GooeyToastUpdateOptions`:**\n\n| Option        | Type              | Description                   |\n| ------------- | ----------------- | ----------------------------- |\n| `title`       | `string`          | New title text                |\n| `description` | `ReactNode`       | New body content              |\n| `type`        | `GooeyToastType`   | Change the toast type/color   |\n| `action`      | `GooeyToastAction` | New action button             |\n| `icon`        | `ReactNode \\| null` | Custom icon (pass `null` to clear) |\n\n#### `gooeyToast.dismiss(idOrFilter?)`\n\nDismiss a single toast by ID, all toasts of a given type, or all toasts at once.\n\n```ts\n// Dismiss a specific toast\ngooeyToast.dismiss(toastId)\n\n// Dismiss all error toasts\ngooeyToast.dismiss({ type: 'error' })\n\n// Dismiss multiple types\ngooeyToast.dismiss({ type: ['error', 'warning'] })\n\n// Dismiss all toasts\ngooeyToast.dismiss()\n```\n\n### `GooeyToastOptions`\n\nOptions passed as the second argument to `gooeyToast()` and type-specific methods.\n\n| Option        | Type                 | Description                        |\n| ------------- | -------------------- | ---------------------------------- |\n| `description` | `ReactNode`          | Body content (string or component) |\n| `action`      | `GooeyToastAction`    | Action button configuration        |\n| `icon`        | `ReactNode`          | Custom icon override               |\n| `duration`    | `number`             | Display duration in ms             |\n| `id`          | `string \\| number`   | Unique toast identifier            |\n| `classNames`  | `GooeyToastClassNames`| CSS class overrides                |\n| `fillColor`   | `string`             | Background color of the blob       |\n| `borderColor` | `string`             | Border color of the blob           |\n| `borderWidth` | `number`             | Border width in px (default 1.5)   |\n| `timing`      | `GooeyToastTimings`   | Animation timing overrides         |\n| `spring`      | `boolean`            | Enable spring/bounce animations (default `true`) |\n| `bounce`      | `number`             | Spring intensity from `0.05` (subtle) to `0.8` (dramatic), default `0.4` |\n| `showProgress`| `boolean`            | Show countdown progress bar                      |\n| `onDismiss`   | `(id) => void`       | Called when toast is dismissed (any reason)       |\n| `onAutoClose` | `(id) => void`       | Called only on timer-based auto-dismiss           |\n| `preset`      | `AnimationPresetName`| Animation preset (`'smooth'`, `'bouncy'`, `'subtle'`, `'snappy'`) |\n\n### `GooeyToastAction`\n\n| Property       | Type       | Required | Description                                  |\n| -------------- | ---------- | -------- | -------------------------------------------- |\n| `label`        | `string`   | Yes      | Button text                                  |\n| `onClick`      | `() => void` | Yes   | Click handler                                |\n| `successLabel` | `string`   | No       | Label shown after click (morphs back to pill)|\n\n### `GooeyToastTimings`\n\nFine-tune animation speeds per toast.\n\n| Property           | Type     | Default | Description                          |\n| ------------------ | -------- | ------- | ------------------------------------ |\n| `displayDuration`  | `number` | 4000    | Milliseconds toast stays expanded    |\n\n### `GooeyToastClassNames`\n\nOverride styles for any part of the toast.\n\n| Key             | Target           |\n| --------------- | ---------------- |\n| `wrapper`       | Outer container  |\n| `content`       | Content area     |\n| `header`        | Icon + title row |\n| `title`         | Title text       |\n| `icon`          | Icon wrapper     |\n| `description`   | Body text        |\n| `actionWrapper` | Button container |\n| `actionButton`  | Action button    |\n\n### `GooeyToasterProps`\n\nProps for the `<GooeyToaster />` component.\n\n| Prop         | Type                                  | Default          | Description                                   |\n| ------------ | ------------------------------------- | ---------------- | --------------------------------------------- |\n| `position`   | `'top-left' \\| 'top-center' \\| 'top-right' \\| 'bottom-left' \\| 'bottom-center' \\| 'bottom-right'` | `'bottom-right'` | Toast position |\n| `duration`   | `number`                              | --               | Default display duration in ms                |\n| `gap`        | `number`                              | `14`             | Gap between stacked toasts (px)               |\n| `offset`     | `number \\| string`                    | `'24px'`         | Distance from screen edge                     |\n| `theme`      | `'light' \\| 'dark'`                   | `'light'`        | Color theme                                   |\n| `toastOptions` | `Partial<ExternalToast>`            | --               | Default options passed to Sonner              |\n| `spring`     | `boolean`                             | `true`           | Enable spring/bounce animations globally      |\n| `bounce`     | `number`                              | `0.4`            | Spring intensity: `0.05` (subtle) to `0.8` (dramatic) |\n| `preset`     | `AnimationPresetName`                 | --               | Animation preset for all toasts               |\n| `closeOnEscape` | `boolean`                          | `true`           | Dismiss most recent toast on Escape key       |\n| `showProgress` | `boolean`                           | `false`          | Show countdown progress bar on all toasts     |\n| `maxQueue`   | `number`                              | `Infinity`       | Maximum queued toasts                         |\n| `queueOverflow` | `'drop-oldest' \\| 'drop-newest'`   | `'drop-oldest'`  | Queue overflow strategy                       |\n| `dir`        | `'ltr' \\| 'rtl'`                     | `'ltr'`          | Layout direction                              |\n| `swipeToDismiss` | `boolean`                         | `true`           | Enable swipe-to-dismiss on mobile             |\n\n### `GooeyPromiseData<T>`\n\nConfiguration for `gooeyToast.promise()`.\n\n| Property      | Type                                          | Required | Description                                    |\n| ------------- | --------------------------------------------- | -------- | ---------------------------------------------- |\n| `loading`     | `string`                                      | Yes      | Title shown during loading                     |\n| `success`     | `string \\| ((data: T) => string)`             | Yes      | Title on success (static or derived from result)|\n| `error`       | `string \\| ((error: unknown) => string)`      | Yes      | Title on error (static or derived from error)  |\n| `description` | `object`                                      | No       | Per-phase descriptions (see below)             |\n| `action`      | `object`                                      | No       | Per-phase action buttons (see below)           |\n| `classNames`  | `GooeyToastClassNames`                         | No       | CSS class overrides                            |\n| `fillColor`   | `string`                                      | No       | Background color of the blob                   |\n| `borderColor` | `string`                                      | No       | Border color of the blob                       |\n| `borderWidth` | `number`                                      | No       | Border width in px                             |\n| `timing`      | `GooeyToastTimings`                            | No       | Animation timing overrides                     |\n| `spring`      | `boolean`                                     | No       | Enable spring/bounce animations (default `true`) |\n| `bounce`      | `number`                                      | No       | Spring intensity: `0.05` (subtle) to `0.8` (dramatic), default `0.4` |\n| `onDismiss`   | `(id: string \\| number) => void`              | No       | Called when toast is dismissed (any reason)       |\n| `onAutoClose` | `(id: string \\| number) => void`              | No       | Called only on timer-based auto-dismiss           |\n\n**`description` sub-fields:**\n\n| Key       | Type                                             |\n| --------- | ------------------------------------------------ |\n| `loading` | `ReactNode`                                      |\n| `success` | `ReactNode \\| ((data: T) => ReactNode)`          |\n| `error`   | `ReactNode \\| ((error: unknown) => ReactNode)`   |\n\n**`action` sub-fields:**\n\n| Key       | Type              |\n| --------- | ----------------- |\n| `success` | `GooeyToastAction` |\n| `error`   | `GooeyToastAction` |\n\n## Usage Examples\n\n### Description\n\n```tsx\ngooeyToast.error('Payment failed', {\n  description: 'Your card was declined. Please try again.',\n})\n```\n\n### Custom React Component as Description\n\n```tsx\ngooeyToast.success('Deployment complete', {\n  description: (\n    <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n      <div>\n        <span>Environment:</span> <strong>Production</strong>\n      </div>\n      <div>\n        <span>Branch:</span> <strong>main @ 3f8a2c1</strong>\n      </div>\n    </div>\n  ),\n})\n```\n\n### Action Button with Success Label\n\n```tsx\ngooeyToast.info('Share link ready', {\n  description: 'Your link has been generated.',\n  action: {\n    label: 'Copy to Clipboard',\n    onClick: () => navigator.clipboard.writeText(url),\n    successLabel: 'Copied!',\n  },\n})\n```\n\n### Promise Toast\n\n```tsx\ngooeyToast.promise(saveData(), {\n  loading: 'Saving...',\n  success: 'Changes saved',\n  error: 'Something went wrong',\n  description: {\n    success: 'All changes have been synced.',\n    error: 'Please try again later.',\n  },\n  action: {\n    error: {\n      label: 'Retry',\n      onClick: () => retry(),\n    },\n  },\n})\n```\n\n### Custom Styling\n\n```tsx\ngooeyToast.success('Styled!', {\n  fillColor: '#1a1a2e',\n  borderColor: '#333',\n  borderWidth: 2,\n  classNames: {\n    wrapper: 'my-wrapper',\n    title: 'my-title',\n    description: 'my-desc',\n    actionButton: 'my-btn',\n  },\n})\n```\n\n### Display Duration\n\n```tsx\ngooeyToast.success('Saved', {\n  description: 'Your changes have been synced.',\n  timing: { displayDuration: 5000 },\n})\n```\n\n### Disabling Spring Animations\n\nDisable bounce/spring animations for a cleaner, more subtle look:\n\n```tsx\n// Per-toast: disable spring for this toast only\ngooeyToast.success('Saved', {\n  description: 'Your changes have been synced.',\n  spring: false,\n})\n\n// Globally: disable spring for all toasts\n<GooeyToaster spring={false} />\n```\n\nWhen `spring` is `false`, all spring-based animations (landing squish, blob squish, morph transitions, pill resize, header squish) use smooth ease-in-out curves instead. Error shake animations still work regardless of this setting.\n\n### Bounce Intensity\n\nControl how dramatic the spring effect feels with a single `bounce` value:\n\n```tsx\n// Subtle, barely-there spring\ngooeyToast.success('Saved', { bounce: 0.1 })\n\n// Default feel\ngooeyToast.success('Saved', { bounce: 0.4 })\n\n// Jelly mode\ngooeyToast.success('Saved', { bounce: 0.8 })\n\n// Set globally via GooeyToaster\n<GooeyToaster bounce={0.6} />\n```\n\nThe `bounce` value (0.05 to 0.8) controls spring stiffness, damping, and squish magnitude together so you get a consistent feel from one number.\n\n### Dark Mode\n\n```tsx\n<GooeyToaster theme=\"dark\" />\n```\n\n### RTL Support\n\n```tsx\n<GooeyToaster dir=\"rtl\" />\n```\n\n### Animation Presets\n\nFour built-in presets: `smooth`, `bouncy`, `subtle`, `snappy`. Apply per-toast or globally:\n\n```tsx\ngooeyToast.success('Saved', { preset: 'bouncy' })\n\n// Or globally\n<GooeyToaster preset=\"smooth\" />\n```\n\n### Progress Bar\n\nShow a countdown progress bar on toasts:\n\n```tsx\ngooeyToast.success('Saved', { showProgress: true })\n\n// Or enable globally\n<GooeyToaster showProgress />\n```\n\n### Keyboard Shortcuts\n\nPress **Escape** to dismiss the most recent toast. Enabled by default; disable with `closeOnEscape={false}`.\n\n### Swipe to Dismiss\n\nOn mobile, swipe toasts to dismiss them. Enabled by default; disable with `swipeToDismiss={false}`.\n\n## Exports\n\n```ts\n// Components\nexport { GooeyToaster } from 'goey-toast'\n\n// Toast function\nexport { gooeyToast } from 'goey-toast'\n\n// Animation presets\nexport { animationPresets } from 'goey-toast'\n\n// Types\nexport type {\n  GooeyToastOptions,\n  GooeyPromiseData,\n  GooeyToasterProps,\n  GooeyToastAction,\n  GooeyToastClassNames,\n  GooeyToastTimings,\n  GooeyToastUpdateOptions,\n  DismissFilter,\n  AnimationPreset,\n  AnimationPresetName,\n} from 'goey-toast'\n```\n\n## Browser Support\n\ngoey-toast works in all modern browsers that support:\n\n- CSS Modules\n- SVG path animations\n- ResizeObserver\n- `framer-motion` (Chrome, Firefox, Safari, Edge)\n\n## See Also\n\n- **[gooey-search-tabs](https://github.com/anl331/gooey-search-tabs)** — A morphing search bar with animated tab navigation for React. [Live Demo](https://gooey-search-tabs.vercel.app)\n\n## License\n\n[MIT](./LICENSE)\n","readmeFilename":"README.md"}