@g1cloud/entity-modeler-next 5.0.0-alpha.1
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/LICENSE +6 -0
- package/README.md +42 -0
- package/dist/adapter/diagramAdapter.d.ts +44 -0
- package/dist/adapter/persisted.d.ts +245 -0
- package/dist/agent/buildAgentBatch.d.ts +16 -0
- package/dist/agent/resolver.d.ts +54 -0
- package/dist/agent/schema.d.ts +9 -0
- package/dist/agent/symbolicOp.d.ts +109 -0
- package/dist/command/commands.d.ts +108 -0
- package/dist/command/op.d.ts +80 -0
- package/dist/command/opSync.d.ts +89 -0
- package/dist/command/stack.d.ts +48 -0
- package/dist/command/types.d.ts +29 -0
- package/dist/core/autolayout.d.ts +12 -0
- package/dist/core/dbTypes.d.ts +45 -0
- package/dist/core/id.d.ts +2 -0
- package/dist/core/javaTypes.d.ts +52 -0
- package/dist/core/propagation.d.ts +49 -0
- package/dist/core/relationMarker.d.ts +44 -0
- package/dist/core/resolve.d.ts +63 -0
- package/dist/core/routing.d.ts +58 -0
- package/dist/core/sharedColumn.d.ts +19 -0
- package/dist/core/sqlReservedWords.d.ts +25 -0
- package/dist/core/svg.d.ts +98 -0
- package/dist/core/text.d.ts +8 -0
- package/dist/core/types.d.ts +400 -0
- package/dist/core/validation.d.ts +53 -0
- package/dist/editor/controller.d.ts +371 -0
- package/dist/entity-modeler-next.css +1 -0
- package/dist/entity-modeler.js +19943 -0
- package/dist/entity-modeler.umd.cjs +41 -0
- package/dist/index.d.ts +32 -0
- package/dist/view/AssociationEdge.vue.d.ts +16 -0
- package/dist/view/DiagramCanvas.vue.d.ts +9 -0
- package/dist/view/DiagramExplorer.vue.d.ts +11 -0
- package/dist/view/EditModeToggle.vue.d.ts +10 -0
- package/dist/view/EditorToolbar.vue.d.ts +10 -0
- package/dist/view/EmContextMenu.vue.d.ts +26 -0
- package/dist/view/EmIcon.vue.d.ts +12 -0
- package/dist/view/EntityAttributesWide.vue.d.ts +7 -0
- package/dist/view/EntityBasicsSection.vue.d.ts +7 -0
- package/dist/view/EntityColumnsSection.vue.d.ts +7 -0
- package/dist/view/EntityDetailModal.vue.d.ts +7 -0
- package/dist/view/EntityIndexSection.vue.d.ts +7 -0
- package/dist/view/EntityIndexesWide.vue.d.ts +7 -0
- package/dist/view/EntityModeler.vue.d.ts +6 -0
- package/dist/view/EntityNode.vue.d.ts +20 -0
- package/dist/view/EntityOperationsSection.vue.d.ts +7 -0
- package/dist/view/EntityOperationsWide.vue.d.ts +7 -0
- package/dist/view/EntityTextPreview.vue.d.ts +5 -0
- package/dist/view/GroupCodeCombobox.vue.d.ts +11 -0
- package/dist/view/GroupNode.vue.d.ts +11 -0
- package/dist/view/InlineIssueBadge.vue.d.ts +8 -0
- package/dist/view/MultiLangTextField.vue.d.ts +24 -0
- package/dist/view/NoteConnectionEdge.vue.d.ts +12 -0
- package/dist/view/NoteNode.vue.d.ts +11 -0
- package/dist/view/OperationSourceEditor.vue.d.ts +7 -0
- package/dist/view/PropertyPanel.vue.d.ts +6 -0
- package/dist/view/ValidationPanel.vue.d.ts +6 -0
- package/dist/view/diagramGeometry.d.ts +9 -0
- package/dist/view/exportSvg.d.ts +7 -0
- package/dist/view/groupCodeFilter.d.ts +8 -0
- package/dist/view/groupHover.d.ts +10 -0
- package/dist/view/openEntityDetail.d.ts +5 -0
- package/dist/view/relationHighlight.d.ts +38 -0
- package/dist/view/swatches.d.ts +37 -0
- package/dist/view/useFloatingRoute.d.ts +28 -0
- package/dist/view/validationDisplay.d.ts +10 -0
- package/dist/view/waypointController.d.ts +14 -0
- package/package.json +61 -0
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { ComputedRef, InjectionKey, Ref } from 'vue';
|
|
2
|
+
import { EditorState } from '../command/types';
|
|
3
|
+
import { DiagramMeta } from '../adapter/diagramAdapter';
|
|
4
|
+
import { OpConflict } from '../command/op';
|
|
5
|
+
import { OpSyncTransport } from '../command/opSync';
|
|
6
|
+
import { ResolvedDiagram } from '../core/resolve';
|
|
7
|
+
import { RoutingMode } from '../core/routing';
|
|
8
|
+
import { ValidationIssue } from '../core/validation';
|
|
9
|
+
import { AssociationEnd, Attribute, DisplayMode, EmbeddableCatalog, Entity, EntityIndex, Geo, GroupCodeCatalog, LangCode, LogicalGroup, ModelId, Operation, Point, PredefinedCustomTypeCatalog } from '../core/types';
|
|
10
|
+
/** 엔티티 내부 속성을 가리키는 주소 원자 — 선택·컨텍스트·재정렬·연결 등 속성 단위 기능의 공통 참조점. */
|
|
11
|
+
export type AttrRef = {
|
|
12
|
+
entityId: ModelId;
|
|
13
|
+
attrId: ModelId;
|
|
14
|
+
};
|
|
15
|
+
/** 속성 행 클릭 시 수식어에 따른 선택 합성 방식 — 단일 진입점 selectAttribute의 디스패치 축. */
|
|
16
|
+
export type SelectMode = 'replace' | 'toggle' | 'range';
|
|
17
|
+
/**
|
|
18
|
+
* 복사/붙여넣기 클립보드 내용 — 선택 종류에 따라 엔티티 통째 또는 속성 집합.
|
|
19
|
+
* 단일 클립보드(마지막 copy가 덮어씀). 속성 variant는 출처 엔티티를 담지 않는다
|
|
20
|
+
* — 붙여넣기 대상은 paste 시점의 선택(현재 엔티티/부모)이 정하므로 출처 무관.
|
|
21
|
+
*/
|
|
22
|
+
export type ClipboardContent = {
|
|
23
|
+
kind: 'entity';
|
|
24
|
+
entity: Entity;
|
|
25
|
+
geo: Geo;
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'attribute';
|
|
28
|
+
attributes: Attribute[];
|
|
29
|
+
};
|
|
30
|
+
export type Selection = {
|
|
31
|
+
kind: 'entity' | 'association' | 'note' | 'group';
|
|
32
|
+
id: ModelId;
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'attribute';
|
|
35
|
+
entityId: ModelId;
|
|
36
|
+
ids: ModelId[];
|
|
37
|
+
anchor: ModelId;
|
|
38
|
+
} | null;
|
|
39
|
+
export interface EditorController {
|
|
40
|
+
state: EditorState;
|
|
41
|
+
resolved: ComputedRef<ResolvedDiagram>;
|
|
42
|
+
/**
|
|
43
|
+
* 설계 품질 검증 이슈(reactive 파생) — validateModel(state.logical). 순수 함수 + reactive state라
|
|
44
|
+
* 모델 변경 시 자동 재계산. 검증 패널과 인라인 배지가 공유하는 단일 출처(단일 호출).
|
|
45
|
+
*/
|
|
46
|
+
issues: ComputedRef<ValidationIssue[]>;
|
|
47
|
+
/**
|
|
48
|
+
* targetRef → 그 요소의 이슈 목록. 인라인 배지가 행 단위로 룩업해 최고 심각도를 표시한다.
|
|
49
|
+
* targetRef 없는 이슈(model 레벨)는 인덱스에서 제외(인라인 매칭 대상 아님).
|
|
50
|
+
*/
|
|
51
|
+
issuesByRef: ComputedRef<Map<ModelId, ValidationIssue[]>>;
|
|
52
|
+
/**
|
|
53
|
+
* CHK-DSN-3(모델링된 관계 없는 엔티티) 활성 토글 — 사용자가 검증 패널에서 켠다(기본 off).
|
|
54
|
+
* 비형식 FK 오탐 가능성이 있어 옵트인. read-only에서도 토글 가능(표시 제어라 editable 무관).
|
|
55
|
+
*/
|
|
56
|
+
flagEntitiesWithoutRelations: Ref<boolean>;
|
|
57
|
+
canUndo: Ref<boolean>;
|
|
58
|
+
canRedo: Ref<boolean>;
|
|
59
|
+
dirty: Ref<boolean>;
|
|
60
|
+
/**
|
|
61
|
+
* 편집 가능 여부 — false(조회 모드)면 모든 모델 변경(추가·삭제·이동·편집·재정렬·연결·붙여넣기·
|
|
62
|
+
* undo/redo·저장)이 차단된다. 선택·팬/줌·hover 강조·복사·export 같은 읽기성 동작은 유지.
|
|
63
|
+
* 모든 mutation이 거치는 run()/undo/redo 한 곳에서 차단하므로 데이터 안전의 최종 방어선이다.
|
|
64
|
+
* 호스트가 비관적 락 획득 후 setEditable(true)로 전환하는 진입점(락 미연동 시 순수 뷰 토글). 기본 true.
|
|
65
|
+
*/
|
|
66
|
+
editable: Ref<boolean>;
|
|
67
|
+
/** 조회/편집 전환. 편집 활성(true)은 op-mode에서만 유효 — 비-op doc은 무시(no-op). false는 항상 허용. */
|
|
68
|
+
setEditable(v: boolean): void;
|
|
69
|
+
/**
|
|
70
|
+
* 데이터 형태 세대(트랙 B 마커) — 1=legacy flat, 2=logical/layout(op API 대상). 부재 시 1.
|
|
71
|
+
* `fromPersisted`가 doc 마커에서 읽어 host가 meta로 주입.
|
|
72
|
+
*/
|
|
73
|
+
schemaVersion: Ref<number>;
|
|
74
|
+
/**
|
|
75
|
+
* op 쓰기 롤아웃 게이트(불변식: true ⟹ schemaVersion>=2). v2 && false면 read-only 프리즈(B-0-1) —
|
|
76
|
+
* 생성 시 editable=false로 연동. full-replace 폴백이 아니라 쓰기 kill-switch.
|
|
77
|
+
*/
|
|
78
|
+
opWriteEnabled: Ref<boolean>;
|
|
79
|
+
/**
|
|
80
|
+
* op-mode 활성 여부 — `schemaVersion>=2 && opWriteEnabled`. op emit(B-2)의 게이트로,
|
|
81
|
+
* 레거시 doc(v1)·read-only v2는 false. editable 게이트와 같은 단일 통과점 옆에 둔다(stack은 마커 무지).
|
|
82
|
+
*/
|
|
83
|
+
opMode: ComputedRef<boolean>;
|
|
84
|
+
/**
|
|
85
|
+
* 마지막 op 충돌(또는 전송 실패) — 어댑터 `onFreeze`가 채운다. null이면 정상. 충돌 시 `editable`이
|
|
86
|
+
* 함께 false로 내려가고(하드 프리즈), 호스트가 이 값으로 "다른 사용자가 변경함 — 새로고침" UX를 띄운 뒤
|
|
87
|
+
* `loadDiagram`으로 재적재하면 해소된다(B-5). op-mode가 아니면 항상 null.
|
|
88
|
+
*/
|
|
89
|
+
opConflict: Ref<OpConflict | null>;
|
|
90
|
+
/**
|
|
91
|
+
* 프리즈 후(또는 외부 변경 감지 시) 재적재 경로 — 호스트가 `fromPersisted`로 파싱한 state/meta를 주입한다
|
|
92
|
+
* (생성자와 대칭 시그니처). state를 in-place 교체하고 스택을 리셋하며, 마커(schemaVersion/opWriteEnabled/
|
|
93
|
+
* editable)를 재평가하고 op 어댑터를 재구성·재seed·재attach한다. undo 이력·선택·충돌 상태는 리셋된다.
|
|
94
|
+
*/
|
|
95
|
+
loadDiagram(state: EditorState, meta?: DiagramMeta): void;
|
|
96
|
+
/**
|
|
97
|
+
* 열린 coalesce 그룹(드래그 등)을 즉시 호스트로 내보내고 경계를 봉인한다. save·blur·beforeunload에서 호출.
|
|
98
|
+
* op-mode가 아니면 no-op. 전송 완료까지 기다리려면 이어서 `whenOpsSettled()`를 await.
|
|
99
|
+
*/
|
|
100
|
+
flush(): void;
|
|
101
|
+
/** op 큐가 비고 전송 중이 아닐 때 resolve(save 동기화·테스트용). op-mode가 아니면 즉시 resolve. */
|
|
102
|
+
whenOpsSettled(): Promise<void>;
|
|
103
|
+
displayMode: Ref<DisplayMode>;
|
|
104
|
+
/** 관계선 라우팅 모드 — 직선(기본) / 직각 */
|
|
105
|
+
routingMode: Ref<RoutingMode>;
|
|
106
|
+
/** 캔버스 그리드(배경 점) 표시 여부 — 시각 전용 환경설정 (영속·undo 대상 아님) */
|
|
107
|
+
showGrid: Ref<boolean>;
|
|
108
|
+
/** 미니맵 표시 여부 — 시각 전용 환경설정 (영속·undo 대상 아님) */
|
|
109
|
+
showMinimap: Ref<boolean>;
|
|
110
|
+
selection: Ref<Selection>;
|
|
111
|
+
/** 선택이 속성일 때 앵커(주 포커스) 속성 참조 (아니면 null). 다중선택 시 anchor를 가리킨다. */
|
|
112
|
+
selectedAttr: ComputedRef<AttrRef | null>;
|
|
113
|
+
/** 현재 속성 선택 집합의 속성 id 목록 (속성 선택이 아니면 빈 배열). 행 마커·배치 연산 대상. */
|
|
114
|
+
selectedAttrIds: ComputedRef<ModelId[]>;
|
|
115
|
+
/** Inspector가 비출 엔티티 id — 'entity'·'attribute' 선택 양쪽에서 해석. */
|
|
116
|
+
inspectedEntityId: ComputedRef<ModelId | null>;
|
|
117
|
+
/**
|
|
118
|
+
* 캔버스 속성 행 선택 (엔티티 통째가 아닌 행 단위 포커스).
|
|
119
|
+
* mode: replace=단일 교체(기본) / toggle=Ctrl 가감 / range=Shift 앵커~대상 범위.
|
|
120
|
+
* 단일 엔티티 스코프 — 현재 선택과 다른 엔티티를 가리키면 mode 무관하게 replace로 폴백.
|
|
121
|
+
*/
|
|
122
|
+
selectAttribute(entityId: ModelId, attributeId: ModelId, mode?: SelectMode): void;
|
|
123
|
+
/**
|
|
124
|
+
* 키보드 ↑/↓ — 속성 선택의 anchor를 표시 순서상 인접 속성으로 단일 이동(replace).
|
|
125
|
+
* attribute 선택이 아니면 false(미처리 → 호출부가 키를 소비하지 않음). 경계에서는 이동 없이 true.
|
|
126
|
+
*/
|
|
127
|
+
moveAttributeFocus(direction: 1 | -1): boolean;
|
|
128
|
+
/**
|
|
129
|
+
* 키보드 Alt+↑/↓ — 현재 속성 선택 집합을 한 칸 위/아래로 이동(reorderAttributes 위임, undo 원자).
|
|
130
|
+
* 다중선택 집합은 블록으로 묶여 이동. attribute 선택이 아니면 false. 경계에서는 이동 없이 true.
|
|
131
|
+
*/
|
|
132
|
+
nudgeSelectedAttributes(direction: 1 | -1): boolean;
|
|
133
|
+
/**
|
|
134
|
+
* 키보드 Delete/Backspace — 현재 선택을 삭제. 속성 선택은 집합 배치 삭제(undo 원자),
|
|
135
|
+
* 엔티티/노트/그룹/관계는 각 노드 삭제. 선택이 없으면 false(미처리).
|
|
136
|
+
*/
|
|
137
|
+
deleteSelection(): boolean;
|
|
138
|
+
/**
|
|
139
|
+
* 키보드 화살표 — 선택 노드(엔티티/노트/그룹, 다중 포함)를 dx/dy만큼 미세 이동(우리 명령으로 처리해
|
|
140
|
+
* state·undo 동기화). 그룹은 멤버·내부 waypoint 동반, 선택된 그룹의 멤버는 직접 이동에서 제외.
|
|
141
|
+
* 연속 호출은 같은 노드 집합이면 하나의 undo로 병합. 이동 대상이 없으면 false.
|
|
142
|
+
*/
|
|
143
|
+
nudgeNodes(nodeIds: ModelId[], dx: number, dy: number): boolean;
|
|
144
|
+
/**
|
|
145
|
+
* 캔버스 포커스 이동 요청 신호 — Diagram Explorer 등 외부에서 특정 노드로 센터링 요청.
|
|
146
|
+
* nonce는 동일 id를 연속 클릭해도 watch가 매번 발동하도록 하는 단조 증가 카운터.
|
|
147
|
+
*/
|
|
148
|
+
focusRequest: Ref<{
|
|
149
|
+
id: ModelId;
|
|
150
|
+
nonce: number;
|
|
151
|
+
} | null>;
|
|
152
|
+
requestFocus(id: ModelId): void;
|
|
153
|
+
undo(): void;
|
|
154
|
+
redo(): void;
|
|
155
|
+
markSaved(): void;
|
|
156
|
+
addEntity(name?: string, location?: Point): ModelId;
|
|
157
|
+
renameEntity(id: ModelId, name: string): void;
|
|
158
|
+
updateEntity(id: ModelId, patch: Partial<Entity>): void;
|
|
159
|
+
moveEntity(id: ModelId, location: Point): void;
|
|
160
|
+
/** 엔티티 크기 변경 — 콘텐츠 실측 최소 이하 클램프는 렌더(CSS min-content)가 담당 */
|
|
161
|
+
resizeEntity(id: ModelId, size: {
|
|
162
|
+
width: number;
|
|
163
|
+
height: number;
|
|
164
|
+
}): void;
|
|
165
|
+
removeEntity(id: ModelId): void;
|
|
166
|
+
/** 엔티티 헤더 바 색상 토큰 지정 (null이면 해제 → 기본 헤더) */
|
|
167
|
+
setEntitySwatch(id: ModelId, token: string | null): void;
|
|
168
|
+
/** 엔티티 접기/펼치기 — 접으면 헤더만 표시하고 속성/메서드 칸을 숨긴다 */
|
|
169
|
+
setEntityCollapsed(id: ModelId, collapsed: boolean): void;
|
|
170
|
+
/** 활성 다이어그램 전체 엔티티 접기/펼치기 — 사전 상태 캡처 단일 커맨드(1 undo 스텝) */
|
|
171
|
+
collapseAll(): void;
|
|
172
|
+
expandAll(): void;
|
|
173
|
+
/** 속성 강조 글자색 토큰 지정 (null이면 해제) */
|
|
174
|
+
setAttributeSwatch(entityId: ModelId, attributeId: ModelId, token: string | null): void;
|
|
175
|
+
/** 그룹 이동 — 그룹 박스 + 멤버 절대좌표를 한 명령(composite)으로 함께 갱신 */
|
|
176
|
+
dragGroup(groupId: ModelId, location: Point, members: {
|
|
177
|
+
id: ModelId;
|
|
178
|
+
location: Point;
|
|
179
|
+
}[]): void;
|
|
180
|
+
resizeGroup(groupId: ModelId, size: {
|
|
181
|
+
width: number;
|
|
182
|
+
height: number;
|
|
183
|
+
}): void;
|
|
184
|
+
/** 그룹 필드 부분 수정 (name·description·packageName·excludeDDLGeneration) */
|
|
185
|
+
updateGroup(groupId: ModelId, patch: Partial<LogicalGroup>): void;
|
|
186
|
+
/** 선택 엔티티들로 새 그룹 생성 (멤버 bbox에 박스 배치) */
|
|
187
|
+
createGroup(entityIds: ModelId[], name?: string): ModelId | null;
|
|
188
|
+
/** 빈 그룹 박스 생성 (이후 드래그로 엔티티 편입) */
|
|
189
|
+
addEmptyGroup(location: Point, name?: string): ModelId;
|
|
190
|
+
removeGroup(groupId: ModelId): void;
|
|
191
|
+
/** 엔티티 이동 + 컨테인먼트에 따른 그룹 편입/해제를 한 명령으로 */
|
|
192
|
+
dropEntity(entityId: ModelId, location: Point, targetGroupId: ModelId | null): void;
|
|
193
|
+
/** 엔티티를 현재 속한 그룹에서 제외 */
|
|
194
|
+
ungroupEntity(entityId: ModelId): void;
|
|
195
|
+
/**
|
|
196
|
+
* 노트 이동 + 컨테인먼트에 따른 그룹 편입/해제를 한 명령으로 (dropEntity 거울).
|
|
197
|
+
* 멤버십 조회/기록 대상이 논리(memberEntityRefs)가 아닌 레이아웃(GroupLayout.memberNoteRefs).
|
|
198
|
+
*/
|
|
199
|
+
dropNote(noteId: ModelId, location: Point, targetGroupId: ModelId | null): void;
|
|
200
|
+
/**
|
|
201
|
+
* Predefined 임베더블 카탈로그(호스트 주입). 신규 EMBED_PREDEF 삽입 메뉴·빈 슬롯 표시 폴백의 소스.
|
|
202
|
+
* dev는 프리셋을 주입하고, 완전 통합 시 호스트가 embeddableCatalog API 값을 주입한다. 비어 있으면
|
|
203
|
+
* predefined 삽입 메뉴가 노출되지 않는다(기능 게이트).
|
|
204
|
+
*/
|
|
205
|
+
embeddableCatalog: Ref<EmbeddableCatalog>;
|
|
206
|
+
/** 카탈로그 교체(호스트 props 갱신·dev 토글). reactive하므로 메뉴·폴백이 즉시 반영된다. */
|
|
207
|
+
setEmbeddableCatalog(catalog: EmbeddableCatalog): void;
|
|
208
|
+
/**
|
|
209
|
+
* 공통 코드 그룹 카탈로그(호스트 주입). 속성 groupCode 선택 드롭다운의 소스.
|
|
210
|
+
* embeddableCatalog와 동형 — dev는 프리셋, 완전 통합 시 호스트가 systemCode API 값을 주입한다.
|
|
211
|
+
* 비어 있으면 groupCode 드롭다운이 노출되지 않는다(기능 게이트).
|
|
212
|
+
*/
|
|
213
|
+
groupCodeCatalog: Ref<GroupCodeCatalog>;
|
|
214
|
+
/** 카탈로그 교체(호스트 props 갱신·dev 토글). reactive하므로 드롭다운이 즉시 반영된다. */
|
|
215
|
+
setGroupCodeCatalog(catalog: GroupCodeCatalog): void;
|
|
216
|
+
/**
|
|
217
|
+
* Predefined customtype 카탈로그(호스트 주입). 속성 타입 셀렉트에 병합 노출할 ③ 단일 컬럼 커스텀 타입의
|
|
218
|
+
* 소스. embeddableCatalog와 동형 — dev는 프리셋, 완전 통합 시 호스트가 프레임워크 공통분 + 프로젝트별
|
|
219
|
+
* 추가분을 주입한다. 비어 있으면 셀렉트에 추가 옵션이 노출되지 않는다(inert).
|
|
220
|
+
*/
|
|
221
|
+
predefinedCustomTypeCatalog: Ref<PredefinedCustomTypeCatalog>;
|
|
222
|
+
/** 카탈로그 교체(호스트 props 갱신·dev 토글). reactive하므로 셀렉트가 즉시 반영된다. */
|
|
223
|
+
setPredefinedCustomTypeCatalog(catalog: PredefinedCustomTypeCatalog): void;
|
|
224
|
+
/**
|
|
225
|
+
* 입력 가능 언어셋(호스트 주입) — 다국어 텍스트(설명·논리명·그룹명) 편집 UI가 노출할 언어 탭 목록·순서.
|
|
226
|
+
* 비어 있으면 안 되며(입력 불가) 미주입 시 기본 4언어(ko/en/ja/zh). reactive하므로 .value 갱신 시 즉시 반영.
|
|
227
|
+
* MultiLangText 키의 부분집합/순서만 — 키 자체 확장(타입·직렬화 영향)은 범위 밖.
|
|
228
|
+
*/
|
|
229
|
+
languages: Ref<LangCode[]>;
|
|
230
|
+
/**
|
|
231
|
+
* 접속 유저의 언어(호스트 주입) — 다국어 편집 UI의 초기 활성 탭. languages에 없으면 컴포넌트가
|
|
232
|
+
* languages[0]로 폴백. 미주입 시 'ko'. 라벨 우선 표시 등 확장 여지의 기준점.
|
|
233
|
+
*/
|
|
234
|
+
userLanguage: Ref<LangCode>;
|
|
235
|
+
/**
|
|
236
|
+
* dataType 셀렉트 후보 셋(CHK-TYPE-1과 공유하는 단일 출처) — dataType 드롭다운(dbTypeSelectItems)이
|
|
237
|
+
* 이 값을 후보로 쓴다. 검증 ctx.selectableDataTypes와 같은 ref라 어포던스(드롭다운)·검증이 어긋나지
|
|
238
|
+
* 않는다. 미주입(undefined)이면 드롭다운은 코어 SELECTABLE_DATA_TYPES로 폴백하고 CHK-TYPE-1은 skip.
|
|
239
|
+
*/
|
|
240
|
+
selectableDataTypes: Ref<ReadonlySet<string> | undefined>;
|
|
241
|
+
/**
|
|
242
|
+
* Predefined 임베더블 삽입 — 카탈로그에서 embeddableType 항목을 찾아 EMBED_PREDEF 속성을 추가한다.
|
|
243
|
+
* dbAttr 슬롯은 레거시 `initAttributeDatabaseAttribute` 동형으로 **빈 골격**(physicalName/dataType
|
|
244
|
+
* 미설정)만 시드하고, 표시·저장 시 카탈로그 메타모델로 폴백한다(`SVG:976` 대응). 참조가 아니므로
|
|
245
|
+
* association은 만들지 않는다(entity.attributes 직접 보유 — 레거시 NORMAL 부류). 카탈로그에 없거나
|
|
246
|
+
* 대상 엔티티가 없으면 no-op(undefined).
|
|
247
|
+
*/
|
|
248
|
+
addPredefinedEmbed(entityId: ModelId, embeddableType: string): ModelId | undefined;
|
|
249
|
+
addAttribute(entityId: ModelId, partial?: Partial<Attribute>): ModelId;
|
|
250
|
+
/**
|
|
251
|
+
* 시각 구획 행(DIVIDER) 추가 — 거대 엔티티에서 속성 묶음을 끊는 구분선. DB 컬럼·타입·식별자 없이
|
|
252
|
+
* 말미에 추가되며(이후 grip 드래그로 위치 조정), `name`은 선택적 섹션 라벨. divider 기본값을 단일
|
|
253
|
+
* 출처로 보장하려고 addAttribute에 위임한다.
|
|
254
|
+
*/
|
|
255
|
+
addDivider(entityId: ModelId): ModelId;
|
|
256
|
+
updateAttribute(entityId: ModelId, attributeId: ModelId, patch: Partial<Attribute>): void;
|
|
257
|
+
/**
|
|
258
|
+
* ⑤ 파생 타입 결합 — 속성 groupCode를 설정/해제하며 type을 동반 조정한다(레거시 정합).
|
|
259
|
+
* groupCode 지정 시 type=GroupCodeEnum(파생), 해제 시 기본 스칼라(String)로 환원. 이 불변식을
|
|
260
|
+
* 단일 출처로 보장해 어느 진입점(인스펙터·와이드·향후 메뉴/op)에서 호출해도 일관되게 한다.
|
|
261
|
+
* 저수준 updateAttribute는 op-replay·undo 경로를 공유하므로 이 강제를 박지 않는다(역연산 보존).
|
|
262
|
+
*/
|
|
263
|
+
setAttributeGroupCode(entityId: ModelId, attributeId: ModelId, groupCode: string | undefined): void;
|
|
264
|
+
/**
|
|
265
|
+
* 펼친 임베드(EMBED_OWN/EMBED_PREDEF) 컬럼 묶음을 교체한다(@AttributeOverride 편집). EMBED_OWN이
|
|
266
|
+
* 로드 출신(association end에 legacyEmbedRaw verbatim 스냅샷 보유)이면 그 스냅샷을 함께 폐기해 저장이
|
|
267
|
+
* 마커-재구성(assocToEmbed, source 대비 override diff) 경로로 승격되게 한다 — 안 그러면 assocTo가
|
|
268
|
+
* 원본을 verbatim 환원해 컬럼 편집이 소실된다. EMBED_PREDEF는 association이 없어 컬럼 교체만 수행.
|
|
269
|
+
* 스냅샷 폐기와 컬럼 교체는 한 composite로 묶어 undo 원자성을 보장한다.
|
|
270
|
+
*/
|
|
271
|
+
setEmbedColumns(entityId: ModelId, attributeId: ModelId, dbAttrs: Attribute['dbAttrs']): void;
|
|
272
|
+
removeAttribute(entityId: ModelId, attributeId: ModelId): void;
|
|
273
|
+
/** 여러 속성을 한 명령(composite)으로 삭제 — 다중선택 배치 삭제의 undo 원자성 보장. */
|
|
274
|
+
removeAttributes(entityId: ModelId, attributeIds: ModelId[]): void;
|
|
275
|
+
/** 여러 속성에 같은 강조 색 토큰을 한 명령으로 지정 (null이면 해제) — 다중선택 배치 색상. */
|
|
276
|
+
setAttributeSwatches(entityId: ModelId, attributeIds: ModelId[], token: string | null): void;
|
|
277
|
+
/**
|
|
278
|
+
* 속성 행 재정렬 — 대상(attrIds)을 표시 순서 유지한 채 toIndex로 이동(단일 명령, undo 원자).
|
|
279
|
+
* toIndex = 대상 제거 후 배열(rest) 기준 삽입 위치. 다중선택 집합 동반 이동 시 집합 전체 전달.
|
|
280
|
+
*/
|
|
281
|
+
reorderAttributes(entityId: ModelId, attrIds: ModelId[], toIndex: number): void;
|
|
282
|
+
addIndex(entityId: ModelId, index: EntityIndex): void;
|
|
283
|
+
updateIndex(entityId: ModelId, indexId: ModelId, patch: Partial<EntityIndex>): void;
|
|
284
|
+
removeIndex(entityId: ModelId, indexId: ModelId): void;
|
|
285
|
+
/** 메서드(operation) 추가 — 신규는 visibility=PACKAGE, order=말미. 생성된 modelId 반환. */
|
|
286
|
+
addOperation(entityId: ModelId, partial?: Partial<Operation>): ModelId;
|
|
287
|
+
updateOperation(entityId: ModelId, operationId: ModelId, patch: Partial<Operation>): void;
|
|
288
|
+
removeOperation(entityId: ModelId, operationId: ModelId): void;
|
|
289
|
+
/** 메서드 행 재정렬 — toIndex = 대상 제거 후 배열 기준 삽입 위치(단일 명령, undo 원자). */
|
|
290
|
+
reorderOperations(entityId: ModelId, operationIds: ModelId[], toIndex: number): void;
|
|
291
|
+
/** 메서드 강조 색 토큰 지정 (null이면 해제). */
|
|
292
|
+
setOperationSwatch(entityId: ModelId, operationId: ModelId, token: string | null): void;
|
|
293
|
+
addAssociation(sourceEntityId: ModelId, targetEntityId: ModelId, sourceColumnRef?: ModelId, targetColumnRef?: ModelId): ModelId;
|
|
294
|
+
/**
|
|
295
|
+
* 임베드 생성 — 소유자에 EMBED_OWN 표시 속성을 물질화(임베더블 source 컬럼 복사 + `embedded` 마커)하고
|
|
296
|
+
* EMBED association(owner EXACTLY_ONE / embeddable EXACTLY_ONE+composition)을 한 composite로 추가한다.
|
|
297
|
+
* 가드(결정 2 단일): 대상이 JPA_EMBEDDABLE이 아니거나 소유자가 이미 그 임베더블을 임베드했으면 no-op.
|
|
298
|
+
* 반환은 생성된 association id, 가드 차단 시 undefined.
|
|
299
|
+
*/
|
|
300
|
+
addEmbedAssociation(ownerEntityId: ModelId, embeddableEntityId: ModelId): ModelId | undefined;
|
|
301
|
+
/**
|
|
302
|
+
* 임베드 단일(`@Embedded`)↔컬렉션(`@ElementCollection`) 모드 토글. 컬렉션 판정 권위는 임베더블
|
|
303
|
+
* end multiplicity(결정 3)이며, 이 intent가 multiplicity 변경 + 표시 속성 평탄화 컬럼 재구성 +
|
|
304
|
+
* collection 메타 set/clear를 **한 composite**로 묶어 모순 상태(컬렉션인데 평탄화 컬럼 잔존)를
|
|
305
|
+
* 구조적으로 차단한다. COLLECTION→SINGLE 복귀 시 owner 슬롯 `@AttributeOverride`는 버린다(결정 3,
|
|
306
|
+
* load-only 철학). assocId가 EMBED association이 아니거나 이미 해당 mode면 no-op.
|
|
307
|
+
*/
|
|
308
|
+
setEmbedCollectionMode(assocId: ModelId, mode: 'SINGLE' | 'COLLECTION'): void;
|
|
309
|
+
removeAssociation(assocId: ModelId): void;
|
|
310
|
+
/**
|
|
311
|
+
* 식별 관계 토글 — 자식 FK의 identifier 플래그를 동기화하고, 식별자 집합 변동이
|
|
312
|
+
* 후손으로 번지면 연쇄 reconcile까지 한 composite로 묶는다(undo/redo 원자).
|
|
313
|
+
* self 관계는 엔진이 비식별을 강제(INV-3)하므로 토글해도 FK는 비식별로 유지된다.
|
|
314
|
+
*/
|
|
315
|
+
setAssociationIdentifying(assocId: ModelId, identifying: boolean): void;
|
|
316
|
+
updateAssociationEnd(assocId: ModelId, which: 'end1' | 'end2', patch: Partial<AssociationEnd>): void;
|
|
317
|
+
moveWaypoint(assocId: ModelId, index: number, point: Point): void;
|
|
318
|
+
addWaypoint(assocId: ModelId, index: number, point: Point): void;
|
|
319
|
+
removeWaypoint(assocId: ModelId, index: number): void;
|
|
320
|
+
clearWaypoints(assocId: ModelId): void;
|
|
321
|
+
addNote(memo?: string, location?: Point): ModelId;
|
|
322
|
+
removeNote(noteId: ModelId): void;
|
|
323
|
+
moveNote(noteId: ModelId, location: Point): void;
|
|
324
|
+
resizeNote(noteId: ModelId, size: {
|
|
325
|
+
width: number;
|
|
326
|
+
height: number;
|
|
327
|
+
}): void;
|
|
328
|
+
setNoteMemo(noteId: ModelId, memo: string): void;
|
|
329
|
+
/** 노트 → 대상(엔티티) 연결선 추가/삭제 + 꺾은점 편집 */
|
|
330
|
+
addNoteConnection(noteId: ModelId, targetRef: ModelId): void;
|
|
331
|
+
removeNoteConnection(noteId: ModelId, targetRef: ModelId): void;
|
|
332
|
+
moveNoteConnectionWaypoint(noteId: ModelId, targetRef: ModelId, index: number, point: Point): void;
|
|
333
|
+
addNoteConnectionWaypoint(noteId: ModelId, targetRef: ModelId, index: number, point: Point): void;
|
|
334
|
+
removeNoteConnectionWaypoint(noteId: ModelId, targetRef: ModelId, index: number): void;
|
|
335
|
+
clearNoteConnectionWaypoints(noteId: ModelId, targetRef: ModelId): void;
|
|
336
|
+
/** 겹침 해소 자동 배치 (그룹 멤버는 박스 안, 미그룹은 아래 격자) */
|
|
337
|
+
autoLayout(): void;
|
|
338
|
+
/**
|
|
339
|
+
* 복사/붙여넣기 클립보드. 엔티티 선택 → 엔티티 통째(새 modelId·offset),
|
|
340
|
+
* 속성 선택 → 선택 집합(붙여넣기는 현재 선택 엔티티/부모에 append, 동명 충돌 시 _copy).
|
|
341
|
+
*/
|
|
342
|
+
clipboard: Ref<ClipboardContent | null>;
|
|
343
|
+
copy(): void;
|
|
344
|
+
paste(): void;
|
|
345
|
+
}
|
|
346
|
+
export declare const EDITOR: InjectionKey<EditorController>;
|
|
347
|
+
export declare function emptyState(modelId?: string, diagramId?: string): EditorState;
|
|
348
|
+
export declare function createEditorController(initial?: EditorState, options?: {
|
|
349
|
+
embeddableCatalog?: EmbeddableCatalog;
|
|
350
|
+
groupCodeCatalog?: GroupCodeCatalog;
|
|
351
|
+
predefinedCustomTypeCatalog?: PredefinedCustomTypeCatalog;
|
|
352
|
+
languages?: LangCode[];
|
|
353
|
+
userLanguage?: LangCode;
|
|
354
|
+
/** `fromPersisted` 산출 meta(트랙 B 마커 + revSeed). schemaVersion·opWriteEnabled로 opMode·read-only 판정. */
|
|
355
|
+
meta?: DiagramMeta;
|
|
356
|
+
/**
|
|
357
|
+
* 호스트 op 서비스로 배치를 보내는 transport(`applyEntityDiagramOps` fetch 래퍼). op-mode + 주입 시에만
|
|
358
|
+
* 어댑터가 활성(미주입 = dev/test → 어댑터 비활성, full-replace 저장 경로 유지).
|
|
359
|
+
*/
|
|
360
|
+
opTransport?: OpSyncTransport;
|
|
361
|
+
/**
|
|
362
|
+
* 검증 컨텍스트 — 카탈로그/정책 의존 규칙을 깨우는 호스트 주입(미주입 시 해당 규칙 skip).
|
|
363
|
+
* selectableDataTypes(CHK-TYPE-1)는 코어 상수(SELECTABLE_DATA_TYPES)라 dev/호스트가 즉시 주입 가능.
|
|
364
|
+
* reservedWords(CHK-NAME-6)·largeEntityThreshold(CHK-DSN-4)는 다이얼렉트·정책 의존이라 호스트 통합 시 주입(현재 보류).
|
|
365
|
+
*/
|
|
366
|
+
reservedWords?: ReadonlySet<string>;
|
|
367
|
+
selectableDataTypes?: ReadonlySet<string>;
|
|
368
|
+
largeEntityThreshold?: number;
|
|
369
|
+
/** CHK-DSN-3 초기 활성 여부 — 기본 false. 런타임은 flagEntitiesWithoutRelations로 사용자가 토글. */
|
|
370
|
+
flagEntitiesWithoutRelations?: boolean;
|
|
371
|
+
}): EditorController;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--em-surface: #fff;--em-surface-sunken: #f8fafc;--em-on-surface: #0f172a;--em-on-surface-muted: #64748b;--em-on-surface-faint: #94a3b8;--em-on-surface-disabled: #cbd5e1;--em-border: #e2e8f0;--em-border-strong: #cbd5e1;--em-node-border: #94a3b8;--em-accent: #0d9488;--em-accent-soft: #2dd4bf;--em-selection: #7c3aed;--em-selection-soft: #f3effe;--em-embed-fill: rgba(100, 116, 139, .07);--em-header-default: #1e293b;--em-on-header: #fff;--em-pk: #d97706;--em-fk: #64748b;--em-shadow: 0 1px 3px rgb(0 0 0 / .12);--em-glow-hover: 0 0 0 1.5px rgb(13 148 136 / .55), 0 6px 20px rgb(13 148 136 / .22), 0 2px 6px rgb(0 0 0 / .1);--em-glow-related: 0 0 0 1.5px rgb(45 212 191 / .45), 0 3px 12px rgb(45 212 191 / .16), 0 1px 3px rgb(0 0 0 / .1);--em-on-surface-strong: #334155;--em-surface-raised: #f1f5f9;--em-danger: #dc2626;--em-warn: #d97706;--em-error: #dc2626;--em-info: #2563eb;--em-accent-subtle: #ccfbf1;--em-note-surface: #fef9c3;--em-note-border: #fde047;--em-note-on-surface: #422006;--em-note-accent: #f59e0b;--em-note-accent-strong: #d97706;--em-note-glow-hover: 0 0 0 1.5px rgb(217 119 6 / .55), 0 6px 20px rgb(217 119 6 / .22), 0 2px 6px rgb(0 0 0 / .1);--em-note-glow-related: 0 0 0 1.5px rgb(245 158 11 / .45), 0 3px 12px rgb(245 158 11 / .16), 0 1px 3px rgb(0 0 0 / .1);--em-group-fill: rgb(148 163 184 / .06);--em-group-label-bg: rgb(148 163 184 / .18);--em-group-hover-fill: rgb(13 148 136 / .06);--em-group-active-fill: rgb(13 148 136 / .1);--em-group-glow-hover: 0 0 0 1px rgb(13 148 136 / .3), 0 6px 20px rgb(13 148 136 / .12);--em-group-glow-drop: 0 0 0 3px rgb(13 148 136 / .25);--em-canvas-bg: #fff;--em-note-soft: #fcd34d;--em-minimap-bg: linear-gradient(160deg, rgba(255, 255, 255, .82), rgba(241, 245, 249, .72));--em-minimap-border: rgba(226, 232, 240, .8);--em-minimap-mask: rgba(248, 250, 252, .55);--em-mm-entity: #9aa8bd;--em-mm-group: rgba(148, 163, 184, .16);--em-swatch-red-bar: #dc2626;--em-swatch-red-on: #fff;--em-swatch-red-text: #b91c1c;--em-swatch-amber-bar: #d97706;--em-swatch-amber-on: #fff;--em-swatch-amber-text: #b45309;--em-swatch-green-bar: #16a34a;--em-swatch-green-on: #fff;--em-swatch-green-text: #15803d;--em-swatch-teal-bar: #0d9488;--em-swatch-teal-on: #fff;--em-swatch-teal-text: #0f766e;--em-swatch-blue-bar: #2563eb;--em-swatch-blue-on: #fff;--em-swatch-blue-text: #1d4ed8;--em-swatch-indigo-bar: #4f46e5;--em-swatch-indigo-on: #fff;--em-swatch-indigo-text: #4338ca;--em-swatch-violet-bar: #7c3aed;--em-swatch-violet-on: #fff;--em-swatch-violet-text: #6d28d9;--em-swatch-pink-bar: #db2777;--em-swatch-pink-on: #fff;--em-swatch-pink-text: #be185d}[data-theme=dark]{--em-surface: #27272a;--em-surface-sunken: #18181b;--em-on-surface: #e4e4e7;--em-on-surface-muted: #a1a1aa;--em-on-surface-faint: #71717a;--em-on-surface-disabled: #52525b;--em-border: #3f3f46;--em-border-strong: #52525b;--em-node-border: #52525b;--em-accent: #2dd4bf;--em-accent-soft: #5eead4;--em-selection: #a78bfa;--em-selection-soft: #2e2748;--em-embed-fill: rgba(255, 255, 255, .045);--em-header-default: #18181b;--em-on-header: #e4e4e7;--em-pk: #fbbf24;--em-fk: #94a3b8;--em-shadow: 0 1px 3px rgb(0 0 0 / .4);--em-glow-hover: 0 0 0 1.5px rgb(45 212 191 / .7), 0 6px 20px rgb(45 212 191 / .3), 0 2px 6px rgb(0 0 0 / .5);--em-glow-related: 0 0 0 1.5px rgb(94 234 212 / .55), 0 3px 12px rgb(94 234 212 / .22), 0 1px 3px rgb(0 0 0 / .5);--em-on-surface-strong: #d4d4d8;--em-surface-raised: #18181b;--em-danger: #f87171;--em-warn: #fbbf24;--em-error: #f87171;--em-info: #60a5fa;--em-accent-subtle: #134e4a;--em-note-surface: #422006;--em-note-border: #854d0e;--em-note-on-surface: #fde68a;--em-note-accent: #fbbf24;--em-note-accent-strong: #f59e0b;--em-note-glow-hover: 0 0 0 1.5px rgb(251 191 36 / .6), 0 6px 20px rgb(251 191 36 / .28), 0 2px 6px rgb(0 0 0 / .5);--em-note-glow-related: 0 0 0 1.5px rgb(245 158 11 / .5), 0 3px 12px rgb(245 158 11 / .22), 0 1px 3px rgb(0 0 0 / .5);--em-group-fill: rgb(161 161 170 / .1);--em-group-label-bg: rgb(161 161 170 / .24);--em-group-hover-fill: rgb(45 212 191 / .1);--em-group-active-fill: rgb(45 212 191 / .16);--em-group-glow-hover: 0 0 0 1px rgb(45 212 191 / .4), 0 6px 20px rgb(45 212 191 / .18);--em-group-glow-drop: 0 0 0 3px rgb(45 212 191 / .3);--em-canvas-bg: #18181b;--em-note-soft: #fbbf24;--em-minimap-bg: linear-gradient(160deg, rgba(39, 39, 42, .82), rgba(24, 24, 27, .72));--em-minimap-border: rgba(63, 63, 70, .6);--em-minimap-mask: rgba(24, 24, 27, .6);--em-mm-entity: #a1a1aa;--em-mm-group: rgba(161, 161, 170, .22);--bs-body-bg: var(--em-surface);--bs-body-text: var(--em-on-surface);--bs-input-bg: var(--em-surface);--bs-input-text: var(--em-on-surface);--bs-input-border: var(--em-border-strong);--bs-input-placeholder: var(--em-on-surface-faint);--bs-select-bg: var(--em-surface);--bs-select-text: var(--em-on-surface);--bs-select-border: var(--em-border-strong);--bs-color-hover: var(--em-surface-sunken);--bs-input-affix-bg: var(--em-surface-sunken);--bs-input-affix-text: var(--em-on-surface);--bs-input-disabled-bg: var(--em-surface-sunken);--bs-input-disabled-text: var(--em-on-surface-faint);--bs-input-disabled-border: var(--em-border);--bs-select-placeholder: var(--em-on-surface-faint);--bs-select-disabled-bg: var(--em-surface-sunken);--bs-select-disabled-text: var(--em-on-surface-faint);--bs-select-disabled-border: var(--em-border);--bs-check-icon-color: var(--em-on-surface);--bs-check-icon-hover: var(--em-on-surface-muted);--bs-check-icon-disabled: var(--em-on-surface-faint);--bs-radio-switch-bg: var(--em-surface);--bs-radio-switch-active-bg: var(--em-accent);--bs-radio-switch-inactive-text: var(--em-on-surface-muted);--bs-radio-switch-disabled-bg: var(--em-border);--bs-radio-button-text: var(--em-on-surface);--bs-radio-button-border: var(--em-border-strong);--bs-radio-button-active-bg: var(--em-accent);--bs-radio-button-active-border: var(--em-accent);--bs-popup-bg: var(--em-surface);--bs-popup-border: var(--em-border-strong);--bs-popup-shadow: var(--em-shadow);--bs-context-menu-bg: var(--em-surface);--bs-context-menu-text: var(--em-on-surface);--bs-context-menu-border: var(--em-border-strong);--bs-context-menu-item-hover-bg: var(--em-surface-sunken);--bs-context-menu-separator: var(--em-border);--bs-context-menu-shadow: var(--em-shadow);--bs-card-bg: var(--em-surface);--bs-card-border: var(--em-border);--bs-card-header-bg: var(--em-surface-sunken);--bs-card-header-text: var(--em-on-surface);--bs-modal-bg: var(--em-surface);--bs-modal-text: var(--em-on-surface);--bs-notification-bg: var(--em-surface);--bs-notification-text: var(--em-on-surface);--bs-page-nav-button-text: var(--em-on-surface);--bs-page-nav-button-hover-bg: var(--em-surface-sunken);--bs-date-input-bg: var(--em-surface);--bs-date-input-text: var(--em-on-surface);--bs-date-input-border: var(--em-border-strong);--bs-calendar-bg: var(--em-surface);--bs-calendar-text: var(--em-on-surface);--bs-calendar-today-bg: var(--em-surface-sunken);--bs-calendar-disabled-bg: var(--em-surface-sunken);--bs-calendar-weekdays-border: var(--em-border);--bs-calendar-time-bg: var(--em-surface-sunken);--em-swatch-red-bar: #ef4444;--em-swatch-red-on: #450a0a;--em-swatch-red-text: #fca5a5;--em-swatch-amber-bar: #f59e0b;--em-swatch-amber-on: #451a03;--em-swatch-amber-text: #fcd34d;--em-swatch-green-bar: #22c55e;--em-swatch-green-on: #052e16;--em-swatch-green-text: #86efac;--em-swatch-teal-bar: #14b8a6;--em-swatch-teal-on: #042f2e;--em-swatch-teal-text: #5eead4;--em-swatch-blue-bar: #3b82f6;--em-swatch-blue-on: #0a1c44;--em-swatch-blue-text: #93c5fd;--em-swatch-indigo-bar: #6366f1;--em-swatch-indigo-on: #1e1b4b;--em-swatch-indigo-text: #a5b4fc;--em-swatch-violet-bar: #8b5cf6;--em-swatch-violet-on: #2e1065;--em-swatch-violet-text: #c4b5fd;--em-swatch-pink-bar: #ec4899;--em-swatch-pink-on: #500724;--em-swatch-pink-text: #f9a8d4}[data-theme=dark] .modal-panel{background:var(--em-surface);color:var(--em-on-surface)}.vue-flow{position:relative;width:100%;height:100%;overflow:hidden;z-index:0;direction:ltr}.vue-flow__container{position:absolute;height:100%;width:100%;left:0;top:0}.vue-flow__pane{z-index:1}.vue-flow__pane.draggable{cursor:grab}.vue-flow__pane.selection{cursor:pointer}.vue-flow__pane.dragging{cursor:grabbing}.vue-flow__transformationpane{transform-origin:0 0;z-index:2;pointer-events:none}.vue-flow__viewport{z-index:4;overflow:clip}.vue-flow__selection{z-index:6}.vue-flow__edge-labels{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible{outline:none}.vue-flow .vue-flow__edges{pointer-events:none;overflow:visible}.vue-flow__edge-path,.vue-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.vue-flow__edge{pointer-events:visibleStroke;cursor:pointer}.vue-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__edge.animated path.vue-flow__edge-interaction{stroke-dasharray:none;animation:none}.vue-flow__edge.inactive{pointer-events:none}.vue-flow__edge.selected,.vue-flow__edge:focus,.vue-flow__edge:focus-visible{outline:none}.vue-flow__edge.selected .vue-flow__edge-path,.vue-flow__edge:focus .vue-flow__edge-path,.vue-flow__edge:focus-visible .vue-flow__edge-path{stroke:#555}.vue-flow__edge-textwrapper{pointer-events:all}.vue-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__connection{pointer-events:none}.vue-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__connectionline{z-index:1001}.vue-flow__nodes{pointer-events:none;transform-origin:0 0}.vue-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.vue-flow__node.draggable{cursor:grab;pointer-events:all}.vue-flow__node.draggable.dragging{cursor:grabbing}.vue-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.vue-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.vue-flow__nodesselection-rect.dragging{cursor:grabbing}.vue-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px}.vue-flow__handle.connectable{pointer-events:all;cursor:crosshair}.vue-flow__handle-bottom{left:50%;bottom:0;transform:translate(-50%,50%)}.vue-flow__handle-top{left:50%;top:0;transform:translate(-50%,-50%)}.vue-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.vue-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.vue-flow__edgeupdater{cursor:move;pointer-events:all}.vue-flow__panel{position:absolute;z-index:5;margin:15px}.vue-flow__panel.top{top:0}.vue-flow__panel.bottom{bottom:0}.vue-flow__panel.left{left:0}.vue-flow__panel.right{right:0}.vue-flow__panel.center{left:50%;transform:translate(-50%)}@keyframes dashdraw{0%{stroke-dashoffset:10}}:root{--vf-node-bg: #fff;--vf-node-text: #222;--vf-connection-path: #b1b1b7;--vf-handle: #555}.vue-flow__edge.updating .vue-flow__edge-path{stroke:#777}.vue-flow__edge-text{font-size:10px}.vue-flow__edge-textbg{fill:#fff}.vue-flow__connection-path{stroke:var(--vf-connection-path)}.vue-flow__node{cursor:grab}.vue-flow__node.selectable:focus,.vue-flow__node.selectable:focus-visible{outline:none}.vue-flow__node-default,.vue-flow__node-input,.vue-flow__node-output{padding:10px;border-radius:3px;width:150px;font-size:12px;text-align:center;border-width:1px;border-style:solid;color:var(--vf-node-text);background-color:var(--vf-node-bg);border-color:var(--vf-node-color)}.vue-flow__node-default.selected,.vue-flow__node-default.selected:hover,.vue-flow__node-input.selected,.vue-flow__node-input.selected:hover,.vue-flow__node-output.selected,.vue-flow__node-output.selected:hover{box-shadow:0 0 0 .5px var(--vf-box-shadow)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible,.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible,.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid #555}.vue-flow__node-default .vue-flow__handle,.vue-flow__node-input .vue-flow__handle,.vue-flow__node-output .vue-flow__handle{background:var(--vf-handle)}.vue-flow__node-default.selectable:hover,.vue-flow__node-input.selectable:hover,.vue-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.vue-flow__node-input{--vf-node-color: var(--vf-node-color, #0041d0);--vf-handle: var(--vf-node-color, #0041d0);--vf-box-shadow: var(--vf-node-color, #0041d0);background:var(--vf-node-bg);border-color:var(--vf-node-color, #0041d0)}.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible{outline:none;border:1px solid var(--vf-node-color, #0041d0)}.vue-flow__node-default{--vf-handle: var(--vf-node-color, #1a192b);--vf-box-shadow: var(--vf-node-color, #1a192b);background:var(--vf-node-bg);border-color:var(--vf-node-color, #1a192b)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible{outline:none;border:1px solid var(--vf-node-color, #1a192b)}.vue-flow__node-output{--vf-handle: var(--vf-node-color, #ff0072);--vf-box-shadow: var(--vf-node-color, #ff0072);background:var(--vf-node-bg);border-color:var(--vf-node-color, #ff0072)}.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid var(--vf-node-color, #ff0072)}.vue-flow__nodesselection-rect,.vue-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible,.vue-flow__selection:focus,.vue-flow__selection:focus-visible{outline:none}.vue-flow__handle{width:6px;height:6px;background:var(--vf-handle);border:1px solid #fff;border-radius:100%}.vue-flow__controls{box-shadow:0 0 2px 1px #00000014}.vue-flow__controls-button{background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:5px}.vue-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.vue-flow__controls-button:hover{background:#f4f4f4}.vue-flow__controls-button:disabled{pointer-events:none}.vue-flow__controls-button:disabled svg{fill-opacity:.4}.vue-flow__minimap{background-color:#fff}.vue-flow__minimap.pannable{cursor:grab}.vue-flow__minimap.dragging{cursor:grabbing}.vue-flow__minimap-mask.pannable{cursor:grab}.vue-flow__nodesselection-rect{display:none}.vue-flow__selection{background:color-mix(in srgb,var(--em-selection) 10%,transparent);border:1px dashed var(--em-selection)}.em-icon[data-v-b5f4c4ba]{display:block;flex:0 0 auto}.em-inline-issue[data-v-17f46a25]{display:flex;align-items:flex-start;gap:4px;margin:3px 0 0;font-size:12px;line-height:1.4}.em-inline-issue__icon[data-v-17f46a25]{margin-top:1px}.em-inline-issue__msgs[data-v-17f46a25]{display:flex;flex-direction:column;min-width:0}.em-inline-issue.is-error[data-v-17f46a25]{color:var(--em-error)}.em-inline-issue.is-warning[data-v-17f46a25]{color:var(--em-warn)}.em-inline-issue.is-info[data-v-17f46a25]{color:var(--em-info)}.em-mlang[data-v-274a0fe9]{display:flex;flex-direction:column;gap:4px}.em-mlang__tabs[data-v-274a0fe9]{display:flex;gap:2px}.em-mlang__tab[data-v-274a0fe9]{display:inline-flex;align-items:center;gap:1px;padding:1px 7px;border:1px solid var(--em-border);border-radius:4px;background:transparent;color:var(--em-on-surface-faint);font-size:11px;line-height:1.6;cursor:pointer}.em-mlang__tab[data-v-274a0fe9]:hover{color:var(--em-on-surface-muted);border-color:var(--em-on-surface-faint)}.em-mlang__tab.is-active[data-v-274a0fe9]{color:var(--em-on-surface-strong);border-color:var(--em-accent);background:var(--em-surface-raised)}.em-mlang__dot[data-v-274a0fe9]{color:var(--em-accent);font-size:13px;line-height:1}.em-panel__sub[data-v-a8c7f667]{margin:14px 0 6px;font-size:12px;color:var(--em-on-surface-strong);display:flex;justify-content:space-between;align-items:center}.em-panel__note[data-v-a8c7f667]{margin:8px 0 0;font-size:11px;color:var(--em-on-surface-faint)}.em-warn[data-v-a8c7f667]{margin:2px 0 0;font-size:10px;line-height:1.3;color:var(--em-warn)}.em-textarea[data-v-a8c7f667]{width:100%;box-sizing:border-box;border:1px solid var(--em-border-strong);border-radius:6px;padding:6px 8px;font:inherit;color:var(--em-on-surface);resize:vertical}.em-textarea[data-v-a8c7f667]:focus{outline:none;border-color:var(--em-accent)}.em-field[data-v-a8c7f667]{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.em-field>span[data-v-a8c7f667]{color:var(--em-on-surface-muted);font-size:11px}.em-multilang[data-v-a8c7f667],.em-jpa[data-v-a8c7f667],.em-class[data-v-a8c7f667]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px;display:flex;flex-direction:column;gap:4px}.em-multilang legend[data-v-a8c7f667],.em-jpa legend[data-v-a8c7f667],.em-class legend[data-v-a8c7f667]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-class .em-field[data-v-a8c7f667]{margin-bottom:0}.em-lang[data-v-a8c7f667]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.em-lang>span[data-v-a8c7f667]{width:22px;color:var(--em-on-surface-faint)}.em-lang[data-v-a8c7f667] .bs-text-input,.em-lang[data-v-a8c7f667]>*{flex:1}.em-check[data-v-a8c7f667]{color:var(--em-on-surface-strong)}.em-attr[data-v-a8c7f667]{border:1px solid var(--em-border);border-radius:6px;padding:6px;margin-bottom:6px;background:var(--em-surface)}.em-attr.is-focused[data-v-a8c7f667]{border-color:var(--em-selection);box-shadow:0 0 0 1px var(--em-selection)}.em-attr__row[data-v-a8c7f667]{display:flex;gap:4px;margin-bottom:4px;align-items:center}.em-attr__row .grow[data-v-a8c7f667]{flex:1}.em-attr__flags[data-v-a8c7f667]{display:flex;flex-direction:column;gap:4px;margin-top:2px}.em-attr__pii[data-v-a8c7f667]{display:flex;align-items:center;gap:6px;margin-top:4px}.em-attr__pii>span[data-v-a8c7f667]{color:var(--em-on-surface-muted);font-size:11px;white-space:nowrap}.em-attr__pii[data-v-a8c7f667]>:last-child{flex:1}.em-attr__codetop[data-v-a8c7f667]{margin-top:10px}.em-check--block[data-v-a8c7f667]{display:block;margin-bottom:8px}.em-embed-cols[data-v-a8c7f667]{display:flex;flex-direction:column;gap:6px;padding-left:8px;border-left:2px solid var(--em-border-strong)}.em-embed-col[data-v-a8c7f667]{display:flex;flex-direction:column;gap:4px}.em-embed-col__label[data-v-a8c7f667]{font-size:10px;color:var(--em-on-surface-faint)}.em-embed-upd[data-v-a8c7f667]{display:flex;align-items:center;gap:6px}.em-embed-upd>span[data-v-a8c7f667]{color:var(--em-on-surface-muted);font-size:11px}.em-attr[data-v-a8c7f667] .bs-button.em-del-btn{color:var(--em-danger)}.em-swatch[data-v-a8c7f667]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px}.em-swatch legend[data-v-a8c7f667]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-swatch__row[data-v-a8c7f667]{display:flex;gap:4px;flex-wrap:wrap}.em-attr__swatch[data-v-a8c7f667]{margin-top:6px;align-items:center}.em-attr__swatch-hint[data-v-a8c7f667]{margin-left:4px;color:var(--em-on-surface-faint);font-size:10px;white-space:nowrap}.em-swatch__chip[data-v-a8c7f667]{width:18px;height:18px;border-radius:4px;border:1px solid rgb(0 0 0 / .15);padding:0;cursor:pointer;box-sizing:border-box}.em-swatch__chip.is-on[data-v-a8c7f667]{box-shadow:0 0 0 2px var(--em-surface),0 0 0 3.5px var(--em-selection)}.em-swatch__none[data-v-a8c7f667]{background:var(--em-surface);color:var(--em-on-surface-faint);font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center}.em-section[data-v-a8c7f667]{border:0;margin:0;padding:0;min-width:0}.em-section__issues[data-v-a8c7f667]{margin:0 0 8px}.gcc[data-v-3f798ab1]{width:100%}.gcc__input[data-v-3f798ab1]{width:100%;box-sizing:border-box;padding:4px 8px;border:1px solid var(--em-border-strong);border-radius:4px;background:var(--em-surface);color:var(--em-on-surface);font:inherit}.gcc__input[data-v-3f798ab1]:focus{outline:none;border-color:var(--em-accent)}.gcc__popup{position:fixed;z-index:3000;margin:2px 0 0;padding:4px 0;max-height:280px;overflow-y:auto;list-style:none;background:var(--em-surface);color:var(--em-on-surface);border:1px solid var(--em-border-strong);border-radius:4px;box-shadow:var(--em-shadow)}.gcc__opt{padding:5px 10px;font-size:13px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gcc__opt.is-active{background:var(--em-accent-subtle)}.gcc__opt.is-selected{font-weight:600}.gcc__opt--none{color:var(--em-on-surface-muted);border-bottom:1px solid var(--em-border)}.gcc__opt--empty{color:var(--em-on-surface-faint);cursor:default}.em-panel__sub[data-v-eaf1fd75]{margin:14px 0 6px;font-size:12px;color:var(--em-on-surface-strong);display:flex;justify-content:space-between;align-items:center}.em-panel__note[data-v-eaf1fd75]{margin:8px 0 0;font-size:11px;color:var(--em-on-surface-faint)}.em-warn[data-v-eaf1fd75]{margin:2px 0 0;font-size:10px;line-height:1.3;color:var(--em-warn)}.em-textarea[data-v-eaf1fd75]{width:100%;box-sizing:border-box;border:1px solid var(--em-border-strong);border-radius:6px;padding:6px 8px;font:inherit;color:var(--em-on-surface);resize:vertical}.em-textarea[data-v-eaf1fd75]:focus{outline:none;border-color:var(--em-accent)}.em-field[data-v-eaf1fd75]{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.em-field>span[data-v-eaf1fd75]{color:var(--em-on-surface-muted);font-size:11px}.em-multilang[data-v-eaf1fd75],.em-jpa[data-v-eaf1fd75],.em-class[data-v-eaf1fd75]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px;display:flex;flex-direction:column;gap:4px}.em-multilang legend[data-v-eaf1fd75],.em-jpa legend[data-v-eaf1fd75],.em-class legend[data-v-eaf1fd75]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-class .em-field[data-v-eaf1fd75]{margin-bottom:0}.em-lang[data-v-eaf1fd75]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.em-lang>span[data-v-eaf1fd75]{width:22px;color:var(--em-on-surface-faint)}.em-lang[data-v-eaf1fd75] .bs-text-input,.em-lang[data-v-eaf1fd75]>*{flex:1}.em-check[data-v-eaf1fd75]{color:var(--em-on-surface-strong)}.em-attr[data-v-eaf1fd75]{border:1px solid var(--em-border);border-radius:6px;padding:6px;margin-bottom:6px;background:var(--em-surface)}.em-attr.is-focused[data-v-eaf1fd75]{border-color:var(--em-selection);box-shadow:0 0 0 1px var(--em-selection)}.em-attr__row[data-v-eaf1fd75]{display:flex;gap:4px;margin-bottom:4px;align-items:center}.em-attr__row .grow[data-v-eaf1fd75]{flex:1}.em-attr__flags[data-v-eaf1fd75]{display:flex;flex-direction:column;gap:4px;margin-top:2px}.em-attr__pii[data-v-eaf1fd75]{display:flex;align-items:center;gap:6px;margin-top:4px}.em-attr__pii>span[data-v-eaf1fd75]{color:var(--em-on-surface-muted);font-size:11px;white-space:nowrap}.em-attr__pii[data-v-eaf1fd75]>:last-child{flex:1}.em-attr__codetop[data-v-eaf1fd75]{margin-top:10px}.em-check--block[data-v-eaf1fd75]{display:block;margin-bottom:8px}.em-embed-cols[data-v-eaf1fd75]{display:flex;flex-direction:column;gap:6px;padding-left:8px;border-left:2px solid var(--em-border-strong)}.em-embed-col[data-v-eaf1fd75]{display:flex;flex-direction:column;gap:4px}.em-embed-col__label[data-v-eaf1fd75]{font-size:10px;color:var(--em-on-surface-faint)}.em-embed-upd[data-v-eaf1fd75]{display:flex;align-items:center;gap:6px}.em-embed-upd>span[data-v-eaf1fd75]{color:var(--em-on-surface-muted);font-size:11px}.em-attr[data-v-eaf1fd75] .bs-button.em-del-btn{color:var(--em-danger)}.em-swatch[data-v-eaf1fd75]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px}.em-swatch legend[data-v-eaf1fd75]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-swatch__row[data-v-eaf1fd75]{display:flex;gap:4px;flex-wrap:wrap}.em-attr__swatch[data-v-eaf1fd75]{margin-top:6px;align-items:center}.em-attr__swatch-hint[data-v-eaf1fd75]{margin-left:4px;color:var(--em-on-surface-faint);font-size:10px;white-space:nowrap}.em-swatch__chip[data-v-eaf1fd75]{width:18px;height:18px;border-radius:4px;border:1px solid rgb(0 0 0 / .15);padding:0;cursor:pointer;box-sizing:border-box}.em-swatch__chip.is-on[data-v-eaf1fd75]{box-shadow:0 0 0 2px var(--em-surface),0 0 0 3.5px var(--em-selection)}.em-swatch__none[data-v-eaf1fd75]{background:var(--em-surface);color:var(--em-on-surface-faint);font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center}.em-aw[data-v-eaf1fd75]{border:0;margin:0;padding:0;min-width:0}.em-aw__toolbar[data-v-eaf1fd75]{display:flex;align-items:center;gap:8px;margin-bottom:8px}.em-aw__count[data-v-eaf1fd75]{font-size:12px;color:var(--em-on-surface-strong)}.em-aw__scroll[data-v-eaf1fd75]{overflow-x:auto}.em-aw__table[data-v-eaf1fd75]{width:100%;border-collapse:collapse;font-size:12px}.em-aw__table th[data-v-eaf1fd75]{text-align:left;font-weight:600;font-size:11px;color:var(--em-on-surface-muted);padding:4px 6px;border-bottom:1px solid var(--em-border-strong);white-space:nowrap}.em-aw__table td[data-v-eaf1fd75]{padding:3px 6px;vertical-align:top;border-bottom:1px solid var(--em-border)}.em-aw__table tr.is-focused td[data-v-eaf1fd75]{background:color-mix(in srgb,var(--em-selection) 8%,transparent)}.c-name[data-v-eaf1fd75]{min-width:130px}.c-type[data-v-eaf1fd75]{min-width:90px}.c-logical[data-v-eaf1fd75],.c-col[data-v-eaf1fd75]{min-width:120px}.c-dtype[data-v-eaf1fd75]{min-width:100px}.c-len[data-v-eaf1fd75],.c-scale[data-v-eaf1fd75]{min-width:60px}.c-flag[data-v-eaf1fd75]{width:56px;text-align:center}.em-aw__table th.c-flag[data-v-eaf1fd75]{white-space:normal}.c-upd[data-v-eaf1fd75],.c-ins[data-v-eaf1fd75]{min-width:96px}.c-pii[data-v-eaf1fd75]{min-width:130px}.c-code[data-v-eaf1fd75]{min-width:150px}.c-default[data-v-eaf1fd75]{min-width:120px}.c-del[data-v-eaf1fd75]{width:32px}.em-aw__divider-row td[data-v-eaf1fd75]{background:var(--em-divider-fill, rgba(100, 116, 139, .12))}.em-aw__divider-note[data-v-eaf1fd75]{color:var(--em-on-surface-faint);font-size:11px;text-align:center;letter-spacing:.04em}.em-aw__embed-parent td[data-v-eaf1fd75]{background:var(--em-surface-sunken)}.em-aw__embed-note[data-v-eaf1fd75]{color:var(--em-on-surface-faint);font-size:11px}.em-aw__embed-col td[data-v-eaf1fd75]{background:color-mix(in srgb,var(--em-surface-sunken) 50%,transparent)}.em-aw__embed-label[data-v-eaf1fd75]{color:var(--em-on-surface-faint);font-size:11px;white-space:nowrap}.em-aw__ro[data-v-eaf1fd75]{color:var(--em-on-surface-faint);font-size:11px}.em-aw__empty[data-v-eaf1fd75]{color:var(--em-on-surface-faint);padding:16px;text-align:center}.em-panel__sub[data-v-46db4ab5]{margin:14px 0 6px;font-size:12px;color:var(--em-on-surface-strong);display:flex;justify-content:space-between;align-items:center}.em-panel__note[data-v-46db4ab5]{margin:8px 0 0;font-size:11px;color:var(--em-on-surface-faint)}.em-warn[data-v-46db4ab5]{margin:2px 0 0;font-size:10px;line-height:1.3;color:var(--em-warn)}.em-textarea[data-v-46db4ab5]{width:100%;box-sizing:border-box;border:1px solid var(--em-border-strong);border-radius:6px;padding:6px 8px;font:inherit;color:var(--em-on-surface);resize:vertical}.em-textarea[data-v-46db4ab5]:focus{outline:none;border-color:var(--em-accent)}.em-field[data-v-46db4ab5]{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.em-field>span[data-v-46db4ab5]{color:var(--em-on-surface-muted);font-size:11px}.em-multilang[data-v-46db4ab5],.em-jpa[data-v-46db4ab5],.em-class[data-v-46db4ab5]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px;display:flex;flex-direction:column;gap:4px}.em-multilang legend[data-v-46db4ab5],.em-jpa legend[data-v-46db4ab5],.em-class legend[data-v-46db4ab5]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-class .em-field[data-v-46db4ab5]{margin-bottom:0}.em-lang[data-v-46db4ab5]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.em-lang>span[data-v-46db4ab5]{width:22px;color:var(--em-on-surface-faint)}.em-lang[data-v-46db4ab5] .bs-text-input,.em-lang[data-v-46db4ab5]>*{flex:1}.em-check[data-v-46db4ab5]{color:var(--em-on-surface-strong)}.em-attr[data-v-46db4ab5]{border:1px solid var(--em-border);border-radius:6px;padding:6px;margin-bottom:6px;background:var(--em-surface)}.em-attr.is-focused[data-v-46db4ab5]{border-color:var(--em-selection);box-shadow:0 0 0 1px var(--em-selection)}.em-attr__row[data-v-46db4ab5]{display:flex;gap:4px;margin-bottom:4px;align-items:center}.em-attr__row .grow[data-v-46db4ab5]{flex:1}.em-attr__flags[data-v-46db4ab5]{display:flex;flex-direction:column;gap:4px;margin-top:2px}.em-attr__pii[data-v-46db4ab5]{display:flex;align-items:center;gap:6px;margin-top:4px}.em-attr__pii>span[data-v-46db4ab5]{color:var(--em-on-surface-muted);font-size:11px;white-space:nowrap}.em-attr__pii[data-v-46db4ab5]>:last-child{flex:1}.em-attr__codetop[data-v-46db4ab5]{margin-top:10px}.em-check--block[data-v-46db4ab5]{display:block;margin-bottom:8px}.em-embed-cols[data-v-46db4ab5]{display:flex;flex-direction:column;gap:6px;padding-left:8px;border-left:2px solid var(--em-border-strong)}.em-embed-col[data-v-46db4ab5]{display:flex;flex-direction:column;gap:4px}.em-embed-col__label[data-v-46db4ab5]{font-size:10px;color:var(--em-on-surface-faint)}.em-embed-upd[data-v-46db4ab5]{display:flex;align-items:center;gap:6px}.em-embed-upd>span[data-v-46db4ab5]{color:var(--em-on-surface-muted);font-size:11px}.em-attr[data-v-46db4ab5] .bs-button.em-del-btn{color:var(--em-danger)}.em-swatch[data-v-46db4ab5]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px}.em-swatch legend[data-v-46db4ab5]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-swatch__row[data-v-46db4ab5]{display:flex;gap:4px;flex-wrap:wrap}.em-attr__swatch[data-v-46db4ab5]{margin-top:6px;align-items:center}.em-attr__swatch-hint[data-v-46db4ab5]{margin-left:4px;color:var(--em-on-surface-faint);font-size:10px;white-space:nowrap}.em-swatch__chip[data-v-46db4ab5]{width:18px;height:18px;border-radius:4px;border:1px solid rgb(0 0 0 / .15);padding:0;cursor:pointer;box-sizing:border-box}.em-swatch__chip.is-on[data-v-46db4ab5]{box-shadow:0 0 0 2px var(--em-surface),0 0 0 3.5px var(--em-selection)}.em-swatch__none[data-v-46db4ab5]{background:var(--em-surface);color:var(--em-on-surface-faint);font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center}.em-idxw[data-v-46db4ab5]{display:flex;gap:12px;border:0;margin:0;padding:0;min-width:0}.em-idxw__list[data-v-46db4ab5]{flex:0 0 180px;border-right:1px solid var(--em-border);padding-right:10px}.em-idxw__list-head[data-v-46db4ab5]{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--em-on-surface-strong);margin-bottom:6px}.em-idxw__list ul[data-v-46db4ab5]{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}.em-idxw__item[data-v-46db4ab5]{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:6px;cursor:pointer;border:1px solid transparent}.em-idxw__item[data-v-46db4ab5]:hover{background:var(--em-surface)}.em-idxw__item.is-active[data-v-46db4ab5]{background:var(--em-surface);border-color:var(--em-selection)}.em-idxw__item-name[data-v-46db4ab5]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.em-idxw__badge[data-v-46db4ab5]{font-size:9px;padding:1px 4px;border-radius:3px;background:var(--em-border);color:var(--em-on-surface-muted)}.em-idxw__item-cnt[data-v-46db4ab5]{font-size:10px;color:var(--em-on-surface-faint)}.em-idxw__empty[data-v-46db4ab5]{color:var(--em-on-surface-faint);font-size:11px;padding:8px}.em-idxw__edit[data-v-46db4ab5]{flex:1;min-width:0}.em-idxw__edit--empty[data-v-46db4ab5]{color:var(--em-on-surface-faint);display:flex;align-items:center;justify-content:center;padding:40px}.em-idxw__form[data-v-46db4ab5]{display:flex;align-items:flex-start;gap:12px}.em-idxw__name[data-v-46db4ab5]{flex:1}.em-idxw__uq[data-v-46db4ab5]{margin-top:18px;white-space:nowrap}.em-idxw__del[data-v-46db4ab5]{margin-top:14px;white-space:nowrap}.em-idxw__transfer[data-v-46db4ab5]{display:flex;align-items:stretch;gap:10px;margin-top:10px}.em-idxw__pane[data-v-46db4ab5]{flex:1;min-width:0;border:1px solid var(--em-border);border-radius:6px;display:flex;flex-direction:column}.em-idxw__pane-head[data-v-46db4ab5]{font-size:11px;color:var(--em-on-surface-muted);padding:6px 8px;border-bottom:1px solid var(--em-border)}.em-idxw__cols[data-v-46db4ab5]{list-style:none;margin:0;padding:4px;display:flex;flex-direction:column;gap:2px;max-height:320px;overflow-y:auto}.em-idxw__col[data-v-46db4ab5]{padding:6px 8px;border-radius:4px;cursor:pointer;border:1px solid transparent}.em-idxw__col[data-v-46db4ab5]:hover{background:var(--em-surface-sunken)}.em-idxw__col.is-sel[data-v-46db4ab5]{background:var(--em-surface-sunken);border-color:var(--em-selection)}.em-idxw__col--idx[data-v-46db4ab5]{display:flex;align-items:center;gap:8px;cursor:default}.em-idxw__col--idx[data-v-46db4ab5]:hover{background:none}.em-idxw__col-name[data-v-46db4ab5]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.em-idxw__col-ops[data-v-46db4ab5]{display:flex;gap:2px}.em-idxw__opbtn[data-v-46db4ab5]{border:none;background:none;cursor:pointer;color:var(--em-on-surface-muted);padding:2px 4px;border-radius:3px;font-size:12px;line-height:1}.em-idxw__opbtn[data-v-46db4ab5]:hover:not(:disabled){background:var(--em-border);color:var(--em-on-surface)}.em-idxw__opbtn[data-v-46db4ab5]:disabled{opacity:.3;cursor:default}.em-idxw__opbtn--del[data-v-46db4ab5]{color:var(--em-danger)}.em-idxw__arrows[data-v-46db4ab5]{display:flex;flex-direction:column;justify-content:center}.em-op-src[data-v-acb84aec]{display:flex;flex-direction:column;width:720px;max-width:90vw}.em-op-src__area[data-v-acb84aec]{width:100%;height:360px;max-height:70vh;padding:14px;box-sizing:border-box;resize:vertical;background:#0f172a;color:#e2e8f0;border:1px solid var(--em-border-strong, #334155);border-radius:6px;font-family:var(--em-mono, ui-monospace, monospace);font-size:12px;line-height:1.5;-moz-tab-size:2;tab-size:2}.em-op-src__actions[data-v-acb84aec]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.em-panel__sub[data-v-a621eb69]{margin:14px 0 6px;font-size:12px;color:var(--em-on-surface-strong);display:flex;justify-content:space-between;align-items:center}.em-panel__note[data-v-a621eb69]{margin:8px 0 0;font-size:11px;color:var(--em-on-surface-faint)}.em-warn[data-v-a621eb69]{margin:2px 0 0;font-size:10px;line-height:1.3;color:var(--em-warn)}.em-textarea[data-v-a621eb69]{width:100%;box-sizing:border-box;border:1px solid var(--em-border-strong);border-radius:6px;padding:6px 8px;font:inherit;color:var(--em-on-surface);resize:vertical}.em-textarea[data-v-a621eb69]:focus{outline:none;border-color:var(--em-accent)}.em-field[data-v-a621eb69]{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.em-field>span[data-v-a621eb69]{color:var(--em-on-surface-muted);font-size:11px}.em-multilang[data-v-a621eb69],.em-jpa[data-v-a621eb69],.em-class[data-v-a621eb69]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px;display:flex;flex-direction:column;gap:4px}.em-multilang legend[data-v-a621eb69],.em-jpa legend[data-v-a621eb69],.em-class legend[data-v-a621eb69]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-class .em-field[data-v-a621eb69]{margin-bottom:0}.em-lang[data-v-a621eb69]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.em-lang>span[data-v-a621eb69]{width:22px;color:var(--em-on-surface-faint)}.em-lang[data-v-a621eb69] .bs-text-input,.em-lang[data-v-a621eb69]>*{flex:1}.em-check[data-v-a621eb69]{color:var(--em-on-surface-strong)}.em-attr[data-v-a621eb69]{border:1px solid var(--em-border);border-radius:6px;padding:6px;margin-bottom:6px;background:var(--em-surface)}.em-attr.is-focused[data-v-a621eb69]{border-color:var(--em-selection);box-shadow:0 0 0 1px var(--em-selection)}.em-attr__row[data-v-a621eb69]{display:flex;gap:4px;margin-bottom:4px;align-items:center}.em-attr__row .grow[data-v-a621eb69]{flex:1}.em-attr__flags[data-v-a621eb69]{display:flex;flex-direction:column;gap:4px;margin-top:2px}.em-attr__pii[data-v-a621eb69]{display:flex;align-items:center;gap:6px;margin-top:4px}.em-attr__pii>span[data-v-a621eb69]{color:var(--em-on-surface-muted);font-size:11px;white-space:nowrap}.em-attr__pii[data-v-a621eb69]>:last-child{flex:1}.em-attr__codetop[data-v-a621eb69]{margin-top:10px}.em-check--block[data-v-a621eb69]{display:block;margin-bottom:8px}.em-embed-cols[data-v-a621eb69]{display:flex;flex-direction:column;gap:6px;padding-left:8px;border-left:2px solid var(--em-border-strong)}.em-embed-col[data-v-a621eb69]{display:flex;flex-direction:column;gap:4px}.em-embed-col__label[data-v-a621eb69]{font-size:10px;color:var(--em-on-surface-faint)}.em-embed-upd[data-v-a621eb69]{display:flex;align-items:center;gap:6px}.em-embed-upd>span[data-v-a621eb69]{color:var(--em-on-surface-muted);font-size:11px}.em-attr[data-v-a621eb69] .bs-button.em-del-btn{color:var(--em-danger)}.em-swatch[data-v-a621eb69]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px}.em-swatch legend[data-v-a621eb69]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-swatch__row[data-v-a621eb69]{display:flex;gap:4px;flex-wrap:wrap}.em-attr__swatch[data-v-a621eb69]{margin-top:6px;align-items:center}.em-attr__swatch-hint[data-v-a621eb69]{margin-left:4px;color:var(--em-on-surface-faint);font-size:10px;white-space:nowrap}.em-swatch__chip[data-v-a621eb69]{width:18px;height:18px;border-radius:4px;border:1px solid rgb(0 0 0 / .15);padding:0;cursor:pointer;box-sizing:border-box}.em-swatch__chip.is-on[data-v-a621eb69]{box-shadow:0 0 0 2px var(--em-surface),0 0 0 3.5px var(--em-selection)}.em-swatch__none[data-v-a621eb69]{background:var(--em-surface);color:var(--em-on-surface-faint);font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center}.em-ow[data-v-a621eb69]{border:0;margin:0;padding:0;min-width:0}.em-ow__toolbar[data-v-a621eb69]{display:flex;align-items:center;gap:8px;margin-bottom:8px}.em-ow__count[data-v-a621eb69]{font-size:12px;color:var(--em-on-surface-strong)}.em-ow__scroll[data-v-a621eb69]{overflow-x:auto}.em-ow__table[data-v-a621eb69]{width:100%;border-collapse:collapse;font-size:12px}.em-ow__table th[data-v-a621eb69]{text-align:left;font-weight:600;font-size:11px;color:var(--em-on-surface-muted);padding:4px 6px;border-bottom:1px solid var(--em-border-strong);white-space:nowrap}.em-ow__table td[data-v-a621eb69]{padding:3px 6px;vertical-align:top;border-bottom:1px solid var(--em-border)}.c-name[data-v-a621eb69]{min-width:160px}.c-vis[data-v-a621eb69]{min-width:110px}.c-desc[data-v-a621eb69]{min-width:220px}.c-pii[data-v-a621eb69]{min-width:130px}.c-src[data-v-a621eb69]{width:70px;white-space:nowrap}.c-del[data-v-a621eb69]{width:32px}.em-ow__empty[data-v-a621eb69]{color:var(--em-on-surface-faint);padding:16px;text-align:center}.em-detail[data-v-6e30603a]{display:flex;flex-direction:column;width:1200px;max-width:94vw;font-size:12px}.em-detail__tabs[data-v-6e30603a]{display:flex;align-items:center;gap:2px;border-bottom:1px solid var(--em-border-strong);margin-bottom:12px}.em-detail__tab[data-v-6e30603a]{border:none;background:none;cursor:pointer;padding:8px 14px;font:inherit;color:var(--em-on-surface-muted);border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s ease,border-color .15s ease}.em-detail__tab[data-v-6e30603a]:hover{color:var(--em-on-surface)}.em-detail__tab.is-active[data-v-6e30603a]{color:var(--em-on-surface-strong);border-bottom-color:var(--em-selection);font-weight:600}.em-detail__spacer[data-v-6e30603a]{flex:1}.em-detail__body[data-v-6e30603a]{height:74vh;max-height:820px;overflow-y:auto;padding:2px 2px 4px}.em-detail__body.is-readonly[data-v-6e30603a]{opacity:.7}.em-entity[data-v-1feee466]{position:relative;box-sizing:border-box;min-width:min-content;min-height:min-content;border:1px solid var(--em-node-border);border-radius:6px;background:var(--em-surface);color:var(--em-on-surface);font-size:12px;box-shadow:var(--em-shadow);transition:border-color .2s cubic-bezier(.4,0,.2,1),box-shadow .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),filter .2s cubic-bezier(.4,0,.2,1)}.em-entity.is-hover-origin[data-v-1feee466]{border-color:var(--em-accent);box-shadow:var(--em-glow-hover)}.em-entity.is-related[data-v-1feee466]{border-color:var(--em-accent-soft);box-shadow:var(--em-glow-related)}.em-entity.is-dimmed[data-v-1feee466]{opacity:.45;filter:saturate(.5)}.em-entity.has-focused-attr[data-v-1feee466]{border-color:var(--em-selection)}.em-entity.is-multi-selected[data-v-1feee466]{border-color:var(--em-selection);box-shadow:0 0 0 1.5px var(--em-selection),var(--em-shadow)}.em-sel[data-v-1feee466]{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.em-sel__c[data-v-1feee466]{position:absolute;width:10px;height:10px;border:1.5px solid var(--em-selection)}.em-sel__c--tl[data-v-1feee466]{top:-5px;left:-5px;border-right:none;border-bottom:none;border-radius:4px 0 0}.em-sel__c--tr[data-v-1feee466]{top:-5px;right:-5px;border-left:none;border-bottom:none;border-radius:0 4px 0 0}.em-sel__c--bl[data-v-1feee466]{bottom:-5px;left:-5px;border-right:none;border-top:none;border-radius:0 0 0 4px}.em-sel__c--br[data-v-1feee466]{bottom:-5px;right:-5px;border-left:none;border-top:none;border-radius:0 0 4px}.em-entity__header[data-v-1feee466]{position:relative;display:flex;flex-direction:column;gap:2px;padding:6px 10px;min-width:200px;background:var(--em-header-bg, var(--em-header-default));color:var(--em-header-fg, var(--em-on-header));border-radius:5px 5px 0 0}.em-entity__caret[data-v-1feee466]{position:absolute;top:6px;right:6px;z-index:2;display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;border-radius:4px;background:transparent;color:inherit;font-size:14px;line-height:1;cursor:pointer;opacity:.55;transition:opacity .15s ease,background-color .15s ease}.em-entity__caret[data-v-1feee466]:hover{opacity:1;background:#7f7f7f2e}.em-entity__stereotype[data-v-1feee466]{font-size:10px;opacity:.7}.em-entity__name[data-v-1feee466]{font-weight:600;font-size:13px}.em-entity__missing[data-v-1feee466]{color:var(--em-on-surface-faint);font-style:italic;font-weight:400}.em-entity__name-input[data-v-1feee466]{font-weight:600;font-size:13px;border:1px solid var(--em-accent-soft);border-radius:3px;padding:1px 4px;width:100%;background:var(--em-surface);color:var(--em-on-surface)}.em-entity__attrs[data-v-1feee466]{list-style:none;margin:0;padding:0;position:relative}.em-entity__row[data-v-1feee466]{position:relative;display:grid;grid-template-columns:26px 1fr auto;align-items:center;gap:6px;padding:3px 10px;border-top:1px solid var(--em-border);cursor:pointer}.em-entity__grip[data-v-1feee466]{position:absolute;left:3px;top:0;bottom:0;width:11px;display:flex;align-items:center;justify-content:center;font-size:9px;line-height:1;color:var(--em-on-surface-faint);cursor:grab;opacity:0;transition:opacity .12s;-webkit-user-select:none;user-select:none;touch-action:none}.em-entity__row:hover .em-entity__grip[data-v-1feee466]{opacity:.65}.em-entity__grip[data-v-1feee466]:active{cursor:grabbing;opacity:1}.em-entity__row.is-dragging[data-v-1feee466]{opacity:.4}.em-entity__drop-line[data-v-1feee466]{position:absolute;left:0;right:0;height:2px;margin-top:-1px;background:var(--em-selection);pointer-events:none;z-index:3}.em-entity__row.is-attr-selected[data-v-1feee466]{background:var(--em-selection-soft)}.em-entity__row.is-attr-selected[data-v-1feee466]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--em-selection)}.em-entity__keys[data-v-1feee466]{display:flex;gap:1px;align-items:center}.em-entity__keys .em-key-slot[data-v-1feee466]{width:12px;display:flex;align-items:center;justify-content:center}.em-entity__keys .em-key[data-v-1feee466]{stroke-width:2.8px}.em-entity__keys .em-key.is-pk[data-v-1feee466]{color:var(--em-pk)}.em-entity__keys .em-key.is-fk[data-v-1feee466]{color:var(--em-fk)}.em-entity__type[data-v-1feee466]{color:var(--em-on-surface-muted);font-size:11px}.em-entity__name[data-v-1feee466],.em-entity__stereotype[data-v-1feee466],.em-entity__attrname[data-v-1feee466],.em-entity__type[data-v-1feee466],.em-entity__op-name[data-v-1feee466]{white-space:nowrap}.em-entity__row.is-embed .em-entity__attrname[data-v-1feee466]{font-weight:600}.em-entity__row.is-divider[data-v-1feee466]{display:flex;align-items:center;justify-content:center;gap:6px;min-height:8px;padding:1px 10px;background:var(--em-divider-fill, rgba(100, 116, 139, .12));cursor:grab;-webkit-user-select:none;user-select:none}.em-entity__row.is-divider[data-v-1feee466]:active{cursor:grabbing}.em-entity__divider-label[data-v-1feee466]{font-size:10px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--em-on-surface-faint);white-space:nowrap}.em-entity__row.is-divider.is-attr-selected[data-v-1feee466]{background:var(--em-selection-soft);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--em-selection) 40%,transparent)}.em-entity__row.is-divider.is-attr-selected[data-v-1feee466]:before{display:none}.em-embed-glyph[data-v-1feee466]{color:var(--em-on-surface-muted)}.em-entity__embed-col[data-v-1feee466]{position:relative;display:grid;grid-template-columns:1fr auto;align-items:center;gap:6px;padding:2px 10px 2px 48px;border-top:1px solid var(--em-border);background:var(--em-embed-fill, rgba(100, 116, 139, .07));font-size:11px;color:var(--em-on-surface-muted);cursor:pointer}.em-entity__embed-col.is-group-selected[data-v-1feee466]{background:var(--em-selection-soft)}.em-entity__embed-col.is-group-selected[data-v-1feee466]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--em-selection)}.em-entity__embed-rail[data-v-1feee466]{position:absolute;left:28px;top:0;bottom:0;width:1px;background:var(--em-border)}.em-entity__embed-col.is-group-selected .em-entity__embed-rail[data-v-1feee466]{background:color-mix(in srgb,var(--em-selection) 30%,transparent)}.em-entity__ops[data-v-1feee466]{list-style:none;margin:0;padding:0;border-top:1px solid var(--em-node-border);position:relative}.em-entity__op-row[data-v-1feee466]{position:relative;display:grid;grid-template-columns:14px 1fr;align-items:center;gap:6px;padding:3px 10px}.em-entity__op-row+.em-entity__op-row[data-v-1feee466]{border-top:1px solid var(--em-border)}.em-entity__op-row:hover .em-entity__grip[data-v-1feee466]{opacity:.65}.em-entity__op-row.is-dragging[data-v-1feee466]{opacity:.4}.em-entity__op-vis[data-v-1feee466]{font-family:var(--em-mono, ui-monospace, monospace);color:var(--em-on-surface-muted);text-align:center}.em-entity__op-name[data-v-1feee466]{font-style:italic}.em-entity__ops-summary[data-v-1feee466]{display:flex;align-items:center;gap:6px;padding:4px 10px;border-top:1px solid var(--em-node-border);color:var(--em-on-surface-muted);font-size:11px}.em-entity__footer[data-v-1feee466]{border-top:1px solid var(--em-border);padding:3px 10px;display:flex;align-items:center;justify-content:flex-end;gap:8px}.em-entity__footer-sep[data-v-1feee466]{width:1px;align-self:stretch;margin:1px 0;background:var(--em-border)}.em-entity__add[data-v-1feee466]{font-size:11px;color:var(--em-accent);background:none;border:none;cursor:pointer}.em-entity__add[data-v-1feee466]:hover{text-decoration:underline}.em-handle[data-v-1feee466]{width:8px;height:8px;background:var(--em-accent);opacity:0;pointer-events:none;transition:opacity .15s ease}.em-entity:hover .em-handle[data-v-1feee466]{opacity:1;pointer-events:all}.em-entity__resize[data-v-1feee466]{position:absolute;right:-5px;bottom:-5px;width:12px;height:12px;border-radius:3px;background:var(--em-node-border);border:2px solid var(--em-surface);cursor:nwse-resize;opacity:0;pointer-events:none;transition:opacity .15s ease;z-index:1}.em-entity:hover .em-entity__resize[data-v-1feee466]{opacity:1;pointer-events:all}.em-entity__resize[data-v-1feee466]:hover{background:var(--em-accent)}.em-group[data-v-461d87c2]{position:relative;width:100%;height:100%;border:1.5px dashed var(--em-node-border);border-radius:8px;background:var(--em-group-fill);box-sizing:border-box;transition:background .2s cubic-bezier(.4,0,.2,1),border-color .2s cubic-bezier(.4,0,.2,1),box-shadow .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1)}.em-group.is-drop-target[data-v-461d87c2]{border-style:solid;border-color:var(--em-accent);background:var(--em-group-active-fill);box-shadow:var(--em-group-glow-drop)}.em-group.is-hover-origin[data-v-461d87c2]{border-style:solid;border-color:var(--em-accent);background:var(--em-group-hover-fill);box-shadow:var(--em-group-glow-hover)}.em-group.is-dimmed[data-v-461d87c2]{opacity:.4}.em-group.is-multi-selected[data-v-461d87c2]{border-color:var(--em-selection);box-shadow:0 0 0 1.5px var(--em-selection)}.em-sel[data-v-461d87c2]{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.em-sel__c[data-v-461d87c2]{position:absolute;width:12px;height:12px;border:1.5px solid var(--em-selection)}.em-sel__c--tl[data-v-461d87c2]{top:-5px;left:-5px;border-right:none;border-bottom:none;border-radius:4px 0 0}.em-sel__c--tr[data-v-461d87c2]{top:-5px;right:-5px;border-left:none;border-bottom:none;border-radius:0 4px 0 0}.em-sel__c--bl[data-v-461d87c2]{bottom:-5px;left:-5px;border-right:none;border-top:none;border-radius:0 0 0 4px}.em-sel__c--br[data-v-461d87c2]{bottom:-5px;right:-5px;border-left:none;border-top:none;border-radius:0 0 4px}.em-group__label[data-v-461d87c2]{display:inline-flex;align-items:baseline;gap:8px;padding:4px 10px;font-size:12px;color:var(--em-on-surface-strong);background:var(--em-group-label-bg);border-radius:6px 0 8px}.em-group__name[data-v-461d87c2]{font-weight:600}.em-group__pkg[data-v-461d87c2]{font-size:11px;color:var(--em-on-surface-muted);font-family:ui-monospace,monospace}.em-group__flag[data-v-461d87c2]{font-size:10px;color:var(--em-warn)}.em-group__resize[data-v-461d87c2]{position:absolute;right:-5px;bottom:-5px;width:14px;height:14px;border-radius:3px;background:var(--em-node-border);border:2px solid var(--em-surface);cursor:nwse-resize;pointer-events:all}.em-group__resize[data-v-461d87c2]:hover{background:var(--em-accent)}.em-note[data-v-07983822]{position:relative;width:100%;height:100%;min-width:140px;min-height:60px;box-sizing:border-box;padding:8px 10px;background:var(--em-note-surface);border:1px solid var(--em-note-border);border-radius:4px;font-size:12px;color:var(--em-note-on-surface);box-shadow:var(--em-shadow);white-space:pre-wrap;transition:border-color .2s cubic-bezier(.4,0,.2,1),box-shadow .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),filter .2s cubic-bezier(.4,0,.2,1)}.em-note.is-hover-origin[data-v-07983822]{border-color:var(--em-note-accent-strong);box-shadow:var(--em-note-glow-hover)}.em-note.is-related[data-v-07983822]{border-color:var(--em-note-accent);box-shadow:var(--em-note-glow-related)}.em-note.is-dimmed[data-v-07983822]{opacity:.45;filter:saturate(.5)}.em-note.is-multi-selected[data-v-07983822]{border-color:var(--em-selection);box-shadow:0 0 0 1.5px var(--em-selection),var(--em-shadow)}.em-sel[data-v-07983822]{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.em-sel__c[data-v-07983822]{position:absolute;width:10px;height:10px;border:1.5px solid var(--em-selection)}.em-sel__c--tl[data-v-07983822]{top:-5px;left:-5px;border-right:none;border-bottom:none;border-radius:4px 0 0}.em-sel__c--tr[data-v-07983822]{top:-5px;right:-5px;border-left:none;border-bottom:none;border-radius:0 4px 0 0}.em-sel__c--bl[data-v-07983822]{bottom:-5px;left:-5px;border-right:none;border-top:none;border-radius:0 0 0 4px}.em-sel__c--br[data-v-07983822]{bottom:-5px;right:-5px;border-left:none;border-top:none;border-radius:0 0 4px}.em-note__text[data-v-07983822]{width:100%;height:100%;overflow:auto}.em-note__edit[data-v-07983822]{width:100%;height:100%;border:none;background:transparent;resize:none;font:inherit;color:inherit;outline:none;overflow:auto}.em-note-handle[data-v-07983822]{width:8px;height:8px;background:var(--em-note-accent);opacity:0;pointer-events:none;transition:opacity .15s ease}.em-note:hover .em-note-handle[data-v-07983822]{opacity:1;pointer-events:all}.em-note__resize[data-v-07983822]{position:absolute;right:-5px;bottom:-5px;width:12px;height:12px;border-radius:3px;background:var(--em-note-border);border:2px solid var(--em-note-surface);cursor:nwse-resize;opacity:0;pointer-events:none;transition:opacity .15s ease}.em-note:hover .em-note__resize[data-v-07983822]{opacity:1;pointer-events:all}.em-note__resize[data-v-07983822]:hover{background:var(--em-note-accent)}.em-edge__hit[data-v-71d5ef34]{stroke:transparent;stroke-width:10;pointer-events:stroke}.em-edge__path[data-v-71d5ef34]{stroke:var(--em-on-surface-strong);pointer-events:stroke;transition:stroke .2s cubic-bezier(.4,0,.2,1),stroke-width .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),filter .2s cubic-bezier(.4,0,.2,1)}.em-edge__path.is-highlighted[data-v-71d5ef34]{stroke:var(--em-accent);stroke-width:2.5;filter:drop-shadow(0 0 2px rgb(13 148 136 / .5))}.em-edge__path.is-dimmed[data-v-71d5ef34]{opacity:.15}.em-edge__path.is-selected[data-v-71d5ef34]{stroke:var(--em-selection);stroke-width:2.5;filter:none}.em-edge__mult[data-v-71d5ef34]{font-size:11px;fill:var(--em-on-surface-strong);-webkit-user-select:none;user-select:none;transition:opacity .2s cubic-bezier(.4,0,.2,1)}.em-edge__mult.is-dimmed[data-v-71d5ef34]{opacity:.15}.em-edge__marker[data-v-71d5ef34]{stroke:var(--em-on-surface-strong);stroke-width:1.5;fill:none;pointer-events:none;transition:stroke .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1)}.em-edge__marker--fill[data-v-71d5ef34]{fill:var(--em-on-surface-strong)}.em-edge__marker.is-highlighted[data-v-71d5ef34]{stroke:var(--em-accent)}.em-edge__marker--fill.is-highlighted[data-v-71d5ef34]{fill:var(--em-accent)}.em-edge__marker.is-selected[data-v-71d5ef34]{stroke:var(--em-selection)}.em-edge__marker--fill.is-selected[data-v-71d5ef34]{fill:var(--em-selection)}.em-edge__marker.is-dimmed[data-v-71d5ef34]{opacity:.15}.em-edge__mid[data-v-71d5ef34]{fill:var(--em-on-surface-disabled);opacity:.5;cursor:copy;pointer-events:all;transition:opacity .2s cubic-bezier(.4,0,.2,1)}.em-edge__mid[data-v-71d5ef34]:hover{opacity:1;fill:var(--em-accent-soft)}.em-edge__mid.is-dimmed[data-v-71d5ef34],.em-edge__waypoint.is-dimmed[data-v-71d5ef34]{opacity:.15}.em-edge__waypoint[data-v-71d5ef34]{fill:var(--em-surface);stroke:var(--em-on-surface-muted);stroke-width:1.5;cursor:grab;pointer-events:all;transition:stroke .15s ease,opacity .2s cubic-bezier(.4,0,.2,1)}.em-edge__waypoint[data-v-71d5ef34]:hover{stroke:var(--em-on-surface-strong)}.em-edge__waypoint[data-v-71d5ef34]:active{cursor:grabbing;stroke:var(--em-on-surface-strong)}.em-note-edge__path[data-v-4c93c9c3]{stroke:var(--em-note-accent);pointer-events:stroke;transition:stroke .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1)}.em-note-edge__path.is-dimmed[data-v-4c93c9c3]{opacity:.15}.em-note-edge__mid[data-v-4c93c9c3]{fill:var(--em-note-soft);opacity:.5;cursor:copy;pointer-events:all;transition:opacity .2s cubic-bezier(.4,0,.2,1)}.em-note-edge__mid[data-v-4c93c9c3]:hover{opacity:1;fill:var(--em-note-accent)}.em-note-edge__mid.is-dimmed[data-v-4c93c9c3],.em-note-edge__waypoint.is-dimmed[data-v-4c93c9c3]{opacity:.15}.em-note-edge__waypoint[data-v-4c93c9c3]{fill:var(--em-surface);stroke:var(--em-on-surface-muted);stroke-width:1.5;cursor:grab;pointer-events:all;transition:stroke .15s ease,opacity .2s cubic-bezier(.4,0,.2,1)}.em-note-edge__waypoint[data-v-4c93c9c3]:hover{stroke:var(--em-on-surface-strong)}.em-note-edge__waypoint[data-v-4c93c9c3]:active{cursor:grabbing;stroke:var(--em-on-surface-strong)}.em-ctx-layer[data-v-77a7a1b5]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000}.em-ctx__scrim[data-v-77a7a1b5]{position:absolute;top:0;right:0;bottom:0;left:0}.em-ctx[data-v-77a7a1b5]{position:absolute;min-width:168px;padding:4px;background:var(--em-surface);border:1px solid var(--em-border-strong);border-radius:8px;box-shadow:0 1px 2px #00000014,0 8px 24px #0000002e;font-size:13px;color:var(--em-on-surface);-webkit-user-select:none;user-select:none}.em-ctx__item[data-v-77a7a1b5]{display:flex;align-items:center;width:100%;padding:6px 10px;border:0;border-radius:5px;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}.em-ctx__item[data-v-77a7a1b5]:hover:not(.is-disabled){background:var(--em-surface-sunken)}.em-ctx__icon[data-v-77a7a1b5]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-right:8px;color:var(--em-on-surface-muted)}.em-ctx__item.is-danger .em-ctx__icon[data-v-77a7a1b5]{color:inherit}.em-ctx__caption[data-v-77a7a1b5]{flex:1 1 auto}.em-ctx__item.is-danger[data-v-77a7a1b5]{color:var(--em-danger)}.em-ctx__item.is-danger[data-v-77a7a1b5]:hover{background:color-mix(in srgb,var(--em-danger) 12%,transparent)}.em-ctx__item.is-disabled[data-v-77a7a1b5]{color:var(--em-on-surface-faint);cursor:default}.em-ctx__sep[data-v-77a7a1b5]{height:1px;margin:4px 6px;background:var(--em-border)}.em-ctx__swatches[data-v-77a7a1b5]{padding:6px 10px 8px}.em-ctx__swatches-label[data-v-77a7a1b5]{display:block;margin-bottom:6px;padding-left:24px;color:var(--em-on-surface-muted);font-size:12px}.em-ctx__chips[data-v-77a7a1b5]{display:grid;grid-template-columns:repeat(9,1fr);gap:5px}.em-ctx__chip[data-v-77a7a1b5]{width:16px;height:16px;padding:0;border:1px solid var(--em-border-strong);border-radius:50%;cursor:pointer}.em-ctx__chip[data-v-77a7a1b5]:hover{transform:scale(1.18)}.em-ctx__chip.is-on[data-v-77a7a1b5]{box-shadow:0 0 0 2px var(--em-surface),0 0 0 3.5px var(--em-selection)}.em-ctx__chip--none[data-v-77a7a1b5]{background:linear-gradient(to top right,transparent calc(50% - 1px),var(--em-danger) 0,var(--em-danger) calc(50% + 1px),transparent 0) var(--em-surface)}.em-canvas[data-v-8123eaa4]{width:100%;height:100%;background:var(--em-canvas-bg)}.em-canvas[data-v-8123eaa4] .vue-flow__node-group{z-index:-1!important}.em-canvas[data-v-8123eaa4] .vue-flow__minimap{margin:0 16px 16px 0;border-radius:12px;border:1px solid var(--em-minimap-border);background:var(--em-minimap-bg);backdrop-filter:blur(8px) saturate(1.2);-webkit-backdrop-filter:blur(8px) saturate(1.2);box-shadow:0 10px 30px -8px #0f172a38,0 2px 8px -2px #0f172a1f,inset 0 1px #fff9;overflow:hidden;cursor:pointer;transition:box-shadow .25s ease,transform .25s ease}.em-canvas[data-v-8123eaa4] .vue-flow__minimap:hover{transform:translateY(-2px);box-shadow:0 16px 40px -8px #0f172a47,0 4px 12px -2px #0f172a29,inset 0 1px #ffffffb3}.em-canvas.is-panning[data-v-8123eaa4] .vue-flow__minimap{backdrop-filter:none;-webkit-backdrop-filter:none}.em-canvas[data-v-8123eaa4] .vue-flow__minimap-node{cursor:pointer;transition:fill .2s ease,opacity .2s ease}.em-canvas[data-v-8123eaa4] .vue-flow__minimap-node:hover{opacity:.78}.em-canvas[data-v-8123eaa4] .vue-flow__minimap-mask{filter:drop-shadow(0 1px 2px rgba(37,99,235,.25))}.em-canvas.is-connecting .em-handle,.em-canvas.is-connecting .em-note-handle{opacity:1!important;pointer-events:all!important}.em-explorer[data-v-eba61575]{height:100%;overflow-y:auto;background:var(--em-surface-sunken);font-size:12px;box-sizing:border-box;padding:4px 0}.em-explorer__row[data-v-eba61575]{display:flex;align-items:center;gap:4px;padding:2px 8px 2px 4px;white-space:nowrap;cursor:default;-webkit-user-select:none;user-select:none;line-height:20px}.em-explorer__row.is-selectable[data-v-eba61575]{cursor:pointer}.em-explorer__row.is-selectable[data-v-eba61575]:hover{background:var(--em-border)}.em-explorer__row.is-active[data-v-eba61575]{background:var(--em-accent-subtle);box-shadow:inset 2px 0 0 var(--em-accent)}.em-explorer__row.is-focus-parent[data-v-eba61575]{box-shadow:inset 2px 0 0 var(--em-accent-soft)}.em-explorer__chevron[data-v-eba61575]{display:flex;align-items:center;justify-content:center;width:16px;flex:0 0 16px;color:var(--em-on-surface-faint);cursor:pointer}.em-explorer__chevron[data-v-eba61575] .em-icon{transition:transform .18s ease}.em-explorer__chevron.is-open[data-v-eba61575] .em-icon{transform:rotate(90deg)}.em-explorer__chevron.is-leaf[data-v-eba61575]{cursor:default}.em-explorer__icon[data-v-eba61575]{color:var(--em-on-surface-muted)}.em-explorer__row.is-active .em-explorer__icon[data-v-eba61575]{color:var(--em-accent)}.em-explorer__keys[data-v-eba61575]{display:flex;flex:0 0 auto;align-items:center}.em-explorer__keys .em-key-slot[data-v-eba61575]{width:15px;display:flex;align-items:center;justify-content:center}.em-explorer__keys .em-key[data-v-eba61575]{stroke-width:2.8px}.em-explorer__keys .em-key.is-pk[data-v-eba61575]{color:var(--em-pk)}.em-explorer__keys .em-key.is-fk[data-v-eba61575]{color:var(--em-fk)}.em-explorer__label[data-v-eba61575]{overflow:hidden;text-overflow:ellipsis;color:var(--em-on-surface)}.em-text-preview[data-v-b6e12b4b]{display:flex;flex-direction:column;width:720px;max-width:90vw}.em-text-preview__pre[data-v-b6e12b4b]{margin:0;padding:14px;max-height:70vh;overflow:auto;background:#0f172a;color:#e2e8f0;border-radius:6px;font-size:12px;line-height:1.5;white-space:pre-wrap}.em-text-preview__actions[data-v-b6e12b4b]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.em-toolbar[data-v-72d12e28]{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--em-surface-raised);border-bottom:1px solid var(--em-border-strong);font-size:12px}.em-toolbar__sep[data-v-72d12e28]{width:1px;height:16px;background:var(--em-border-strong)}.em-toolbar__mode[data-v-72d12e28]{display:flex;align-items:center;gap:6px;color:var(--em-on-surface-strong)}.em-toolbar[data-v-72d12e28] .bs-button.em-toolbar__icon-btn{padding:4px}.em-toolbar[data-v-72d12e28] .bs-button.em-toolbar__toggle{color:var(--em-on-surface-muted)}.em-toolbar[data-v-72d12e28] .bs-button.em-toolbar__toggle.is-active{color:var(--em-accent)}.em-mode-toggle[data-v-ae148426]{font-weight:600}[data-v-ae148426] .bs-button.em-mode-toggle.is-view{color:var(--em-warn)}.em-panel__sub[data-v-4383b724]{margin:14px 0 6px;font-size:12px;color:var(--em-on-surface-strong);display:flex;justify-content:space-between;align-items:center}.em-panel__note[data-v-4383b724]{margin:8px 0 0;font-size:11px;color:var(--em-on-surface-faint)}.em-warn[data-v-4383b724]{margin:2px 0 0;font-size:10px;line-height:1.3;color:var(--em-warn)}.em-textarea[data-v-4383b724]{width:100%;box-sizing:border-box;border:1px solid var(--em-border-strong);border-radius:6px;padding:6px 8px;font:inherit;color:var(--em-on-surface);resize:vertical}.em-textarea[data-v-4383b724]:focus{outline:none;border-color:var(--em-accent)}.em-field[data-v-4383b724]{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.em-field>span[data-v-4383b724]{color:var(--em-on-surface-muted);font-size:11px}.em-multilang[data-v-4383b724],.em-jpa[data-v-4383b724],.em-class[data-v-4383b724]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px;display:flex;flex-direction:column;gap:4px}.em-multilang legend[data-v-4383b724],.em-jpa legend[data-v-4383b724],.em-class legend[data-v-4383b724]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-class .em-field[data-v-4383b724]{margin-bottom:0}.em-lang[data-v-4383b724]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.em-lang>span[data-v-4383b724]{width:22px;color:var(--em-on-surface-faint)}.em-lang[data-v-4383b724] .bs-text-input,.em-lang[data-v-4383b724]>*{flex:1}.em-check[data-v-4383b724]{color:var(--em-on-surface-strong)}.em-attr[data-v-4383b724]{border:1px solid var(--em-border);border-radius:6px;padding:6px;margin-bottom:6px;background:var(--em-surface)}.em-attr.is-focused[data-v-4383b724]{border-color:var(--em-selection);box-shadow:0 0 0 1px var(--em-selection)}.em-attr__row[data-v-4383b724]{display:flex;gap:4px;margin-bottom:4px;align-items:center}.em-attr__row .grow[data-v-4383b724]{flex:1}.em-attr__flags[data-v-4383b724]{display:flex;flex-direction:column;gap:4px;margin-top:2px}.em-attr__pii[data-v-4383b724]{display:flex;align-items:center;gap:6px;margin-top:4px}.em-attr__pii>span[data-v-4383b724]{color:var(--em-on-surface-muted);font-size:11px;white-space:nowrap}.em-attr__pii[data-v-4383b724]>:last-child{flex:1}.em-attr__codetop[data-v-4383b724]{margin-top:10px}.em-check--block[data-v-4383b724]{display:block;margin-bottom:8px}.em-embed-cols[data-v-4383b724]{display:flex;flex-direction:column;gap:6px;padding-left:8px;border-left:2px solid var(--em-border-strong)}.em-embed-col[data-v-4383b724]{display:flex;flex-direction:column;gap:4px}.em-embed-col__label[data-v-4383b724]{font-size:10px;color:var(--em-on-surface-faint)}.em-embed-upd[data-v-4383b724]{display:flex;align-items:center;gap:6px}.em-embed-upd>span[data-v-4383b724]{color:var(--em-on-surface-muted);font-size:11px}.em-attr[data-v-4383b724] .bs-button.em-del-btn{color:var(--em-danger)}.em-swatch[data-v-4383b724]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px}.em-swatch legend[data-v-4383b724]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-swatch__row[data-v-4383b724]{display:flex;gap:4px;flex-wrap:wrap}.em-attr__swatch[data-v-4383b724]{margin-top:6px;align-items:center}.em-attr__swatch-hint[data-v-4383b724]{margin-left:4px;color:var(--em-on-surface-faint);font-size:10px;white-space:nowrap}.em-swatch__chip[data-v-4383b724]{width:18px;height:18px;border-radius:4px;border:1px solid rgb(0 0 0 / .15);padding:0;cursor:pointer;box-sizing:border-box}.em-swatch__chip.is-on[data-v-4383b724]{box-shadow:0 0 0 2px var(--em-surface),0 0 0 3.5px var(--em-selection)}.em-swatch__none[data-v-4383b724]{background:var(--em-surface);color:var(--em-on-surface-faint);font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center}.em-section[data-v-4383b724]{border:0;margin:0;padding:0;min-width:0}.em-panel__sub[data-v-63401907]{margin:14px 0 6px;font-size:12px;color:var(--em-on-surface-strong);display:flex;justify-content:space-between;align-items:center}.em-panel__note[data-v-63401907]{margin:8px 0 0;font-size:11px;color:var(--em-on-surface-faint)}.em-warn[data-v-63401907]{margin:2px 0 0;font-size:10px;line-height:1.3;color:var(--em-warn)}.em-textarea[data-v-63401907]{width:100%;box-sizing:border-box;border:1px solid var(--em-border-strong);border-radius:6px;padding:6px 8px;font:inherit;color:var(--em-on-surface);resize:vertical}.em-textarea[data-v-63401907]:focus{outline:none;border-color:var(--em-accent)}.em-field[data-v-63401907]{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.em-field>span[data-v-63401907]{color:var(--em-on-surface-muted);font-size:11px}.em-multilang[data-v-63401907],.em-jpa[data-v-63401907],.em-class[data-v-63401907]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px;display:flex;flex-direction:column;gap:4px}.em-multilang legend[data-v-63401907],.em-jpa legend[data-v-63401907],.em-class legend[data-v-63401907]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-class .em-field[data-v-63401907]{margin-bottom:0}.em-lang[data-v-63401907]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.em-lang>span[data-v-63401907]{width:22px;color:var(--em-on-surface-faint)}.em-lang[data-v-63401907] .bs-text-input,.em-lang[data-v-63401907]>*{flex:1}.em-check[data-v-63401907]{color:var(--em-on-surface-strong)}.em-attr[data-v-63401907]{border:1px solid var(--em-border);border-radius:6px;padding:6px;margin-bottom:6px;background:var(--em-surface)}.em-attr.is-focused[data-v-63401907]{border-color:var(--em-selection);box-shadow:0 0 0 1px var(--em-selection)}.em-attr__row[data-v-63401907]{display:flex;gap:4px;margin-bottom:4px;align-items:center}.em-attr__row .grow[data-v-63401907]{flex:1}.em-attr__flags[data-v-63401907]{display:flex;flex-direction:column;gap:4px;margin-top:2px}.em-attr__pii[data-v-63401907]{display:flex;align-items:center;gap:6px;margin-top:4px}.em-attr__pii>span[data-v-63401907]{color:var(--em-on-surface-muted);font-size:11px;white-space:nowrap}.em-attr__pii[data-v-63401907]>:last-child{flex:1}.em-attr__codetop[data-v-63401907]{margin-top:10px}.em-check--block[data-v-63401907]{display:block;margin-bottom:8px}.em-embed-cols[data-v-63401907]{display:flex;flex-direction:column;gap:6px;padding-left:8px;border-left:2px solid var(--em-border-strong)}.em-embed-col[data-v-63401907]{display:flex;flex-direction:column;gap:4px}.em-embed-col__label[data-v-63401907]{font-size:10px;color:var(--em-on-surface-faint)}.em-embed-upd[data-v-63401907]{display:flex;align-items:center;gap:6px}.em-embed-upd>span[data-v-63401907]{color:var(--em-on-surface-muted);font-size:11px}.em-attr[data-v-63401907] .bs-button.em-del-btn{color:var(--em-danger)}.em-swatch[data-v-63401907]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px}.em-swatch legend[data-v-63401907]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-swatch__row[data-v-63401907]{display:flex;gap:4px;flex-wrap:wrap}.em-attr__swatch[data-v-63401907]{margin-top:6px;align-items:center}.em-attr__swatch-hint[data-v-63401907]{margin-left:4px;color:var(--em-on-surface-faint);font-size:10px;white-space:nowrap}.em-swatch__chip[data-v-63401907]{width:18px;height:18px;border-radius:4px;border:1px solid rgb(0 0 0 / .15);padding:0;cursor:pointer;box-sizing:border-box}.em-swatch__chip.is-on[data-v-63401907]{box-shadow:0 0 0 2px var(--em-surface),0 0 0 3.5px var(--em-selection)}.em-swatch__none[data-v-63401907]{background:var(--em-surface);color:var(--em-on-surface-faint);font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center}.em-section[data-v-63401907]{border:0;margin:0;padding:0;min-width:0}.em-idx-params[data-v-63401907]{margin-top:6px}.em-panel__sub[data-v-cd38ffcd]{margin:14px 0 6px;font-size:12px;color:var(--em-on-surface-strong);display:flex;justify-content:space-between;align-items:center}.em-panel__note[data-v-cd38ffcd]{margin:8px 0 0;font-size:11px;color:var(--em-on-surface-faint)}.em-warn[data-v-cd38ffcd]{margin:2px 0 0;font-size:10px;line-height:1.3;color:var(--em-warn)}.em-textarea[data-v-cd38ffcd]{width:100%;box-sizing:border-box;border:1px solid var(--em-border-strong);border-radius:6px;padding:6px 8px;font:inherit;color:var(--em-on-surface);resize:vertical}.em-textarea[data-v-cd38ffcd]:focus{outline:none;border-color:var(--em-accent)}.em-field[data-v-cd38ffcd]{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.em-field>span[data-v-cd38ffcd]{color:var(--em-on-surface-muted);font-size:11px}.em-multilang[data-v-cd38ffcd],.em-jpa[data-v-cd38ffcd],.em-class[data-v-cd38ffcd]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px;display:flex;flex-direction:column;gap:4px}.em-multilang legend[data-v-cd38ffcd],.em-jpa legend[data-v-cd38ffcd],.em-class legend[data-v-cd38ffcd]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-class .em-field[data-v-cd38ffcd]{margin-bottom:0}.em-lang[data-v-cd38ffcd]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.em-lang>span[data-v-cd38ffcd]{width:22px;color:var(--em-on-surface-faint)}.em-lang[data-v-cd38ffcd] .bs-text-input,.em-lang[data-v-cd38ffcd]>*{flex:1}.em-check[data-v-cd38ffcd]{color:var(--em-on-surface-strong)}.em-attr[data-v-cd38ffcd]{border:1px solid var(--em-border);border-radius:6px;padding:6px;margin-bottom:6px;background:var(--em-surface)}.em-attr.is-focused[data-v-cd38ffcd]{border-color:var(--em-selection);box-shadow:0 0 0 1px var(--em-selection)}.em-attr__row[data-v-cd38ffcd]{display:flex;gap:4px;margin-bottom:4px;align-items:center}.em-attr__row .grow[data-v-cd38ffcd]{flex:1}.em-attr__flags[data-v-cd38ffcd]{display:flex;flex-direction:column;gap:4px;margin-top:2px}.em-attr__pii[data-v-cd38ffcd]{display:flex;align-items:center;gap:6px;margin-top:4px}.em-attr__pii>span[data-v-cd38ffcd]{color:var(--em-on-surface-muted);font-size:11px;white-space:nowrap}.em-attr__pii[data-v-cd38ffcd]>:last-child{flex:1}.em-attr__codetop[data-v-cd38ffcd]{margin-top:10px}.em-check--block[data-v-cd38ffcd]{display:block;margin-bottom:8px}.em-embed-cols[data-v-cd38ffcd]{display:flex;flex-direction:column;gap:6px;padding-left:8px;border-left:2px solid var(--em-border-strong)}.em-embed-col[data-v-cd38ffcd]{display:flex;flex-direction:column;gap:4px}.em-embed-col__label[data-v-cd38ffcd]{font-size:10px;color:var(--em-on-surface-faint)}.em-embed-upd[data-v-cd38ffcd]{display:flex;align-items:center;gap:6px}.em-embed-upd>span[data-v-cd38ffcd]{color:var(--em-on-surface-muted);font-size:11px}.em-attr[data-v-cd38ffcd] .bs-button.em-del-btn{color:var(--em-danger)}.em-swatch[data-v-cd38ffcd]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px}.em-swatch legend[data-v-cd38ffcd]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-swatch__row[data-v-cd38ffcd]{display:flex;gap:4px;flex-wrap:wrap}.em-attr__swatch[data-v-cd38ffcd]{margin-top:6px;align-items:center}.em-attr__swatch-hint[data-v-cd38ffcd]{margin-left:4px;color:var(--em-on-surface-faint);font-size:10px;white-space:nowrap}.em-swatch__chip[data-v-cd38ffcd]{width:18px;height:18px;border-radius:4px;border:1px solid rgb(0 0 0 / .15);padding:0;cursor:pointer;box-sizing:border-box}.em-swatch__chip.is-on[data-v-cd38ffcd]{box-shadow:0 0 0 2px var(--em-surface),0 0 0 3.5px var(--em-selection)}.em-swatch__none[data-v-cd38ffcd]{background:var(--em-surface);color:var(--em-on-surface-faint);font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center}.em-section[data-v-cd38ffcd]{border:0;margin:0;padding:0;min-width:0}.em-panel__sub[data-v-cca729a3]{margin:14px 0 6px;font-size:12px;color:var(--em-on-surface-strong);display:flex;justify-content:space-between;align-items:center}.em-panel__note[data-v-cca729a3]{margin:8px 0 0;font-size:11px;color:var(--em-on-surface-faint)}.em-warn[data-v-cca729a3]{margin:2px 0 0;font-size:10px;line-height:1.3;color:var(--em-warn)}.em-textarea[data-v-cca729a3]{width:100%;box-sizing:border-box;border:1px solid var(--em-border-strong);border-radius:6px;padding:6px 8px;font:inherit;color:var(--em-on-surface);resize:vertical}.em-textarea[data-v-cca729a3]:focus{outline:none;border-color:var(--em-accent)}.em-field[data-v-cca729a3]{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.em-field>span[data-v-cca729a3]{color:var(--em-on-surface-muted);font-size:11px}.em-multilang[data-v-cca729a3],.em-jpa[data-v-cca729a3],.em-class[data-v-cca729a3]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px;display:flex;flex-direction:column;gap:4px}.em-multilang legend[data-v-cca729a3],.em-jpa legend[data-v-cca729a3],.em-class legend[data-v-cca729a3]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-class .em-field[data-v-cca729a3]{margin-bottom:0}.em-lang[data-v-cca729a3]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.em-lang>span[data-v-cca729a3]{width:22px;color:var(--em-on-surface-faint)}.em-lang[data-v-cca729a3] .bs-text-input,.em-lang[data-v-cca729a3]>*{flex:1}.em-check[data-v-cca729a3]{color:var(--em-on-surface-strong)}.em-attr[data-v-cca729a3]{border:1px solid var(--em-border);border-radius:6px;padding:6px;margin-bottom:6px;background:var(--em-surface)}.em-attr.is-focused[data-v-cca729a3]{border-color:var(--em-selection);box-shadow:0 0 0 1px var(--em-selection)}.em-attr__row[data-v-cca729a3]{display:flex;gap:4px;margin-bottom:4px;align-items:center}.em-attr__row .grow[data-v-cca729a3]{flex:1}.em-attr__flags[data-v-cca729a3]{display:flex;flex-direction:column;gap:4px;margin-top:2px}.em-attr__pii[data-v-cca729a3]{display:flex;align-items:center;gap:6px;margin-top:4px}.em-attr__pii>span[data-v-cca729a3]{color:var(--em-on-surface-muted);font-size:11px;white-space:nowrap}.em-attr__pii[data-v-cca729a3]>:last-child{flex:1}.em-attr__codetop[data-v-cca729a3]{margin-top:10px}.em-check--block[data-v-cca729a3]{display:block;margin-bottom:8px}.em-embed-cols[data-v-cca729a3]{display:flex;flex-direction:column;gap:6px;padding-left:8px;border-left:2px solid var(--em-border-strong)}.em-embed-col[data-v-cca729a3]{display:flex;flex-direction:column;gap:4px}.em-embed-col__label[data-v-cca729a3]{font-size:10px;color:var(--em-on-surface-faint)}.em-embed-upd[data-v-cca729a3]{display:flex;align-items:center;gap:6px}.em-embed-upd>span[data-v-cca729a3]{color:var(--em-on-surface-muted);font-size:11px}.em-attr[data-v-cca729a3] .bs-button.em-del-btn{color:var(--em-danger)}.em-swatch[data-v-cca729a3]{border:1px solid var(--em-border);border-radius:6px;padding:6px 8px;margin-bottom:8px}.em-swatch legend[data-v-cca729a3]{color:var(--em-on-surface-muted);font-size:11px;padding:0 4px}.em-swatch__row[data-v-cca729a3]{display:flex;gap:4px;flex-wrap:wrap}.em-attr__swatch[data-v-cca729a3]{margin-top:6px;align-items:center}.em-attr__swatch-hint[data-v-cca729a3]{margin-left:4px;color:var(--em-on-surface-faint);font-size:10px;white-space:nowrap}.em-swatch__chip[data-v-cca729a3]{width:18px;height:18px;border-radius:4px;border:1px solid rgb(0 0 0 / .15);padding:0;cursor:pointer;box-sizing:border-box}.em-swatch__chip.is-on[data-v-cca729a3]{box-shadow:0 0 0 2px var(--em-surface),0 0 0 3.5px var(--em-selection)}.em-swatch__none[data-v-cca729a3]{background:var(--em-surface);color:var(--em-on-surface-faint);font-size:11px;line-height:1;display:flex;align-items:center;justify-content:center}.em-panel[data-v-cca729a3]{width:320px;height:100%;display:flex;flex-direction:column;background:var(--em-surface-sunken);border-left:1px solid var(--em-border-strong);font-size:12px;box-sizing:border-box}.em-panel__head[data-v-cca729a3]{flex:0 0 auto;margin:0;padding:12px 12px 8px;border-bottom:1px solid var(--em-border);background:var(--em-surface-sunken)}.em-panel__title[data-v-cca729a3]{margin:0;font-size:14px;color:var(--em-on-surface)}.em-panel__context[data-v-cca729a3]{margin:2px 0 0;font-size:11px;color:var(--em-on-surface-faint)}.em-panel__body[data-v-cca729a3]{flex:1 1 auto;overflow-y:auto;padding:10px 12px 12px;border:0;margin:0;min-width:0}.em-panel__body[data-v-cca729a3]:disabled{opacity:.7}.em-end[data-v-cca729a3]{border-top:1px solid var(--em-border);padding-top:8px}.em-validation[data-v-bc9e6f86]{flex:0 0 auto;display:flex;flex-direction:column;background:var(--em-surface-sunken);border-top:1px solid var(--em-border-strong);min-height:0;box-sizing:border-box}.em-validation[data-v-bc9e6f86]:not(.is-open){align-self:flex-end;width:320px;border-left:1px solid var(--em-border-strong)}.em-validation.is-open[data-v-bc9e6f86]{align-self:stretch;max-height:40%}.em-validation__head[data-v-bc9e6f86]{display:flex;align-items:center;justify-content:space-between;padding:4px 10px;flex:0 0 auto;cursor:pointer;-webkit-user-select:none;user-select:none;border-bottom:1px solid transparent}.em-validation.is-open .em-validation__head[data-v-bc9e6f86]{border-bottom-color:var(--em-border)}.em-validation__toggle[data-v-bc9e6f86]{display:flex;align-items:center;gap:4px;border:none;background:none;cursor:pointer;padding:2px 0;font-size:12px;font-weight:600;color:var(--em-on-surface-strong)}.em-validation__chevron[data-v-bc9e6f86]{transition:transform .15s ease}.em-validation__chevron.is-open[data-v-bc9e6f86]{transform:rotate(90deg)}.em-validation__opt[data-v-bc9e6f86]{display:block;padding:6px 10px;font-size:12px;color:var(--em-on-surface-muted);border-bottom:1px solid var(--em-border)}.em-validation__counts[data-v-bc9e6f86]{display:flex;align-items:center;gap:4px}.em-validation__count[data-v-bc9e6f86]{display:flex;align-items:center;gap:3px;border:1px solid transparent;border-radius:4px;background:none;cursor:pointer;padding:2px 6px;font-size:12px;font-variant-numeric:tabular-nums;color:var(--em-on-surface-muted);transition:background .12s ease,color .12s ease}.em-validation__count.is-error[data-v-bc9e6f86]{color:var(--em-error)}.em-validation__count.is-warning[data-v-bc9e6f86]{color:var(--em-warn)}.em-validation__count.is-info[data-v-bc9e6f86]{color:var(--em-info)}.em-validation__count[data-v-bc9e6f86]:hover{background:var(--em-border)}.em-validation__count.is-off[data-v-bc9e6f86]{color:var(--em-on-surface-muted);opacity:.5}.em-validation__body[data-v-bc9e6f86]{flex:1;min-height:0;overflow-y:auto}.em-validation__empty[data-v-bc9e6f86]{padding:12px;margin:0;font-size:12px;color:var(--em-on-surface-muted)}.em-validation__list[data-v-bc9e6f86]{list-style:none;margin:0;padding:0}.em-validation__item[data-v-bc9e6f86]{display:flex;align-items:flex-start;gap:8px;padding:5px 10px;font-size:12px;line-height:1.4;color:var(--em-on-surface);border-bottom:1px solid var(--em-border)}.em-validation__item.is-clickable[data-v-bc9e6f86]{cursor:pointer}.em-validation__item.is-clickable[data-v-bc9e6f86]:hover{background:var(--em-accent-subtle)}.em-validation__item-icon[data-v-bc9e6f86]{margin-top:1px}.em-validation__item.is-error .em-validation__item-icon[data-v-bc9e6f86]{color:var(--em-error)}.em-validation__item.is-warning .em-validation__item-icon[data-v-bc9e6f86]{color:var(--em-warn)}.em-validation__item.is-info .em-validation__item-icon[data-v-bc9e6f86]{color:var(--em-info)}.em-validation__item-msg[data-v-bc9e6f86]{flex:1;min-width:0}.em-validation__item-entity[data-v-bc9e6f86]{display:inline-block;margin-right:6px;padding:0 6px;border-radius:3px;background:var(--em-border);color:var(--em-on-surface-strong);font-size:11px;font-weight:600;vertical-align:baseline}.em-validation__item-cat[data-v-bc9e6f86]{flex:0 0 auto;font-size:11px;color:var(--em-on-surface-muted);opacity:.7;cursor:help}.em-modeler[data-v-ab7aefbd]{display:flex;flex-direction:column;height:100%;min-height:0}.em-modeler__body[data-v-ab7aefbd]{flex:1;min-height:0;display:flex;position:relative}.em-modeler__canvas[data-v-ab7aefbd]{flex:1;min-width:0}.em-modeler__canvas[data-v-ab7aefbd] .vue-flow__controls{transition:transform .25s cubic-bezier(.4,0,.2,1)}.em-modeler__canvas.is-drawer-open[data-v-ab7aefbd] .vue-flow__controls{transform:translate(254px)}.em-drawer[data-v-ab7aefbd]{position:absolute;top:0;left:0;bottom:0;width:260px;z-index:6;overflow:hidden;border-right:1px solid var(--em-border-strong);background:var(--em-surface-sunken);box-shadow:2px 0 8px #0f172a14;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s ease}.em-drawer.is-collapsed[data-v-ab7aefbd]{transform:translate(-100%);box-shadow:none}.em-drawer__inner[data-v-ab7aefbd]{width:100%;height:100%;display:flex;flex-direction:column;min-height:0}.em-drawer__inner[data-v-ab7aefbd] .em-explorer{flex:1;min-height:0}.em-drawer__head[data-v-ab7aefbd]{display:flex;align-items:center;justify-content:space-between;padding:6px 8px 6px 12px;font-size:12px;font-weight:600;color:var(--em-on-surface-strong);border-bottom:1px solid var(--em-border);flex:0 0 auto}.em-drawer__actions[data-v-ab7aefbd]{display:flex;align-items:center;gap:2px}.em-drawer__btn[data-v-ab7aefbd],.em-drawer__reopen[data-v-ab7aefbd]{display:flex;align-items:center;justify-content:center;border:none;background:none;cursor:pointer;color:var(--em-on-surface-muted);padding:4px;border-radius:4px;transition:color .15s ease,background .15s ease}.em-drawer__btn[data-v-ab7aefbd]:hover,.em-drawer__reopen[data-v-ab7aefbd]:hover{color:var(--em-on-surface);background:var(--em-border)}.em-drawer__reopen[data-v-ab7aefbd]{position:absolute;top:8px;left:8px;z-index:5;padding:6px;background:var(--em-surface);border:1px solid var(--em-border-strong);box-shadow:0 1px 3px #0000001a}.em-reopen-enter-active[data-v-ab7aefbd],.em-reopen-leave-active[data-v-ab7aefbd]{transition:opacity .2s ease}.em-reopen-enter-from[data-v-ab7aefbd],.em-reopen-leave-to[data-v-ab7aefbd]{opacity:0}
|