# @umbraco-cms/backoffice This package contains the types for the Umbraco Backoffice. ## Installation ```bash npm install -D @umbraco-cms/backoffice ``` ## Usage ### Vanilla JavaScript Create an umbraco-package.json file in the root of your package. ```json { "name": "My.Package", "version": "0.1.0", "extensions": [ { "type": "dashboard", "alias": "my.custom.dashboard", "name": "My Dashboard", "js": "/App_Plugins/MyPackage/dashboard.js", "weight": -1, "meta": { "label": "My Dashboard", "pathname": "my-dashboard" }, "conditions": [ { "alias": "Umb.Condition.SectionAlias", "match": "Umb.Section.Content" } ] } ] } ``` Then create a dashboard.js file the same folder. ```javascript import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; const template = document.createElement('template'); template.innerHTML = `

Welcome to my dashboard

Example of vanilla JS code

`; export default class MyDashboardElement extends UmbElementMixin(HTMLElement) { /** @type {import('@umbraco-cms/backoffice/notification').UmbNotificationContext} */ #notificationContext; constructor() { super(); this.attachShadow({ mode: 'open' }); this.shadowRoot.appendChild(template.content.cloneNode(true)); this.shadowRoot.getElementById('clickMe').addEventListener('click', this.onClick.bind(this)); this.consumeContext(UMB_NOTIFICATION_CONTEXT, (_instance) => { this.#notificationContext = _instance; }); } onClick = () => { this.#notificationContext?.peek('positive', { data: { headline: 'Hello' } }); }; } customElements.define('my-custom-dashboard', MyDashboardElement); ``` ### TypeScript with Lit First install Lit and Vite. This command will create a new folder called `my-package` which will have the Vite tooling and Lit for WebComponent development setup. ```bash npm create vite@latest -- --template lit-ts my-package ``` Go to the new folder and install the backoffice package. ```bash cd my-package npm install -D @umbraco-cms/backoffice ``` Then go to the element located in `src/my-element.ts` and replace it with the following code. ```typescript // src/my-element.ts import { LitElement, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; @customElement('my-element') export default class MyElement extends UmbElementMixin(LitElement) { private _notificationContext?: UmbNotificationContext; constructor() { super(); this.consumeContext(UMB_NOTIFICATION_CONTEXT, (_instance) => { this._notificationContext = _instance; }); } onClick() { this._notificationContext?.peek('positive', { data: { message: '#h5yr' } }); } render() { return html`

A TypeScript Lit Dashboard

this.onClick()}>
`; } } declare global { interface HTMLElementTagNameMap { 'my-element': MyElement; } } ``` Finally add an umbraco-package.json file in the root of your package folder `my-package`. ```json { "name": "My.Package", "version": "0.1.0", "extensions": [ { "type": "dashboard", "alias": "my.custom.dashboard", "name": "My Dashboard", "js": "/App_Plugins/MyPackage/dist/my-package.js", "weight": -1, "meta": { "label": "My Dashboard", "pathname": "my-dashboard" }, "conditions": [ { "alias": "Umb.Condition.SectionAlias", "match": "Umb.Section.Content" } ] } ] } ```