# Adding a widget to ipyreact This section aims at helping developers to create new widgets within ipyreact. Here you will find how to create both the frontend and backend sides of a notebook extension. ## Creating the frontend part Notebook extensions source code lives in in `nbextensions_srcs/`. If you check it out, you will see that all the configuration files and necessary scripts. This source code is then transpiled to production code which is stored in `nbextensions_dists/`. ### Directory structure You will need to create a some mandatory files in order to create your widget ```bash cd nbextensions_srcs/nbextensions mkdir hello cd hello touch index.js hello.js ``` ### Minimal code example Type the following lines in `index.js`: ```javascript import React from 'react' import {CommWrapper} from '../../utils/commwrapper/commWrapper' import HelloWidget from './hello' export const load_ipython_extension = () => { CommWrapper("hello", HelloWidget) } ``` This is your entry point, a piece of code that will make your React component available to Jupyter. Let's look at the React component which will live in `hello.js`: ```javascript import React from 'react' import Widget from '../../utils/widget/widget' class HelloWidget extends Widget { render() { return

Hello, World!

} } export default HelloWidget ``` This is the minimum amount of code necessary to create a widget. You may then customize this component as you would do with any other React component. ### Building your extension In `nbextensions_srcs`, edit `webpack.config.js` and add your widget as a new entry: ```javascript var path = require('path') module.exports = { entry: { breadcrumbs: './nbextensions/breadcrumbs/index.js', dialog: './nbextensions/dialog/index.js', // ... hello: './nbextensions/hello/index.js', }, // ... } ``` Then run `yarn build` for a production build or `yarn dev` for a development build. ## Creating the backend part Now that you have a minimal frontend that compiles to JavaScript, you want to invoke it in your notebook. To do so, you need Python code that will trigger rendering of the frontend part. ### Directory structure Enter the `ipyreact` Python package directory, then create a Python module named `hello.py`. ```bash cd ipyreact touch hello.py ``` ### develop Copy paste the following into `hello.py`: ```python from ipyreact import Widget class HelloWidget(Widget): def __init__(self): super().__init__("hello") ``` This is the minimum amount of code necessary to create the Python side of a widget. The argument passed to init should be the same as the first argument you passed to `CommWrapper` in your JavaScript code. To make it easier to import your widget, edit `ipyreact/__init__.py` and append the following line: ```python from .hello import HelloWidget ``` To install it, from ipyreact root folder, run: ```bash pip install . ``` ## Testing it in a notebook Create a notebook, import your widget from ipyreact and instantiate it in a cell: ```python from ipyreact import HelloWidget your_widget_instance = HelloWidget() your_widget_instance ``` In this section you have seen the minimal amount of code to add a widget to ipyreact.