Skip to main content

ReactComponent

Spicetify provides a set of stock React components used by Spotify. You can use these components to create your own custom UI.

note

It is recommended that you be familiar with React and spicetify-creator before using these components.

namespace ReactComponent {
const ContextMenu: any;
const RightClickMenu: any;
const Menu: any;
const MenuItem: any;
const AlbumMenu: any;
const PodcastShowMenu: any;
const ArtistMenu: any;
const PlaylistMenu: any;
const TooltipWrapper: any;
const IconComponent: any;
const TextComponent: any;
const ConfirmDialog: any;
const PanelSkeleton: any;
const PanelContent: any;
const PanelHeader: any;
const Toggle: any;
const Slider: any
};

Components​

info

These components may be wrappers for other components such as Tippy or styled-components. They may accept additional props that are not listed here.

As such, type definitions are not forced for these components but they act as a guideline for what you can use and what Spotify uses.

Refer to the underlying library's documentation for more information.

ContextMenu​

Generic context menu provider. It is used by Spotify on a variety of elements, such as right-click menu, dropdown menu, etc.

Props​

See ContextMenuProps.

Example​

// See Menu section for more details
const menuWrapper = React.memo((props: MenuProps) =>
<Spicetify.ReactComponent.Menu {...props}>
<Spicetify.ReactComponent.MenuItem
label="Hello World"
onClick={() => Spicetify.showNotification('Hello World')}
/>
</Spicetify.ReactComponent.Menu>
});

const contextMenu = React.memo((props: ContextMenuProps) => {
return (
<Spicetify.ReactComponent.ContextMenu {...props}
trigger="click"
menu={<menuWrapper {...props} />}
>
<div>Click me</div>
</Spicetify.ReactComponent.ContextMenu>
);
});

RightClickMenu​

Wrapper of ContextMenu with predefined props: action = 'toggle' and trigger = 'right-click'.

Props​

See ContextMenuProps.

Example​

const menuWrapper = React.memo((props: MenuProps) =>
<Spicetify.ReactComponent.Menu {...props}>
<Spicetify.ReactComponent.MenuItem
label="Hello World"
onClick={() => Spicetify.showNotification('Hello World')}
/>
</Spicetify.ReactComponent.Menu>
});
// Same as ContextMenu example, but appears on right-click
const contextMenu = React.memo((props: ContextMenuProps) => {
return (
<Spicetify.ReactComponent.RightClickMenu {...props}
menu={<menuWrapper {...props} />}
>
<div>Right-click me</div>
</Spicetify.ReactComponent.RightClickMenu>
);
});

Outer layer containing MenuItems.

Props​

See MenuProps.

Example​

const menuWrapper = React.memo((props: MenuProps) =>
<Spicetify.ReactComponent.Menu {...props} onClose={() => Spicetify.showNotification('Menu closed')}>
<Spicetify.ReactComponent.MenuItem
label="Hello World"
onClick={() => Spicetify.showNotification('Hello World')}
/>
</Spicetify.ReactComponent.Menu>
});

Component to construct menu item. Used as Menu children.

Props​

See MenuItemProps.

Example​

const icon = React.memo((props: IconComponentProps) =>
<Spicetify.ReactComponent.IconComponent {...props}
semanticColor="textBase"
dangerouslySetInnerHTML={{ __html: Spicetify.SVGIcons["play"] }}
iconSize={16}
/>
);

const menuItem = React.memo((props: MenuItemProps) =>
<Spicetify.ReactComponent.MenuItem {...props}
onClick={() => Spicetify.showNotification('Hello World')}
disabled={false}
divider="after"
{/* It is recommended that you use both `icon` and `trailingIcon` for compatibility between older versions */}
icon={<icon />}
trailingIcon={<icon />}
>
Hello World
</Spicetify.ReactComponent.MenuItem>
);

AlbumMenu, PodcastShowMenu, ArtistMenu, PlaylistMenu​

Tailored Menu for specific type of object.

Props​

Accepts uri and onRemoveCallback props along with MenuProps.

