A powerful context menu API to take your Chrome extension to the next level.
This library is in alpha until further notice. Things may not work. The API may change between minor versions.
Table of Contents
Getting started
You will need to use a bundler like Rollup, Parcel, or Webpack to include this library in the build of Chrome extension.
See rollup-plugin-chrome-extension
for an easy way use Rollup to build your Chrome extension!
Installation
$ npm i @extend-chrome/menus
Usage
import { menus } from '@extend-chrome/menus'
const id = 'my-menu'
menus.create({ id, title: 'My Menu' })
menus.clickStream.subscribe(([clickData, tab]) => {
console.log('They clicked', clickData.id)
console.log('In tab', tab.id)
menus.update({ id, title: 'Another Title' })
})
Features
A dynamic context menu is only available on HTML elements that match the CSS selector defined in its options.
import { menus } from '@extend-chrome/menus'
menus.create({
id: 'my-dynamic-menu',
title: 'I only show on H1 tags',
selector: 'h1',
})
This feature uses chrome.tabs.executeScript
under the hood, so it only works on pages found in the manifest permissions
field.
// manifest.json
{
...
permissions: ['https://www.youtube.com/*']
...
}
RxJs Observables
Chrome extensions and RxJs are a match made in heaven. Take advantage of ready-made Observables of menu item clicks, creations, updates, and removals.
import { menus } from '@extend-chrome/menus'
menus.clickStream.subscribe(([clickData, tab]) => {
console.log('Menu Item Id', clickData.id)
console.log('Tab Id', tab.id)
})
The function useMenu
creates a menu item and returns a tuple array of an updater function and an Observable of clicks for that menu item.
import { useMenu } from '@extend-chrome/menus'
const menuOptions = {
id: 'menu1',
title: 'Menu Item One',
type: 'checkbox',
checked: false,
}
const [
updateMenu,
menuClickStream,
] = useMenu(menuOptions)
menuClickStream.subscribe(([clickData, tab]) => {
updateMenu({ checked: !clickData.checked })
})
Full TypeScript Support
@extend-chrome/menus
is written in TypeScript and includes type definitions. Functions and Observables are fully typed, so Intellisense works well.
import { useMenu, ContextMenuOptions } from '@extend-chrome/menus'
const menuOptions: ContextMenuOptions = {
id: 'menu1',
title: 'Menu Item One',
}
const [updateMenu, menuClickStream]: [
(options: Partial<ContextMenuOptions>) => void
Observable<[ContextMenuClickData, chrome.tabs.Tab]>
] = useMenu(menuOptions)
Options API
Full documentation coming soon!
There's great TypeScript support however, so Intellisense is your friend in the meantime.