@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.
Files changed (70) hide show
  1. package/LICENSE +6 -0
  2. package/README.md +42 -0
  3. package/dist/adapter/diagramAdapter.d.ts +44 -0
  4. package/dist/adapter/persisted.d.ts +245 -0
  5. package/dist/agent/buildAgentBatch.d.ts +16 -0
  6. package/dist/agent/resolver.d.ts +54 -0
  7. package/dist/agent/schema.d.ts +9 -0
  8. package/dist/agent/symbolicOp.d.ts +109 -0
  9. package/dist/command/commands.d.ts +108 -0
  10. package/dist/command/op.d.ts +80 -0
  11. package/dist/command/opSync.d.ts +89 -0
  12. package/dist/command/stack.d.ts +48 -0
  13. package/dist/command/types.d.ts +29 -0
  14. package/dist/core/autolayout.d.ts +12 -0
  15. package/dist/core/dbTypes.d.ts +45 -0
  16. package/dist/core/id.d.ts +2 -0
  17. package/dist/core/javaTypes.d.ts +52 -0
  18. package/dist/core/propagation.d.ts +49 -0
  19. package/dist/core/relationMarker.d.ts +44 -0
  20. package/dist/core/resolve.d.ts +63 -0
  21. package/dist/core/routing.d.ts +58 -0
  22. package/dist/core/sharedColumn.d.ts +19 -0
  23. package/dist/core/sqlReservedWords.d.ts +25 -0
  24. package/dist/core/svg.d.ts +98 -0
  25. package/dist/core/text.d.ts +8 -0
  26. package/dist/core/types.d.ts +400 -0
  27. package/dist/core/validation.d.ts +53 -0
  28. package/dist/editor/controller.d.ts +371 -0
  29. package/dist/entity-modeler-next.css +1 -0
  30. package/dist/entity-modeler.js +19943 -0
  31. package/dist/entity-modeler.umd.cjs +41 -0
  32. package/dist/index.d.ts +32 -0
  33. package/dist/view/AssociationEdge.vue.d.ts +16 -0
  34. package/dist/view/DiagramCanvas.vue.d.ts +9 -0
  35. package/dist/view/DiagramExplorer.vue.d.ts +11 -0
  36. package/dist/view/EditModeToggle.vue.d.ts +10 -0
  37. package/dist/view/EditorToolbar.vue.d.ts +10 -0
  38. package/dist/view/EmContextMenu.vue.d.ts +26 -0
  39. package/dist/view/EmIcon.vue.d.ts +12 -0
  40. package/dist/view/EntityAttributesWide.vue.d.ts +7 -0
  41. package/dist/view/EntityBasicsSection.vue.d.ts +7 -0
  42. package/dist/view/EntityColumnsSection.vue.d.ts +7 -0
  43. package/dist/view/EntityDetailModal.vue.d.ts +7 -0
  44. package/dist/view/EntityIndexSection.vue.d.ts +7 -0
  45. package/dist/view/EntityIndexesWide.vue.d.ts +7 -0
  46. package/dist/view/EntityModeler.vue.d.ts +6 -0
  47. package/dist/view/EntityNode.vue.d.ts +20 -0
  48. package/dist/view/EntityOperationsSection.vue.d.ts +7 -0
  49. package/dist/view/EntityOperationsWide.vue.d.ts +7 -0
  50. package/dist/view/EntityTextPreview.vue.d.ts +5 -0
  51. package/dist/view/GroupCodeCombobox.vue.d.ts +11 -0
  52. package/dist/view/GroupNode.vue.d.ts +11 -0
  53. package/dist/view/InlineIssueBadge.vue.d.ts +8 -0
  54. package/dist/view/MultiLangTextField.vue.d.ts +24 -0
  55. package/dist/view/NoteConnectionEdge.vue.d.ts +12 -0
  56. package/dist/view/NoteNode.vue.d.ts +11 -0
  57. package/dist/view/OperationSourceEditor.vue.d.ts +7 -0
  58. package/dist/view/PropertyPanel.vue.d.ts +6 -0
  59. package/dist/view/ValidationPanel.vue.d.ts +6 -0
  60. package/dist/view/diagramGeometry.d.ts +9 -0
  61. package/dist/view/exportSvg.d.ts +7 -0
  62. package/dist/view/groupCodeFilter.d.ts +8 -0
  63. package/dist/view/groupHover.d.ts +10 -0
  64. package/dist/view/openEntityDetail.d.ts +5 -0
  65. package/dist/view/relationHighlight.d.ts +38 -0
  66. package/dist/view/swatches.d.ts +37 -0
  67. package/dist/view/useFloatingRoute.d.ts +28 -0
  68. package/dist/view/validationDisplay.d.ts +10 -0
  69. package/dist/view/waypointController.d.ts +14 -0
  70. 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}