From 329d7ac243a8c9896c313cb26115312e31d4a3f3 Mon Sep 17 00:00:00 2001 From: chenshenhai Date: Sun, 11 Aug 2024 17:13:02 +0800 Subject: [PATCH 1/2] feat: enhance clipboard action --- .../src/modules/element-tree/index.tsx | 3 +- packages/studio/src/modules/context-menu.tsx | 2 +- .../studio/src/modules/dashboard/index.tsx | 12 +- packages/studio/src/modules/hot-key.ts | 13 +- .../studio/src/modules/panel-layer/index.tsx | 4 +- .../modules/panel-page/add-page-button.tsx | 4 +- .../studio/src/modules/panel-page/index.tsx | 15 +- packages/studio/src/shared/event.ts | 221 ++++++++++++------ packages/studio/src/studio.tsx | 2 + packages/studio/src/types/lib/studio.ts | 1 - packages/studio/src/util/clipboard.ts | 47 ++++ 11 files changed, 242 insertions(+), 82 deletions(-) create mode 100644 packages/studio/src/util/clipboard.ts diff --git a/packages/studio-base/src/modules/element-tree/index.tsx b/packages/studio-base/src/modules/element-tree/index.tsx index d248bdb..5ba861d 100644 --- a/packages/studio-base/src/modules/element-tree/index.tsx +++ b/packages/studio-base/src/modules/element-tree/index.tsx @@ -77,8 +77,7 @@ export const ElementTree = React.forwardRef((props: ElementTreeProps, ref: any) onDelete, onExpand, onGoToGroup, - // reverse // TODO - reverse = true + reverse } = props; const onSelectNode: TreeProps['onSelect'] = (skeys, info) => { diff --git a/packages/studio/src/modules/context-menu.tsx b/packages/studio/src/modules/context-menu.tsx index 694a7dd..b5402cc 100644 --- a/packages/studio/src/modules/context-menu.tsx +++ b/packages/studio/src/modules/context-menu.tsx @@ -87,7 +87,7 @@ export const useContextMenuOptions: HookUseContextMenuOptions = (opts: { sharedE const updateContextMenuOptions: UpdateContextMenuOptions = (opts) => { const { selectedElements } = opts; innerItems?.forEach((item) => { - if (item && ['copy', 'paste', 'cut', 'delete'].includes(item?.key as string)) { + if (item && ['copy', 'cut', 'delete'].includes(item?.key as string)) { (item as any).disabled = selectedElements?.length > 0 ? false : true; } }); diff --git a/packages/studio/src/modules/dashboard/index.tsx b/packages/studio/src/modules/dashboard/index.tsx index db6ec68..01c753b 100644 --- a/packages/studio/src/modules/dashboard/index.tsx +++ b/packages/studio/src/modules/dashboard/index.tsx @@ -10,6 +10,7 @@ import { Sketch } from '../sketch'; // import SplitPane from '../split-pane'; import type { SharedEvent, SharedStore, HookUseContextMenuOptions, GetTemplates } from '../../types'; import { Context } from '../context'; +import { generatePasteEventCallback } from '../../shared/event'; const modName = 'mod-dashboard'; const leftSiderDefaultWidth = 240; @@ -24,6 +25,7 @@ export interface DashboardProps { logo?: React.ReactNode; navigationMenu?: React.ReactNode; navigationCenter?: React.ReactNode; + reverseTree?: boolean; defaultSelectedElementUUIDs?: string[]; sharedStore: SharedStore; sharedEvent: SharedEvent; @@ -55,7 +57,8 @@ export const Dashboard = forwardRef((props: Dash useContextMenuOptions, handleKeyboard, getPageTemplates, - getMaterialTemplates + getMaterialTemplates, + reverseTree } = props; const { state } = useContext(Context); const { editMode } = state; @@ -69,9 +72,14 @@ export const Dashboard = forwardRef((props: Dash } handleKeyboard(e, { sharedEvent, sharedStore }); }; + + const pasteCallback = generatePasteEventCallback({ sharedStore, sharedEvent }); + window.addEventListener('keydown', hotKeyCallback); + window.addEventListener('paste', pasteCallback); return () => { window.removeEventListener('keydown', hotKeyCallback); + window.removeEventListener('paste', pasteCallback); }; }, []); @@ -182,6 +190,7 @@ export const Dashboard = forwardRef((props: Dash ((props: Dash { const { sharedEvent } = opts; + // if (isHotkey('mod+v', e)) { + // sharedEvent.trigger('paste'); + // } else if (isHotkey('mod+c', e)) { - sharedEvent.trigger('copy', undefined); - } else if (isHotkey('mod+v', e)) { - sharedEvent.trigger('paste', undefined); + sharedEvent.trigger('copy'); } else if (isHotkey('mod+x', e)) { - sharedEvent.trigger('cut', undefined); + sharedEvent.trigger('cut'); } else if (isHotkey('del', e)) { - sharedEvent.trigger('delete', undefined); + sharedEvent.trigger('delete'); } else if (isHotkey('backspace', e)) { - sharedEvent.trigger('delete', undefined); + sharedEvent.trigger('delete'); } else if (isHotkey('mod+s', e)) { console.log('Save ... '); // TODO } diff --git a/packages/studio/src/modules/panel-layer/index.tsx b/packages/studio/src/modules/panel-layer/index.tsx index 1cd73c8..7cc9fc5 100644 --- a/packages/studio/src/modules/panel-layer/index.tsx +++ b/packages/studio/src/modules/panel-layer/index.tsx @@ -15,13 +15,14 @@ export interface PanelLayerProps { height: number; style?: CSSProperties; // defaultSelectedElementUUIDs?: string[]; + reverseTree: boolean; sharedStore: SharedStore; sharedEvent: SharedEvent; useContextMenuOptions: HookUseContextMenuOptions; } export const PanelLayer = (props: PanelLayerProps) => { - const { className, style, height, sharedStore, sharedEvent, useContextMenuOptions } = props; + const { className, style, height, sharedStore, sharedEvent, reverseTree, useContextMenuOptions } = props; const { state, dispatch } = useContext(Context); const { elementTree, selectedUUIDs, editingData } = state; @@ -128,6 +129,7 @@ export const PanelLayer = (props: PanelLayerProps) => { { diff --git a/packages/studio/src/modules/panel-page/add-page-button.tsx b/packages/studio/src/modules/panel-page/add-page-button.tsx index 81e7086..a11ffed 100644 --- a/packages/studio/src/modules/panel-page/add-page-button.tsx +++ b/packages/studio/src/modules/panel-page/add-page-button.tsx @@ -20,10 +20,11 @@ export interface AddPageButtonProps { sharedStore: SharedStore; inPageOverview: boolean; getPageTemplates?: GetTemplates; + disabled: boolean; } export const AddPageButton = (props: AddPageButtonProps) => { - const { className, style, parentModName, inPageOverview, sharedEvent, sharedStore, getPageTemplates } = props; + const { className, style, parentModName, inPageOverview, sharedEvent, sharedStore, getPageTemplates, disabled } = props; const rootClassName = generateClassName(parentModName, modName); const [moduleLocale] = useLocale('PanelPage'); const { getContainer } = useContext(ConfigContext); @@ -38,6 +39,7 @@ export const AddPageButton = (props: AddPageButtonProps) => { type="text" style={style} className={classnames(rootClassName, className)} + disabled={disabled} onClick={(e) => { e.preventDefault(); e.stopPropagation(); diff --git a/packages/studio/src/modules/panel-page/index.tsx b/packages/studio/src/modules/panel-page/index.tsx index 1beac34..210ea2e 100644 --- a/packages/studio/src/modules/panel-page/index.tsx +++ b/packages/studio/src/modules/panel-page/index.tsx @@ -22,6 +22,7 @@ export interface PanelPageProps { sharedEvent: SharedEvent; useContextMenuOptions: HookUseContextMenuOptions; getPageTemplates?: GetTemplates; + reverseTree: boolean; } const pageTreeKey = 'page-tree'; @@ -31,7 +32,7 @@ const pageTreeHeightRatio = 1; const elementTreeHeightRatio = 3; export const PanelPage = (props: PanelPageProps) => { - const { className, style, height, defaultSelectedElementUUIDs = [], sharedStore, sharedEvent, useContextMenuOptions, getPageTemplates } = props; + const { className, style, height, defaultSelectedElementUUIDs = [], sharedStore, sharedEvent, useContextMenuOptions, getPageTemplates, reverseTree } = props; const { state, dispatch } = useContext(Context); const { pageTree, elementTree, selectedUUIDs, editingData, editingDataPosition, data } = state; @@ -73,7 +74,7 @@ export const PanelPage = (props: PanelPageProps) => { useEffect(() => { const idraw = sharedStore.getStatic('idraw'); const listenSelectedPage = (e: { uuids?: string[] }) => { - if (refInPageOverview.current === true) { + if (inPageOverview === true) { const { uuids = [] } = e; setSelectedPageUUIDs([...uuids]); } @@ -83,7 +84,7 @@ export const PanelPage = (props: PanelPageProps) => { return () => { idraw?.off(eventKeys.SELECT, listenSelectedPage); }; - }, []); + }, [inPageOverview]); useEffect(() => { if (editingDataPosition.length === 1 && pageTree.length > 0) { @@ -127,7 +128,10 @@ export const PanelPage = (props: PanelPageProps) => { const pageKeys: string[] = []; if (pageTree.length > 0) { pageKeys.push(pageTree[0].uuid); - sharedEvent.trigger('resetEditingView', { type: 'go-to-page', position: [0] }); + sharedEvent.trigger('resetEditingView', { + type: 'go-to-page', + position: reverseTree === true ? [pageTree.length > 0 ? pageTree.length - 1 : 0] : [0] + }); } setSelectedPageUUIDs(pageKeys); idraw?.enable('selectInGroup'); @@ -238,6 +242,7 @@ export const PanelPage = (props: PanelPageProps) => {
{ { @@ -355,6 +361,7 @@ export const PanelPage = (props: PanelPageProps) => { { const idraw = sharedStore.getStatic('idraw'); const selectedUUIDs = sharedStore.get('selectedUUIDs'); - const data = idraw?.getData(); + let data = idraw?.getData(); + let text: string | null = null; if (data && Array.isArray(selectedUUIDs) && selectedUUIDs.length > 0) { const elements = findElementsFromList(selectedUUIDs, data.elements); if (elements.length > 0) { - sharedStore.set('clipboard', { - type: 'copy-elements', - data: elements - }); + text = JSON.stringify(elements); } } + if (text) { + const input = createInput(); + input.value = text; + input.focus(); + input.select(); + document.execCommand('copy'); + input.remove(); + } + + return; + // const idraw = sharedStore.getStatic('idraw'); + // const selectedUUIDs = sharedStore.get('selectedUUIDs'); + // const data = idraw?.getData(); + // if (data && Array.isArray(selectedUUIDs) && selectedUUIDs.length > 0) { + // const elements = findElementsFromList(selectedUUIDs, data.elements); + // if (elements.length > 0) { + // sharedStore.set('clipboard', { + // type: 'copy-elements', + // data: elements + // }); + // } + // } }); sharedEvent.on('paste', () => { - const idraw = sharedStore.getStatic('idraw'); - const clipboardCache = sharedStore.get('clipboard'); - const selectedUUIDs = sharedStore.get('selectedUUIDs'); - - if (idraw && ['copy-elements', 'cut-elements'].includes(clipboardCache?.type) && Array.isArray(clipboardCache.data)) { - const elements: Element[] = clipboardCache.data; - const targetElements: Element[] = []; - if (clipboardCache.type === 'copy-elements') { - for (let i = 0; i < elements.length; i++) { - if (elements[i]) { - const elem = elements[i]; - const target = deepCloneElement(elem); - target.name = `${target.name} copy`; - targetElements.push(target); - } - } - } else if (clipboardCache.type === 'cut-elements') { - for (let i = 0; i < elements.length; i++) { - if (elements[i]) { - const elem = elements[i]; - const target = deepCloneElement(elem); - target.name = `${target.name}`; - targetElements.push(target); - } - } - } - const data = idraw?.getData() as Data; - const position = getElementPositionFromList(selectedUUIDs[0], data?.elements || []); - if (position.length > 0) { - position[position.length - 1]++; - } - targetElements.forEach((elem) => { - idraw.addElement(elem, { position }); - }); - const editingData = idraw?.getData() as Data; - const elementTree = getElementTree(editingData); - - sharedEvent.trigger('dispatch', { - type: 'update', - payload: { - editingData, - elementTree - } - }); - idraw.selectElement(targetElements[0].uuid); - setTimeout(() => { - sharedEvent.trigger('scrollToLayer', { - uuid: targetElements[0].uuid - }); - }, 100); - - // console.log('paste: elements ====== ', elements); - } + return; + const input = createInput(); + input.addEventListener('paste', () => { + // pasteFromClipboardReadList( + // [ + // { + // type: 'text', + // text: input.value + // } + // ], + // opts + // ); + // input.remove(); + }); + // input.addEventListener('change', () => { + // console.log('change.value ------- ', input.value); + // }); + setTimeout(() => { + input.focus(); + const result = document.execCommand('paste', false); + console.log('exec-cmd-result : ', result); + }, 1000); }); sharedEvent.on('cut', () => { @@ -84,12 +84,13 @@ export function initActionEvent(opts: { sharedEvent: SharedEvent; sharedStore: S if (data && Array.isArray(selectedUUIDs) && selectedUUIDs.length > 0) { const elements = findElementsFromList(selectedUUIDs, data.elements); - if (elements.length > 0) { - sharedStore.set('clipboard', { - type: 'cut-elements', - data: elements.map((elem) => deepCloneElement(elem)) - }); - } + const text = JSON.stringify(elements); + const input = createInput(); + input.value = text; + input.focus(); + input.select(); + document.execCommand('copy'); + input.remove(); elements.forEach((elem) => { idraw?.deleteElement(elem.uuid); @@ -162,3 +163,93 @@ export function initActionEvent(opts: { sharedEvent: SharedEvent; sharedStore: S } }); } + +async function pasteFromClipboardReadList(items: ClipboardReadItem[], opts: { sharedEvent: SharedEvent; sharedStore: SharedStore }) { + const { sharedEvent, sharedStore } = opts; + const idraw = sharedStore.getStatic('idraw'); + const selectedUUIDs = sharedStore.get('selectedUUIDs'); + + let elements: Element[] = []; + + for (let i = 0; i < items.length; i++) { + const item = items[i]; + if (item.type === 'text' && item.text) { + const text = item.text; + if (text.startsWith('[{') && text.endsWith('}]')) { + try { + elements = JSON.parse(text) as Element[]; + } catch (err) { + console.warn(err); + } + } + } else if (item.type === 'file' && item.file) { + const { file } = item; + if (file.type?.startsWith('image/')) { + const base64 = (await parseFileToBase64(file)) as string; + const image = await loadImage(base64); + + // TODO + const imageElem: Element<'image'> = { + uuid: createUUID(), + type: 'image', + x: 0, + y: 0, + w: image.width, + h: image.height, + detail: { + src: base64 + } + }; + elements.push(imageElem); + } + } + } + + if (elements.length > 0 && idraw) { + const targetElements: Element[] = []; + for (let i = 0; i < elements.length; i++) { + if (elements[i]) { + const elem = elements[i]; + const target = deepCloneElement(elem as Element); + target.name = `${target.name} copy`; + targetElements.push(target); + } + } + + if (targetElements.length > 0) { + const data = idraw?.getData() as Data; + const position = getElementPositionFromList(selectedUUIDs[0], data?.elements || []); + if (position.length > 0) { + position[position.length - 1]++; + } + targetElements.forEach((elem) => { + idraw.addElement(elem, { position }); + }); + const editingData = idraw?.getData() as Data; + const elementTree = getElementTree(editingData); + + sharedEvent.trigger('dispatch', { + type: 'update', + payload: { + editingData, + elementTree + } + }); + idraw.selectElement(targetElements[0].uuid); + setTimeout(() => { + sharedEvent.trigger('scrollToLayer', { + uuid: targetElements[0].uuid + }); + }, 100); + } + } +} + +export function generatePasteEventCallback(opts: { sharedStore: SharedStore; sharedEvent: SharedEvent }) { + const callback = async (e: ClipboardEvent) => { + const items = await parseClipboardReadList(e); + await pasteFromClipboardReadList(items, opts); + }; + + return callback; +} diff --git a/packages/studio/src/studio.tsx b/packages/studio/src/studio.tsx index 536a400..22c853d 100644 --- a/packages/studio/src/studio.tsx +++ b/packages/studio/src/studio.tsx @@ -22,6 +22,7 @@ export const Studio = React.forwardRef((props: StudioProps, ref: any) => { defaultSelectedElementUUIDs, defaultEditMode, prefiexName, + reverseTree, onEditGroupElement, useContextMenuOptions = useInnerContextMenuOptions, handleKeyboard = handleInnerKeyboard, @@ -147,6 +148,7 @@ export const Studio = React.forwardRef((props: StudioProps, ref: any) => { height={height} style={style} className={className} + reverseTree={reverseTree} defaultSelectedElementUUIDs={defaultSelectedElementUUIDs} sharedEvent={refSharedEvent.current as SharedEvent} sharedStore={refSharedStore.current as SharedStore} diff --git a/packages/studio/src/types/lib/studio.ts b/packages/studio/src/types/lib/studio.ts index 5daf9ba..de8e789 100644 --- a/packages/studio/src/types/lib/studio.ts +++ b/packages/studio/src/types/lib/studio.ts @@ -4,7 +4,6 @@ import type { LocaleCode, StudioData } from '@idraw/studio-base'; import type { DashboardProps } from '../../modules'; import type { SharedEvent, SharedStore } from './shared'; import type { StudioActionType, StudioState, StudioThemeMode, StudioEditMode } from './context'; -import type { GetTemplates } from './template'; export type StudioProps = Omit & Pick, 'useContextMenuOptions' | 'handleKeyboard'> & { diff --git a/packages/studio/src/util/clipboard.ts b/packages/studio/src/util/clipboard.ts new file mode 100644 index 0000000..b066fac --- /dev/null +++ b/packages/studio/src/util/clipboard.ts @@ -0,0 +1,47 @@ +export type ClipboardReadItem = { + file?: File | null; + text?: string | null; + type: 'file' | 'text' | null; +}; + +export async function parseClipboardReadList(e: ClipboardEvent | null): Promise { + const items: DataTransferItemList = (e?.clipboardData?.items || []) as DataTransferItemList; + + const list: ClipboardReadItem[] = []; + const isFinish = () => list.length >= items.length; + + return new Promise((resolve) => { + const done = () => { + if (isFinish() === true) { + const result: ClipboardReadItem[] = Array.from(list as any); + resolve(result); + } + }; + Array.from(items).forEach((item: DataTransferItem, i: number) => { + if (item.kind === 'file') { + const readItem: ClipboardReadItem = { + file: null, + text: null, + type: null + }; + const file = item.getAsFile(); + readItem.type = 'file'; + readItem.file = file; + list[i] = readItem; + done(); + } else if (item.kind === 'string') { + item.getAsString((text) => { + const readItem: ClipboardReadItem = { + file: null, + text: null, + type: null + }; + readItem.type = 'text'; + readItem.text = text; + list[i] = readItem; + done(); + }); + } + }); + }); +} From 4027cf232ec517806d6bb9b28eb3f6125ad84ad4 Mon Sep 17 00:00:00 2001 From: chenshenhai Date: Sun, 11 Aug 2024 17:17:08 +0800 Subject: [PATCH 2/2] chore: bump version 0.4.0-beta.37 --- package.json | 4 +- packages/studio-base/package.json | 4 +- packages/studio/package.json | 6 +-- pnpm-lock.yaml | 84 +++++++++++++++---------------- 4 files changed, 49 insertions(+), 49 deletions(-) diff --git a/package.json b/package.json index 39ced43..0768342 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": false, - "version": "0.4.0-alpha.36", + "version": "0.4.0-alpha.37", "workspaces": [ "packages/*" ], @@ -21,7 +21,7 @@ "upgrade:version": "npm run version:reset && pnpm i" }, "dependencies": { - "idraw": "0.4.0-beta.36", + "idraw": "0.4.0-beta.37", "antd": "5.19.3" }, "devDependencies": { diff --git a/packages/studio-base/package.json b/packages/studio-base/package.json index bccacd3..d16f5d4 100644 --- a/packages/studio-base/package.json +++ b/packages/studio-base/package.json @@ -1,6 +1,6 @@ { "name": "@idraw/studio-base", - "version": "0.4.0-alpha.36", + "version": "0.4.0-alpha.37", "main": "dist/index.js", "module": "dist/index.js", "types": "dist/index.d.ts", @@ -24,7 +24,7 @@ "@rc-component/color-picker": "^1.5.3", "antd": "^5.19.3", "classnames": "^2.3.2", - "idraw": "^0.4.0-beta.36", + "idraw": "^0.4.0-beta.37", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/packages/studio/package.json b/packages/studio/package.json index 8c29fcd..cebabd2 100644 --- a/packages/studio/package.json +++ b/packages/studio/package.json @@ -1,6 +1,6 @@ { "name": "@idraw/studio", - "version": "0.4.0-alpha.36", + "version": "0.4.0-alpha.37", "main": "dist/index.js", "module": "dist/index.js", "types": "dist/index.d.ts", @@ -21,13 +21,13 @@ "license": "MIT", "dependencies": { "@rc-component/color-picker": "^1.5.3", - "@idraw/studio-base": "workspace:^0.4.0-alpha.36", + "@idraw/studio-base": "workspace:^0.4.0-alpha.37", "classnames": "^2.5.1", "is-hotkey": "^0.2.0" }, "peerDependencies": { "antd": "^5.19.3", - "idraw": "^0.4.0-beta.36", + "idraw": "^0.4.0-beta.37", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9d6975..1fd532a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: 5.19.3 version: 5.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) idraw: - specifier: 0.4.0-beta.36 - version: 0.4.0-beta.36 + specifier: 0.4.0-beta.37 + version: 0.4.0-beta.37 devDependencies: '@babel/core': specifier: ^7.24.8 @@ -160,7 +160,7 @@ importers: packages/studio: dependencies: '@idraw/studio-base': - specifier: workspace:^0.4.0-alpha.36 + specifier: workspace:^0.4.0-alpha.37 version: link:../studio-base '@rc-component/color-picker': specifier: ^1.5.3 @@ -172,8 +172,8 @@ importers: specifier: ^2.5.1 version: 2.5.1 idraw: - specifier: ^0.4.0-beta.36 - version: 0.4.0-beta.36 + specifier: ^0.4.0-beta.37 + version: 0.4.0-beta.37 is-hotkey: specifier: ^0.2.0 version: 0.2.0 @@ -206,8 +206,8 @@ importers: specifier: ^2.3.2 version: 2.5.1 idraw: - specifier: ^0.4.0-beta.36 - version: 0.4.0-beta.36 + specifier: ^0.4.0-beta.37 + version: 0.4.0-beta.37 react: specifier: ^18.3.1 version: 18.3.1 @@ -1287,29 +1287,29 @@ packages: resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} engines: {node: '>=18.18'} - '@idraw/board@0.4.0-beta.36': - resolution: {integrity: sha512-lyHYGhaKBvbpKmJSJ3YsG3W/GtzcEHTVLiLLBd43W6w4f3hF4kAtmSw27NAjc/MIMVrCb/6Mowy2eAfbGJDHjA==} + '@idraw/board@0.4.0-beta.37': + resolution: {integrity: sha512-SHhXi6ALajuGSEjgK4rULk0VLXiKjjLP5iU4yfAZkenRxsSsqqaObUItL35J5PSNMwjLP5Y9I48LEInCJ0uXUw==} peerDependencies: - '@idraw/renderer': ^0.4.0-beta.36 - '@idraw/util': ^0.4.0-beta.36 + '@idraw/renderer': ^0.4.0-beta.37 + '@idraw/util': ^0.4.0-beta.37 - '@idraw/core@0.4.0-beta.36': - resolution: {integrity: sha512-sv+sntEh4AJaeQzDG0jgODV/nq6MDH/mFIwptd/jq+QJ1NtgdTCgX7gN5TZ3LGtlcdeg+JFTyvxE9xpWqi1KKg==} + '@idraw/core@0.4.0-beta.37': + resolution: {integrity: sha512-vhBfZankbCaQskH8N5GUby7M99JMmA2PBckycx8mWzzhKTGwb0z1HRbqZuH745aMM/G9zx8ErmKRNQabxJoLMg==} peerDependencies: - '@idraw/board': ^0.4.0-beta.36 - '@idraw/renderer': ^0.4.0-beta.36 - '@idraw/util': ^0.4.0-beta.36 + '@idraw/board': ^0.4.0-beta.37 + '@idraw/renderer': ^0.4.0-beta.37 + '@idraw/util': ^0.4.0-beta.37 - '@idraw/renderer@0.4.0-beta.36': - resolution: {integrity: sha512-SWsFu1SmTZ3v+ycQO+kyZszVf38LwW4mIs85FqnU9nDhSv8pUJJQnPh/WeSdx9E+NYljxY2FhUHt5Xc38LYCbA==} + '@idraw/renderer@0.4.0-beta.37': + resolution: {integrity: sha512-0ZCnaX5YgMmDawz68F97KH7mjjddvagMYFGRMOy6SNg18B7gRrQYE2G0+kuFgCjoJQddogaTarV8xvppxMczFA==} peerDependencies: - '@idraw/util': ^0.4.0-beta.36 + '@idraw/util': ^0.4.0-beta.37 - '@idraw/types@0.4.0-beta.36': - resolution: {integrity: sha512-EujQAhacIiZ72CjJXrXwhQiIQuUuHBp3ZdmkpcpaujIPmeAWIheJ1njI26kdGlGJThBbDAcH4FAhB9367WN95g==} + '@idraw/types@0.4.0-beta.37': + resolution: {integrity: sha512-4Cs8juggXePC/SpRaQCUc3cMxy3HRHOhe+vzR3m/hIDbSD4U/nwCaXdjV+Ad1YNoSVr9EtdOqneKBnckjpKPZw==} - '@idraw/util@0.4.0-beta.36': - resolution: {integrity: sha512-88mCqpCqebD2/h3DwDbmA+YDe5HP2tCMdgm6YPK7P3wAv+WUUfU0VrgP7vQrdU0ukiHzsnRDfHJHJjgkrOdE8g==} + '@idraw/util@0.4.0-beta.37': + resolution: {integrity: sha512-jbfz8hTy4lt14y5t/0OEBy0tkIYSaL0X4qfvFGdJaedkCBFSvE8WaBBZ+mqDBSJcN4BLUmx+cccaZ3VLbGP0/g==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -2855,8 +2855,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - idraw@0.4.0-beta.36: - resolution: {integrity: sha512-AdOTuCC28Yt/qrjkA73LwTWdtGTbzo2mlzMg5W0+X/9BEj1Bsex+n6N/J4qcshPvLO/+LlIugYG8aS8k4IqseA==} + idraw@0.4.0-beta.37: + resolution: {integrity: sha512-iU7qavNFEdRt5gQHEowZcAomAfdO1HUdHzlupxpZs2diSKaBp7iwwyyJU2dnSAO01mdTRBNjBmS3hIaWWX7GqQ==} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5555,24 +5555,24 @@ snapshots: '@humanwhocodes/retry@0.3.0': {} - '@idraw/board@0.4.0-beta.36(@idraw/renderer@0.4.0-beta.36(@idraw/util@0.4.0-beta.36))(@idraw/util@0.4.0-beta.36)': + '@idraw/board@0.4.0-beta.37(@idraw/renderer@0.4.0-beta.37(@idraw/util@0.4.0-beta.37))(@idraw/util@0.4.0-beta.37)': dependencies: - '@idraw/renderer': 0.4.0-beta.36(@idraw/util@0.4.0-beta.36) - '@idraw/util': 0.4.0-beta.36 + '@idraw/renderer': 0.4.0-beta.37(@idraw/util@0.4.0-beta.37) + '@idraw/util': 0.4.0-beta.37 - '@idraw/core@0.4.0-beta.36(@idraw/board@0.4.0-beta.36(@idraw/renderer@0.4.0-beta.36(@idraw/util@0.4.0-beta.36))(@idraw/util@0.4.0-beta.36))(@idraw/renderer@0.4.0-beta.36(@idraw/util@0.4.0-beta.36))(@idraw/util@0.4.0-beta.36)': + '@idraw/core@0.4.0-beta.37(@idraw/board@0.4.0-beta.37(@idraw/renderer@0.4.0-beta.37(@idraw/util@0.4.0-beta.37))(@idraw/util@0.4.0-beta.37))(@idraw/renderer@0.4.0-beta.37(@idraw/util@0.4.0-beta.37))(@idraw/util@0.4.0-beta.37)': dependencies: - '@idraw/board': 0.4.0-beta.36(@idraw/renderer@0.4.0-beta.36(@idraw/util@0.4.0-beta.36))(@idraw/util@0.4.0-beta.36) - '@idraw/renderer': 0.4.0-beta.36(@idraw/util@0.4.0-beta.36) - '@idraw/util': 0.4.0-beta.36 + '@idraw/board': 0.4.0-beta.37(@idraw/renderer@0.4.0-beta.37(@idraw/util@0.4.0-beta.37))(@idraw/util@0.4.0-beta.37) + '@idraw/renderer': 0.4.0-beta.37(@idraw/util@0.4.0-beta.37) + '@idraw/util': 0.4.0-beta.37 - '@idraw/renderer@0.4.0-beta.36(@idraw/util@0.4.0-beta.36)': + '@idraw/renderer@0.4.0-beta.37(@idraw/util@0.4.0-beta.37)': dependencies: - '@idraw/util': 0.4.0-beta.36 + '@idraw/util': 0.4.0-beta.37 - '@idraw/types@0.4.0-beta.36': {} + '@idraw/types@0.4.0-beta.37': {} - '@idraw/util@0.4.0-beta.36': {} + '@idraw/util@0.4.0-beta.37': {} '@isaacs/cliui@8.0.2': dependencies: @@ -7400,13 +7400,13 @@ snapshots: dependencies: safer-buffer: 2.1.2 - idraw@0.4.0-beta.36: + idraw@0.4.0-beta.37: dependencies: - '@idraw/board': 0.4.0-beta.36(@idraw/renderer@0.4.0-beta.36(@idraw/util@0.4.0-beta.36))(@idraw/util@0.4.0-beta.36) - '@idraw/core': 0.4.0-beta.36(@idraw/board@0.4.0-beta.36(@idraw/renderer@0.4.0-beta.36(@idraw/util@0.4.0-beta.36))(@idraw/util@0.4.0-beta.36))(@idraw/renderer@0.4.0-beta.36(@idraw/util@0.4.0-beta.36))(@idraw/util@0.4.0-beta.36) - '@idraw/renderer': 0.4.0-beta.36(@idraw/util@0.4.0-beta.36) - '@idraw/types': 0.4.0-beta.36 - '@idraw/util': 0.4.0-beta.36 + '@idraw/board': 0.4.0-beta.37(@idraw/renderer@0.4.0-beta.37(@idraw/util@0.4.0-beta.37))(@idraw/util@0.4.0-beta.37) + '@idraw/core': 0.4.0-beta.37(@idraw/board@0.4.0-beta.37(@idraw/renderer@0.4.0-beta.37(@idraw/util@0.4.0-beta.37))(@idraw/util@0.4.0-beta.37))(@idraw/renderer@0.4.0-beta.37(@idraw/util@0.4.0-beta.37))(@idraw/util@0.4.0-beta.37) + '@idraw/renderer': 0.4.0-beta.37(@idraw/util@0.4.0-beta.37) + '@idraw/types': 0.4.0-beta.37 + '@idraw/util': 0.4.0-beta.37 ieee754@1.2.1: {}