UNPKG

@infinite-canvas-tutorial/webcomponents

Version:
219 lines (215 loc) 11.2 kB
"use strict"; 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; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _InfiniteCanvas_appStateProvider, _InfiniteCanvas_nodesProvider, _InfiniteCanvas_apiProvider; Object.defineProperty(exports, "__esModule", { value: true }); exports.InfiniteCanvas = void 0; const lit_1 = require("lit"); const task_1 = require("@lit/task"); const context_1 = require("@lit/context"); const decorators_js_1 = require("lit/decorators.js"); const context_2 = require("../context"); const event_1 = require("../event"); const utils_1 = require("../utils"); const API_1 = require("../API"); require("@spectrum-web-components/theme/sp-theme.js"); require("@spectrum-web-components/theme/src/themes.js"); // import '@spectrum-web-components/accordion/sp-accordion.js'; // import '@spectrum-web-components/accordion/sp-accordion-item.js'; require("@spectrum-web-components/action-group/sp-action-group.js"); require("@spectrum-web-components/action-menu/sp-action-menu.js"); require("@spectrum-web-components/alert-banner/sp-alert-banner.js"); require("@spectrum-web-components/menu/sp-menu-item.js"); require("@spectrum-web-components/menu/sp-menu-divider.js"); require("@spectrum-web-components/progress-circle/sp-progress-circle.js"); require("@spectrum-web-components/textfield/sp-textfield.js"); require("@spectrum-web-components/thumbnail/sp-thumbnail.js"); require("@spectrum-web-components/tooltip/sp-tooltip.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-text.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-visibility.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-visibility-off.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-properties.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-close.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-chevron-down.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-layers.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-properties.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-show-menu.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-hand.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-select.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-shapes.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-undo.js"); require("@spectrum-web-components/icons-workflow/icons/sp-icon-redo.js"); const TOP_NAVBAR_HEIGHT = 48; let InfiniteCanvas = class InfiniteCanvas extends lit_1.LitElement { constructor() { super(...arguments); this.renderer = 'webgl'; this.shaderCompilerPath = 'https://unpkg.com/@antv/g-device-api@1.6.8/dist/pkg/glsl_wgsl_compiler_bg.wasm'; this.appState = (0, context_2.getDefaultAppState)(); this.nodes = []; _InfiniteCanvas_appStateProvider.set(this, new context_1.ContextProvider(this, { context: context_2.appStateContext })); _InfiniteCanvas_nodesProvider.set(this, new context_1.ContextProvider(this, { context: context_2.nodesContext })); _InfiniteCanvas_apiProvider.set(this, new context_1.ContextProvider(this, { context: context_2.apiContext })); this.initCanvas = new task_1.Task(this, { task: (_a) => __awaiter(this, [_a], void 0, function* ([renderer, shaderCompilerPath]) { if (renderer === 'webgpu') { yield (0, utils_1.checkWebGPUSupport)(); } __classPrivateFieldGet(this, _InfiniteCanvas_appStateProvider, "f").setValue(this.appState); /** * Update context values */ this.addEventListener(event_1.Event.READY, (e) => { e.detail.getAppState = () => __classPrivateFieldGet(this, _InfiniteCanvas_appStateProvider, "f").value; e.detail.setAppState = (appState) => __classPrivateFieldGet(this, _InfiniteCanvas_appStateProvider, "f").setValue(appState); e.detail.getNodes = () => __classPrivateFieldGet(this, _InfiniteCanvas_nodesProvider, "f").value; e.detail.setNodes = (nodes) => __classPrivateFieldGet(this, _InfiniteCanvas_nodesProvider, "f").setValue(nodes); __classPrivateFieldGet(this, _InfiniteCanvas_apiProvider, "f").setValue(e.detail); }); this.addEventListener(event_1.Event.ZOOM_CHANGED, (e) => { __classPrivateFieldGet(this, _InfiniteCanvas_appStateProvider, "f").setValue(Object.assign(Object.assign({}, __classPrivateFieldGet(this, _InfiniteCanvas_appStateProvider, "f").value), { cameraZoom: e.detail.zoom })); }); const $canvas = document.createElement('canvas'); $canvas.style.width = '100%'; $canvas.style.height = 'calc(100% - 48px)'; const { width, height } = this.getBoundingClientRect(); const { cameraZoom } = this.appState; API_1.pendingCanvases.push({ container: this, canvas: { element: $canvas, width, height: height - TOP_NAVBAR_HEIGHT, devicePixelRatio: window.devicePixelRatio, renderer, shaderCompilerPath, }, camera: { zoom: cameraZoom, }, }); return $canvas; }), args: () => [this.renderer, this.shaderCompilerPath], }); } connectedCallback() { super.connectedCallback(); this.resizeObserver = new ResizeObserver((entries) => this.handleResize(entries)); this.updateComplete.then(() => this.resizeObserver.observe(this)); } disconnectedCallback() { var _a, _b; super.disconnectedCallback(); (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.unobserve(this); (_b = __classPrivateFieldGet(this, _InfiniteCanvas_apiProvider, "f").value) === null || _b === void 0 ? void 0 : _b.destroy(); } handleResize(entries) { var _a, _b; const { width, height } = entries[0].contentRect; const dpr = window.devicePixelRatio; if (width && height) { const $canvas = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('canvas'); $canvas.width = width * dpr; $canvas.height = (height - TOP_NAVBAR_HEIGHT) * dpr; (_b = __classPrivateFieldGet(this, _InfiniteCanvas_apiProvider, "f").value) === null || _b === void 0 ? void 0 : _b.resizeCanvas(width, height - TOP_NAVBAR_HEIGHT); } } render() { const themeWrapper = (content) => (0, lit_1.html) `<sp-theme system="spectrum" color="${this.appState.theme.mode}" scale="medium" >${typeof content === 'string' ? (0, lit_1.html) `${content}` : content}</sp-theme >`; return this.initCanvas.render({ pending: () => themeWrapper((0, lit_1.html) `<sp-progress-circle label="A small representation of an unclear amount of work" indeterminate size="s" ></sp-progress-circle>`), complete: ($canvas) => themeWrapper((0, lit_1.html) `<ic-spectrum-top-navbar></ic-spectrum-top-navbar> <ic-spectrum-penbar></ic-spectrum-penbar> <ic-spectrum-taskbar></ic-spectrum-taskbar> <ic-spectrum-layers-panel></ic-spectrum-layers-panel> ${$canvas}`), error: (e) => { console.error(e); return themeWrapper((0, lit_1.html) `<sp-alert-banner open variant="negative"> Initialize canvas failed<br /> <strong></strong><br /> ${e.message} </sp-alert-banner>`); }, }); } }; exports.InfiniteCanvas = InfiniteCanvas; _InfiniteCanvas_appStateProvider = new WeakMap(); _InfiniteCanvas_nodesProvider = new WeakMap(); _InfiniteCanvas_apiProvider = new WeakMap(); InfiniteCanvas.styles = (0, lit_1.css) ` :host { display: block; position: relative; } ic-spectrum-penbar { position: absolute; top: 48px; left: 0; } ic-spectrum-taskbar { position: absolute; top: 48px; right: 0; } ic-spectrum-layers-panel { position: absolute; top: 48px; right: 54px; } canvas { width: 100%; height: 100%; outline: none; padding: 0; margin: 0; touch-action: none; } `; __decorate([ (0, decorators_js_1.property)() ], InfiniteCanvas.prototype, "renderer", void 0); __decorate([ (0, decorators_js_1.property)({ attribute: 'shader-compiler-path', }) ], InfiniteCanvas.prototype, "shaderCompilerPath", void 0); __decorate([ (0, decorators_js_1.property)({ type: Object, attribute: 'app-state' }) ], InfiniteCanvas.prototype, "appState", void 0); __decorate([ (0, decorators_js_1.property)({ type: Array }) ], InfiniteCanvas.prototype, "nodes", void 0); exports.InfiniteCanvas = InfiniteCanvas = __decorate([ (0, decorators_js_1.customElement)('ic-spectrum-canvas') ], InfiniteCanvas); //# sourceMappingURL=infinite-canvas.js.map