@operato/board 10.0.0-beta.8 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +540 -0
- package/dist/src/component/container.js +18 -3
- package/dist/src/component/container.js.map +1 -1
- package/dist/src/component/conveyance.d.ts +2 -0
- package/dist/src/component/conveyance.js +38 -0
- package/dist/src/component/conveyance.js.map +1 -0
- package/dist/src/component/etc.js +2 -10
- package/dist/src/component/etc.js.map +1 -1
- package/dist/src/component/facility.d.ts +2 -0
- package/dist/src/component/facility.js +35 -0
- package/dist/src/component/facility.js.map +1 -0
- package/dist/src/component/index.d.ts +5 -0
- package/dist/src/component/index.js +5 -0
- package/dist/src/component/index.js.map +1 -1
- package/dist/src/component/line.js +4 -28
- package/dist/src/component/line.js.map +1 -1
- package/dist/src/component/manufacturing.d.ts +2 -0
- package/dist/src/component/manufacturing.js +41 -0
- package/dist/src/component/manufacturing.js.map +1 -0
- package/dist/src/component/register-default-groups.js +19 -2
- package/dist/src/component/register-default-groups.js.map +1 -1
- package/dist/src/component/shape.js +5 -29
- package/dist/src/component/shape.js.map +1 -1
- package/dist/src/component/storage.d.ts +2 -0
- package/dist/src/component/storage.js +27 -0
- package/dist/src/component/storage.js.map +1 -0
- package/dist/src/component/text-and-media.js +2 -25
- package/dist/src/component/text-and-media.js.map +1 -1
- package/dist/src/component/transport.d.ts +2 -0
- package/dist/src/component/transport.js +36 -0
- package/dist/src/component/transport.js.map +1 -0
- package/dist/src/component/warehouse.d.ts +1 -0
- package/dist/src/component/warehouse.js +8 -1
- package/dist/src/component/warehouse.js.map +1 -1
- package/dist/src/data-storage/board-model-cache.d.ts +30 -0
- package/dist/src/data-storage/board-model-cache.js +93 -0
- package/dist/src/data-storage/board-model-cache.js.map +1 -0
- package/dist/src/graphql/data-subscription.js +5 -1
- package/dist/src/graphql/data-subscription.js.map +1 -1
- package/dist/src/graphql/playback-buffer.d.ts +79 -0
- package/dist/src/graphql/playback-buffer.js +139 -0
- package/dist/src/graphql/playback-buffer.js.map +1 -0
- package/dist/src/graphql/playback-buffer.test.d.ts +1 -0
- package/dist/src/graphql/playback-buffer.test.js +261 -0
- package/dist/src/graphql/playback-buffer.test.js.map +1 -0
- package/dist/src/graphql/playback-subscription.d.ts +33 -18
- package/dist/src/graphql/playback-subscription.js +158 -91
- package/dist/src/graphql/playback-subscription.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/modeller/bulk-create-dialog.d.ts +51 -0
- package/dist/src/modeller/bulk-create-dialog.js +531 -0
- package/dist/src/modeller/bulk-create-dialog.js.map +1 -0
- package/dist/src/modeller/bulk-create.d.ts +101 -0
- package/dist/src/modeller/bulk-create.js +199 -0
- package/dist/src/modeller/bulk-create.js.map +1 -0
- package/dist/src/modeller/component-toolbar/component-menu.js +8 -1
- package/dist/src/modeller/component-toolbar/component-menu.js.map +1 -1
- package/dist/src/modeller/edit-toolbar-style.js +37 -0
- package/dist/src/modeller/edit-toolbar-style.js.map +1 -1
- package/dist/src/modeller/edit-toolbar.d.ts +21 -16
- package/dist/src/modeller/edit-toolbar.js +362 -199
- package/dist/src/modeller/edit-toolbar.js.map +1 -1
- package/dist/src/modeller/scene-viewer/ox-scene-viewer.d.ts +2 -1
- package/dist/src/modeller/scene-viewer/ox-scene-viewer.js +7 -2
- package/dist/src/modeller/scene-viewer/ox-scene-viewer.js.map +1 -1
- package/dist/src/ox-board-modeller.d.ts +8 -1
- package/dist/src/ox-board-modeller.js +125 -6
- package/dist/src/ox-board-modeller.js.map +1 -1
- package/dist/src/ox-board-preview.d.ts +36 -0
- package/dist/src/ox-board-preview.js +114 -0
- package/dist/src/ox-board-preview.js.map +1 -0
- package/dist/src/ox-board-template-list.d.ts +1 -0
- package/dist/src/ox-board-template-list.js +19 -1
- package/dist/src/ox-board-template-list.js.map +1 -1
- package/dist/src/ox-board-viewer.d.ts +8 -1
- package/dist/src/ox-board-viewer.js +99 -32
- package/dist/src/ox-board-viewer.js.map +1 -1
- package/dist/src/ox-playback-controls.d.ts +8 -0
- package/dist/src/ox-playback-controls.js +114 -18
- package/dist/src/ox-playback-controls.js.map +1 -1
- package/dist/src/selector/ox-board-selector.js +11 -1
- package/dist/src/selector/ox-board-selector.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +21 -16
- package/translations/en.json +19 -1
- package/translations/ja.json +19 -1
- package/translations/ko.json +19 -1
- package/translations/ms.json +19 -1
- package/translations/zh.json +19 -1
|
@@ -3,18 +3,72 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { __decorate } from "tslib";
|
|
5
5
|
import { html, LitElement } from 'lit';
|
|
6
|
-
import { property,
|
|
6
|
+
import { property, state } from 'lit/decorators.js';
|
|
7
7
|
import { copyToClipboard, isMacOS } from '@operato/utils';
|
|
8
|
+
import { OxPopup } from '@operato/popup';
|
|
8
9
|
import { style } from './edit-toolbar-style.js';
|
|
10
|
+
import './bulk-create-dialog.js';
|
|
9
11
|
const MACOS = isMacOS();
|
|
12
|
+
/**
|
|
13
|
+
* 컴포넌트 model JSON 만으로 type-aware bounding box (width, height) 추출.
|
|
14
|
+
*
|
|
15
|
+
* things-scene 의 component.bounds 는 *path 의 bounding box* 인데, model JSON 만
|
|
16
|
+
* 으로는 path 를 그릴 수 없으므로 type-specific 필드를 직접 본다.
|
|
17
|
+
* - width/height 명시 (Rect, Container 등) → 그대로
|
|
18
|
+
* - rx/ry (Ellipse 등) → 2*rx, 2*ry
|
|
19
|
+
* - points 배열 (Line, Polygon 등) → 점들의 bounding box
|
|
20
|
+
* - 그 외 → 50x50 fallback
|
|
21
|
+
*
|
|
22
|
+
* bulk-paste 가 영역 안에 N 개 복제할 때 *원본 크기를 보존* 하기 위해 사용.
|
|
23
|
+
*/
|
|
24
|
+
function deriveBoundsFromModel(model) {
|
|
25
|
+
if (typeof model.width === 'number' && typeof model.height === 'number') {
|
|
26
|
+
return { width: model.width, height: model.height };
|
|
27
|
+
}
|
|
28
|
+
if (typeof model.rx === 'number' && typeof model.ry === 'number') {
|
|
29
|
+
return { width: 2 * Math.abs(model.rx), height: 2 * Math.abs(model.ry) };
|
|
30
|
+
}
|
|
31
|
+
if (Array.isArray(model.points) && model.points.length > 0) {
|
|
32
|
+
let minX = Infinity;
|
|
33
|
+
let maxX = -Infinity;
|
|
34
|
+
let minY = Infinity;
|
|
35
|
+
let maxY = -Infinity;
|
|
36
|
+
for (const p of model.points) {
|
|
37
|
+
if (typeof (p === null || p === void 0 ? void 0 : p.x) === 'number') {
|
|
38
|
+
if (p.x < minX)
|
|
39
|
+
minX = p.x;
|
|
40
|
+
if (p.x > maxX)
|
|
41
|
+
maxX = p.x;
|
|
42
|
+
}
|
|
43
|
+
if (typeof (p === null || p === void 0 ? void 0 : p.y) === 'number') {
|
|
44
|
+
if (p.y < minY)
|
|
45
|
+
minY = p.y;
|
|
46
|
+
if (p.y > maxY)
|
|
47
|
+
maxY = p.y;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (isFinite(minX) && isFinite(maxX) && isFinite(minY) && isFinite(maxY)) {
|
|
51
|
+
return { width: maxX - minX, height: maxY - minY };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { width: 50, height: 50 };
|
|
55
|
+
}
|
|
10
56
|
export class EditToolbar extends LitElement {
|
|
11
57
|
constructor() {
|
|
12
58
|
super(...arguments);
|
|
13
59
|
this.selected = [];
|
|
14
60
|
this.hideProperty = false;
|
|
61
|
+
this._dimension = null;
|
|
62
|
+
this._gizmoAttached = false;
|
|
15
63
|
}
|
|
16
64
|
firstUpdated() {
|
|
17
65
|
this.addEventListener('mousewheel', this.onWheelEvent.bind(this), false);
|
|
66
|
+
// 툴바 버튼 클릭 후 씬으로 포커스를 돌려서 키보드 단축키가 계속 작동하도록 한다
|
|
67
|
+
this.addEventListener('click', () => {
|
|
68
|
+
var _a, _b, _c;
|
|
69
|
+
;
|
|
70
|
+
(_c = (_b = (_a = this.scene) === null || _a === void 0 ? void 0 : _a.root) === null || _b === void 0 ? void 0 : _b.element) === null || _c === void 0 ? void 0 : _c.focus();
|
|
71
|
+
});
|
|
18
72
|
window.addEventListener('paste', (e) => {
|
|
19
73
|
var _a;
|
|
20
74
|
try {
|
|
@@ -24,33 +78,7 @@ export class EditToolbar extends LitElement {
|
|
|
24
78
|
console.error('model paste failed', e);
|
|
25
79
|
}
|
|
26
80
|
});
|
|
27
|
-
|
|
28
|
-
this.zorders.forEach(zorder => zorder.addEventListener('click', this.onTapZorder.bind(this)));
|
|
29
|
-
this.distributes.forEach(distribute => distribute.addEventListener('click', this.onTapDistribute.bind(this)));
|
|
30
|
-
this.undo.addEventListener('click', this.onTapUndo.bind(this));
|
|
31
|
-
this.redo.addEventListener('click', this.onTapRedo.bind(this));
|
|
32
|
-
this.fullscreen.addEventListener('click', this.onTapFullscreen.bind(this));
|
|
33
|
-
this.styleCopy.addEventListener('click', this.onStartStylePasteMode.bind(this));
|
|
34
|
-
this.databindCopy.addEventListener('click', this.onStartDatabindPasteMode.bind(this));
|
|
35
|
-
this.cut.addEventListener('click', this.onTapCut.bind(this));
|
|
36
|
-
this.copy.addEventListener('click', this.onTapCopy.bind(this));
|
|
37
|
-
this.paste.addEventListener('click', this.onTapPaste.bind(this));
|
|
38
|
-
this.delete.addEventListener('click', this.onTapDelete.bind(this));
|
|
39
|
-
this.renderRoot
|
|
40
|
-
.querySelector('#font-increase')
|
|
41
|
-
.addEventListener('click', this.onTapFontIncrease.bind(this));
|
|
42
|
-
this.renderRoot
|
|
43
|
-
.querySelector('#font-decrease')
|
|
44
|
-
.addEventListener('click', this.onTapFontDecrease.bind(this));
|
|
45
|
-
this.renderRoot.querySelector('#group').addEventListener('click', this.onTapGroup.bind(this));
|
|
46
|
-
this.renderRoot.querySelector('#ungroup').addEventListener('click', this.onTapUngroup.bind(this));
|
|
47
|
-
this.renderRoot
|
|
48
|
-
.querySelector('#toggle-property')
|
|
49
|
-
.addEventListener('click', this.onTapToggle.bind(this));
|
|
50
|
-
this.renderRoot
|
|
51
|
-
.querySelector('#fit-scene')
|
|
52
|
-
.addEventListener('click', this.onTapFitScene.bind(this));
|
|
53
|
-
this.renderRoot.querySelector('#preview').addEventListener('click', this.onTapPreview.bind(this));
|
|
81
|
+
// 모든 버튼은 템플릿 @click 디렉티브로 바인딩 — 조건부 렌더링 시에도 정상 작동
|
|
54
82
|
}
|
|
55
83
|
updated(changes) {
|
|
56
84
|
changes.has('scene') && this.onSceneChanged(this.scene, changes.get('scene'));
|
|
@@ -61,127 +89,122 @@ export class EditToolbar extends LitElement {
|
|
|
61
89
|
<div tools>
|
|
62
90
|
<span><slot></slot></span>
|
|
63
91
|
|
|
64
|
-
<span button id="undo" title="undo (${this.getShortcutString('cmd', 'z')})"> </span>
|
|
65
|
-
<span button id="redo" title="redo (${this.getShortcutString('cmd', 'shift', 'z')})"> </span>
|
|
92
|
+
<span button id="undo" title="undo (${this.getShortcutString('cmd', 'z')})" @click=${this.onTapUndo}> </span>
|
|
93
|
+
<span button id="redo" title="redo (${this.getShortcutString('cmd', 'shift', 'z')})" @click=${this.onTapRedo}> </span>
|
|
66
94
|
|
|
67
95
|
<span class="vline"></span>
|
|
68
96
|
|
|
69
|
-
<span button id="style-copy" title="style copy (${this.getShortcutString('cmd', '1')})"> </span>
|
|
70
|
-
<span button id="databind-copy" title="databind copy (${this.getShortcutString('cmd', '2')})"> </span>
|
|
97
|
+
<span button id="style-copy" title="style copy (${this.getShortcutString('cmd', '1')})" @click=${this.onStartStylePasteMode}> </span>
|
|
98
|
+
<span button id="databind-copy" title="databind copy (${this.getShortcutString('cmd', '2')})" @click=${this.onStartDatabindPasteMode}> </span>
|
|
71
99
|
|
|
72
100
|
<span class="vline"></span>
|
|
73
101
|
|
|
74
|
-
<span button id="cut" title="cut (${this.getShortcutString('cmd', 'x')})"> </span>
|
|
75
|
-
<span button id="copy" title="copy (${this.getShortcutString('cmd', 'c')})"> </span>
|
|
76
|
-
<span button id="paste" title="paste (${this.getShortcutString('cmd', 'v')})"> </span>
|
|
77
|
-
<span
|
|
78
|
-
button
|
|
79
|
-
id="delete"
|
|
102
|
+
<span button id="cut" title="cut (${this.getShortcutString('cmd', 'x')})" @click=${this.onTapCut}> </span>
|
|
103
|
+
<span button id="copy" title="copy (${this.getShortcutString('cmd', 'c')})" @click=${this.onTapCopy}> </span>
|
|
104
|
+
<span button id="paste" title="paste (${this.getShortcutString('cmd', 'v')})" @click=${this.onTapPaste}> </span>
|
|
105
|
+
<span button id="delete"
|
|
80
106
|
title="delete (${this.getShortcutString('backspace')}, ${this.getShortcutString('delete')})"
|
|
81
|
-
|
|
82
|
-
</span>
|
|
107
|
+
@click=${this.onTapDelete}> </span>
|
|
83
108
|
|
|
84
109
|
<span class="vline"></span>
|
|
85
110
|
|
|
86
|
-
<span
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
</span>
|
|
93
|
-
<span
|
|
94
|
-
button
|
|
95
|
-
data-align="center"
|
|
96
|
-
id="align-center"
|
|
97
|
-
title="align center (${this.getShortcutString('alt', 'shift', 'c')})"
|
|
98
|
-
>
|
|
99
|
-
</span>
|
|
100
|
-
<span
|
|
101
|
-
button
|
|
102
|
-
data-align="right"
|
|
103
|
-
id="align-right"
|
|
104
|
-
title="align right (${this.getShortcutString('alt', 'shift', 'r')})"
|
|
105
|
-
>
|
|
106
|
-
</span>
|
|
111
|
+
<span button data-align="left" id="align-left"
|
|
112
|
+
title="align left (${this.getShortcutString('alt', 'shift', 'l')})" @click=${this.onTapAlign}> </span>
|
|
113
|
+
<span button data-align="center" id="align-center"
|
|
114
|
+
title="align center (${this.getShortcutString('alt', 'shift', 'c')})" @click=${this.onTapAlign}> </span>
|
|
115
|
+
<span button data-align="right" id="align-right"
|
|
116
|
+
title="align right (${this.getShortcutString('alt', 'shift', 'r')})" @click=${this.onTapAlign}> </span>
|
|
107
117
|
|
|
108
|
-
<span button data-align="top" id="align-top"
|
|
109
|
-
|
|
110
|
-
<span
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
title="align middle (${this.getShortcutString('alt', 'shift', 'm')})"
|
|
115
|
-
>
|
|
116
|
-
</span>
|
|
117
|
-
<span
|
|
118
|
-
button
|
|
119
|
-
data-align="bottom"
|
|
120
|
-
id="align-bottom"
|
|
121
|
-
title="align bottom (${this.getShortcutString('alt', 'shift', 'b')})"
|
|
122
|
-
>
|
|
123
|
-
</span>
|
|
118
|
+
<span button data-align="top" id="align-top"
|
|
119
|
+
title="align top (${this.getShortcutString('alt', 'shift', 't')})" @click=${this.onTapAlign}> </span>
|
|
120
|
+
<span button data-align="middle" id="align-middle"
|
|
121
|
+
title="align middle (${this.getShortcutString('alt', 'shift', 'm')})" @click=${this.onTapAlign}> </span>
|
|
122
|
+
<span button data-align="bottom" id="align-bottom"
|
|
123
|
+
title="align bottom (${this.getShortcutString('alt', 'shift', 'b')})" @click=${this.onTapAlign}> </span>
|
|
124
124
|
|
|
125
|
-
<span
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
title="distribute horizontally (${this.getShortcutString('alt', 'shift', 'h')})"
|
|
130
|
-
>
|
|
131
|
-
</span>
|
|
125
|
+
<span button data-distribute="HORIZONTAL" id="distribute-horizontal"
|
|
126
|
+
title="distribute horizontally (${this.getShortcutString('alt', 'shift', 'h')})" @click=${this.onTapDistribute}> </span>
|
|
127
|
+
<span button data-distribute="VERTICAL" id="distribute-vertical"
|
|
128
|
+
title="distribute vertically (${this.getShortcutString('alt', 'shift', 'v')})" @click=${this.onTapDistribute}> </span>
|
|
132
129
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
id="distribute-vertical"
|
|
137
|
-
title="distribute vertically (${this.getShortcutString('alt', 'shift', 'v')})"
|
|
138
|
-
>
|
|
139
|
-
</span>
|
|
130
|
+
${this._dimension === '3d'
|
|
131
|
+
? html `
|
|
132
|
+
<span class="vline"></span>
|
|
140
133
|
|
|
141
|
-
|
|
134
|
+
<span button data-align="z-front" id="align-z-front" title="align Z front" @click=${this.onTapAlign}> </span>
|
|
135
|
+
<span button data-align="z-middle" id="align-z-middle" title="align Z middle" @click=${this.onTapAlign}> </span>
|
|
136
|
+
<span button data-align="z-back" id="align-z-back" title="align Z back" @click=${this.onTapAlign}> </span>
|
|
137
|
+
<span button data-distribute="Z" id="distribute-z" title="distribute Z" @click=${this.onTapDistribute}> </span>
|
|
138
|
+
`
|
|
139
|
+
: this._dimension === '2d'
|
|
140
|
+
? html `
|
|
141
|
+
<span class="vline"></span>
|
|
142
142
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
</span>
|
|
154
|
-
<span button id="backward" data-zorder="backward" title="send backward (${this.getShortcutString('cmd', 'b')})">
|
|
155
|
-
</span>
|
|
143
|
+
<span button id="front" data-zorder="front"
|
|
144
|
+
title="bring to front (${this.getShortcutString('cmd', 'shift', 'f')})" @click=${this.onTapZorder}> </span>
|
|
145
|
+
<span button id="back" data-zorder="back"
|
|
146
|
+
title="send to back (${this.getShortcutString('cmd', 'shift', 'b')})" @click=${this.onTapZorder}> </span>
|
|
147
|
+
<span button id="forward" data-zorder="forward"
|
|
148
|
+
title="bring forward (${this.getShortcutString('cmd', 'f')})" @click=${this.onTapZorder}> </span>
|
|
149
|
+
<span button id="backward" data-zorder="backward"
|
|
150
|
+
title="send backward (${this.getShortcutString('cmd', 'b')})" @click=${this.onTapZorder}> </span>
|
|
151
|
+
`
|
|
152
|
+
: ''}
|
|
156
153
|
|
|
157
|
-
|
|
154
|
+
${this._dimension === '2d' ? html `
|
|
155
|
+
<span class="vline"></span>
|
|
156
|
+
|
|
157
|
+
<span button id="group" title="group (${this.getShortcutString('cmd', 'g')})" @click=${this.onTapGroup}> </span>
|
|
158
|
+
<span button id="ungroup" title="ungroup (${this.getShortcutString('cmd', 'shift', 'g')})" @click=${this.onTapUngroup}> </span>
|
|
159
|
+
` : this._dimension === '3d' ? html `
|
|
160
|
+
<span class="vline"></span>
|
|
158
161
|
|
|
159
|
-
|
|
160
|
-
|
|
162
|
+
<span button class="gizmo-btn" data-gizmo="translate" title="Move (W)"
|
|
163
|
+
@click=${() => this._setGizmoMode('translate')}>
|
|
164
|
+
<svg viewBox="0 0 20 20" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.8">
|
|
165
|
+
<line x1="10" y1="2" x2="10" y2="18"/><line x1="2" y1="10" x2="18" y2="10"/>
|
|
166
|
+
<polyline points="10,2 7.5,5"/><polyline points="10,2 12.5,5"/>
|
|
167
|
+
<polyline points="18,10 15,7.5"/><polyline points="18,10 15,12.5"/>
|
|
168
|
+
<polyline points="10,18 7.5,15"/><polyline points="10,18 12.5,15"/>
|
|
169
|
+
<polyline points="2,10 5,7.5"/><polyline points="2,10 5,12.5"/>
|
|
170
|
+
</svg>
|
|
171
|
+
</span>
|
|
172
|
+
<span button class="gizmo-btn" data-gizmo="rotate" title="Rotate (E)"
|
|
173
|
+
@click=${() => this._setGizmoMode('rotate')}>
|
|
174
|
+
<svg viewBox="0 0 20 20" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.8">
|
|
175
|
+
<path d="M14.5 3.5A7 7 0 1 0 17 10"/>
|
|
176
|
+
<polyline points="14,1 15,3.5 12.5,4.5"/>
|
|
177
|
+
</svg>
|
|
178
|
+
</span>
|
|
179
|
+
<span button class="gizmo-btn" data-gizmo="scale" title="Scale (R)"
|
|
180
|
+
@click=${() => this._setGizmoMode('scale')}>
|
|
181
|
+
<svg viewBox="0 0 20 20" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.8">
|
|
182
|
+
<line x1="4" y1="16" x2="16" y2="4"/>
|
|
183
|
+
<rect x="2" y="13" width="4" height="4" rx="0.5" fill="currentColor"/>
|
|
184
|
+
<rect x="14" y="2" width="4" height="4" rx="0.5" fill="currentColor"/>
|
|
185
|
+
</svg>
|
|
186
|
+
</span>
|
|
187
|
+
` : ''}
|
|
161
188
|
|
|
162
189
|
<span class="vline"></span>
|
|
163
190
|
|
|
164
|
-
<span button id="font-increase" title="increase font size"></span>
|
|
165
|
-
<span button id="font-decrease" title="decrease font size" style="scale: 0.7;"></span>
|
|
191
|
+
<span button id="font-increase" title="increase font size" @click=${this.onTapFontIncrease}></span>
|
|
192
|
+
<span button id="font-decrease" title="decrease font size" style="scale: 0.7;" @click=${this.onTapFontDecrease}></span>
|
|
166
193
|
|
|
167
194
|
<span class="vline"></span>
|
|
168
195
|
<span padding></span>
|
|
169
196
|
|
|
170
|
-
<span button id="fit-scene" title="fit scene (${this.getShortcutString('cmd', 'd')})"> </span>
|
|
197
|
+
<span button id="fit-scene" title="fit scene (${this.getShortcutString('cmd', 'd')})" @click=${this.onTapFitScene}> </span>
|
|
171
198
|
|
|
172
199
|
<span class="vline"></span>
|
|
173
200
|
|
|
174
|
-
<span button id="preview" title="preview (${this.getShortcutString('ctrl', 'p')})"> </span>
|
|
201
|
+
<span button id="preview" title="preview (${this.getShortcutString('ctrl', 'p')})" @click=${this.onTapPreview}> </span>
|
|
175
202
|
|
|
176
|
-
<span button id="fullscreen" title="fullscreen (${this.getShortcutString('f11')})"> </span>
|
|
203
|
+
<span button id="fullscreen" title="fullscreen (${this.getShortcutString('f11')})" @click=${this.onTapFullscreen}> </span>
|
|
177
204
|
|
|
178
|
-
<span
|
|
179
|
-
button
|
|
180
|
-
id="toggle-property"
|
|
205
|
+
<span button id="toggle-property"
|
|
181
206
|
title="toggle property panel (${this.getShortcutString('cmd', 'h')})"
|
|
182
|
-
toggles="true"
|
|
183
|
-
>
|
|
184
|
-
</span>
|
|
207
|
+
toggles="true" @click=${this.onTapToggle}> </span>
|
|
185
208
|
</div>
|
|
186
209
|
`;
|
|
187
210
|
}
|
|
@@ -224,7 +247,7 @@ export class EditToolbar extends LitElement {
|
|
|
224
247
|
return symbols.join(MACOS ? '' : '+');
|
|
225
248
|
}
|
|
226
249
|
onShortcut(e) {
|
|
227
|
-
var _a, _b, _c, _d;
|
|
250
|
+
var _a, _b, _c, _d, _e, _f;
|
|
228
251
|
if (MACOS)
|
|
229
252
|
var ctrlKey = e.metaKey;
|
|
230
253
|
else
|
|
@@ -262,7 +285,12 @@ export class EditToolbar extends LitElement {
|
|
|
262
285
|
this.onTapCut();
|
|
263
286
|
break;
|
|
264
287
|
case 'KeyV':
|
|
265
|
-
if (ctrlKey && !
|
|
288
|
+
if (ctrlKey && shiftKey && !altKey) {
|
|
289
|
+
// Ctrl+Shift+V = Bulk Paste — 클립보드의 *단일* 컴포넌트를 N개로 일괄 붙여넣기.
|
|
290
|
+
this.onBulkPaste();
|
|
291
|
+
defaultPrevent = true;
|
|
292
|
+
}
|
|
293
|
+
else if (ctrlKey && !shiftKey) {
|
|
266
294
|
this.onTapPaste();
|
|
267
295
|
defaultPrevent = false;
|
|
268
296
|
}
|
|
@@ -275,23 +303,43 @@ export class EditToolbar extends LitElement {
|
|
|
275
303
|
defaultPrevent = true;
|
|
276
304
|
break;
|
|
277
305
|
case 'KeyG':
|
|
278
|
-
if (
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
306
|
+
if (this._dimension === '2d') {
|
|
307
|
+
if (ctrlKey && !shiftKey)
|
|
308
|
+
this.onTapGroup();
|
|
309
|
+
else if (ctrlKey && shiftKey)
|
|
310
|
+
this.onTapUngroup();
|
|
311
|
+
}
|
|
282
312
|
break;
|
|
283
|
-
case '
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
(
|
|
313
|
+
case 'BracketRight':
|
|
314
|
+
// Ctrl+] = Bring Forward, Ctrl+Shift+] = Bring to Front
|
|
315
|
+
// (Photoshop / Illustrator 표준 컨벤션)
|
|
316
|
+
if (this._dimension === '2d') {
|
|
317
|
+
if (ctrlKey && !shiftKey) {
|
|
318
|
+
(_a = this.scene) === null || _a === void 0 ? void 0 : _a.zorder('forward');
|
|
319
|
+
defaultPrevent = true;
|
|
320
|
+
}
|
|
321
|
+
else if (ctrlKey && shiftKey) {
|
|
322
|
+
(_b = this.scene) === null || _b === void 0 ? void 0 : _b.zorder('front');
|
|
323
|
+
defaultPrevent = true;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
break;
|
|
327
|
+
case 'BracketLeft':
|
|
328
|
+
// Ctrl+[ = Send Backward, Ctrl+Shift+[ = Send to Back
|
|
329
|
+
if (this._dimension === '2d') {
|
|
330
|
+
if (ctrlKey && !shiftKey) {
|
|
331
|
+
(_c = this.scene) === null || _c === void 0 ? void 0 : _c.zorder('backward');
|
|
332
|
+
defaultPrevent = true;
|
|
333
|
+
}
|
|
334
|
+
else if (ctrlKey && shiftKey) {
|
|
335
|
+
(_d = this.scene) === null || _d === void 0 ? void 0 : _d.zorder('back');
|
|
336
|
+
defaultPrevent = true;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
288
339
|
break;
|
|
289
340
|
case 'KeyB':
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
else if (ctrlKey && shiftKey)
|
|
293
|
-
(_d = this.scene) === null || _d === void 0 ? void 0 : _d.zorder('back');
|
|
294
|
-
else if (altKey && shiftKey)
|
|
341
|
+
// zorder 는 BracketLeft 로 이동. KeyB 의 Alt+Shift+B = align bottom 만 유지.
|
|
342
|
+
if (altKey && shiftKey)
|
|
295
343
|
this.onTapAlign('bottom');
|
|
296
344
|
break;
|
|
297
345
|
case 'KeyH':
|
|
@@ -335,11 +383,23 @@ export class EditToolbar extends LitElement {
|
|
|
335
383
|
this.onTapFitScene();
|
|
336
384
|
defaultPrevent = true;
|
|
337
385
|
}
|
|
386
|
+
else if (!shiftKey && !altKey) {
|
|
387
|
+
const target = e.composedPath()[0];
|
|
388
|
+
const tagName = target.tagName;
|
|
389
|
+
if (!target.isContentEditable && tagName !== 'INPUT' && tagName !== 'SELECT' && tagName !== 'TEXTAREA') {
|
|
390
|
+
this.onTapDataBinding();
|
|
391
|
+
defaultPrevent = true;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
338
394
|
break;
|
|
339
395
|
case 'KeyE':
|
|
340
396
|
if (ctrlKey && shiftKey)
|
|
341
397
|
this.onTapDownloadModel();
|
|
342
398
|
break;
|
|
399
|
+
case 'F10':
|
|
400
|
+
this.onTapEditModel();
|
|
401
|
+
defaultPrevent = true;
|
|
402
|
+
break;
|
|
343
403
|
case 'Digit1':
|
|
344
404
|
if (ctrlKey) {
|
|
345
405
|
defaultPrevent = true;
|
|
@@ -350,6 +410,11 @@ export class EditToolbar extends LitElement {
|
|
|
350
410
|
defaultPrevent = true;
|
|
351
411
|
}
|
|
352
412
|
break;
|
|
413
|
+
case 'Escape':
|
|
414
|
+
(_e = this.scene) === null || _e === void 0 ? void 0 : _e.stopStylePasteMode();
|
|
415
|
+
(_f = this.scene) === null || _f === void 0 ? void 0 : _f.stopDatabindPasteMode();
|
|
416
|
+
defaultPrevent = true;
|
|
417
|
+
break;
|
|
353
418
|
default:
|
|
354
419
|
return false;
|
|
355
420
|
}
|
|
@@ -357,40 +422,75 @@ export class EditToolbar extends LitElement {
|
|
|
357
422
|
e.preventDefault();
|
|
358
423
|
return true;
|
|
359
424
|
}
|
|
425
|
+
_setDisabled(id, disabled) {
|
|
426
|
+
const el = this.renderRoot.querySelector(`#${id}`);
|
|
427
|
+
disabled ? el === null || el === void 0 ? void 0 : el.setAttribute('disabled', '') : el === null || el === void 0 ? void 0 : el.removeAttribute('disabled');
|
|
428
|
+
}
|
|
360
429
|
onExecute(command, undoable, redoable) {
|
|
361
|
-
|
|
362
|
-
|
|
430
|
+
this._setDisabled('undo', !undoable);
|
|
431
|
+
this._setDisabled('redo', !redoable);
|
|
363
432
|
}
|
|
364
433
|
onUndo(undoable, redoable) {
|
|
365
|
-
|
|
366
|
-
|
|
434
|
+
this._setDisabled('undo', !undoable);
|
|
435
|
+
this._setDisabled('redo', !redoable);
|
|
367
436
|
}
|
|
368
437
|
onRedo(undoable, redoable) {
|
|
369
|
-
|
|
370
|
-
|
|
438
|
+
this._setDisabled('undo', !undoable);
|
|
439
|
+
this._setDisabled('redo', !redoable);
|
|
371
440
|
}
|
|
372
441
|
onSceneChanged(after, before) {
|
|
442
|
+
var _a, _b;
|
|
373
443
|
if (before) {
|
|
374
444
|
before.off('execute', this.onExecute, this);
|
|
375
445
|
before.off('undo', this.onUndo, this);
|
|
376
446
|
before.off('redo', this.onRedo, this);
|
|
447
|
+
before.off('dimension', this._onDimensionChanged, this);
|
|
448
|
+
before.off('gizmoattach', this._onGizmoAttachChanged, this);
|
|
377
449
|
}
|
|
378
450
|
if (after) {
|
|
379
451
|
after.on('execute', this.onExecute, this);
|
|
380
452
|
after.on('undo', this.onUndo, this);
|
|
381
453
|
after.on('redo', this.onRedo, this);
|
|
454
|
+
after.on('dimension', this._onDimensionChanged, this);
|
|
455
|
+
after.on('gizmoattach', this._onGizmoAttachChanged, this);
|
|
456
|
+
// scene 설정 시 현재 dimension을 즉시 반영 (초기 이벤트를 놓친 경우 대비)
|
|
457
|
+
const threed = (_b = (_a = after.model_layer) === null || _a === void 0 ? void 0 : _a.model) === null || _b === void 0 ? void 0 : _b.threed;
|
|
458
|
+
this._dimension = threed ? '3d' : '2d';
|
|
382
459
|
}
|
|
383
460
|
}
|
|
461
|
+
_onDimensionChanged(dimension) {
|
|
462
|
+
this._dimension = dimension;
|
|
463
|
+
}
|
|
464
|
+
_onGizmoAttachChanged(isAttached) {
|
|
465
|
+
this._gizmoAttached = isAttached;
|
|
466
|
+
}
|
|
467
|
+
_setGizmoMode(mode) {
|
|
468
|
+
var _a, _b;
|
|
469
|
+
;
|
|
470
|
+
(_b = (_a = this.scene) === null || _a === void 0 ? void 0 : _a.root) === null || _b === void 0 ? void 0 : _b.setGizmoMode(mode);
|
|
471
|
+
}
|
|
384
472
|
onSelectedChanged(after, before) {
|
|
473
|
+
var hasSelection = after.length > 0;
|
|
385
474
|
var alignable = after.length > 1;
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
475
|
+
['style-copy', 'databind-copy', 'cut', 'copy', 'delete'].forEach(id => this._setDisabled(id, !hasSelection));
|
|
476
|
+
// 정렬 버튼
|
|
477
|
+
this.renderRoot.querySelectorAll('[data-align]').forEach(el => alignable ? el.removeAttribute('disabled') : el.setAttribute('disabled', ''));
|
|
478
|
+
if (this._dimension === '2d') {
|
|
479
|
+
var movable = after.length === 1;
|
|
480
|
+
/* forward, backward 이동은 한 컴포넌트만 가능하다. */
|
|
481
|
+
this._setDisabled('forward', !movable);
|
|
482
|
+
this._setDisabled('backward', !movable);
|
|
483
|
+
/* 여러 컴포넌트는 front, back 이동이 가능하다. */
|
|
484
|
+
this._setDisabled('front', !(alignable || movable));
|
|
485
|
+
this._setDisabled('back', !(alignable || movable));
|
|
486
|
+
}
|
|
487
|
+
// 분배 버튼
|
|
488
|
+
this.renderRoot.querySelectorAll('[data-distribute]').forEach(el => alignable ? el.removeAttribute('disabled') : el.setAttribute('disabled', ''));
|
|
489
|
+
if (this._dimension === '3d') {
|
|
490
|
+
this.renderRoot.querySelectorAll('.gizmo-btn').forEach(btn => {
|
|
491
|
+
hasSelection ? btn.removeAttribute('disabled') : btn.setAttribute('disabled', '');
|
|
492
|
+
});
|
|
493
|
+
}
|
|
394
494
|
}
|
|
395
495
|
onTapUndo() {
|
|
396
496
|
var _a;
|
|
@@ -401,12 +501,20 @@ export class EditToolbar extends LitElement {
|
|
|
401
501
|
(_a = this.scene) === null || _a === void 0 ? void 0 : _a.redo();
|
|
402
502
|
}
|
|
403
503
|
onStartStylePasteMode() {
|
|
404
|
-
var _a;
|
|
405
|
-
(_a = this.
|
|
504
|
+
var _a, _b, _c;
|
|
505
|
+
if (((_a = this.selected) === null || _a === void 0 ? void 0 : _a.length) !== 1)
|
|
506
|
+
return;
|
|
507
|
+
if (this.selected[0] === ((_b = this.scene) === null || _b === void 0 ? void 0 : _b.root))
|
|
508
|
+
return;
|
|
509
|
+
(_c = this.scene) === null || _c === void 0 ? void 0 : _c.startStylePasteMode();
|
|
406
510
|
}
|
|
407
511
|
onStartDatabindPasteMode() {
|
|
408
|
-
var _a;
|
|
409
|
-
(_a = this.
|
|
512
|
+
var _a, _b, _c;
|
|
513
|
+
if (((_a = this.selected) === null || _a === void 0 ? void 0 : _a.length) !== 1)
|
|
514
|
+
return;
|
|
515
|
+
if (this.selected[0] === ((_b = this.scene) === null || _b === void 0 ? void 0 : _b.root))
|
|
516
|
+
return;
|
|
517
|
+
(_c = this.scene) === null || _c === void 0 ? void 0 : _c.startDatabindPasteMode();
|
|
410
518
|
}
|
|
411
519
|
onTapCut() {
|
|
412
520
|
var _a;
|
|
@@ -430,6 +538,97 @@ export class EditToolbar extends LitElement {
|
|
|
430
538
|
var _a;
|
|
431
539
|
(_a = this.scene) === null || _a === void 0 ? void 0 : _a.remove();
|
|
432
540
|
}
|
|
541
|
+
/**
|
|
542
|
+
* 멀티 컴포넌트 일괄 붙여넣기 — Ctrl+Shift+V 진입점.
|
|
543
|
+
*
|
|
544
|
+
* 흐름:
|
|
545
|
+
* 1. 클립보드 (this.cliped) 검증 — *단일* 컴포넌트만 허용
|
|
546
|
+
* 2. scene.startBulkCreateMode → AddLayer 가 캔버스 위에 드래그 박스 그림
|
|
547
|
+
* 3. 사용자가 영역 드래그 → Promise resolve({area, template})
|
|
548
|
+
* ESC/취소 → Promise resolve(null)
|
|
549
|
+
* 4. 영역이 결정되면 dialog 오픈
|
|
550
|
+
*/
|
|
551
|
+
async onBulkPaste() {
|
|
552
|
+
var _a;
|
|
553
|
+
if (!this.cliped) {
|
|
554
|
+
console.warn('bulk-paste: 먼저 Ctrl+C 로 컴포넌트를 복사하세요.');
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
let parsed;
|
|
558
|
+
try {
|
|
559
|
+
parsed = JSON.parse(this.cliped);
|
|
560
|
+
}
|
|
561
|
+
catch (e) {
|
|
562
|
+
console.warn('bulk-paste: 클립보드 파싱 실패', e);
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
if (!Array.isArray(parsed) || parsed.length === 0)
|
|
566
|
+
return;
|
|
567
|
+
if (parsed.length > 1) {
|
|
568
|
+
console.warn('bulk-paste: 단일 컴포넌트만 일괄 붙여넣기 가능. 다중은 일반 paste 사용.');
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
const template = parsed[0];
|
|
572
|
+
// bulk 모드 임을 시각 구분하기 위해 파란 점선 (일반 add 의 검정과 색만 차별).
|
|
573
|
+
const result = await ((_a = this.scene) === null || _a === void 0 ? void 0 : _a.startBulkCreateMode(template, { boxStrokeStyle: '#2964c2' }));
|
|
574
|
+
if (result) {
|
|
575
|
+
this._openBulkCreateDialog(template, result.area);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
_openBulkCreateDialog(template, initialArea) {
|
|
579
|
+
var _a;
|
|
580
|
+
const dialogEl = document.createElement('bulk-create-dialog');
|
|
581
|
+
dialogEl.template = template;
|
|
582
|
+
dialogEl.initialArea = initialArea;
|
|
583
|
+
// scene 의 모든 id 수집 — indexMap 기반 scene.ids 대신 트리 walk 로 안정성 확보.
|
|
584
|
+
const existingIds = new Set();
|
|
585
|
+
const collectIds = (comp) => {
|
|
586
|
+
var _a, _b, _c;
|
|
587
|
+
if (!comp)
|
|
588
|
+
return;
|
|
589
|
+
const id = (_b = (_a = comp === null || comp === void 0 ? void 0 : comp.state) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : (_c = comp === null || comp === void 0 ? void 0 : comp.model) === null || _c === void 0 ? void 0 : _c.id;
|
|
590
|
+
if (typeof id === 'string' && id)
|
|
591
|
+
existingIds.add(id);
|
|
592
|
+
const children = comp.components || [];
|
|
593
|
+
for (const c of children)
|
|
594
|
+
collectIds(c);
|
|
595
|
+
};
|
|
596
|
+
const root = (_a = this.scene) === null || _a === void 0 ? void 0 : _a.root;
|
|
597
|
+
if (root)
|
|
598
|
+
collectIds(root);
|
|
599
|
+
dialogEl.existingIds = existingIds;
|
|
600
|
+
dialogEl.onConfirm = (models) => {
|
|
601
|
+
const scene = this.scene;
|
|
602
|
+
if (!scene || !models.length) {
|
|
603
|
+
popup === null || popup === void 0 ? void 0 : popup.close();
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
// cliped 의 template model 자체에서 type-aware bounds 추출. things-scene 의
|
|
607
|
+
// component.bounds (= path bounding box) 와 동일 결과를 model JSON 의
|
|
608
|
+
// type-specific 필드 (width/height, rx/ry, points) 만으로 계산.
|
|
609
|
+
const bounds = deriveBoundsFromModel(template);
|
|
610
|
+
scene.undoableChange(() => {
|
|
611
|
+
for (const m of models) {
|
|
612
|
+
const cx = m.left + m.width / 2;
|
|
613
|
+
const cy = m.top + m.height / 2;
|
|
614
|
+
scene.add(m, {
|
|
615
|
+
left: cx - bounds.width / 2,
|
|
616
|
+
top: cy - bounds.height / 2,
|
|
617
|
+
width: bounds.width,
|
|
618
|
+
height: bounds.height
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
});
|
|
622
|
+
popup === null || popup === void 0 ? void 0 : popup.close();
|
|
623
|
+
};
|
|
624
|
+
dialogEl.onCancel = () => {
|
|
625
|
+
popup === null || popup === void 0 ? void 0 : popup.close();
|
|
626
|
+
};
|
|
627
|
+
const popup = OxPopup.open({
|
|
628
|
+
template: dialogEl,
|
|
629
|
+
backdrop: true
|
|
630
|
+
});
|
|
631
|
+
}
|
|
433
632
|
onTapSelectAll() {
|
|
434
633
|
var _a;
|
|
435
634
|
(_a = this.scene) === null || _a === void 0 ? void 0 : _a.select('(child)');
|
|
@@ -521,9 +720,15 @@ export class EditToolbar extends LitElement {
|
|
|
521
720
|
onTapPreview() {
|
|
522
721
|
this.dispatchEvent(new CustomEvent('open-preview'));
|
|
523
722
|
}
|
|
723
|
+
onTapDataBinding() {
|
|
724
|
+
this.dispatchEvent(new CustomEvent('open-data-binding'));
|
|
725
|
+
}
|
|
524
726
|
onTapDownloadModel() {
|
|
525
727
|
this.dispatchEvent(new CustomEvent('download-model'));
|
|
526
728
|
}
|
|
729
|
+
onTapEditModel() {
|
|
730
|
+
this.dispatchEvent(new CustomEvent('edit-model'));
|
|
731
|
+
}
|
|
527
732
|
onTapDistribute(e) {
|
|
528
733
|
if (!this.scene)
|
|
529
734
|
return;
|
|
@@ -546,51 +751,9 @@ __decorate([
|
|
|
546
751
|
property({ type: Boolean })
|
|
547
752
|
], EditToolbar.prototype, "hideProperty", void 0);
|
|
548
753
|
__decorate([
|
|
549
|
-
|
|
550
|
-
], EditToolbar.prototype, "
|
|
551
|
-
__decorate([
|
|
552
|
-
query('#undo')
|
|
553
|
-
], EditToolbar.prototype, "undo", void 0);
|
|
554
|
-
__decorate([
|
|
555
|
-
query('#fullscreen')
|
|
556
|
-
], EditToolbar.prototype, "fullscreen", void 0);
|
|
557
|
-
__decorate([
|
|
558
|
-
query('#style-copy')
|
|
559
|
-
], EditToolbar.prototype, "styleCopy", void 0);
|
|
560
|
-
__decorate([
|
|
561
|
-
query('#databind-copy')
|
|
562
|
-
], EditToolbar.prototype, "databindCopy", void 0);
|
|
563
|
-
__decorate([
|
|
564
|
-
query('#cut')
|
|
565
|
-
], EditToolbar.prototype, "cut", void 0);
|
|
566
|
-
__decorate([
|
|
567
|
-
query('#copy')
|
|
568
|
-
], EditToolbar.prototype, "copy", void 0);
|
|
569
|
-
__decorate([
|
|
570
|
-
query('#paste')
|
|
571
|
-
], EditToolbar.prototype, "paste", void 0);
|
|
572
|
-
__decorate([
|
|
573
|
-
query('#delete')
|
|
574
|
-
], EditToolbar.prototype, "delete", void 0);
|
|
575
|
-
__decorate([
|
|
576
|
-
query('#forward')
|
|
577
|
-
], EditToolbar.prototype, "forward", void 0);
|
|
578
|
-
__decorate([
|
|
579
|
-
query('#backward')
|
|
580
|
-
], EditToolbar.prototype, "backward", void 0);
|
|
581
|
-
__decorate([
|
|
582
|
-
query('#front')
|
|
583
|
-
], EditToolbar.prototype, "front", void 0);
|
|
584
|
-
__decorate([
|
|
585
|
-
query('#back')
|
|
586
|
-
], EditToolbar.prototype, "back", void 0);
|
|
587
|
-
__decorate([
|
|
588
|
-
queryAll('[data-align]')
|
|
589
|
-
], EditToolbar.prototype, "aligners", void 0);
|
|
590
|
-
__decorate([
|
|
591
|
-
queryAll('[data-zorder]')
|
|
592
|
-
], EditToolbar.prototype, "zorders", void 0);
|
|
754
|
+
state()
|
|
755
|
+
], EditToolbar.prototype, "_dimension", void 0);
|
|
593
756
|
__decorate([
|
|
594
|
-
|
|
595
|
-
], EditToolbar.prototype, "
|
|
757
|
+
state()
|
|
758
|
+
], EditToolbar.prototype, "_gizmoAttached", void 0);
|
|
596
759
|
//# sourceMappingURL=edit-toolbar.js.map
|