{"id":26117111,"url":"https://github.com/timmikeladze/react-install-command","last_synced_at":"2026-06-05T05:31:45.344Z","repository":{"id":277129937,"uuid":"931156610","full_name":"TimMikeladze/react-install-command","owner":"TimMikeladze","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-12T10:04:00.000Z","size":430,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-12T10:12:50.757Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://react-install-command.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TimMikeladze.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-11T20:05:07.000Z","updated_at":"2025-02-12T10:04:03.000Z","dependencies_parsed_at":"2025-02-12T10:13:18.534Z","dependency_job_id":"bc67dbb0-e3e4-456f-b916-284a2c7ca19b","html_url":"https://github.com/TimMikeladze/react-install-command","commit_stats":null,"previous_names":["timmikeladze/react-install-command"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimMikeladze%2Freact-install-command","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimMikeladze%2Freact-install-command/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimMikeladze%2Freact-install-command/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimMikeladze%2Freact-install-command/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TimMikeladze","download_url":"https://codeload.github.com/TimMikeladze/react-install-command/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242838586,"owners_count":20193527,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-10T10:58:39.298Z","updated_at":"2025-12-16T04:28:46.361Z","avatar_url":"https://github.com/TimMikeladze.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📡 React Install Command\n\nA React component for rendering a 'npm install package-name' code block. Supports multiple package managers and variations of install commands. Totally customizable. Drop it into an MDX file, a Shadcn component, a Tailwind codebase, use built-in styles or even go unstyled. You choose.\n\nVisit the [Storybook](https://react-install-command.vercel.app/) for examples and documentation.\n\n![React Install Command Light](./docs/readme-light.png)\n\n![React Install Command Dark](./docs/readme-dark.png)\n\n## Features\n\n- 🚀 Support for major package managers (npm, Yarn, pnpm, Bun, Deno, uv, pip).\n- 🌓 Dark, light and system theme support out of the box.\n- 🔄 Interactive tab switching between package managers.\n- 📋 One-click copy to clipboard.\n- 🎯 Support for various installation options (dev, peer, optional, global).\n- 🔧 Highly customizable UI through slots and class names.\n- 📦 Support for multiple package registries (npm, JSR).\n- 🛠️ Extensible with custom package managers and commands.\n\n## Installation\n\n```bash\nnpm install react-install-command\n```\n\n\u003e 👋 Hello there! Follow me [@linesofcode](https://twitter.com/linesofcode) or visit [linesofcode.dev](https://linesofcode.dev) for more cool projects like this one.\n\n## Usage\n\n### Basic Usage\n\n```tsx\nimport 'react-install-command/styles.css';\n\nimport { InstallCommand } from 'react-install-command';\n\n\n// Basic usage\n\u003cInstallCommand packageName=\"your-package\" /\u003e\n\n// Dev dependency\n\u003cInstallCommand packageName=\"typescript\" isDev /\u003e\n\n// Peer dependency\n\u003cInstallCommand packageName=\"react\" isPeer /\u003e\n\n// Optional dependency\n\u003cInstallCommand packageName=\"lodash\" isOptional /\u003e\n\n// Global installation\n\u003cInstallCommand packageName=\"create-react-app\" isGlobal /\u003e\n\n// Specific version\n\u003cInstallCommand packageName=\"react\" version=\"^18.0.0\" /\u003e\n\n// Using tag\n\u003cInstallCommand packageName=\"next\" tag=\"canary\" /\u003e\n\n// Multiple packages\n\u003cInstallCommand packageName=\"react react-dom @types/react\" /\u003e\n\n// Using shorthand commands (e.g., 'npm i' instead of 'npm install')\n\u003cInstallCommand packageName=\"lodash\" useShorthand /\u003e\n```\n\n### Registry Support\n\n```tsx\n// Using JSR registry (automatically selects Deno)\n\u003cInstallCommand \n  packageName=\"@std/path\" \n  registry=\"jsr\" \n/\u003e\n\n// Installing npm package with Deno\n\u003cInstallCommand \n  packageName=\"react\" \n  registry=\"npm\"\n  managers={[javascriptManagers[4]]} // Only Deno manager\n/\u003e\n\n// Mixed registry packages\n\u003cInstallCommand \n  packageName=\"jsr:@std/path jsr:@std/assert npm:chalk\" \n/\u003e\n```\n\n### Python Package Managers\n\n```tsx\n// Using Python managers (uv, pip)\n\u003cInstallCommand \n  packageName=\"requests\" \n  managers={pythonManagers}\n/\u003e\n\n// Python dev dependency\n\u003cInstallCommand \n  packageName=\"pytest\" \n  managers={pythonManagers}\n  isDev \n/\u003e\n\n// Python package with version\n\u003cInstallCommand \n  packageName=\"django\" \n  managers={pythonManagers}\n  version=\"4.2.0\" \n/\u003e\n\n// Python package with tag\n\u003cInstallCommand \n  packageName=\"fastapi\" \n  managers={pythonManagers}\n  tag=\"latest\" \n/\u003e\n\n// Python global installation\n\u003cInstallCommand \n  packageName=\"black\" \n  managers={pythonManagers}\n  isGlobal \n/\u003e\n```\n\n### Theming\n\n```tsx\n// Dark theme\n\u003cInstallCommand packageName=\"your-package\" theme=\"dark\" /\u003e\n\n// Light theme\n\u003cInstallCommand packageName=\"your-package\" theme=\"light\" /\u003e\n\n// System theme (default)\n\u003cInstallCommand packageName=\"your-package\" theme=\"system\" /\u003e\n\n// Custom styling with CSS variables\n\u003cdiv style={{\n  '--primary': 'purple',\n  '--accent': 'lavender',\n  '--radius': '0'\n}}\u003e\n  \u003cInstallCommand packageName=\"your-package\" /\u003e\n\u003c/div\u003e\n```\n\n### Custom Package Managers\n\n```tsx\n\u003cInstallCommand\n  packageName=\"your-package\"\n  managers={[\n    {\n      id: \"npm\",\n      name: \"npm\",\n      icon: () =\u003e (\n        \u003cIcon\n          icon=\"logos:npm-icon\"\n          width={24}\n          height={24}\n          aria-label=\"npm package manager\"\n        /\u003e\n      ),\n      getCommand: (pkg, options) =\u003e {\n        const { isDev, useShorthand } = options;\n        return `npm ${isDev ? (useShorthand ? \"i -D\" : \"install -D\") : useShorthand ? \"i\" : \"install\"} ${pkg}`;\n      }\n    }\n  ]}\n/\u003e\n\n// Reordering default managers\n\u003cInstallCommand\n  packageName=\"react\"\n  managers={[\n    javascriptManagers[2], // pnpm first\n    javascriptManagers[0], // npm second\n    javascriptManagers[1], // yarn third\n  ]}\n/\u003e\n\n// Using Python managers\n\u003cInstallCommand\n  packageName=\"requests\"\n  managers={pythonManagers}\n/\u003e\n\n// Mixed JavaScript and Python managers\n\u003cInstallCommand\n  packageName=\"react\"\n  managers={[\n    ...javascriptManagers.slice(0, 2), // npm, yarn\n    ...pythonManagers // uv, pip\n  ]}\n/\u003e\n```\n\n### Custom Commands\n\n```tsx\n\u003cInstallCommand\n  customCommands={{\n    npm: \"npm create vite@latest my-app\",\n    yarn: \"yarn create vite my-app\",\n    pnpm: \"pnpm create vite my-app\"\n  }}\n/\u003e\n```\n\n### Customization\n\n```tsx\n// Custom class names\n\u003cInstallCommand\n  packageName=\"your-package\"\n  slotClassNames={{\n    root: \"custom-root\",\n    navigation: \"custom-nav\",\n    tab: \"custom-tab\",\n    tabIndicator: \"install-block-tab-indicator-centered\", // Centered indicator\n    commandContainer: \"custom-container\",\n    commandPrefix: \"custom-prefix\",\n    commandText: \"custom-text\",\n    copyButton: \"custom-copy\",\n    tabIcon: \"custom-tab-icon\",\n    tabText: \"custom-tab-text\",\n    commandGroup: \"custom-group\",\n    commandTextCommand: \"custom-command\",\n    copyButtonIcon: \"custom-copy-icon\"\n  }}\n/\u003e\n\n// Full customization with CSS classes\n\u003cInstallCommand\n  packageName=\"your-package\"\n  slotClassNames={{\n    root: \"border-2 border-purple-500 rounded-lg\",\n    navigation: \"bg-gray-100 p-2\",\n    tab: \"bg-transparent hover:bg-purple-50 text-black data-[state=active]:bg-purple-500 data-[state=active]:text-white px-2 py-1 mx-1 rounded\",\n    tabIndicator: \"install-block-tab-indicator-gradient\", // Gradient indicator\n    commandContainer: \"p-4 bg-gray-50\",\n    commandPrefix: \"text-purple-500\",\n    commandText: \"text-purple-500 font-mono\",\n    copyButton: \"bg-purple-500 text-white px-2 py-1 rounded border-0\"\n  }}\n/\u003e\n```\n\n### Built-in Indicator Variants\n\nThe component comes with several built-in indicator variants that you can use:\n\n1. Default indicator (full width):\n```tsx\n\u003cInstallCommand packageName=\"your-package\" /\u003e\n```\n\n2. Centered indicator:\n```tsx\n\u003cInstallCommand\n  packageName=\"your-package\"\n  slotClassNames={{\n    tabIndicator: \"install-block-tab-indicator-centered\"\n  }}\n/\u003e\n```\n\n3. Gradient indicator:\n```tsx\n\u003cInstallCommand\n  packageName=\"your-package\"\n  slotClassNames={{\n    tabIndicator: \"install-block-tab-indicator-gradient\"\n  }}\n/\u003e\n```\n\nYou can also create your own indicator styles by extending these classes or creating new ones in your CSS:\n\n```css\n.my-custom-indicator {\n  left: 15%;\n  width: 70%;\n  height: 3px;\n  border-radius: 1.5px;\n  background: linear-gradient(90deg, var(--primary), var(--accent));\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n```\n\nThen use it in your component:\n```tsx\n\u003cInstallCommand\n  packageName=\"your-package\"\n  slotClassNames={{\n    tabIndicator: \"my-custom-indicator\"\n  }}\n/\u003e\n```\n\n### Storage Persistence\n\n```tsx\n// Persist in localStorage (survives browser restarts)\n\u003cInstallCommand \n  packageName=\"your-package\" \n  storageType=\"local\" \n/\u003e\n\n// Persist in sessionStorage (cleared when browser closes)\n\u003cInstallCommand \n  packageName=\"your-package\" \n  storageType=\"session\" \n/\u003e\n\n// Custom storage key\n\u003cInstallCommand \n  packageName=\"your-package\" \n  storageType=\"local\"\n  storageKey=\"my-custom-storage-key\" \n/\u003e\n```\n\n### Event Handlers\n\n```tsx\n\u003cInstallCommand\n  packageName=\"your-package\"\n  onCopy={(command, manager) =\u003e {\n    console.log(`Copied command: ${command} for manager: ${manager.name}`);\n    alert(\"Command copied to clipboard!\");\n  }}\n  onTabChange={(managerId, manager) =\u003e {\n    console.log(`Switched to ${manager.name} (${managerId})`);\n  }}\n/\u003e\n```\n\n### Combined Features\n\n```tsx\n\u003cInstallCommand\n  packageName=\"your-package\"\n  isDev={true}\n  version=\"^1.0.0\"\n  useShorthand={true}\n  theme=\"dark\"\n  commandPrefix=\"→\"\n  copyIcon={() =\u003e (\n    \u003cIcon\n      icon=\"lucide:clipboard-copy\"\n      width={24}\n      height={24}\n      aria-label=\"Copy to clipboard\"\n    /\u003e\n  )}\n  slotClassNames={{\n    root: \"custom-root\",\n    commandText: \"custom-text\"\n  }}\n  onCopy={(command) =\u003e console.log(`Copied: ${command}`)}\n  storageType=\"local\"\n/\u003e\n```\n\n## Props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| packageName | string | \"\" | The name of the package(s) to generate install commands for |\n| isDev | boolean | false | Whether to install as a dev dependency |\n| isPeer | boolean | false | Whether to install as a peer dependency |\n| isOptional | boolean | false | Whether to install as an optional dependency |\n| isGlobal | boolean | false | Whether to install globally |\n| useShorthand | boolean | false | Whether to use shorthand commands (e.g. 'npm i' vs 'npm install') |\n| version | string | undefined | Version range for the package |\n| tag | string | undefined | Tag for the package |\n| registry | \"npm\" \\| \"jsr\" | undefined | Package registry to use (for Deno packages) |\n| theme | \"light\" \\| \"dark\" \\| \"system\" | \"system\" | The color theme to use |\n| managers | Manager[] | javascriptManagers | Array of package managers to display |\n| customCommands | Record\u003cstring, string\u003e | undefined | Custom commands to override the defaults |\n| slots | Slots | {} | Custom slot components for rendering |\n| slotClassNames | SlotClassNames | {} | Custom classNames for each slot |\n| commandPrefix | string | \"$\" | Custom prefix symbol to show before the command |\n| copyIcon | () =\u003e JSX.Element | defaultCopyIcon | Custom copy icon component |\n| onCopy | (command: string, manager: Manager) =\u003e void | undefined | Callback fired when command is copied |\n| onTabChange | (managerId: string, manager: Manager) =\u003e void | undefined | Callback fired when selected manager changes |\n| storageType | \"local\" \\| \"session\" \\| \"none\" | \"none\" | Storage type for persisting package manager selection |\n| storageKey | string | \"preferred-package-manager\" | Storage key for persisting package manager selection |\n\n## Types\n\n### Manager\n\n```typescript\ninterface Manager {\n  id: string;\n  name: string;\n  icon: () =\u003e JSX.Element;\n  getCommand: (\n    packageName: string,\n    options: {\n      isDev?: boolean;\n      isPeer?: boolean;\n      isOptional?: boolean;\n      isGlobal?: boolean;\n      useShorthand?: boolean;\n      version?: string;\n      tag?: string;\n      registry?: \"npm\" | \"jsr\";\n    }\n  ) =\u003e string;\n}\n```\n\n### Available Package Managers\n\nThe component provides pre-configured manager arrays:\n\n- `javascriptManagers`: npm, Yarn, pnpm, Bun, Deno\n- `pythonManagers`: uv, pip\n\nYou can import these arrays:\n\n```tsx\nimport { javascriptManagers, pythonManagers } from 'react-install-command';\n\n// Use JavaScript managers (default)\n\u003cInstallCommand packageName=\"react\" managers={javascriptManagers} /\u003e\n\n// Use Python managers\n\u003cInstallCommand packageName=\"requests\" managers={pythonManagers} /\u003e\n\n// Mix managers\n\u003cInstallCommand \n  packageName=\"react\" \n  managers={[...javascriptManagers.slice(0, 2), ...pythonManagers]} \n/\u003e\n```\n\n### Slots\n\n```typescript\ninterface Slots {\n  root?: (props: SlotProps) =\u003e ReactNode;\n  navigation?: (props: SlotProps) =\u003e ReactNode;\n  tab?: (props: TabSlotProps) =\u003e ReactNode;\n  commandContainer?: (props: SlotProps) =\u003e ReactNode;\n  commandPrefix?: (props: SlotProps) =\u003e ReactNode;\n  commandText?: (props: SlotProps) =\u003e ReactNode;\n  copyButton?: (props: CopyButtonSlotProps) =\u003e ReactNode;\n}\n```\n\n## CSS Variables\n\nThe component uses CSS variables for theming. You can override these variables to customize the appearance:\n\n```css\n:root {\n  /* Base colors */\n  --background: hsl(0 0% 100%);        /* Background color of the component */\n  --foreground: hsl(222.2 84% 4.9%);   /* Primary text color */\n\n  /* Muted variants */\n  --muted: hsl(210 40% 94%);           /* Background for command area */\n  --muted-foreground: hsl(215.4 16.3% 36.9%); /* Secondary text color */\n\n  /* Border colors */\n  --border: hsl(214.3 31.8% 85%);      /* Border color for containers */\n\n  /* Primary colors */\n  --primary: hsl(222.2 47.4% 11.2%);   /* Color for active elements */\n  --primary-foreground: hsl(210 40% 98%); /* Text on primary color */\n\n  /* Accent colors */\n  --accent: hsl(210 40% 90%);          /* Background for hover states */\n  --accent-foreground: hsl(222.2 47.4% 11.2%); /* Text on accent color */\n\n  /* Border radius */\n  --radius: 0.5rem;                    /* Border radius for containers */\n}\n```\n\n### Usage Examples\n\n1. Override all variables:\n```css\n:root {\n  --background: white;\n  --foreground: black;\n  --muted: #f5f5f5;\n  --border: #e5e5e5;\n  --primary: blue;\n  --accent: #eef;\n  --radius: 8px;\n}\n```\n\n2. Override specific variables:\n```css\n.my-theme {\n  --primary: purple;\n  --accent: lavender;\n}\n```\n\n3. Dark theme override:\n```css\n[data-theme=\"dark\"] {\n  --background: hsl(222.2 84% 4.9%);\n  --foreground: hsl(210 40% 98%);\n  --muted: hsl(217.2 32.6% 17.5%);\n  --border: hsl(217.2 32.6% 17.5%);\n}\n```\n\n4. Scoped customization:\n```css\n.custom-install-command {\n  --radius: 0;                /* Remove border radius */\n  --border: transparent;      /* Remove borders */\n  --muted: transparent;       /* Remove background */\n}\n```\n\n### Available Variables\n\n| Variable | Purpose | Default (Light) | Default (Dark) |\n|----------|---------|----------------|----------------|\n| --background | Component background | `hsl(0 0% 100%)` | `hsl(222.2 84% 4.9%)` |\n| --foreground | Primary text color | `hsl(222.2 84% 4.9%)` | `hsl(210 40% 98%)` |\n| --muted | Command area background | `hsl(210 40% 94%)` | `hsl(217.2 32.6% 17.5%)` |\n| --muted-foreground | Secondary text | `hsl(215.4 16.3% 36.9%)` | `hsl(215 20.2% 65.1%)` |\n| --border | Border color | `hsl(214.3 31.8% 85%)` | `hsl(217.2 32.6% 17.5%)` |\n| --primary | Active/accent elements | `hsl(222.2 47.4% 11.2%)` | `hsl(210 40% 98%)` |\n| --primary-foreground | Text on primary | `hsl(210 40% 98%)` | `hsl(222.2 47.4% 11.2%)` |\n| --accent | Hover state background | `hsl(210 40% 90%)` | `hsl(217.2 32.6% 17.5%)` |\n| --accent-foreground | Text on accent | `hsl(222.2 47.4% 11.2%)` | `hsl(210 40% 98%)` |\n| --radius | Border radius | `0.5rem` | `0.5rem` |\n\n### CSS Classes\n\nThe component uses the following CSS classes that you can target for customization:\n\n- `.install-block` - Root container\n- `.install-block-nav` - Navigation/tabs container\n- `.install-block-tab` - Individual tab buttons\n- `.install-block-content` - Command container\n- `.install-block-group` - Command text group\n- `.install-block-prefix` - Command prefix ($)\n- `.install-block-text` - Command text\n- `.install-block-text-command` - Command keyword\n- `.install-block-copy` - Copy button\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimmikeladze%2Freact-install-command","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimmikeladze%2Freact-install-command","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimmikeladze%2Freact-install-command/lists"}