code-constraints 0.1.0__py3-none-any.whl
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.
- code_constraints/__init__.py +1 -0
- code_constraints/cli/__init__.py +0 -0
- code_constraints/cli/__main__.py +1555 -0
- code_constraints/cli/_assets/agents/cdec-architect.md +468 -0
- code_constraints/cli/_assets/agents/oop-refactor-architect.md +317 -0
- code_constraints/cli/_assets/shims/csharp/CodeConstraintsRules.cs +94 -0
- code_constraints/cli/_assets/shims/julia/CdecRules.jl +129 -0
- code_constraints/cli/_assets/shims/lua/cdec_rules.lua +92 -0
- code_constraints/cli/_assets/shims/odin/cdec_rules.odin +67 -0
- code_constraints/cli/_assets/shims/python/cdec_rules.py +94 -0
- code_constraints/cli/_assets/skills/cdec-architecture-loop/SKILL.md +152 -0
- code_constraints/cli/depstamp.py +118 -0
- code_constraints/cli/detect.py +77 -0
- code_constraints/cli/interactive.py +304 -0
- code_constraints/cli/scaffold.py +602 -0
- code_constraints/cli/update.py +157 -0
- code_constraints/core/__init__.py +41 -0
- code_constraints/core/annotations.py +217 -0
- code_constraints/core/associations.py +134 -0
- code_constraints/core/diff.py +302 -0
- code_constraints/core/editor_io.py +280 -0
- code_constraints/core/graph_model.py +681 -0
- code_constraints/core/keys.py +105 -0
- code_constraints/core/model.py +294 -0
- code_constraints/core/model_io.py +65 -0
- code_constraints/core/receivers.py +34 -0
- code_constraints/core/rules.py +177 -0
- code_constraints/core/rulesdoc.py +208 -0
- code_constraints/core/tags.py +114 -0
- code_constraints/core/ts_fingerprint.py +88 -0
- code_constraints/core/xmi_reader.py +358 -0
- code_constraints/core/xmi_writer.py +373 -0
- code_constraints/csharp/__init__.py +3 -0
- code_constraints/csharp/activity.py +250 -0
- code_constraints/csharp/conformance.py +331 -0
- code_constraints/csharp/fingerprint.py +274 -0
- code_constraints/csharp/parser.py +436 -0
- code_constraints/csharp/rules_extract.py +78 -0
- code_constraints/csharp/sequence.py +295 -0
- code_constraints/enforce/__init__.py +15 -0
- code_constraints/enforce/engine.py +122 -0
- code_constraints/enforce/model.py +74 -0
- code_constraints/julia/__init__.py +5 -0
- code_constraints/julia/conformance.py +282 -0
- code_constraints/julia/fingerprint.py +226 -0
- code_constraints/julia/parser.py +523 -0
- code_constraints/julia/rules_extract.py +216 -0
- code_constraints/lint/__init__.py +10 -0
- code_constraints/lint/baseline.py +96 -0
- code_constraints/lint/config.py +239 -0
- code_constraints/lint/engine.py +179 -0
- code_constraints/lint/pipeline.py +108 -0
- code_constraints/lint/report.py +151 -0
- code_constraints/lint/rules/__init__.py +50 -0
- code_constraints/lint/rules/base.py +200 -0
- code_constraints/lint/rules/cyclic_package_dependencies.py +69 -0
- code_constraints/lint/rules/dangling_classes.py +98 -0
- code_constraints/lint/rules/forbidden_package_references.py +47 -0
- code_constraints/lint/rules/forbidden_references.py +48 -0
- code_constraints/lint/rules/frozen_members.py +67 -0
- code_constraints/lint/rules/frozen_rules.py +105 -0
- code_constraints/lint/rules/implementation_locks.py +156 -0
- code_constraints/lint/rules/layer_dependencies.py +92 -0
- code_constraints/lint/rules/max_class_fanout.py +41 -0
- code_constraints/lint/rules/no_new_classes.py +27 -0
- code_constraints/lint/rules/no_removed_classes.py +27 -0
- code_constraints/lint/rules/reference_architecture.py +111 -0
- code_constraints/lint/rules/subclass_naming.py +71 -0
- code_constraints/lint/rules/tag_conformance.py +76 -0
- code_constraints/lock/__init__.py +73 -0
- code_constraints/lock/engine.py +395 -0
- code_constraints/lock/model.py +235 -0
- code_constraints/lock/store.py +144 -0
- code_constraints/lua/__init__.py +5 -0
- code_constraints/lua/conformance.py +239 -0
- code_constraints/lua/fingerprint.py +252 -0
- code_constraints/lua/parser.py +500 -0
- code_constraints/lua/rules_extract.py +55 -0
- code_constraints/mcp/__init__.py +20 -0
- code_constraints/mcp/__main__.py +73 -0
- code_constraints/mcp/server.py +1203 -0
- code_constraints/odin/__init__.py +5 -0
- code_constraints/odin/conformance.py +244 -0
- code_constraints/odin/fingerprint.py +159 -0
- code_constraints/odin/parser.py +471 -0
- code_constraints/odin/rules_extract.py +38 -0
- code_constraints/python/__init__.py +3 -0
- code_constraints/python/activity.py +278 -0
- code_constraints/python/conformance.py +249 -0
- code_constraints/python/fingerprint.py +231 -0
- code_constraints/python/parser.py +330 -0
- code_constraints/python/rules_extract.py +83 -0
- code_constraints/python/sequence.py +257 -0
- code_constraints/reference/__init__.py +15 -0
- code_constraints/reference/compare.py +356 -0
- code_constraints/reference/report.py +38 -0
- code_constraints/svelte/__init__.py +3 -0
- code_constraints/svelte/parser.py +523 -0
- code_constraints/typescript/__init__.py +3 -0
- code_constraints/typescript/parser.py +590 -0
- code_constraints/waivers/__init__.py +89 -0
- code_constraints/waivers/collect.py +167 -0
- code_constraints/waivers/model.py +90 -0
- code_constraints/waivers/ops.py +150 -0
- code_constraints/waivers/review.py +156 -0
- code_constraints/waivers/store.py +300 -0
- code_constraints/web/__init__.py +0 -0
- code_constraints/web/_static/assets/index-3ivBsYY4.css +1 -0
- code_constraints/web/_static/assets/index-BTzTqGFp.js +9 -0
- code_constraints/web/_static/index.html +13 -0
- code_constraints/web/app.py +1076 -0
- code_constraints-0.1.0.dist-info/METADATA +663 -0
- code_constraints-0.1.0.dist-info/RECORD +116 -0
- code_constraints-0.1.0.dist-info/WHEEL +4 -0
- code_constraints-0.1.0.dist-info/entry_points.txt +3 -0
- code_constraints-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"""The accepted-issue ledger — the `exceptions:` section of `.cdec/rules.yaml`.
|
|
2
|
+
|
|
3
|
+
An *exception* is a recorded decision that one known issue is allowed to stay.
|
|
4
|
+
It lives next to the rule it exempts, in the same committed file, because that
|
|
5
|
+
is the diff a reviewer reads: the law and the exceptions granted against it,
|
|
6
|
+
together.
|
|
7
|
+
|
|
8
|
+
Shape (in the tool-managed tail of `rules.yaml`, see
|
|
9
|
+
`code_constraints.core.rulesdoc`):
|
|
10
|
+
|
|
11
|
+
exceptions:
|
|
12
|
+
- key: V-1A2B3C4D
|
|
13
|
+
engine: check # configured rules
|
|
14
|
+
rule: domain-must-not-depend-on-ui
|
|
15
|
+
qualified_name: app.domain.Order
|
|
16
|
+
detail: "->app.ui.View"
|
|
17
|
+
reason: legacy, tracked in ARCH-42
|
|
18
|
+
added: "2026-08-04T09:00:00+00:00"
|
|
19
|
+
added_by: fran
|
|
20
|
+
- key: F-9E8D7C6B
|
|
21
|
+
engine: enforce # source-tag conformance
|
|
22
|
+
rule: no-instantiation
|
|
23
|
+
qualified_name: app.billing.Ledger
|
|
24
|
+
detail: "settle->Invoice"
|
|
25
|
+
|
|
26
|
+
`.cdec/baseline.yaml` was the old home, with a rule-keyed map per engine
|
|
27
|
+
(`violations:` / `findings:`). Both that file and that shape still load — the
|
|
28
|
+
key is derived from the tuple, so nothing needs rewriting — and
|
|
29
|
+
`cdec init --migrate` folds them into `rules.yaml`.
|
|
30
|
+
|
|
31
|
+
Deliberately engine-agnostic: this module deals in plain strings and never
|
|
32
|
+
imports `lint`, `enforce`, or `lock`, so the engines stay decoupled and each one
|
|
33
|
+
adapts its own result type at the boundary.
|
|
34
|
+
|
|
35
|
+
Locks have no place here on purpose. Accepting a changed frozen implementation
|
|
36
|
+
is `cdec check --automatic-exceptions locks --force` — a privileged, separately
|
|
37
|
+
reviewed act — and routing it through an exception would quietly undo that.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from __future__ import annotations
|
|
41
|
+
|
|
42
|
+
from dataclasses import dataclass, field
|
|
43
|
+
from datetime import datetime, timezone
|
|
44
|
+
from pathlib import Path
|
|
45
|
+
from typing import Any, Iterable
|
|
46
|
+
|
|
47
|
+
from code_constraints.core.keys import make_key
|
|
48
|
+
from code_constraints.core.rulesdoc import (
|
|
49
|
+
RULES_FILENAME,
|
|
50
|
+
RulesFileError,
|
|
51
|
+
load_document,
|
|
52
|
+
write_sections,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
BASELINE_FILENAME = "baseline.yaml" # legacy standalone ledger
|
|
56
|
+
EXCEPTIONS_SECTION = "exceptions"
|
|
57
|
+
|
|
58
|
+
#: Engines whose issues may be accepted as exceptions. `lock` is absent by
|
|
59
|
+
#: design — see the module docstring.
|
|
60
|
+
WAIVABLE_ENGINES: tuple[str, ...] = ("check", "enforce", "reference")
|
|
61
|
+
|
|
62
|
+
# Legacy nested sections: engine -> (yaml key, name of the detail field there).
|
|
63
|
+
_LEGACY_SECTIONS: dict[str, tuple[str, str]] = {
|
|
64
|
+
"check": ("violations", "signature"),
|
|
65
|
+
"enforce": ("findings", "detail"),
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class WaiverFileError(ValueError):
|
|
70
|
+
"""Raised when the ledger exists but can't be interpreted."""
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass(frozen=True)
|
|
74
|
+
class Waiver:
|
|
75
|
+
"""One accepted issue."""
|
|
76
|
+
|
|
77
|
+
engine: str # "check" | "enforce" | "reference"
|
|
78
|
+
rule: str
|
|
79
|
+
qualified_name: str
|
|
80
|
+
detail: str = ""
|
|
81
|
+
reason: str = ""
|
|
82
|
+
added: str = ""
|
|
83
|
+
added_by: str = ""
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def key(self) -> str:
|
|
87
|
+
return make_key(self.engine, self.rule, self.qualified_name, self.detail)
|
|
88
|
+
|
|
89
|
+
def with_metadata(self, reason: str, actor: str) -> "Waiver":
|
|
90
|
+
return Waiver(
|
|
91
|
+
engine=self.engine,
|
|
92
|
+
rule=self.rule,
|
|
93
|
+
qualified_name=self.qualified_name,
|
|
94
|
+
detail=self.detail,
|
|
95
|
+
reason=reason or self.reason,
|
|
96
|
+
added=self.added or now_stamp(),
|
|
97
|
+
added_by=actor or self.added_by,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@dataclass
|
|
102
|
+
class WaiverStore:
|
|
103
|
+
"""The in-memory form of the `exceptions:` list, indexed by review key."""
|
|
104
|
+
|
|
105
|
+
waivers: list[Waiver] = field(default_factory=list)
|
|
106
|
+
# Keys read verbatim from the file that don't agree with the tuple they sit
|
|
107
|
+
# next to (hand-edited entry). Honoured for matching so a hand-written key
|
|
108
|
+
# still silences its issue, but never written back out.
|
|
109
|
+
extra_keys: set[str] = field(default_factory=set)
|
|
110
|
+
|
|
111
|
+
# ---- queries ----
|
|
112
|
+
def keys(self) -> set[str]:
|
|
113
|
+
return {w.key for w in self.waivers} | self.extra_keys
|
|
114
|
+
|
|
115
|
+
def has(self, key: str) -> bool:
|
|
116
|
+
return key in self.keys()
|
|
117
|
+
|
|
118
|
+
def get(self, key: str) -> Waiver | None:
|
|
119
|
+
for w in self.waivers:
|
|
120
|
+
if w.key == key:
|
|
121
|
+
return w
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
def matches(self, engine: str, rule: str, qualified_name: str, detail: str = "") -> bool:
|
|
125
|
+
"""True when an issue with this identity is already accepted."""
|
|
126
|
+
if engine not in WAIVABLE_ENGINES:
|
|
127
|
+
return False
|
|
128
|
+
return self.has(make_key(engine, rule, qualified_name, detail))
|
|
129
|
+
|
|
130
|
+
def for_engine(self, engine: str) -> list[Waiver]:
|
|
131
|
+
return [w for w in self.waivers if w.engine == engine]
|
|
132
|
+
|
|
133
|
+
# ---- mutation ----
|
|
134
|
+
def add(self, waiver: Waiver) -> bool:
|
|
135
|
+
"""Record a waiver. Returns False when it was already present."""
|
|
136
|
+
if self.get(waiver.key) is not None:
|
|
137
|
+
return False
|
|
138
|
+
self.waivers.append(waiver)
|
|
139
|
+
self.extra_keys.discard(waiver.key)
|
|
140
|
+
return True
|
|
141
|
+
|
|
142
|
+
def remove(self, key: str) -> Waiver | None:
|
|
143
|
+
"""Drop the waiver with this key. Returns it, or None if absent."""
|
|
144
|
+
for i, w in enumerate(self.waivers):
|
|
145
|
+
if w.key == key:
|
|
146
|
+
self.extra_keys.discard(key)
|
|
147
|
+
return self.waivers.pop(i)
|
|
148
|
+
if key in self.extra_keys:
|
|
149
|
+
self.extra_keys.discard(key)
|
|
150
|
+
return None
|
|
151
|
+
return None
|
|
152
|
+
|
|
153
|
+
def replace_engine(self, engine: str, waivers: Iterable[Waiver]) -> None:
|
|
154
|
+
"""Swap every exception for one engine, leaving the others alone.
|
|
155
|
+
|
|
156
|
+
Grandfathering re-writes an engine's set wholesale; it must not silently
|
|
157
|
+
discard exceptions granted separately against a different engine.
|
|
158
|
+
"""
|
|
159
|
+
kept = [w for w in self.waivers if w.engine != engine]
|
|
160
|
+
self.waivers = kept + list(waivers)
|
|
161
|
+
|
|
162
|
+
def replace_all(self, waivers: Iterable[Waiver]) -> None:
|
|
163
|
+
"""Swap the whole set — `--automatic-exceptions rules` accepts the
|
|
164
|
+
current state of every engine that ran, so it rewrites all of it."""
|
|
165
|
+
self.waivers = list(waivers)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
# ---------- I/O ----------
|
|
169
|
+
|
|
170
|
+
def ledger_paths(config_dir: Path) -> tuple[Path, Path | None]:
|
|
171
|
+
"""(rules.yaml, legacy baseline.yaml) for a `.cdec/` dir.
|
|
172
|
+
|
|
173
|
+
A YAML file passed directly is honoured as-is, with no legacy fallback.
|
|
174
|
+
"""
|
|
175
|
+
if config_dir.suffix in (".yaml", ".yml"):
|
|
176
|
+
return config_dir, None
|
|
177
|
+
return config_dir / RULES_FILENAME, config_dir / BASELINE_FILENAME
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def load_waivers(config_dir: Path) -> WaiverStore:
|
|
181
|
+
"""Read the ledger. An absent one is an empty store, not an error.
|
|
182
|
+
|
|
183
|
+
Both the current flat `exceptions:` list and the legacy per-engine maps are
|
|
184
|
+
accepted, from `rules.yaml` or from a leftover `baseline.yaml`, so an
|
|
185
|
+
un-migrated project loses nothing.
|
|
186
|
+
"""
|
|
187
|
+
rules_file, legacy_file = ledger_paths(config_dir)
|
|
188
|
+
store = WaiverStore()
|
|
189
|
+
for path in (rules_file, legacy_file):
|
|
190
|
+
if path is None or not path.is_file():
|
|
191
|
+
continue
|
|
192
|
+
try:
|
|
193
|
+
raw = load_document(path)
|
|
194
|
+
except RulesFileError as exc:
|
|
195
|
+
raise WaiverFileError(str(exc)) from exc
|
|
196
|
+
_load_flat(store, raw.get(EXCEPTIONS_SECTION), path)
|
|
197
|
+
_load_legacy(store, raw)
|
|
198
|
+
return store
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _load_flat(store: WaiverStore, entries: Any, path: Path) -> None:
|
|
202
|
+
if entries is None:
|
|
203
|
+
return
|
|
204
|
+
if not isinstance(entries, list):
|
|
205
|
+
raise WaiverFileError(f"{path}: '{EXCEPTIONS_SECTION}' must be a list")
|
|
206
|
+
for i, item in enumerate(entries):
|
|
207
|
+
if not isinstance(item, dict):
|
|
208
|
+
raise WaiverFileError(f"{path}: {EXCEPTIONS_SECTION}[{i}] must be a mapping")
|
|
209
|
+
engine = str(item.get("engine") or "check")
|
|
210
|
+
waiver = Waiver(
|
|
211
|
+
engine=engine,
|
|
212
|
+
rule=str(item.get("rule") or ""),
|
|
213
|
+
qualified_name=str(item.get("qualified_name", "")),
|
|
214
|
+
detail=str(item.get("detail", "") or ""),
|
|
215
|
+
reason=str(item.get("reason", "") or ""),
|
|
216
|
+
added=str(item.get("added", "") or ""),
|
|
217
|
+
added_by=str(item.get("added_by", "") or ""),
|
|
218
|
+
)
|
|
219
|
+
store.add(waiver)
|
|
220
|
+
_honour_recorded_key(store, item, waiver)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def _load_legacy(store: WaiverStore, raw: dict[str, Any]) -> None:
|
|
224
|
+
"""The pre-unification shape: one rule-keyed map per engine."""
|
|
225
|
+
for engine, (section, detail_field) in _LEGACY_SECTIONS.items():
|
|
226
|
+
entries = raw.get(section) or {}
|
|
227
|
+
if not isinstance(entries, dict):
|
|
228
|
+
continue
|
|
229
|
+
for rule, items in entries.items():
|
|
230
|
+
if not isinstance(items, list):
|
|
231
|
+
continue
|
|
232
|
+
for item in items:
|
|
233
|
+
if not isinstance(item, dict):
|
|
234
|
+
continue
|
|
235
|
+
waiver = Waiver(
|
|
236
|
+
engine=engine,
|
|
237
|
+
rule=str(rule),
|
|
238
|
+
qualified_name=str(item.get("qualified_name", "")),
|
|
239
|
+
detail=str(item.get(detail_field, "") or ""),
|
|
240
|
+
reason=str(item.get("reason", "") or ""),
|
|
241
|
+
added=str(item.get("added", "") or ""),
|
|
242
|
+
added_by=str(item.get("added_by", "") or ""),
|
|
243
|
+
)
|
|
244
|
+
store.add(waiver)
|
|
245
|
+
_honour_recorded_key(store, item, waiver)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _honour_recorded_key(store: WaiverStore, item: dict[str, Any], waiver: Waiver) -> None:
|
|
249
|
+
"""A file written by an older release has no `key:` at all — the canonical
|
|
250
|
+
key is derived from the tuple, so old ledgers keep working with no
|
|
251
|
+
migration. A key that *is* present but disagrees was hand-written; honour it
|
|
252
|
+
rather than silently ignoring the edit."""
|
|
253
|
+
recorded = str(item.get("key", "") or "").strip().upper()
|
|
254
|
+
if recorded and recorded != waiver.key:
|
|
255
|
+
store.extra_keys.add(recorded)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def save_waivers(config_dir: Path, store: WaiverStore) -> Path:
|
|
259
|
+
"""Write the `exceptions:` section, sorted so the file diffs cleanly.
|
|
260
|
+
|
|
261
|
+
Only that section is rewritten — every hand-written rule and comment above
|
|
262
|
+
it survives byte for byte. Returns the file written.
|
|
263
|
+
"""
|
|
264
|
+
rules_file, _ = ledger_paths(config_dir)
|
|
265
|
+
payload: list[dict[str, str]] = []
|
|
266
|
+
for w in sorted(
|
|
267
|
+
store.waivers, key=lambda w: (w.engine, w.rule, w.qualified_name, w.detail)
|
|
268
|
+
):
|
|
269
|
+
item: dict[str, str] = {
|
|
270
|
+
"key": w.key,
|
|
271
|
+
"engine": w.engine,
|
|
272
|
+
"rule": w.rule,
|
|
273
|
+
"qualified_name": w.qualified_name,
|
|
274
|
+
}
|
|
275
|
+
if w.detail:
|
|
276
|
+
item["detail"] = w.detail
|
|
277
|
+
if w.reason:
|
|
278
|
+
item["reason"] = w.reason
|
|
279
|
+
if w.added:
|
|
280
|
+
item["added"] = w.added
|
|
281
|
+
if w.added_by:
|
|
282
|
+
item["added_by"] = w.added_by
|
|
283
|
+
payload.append(item)
|
|
284
|
+
write_sections(rules_file, {EXCEPTIONS_SECTION: payload})
|
|
285
|
+
return rules_file
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def now_stamp() -> str:
|
|
289
|
+
return datetime.now(timezone.utc).replace(microsecond=0).isoformat()
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def default_actor() -> str:
|
|
293
|
+
"""Best-effort identity for the person granting an exception."""
|
|
294
|
+
import os
|
|
295
|
+
|
|
296
|
+
for var in ("CDEC_ACTOR", "GIT_AUTHOR_NAME", "USERNAME", "USER"):
|
|
297
|
+
value = os.environ.get(var, "").strip()
|
|
298
|
+
if value:
|
|
299
|
+
return value
|
|
300
|
+
return ""
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.home.svelte-1m668wg{max-width:880px;margin:0 auto;padding:2rem 1.5rem 4rem;display:flex;flex-direction:column;gap:2rem}.hero.svelte-1m668wg h1:where(.svelte-1m668wg){margin:0 0 .3rem;font-size:1.6rem}.tagline.svelte-1m668wg{margin:0;color:var(--muted);font-size:.95rem}.tagline.svelte-1m668wg code:where(.svelte-1m668wg){background:var(--hover);padding:0 .3rem;border-radius:3px;font-size:.85em}section.svelte-1m668wg h2:where(.svelte-1m668wg){margin:0 0 .6rem;font-size:.75rem;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}.picker.svelte-1m668wg .row:where(.svelte-1m668wg){display:grid;grid-template-columns:6.5rem 1fr;align-items:center;gap:.5rem;margin-bottom:.5rem}.lbl.svelte-1m668wg{font-size:.85rem;color:var(--muted)}.picker.svelte-1m668wg input:where(.svelte-1m668wg),.picker.svelte-1m668wg select:where(.svelte-1m668wg){padding:.5rem .65rem;border:1px solid var(--border);border-radius:6px;font-size:.95rem;background:var(--bg);color:var(--fg);width:100%;box-sizing:border-box}.git-status.svelte-1m668wg{margin-top:.5rem;padding:.55rem .75rem;border-radius:6px;border:1px solid var(--border);background:var(--surface);font-size:.85rem}.git-status.tracked.svelte-1m668wg{border-left:3px solid #16a34a}.git-status.not-tracked.svelte-1m668wg{border-left:3px solid #ca8a04}.git-line.svelte-1m668wg{display:flex;align-items:baseline;gap:.5rem;flex-wrap:wrap}.git-line.svelte-1m668wg+.git-line:where(.svelte-1m668wg){margin-top:.3rem}.git-tag.svelte-1m668wg{font-size:.65rem;text-transform:uppercase;background:var(--hover);padding:.05rem .4rem;border-radius:3px;color:var(--muted)}.git-status.svelte-1m668wg code:where(.svelte-1m668wg){font-family:ui-monospace,SFMono-Regular,monospace;font-size:.82rem;color:var(--fg)}.subject.svelte-1m668wg{color:var(--muted);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.dirty.svelte-1m668wg{background:#fef3c7;color:#92400e;padding:.05rem .35rem;border-radius:3px;font-size:.7rem}.warn.svelte-1m668wg,.warn-inline.svelte-1m668wg{color:#b45309}.cards.svelte-1m668wg{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:.75rem}.card.svelte-1m668wg{text-align:left;background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:.9rem 1rem;cursor:pointer;color:var(--fg);transition:border-color .12s,transform .05s;display:flex;flex-direction:column;gap:.4rem;min-height:130px}.card.svelte-1m668wg:hover:not(:disabled){border-color:var(--accent)}.card.svelte-1m668wg:active:not(:disabled){transform:translateY(1px)}.card.svelte-1m668wg:disabled{opacity:.45;cursor:not-allowed}.card.highlight.svelte-1m668wg{background:linear-gradient(180deg,var(--surface) 0%,#f0f9ff 100%)}.card-title.svelte-1m668wg{font-weight:600;font-size:.95rem}.cli.svelte-1m668wg{font-size:.72rem;font-family:ui-monospace,SFMono-Regular,monospace;color:var(--muted);background:var(--hover);padding:.2rem .4rem;border-radius:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-self:flex-start;max-width:100%}.card-desc.svelte-1m668wg{font-size:.8rem;color:var(--muted);flex:1}.card-desc.svelte-1m668wg code:where(.svelte-1m668wg){background:var(--hover);padding:0 .25rem;border-radius:2px;font-size:.85em}.card-action.svelte-1m668wg{align-self:flex-end;background:var(--accent);color:#fff;padding:.25rem .7rem;border-radius:4px;font-size:.8rem;font-weight:600}.card.svelte-1m668wg:disabled .card-action:where(.svelte-1m668wg){background:var(--muted)}.xmi-diff.svelte-1m668wg .hint:where(.svelte-1m668wg){margin:0 0 .6rem;font-size:.85rem;color:var(--muted)}.xmi-diff.svelte-1m668wg .hint:where(.svelte-1m668wg) code:where(.svelte-1m668wg){background:var(--hover);padding:0 .3rem;border-radius:3px;font-size:.85em}.cli-hint.svelte-1m668wg{display:block;margin-top:.2rem;font-size:.78rem}.xmi-pickers.svelte-1m668wg{display:grid;grid-template-columns:1fr 1fr auto;gap:.6rem;align-items:end}.xmi-pickers.vs-xmi.svelte-1m668wg{grid-template-columns:1fr auto}.picker-box.svelte-1m668wg{display:flex;flex-direction:column;gap:.25rem;padding:.55rem .7rem;border:1px dashed var(--border);border-radius:6px;background:var(--surface);cursor:pointer}.picker-box.svelte-1m668wg .lbl:where(.svelte-1m668wg){font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}.picker-box.svelte-1m668wg input[type=file]:where(.svelte-1m668wg){font-size:.8rem;background:transparent;border:none;color:var(--fg);padding:0}.picker-box.svelte-1m668wg .filename:where(.svelte-1m668wg){font-size:.78rem;font-family:ui-monospace,SFMono-Regular,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xmi-run.svelte-1m668wg{background:var(--accent);color:#fff;border:none;border-radius:6px;padding:.55rem 1rem;cursor:pointer;font-weight:600;height:2.4rem;align-self:end}.xmi-run.svelte-1m668wg:disabled{background:var(--muted);cursor:not-allowed}.recents.svelte-1m668wg ul:where(.svelte-1m668wg){list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.3rem}.recents.svelte-1m668wg li:where(.svelte-1m668wg){display:flex;align-items:center;gap:.75rem;padding:.45rem .7rem;background:var(--surface);border:1px solid var(--border);border-radius:6px}.recent-meta.svelte-1m668wg{flex:1;display:flex;align-items:baseline;gap:.5rem;min-width:0}.recent-meta.svelte-1m668wg .path:where(.svelte-1m668wg){flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,monospace;font-size:.8rem}.lang-tag.svelte-1m668wg{background:var(--hover);padding:.05rem .4rem;border-radius:3px;font-size:.7rem}.muted.svelte-1m668wg{color:var(--muted);font-size:.75rem}.recent-actions.svelte-1m668wg{display:flex;gap:.3rem}.recent-actions.svelte-1m668wg button:where(.svelte-1m668wg){background:transparent;border:1px solid var(--border);border-radius:4px;padding:.25rem .55rem;cursor:pointer;color:var(--fg);font-size:.78rem}.recent-actions.svelte-1m668wg button:where(.svelte-1m668wg):hover{background:var(--hover)}.recent-actions.svelte-1m668wg button.ghost:where(.svelte-1m668wg){border-color:transparent;color:var(--muted);padding:.25rem .45rem}.error.svelte-1m668wg{color:#c63a3a;margin:0;font-size:.85rem}.transparent.svelte-1wg91mu{background:transparent}.a11y-hidden.svelte-13pq11u{display:none}.a11y-live-msg.svelte-13pq11u{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(0px,0px,0px,0px);clip-path:inset(100%)}.svelte-flow__selection.svelte-1vr3gfi{position:absolute;top:0;left:0}.svelte-flow__selection-wrapper.svelte-sf2y5e{position:absolute;top:0;left:0;z-index:2000;pointer-events:all}.svelte-flow__selection-wrapper.svelte-sf2y5e:focus,.svelte-flow__selection-wrapper.svelte-sf2y5e:focus-visible{outline:none}.svelte-flow.svelte-mkap6j{width:100%;height:100%;overflow:hidden;position:relative;z-index:0;background-color:var(--background-color, var(--background-color-default))}:root{--background-color-default: #fff;--background-pattern-color-default: #ddd;--minimap-mask-color-default: rgb(240, 240, 240, .6);--minimap-mask-stroke-color-default: none;--minimap-mask-stroke-width-default: 1;--controls-button-background-color-default: #fefefe;--controls-button-background-color-hover-default: #f4f4f4;--controls-button-color-default: inherit;--controls-button-color-hover-default: inherit;--controls-button-border-color-default: #eee}.svelte-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.svelte-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.svelte-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.svelte-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.svelte-flow__pane{z-index:1}.svelte-flow__pane.draggable{cursor:grab}.svelte-flow__pane.dragging{cursor:grabbing}.svelte-flow__pane.selection{cursor:pointer}.svelte-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.svelte-flow__renderer{z-index:4}.svelte-flow__selection{z-index:6}.svelte-flow__nodesselection-rect:focus,.svelte-flow__nodesselection-rect:focus-visible{outline:none}.svelte-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.svelte-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.svelte-flow .svelte-flow__edges{position:absolute}.svelte-flow .svelte-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.svelte-flow__edge{pointer-events:visibleStroke}.svelte-flow__edge.selectable{cursor:pointer}.svelte-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.svelte-flow__edge.animated path.svelte-flow__edge-interaction{stroke-dasharray:none;animation:none}.svelte-flow__edge.inactive{pointer-events:none}.svelte-flow__edge.selected,.svelte-flow__edge:focus,.svelte-flow__edge:focus-visible{outline:none}.svelte-flow__edge.selected .svelte-flow__edge-path,.svelte-flow__edge.selectable:focus .svelte-flow__edge-path,.svelte-flow__edge.selectable:focus-visible .svelte-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.svelte-flow__edge-textwrapper{pointer-events:all}.svelte-flow__edge .svelte-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.svelte-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.svelte-flow__connection{pointer-events:none}.svelte-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.svelte-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.svelte-flow__nodes{pointer-events:none;transform-origin:0 0}.svelte-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}.svelte-flow__node.selectable{cursor:pointer}.svelte-flow__node.draggable{cursor:grab;pointer-events:all}.svelte-flow__node.draggable.dragging{cursor:grabbing}.svelte-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.svelte-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.svelte-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.svelte-flow__handle.connectingfrom{pointer-events:all}.svelte-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.svelte-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.svelte-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.svelte-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.svelte-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.svelte-flow__edgeupdater{cursor:move;pointer-events:all}.svelte-flow__pane.selection .svelte-flow__panel{pointer-events:none}.svelte-flow__panel{position:absolute;z-index:5;margin:15px}.svelte-flow__panel.top{top:0}.svelte-flow__panel.bottom{bottom:0}.svelte-flow__panel.top.center,.svelte-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.svelte-flow__panel.left{left:0}.svelte-flow__panel.right{right:0}.svelte-flow__panel.left.center,.svelte-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.svelte-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.svelte-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.svelte-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.svelte-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.svelte-flow__minimap-svg{display:block}.svelte-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.svelte-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.svelte-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.svelte-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.svelte-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.svelte-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.svelte-flow__controls.horizontal{flex-direction:row}.svelte-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.svelte-flow__edge.updating .svelte-flow__edge-path{stroke:#777}.svelte-flow__edge-text{font-size:10px}.svelte-flow__node.selectable:focus,.svelte-flow__node.selectable:focus-visible{outline:none}.svelte-flow__node-input,.svelte-flow__node-default,.svelte-flow__node-output,.svelte-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.svelte-flow__node-input.selectable:hover,.svelte-flow__node-default.selectable:hover,.svelte-flow__node-output.selectable:hover,.svelte-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.svelte-flow__node-input.selectable.selected,.svelte-flow__node-input.selectable:focus,.svelte-flow__node-input.selectable:focus-visible,.svelte-flow__node-default.selectable.selected,.svelte-flow__node-default.selectable:focus,.svelte-flow__node-default.selectable:focus-visible,.svelte-flow__node-output.selectable.selected,.svelte-flow__node-output.selectable:focus,.svelte-flow__node-output.selectable:focus-visible,.svelte-flow__node-group.selectable.selected,.svelte-flow__node-group.selectable:focus,.svelte-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.svelte-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.svelte-flow__nodesselection-rect,.svelte-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.svelte-flow__nodesselection-rect:focus,.svelte-flow__nodesselection-rect:focus-visible,.svelte-flow__selection:focus,.svelte-flow__selection:focus-visible{outline:none}.svelte-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.svelte-flow__controls-button:disabled{pointer-events:none}.svelte-flow__controls-button:disabled svg{fill-opacity:.4}.svelte-flow__controls-button:last-child{border-bottom:none}.svelte-flow__controls.horizontal .svelte-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.svelte-flow__controls.horizontal .svelte-flow__controls-button:last-child{border-right:none}.svelte-flow__resize-control{position:absolute}.svelte-flow__resize-control.left,.svelte-flow__resize-control.right{cursor:ew-resize}.svelte-flow__resize-control.top,.svelte-flow__resize-control.bottom{cursor:ns-resize}.svelte-flow__resize-control.top.left,.svelte-flow__resize-control.bottom.right{cursor:nwse-resize}.svelte-flow__resize-control.bottom.left,.svelte-flow__resize-control.top.right{cursor:nesw-resize}.svelte-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.svelte-flow__resize-control.handle.left{left:0;top:50%}.svelte-flow__resize-control.handle.right{left:100%;top:50%}.svelte-flow__resize-control.handle.top{left:50%;top:0}.svelte-flow__resize-control.handle.bottom{left:50%;top:100%}.svelte-flow__resize-control.handle.top.left,.svelte-flow__resize-control.handle.bottom.left{left:0}.svelte-flow__resize-control.handle.top.right,.svelte-flow__resize-control.handle.bottom.right{left:100%}.svelte-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.svelte-flow__resize-control.line.left,.svelte-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.svelte-flow__resize-control.line.left{left:0;border-left-width:1px}.svelte-flow__resize-control.line.right{left:100%;border-right-width:1px}.svelte-flow__resize-control.line.top,.svelte-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.svelte-flow__resize-control.line.top{top:0;border-top-width:1px}.svelte-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.svelte-flow__edge-label{text-align:center;position:absolute;padding:2px;font-size:10px;color:var(--xy-edge-label-color, var(--xy-edge-label-color-default));background:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.svelte-flow__container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.class-node.svelte-6s4gii{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,sans-serif;font-size:11px;background:#fff;border:1px solid #cbd5e1;border-radius:4px;min-width:180px;box-shadow:0 1px 2px #0000000f;overflow:hidden}.class-node.compact.svelte-6s4gii header:where(.svelte-6s4gii){border-bottom:none}.class-node.highlighted.svelte-6s4gii{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb40}.class-node.selected.svelte-6s4gii{border-color:#2563eb}.class-node.external.svelte-6s4gii{border-style:dashed;border-color:#94a3b8;background:#f8fafc;opacity:.9;min-width:120px}.class-node.external.svelte-6s4gii .name:where(.svelte-6s4gii){color:#475569;font-weight:500}header.svelte-6s4gii{background:#f1f5f9;padding:6px 10px;border-bottom:1px solid #cbd5e1;text-align:center}.kind-tag.svelte-6s4gii{display:block;color:#64748b;font-size:10px;margin-bottom:1px}.name.svelte-6s4gii{font-weight:600}.rule-badges.svelte-6s4gii{display:block;margin-top:3px}.rule-badge.svelte-6s4gii{display:inline-block;color:#fff;font-size:9px;line-height:1.2;padding:0 4px;border-radius:3px;margin:1px 2px 0 0;vertical-align:middle;cursor:help}.layer-badge.svelte-6s4gii{border:none;font-family:inherit;font-weight:600;cursor:pointer}.layer-badge.svelte-6s4gii:hover{filter:brightness(1.12);text-decoration:underline}.rule-badge.inline.svelte-6s4gii{margin-left:4px}.members.svelte-6s4gii{list-style:none;margin:0;padding:4px 8px}.members.svelte-6s4gii+.members:where(.svelte-6s4gii){border-top:1px solid #e5e7eb}.members.svelte-6s4gii li:where(.svelte-6s4gii){line-height:1.5;white-space:nowrap}.vis.svelte-6s4gii{display:inline-block;width:.9em;color:#64748b}.member-name.static.svelte-6s4gii,.member-name.abstract.svelte-6s4gii{font-style:italic}.type.svelte-6s4gii{color:#475569}.paren.svelte-6s4gii{color:#64748b}.class-node.status-added.svelte-6s4gii header:where(.svelte-6s4gii){background:#daf7dc}.class-node.status-removed.svelte-6s4gii header:where(.svelte-6s4gii){background:#fbd7d7}.class-node.status-changed.svelte-6s4gii header:where(.svelte-6s4gii){background:#fff6cc}li.status-added.svelte-6s4gii{background:#daf7dc;color:#166534}li.status-removed.svelte-6s4gii{background:#fbd7d7;color:#b91c1c;text-decoration:line-through}.members.svelte-6s4gii li.edge-related:where(.svelte-6s4gii){font-weight:700;background:#fde68a;box-shadow:inset 3px 0 #f59e0b;border-radius:2px}.class-node.edge-related-header.svelte-6s4gii header:where(.svelte-6s4gii){box-shadow:inset 0 0 0 2px #f59e0b}.class-node.edge-related-header.svelte-6s4gii header:where(.svelte-6s4gii) .name:where(.svelte-6s4gii){font-weight:800}.legend.svelte-i9nwz2{position:absolute;left:12px;bottom:12px;z-index:5;background:#fffffff2;border:1px solid var(--border, #e5e7eb);border-radius:6px;box-shadow:0 1px 3px #0000001f;font-size:.75rem;color:var(--fg, #1a1a1a);-webkit-user-select:none;user-select:none}.head.svelte-i9nwz2{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.3rem .5rem;border-bottom:1px solid var(--border, #e5e7eb)}.title.svelte-i9nwz2{font-weight:600;text-transform:uppercase;letter-spacing:.05em;font-size:.65rem;color:var(--muted, #6b7280)}.toggle.svelte-i9nwz2{background:transparent;border:none;cursor:pointer;color:var(--muted, #6b7280);font-size:.8rem;line-height:1;padding:0}.toggle.svelte-i9nwz2:hover{color:var(--fg, #1a1a1a)}ul.svelte-i9nwz2{list-style:none;margin:0;padding:.4rem .5rem;display:flex;flex-direction:column;gap:.25rem}li.svelte-i9nwz2{display:flex;align-items:center;gap:.4rem}.swatch.svelte-i9nwz2{width:.8rem;height:.8rem;border-radius:3px;flex-shrink:0}.pill.svelte-i9nwz2{background:transparent;border:none;cursor:pointer;padding:.3rem .6rem;font-size:.75rem;color:var(--fg, #1a1a1a);font-weight:500}.pill.svelte-i9nwz2:hover{color:var(--accent, #2563eb)}.flow-wrap.svelte-1nbs9ah{height:100%;width:100%;position:relative}.error.svelte-1nbs9ah{color:#c63a3a;padding:1rem}.muted.svelte-1nbs9ah{color:var(--muted);padding:1rem}.package-node.svelte-p75fka{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:11px;min-width:160px;border:1px solid #94a3b8;border-radius:6px;background:#fff;box-shadow:0 1px 2px #0000000f;position:relative;padding-top:0}.folder-tab.svelte-p75fka{display:block;width:40%;height:10px;border:1px solid #94a3b8;border-bottom:none;border-top-left-radius:6px;border-top-right-radius:6px;background:#f1f5f9;margin-left:8px;margin-top:-10px;margin-bottom:0}.body.svelte-p75fka{padding:6px 10px 8px;background:#f8fafc;border-radius:0 6px 6px}.title.svelte-p75fka{font-weight:600;color:#1f2937}.qname.svelte-p75fka{color:#64748b;font-family:ui-monospace,SFMono-Regular,monospace;font-size:10px;margin-top:1px}.badge.svelte-p75fka{margin-top:4px;color:#475569;font-size:10px}.package-node.highlighted.svelte-p75fka{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb40}.package-node.selected.svelte-p75fka{border-color:#2563eb}.package-node.status-added.svelte-p75fka .body:where(.svelte-p75fka){background:#daf7dc}.package-node.status-removed.svelte-p75fka .body:where(.svelte-p75fka){background:#fbd7d7}.package-node.status-changed.svelte-p75fka .body:where(.svelte-p75fka){background:#fff6cc}.flow-wrap.svelte-10yxkrx{height:100%;width:100%}.error.svelte-10yxkrx{color:#c63a3a;padding:1rem}.muted.svelte-10yxkrx{color:var(--muted);padding:1rem}.activity-node.svelte-jvnkdh{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:11px;display:flex;align-items:center;justify-content:center}.dot.svelte-jvnkdh{display:inline-block;width:20px;height:20px;border-radius:50%;background:#1f2937}.kind-final.svelte-jvnkdh .dot:where(.svelte-jvnkdh){border:3px solid #fff;box-shadow:0 0 0 2px #1f2937;background:#1f2937}.action.svelte-jvnkdh{background:#fff;border:1px solid #cbd5e1;border-radius:14px;padding:6px 14px;min-width:110px;text-align:center;box-shadow:0 1px 2px #0000000a}.diamond.svelte-jvnkdh{width:110px;height:60px;background:#fff;border:1px solid #cbd5e1;transform:rotate(45deg);display:flex;align-items:center;justify-content:center}.diamond-label.svelte-jvnkdh{transform:rotate(-45deg);text-align:center;max-width:70px}.bar.svelte-jvnkdh{display:inline-block;width:80px;height:6px;background:#1f2937;border-radius:2px}.status-added.svelte-jvnkdh .action:where(.svelte-jvnkdh),.status-added.svelte-jvnkdh .diamond:where(.svelte-jvnkdh){background:#daf7dc}.status-removed.svelte-jvnkdh .action:where(.svelte-jvnkdh),.status-removed.svelte-jvnkdh .diamond:where(.svelte-jvnkdh){background:#fbd7d7;text-decoration:line-through}.status-changed.svelte-jvnkdh .action:where(.svelte-jvnkdh),.status-changed.svelte-jvnkdh .diamond:where(.svelte-jvnkdh){background:#fff6cc}.flow-wrap.svelte-1vq1hu4{height:100%;width:100%}.error.svelte-1vq1hu4{color:#c63a3a;padding:1rem}.muted.svelte-1vq1hu4{color:var(--muted);padding:1rem}.lifeline.svelte-c0tla6{position:relative;width:140px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.header.svelte-c0tla6{background:#eef2ff;border:1px solid #94a3b8;border-radius:4px;padding:8px 10px;text-align:center;box-shadow:0 1px 2px #0000000a}.name.svelte-c0tla6{font-weight:600;font-size:12px}.represents.svelte-c0tla6{font-size:10px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,monospace}.line.svelte-c0tla6{position:absolute;left:50%;width:0;border-left:2px dashed #94a3b8;pointer-events:none}.status-added.svelte-c0tla6 .header:where(.svelte-c0tla6){background:#daf7dc;border-color:#16a34a}.status-removed.svelte-c0tla6 .header:where(.svelte-c0tla6){background:#fbd7d7;border-color:#dc2626;text-decoration:line-through}.status-changed.svelte-c0tla6 .header:where(.svelte-c0tla6){background:#fff6cc;border-color:#ca8a04}.msg-label.svelte-16s3aas{background:#ffffffeb;padding:1px 6px;border-radius:3px;font-size:11px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#1f2937;white-space:nowrap}.msg-label.status-added.svelte-16s3aas{color:#166534;background:#ecfdf5}.msg-label.status-removed.svelte-16s3aas{color:#991b1b;background:#fef2f2;text-decoration:line-through}.msg-label.status-changed.svelte-16s3aas{color:#92400e;background:#fffbeb}.guard.svelte-16s3aas{color:#6366f1;font-style:italic;margin-right:.15rem}.frag.svelte-wmc1xy{box-sizing:border-box;border:1.5px solid #94a3b8;border-radius:6px;background:#94a3b814;pointer-events:none;position:relative}.frag.kind-alt.svelte-wmc1xy{border-color:#6366f1;background:#6366f112}.frag.kind-opt.svelte-wmc1xy{border-color:#0ea5e9;background:#0ea5e912}.frag.kind-loop.svelte-wmc1xy{border-color:#10b981;background:#10b98112}.frag.status-added.svelte-wmc1xy{border-color:#16a34a;background:#16a34a1a}.frag.status-removed.svelte-wmc1xy{border-color:#dc2626;background:#dc262614;border-style:dashed}.header.svelte-wmc1xy{position:absolute;top:-1px;left:-1px;padding:1px 8px 2px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:11px;background:inherit;border-bottom-right-radius:6px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;color:#475569}.kind.svelte-wmc1xy{font-weight:700;text-transform:uppercase;font-size:10px;margin-right:4px}.frag.kind-alt.svelte-wmc1xy .header:where(.svelte-wmc1xy){color:#4338ca}.frag.kind-opt.svelte-wmc1xy .header:where(.svelte-wmc1xy){color:#0369a1}.frag.kind-loop.svelte-wmc1xy .header:where(.svelte-wmc1xy){color:#047857}.label.svelte-wmc1xy{font-family:ui-monospace,SFMono-Regular,monospace;font-style:italic}.flow-wrap.svelte-12p4ds4{height:100%;width:100%}.error.svelte-12p4ds4{color:#c63a3a;padding:1rem}.muted.svelte-12p4ds4{color:var(--muted);padding:1rem}.section-header.svelte-r5ipsg{display:flex;align-items:center;justify-content:space-between;gap:.4rem;margin-bottom:.3rem}.section-header.indent.svelte-r5ipsg{padding:0 .75rem}.toggle.svelte-r5ipsg{flex:1;min-width:0;display:flex;align-items:center;gap:.3rem;background:transparent;border:none;cursor:pointer;padding:0;text-align:left;font-size:.7rem;letter-spacing:.05em;text-transform:uppercase;color:var(--muted)}.toggle.svelte-r5ipsg:hover .title:where(.svelte-r5ipsg){color:var(--fg)}.caret.svelte-r5ipsg{flex-shrink:0;width:.8rem;font-size:.7rem;line-height:1;color:var(--muted)}.title.svelte-r5ipsg{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.action.svelte-r5ipsg{flex-shrink:0}.saved-views.svelte-78mhii{border-top:1px solid var(--border);padding:.5rem .75rem;background:#fbfbfb}.view-list.svelte-78mhii{list-style:none;margin:0 0 .5rem;padding:0;display:flex;flex-direction:column;gap:2px}.view-row.svelte-78mhii{display:flex;align-items:center;gap:.25rem}.view-name.svelte-78mhii{flex:1;font-size:.85rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--fg)}.save-row.svelte-78mhii{display:flex;gap:.25rem;align-items:center;margin-bottom:.25rem}.name-input.svelte-78mhii{flex:1;padding:.25rem .5rem;border:1px solid var(--border);border-radius:4px;font-size:.8rem;min-width:0;background:var(--bg);color:var(--fg)}.rename-input.svelte-78mhii{flex:1}button.svelte-78mhii{background:transparent;border:1px solid var(--border);border-radius:4px;padding:.25rem .5rem;font-size:.75rem;cursor:pointer;color:var(--fg);white-space:nowrap;flex-shrink:0}button.svelte-78mhii:hover:not(:disabled){background:var(--hover)}button.svelte-78mhii:disabled{opacity:.45;cursor:not-allowed}.action-btn.svelte-78mhii{font-size:.72rem;padding:.2rem .4rem}.icon-btn.svelte-78mhii{padding:.2rem .35rem;font-size:.8rem;line-height:1}.icon-btn.danger.svelte-78mhii{color:#b91c1c;border-color:transparent}.icon-btn.danger.svelte-78mhii:hover{border-color:#b91c1c;background:#fff5f5}.status.svelte-78mhii{margin:.3rem 0 0;font-size:.72rem;line-height:1.3}.status.ok.svelte-78mhii{color:#166534}.status.error.svelte-78mhii{color:#c63a3a}.status.warn.svelte-78mhii{color:#92400e}.hint.svelte-78mhii{margin:0 0 .4rem;font-size:.78rem;color:var(--muted);font-style:italic}.local-file.svelte-78mhii{margin-top:.5rem}.local-file.svelte-78mhii summary:where(.svelte-78mhii){cursor:pointer;font-size:.72rem;color:var(--muted);-webkit-user-select:none;user-select:none;list-style:none}.local-file.svelte-78mhii summary:where(.svelte-78mhii):before{content:"▸ "}.local-file[open].svelte-78mhii summary:where(.svelte-78mhii):before{content:"▾ "}.local-file.svelte-78mhii .row:where(.svelte-78mhii){display:flex;gap:.25rem;margin-top:.35rem}.panel.svelte-1dxf3wz{display:flex;flex-direction:column;flex:0 0 auto}.search.svelte-1dxf3wz{padding:0 .75rem .4rem;display:flex;align-items:center;gap:.5rem}.search.svelte-1dxf3wz input:where(.svelte-1dxf3wz){flex:1;padding:.4rem .6rem;border:1px solid var(--border);border-radius:4px;font-size:.85rem;background:var(--bg);color:var(--fg)}.count.svelte-1dxf3wz{font-size:.7rem;color:var(--muted)}.layers.svelte-1dxf3wz{border-bottom:1px solid var(--border);padding:.4rem 0;flex:0 0 auto}.classes.svelte-1dxf3wz{flex:0 0 auto;padding-top:.4rem}.deps-link.svelte-1dxf3wz{background:transparent;border:none;color:var(--accent);cursor:pointer;font-size:.7rem;letter-spacing:0;text-transform:none;padding:0}.deps-link.svelte-1dxf3wz:hover{text-decoration:underline}.layers.svelte-1dxf3wz ul:where(.svelte-1dxf3wz){list-style:none;margin:0;padding:0}.layer-row.svelte-1dxf3wz{display:flex;align-items:center;gap:.4rem;padding:.2rem .75rem;font-size:.85rem}.layer-row.svelte-1dxf3wz:hover{background:var(--hover)}.layer-row.svelte-1dxf3wz input[type=checkbox]:where(.svelte-1dxf3wz){flex-shrink:0}.caret.svelte-1dxf3wz{flex-shrink:0;width:1rem;background:transparent;border:none;cursor:pointer;color:var(--muted);font-size:.7rem;padding:0;line-height:1}.caret.svelte-1dxf3wz:hover{color:var(--fg)}.layer-name-btn.svelte-1dxf3wz{flex:1;min-width:0;background:transparent;border:none;text-align:left;cursor:pointer;color:var(--fg);font:inherit;padding:0}.layer-children.svelte-1dxf3wz{list-style:none;margin:0;padding:0}.class-row.svelte-1dxf3wz{display:flex;align-items:center;gap:.4rem;padding:.12rem .75rem .12rem 2.1rem;cursor:pointer;font-size:.82rem}.class-row.svelte-1dxf3wz:hover{background:var(--hover)}.class-row.svelte-1dxf3wz input[type=checkbox]:where(.svelte-1dxf3wz){flex-shrink:0}.class-name-btn.svelte-1dxf3wz{flex:1;min-width:0;background:transparent;border:none;text-align:left;cursor:pointer;color:var(--fg);font:inherit;padding:.1rem .2rem;border-radius:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.class-name-btn.svelte-1dxf3wz:hover{background:var(--surface)}.class-name-btn.active.svelte-1dxf3wz{background:var(--accent);color:#fff}.swatch.svelte-1dxf3wz{width:.7rem;height:.7rem;border-radius:2px;flex-shrink:0}.layer-name.svelte-1dxf3wz{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layer-count.svelte-1dxf3wz{font-size:.7rem;color:var(--muted);background:var(--hover);border-radius:8px;padding:0 .4rem}.only.svelte-1dxf3wz{background:transparent;border:1px solid var(--border);border-radius:4px;padding:0 .35rem;font-size:.7rem;cursor:pointer;color:var(--muted)}.only.svelte-1dxf3wz:hover{background:var(--surface);color:var(--fg)}.related.svelte-1dxf3wz{border-bottom:1px solid var(--border);padding:.4rem 0;background:#fbfbfb;flex:0 0 auto}.related.svelte-1dxf3wz ul:where(.svelte-1dxf3wz),.class-list.svelte-1dxf3wz{list-style:none;margin:0;padding:.25rem 0}.class-list.svelte-1dxf3wz{flex:0 0 auto}.row.checkbox.svelte-1dxf3wz{display:flex;align-items:center;gap:.4rem;padding:0 .75rem;cursor:pointer}.row.checkbox.svelte-1dxf3wz input[type=checkbox]:where(.svelte-1dxf3wz){flex-shrink:0}.row-button.svelte-1dxf3wz,.row.svelte-1dxf3wz{background:transparent;border:none;text-align:left;color:var(--fg);cursor:pointer}.row-button.svelte-1dxf3wz{flex:1;padding:.3rem;border-radius:4px}.row-button.svelte-1dxf3wz:hover{background:var(--hover)}.row-button.active.svelte-1dxf3wz{background:var(--accent);color:#fff}.row-button.active.svelte-1dxf3wz .pkg:where(.svelte-1dxf3wz){color:#fffc}.related.svelte-1dxf3wz .row:where(.svelte-1dxf3wz){display:flex;align-items:center;gap:.4rem;width:100%;padding:.3rem .75rem}.related.svelte-1dxf3wz .row:where(.svelte-1dxf3wz):hover{background:var(--hover)}.name.svelte-1dxf3wz{font-size:.9rem;font-weight:500;display:block}.pkg.svelte-1dxf3wz{font-size:.7rem;color:var(--muted);font-family:ui-monospace,SFMono-Regular,monospace;margin-left:.4rem}.badge.svelte-1dxf3wz{display:inline-block;width:1.2em;height:1.2em;line-height:1.2em;text-align:center;border-radius:3px;background:#e2e8f0;color:#475569;font-size:.7rem}.badge.inheritance.svelte-1dxf3wz{background:#dbeafe;color:#1d4ed8}.badge.association.svelte-1dxf3wz{background:#fef3c7;color:#b45309}.badge.in.svelte-1dxf3wz{transform:rotate(180deg)}.error.svelte-1dxf3wz{color:#c63a3a;padding:.75rem}.muted.svelte-1dxf3wz{color:var(--muted);padding:.75rem}.panel.svelte-15q2ef1{padding:.6rem .75rem;border-bottom:1px solid var(--border);flex:0 0 auto}.placeholder.svelte-15q2ef1{margin:0;color:var(--muted);font-size:.8rem;font-style:italic}.class-header.svelte-15q2ef1{display:flex;align-items:baseline;gap:.4rem}.class-name.svelte-15q2ef1{font-weight:600;font-size:.95rem;color:var(--fg)}.kind.svelte-15q2ef1{font-size:.7rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}.pkg.svelte-15q2ef1{font-size:.7rem;color:var(--muted);font-family:ui-monospace,SFMono-Regular,monospace;margin-bottom:.4rem}.description.svelte-15q2ef1{margin:.3rem 0 .6rem;font-size:.85rem;line-height:1.4;color:var(--fg);white-space:pre-wrap}.description.muted.svelte-15q2ef1{color:var(--muted);font-style:italic}h5.svelte-15q2ef1{margin:.5rem 0 .25rem;font-size:.7rem;letter-spacing:.05em;text-transform:uppercase;color:var(--muted)}.members.svelte-15q2ef1{list-style:none;margin:0;padding:0}.members.svelte-15q2ef1 li:where(.svelte-15q2ef1){margin-bottom:.4rem}.sig.svelte-15q2ef1{font-family:ui-monospace,SFMono-Regular,monospace;font-size:.78rem;color:var(--fg)}.member-desc.svelte-15q2ef1{margin:.15rem 0 0;font-size:.78rem;color:var(--muted);line-height:1.35;white-space:pre-wrap}.location.svelte-15q2ef1{margin:.5rem 0 0;font-size:.7rem;color:var(--muted);font-family:ui-monospace,SFMono-Regular,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.panel.svelte-1msh8cb{display:flex;flex-direction:column;flex:1;min-height:0}.search.svelte-1msh8cb{padding:.6rem .75rem .4rem;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:.5rem}.search.svelte-1msh8cb input:where(.svelte-1msh8cb){flex:1;padding:.4rem .6rem;border:1px solid var(--border);border-radius:4px;font-size:.85rem;background:var(--bg);color:var(--fg)}.count.svelte-1msh8cb{font-size:.7rem;color:var(--muted)}.related.svelte-1msh8cb{border-bottom:1px solid var(--border);padding:.4rem 0;background:#fbfbfb;max-height:30%;overflow-y:auto;flex:0 0 auto}.related.svelte-1msh8cb h4:where(.svelte-1msh8cb){margin:0 .75rem .25rem;font-size:.7rem;letter-spacing:.05em;text-transform:uppercase;color:var(--muted)}.related.svelte-1msh8cb ul:where(.svelte-1msh8cb),.class-list.svelte-1msh8cb{list-style:none;margin:0;padding:.25rem 0}.class-list.svelte-1msh8cb{overflow-y:auto;flex:1;min-height:0}.row.checkbox.svelte-1msh8cb{display:flex;align-items:center;gap:.4rem;padding:0 .75rem;cursor:pointer}.row.checkbox.svelte-1msh8cb input[type=checkbox]:where(.svelte-1msh8cb){flex-shrink:0}.row-button.svelte-1msh8cb,.row.svelte-1msh8cb{background:transparent;border:none;text-align:left;color:var(--fg);cursor:pointer}.row-button.svelte-1msh8cb{flex:1;padding:.3rem;border-radius:4px;display:flex;align-items:baseline;gap:.4rem}.row-button.svelte-1msh8cb:hover{background:var(--hover)}.row-button.active.svelte-1msh8cb{background:var(--accent);color:#fff}.row-button.active.svelte-1msh8cb .pkg:where(.svelte-1msh8cb),.row-button.active.svelte-1msh8cb .cls-count:where(.svelte-1msh8cb){color:#fffc}.related.svelte-1msh8cb .row:where(.svelte-1msh8cb){display:flex;align-items:center;gap:.4rem;width:100%;padding:.3rem .75rem}.related.svelte-1msh8cb .row:where(.svelte-1msh8cb):hover{background:var(--hover)}.name.svelte-1msh8cb{font-size:.9rem;font-weight:500}.pkg.svelte-1msh8cb{font-size:.7rem;color:var(--muted);font-family:ui-monospace,SFMono-Regular,monospace}.cls-count.svelte-1msh8cb{margin-left:auto;background:var(--hover);border-radius:8px;padding:0 .4rem;font-size:.7rem;color:var(--muted)}.badge.svelte-1msh8cb{display:inline-block;width:1.2em;text-align:center;color:#475569}.error.svelte-1msh8cb{color:#c63a3a;padding:.75rem}.muted.svelte-1msh8cb{color:var(--muted);padding:.75rem}.panel.svelte-67dkxc{display:flex;flex-direction:column;height:100%;min-height:0}.search.svelte-67dkxc{padding:.6rem .75rem .4rem;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:.5rem}.search.svelte-67dkxc input:where(.svelte-67dkxc){flex:1;padding:.4rem .6rem;border:1px solid var(--border);border-radius:4px;font-size:.85rem;background:var(--bg);color:var(--fg)}.count.svelte-67dkxc{font-size:.7rem;color:var(--muted)}.commands.svelte-67dkxc{display:flex;flex-wrap:wrap;gap:.25rem;padding:.4rem .75rem;border-bottom:1px solid var(--border);align-items:center}.commands.svelte-67dkxc button:where(.svelte-67dkxc){background:transparent;border:1px solid var(--border);border-radius:4px;padding:.2rem .5rem;font-size:.75rem;cursor:pointer;color:var(--fg)}.commands.svelte-67dkxc button:where(.svelte-67dkxc):hover:not(:disabled){background:var(--hover)}.commands.svelte-67dkxc button:where(.svelte-67dkxc):disabled{opacity:.4;cursor:not-allowed}.hops.svelte-67dkxc{display:inline-flex;align-items:center;gap:.15rem;font-size:.75rem;color:var(--muted)}.hops.svelte-67dkxc input:where(.svelte-67dkxc){width:2.5rem;padding:.15rem .3rem;border:1px solid var(--border);border-radius:4px;background:var(--bg);color:var(--fg);font-size:.75rem}.node-list.svelte-67dkxc{list-style:none;margin:0;padding:.25rem 0;overflow-y:auto;flex:1;min-height:0}.row.checkbox.svelte-67dkxc{display:flex;align-items:center;gap:.4rem;padding:0 .75rem;cursor:pointer}.row-button.svelte-67dkxc{flex:1;background:transparent;border:none;text-align:left;color:var(--fg);cursor:pointer;padding:.3rem;border-radius:4px;display:flex;gap:.4rem;align-items:baseline}.row-button.svelte-67dkxc:hover{background:var(--hover)}.row-button.active.svelte-67dkxc{background:var(--accent);color:#fff}.row-button.status-added.svelte-67dkxc{border-left:3px solid #16a34a}.row-button.status-removed.svelte-67dkxc{border-left:3px solid #dc2626;text-decoration:line-through}.row-button.status-changed.svelte-67dkxc{border-left:3px solid #ca8a04}.kind.svelte-67dkxc{font-size:.65rem;text-transform:uppercase;color:var(--muted);font-family:ui-monospace,SFMono-Regular,monospace;min-width:4rem}.row-button.active.svelte-67dkxc .kind:where(.svelte-67dkxc){color:#ffffffd9}.name.svelte-67dkxc{font-size:.85rem}.error.svelte-67dkxc{color:#c63a3a;padding:.75rem}.muted.svelte-67dkxc{color:var(--muted);padding:.75rem}.panel.svelte-12eqyd8{display:flex;flex-direction:column;height:100%;min-height:0}.search.svelte-12eqyd8{padding:.6rem .75rem .4rem;border-bottom:1px solid var(--border)}.search.svelte-12eqyd8 input:where(.svelte-12eqyd8){width:100%;padding:.4rem .6rem;border:1px solid var(--border);border-radius:4px;font-size:.85rem;background:var(--bg);color:var(--fg)}.commands.svelte-12eqyd8{display:flex;gap:.25rem;padding:.4rem .75rem;border-bottom:1px solid var(--border)}.commands.svelte-12eqyd8 button:where(.svelte-12eqyd8){background:transparent;border:1px solid var(--border);border-radius:4px;padding:.2rem .5rem;font-size:.75rem;cursor:pointer;color:var(--fg)}.section-label.svelte-12eqyd8{padding:.4rem .75rem .2rem;font-size:.65rem;letter-spacing:.05em;text-transform:uppercase;color:var(--muted)}.lifeline-list.svelte-12eqyd8,.msg-list.svelte-12eqyd8{list-style:none;margin:0;padding:0 0 .25rem;overflow-y:auto}.lifeline-list.svelte-12eqyd8{flex:0 0 auto;max-height:40%}.msg-list.svelte-12eqyd8{flex:1 1 auto;min-height:0}.row.checkbox.svelte-12eqyd8{display:flex;align-items:center;gap:.4rem;padding:0 .75rem}.row-button.svelte-12eqyd8{flex:1;background:transparent;border:none;text-align:left;color:var(--fg);cursor:pointer;padding:.3rem;border-radius:4px;display:flex;flex-direction:column}.row-button.svelte-12eqyd8:hover{background:var(--hover)}.row-button.active.svelte-12eqyd8{background:var(--accent);color:#fff}.row-button.status-added.svelte-12eqyd8{border-left:3px solid #16a34a}.row-button.status-removed.svelte-12eqyd8{border-left:3px solid #dc2626;text-decoration:line-through}.name.svelte-12eqyd8{font-size:.85rem;font-weight:500}.represents.svelte-12eqyd8{font-size:.7rem;color:var(--muted);font-family:ui-monospace,SFMono-Regular,monospace}.msg.svelte-12eqyd8{display:flex;gap:.5rem;align-items:baseline;padding:.25rem .75rem;font-size:.8rem;line-height:1.3}.msg.svelte-12eqyd8 .row-no:where(.svelte-12eqyd8){color:var(--muted);font-size:.7rem;font-family:ui-monospace,SFMono-Regular,monospace;min-width:1.6rem}.msg.svelte-12eqyd8 .ret:where(.svelte-12eqyd8){color:var(--muted);font-size:.65rem;text-transform:uppercase}.msg.status-added.svelte-12eqyd8 .label:where(.svelte-12eqyd8){color:#166534}.msg.status-removed.svelte-12eqyd8 .label:where(.svelte-12eqyd8){color:#991b1b;text-decoration:line-through}.guard.svelte-12eqyd8{color:#6366f1;font-style:italic;font-size:.75rem}.error.svelte-12eqyd8{color:#c63a3a;padding:.75rem}.muted.svelte-12eqyd8{color:var(--muted);padding:.75rem}.walk.svelte-wdxyyx{display:flex;flex-direction:column;height:100%;min-height:0}header.svelte-wdxyyx{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-bottom:1px solid var(--border);background:var(--surface)}header.svelte-wdxyyx h4:where(.svelte-wdxyyx){margin:0;font-size:.75rem;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);flex:1}.nav.svelte-wdxyyx{display:flex;align-items:center;gap:.25rem}.nav.svelte-wdxyyx button:where(.svelte-wdxyyx){background:transparent;border:1px solid var(--border);border-radius:4px;width:1.6rem;height:1.6rem;line-height:1.2;cursor:pointer;color:var(--fg);font-size:.95rem}.nav.svelte-wdxyyx button:where(.svelte-wdxyyx):hover{background:var(--hover)}.pos.svelte-wdxyyx{font-size:.75rem;color:var(--muted);min-width:3rem;text-align:center}ul.svelte-wdxyyx{list-style:none;margin:0;padding:.25rem 0;overflow-y:auto;flex:1;min-height:0}.row.svelte-wdxyyx{display:flex;align-items:center;gap:.4rem;width:100%;padding:.3rem .75rem;background:transparent;border:none;text-align:left;cursor:pointer;color:var(--fg);font-size:.85rem}.row.svelte-wdxyyx:hover{background:var(--hover)}.row.active.svelte-wdxyyx{background:var(--accent);color:#fff}.row.active.svelte-wdxyyx .badge:where(.svelte-wdxyyx){background:#ffffff40;color:#fff}.badge.svelte-wdxyyx{flex-shrink:0;display:inline-block;width:1.4em;height:1.4em;line-height:1.4em;text-align:center;border-radius:3px;font-size:.7rem;font-weight:700}.badge.added.svelte-wdxyyx{background:#daf7dc;color:#166534}.badge.removed.svelte-wdxyyx{background:#fbd7d7;color:#991b1b}.badge.changed.svelte-wdxyyx{background:#fff6cc;color:#92400e}.members.svelte-wdxyyx{list-style:none;margin:0;padding:0 .75rem .4rem 2.5rem;overflow:visible}.member.svelte-wdxyyx{font-size:.75rem;font-family:ui-monospace,SFMono-Regular,monospace;display:flex;align-items:baseline;gap:.3rem;line-height:1.4}.member.svelte-wdxyyx .sign:where(.svelte-wdxyyx){width:.7em;text-align:center;flex-shrink:0}.member.added.svelte-wdxyyx{color:#166534}.member.removed.svelte-wdxyyx{color:#991b1b;text-decoration:line-through}.member.svelte-wdxyyx .kind:where(.svelte-wdxyyx){color:var(--muted);font-size:.65rem;text-transform:uppercase}.walk.svelte-16ob2gs{display:flex;flex-direction:column;height:100%;min-height:0}header.svelte-16ob2gs{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-bottom:1px solid var(--border);background:var(--surface)}header.svelte-16ob2gs h4:where(.svelte-16ob2gs){margin:0;font-size:.75rem;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);flex:1}.nav.svelte-16ob2gs{display:flex;align-items:center;gap:.25rem}.nav.svelte-16ob2gs button:where(.svelte-16ob2gs){background:transparent;border:1px solid var(--border);border-radius:4px;width:1.6rem;height:1.6rem;cursor:pointer;color:var(--fg)}.nav.svelte-16ob2gs button:where(.svelte-16ob2gs):hover{background:var(--hover)}.pos.svelte-16ob2gs{font-size:.75rem;color:var(--muted);min-width:3rem;text-align:center}ul.svelte-16ob2gs{list-style:none;margin:0;padding:.25rem 0;overflow-y:auto;flex:1;min-height:0}.row.svelte-16ob2gs{display:flex;align-items:center;gap:.4rem;width:100%;padding:.3rem .75rem;background:transparent;border:none;text-align:left;cursor:pointer;color:var(--fg);font-size:.85rem}.row.svelte-16ob2gs:hover{background:var(--hover)}.row.active.svelte-16ob2gs{background:var(--accent);color:#fff}.row.active.svelte-16ob2gs .badge:where(.svelte-16ob2gs){background:#ffffff40;color:#fff}.badge.svelte-16ob2gs{flex-shrink:0;display:inline-block;width:1.4em;height:1.4em;line-height:1.4em;text-align:center;border-radius:3px;font-size:.7rem;font-weight:700}.badge.added.svelte-16ob2gs{background:#daf7dc;color:#166534}.badge.removed.svelte-16ob2gs{background:#fbd7d7;color:#991b1b}.badge.changed.svelte-16ob2gs{background:#fff6cc;color:#92400e}.members.svelte-16ob2gs{list-style:none;margin:0;padding:0 .75rem .4rem 2.5rem}.member.svelte-16ob2gs{font-size:.75rem;font-family:ui-monospace,SFMono-Regular,monospace;line-height:1.4}.member-btn.svelte-16ob2gs{background:transparent;border:none;padding:.1rem 0;cursor:pointer;color:inherit;display:flex;align-items:baseline;gap:.3rem;text-align:left}.member-btn.svelte-16ob2gs:disabled{cursor:default}.member-btn.svelte-16ob2gs:not(:disabled):hover code:where(.svelte-16ob2gs){text-decoration:underline}.member.added.svelte-16ob2gs{color:#166534}.member.removed.svelte-16ob2gs{color:#991b1b;text-decoration:line-through}.member.svelte-16ob2gs .kind:where(.svelte-16ob2gs){color:var(--muted);font-size:.65rem;text-transform:uppercase}.member.svelte-16ob2gs .sign:where(.svelte-16ob2gs){width:.7em;text-align:center;flex-shrink:0}.walk.svelte-7i7234{display:flex;flex-direction:column;height:100%;min-height:0}header.svelte-7i7234{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-bottom:1px solid var(--border);background:var(--surface)}header.svelte-7i7234 h4:where(.svelte-7i7234){margin:0;font-size:.75rem;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);flex:1}.nav.svelte-7i7234{display:flex;align-items:center;gap:.25rem}.nav.svelte-7i7234 button:where(.svelte-7i7234){background:transparent;border:1px solid var(--border);border-radius:4px;width:1.6rem;height:1.6rem;cursor:pointer;color:var(--fg)}.pos.svelte-7i7234{font-size:.75rem;color:var(--muted);min-width:3rem;text-align:center}ul.svelte-7i7234{list-style:none;margin:0;padding:.25rem 0;overflow-y:auto;flex:1;min-height:0}.row.svelte-7i7234{display:flex;align-items:center;gap:.4rem;width:100%;padding:.3rem .75rem;background:transparent;border:none;text-align:left;cursor:pointer;color:var(--fg);font-size:.85rem}.row.svelte-7i7234:hover{background:var(--hover)}.row.active.svelte-7i7234{background:var(--accent);color:#fff}.row.active.svelte-7i7234 .badge:where(.svelte-7i7234){background:#ffffff40;color:#fff}.badge.svelte-7i7234{flex-shrink:0;display:inline-block;width:1.4em;height:1.4em;line-height:1.4em;text-align:center;border-radius:3px;font-size:.7rem;font-weight:700}.badge.added.svelte-7i7234{background:#daf7dc;color:#166534}.badge.removed.svelte-7i7234{background:#fbd7d7;color:#991b1b}.badge.changed.svelte-7i7234{background:#fff6cc;color:#92400e}.members.svelte-7i7234{list-style:none;margin:0;padding:0 .75rem .4rem 2.5rem}.member.svelte-7i7234{font-size:.75rem;font-family:ui-monospace,SFMono-Regular,monospace;line-height:1.4;display:flex;align-items:baseline;gap:.3rem}.member.svelte-7i7234 .sign:where(.svelte-7i7234){width:.7em;text-align:center;flex-shrink:0}.member.added.svelte-7i7234{color:#166534}.member.removed.svelte-7i7234{color:#991b1b;text-decoration:line-through}.member.svelte-7i7234 .kind:where(.svelte-7i7234){color:var(--muted);font-size:.65rem;text-transform:uppercase}.class-node.svelte-1no0ci2{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,sans-serif;font-size:11px;background:#fff;border:1px solid #cbd5e1;border-radius:4px;min-width:200px;box-shadow:0 1px 2px #0000000f;overflow:hidden}.class-node.editable.svelte-1no0ci2{border-style:dashed}.class-node.highlighted.svelte-1no0ci2{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb40}.class-node.selected.svelte-1no0ci2{border-color:#2563eb}header.svelte-1no0ci2{background:#f1f5f9;padding:6px 10px;border-bottom:1px solid #cbd5e1;text-align:center;position:relative;cursor:pointer}.kind-tag.svelte-1no0ci2{display:block;color:#64748b;font-size:10px;margin-bottom:1px}.name.svelte-1no0ci2{font-weight:600}.pencil.svelte-1no0ci2{position:absolute;top:4px;right:6px;background:transparent;border:none;color:#64748b;font-size:.85rem;cursor:pointer;opacity:0;transition:opacity .1s}.class-node.svelte-1no0ci2:hover .pencil:where(.svelte-1no0ci2){opacity:1}.members.svelte-1no0ci2{list-style:none;margin:0;padding:4px 8px;cursor:pointer}.members.svelte-1no0ci2+.members:where(.svelte-1no0ci2){border-top:1px solid #e5e7eb}.members.svelte-1no0ci2 li:where(.svelte-1no0ci2){line-height:1.5;white-space:nowrap}.placeholder.svelte-1no0ci2{color:#cbd5e1;font-style:italic}.quick-add.svelte-1no0ci2{display:none}.class-node.svelte-1no0ci2:hover .quick-add:where(.svelte-1no0ci2){display:block}.quick-add.svelte-1no0ci2 button:where(.svelte-1no0ci2){background:transparent;border:1px dashed #cbd5e1;border-radius:3px;color:#64748b;font-size:10px;padding:0 4px;cursor:pointer;line-height:1.4}.quick-add.svelte-1no0ci2 button:where(.svelte-1no0ci2):hover{background:#f1f5f9;color:#1a1a1a}.vis.svelte-1no0ci2{display:inline-block;width:.9em;color:#64748b}.member-name.static.svelte-1no0ci2,.member-name.abstract.svelte-1no0ci2{font-style:italic}.type.svelte-1no0ci2{color:#475569}.paren.svelte-1no0ci2{color:#64748b}.class-node.status-added.svelte-1no0ci2 header:where(.svelte-1no0ci2){background:#daf7dc}.class-node.status-removed.svelte-1no0ci2 header:where(.svelte-1no0ci2){background:#fbd7d7}.class-node.status-changed.svelte-1no0ci2 header:where(.svelte-1no0ci2){background:#fff6cc}.flow.svelte-ng2mei{flex:1;min-height:0;height:100%;position:relative}.error.svelte-ng2mei{position:absolute;top:.5rem;left:50%;transform:translate(-50%);background:#fef2f2;border:1px solid #fca5a5;color:#b91c1c;padding:.4rem .75rem;border-radius:4px;font-size:.8rem;z-index:10;pointer-events:none}.code-panel.svelte-x0xk3q{display:flex;flex-direction:column;height:100%;min-height:0;border-left:1px solid var(--border, #e2e8f0);background:var(--surface, #fff)}.head.svelte-x0xk3q{flex:0 0 auto;display:flex;align-items:center;gap:.5rem;padding:.35rem .6rem;border-bottom:1px solid var(--border, #e2e8f0);font-size:.8rem}.title.svelte-x0xk3q{font-weight:600}.ok.svelte-x0xk3q{color:var(--muted, #64748b)}.parse-error.svelte-x0xk3q{color:#b45309;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}textarea.svelte-x0xk3q{flex:1;min-height:0;width:100%;box-sizing:border-box;resize:none;border:none;outline:none;padding:.6rem;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11.5px;line-height:1.45;color:var(--fg, #1a1a1a);background:var(--surface, #fff);white-space:pre}.flow-wrap.svelte-1l0n74n{height:100%;width:100%;display:flex;flex-direction:column}.toolbar.svelte-1l0n74n{display:flex;gap:.5rem;align-items:center;padding:.5rem .75rem;border-bottom:1px solid var(--border, #e2e8f0);background:var(--surface, #fff)}.toolbar.svelte-1l0n74n button:where(.svelte-1l0n74n){background:var(--surface, #fff);border:1px solid var(--border, #cbd5e1);border-radius:4px;padding:.3rem .7rem;font-size:.85rem;cursor:pointer}.toolbar.svelte-1l0n74n button:where(.svelte-1l0n74n):hover{background:var(--hover, #f1f5f9)}.toolbar.svelte-1l0n74n button.active:where(.svelte-1l0n74n){background:var(--accent, #2563eb);color:#fff;border-color:var(--accent, #2563eb)}.hint.svelte-1l0n74n{font-size:.8rem;color:var(--muted, #64748b)}.split.svelte-1l0n74n{flex:1;min-height:0;display:flex}.canvas-cell.svelte-1l0n74n{flex:1;min-width:0;min-height:0}.code-cell.svelte-1l0n74n{flex:0 0 clamp(320px,34%,560px);min-height:0}.backdrop.svelte-7liiud{position:fixed;top:0;right:0;bottom:0;left:0;background:#0f172a73;z-index:50}.dialog.svelte-7liiud{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:51;background:var(--surface, white);color:var(--fg, #0f172a);border-radius:8px;box-shadow:0 20px 50px #0f172a59;max-width:92vw;max-height:88vh;display:flex;flex-direction:column}header.svelte-7liiud{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-bottom:1px solid var(--border, #e2e8f0)}header.svelte-7liiud h2:where(.svelte-7liiud){margin:0;font-size:1rem;font-weight:600}.close.svelte-7liiud{background:transparent;border:none;font-size:1.4rem;cursor:pointer;line-height:1;color:var(--muted, #64748b)}.close.svelte-7liiud:hover{color:var(--fg, #0f172a)}.body.svelte-7liiud{padding:1rem;overflow:auto}footer.svelte-7liiud{padding:.75rem 1rem;border-top:1px solid var(--border, #e2e8f0);display:flex;justify-content:flex-end;gap:.5rem}.hint.svelte-mh03di{margin:0 0 .75rem;font-size:.8rem;color:var(--muted, #64748b)}.matrix.svelte-mh03di{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.3rem}.matrix.svelte-mh03di li:where(.svelte-mh03di){display:flex;align-items:center;gap:.5rem;padding:.35rem .5rem;border-radius:6px;background:var(--hover, #f1f5f9)}.matrix.svelte-mh03di li.focused:where(.svelte-mh03di){outline:2px solid var(--accent, #2563eb)}.layer.svelte-mh03di{font-weight:600;min-width:5.5rem}.arrow.svelte-mh03di{color:var(--muted, #64748b)}.targets.svelte-mh03di{display:flex;flex-wrap:wrap;gap:.25rem}.chip.svelte-mh03di{background:#1d4ed8;color:#fff;font-size:.75rem;padding:.05rem .4rem;border-radius:3px}.none.svelte-mh03di{color:var(--muted, #64748b);font-size:.8rem;font-style:italic}.note.svelte-mh03di{margin:.75rem 0 0;font-size:.8rem}.muted.svelte-mh03di{color:var(--muted, #64748b)}.error.svelte-mh03di{color:#c63a3a}code.svelte-mh03di{background:var(--hover, #f1f5f9);padding:0 .25rem;border-radius:3px}.msg.svelte-12b62b9{margin:0 0 .5rem;font-size:.875rem}.error.svelte-12b62b9{color:#c63a3a}.muted.svelte-12b62b9{color:var(--muted, #64748b)}.summary.svelte-12b62b9{display:flex;align-items:center;gap:.6rem;margin:0 0 .75rem}.badge.svelte-12b62b9{color:#fff;font-size:.75rem;font-weight:600;padding:.1rem .45rem;border-radius:4px}.counts.svelte-12b62b9{font-size:.8rem;color:var(--muted, #64748b)}.class-list.svelte-12b62b9{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px;max-height:55vh;overflow-y:auto}.row.svelte-12b62b9{display:flex;align-items:center;gap:.5rem;padding:.35rem .5rem;border-radius:5px;cursor:pointer;font-size:.875rem;background:var(--hover, #f1f5f9)}.row.svelte-12b62b9:hover{background:#e2e8f0}li.hidden.svelte-12b62b9 .row:where(.svelte-12b62b9){opacity:.55}.vis-dot.svelte-12b62b9{width:.55rem;height:.55rem;border-radius:50%;flex-shrink:0;background:#cbd5e1;border:1.5px solid #94a3b8}.vis-dot.on.svelte-12b62b9{background:#22c55e;border-color:#16a34a}.class-name.svelte-12b62b9{flex:1;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pkg.svelte-12b62b9{font-size:.7rem;color:var(--muted, #64748b);font-family:ui-monospace,SFMono-Regular,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:8rem}.edge-focus-canvas.svelte-1u9iyu6{position:relative;width:100%;height:460px;background:var(--bg);border-radius:4px;overflow:hidden}.diagram-tools.svelte-1hqpjto{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap}.group.svelte-1hqpjto{display:flex;gap:.25rem;align-items:center}.group.svelte-1hqpjto+.group:where(.svelte-1hqpjto){border-left:1px solid var(--border);padding-left:.6rem}.diagram-tools.svelte-1hqpjto button:where(.svelte-1hqpjto){background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:.2rem .55rem;font-size:.8rem;cursor:pointer;color:var(--fg);white-space:nowrap}.diagram-tools.svelte-1hqpjto button:where(.svelte-1hqpjto):hover:not(:disabled){background:var(--hover)}.diagram-tools.svelte-1hqpjto button:where(.svelte-1hqpjto):disabled{opacity:.45;cursor:not-allowed}.diagram-tools.svelte-1hqpjto button.toggle.on:where(.svelte-1hqpjto){background:var(--accent);color:#fff;border-color:var(--accent);font-weight:600}.diagram-tools.svelte-1hqpjto button.accent:where(.svelte-1hqpjto){border-color:var(--accent);color:var(--accent);font-weight:600}.diagram-tools.svelte-1hqpjto button.accent:where(.svelte-1hqpjto):hover:not(:disabled){background:var(--accent);color:#fff}.ref-status.svelte-1hqpjto{font-size:.75rem;white-space:nowrap}.ref-status.ok.svelte-1hqpjto{color:#166534}.ref-status.error.svelte-1hqpjto{color:#c63a3a}.viewer.svelte-3vyg67{display:flex;flex-direction:column;height:100%;min-height:0}.editor-bar.svelte-3vyg67{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.4rem .75rem;background:var(--surface);border-bottom:1px solid var(--border);flex:0 0 auto}.editor-bar.svelte-3vyg67 .mode:where(.svelte-3vyg67),.editor-bar.svelte-3vyg67 .editor-actions:where(.svelte-3vyg67){display:flex;gap:.4rem;align-items:center}.editor-bar.svelte-3vyg67 .label:where(.svelte-3vyg67){font-size:.8rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}.editor-bar.svelte-3vyg67 button:where(.svelte-3vyg67){background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:.25rem .6rem;font-size:.85rem;cursor:pointer;color:var(--fg)}.editor-bar.svelte-3vyg67 button:where(.svelte-3vyg67):hover:not(:disabled){background:var(--hover)}.editor-bar.svelte-3vyg67 button.active:where(.svelte-3vyg67){background:var(--accent);color:#fff;border-color:var(--accent)}.editor-bar.svelte-3vyg67 button.primary:where(.svelte-3vyg67){background:var(--accent);color:#fff;border-color:var(--accent)}.editor-bar.svelte-3vyg67 button:where(.svelte-3vyg67):disabled{opacity:.55;cursor:not-allowed}.editor-fullwidth.svelte-3vyg67{grid-column:1 / -1}.layout.svelte-3vyg67{flex:1;min-height:0;display:grid;grid-template-columns:260px 1fr;grid-template-areas:"classes canvas"}.layout.has-changes.svelte-3vyg67{grid-template-columns:260px 1fr 280px;grid-template-areas:"classes canvas changes"}.sidebar.classes.svelte-3vyg67{grid-area:classes;border-right:1px solid var(--border);background:var(--surface);min-height:0;overflow-y:auto;display:flex;flex-direction:column}.sidebar.changes.svelte-3vyg67{grid-area:changes;border-left:1px solid var(--border);background:var(--surface);min-height:0;overflow:hidden}.canvas.svelte-3vyg67{grid-area:canvas}.sidebar.svelte-3vyg67{border-right:1px solid var(--border);background:var(--surface);overflow-y:auto}.diagram-tabs.svelte-3vyg67{flex:0 0 auto;display:flex;flex-wrap:wrap;gap:.25rem;padding:.4rem .5rem;border-bottom:1px solid var(--border);background:var(--surface);position:sticky;top:0;z-index:1}.diagram-tabs.svelte-3vyg67 button:where(.svelte-3vyg67){background:transparent;border:1px solid var(--border);border-radius:4px;padding:.25rem .6rem;font-size:.8rem;cursor:pointer;color:var(--fg);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.diagram-tabs.svelte-3vyg67 button:where(.svelte-3vyg67):hover:not(.active){background:var(--hover)}.diagram-tabs.svelte-3vyg67 button.active:where(.svelte-3vyg67){background:var(--accent);color:#fff;border-color:var(--accent)}.canvas.svelte-3vyg67{overflow:hidden;background:var(--bg);min-width:0;min-height:0}.error.svelte-3vyg67{color:#c63a3a}.muted.svelte-3vyg67{color:var(--muted)}.diff.svelte-1nzl7rn{display:flex;flex-direction:column;height:100%}.controls.svelte-1nzl7rn{display:flex;gap:.75rem;padding:.75rem 1rem;background:var(--surface);border-bottom:1px solid var(--border);align-items:end}label.svelte-1nzl7rn{display:flex;flex-direction:column;gap:.25rem;font-size:.75rem;color:var(--muted)}select.svelte-1nzl7rn,input.svelte-1nzl7rn{padding:.35rem .55rem;border:1px solid var(--border);border-radius:4px;background:var(--bg);color:var(--fg);min-width:180px}button.svelte-1nzl7rn{padding:.45rem .9rem;background:var(--accent);color:#fff;border:none;border-radius:4px;cursor:pointer;font-weight:600}button.svelte-1nzl7rn:disabled{opacity:.5;cursor:not-allowed}.viewer.svelte-1nzl7rn{flex:1;min-height:0}.error.svelte-1nzl7rn{color:#c63a3a;padding:0 1rem}.page.svelte-caoop0{display:flex;flex-direction:column;height:100%;min-height:0}.bar.svelte-caoop0{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.4rem .75rem;background:var(--surface);border-bottom:1px solid var(--border);flex:0 0 auto;flex-wrap:wrap}.left.svelte-caoop0,.right.svelte-caoop0{display:flex;gap:.5rem;align-items:center;flex-wrap:wrap}.muted.svelte-caoop0{color:var(--muted);font-size:.85rem}button.svelte-caoop0{background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:.3rem .6rem;font-size:.85rem;cursor:pointer;color:var(--fg)}button.svelte-caoop0:hover:not(:disabled){background:var(--hover)}button.primary.svelte-caoop0{background:var(--accent);color:#fff;border-color:var(--accent)}button.ghost.svelte-caoop0{color:var(--muted)}button.svelte-caoop0:disabled{opacity:.55;cursor:not-allowed}.error.svelte-caoop0{color:#c63a3a;font-size:.85rem}.canvas-wrap.svelte-caoop0{flex:1;min-height:0}.grid.svelte-1bnbcfv{display:grid;grid-template-columns:1fr 1fr;gap:.75rem 1rem;margin-bottom:.75rem}.span2.svelte-1bnbcfv{grid-column:span 2}label.svelte-1bnbcfv{display:flex;flex-direction:column;font-size:.85rem;color:var(--muted, #475569);gap:.25rem}label.check.svelte-1bnbcfv{flex-direction:row;align-items:center;gap:.4rem;color:var(--fg, #0f172a);margin-right:1rem}input.svelte-1bnbcfv:not([type]),textarea.svelte-1bnbcfv{padding:.4rem .55rem;font-size:.9rem;border:1px solid var(--border, #cbd5e1);border-radius:4px;background:#fff;color:var(--fg, #0f172a);font-family:inherit;resize:vertical}.description-label.svelte-1bnbcfv{margin-bottom:.75rem}fieldset.svelte-1bnbcfv{border:1px solid var(--border, #e2e8f0);border-radius:6px;padding:.5rem .75rem .75rem;margin-bottom:.75rem}legend.svelte-1bnbcfv{font-size:.78rem;text-transform:uppercase;letter-spacing:.05em;color:var(--muted, #64748b);padding:0 .25rem}.opts.svelte-1bnbcfv{display:flex;gap:.5rem 1rem;flex-wrap:wrap}.opts.svelte-1bnbcfv label:where(.svelte-1bnbcfv){flex-direction:row;text-transform:capitalize;color:var(--fg, #0f172a);gap:.25rem}button.svelte-1bnbcfv{background:var(--surface, #fff);border:1px solid var(--border, #cbd5e1);border-radius:4px;padding:.3rem .6rem;font-size:.85rem;cursor:pointer}button.primary.svelte-1bnbcfv{background:var(--accent, #2563eb);border-color:var(--accent, #2563eb);color:#fff}.grid.svelte-bsz97c{display:grid;grid-template-columns:1fr 1fr;gap:.75rem 1rem;margin-bottom:.75rem}label.svelte-bsz97c{display:flex;flex-direction:column;font-size:.85rem;color:var(--muted, #475569);gap:.25rem}label.check.svelte-bsz97c{flex-direction:row;align-items:center;gap:.4rem;color:var(--fg, #0f172a);margin-right:1rem}input.svelte-bsz97c:not([type]),textarea.svelte-bsz97c{padding:.4rem .55rem;font-size:.9rem;border:1px solid var(--border, #cbd5e1);border-radius:4px;background:#fff;color:var(--fg, #0f172a);font-family:inherit;resize:vertical}.description-label.svelte-bsz97c{margin-bottom:.75rem}fieldset.svelte-bsz97c{border:1px solid var(--border, #e2e8f0);border-radius:6px;padding:.5rem .75rem .75rem;margin-bottom:.75rem}legend.svelte-bsz97c{font-size:.78rem;text-transform:uppercase;letter-spacing:.05em;color:var(--muted, #64748b);padding:0 .25rem}.opts.svelte-bsz97c{display:flex;gap:.5rem 1rem;flex-wrap:wrap}.opts.svelte-bsz97c label:where(.svelte-bsz97c){flex-direction:row;text-transform:capitalize;color:var(--fg, #0f172a);gap:.25rem}.params.svelte-bsz97c{list-style:none;padding:0;margin:0 0 .5rem;display:flex;flex-direction:column;gap:.3rem}.params.svelte-bsz97c li:where(.svelte-bsz97c){display:grid;grid-template-columns:1fr auto 1fr 1fr auto;gap:.3rem;align-items:center}.sep.svelte-bsz97c{color:var(--muted, #64748b)}button.svelte-bsz97c{background:var(--surface, #fff);border:1px solid var(--border, #cbd5e1);border-radius:4px;padding:.3rem .6rem;font-size:.85rem;cursor:pointer}button.primary.svelte-bsz97c{background:var(--accent, #2563eb);border-color:var(--accent, #2563eb);color:#fff}button.danger.svelte-bsz97c{color:#b91c1c;border-color:#fca5a5;padding:.2rem .4rem}.grid.svelte-14r2m53{display:grid;grid-template-columns:1fr 1fr;gap:.75rem 1rem;margin-bottom:.75rem}.span2.svelte-14r2m53{grid-column:span 2}label.svelte-14r2m53{display:flex;flex-direction:column;font-size:.85rem;color:var(--muted, #475569);gap:.25rem}input.svelte-14r2m53:not([type]),textarea.svelte-14r2m53{padding:.4rem .55rem;font-size:.9rem;border:1px solid var(--border, #cbd5e1);border-radius:4px;background:#fff;color:var(--fg, #0f172a);font-family:inherit;resize:vertical}.description-label.svelte-14r2m53{margin-bottom:.75rem}fieldset.svelte-14r2m53{border:1px solid var(--border, #e2e8f0);border-radius:6px;padding:.5rem .75rem .75rem;margin-bottom:.75rem}legend.svelte-14r2m53{font-size:.78rem;text-transform:uppercase;letter-spacing:.05em;color:var(--muted, #64748b);padding:0 .25rem}.kind-row.svelte-14r2m53{display:flex;flex-wrap:wrap;gap:.5rem 1rem;align-items:center}.kind-opt.svelte-14r2m53{flex-direction:row;color:var(--fg, #0f172a);gap:.25rem;text-transform:capitalize}.chips.svelte-14r2m53{list-style:none;padding:0;margin:0 0 .5rem;display:flex;flex-wrap:wrap;gap:.4rem}.chips.svelte-14r2m53 li:where(.svelte-14r2m53){background:#e0f2fe;color:#075985;border-radius:999px;padding:.15rem .5rem .15rem .7rem;font-size:.8rem;display:inline-flex;align-items:center;gap:.25rem}.chips.svelte-14r2m53 button:where(.svelte-14r2m53){background:transparent;border:none;cursor:pointer;color:#075985;font-size:1rem;line-height:1}.add-base.svelte-14r2m53{display:flex;gap:.4rem}.add-base.svelte-14r2m53 input:where(.svelte-14r2m53){flex:1}.rows.svelte-14r2m53{list-style:none;padding:0;margin:0 0 .5rem;display:flex;flex-direction:column;gap:.3rem}.rows.svelte-14r2m53 li:where(.svelte-14r2m53){display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.25rem .5rem;background:var(--bg, #f8fafc);border-radius:4px}.member-row.svelte-14r2m53{font-size:.85rem;color:var(--fg, #0f172a)}.vis.svelte-14r2m53{color:var(--muted, #64748b);margin-right:.25rem}.mtype.svelte-14r2m53{color:var(--muted, #475569)}.row-actions.svelte-14r2m53{display:flex;gap:.3rem}button.svelte-14r2m53{background:var(--surface, #fff);border:1px solid var(--border, #cbd5e1);border-radius:4px;padding:.3rem .6rem;font-size:.85rem;cursor:pointer}button.svelte-14r2m53:hover{background:var(--hover, #f1f5f9)}button.primary.svelte-14r2m53{background:var(--accent, #2563eb);border-color:var(--accent, #2563eb);color:#fff}button.danger.svelte-14r2m53{color:#b91c1c;border-color:#fca5a5}button.danger.svelte-14r2m53:hover{background:#fef2f2}.muted.svelte-14r2m53{color:var(--muted, #64748b);margin:0 0 .5rem;font-size:.85rem}.grid.svelte-12n3i76{display:grid;grid-template-columns:1fr 1fr;gap:.75rem 1rem}.span2.svelte-12n3i76{grid-column:span 2}label.svelte-12n3i76{display:flex;flex-direction:column;font-size:.85rem;color:var(--muted, #475569);gap:.25rem}input.svelte-12n3i76:not([type]){padding:.4rem .55rem;font-size:.9rem;border:1px solid var(--border, #cbd5e1);border-radius:4px;background:#fff;color:var(--fg, #0f172a)}button.svelte-12n3i76{background:var(--surface, #fff);border:1px solid var(--border, #cbd5e1);border-radius:4px;padding:.3rem .6rem;font-size:.85rem;cursor:pointer}button.primary.svelte-12n3i76{background:var(--accent, #2563eb);border-color:var(--accent, #2563eb);color:#fff}button.danger.svelte-12n3i76{color:#b91c1c;border-color:#fca5a5}.muted.svelte-14a2iwo{color:var(--muted, #64748b);margin:0 0 .75rem;font-size:.9rem}code.svelte-14a2iwo{background:var(--bg, #f1f5f9);padding:.05rem .3rem;border-radius:3px;font-size:.85em}.opts.svelte-14a2iwo{display:flex;flex-direction:column;gap:.5rem}.opts.svelte-14a2iwo button:where(.svelte-14a2iwo){display:flex;flex-direction:column;align-items:flex-start;text-align:left;padding:.6rem .8rem;background:var(--surface, #fff);border:1px solid var(--border, #cbd5e1);border-radius:6px;cursor:pointer;gap:.15rem}.opts.svelte-14a2iwo button:where(.svelte-14a2iwo):hover{background:var(--hover, #f8fafc);border-color:var(--accent, #2563eb)}.hint.svelte-14a2iwo{font-size:.8rem;color:var(--muted, #64748b)}:root{--bg: #fafafa;--surface: #ffffff;--fg: #1a1a1a;--muted: #6b7280;--border: #e5e7eb;--accent: #2563eb;--hover: #f1f5f9}body{margin:0;background:var(--bg);color:var(--fg);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,sans-serif}html,body,#app{height:100%}.app.svelte-1n46o8q{display:flex;flex-direction:column;height:100vh}header.svelte-1n46o8q{display:flex;align-items:center;gap:1rem;padding:.75rem 1.25rem;background:var(--surface);border-bottom:1px solid var(--border)}h1.svelte-1n46o8q{margin:0;font-size:1.1rem}.path.svelte-1n46o8q{color:var(--muted);font-size:.875rem;font-family:ui-monospace,SFMono-Regular,monospace;max-width:40rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lang.svelte-1n46o8q{background:var(--hover);border-radius:4px;padding:.05rem .4rem;margin-left:.4rem;font-size:.75rem;color:var(--fg)}nav.svelte-1n46o8q{margin-left:auto;display:flex;gap:.25rem}nav.svelte-1n46o8q button:where(.svelte-1n46o8q),.ghost.svelte-1n46o8q,.reset.svelte-1n46o8q,.export.svelte-1n46o8q{background:transparent;border:1px solid var(--border);padding:.3rem .75rem;border-radius:4px;cursor:pointer;color:var(--fg);text-decoration:none;font-size:.85rem;line-height:1.4;display:inline-flex;align-items:center}nav.svelte-1n46o8q button.active:where(.svelte-1n46o8q){background:var(--accent);color:#fff;border-color:var(--accent)}.export.svelte-1n46o8q{background:var(--accent);color:#fff;border-color:var(--accent)}.reset.svelte-1n46o8q,.ghost.svelte-1n46o8q{color:var(--muted)}.reset.svelte-1n46o8q:hover,.ghost.svelte-1n46o8q:hover,nav.svelte-1n46o8q button:where(.svelte-1n46o8q):hover,.export.svelte-1n46o8q:hover{background:var(--hover)}.export.svelte-1n46o8q:hover{background:#1d4ed8}.content.svelte-1n46o8q{flex:1;min-height:0;overflow-y:auto}.error.svelte-1n46o8q{color:#c63a3a;padding:1rem}.autoload.svelte-1n46o8q{color:var(--muted);padding:1rem}.autoload.svelte-1n46o8q code:where(.svelte-1n46o8q){background:var(--hover);padding:0 .3rem;border-radius:3px}
|