Component navigator for JSX/TSX/JS/TS projects. See parent/child relationships and jump instantly between React components.
Press Ctrl+Shift+. on any .tsx/.jsx/.ts/.js file to open a QuickPick listing who imports it (Parents) and what it imports (Children). Hit Enter to jump.
A rose icon docks beside Explorer/Search. Open it to see the same Parents/Children of the active file — auto-syncs as you switch tabs (300 ms debounce). No command required.
Toggle to Project Tree mode with the 📂 button in the view title. The whole project's component hierarchy renders, lazily expanded:
- Multi-project safe — every
tsconfig.json/jsconfig.jsonboundary is its own tree, sub-projects don't leak into each other - Cycle markers (
↻) when a branch loops back to an ancestor (no infinite expansion) - Orphan fallback for UI-library projects with no
App/mainentry — top-level components still appear - Bare CRA/Vite projects (no config) are detected via workspace folders
Imports through index.ts/js barrels resolve to the leaf component instead of stopping at the barrel:
// ui/index.ts
export { Button } from "./Button";
export { Card } from "./Card";
export * from "./Badge";
// MyPage.tsx
import { Button, Card, Badge } from "./ui";Roseline shows Button → ui/Button.tsx, Card → ui/Card.tsx, Badge → ui/Badge.tsx — not ui/index.ts. Named, wildcard, as rename, and chained barrels all supported.
Per-file children + re-exports are cached with mtime invalidation. Choose RAM-only (cleared on restart) or persist to disk at a custom path (defaults to E:\roseline-cache to keep your C: drive clean). Auto-deletes after N days. Roseline: Clear Cache resets manually.
A FileSystemWatcher invalidates cache and refreshes the visible tree on save / create / delete — no manual refresh needed. tsconfig.json / jsconfig.json changes invalidate project boundaries automatically.
react-icons, framer-motion, MUI, Tailwind, etc. — anything that resolves into node_modules is silently skipped. The graph stays clean and focused on your own components.
- Explorer / editor → "Roseline: Show Component Graph" on any
.jsx/.tsx/.ts/.jsfile - Tree node → Reveal in Explorer · Copy Path · Find All References
- Title bar → mode toggle · refresh · Expand All · (built-in) Collapse All
- Install the extension (
.vsixfrom Releases, or Marketplace once published) - Open any React project in VS Code
- Open a
.jsx/.tsxfile and pressCtrl+Shift+. - Or click the 🌹 rose in the Activity Bar to dock the tree view
| Command | Default keybinding | Where |
|---|---|---|
Roseline: Show Component Graph |
Ctrl+Shift+. |
editor · Explorer right-click · editor right-click |
Roseline: Switch to Project Tree |
— | view title bar |
Roseline: Switch to Active File |
— | view title bar |
Roseline: Refresh Project Tree |
— | view title bar (project mode) |
Roseline: Expand All |
— | view title bar |
Roseline: Reveal in Explorer |
— | tree node right-click |
Roseline: Copy Path |
— | tree node right-click |
Roseline: Find All References |
— | tree node right-click |
Roseline: Clear Cache |
— | Command Palette |
Roseline: Show Output Log |
— | Command Palette |
| Setting | Default | Description |
|---|---|---|
roseline.searchScope |
"project" |
"project" = nearest tsconfig/jsconfig boundary · "workspace" = entire workspace |
roseline.cacheMode |
"memory" |
"memory" = RAM-only · "custom" = persist to cachePath |
roseline.cachePath |
E:\roseline-cache |
Folder for roseline-cache.json when cacheMode = custom |
roseline.cacheMaxAgeDays |
7 |
Auto-delete cache after N days · 0 = never |
- Boundary detection. Roseline walks up from each file to the nearest
tsconfig.json/jsconfig.jsonand uses that directory as the project boundary. In a monorepo each leaf config is an independent project; a parent config still owns the JSX outside its descendants. - Component detection. Imports of capitalized identifiers (
import { Button }) are treated as components. Lowercase utility imports and external packages are excluded by design. - Path alias resolution.
compilerOptions.pathsfrom the nearest config is honoured, so@ui/Button→src/ui/Button.tsxworks the same as a relative import. - Barrel tracing. When an import resolves to a re-exporting file, Roseline parses the
export { X } from …andexport * from …declarations, follows them recursively (with cycle protection), and verifies wildcard sources via their own exports. - Parents (incoming edges). A workspace-wide scan filters by filename text (fast pre-filter) before parsing matched files with the TypeScript compiler API.
- Static imports only.
React.lazy(() => import('./Foo'))and other dynamic imports are not traced. - Component heuristic. Components are identified by capitalized import names (
<Button />style). Renderless utility hooks (useFoo) and lowercase utilities are intentionally excluded. searchScope: "workspace"scans every JS/TS file in the workspace — fast on small projects, slower on large monorepos. Default"project"is recommended.- Default exports through wildcard barrels.
export * from './X're-exports named exports only; named-only is the standard idiom in component libraries.
- Marketplace listing
- Status-bar quick-toggle
- Optional inclusion of lowercase utility imports (opt-in)
- "Find usages of this component" QuickPick (alternative to right-click → Find References)
MIT
