import { html, GemElement, customElement, connectStore } from '@mantou/gem'; import { getThemeStore } from '@mantou/gem/helper/theme'; import { PanEventDetail } from '@mantou/gem/elements/gesture'; import '@mantou/gem/elements/gesture'; import { moveSide, updateWindowRect } from '../lib/store'; import { Window } from '../lib/layout'; import { store } from '../lib/store'; import { theme } from '../lib/theme'; const sides = ['top', 'right', 'bottom', 'left'] as const; export type Side = typeof sides[number]; export type MoveSideArgs = { movementX: number; movementY: number; width: number; height: number; gap: number }; const corners = ['top-left', 'top-right', 'bottom-right', 'bottom-left'] as const; export type Corner = typeof corners[number]; @customElement('gem-panel-handle') @connectStore(store) export class GemPanelHandleElement extends GemElement { window: Window; #onSidePan = ({ detail }: CustomEvent, side: Side) => { if (this.window.isGridWindow()) { const { width, height } = (this.getRootNode() as ShadowRoot).host.getBoundingClientRect(); const gapStr = getThemeStore(theme).windowGap; let gap = 0; if (gapStr.trim().endsWith('px')) { gap = parseFloat(gapStr); } else { console.info('Cause the moving axis to shake!'); } moveSide(this.window, side, { width, height, gap, movementX: detail.x, movementY: detail.y }); } else { const movement = { x: 0, y: 0, w: 0, h: 0, }; if (side === 'top') { movement.h = -detail.y; movement.y = detail.y; } if (side === 'right') { movement.w = detail.x; } if (side === 'bottom') { movement.h = detail.y; } if (side === 'left') { movement.x = detail.x; movement.w = -detail.x; } updateWindowRect(this.window, [movement.x, movement.y, movement.w, movement.h]); } }; #onCornerPan = ({ detail: { x, y } }: CustomEvent, corner: Corner) => { const movement = { x: 0, y: 0, w: 0, h: 0, }; if (corner === 'top-left') { movement.w = -x; movement.h = -y; movement.x = x; movement.y = y; } if (corner === 'top-right') { movement.w = x; movement.h = -y; movement.y = y; } if (corner === 'bottom-right') { movement.w = x; movement.h = y; } if (corner === 'bottom-left') { movement.x = x; movement.w = -x; movement.h = y; } updateWindowRect(this.window, [movement.x, movement.y, movement.w, movement.h]); }; render = () => { const isGrid = this.window.isGridWindow(); return html` ${sides.map( (side) => html` ) => this.#onSidePan(evt, side)} > `, )} ${isGrid ? '' : corners.map( (corner) => html` ) => this.#onCornerPan(evt, corner)} > `, )} `; }; }