# @videojs/icons SVG icon library for Video.js. Ships optimized icons as **React components** and **HTML strings**, organized into icon sets. ## Icon Sets Icons are grouped into visual sets. Each set contains the same icon names with different designs. | Set | Description | | --- | --- | | `default` | Standard icon set used by the default skin | | `minimal` | Simplified icon set used by the minimal skin | ### Available Icons | Icon | React Export | HTML Export | | --- | --- | --- | | `fullscreen-enter` | `FullscreenEnterIcon` | `fullscreenEnterIcon` | | `fullscreen-exit` | `FullscreenExitIcon` | `fullscreenExitIcon` | | `pause` | `PauseIcon` | `pauseIcon` | | `pip-enter` | `PipEnterIcon` | `pipEnterIcon` | | `pip-exit` | `PipExitIcon` | `pipExitIcon` | | `play` | `PlayIcon` | `playIcon` | | `restart` | `RestartIcon` | `restartIcon` | | `seek` | `SeekIcon` | `seekIcon` | | `spinner` | `SpinnerIcon` | `spinnerIcon` | | `volume-high` | `VolumeHighIcon` | `volumeHighIcon` | | `volume-low` | `VolumeLowIcon` | `volumeLowIcon` | | `volume-off` | `VolumeOffIcon` | `volumeOffIcon` | ## Usage ### React Import icons as React components. They accept standard SVG props and support ref forwarding. ```tsx import { PlayIcon, PauseIcon } from '@videojs/react/icons'; function Controls() { return ( ); } ``` Import from a specific icon set: ```tsx import { PlayIcon } from '@videojs/react/icons/minimal'; ``` ### HTML Import icons as SVG strings for use in plain HTML or web components. ```ts import { playIcon, pauseIcon } from '@videojs/html/icons'; button.innerHTML = playIcon; ``` Import from a specific icon set: ```ts import { playIcon } from '@videojs/html/icons/minimal'; ``` Register the `` custom element separately when you want HTML skins to render icons lazily: ```ts import '@videojs/html/icons/element'; ``` Import a specific element icon set when eager family registration is preferred: ```ts import '@videojs/html/icons/element/minimal'; ``` ## Styling All icons use `fill="currentColor"`, so they inherit the text color of their parent element. Size and color can be controlled with CSS: ```css .icon { width: 18px; height: 18px; color: white; } ``` Icons are designed on an **18×18 grid**. Rendering at `18px` (or exact multiples like `36px`) produces the crispest result. Other sizes may introduce sub-pixel rendering artifacts. ## Adding Icons 1. Add an SVG file to `src/assets//` (e.g., `src/assets/default/my-icon.svg`). 2. Run `pnpm -F @videojs/icons build`. 3. The build script optimizes the SVG with SVGO and generates React components and HTML string exports. The build automatically: - Removes hardcoded `fill`, `stroke`, `clip-rule`, and `fill-rule` attributes. - Adds `fill="currentColor"` for dynamic styling. - Preserves the `viewBox` attribute. - Generates `.js`, `.d.ts`, and `.tsx` files for each icon. ## Adding an Icon Set Create a new directory under `src/assets/` (e.g., `src/assets/custom/`), add SVG files, and rebuild. The set is automatically available via: ```ts import { PlayIcon } from '@videojs/react/icons/custom'; import { playIcon } from '@videojs/html/icons/custom'; ``` ## Development Running `pnpm -F @videojs/icons dev` starts the build in watch mode. Any changes to `.svg` files under `src/assets/` trigger an automatic rebuild, including new icons and new icon sets — no restart required. ## Scripts ```bash pnpm -F @videojs/icons build # Build all icon sets pnpm -F @videojs/icons dev # Build and watch for changes pnpm -F @videojs/icons clean # Remove build output ```