interface AlbumMenuProps extends MenuProps {
uri: string;
onRemoveCallback?: (uri: string) => void;
};

Example​

const currentAlbumURI = Spicetify.Player.data.item.metadata.album_uri;

const albumMenu = React.memo((props: AlbumMenuProps) =>
<Spicetify.ReactComponent.AlbumMenu {...props}
onClose={() => Spicetify.showNotification('Menu closed')}
uri={currentAlbumURI}
/>
);

TooltipWrapper​

Component to display tooltip when hovering over element. Useful for accessibility.

info

This component is a wrapper for Tippy. It may accept additional props that are not listed here.

Props​

See TooltipProps.

Example​

const elementHasTooltip = React.memo((props: TooltipProps) =>
<Spicetify.ReactComponent.TooltipWrapper {...props}
label="Hello World"
placement="bottom"
>
<div>Hover me</div>
</Spicetify.ReactComponent.TooltipWrapper>
);

IconComponent​

Component to render Spotify-style icon. It is used by Spotify on a variety of elements, such as buttons, icons, etc.

info

This component is a wrapper for styled-components. It may accept additional props that are not listed here.

Props​

See IconComponentProps.

Example​

const icon = React.memo((props: IconComponentProps) =>
<Spicetify.ReactComponent.IconComponent {...props}
semanticColor="textBase"
dangerouslySetInnerHTML={{ __html: Spicetify.SVGIcons["play"] }}
iconSize={16}
/>
);

TextComponent​

Component to render text. It is used by Spotify on a variety of elements, such as buttons, text, etc.

info

This component is a wrapper for styled-components. It may accept additional props that are not listed here.

Props​

See TextComponentProps.

Example​

const text = React.memo((props: TextComponentProps) =>
<Spicetify.ReactComponent.TextComponent {...props}
semanticColor="textBase"
variant="viola"
weight="book"
>
Hello World
</Spicetify.ReactComponent.TextComponent>
);

ConfirmDialog​

Component to display Spotify-style confirmation dialog. Used by Spotify on playlist, track removal, etc.

info

For each of the onConfirm, onCancel, and onOutsideClick props, the dialog will not close automatically. You must manually handle the state of the dialog.

Props​

See ConfirmDialogProps.

Example​

const ConfirmButton = () => {
// Modal open state must be handled manually
const [showModal, setShowModal] = React.useState(false);

return (
<Spicetify.ReactComponent.ConfirmDialog
isOpen={showModal}
onConfirm={() => {
setShowModal(false);
Spicetify.showNotification('Confirmed');
}}
onCancel={() => {
setShowModal(false);
Spicetify.showNotification('Cancelled');
}}
onOutsideClick={() => {
setShowModal(false);
Spicetify.showNotification('Clicked outside');
}}
titleText="Confirm Modal"
descriptionText="Are you sure you want to confirm?"
confirmText="Confirm"
cancelText="Cancel"
/>
<button onClick={() => setShowModal(true)}>Click me</button>
);
}

Toggle​

Component to display Spotify-style toggle. Used by Spotify on the settings page.

Props​

See ToggleProps.

const Toggle = () => {
const [enabled, setEnabled] = React.useState(false);

return (
<Spicetify.ReactComponent.Toggle
value={enabled}
onSelected={setEnabled}
id="my-toggle-id"
class="my-toggle-class"
></Spicetify.ReactComponent.Toggle>
);
}

Slider​

Component to render sliders. It is used by Spotify for the volume/playing bars and on the settings page.

Props​

See SliderProps.

Example​

const Slider = () => {
const [value, setValue] = useState(0);

return (
<Spicetify.ReactComponent.Slider
max={100}
step={1}
value={value}
onDragStart={() => {}}
onDragMove={setValue}
onDragEnd={(value) => {console.log(`final value is ${value}`)}}
></Spicetify.ReactComponent.Slider>
);
}

PanelSkeleton, PanelContent, PanelHeader​

Components to render Spotify-style panel. Used by Spotify on their right sidebar panels (e.g. BuddyFeed, Now Playing, etc).

Refer to Panel.Components for more details.