@infinite-canvas-tutorial/webcomponents
Version:
WebComponents UI implementation
144 lines (141 loc) • 4.85 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { html, css, LitElement } from 'lit';
import { customElement } from 'lit/decorators.js';
import { consume } from '@lit/context';
import { VectorScreenshotRequest, RasterScreenshotRequest, } from '@infinite-canvas-tutorial/ecs';
import { apiContext, appStateContext } from '../context';
import { Event } from '../event';
let TopNavbar = class TopNavbar extends LitElement {
connectedCallback() {
super.connectedCallback();
// TODO: bind keyboard shortcuts
}
handleExport(event) {
const format = event.target.value;
let detail;
if (format === 'png' || format === 'jpeg') {
detail = new RasterScreenshotRequest();
detail.type =
`image/${format}`;
}
else {
detail = new VectorScreenshotRequest();
}
this.dispatchEvent(new CustomEvent(Event.SCREENSHOT_REQUESTED, {
detail,
bubbles: true,
composed: true,
}));
}
handleEdit(event) {
const value = event.target.value;
if (value === 'undo') {
this.handleUndo();
}
else if (value === 'redo') {
this.handleRedo();
}
}
handleUndo() {
this.api.undo();
}
handleRedo() {
this.api.redo();
}
render() {
return html `
<sp-action-menu size="m" label="Main menu" quiet>
<sp-tooltip slot="tooltip" self-managed placement="bottom">
Main menu
</sp-tooltip>
<sp-icon-show-menu slot="icon" size="l"></sp-icon-show-menu>
<sp-menu-item>
Edit
<sp-menu slot="submenu" =${this.handleEdit}>
<sp-menu-item value="undo">
Undo
<kbd slot="value">⌘Z</kbd>
</sp-menu-item>
<sp-menu-item value="redo">
Redo
<kbd slot="value">⇧⌘Z</kbd>
</sp-menu-item>
<sp-menu-divider></sp-menu-divider>
<sp-menu-item value="cut">
Cut
<kbd slot="value">⌘X</kbd>
</sp-menu-item>
<sp-menu-item value="copy">
Copy
<kbd slot="value">⌘C</kbd>
</sp-menu-item>
<sp-menu-item value="paste">
Paste
<kbd slot="value">⌘V</kbd>
</sp-menu-item>
</sp-menu>
</sp-menu-item>
<sp-menu-item>
Export as...
<sp-menu slot="submenu" =${this.handleExport}>
<sp-menu-item value="svg">SVG</sp-menu-item>
<sp-menu-item value="png">PNG</sp-menu-item>
<sp-menu-item value="jpeg">JPEG</sp-menu-item>
</sp-menu>
</sp-menu-item>
</sp-action-menu>
<div class="actions">
<sp-action-button quiet =${this.handleUndo}>
<sp-icon-undo slot="icon"></sp-icon-undo>
<sp-tooltip self-managed placement="bottom"> Undo </sp-tooltip>
</sp-action-button>
<sp-action-button quiet =${this.handleRedo}>
<sp-icon-redo slot="icon"></sp-icon-redo>
<sp-tooltip self-managed placement="bottom"> Redo </sp-tooltip>
</sp-action-button>
<ic-spectrum-zoom-toolbar />
</div>
`;
}
};
TopNavbar.styles = css `
:host {
display: flex;
justify-content: space-between;
padding: var(--spectrum-global-dimension-size-100);
background: var(--spectrum-gray-100);
}
sp-menu-item {
width: 200px;
}
kbd {
font-family: var(--spectrum-alias-body-text-font-family);
letter-spacing: 0.1em;
white-space: nowrap;
border: none;
padding: none;
padding: 0;
line-height: normal;
}
.actions {
display: flex;
align-items: center;
gap: var(--spectrum-global-dimension-size-100);
}
`;
__decorate([
consume({ context: appStateContext, subscribe: true })
], TopNavbar.prototype, "appState", void 0);
__decorate([
consume({ context: apiContext, subscribe: true })
], TopNavbar.prototype, "api", void 0);
TopNavbar = __decorate([
customElement('ic-spectrum-top-navbar')
], TopNavbar);
export { TopNavbar };
//# sourceMappingURL=top-navbar.js.map