
Research
Supply Chain Attack on Axios Pulls Malicious Dependency from npm
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.
@buratii/react-tooltip-guide
Advanced tools
A lightweight, stylable guided tooltip overlay for React.
A lightweight, stylable guided tooltip overlay for React. It highlights target elements with a mask and shows a tooltip with content and navigation (Back, Next, Finish).

npm install @buratii/react-tooltip-guide
Peer dependencies: react and react-dom (v17+).
import React from "react";
import {
TooltipGuideProvider,
TooltipOverlay,
useTooltipGuide,
type TooltipStep,
} from "@buratii/react-tooltip-guide";
function StartTourButton() {
const { start } = useTooltipGuide();
const steps: TooltipStep[] = [
{ selector: "#input-search", title: "Search", content: "Type to filter users" },
{ selector: "#button-add", title: "New user", content: "Click to create a new record" },
{ selector: "#users-table", title: "Table", content: "Results will appear here" },
];
return <button onClick={() => start(steps)}>Start tour</button>;
}
// Example component with IDs to be used by selectors
function UsersPage() {
return (
<div>
<input id="input-search" placeholder="Search users..." />
<button id="button-add">Add</button>
<table id="users-table">
<thead>
<tr><th>Name</th><th>Email</th></tr>
</thead>
<tbody>
<tr><td>Jane Doe</td><td>jane@example.com</td></tr>
</tbody>
</table>
</div>
);
}
export default function App() {
return (
<TooltipGuideProvider>
<UsersPage />
<StartTourButton />
{/* Overlay should be mounted once, usually near the app root */}
<TooltipOverlay />
</TooltipGuideProvider>
);
}
TooltipGuideProvider: Provides tour context. Props: onFinish?: () => void.useTooltipGuide(): Returns { isActive, stepIndex, steps, currentStep, start(steps), back(), next(), finish() }.TooltipOverlay props:
classNames?: override class names for individual parts (see below).styles?: override inline styles for individual parts (see below).gap?: space between target and tooltip. Default: 12.maskBorderRadius?: corner radius for the highlighted cutout. Default: 16.renderStep?(params): custom renderer for the tooltip content.export type Placement = "top" | "bottom" | "left" | "right" | "auto";
export interface TooltipStep {
// Preferred: CSS selector for the target element
selector?: string;
// Fallback: element id (used when selector is absent)
id?: string;
title?: string;
content?: string;
placement?: Placement; // currently auto top/bottom
}
export interface ClassNames {
mask?: string;
tooltip?: string;
arrow?: string;
title?: string;
content?: string;
footer?: string;
button?: string;
backButton?: string;
nextButton?: string;
finishButton?: string;
}
export interface Styles {
mask?: React.CSSProperties;
tooltip?: React.CSSProperties;
arrow?: React.CSSProperties;
title?: React.CSSProperties;
content?: React.CSSProperties;
footer?: React.CSSProperties;
button?: React.CSSProperties;
backButton?: React.CSSProperties;
nextButton?: React.CSSProperties;
finishButton?: React.CSSProperties;
}
export interface RenderStepParams {
step: TooltipStep;
index: number;
total: number;
controls: { back: () => void; next: () => void; finish: () => void };
}
bottom by default, flips to top if there isn’t enough space.<TooltipOverlay
renderStep={({ step, index, total, controls }) => (
<div>
{step.title && <h3 style={{ margin: 0 }}>{step.title}</h3>}
{step.content && <p style={{ marginTop: 6 }}>{step.content}</p>}
<div style={{ display: "flex", gap: 8, justifyContent: "flex-end" }}>
{index > 0 && <button onClick={controls.back}>Back</button>}
{index + 1 < total ? (
<button onClick={controls.next}>Next</button>
) : (
<button onClick={controls.finish}>Got it!</button>
)}
</div>
</div>
)}
/>
classNames to target mask, tooltip, arrow, title, content, footer, button, backButton, nextButton, finishButton.styles with the same keys to override inline styles.styles.mask.boxShadow to customize the dimmed backdrop. Clicking the mask finishes the tour.Tailwind example:
<TooltipOverlay
classNames={{
tooltip: "bg-gray-800 text-white rounded-lg shadow-xl",
title: "font-bold",
content: "text-sm mt-1",
button: "px-3 py-1 hover:opacity-90",
}}
styles={{ mask: { boxShadow: "0 0 0 9999px rgba(0,0,0,0.7)" } }}
/>
TooltipStep.selector is preferred over id and should point to a stable element.z-index to appear above most UIs.This package uses tsup to build CJS/ESM bundles and types.
npm install
npm run build
name in package.json is correct (e.g., @buratii/react-tooltip-guide).npm login.npm publish --access public.MIT
FAQs
A lightweight, stylable guided tooltip overlay for React.
We found that @buratii/react-tooltip-guide demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.

Security News
TeamPCP is partnering with ransomware group Vect to turn open source supply chain attacks on tools like Trivy and LiteLLM into large-scale ransomware operations.