@miragon/team-topologies-renderer 0.1.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +146 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# @miragon/team-topologies-renderer
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@miragon/team-topologies-renderer)
|
|
4
|
+
[](https://github.com/Miragon/team-topologies-modeler/blob/main/LICENSE)
|
|
5
|
+
|
|
6
|
+
The **browser layer** of the [Team Topologies Modeler](../../README.md): a framework-agnostic viewer
|
|
7
|
+
and full editor for [Team Topologies](https://teamtopologies.com/) diagrams, built on
|
|
8
|
+
[diagram-js](https://github.com/bpmn-io/diagram-js) (MIT).
|
|
9
|
+
|
|
10
|
+
It renders the canonical document from
|
|
11
|
+
[`@miragon/team-topologies-schema-model`](../schema-model) and gives you palette, move, resize,
|
|
12
|
+
connect-by-overlap, context pad, inline label editing and undo/redo — with no UI framework required.
|
|
13
|
+
Mount it into any `<div>`; the web app (React) and the VS Code extension both wrap this exact package.
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @miragon/team-topologies-renderer @miragon/team-topologies-schema-model
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Three entry points
|
|
22
|
+
|
|
23
|
+
| Class | Use it for |
|
|
24
|
+
| ----------------- | ------------------------------------------------------------------------------ |
|
|
25
|
+
| `Viewer` | Read-only rendering, no interaction (thumbnails, static embeds). |
|
|
26
|
+
| `NavigatedViewer` | Read-only + zoom (scroll), pan (drag) and selection. |
|
|
27
|
+
| `Modeler` | The full editor: palette, move, resize, context pad, label editing, undo/redo. |
|
|
28
|
+
|
|
29
|
+
All three share a common base (`TtBaseViewer`) with the same import/export and lifecycle API.
|
|
30
|
+
|
|
31
|
+
## Quick start
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { Modeler } from "@miragon/team-topologies-renderer";
|
|
35
|
+
import "@miragon/team-topologies-renderer/assets/team-topologies.css";
|
|
36
|
+
import { SAMPLE_DOCUMENT } from "@miragon/team-topologies-schema-model";
|
|
37
|
+
|
|
38
|
+
const modeler = new Modeler({ container: document.querySelector("#canvas")! });
|
|
39
|
+
|
|
40
|
+
// Load a document (auto-fits the viewport)
|
|
41
|
+
const { warnings } = modeler.importDocument(SAMPLE_DOCUMENT);
|
|
42
|
+
|
|
43
|
+
// Read the live canvas back as the canonical model
|
|
44
|
+
const doc = modeler.exportDocument();
|
|
45
|
+
|
|
46
|
+
// Export a standalone, self-contained SVG
|
|
47
|
+
const { svg } = modeler.saveSVG();
|
|
48
|
+
|
|
49
|
+
// Undo / redo are driven by the command stack
|
|
50
|
+
modeler.undo();
|
|
51
|
+
modeler.redo();
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
> **The CSS is required.** Import `@miragon/team-topologies-renderer/assets/team-topologies.css`
|
|
55
|
+
> (it also pulls in `diagram-js`'s own stylesheet) — without it the palette, context pad and label
|
|
56
|
+
> editor are unstyled.
|
|
57
|
+
|
|
58
|
+
## API
|
|
59
|
+
|
|
60
|
+
### Constructor — `TtViewerOptions`
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
new Modeler({
|
|
64
|
+
container?: HTMLElement, // host element (a detached <div> if omitted)
|
|
65
|
+
width?: number | string, // canvas width (default "100%")
|
|
66
|
+
height?: number | string, // canvas height (default "100%", or "600px" with no container)
|
|
67
|
+
additionalModules?: ModuleDeclaration[], // extra diagram-js modules
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Shared methods (`Viewer` / `NavigatedViewer` / `Modeler`)
|
|
72
|
+
|
|
73
|
+
| Method | Returns | Purpose |
|
|
74
|
+
| ---------------------------------- | ------------------------------- | ------------------------------------------------- |
|
|
75
|
+
| `importDocument(doc)` | `{ warnings: ImportWarning[] }` | Replace canvas content and auto-fit. |
|
|
76
|
+
| `exportDocument()` | `TtDocument` | Rebuild the canonical model from the live canvas. |
|
|
77
|
+
| `saveSVG()` | `{ svg: string }` | Self-contained SVG snapshot (fitted viewBox). |
|
|
78
|
+
| `setMeta(partial)` / `getMeta()` | — / `RootBusinessObject` | Read/write diagram-level metadata (e.g. `title`). |
|
|
79
|
+
| `attachTo(el)` / `detach()` | `void` | Move the canvas in/out of the DOM (keeps state). |
|
|
80
|
+
| `clear()` / `destroy()` | `void` | Empty the canvas / tear it down. |
|
|
81
|
+
| `on(event, cb)` / `off(event, cb)` | `void` | Subscribe to diagram-js events. |
|
|
82
|
+
| `get<T>(name)` | `T` | Resolve a diagram-js service (advanced). |
|
|
83
|
+
|
|
84
|
+
### Modeler-only
|
|
85
|
+
|
|
86
|
+
`undo()`, `redo()`, `canUndo()`, `canRedo()`.
|
|
87
|
+
|
|
88
|
+
### Helpers & types
|
|
89
|
+
|
|
90
|
+
- **Type guards:** `isTtElement`, `isTtTeam`, `isTtInteraction`, `isTtFlow`.
|
|
91
|
+
- **Runtime element types:** `TtTeam`, `TtInteraction`, `TtFlow`, `TtElement`.
|
|
92
|
+
- **Palette icon generators:** `teamIconSvg(type)`, `interactionIconSvg(mode)`, `flowIconSvg()` —
|
|
93
|
+
WYSIWYG SVG glyphs matching what the canvas draws.
|
|
94
|
+
- **Other:** `TtViewerOptions`, `ImportWarning`, `RootBusinessObject`, `ROOT_ID`, `saveSVG`.
|
|
95
|
+
|
|
96
|
+
## How it's built
|
|
97
|
+
|
|
98
|
+
The package is a set of [didi](https://github.com/nikku/didi) modules layered on diagram-js. Each is
|
|
99
|
+
exported (e.g. `ttDrawModule`, `ttPaletteModule`, `ttModelingModule`) so you can compose your own
|
|
100
|
+
viewer via `additionalModules`:
|
|
101
|
+
|
|
102
|
+
| Module | Responsibility |
|
|
103
|
+
| ---------------------- | -------------------------------------------------------------------------------- |
|
|
104
|
+
| `ttModelModule` | Element factory with notation defaults (`TtElementFactory`). |
|
|
105
|
+
| `ttDrawModule` | Custom SVG rendering of teams, interactions and flow (`TeamTopologiesRenderer`). |
|
|
106
|
+
| `ioModule` | Document ↔ canvas bridge (`TtImporter`, `TtExporter`, `saveSVG`). |
|
|
107
|
+
| `ttModelingModule` | High-level mutations — label, team type, interaction mode, colours, description. |
|
|
108
|
+
| `ttRulesModule` | Editing rules (what can move / resize / be created). |
|
|
109
|
+
| `ttBehaviorsModule` | Keeps the model **flat** — shapes never nest. |
|
|
110
|
+
| `ttPaletteModule` | The drag-to-create tool palette. |
|
|
111
|
+
| `ttContextPadModule` | Per-element actions (rename, delete). |
|
|
112
|
+
| `ttLabelEditingModule` | Double-click inline label editing. |
|
|
113
|
+
| `ttKeyboardModule` | Undo / redo / delete shortcuts. |
|
|
114
|
+
| `ttZOrderModule` | Fixed stacking order (flow behind, teams, interactions on top). |
|
|
115
|
+
|
|
116
|
+
### Rendering
|
|
117
|
+
|
|
118
|
+
A custom `TeamTopologiesRenderer` (priority `1500`, beating diagram-js's default) draws each element
|
|
119
|
+
from the spec in [`@miragon/team-topologies-schema-model`](../schema-model): the four team outlines
|
|
120
|
+
(octagon, vertical/horizontal rounded rectangles, square rectangle) drawn solid; the three
|
|
121
|
+
interaction glyphs (parallelogram, triangle, circle) drawn dashed and translucent; the flow-of-change
|
|
122
|
+
as a dashed left-to-right band. Labels are word-wrapped and centred. Per-element `fill`/`stroke`
|
|
123
|
+
overrides win over the spec defaults.
|
|
124
|
+
|
|
125
|
+
## Import / export
|
|
126
|
+
|
|
127
|
+
The package reads and writes the canonical `TtDocument` (JSON) and exports a standalone **SVG**.
|
|
128
|
+
PNG export and the embedded-scene round-trip (storing the document inside the exported image) live in
|
|
129
|
+
the [web app](../../apps/webapp) and the [VS Code extension](../../apps/vscode), which add the canvas
|
|
130
|
+
rasterisation those formats need.
|
|
131
|
+
|
|
132
|
+
## Development
|
|
133
|
+
|
|
134
|
+
Part of the [Team Topologies Modeler](../../README.md) monorepo; consumed from source by the apps.
|
|
135
|
+
From the repo root:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
npm run build -w packages/renderer # Vite library build → dist/ (publish build)
|
|
139
|
+
npm test # Vitest unit tests
|
|
140
|
+
npm run test:browser # renderer integration tests in real Chromium
|
|
141
|
+
npm run typecheck
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## License
|
|
145
|
+
|
|
146
|
+
[MIT](../../LICENSE). diagram-js and its dependencies are MIT / ISC / Apache-2.0.
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/model/di-types.ts","../src/io/saveSvg.ts","../src/io/types.ts","../src/TtBaseViewer.ts","../src/model/TtElementFactory.ts","../src/model/index.ts","../src/draw/styles.ts","../src/draw/TeamTopologiesRenderer.ts","../src/draw/index.ts","../src/io/TtImporter.ts","../src/io/TtExporter.ts","../src/io/index.ts","../src/Viewer.ts","../src/NavigatedViewer.ts","../src/modeling/cmd/UpdatePropertiesHandler.ts","../src/modeling/TtModeling.ts","../src/modeling/index.ts","../src/rules/TtRules.ts","../src/rules/index.ts","../src/behaviors/TtFlatModelBehavior.ts","../src/behaviors/index.ts","../src/draw/palette-icons.ts","../src/palette/TtPaletteProvider.ts","../src/palette/index.ts","../src/draw/icons.ts","../src/context-pad/TtContextPadProvider.ts","../src/context-pad/index.ts","../src/label-editing/TtLabelEditing.ts","../src/label-editing/index.ts","../src/keyboard/TtKeyboard.ts","../src/keyboard/index.ts","../src/zorder/TtZOrder.ts","../src/zorder/index.ts","../src/Modeler.ts"],"sourcesContent":["/**\n * diagram-js runtime model for the Team Topologies notation. Every element is a\n * placed, resizable SHAPE discriminated by `ttKind`:\n * - `team` — one of the four team types (label inside the box)\n * - `interaction` — a mode glyph (parallelogram / triangle / circle), 50%\n * transparent, overlaid on the boundary between teams\n * - `flow` — the \"flow of change\" arrow guide\n *\n * These runtime properties are the source of truth while editing; the exporter\n * rebuilds the canonical `TtDocument` from them.\n */\n\nimport type { Shape } from \"diagram-js/lib/model/Types\";\nimport type { InteractionMode, TeamType } from \"@miragon/team-topologies-schema-model\";\n\nexport type TtKind = \"team\" | \"interaction\" | \"flow\";\n\nexport interface TtTeam extends Shape {\n ttKind: \"team\";\n teamType: TeamType;\n /** Display name (separate from diagram-js `label`). */\n ttLabel?: string;\n description?: string;\n fill?: string;\n stroke?: string;\n}\n\nexport interface TtInteraction extends Shape {\n ttKind: \"interaction\";\n mode: InteractionMode;\n ttLabel?: string;\n fill?: string;\n stroke?: string;\n}\n\nexport interface TtFlow extends Shape {\n ttKind: \"flow\";\n ttLabel?: string;\n}\n\nexport type TtElement = TtTeam | TtInteraction | TtFlow;\n\nfunction kindOf(el: unknown): string | undefined {\n return typeof el === \"object\" && el !== null\n ? ((el as { ttKind?: unknown }).ttKind as string | undefined)\n : undefined;\n}\n\nexport function isTtElement(el: unknown): el is TtElement {\n return typeof kindOf(el) === \"string\";\n}\n\nexport function isTtTeam(el: unknown): el is TtTeam {\n return kindOf(el) === \"team\";\n}\n\nexport function isTtInteraction(el: unknown): el is TtInteraction {\n return kindOf(el) === \"interaction\";\n}\n\nexport function isTtFlow(el: unknown): el is TtFlow {\n return kindOf(el) === \"flow\";\n}\n","/**\n * Serialises the current canvas into a standalone SVG (snapshot / export),\n * fitted to the content bounds and independent of the current zoom / scroll.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type ElementRegistry from \"diagram-js/lib/core/ElementRegistry\";\nimport { isTtElement } from \"../model/di-types.js\";\n\nconst MARGIN = 40;\n\nexport function saveSVG(canvas: Canvas, elementRegistry: ElementRegistry): { svg: string } {\n const container = canvas.getContainer();\n const source = container.querySelector(\"svg\");\n if (!source) throw new Error(\"No SVG found in the canvas container.\");\n\n // Content bounds from the team shapes (interactions sit between them).\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const el of elementRegistry.getAll()) {\n if (!isTtElement(el)) continue;\n const s = el as unknown as { x: number; y: number; width: number; height: number };\n minX = Math.min(minX, s.x);\n minY = Math.min(minY, s.y);\n maxX = Math.max(maxX, s.x + s.width);\n maxY = Math.max(maxY, s.y + s.height);\n }\n if (!Number.isFinite(minX)) {\n minX = 0;\n minY = 0;\n maxX = 100;\n maxY = 100;\n }\n\n const x = minX - MARGIN;\n const y = minY - MARGIN;\n const width = maxX - minX + MARGIN * 2;\n const height = maxY - minY + MARGIN * 2;\n\n const clone = source.cloneNode(true) as SVGSVGElement;\n clone.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n clone.setAttribute(\"viewBox\", `${x} ${y} ${width} ${height}`);\n clone.setAttribute(\"width\", String(Math.round(width)));\n clone.setAttribute(\"height\", String(Math.round(height)));\n\n // Neutralise pan/zoom: let the viewBox (above) drive the geometry.\n const viewport = clone.querySelector<SVGGElement>(\".viewport\");\n if (viewport) viewport.removeAttribute(\"transform\");\n\n const svg = new XMLSerializer().serializeToString(clone);\n return { svg: '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + svg };\n}\n","/** ID of the diagram-js root element holding the Team Topologies diagram. */\nexport const ROOT_ID = \"tt-root\";\n\nexport interface ImportWarning {\n readonly message: string;\n readonly elementId?: string;\n}\n\n/** Diagram-level metadata stashed on the root element. */\nexport interface RootBusinessObject {\n title: string;\n}\n","/**\n * Shared lifecycle & DI bootstrap for every Team Topologies viewer (own code,\n * no bpmn-js dependency). Subclasses only override `_getModules()`. The renderer\n * is framework-agnostic — mount it into any element (e.g. a VS Code webview).\n */\n\nimport Diagram from \"diagram-js/lib/Diagram\";\nimport type { ModuleDeclaration } from \"didi\";\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type ElementRegistry from \"diagram-js/lib/core/ElementRegistry\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport type { Root } from \"diagram-js/lib/model/Types\";\nimport type { TtDocument } from \"@miragon/team-topologies-schema-model\";\nimport { saveSVG } from \"./io/saveSvg.js\";\nimport type TtImporter from \"./io/TtImporter.js\";\nimport type TtExporter from \"./io/TtExporter.js\";\nimport { ROOT_ID, type ImportWarning, type RootBusinessObject } from \"./io/types.js\";\n\nexport interface TtViewerOptions {\n /** Host element. When absent, a detached <div> is created (attach later). */\n container?: HTMLElement;\n width?: number | string;\n height?: number | string;\n /** Appended to the module list (extension point). */\n additionalModules?: ModuleDeclaration[];\n}\n\nexport type EventCallback<T = unknown> = (event: T) => void;\n\ntype RootWithMeta = Root & { businessObject?: RootBusinessObject };\n\nfunction sizeToCss(value: number | string): string {\n return typeof value === \"number\" ? `${value}px` : value;\n}\n\nexport abstract class TtBaseViewer {\n protected abstract _getModules(): ModuleDeclaration[];\n\n private _diagram: Diagram | undefined;\n private readonly _container: HTMLElement;\n private readonly _options: TtViewerOptions;\n\n constructor(options: TtViewerOptions = {}) {\n this._options = options;\n this._container = this._createContainer(options);\n }\n\n private _createContainer(options: TtViewerOptions): HTMLElement {\n const container = options.container ?? document.createElement(\"div\");\n container.classList.add(\"tt-djs-container\");\n container.style.width = sizeToCss(options.width ?? \"100%\");\n container.style.height = sizeToCss(options.height ?? (options.container ? \"100%\" : \"600px\"));\n return container;\n }\n\n private _ensureDiagram(): Diagram {\n if (!this._diagram) {\n const modules = [...this._getModules(), ...(this._options.additionalModules ?? [])];\n this._diagram = new Diagram({ canvas: { container: this._container }, modules });\n }\n return this._diagram;\n }\n\n /** Resolve a diagram-js service from the didi injector. */\n get<T>(name: string): T {\n return this._ensureDiagram().get<T>(name);\n }\n\n on<T = unknown>(event: string, callback: EventCallback<T>, priority = 1000): void {\n this.get<EventBus>(\"eventBus\").on(event, priority, callback as EventCallback);\n }\n\n off(event: string, callback: EventCallback): void {\n this.get<EventBus>(\"eventBus\").off(event, callback);\n }\n\n /** Load a document into the canvas (replaces existing content). */\n importDocument(doc: TtDocument): { warnings: ImportWarning[] } {\n const diagram = this._ensureDiagram();\n const eventBus = diagram.get<EventBus>(\"eventBus\");\n const importer = diagram.get<TtImporter>(\"ttImporter\");\n importer.clear();\n const warnings = importer.import(doc);\n this._fit();\n eventBus.fire(\"import.done\", { warnings });\n return { warnings };\n }\n\n /** Current canvas state as a canonical document. */\n exportDocument(): TtDocument {\n return this.get<TtExporter>(\"ttExporter\").export();\n }\n\n /** Update diagram-level metadata (title / flow-of-change) on the root. */\n setMeta(partial: Partial<RootBusinessObject>): void {\n const canvas = this.get<Canvas>(\"canvas\");\n let root: RootWithMeta | undefined;\n try {\n root = canvas.getRootElement() as RootWithMeta;\n } catch {\n return;\n }\n if (!root || root.id !== ROOT_ID) return;\n const current = root.businessObject ?? { title: \"Untitled team topology\" };\n root.businessObject = { ...current, ...partial };\n }\n\n /** Read diagram-level metadata (title / flow-of-change) from the root. */\n getMeta(): RootBusinessObject | undefined {\n try {\n const root = this.get<Canvas>(\"canvas\").getRootElement() as RootWithMeta;\n return root.businessObject;\n } catch {\n return undefined;\n }\n }\n\n /** Standalone, self-contained SVG snapshot. */\n saveSVG(): { svg: string } {\n return saveSVG(this.get<Canvas>(\"canvas\"), this.get<ElementRegistry>(\"elementRegistry\"));\n }\n\n /** Fit the content into the viewport, leaving room at the top for the palette. */\n private _fit(topInset = 84, pad = 56): void {\n const canvas = this.get<Canvas>(\"canvas\");\n const registry = this.get<ElementRegistry>(\"elementRegistry\");\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const el of registry.getAll()) {\n const e = el as { x?: number; y?: number; width?: number; height?: number };\n if (\n typeof e.x !== \"number\" ||\n typeof e.y !== \"number\" ||\n typeof e.width !== \"number\" ||\n typeof e.height !== \"number\"\n ) {\n continue;\n }\n minX = Math.min(minX, e.x);\n minY = Math.min(minY, e.y);\n maxX = Math.max(maxX, e.x + e.width);\n maxY = Math.max(maxY, e.y + e.height);\n }\n if (!Number.isFinite(minX)) return;\n\n const rect = this._container.getBoundingClientRect();\n const W = rect.width;\n const H = rect.height;\n const cw = Math.max(maxX - minX, 1);\n const ch = Math.max(maxY - minY, 1);\n if (!W || !H) {\n canvas.zoom(\"fit-viewport\");\n return;\n }\n const s = Math.min((W - 2 * pad) / cw, (H - topInset - pad) / ch, 1.25);\n canvas.viewbox({\n x: minX + cw / 2 - W / 2 / s,\n y: minY - topInset / s,\n width: W / s,\n height: H / s,\n });\n }\n\n /** Attach the container into `target`. */\n attachTo(target: HTMLElement): void {\n target.appendChild(this._container);\n this.get<Canvas>(\"canvas\").resized();\n }\n\n /** Detach the container from the DOM, preserving state. */\n detach(): void {\n this._container.remove();\n }\n\n clear(): void {\n this._ensureDiagram().clear();\n }\n\n destroy(): void {\n if (this._diagram) {\n this._diagram.destroy();\n this._diagram = undefined;\n }\n this._container.remove();\n }\n\n get container(): HTMLElement {\n return this._container;\n }\n}\n","/**\n * Creates diagram-js runtime shapes carrying Team Topologies markers, from\n * canonical document elements (import) or from scratch (palette drag-to-create).\n * Everything is a shape — teams, interaction glyphs and the flow arrow.\n */\n\nimport type ElementFactory from \"diagram-js/lib/core/ElementFactory\";\nimport {\n FLOW_SPEC,\n INTERACTION_MODE_SPECS,\n TEAM_TYPE_SPECS,\n newId,\n} from \"@miragon/team-topologies-schema-model\";\nimport type {\n FlowShape,\n InteractionMode,\n InteractionShape,\n TeamNode,\n TeamType,\n} from \"@miragon/team-topologies-schema-model\";\nimport type { TtFlow, TtInteraction, TtTeam } from \"./di-types.js\";\n\nexport default class TtElementFactory {\n static $inject = [\"elementFactory\"];\n\n constructor(private readonly elementFactory: ElementFactory) {}\n\n // --- from canonical document elements (import) -------------------------\n\n createTeam(node: TeamNode): TtTeam {\n return this.elementFactory.createShape({\n id: node.id,\n x: node.position.x,\n y: node.position.y,\n width: node.size.width,\n height: node.size.height,\n ttKind: \"team\",\n teamType: node.type,\n ttLabel: node.label,\n ...(node.description ? { description: node.description } : {}),\n ...(node.fill ? { fill: node.fill } : {}),\n ...(node.stroke ? { stroke: node.stroke } : {}),\n } as Partial<TtTeam>) as unknown as TtTeam;\n }\n\n createInteraction(shape: InteractionShape): TtInteraction {\n return this.elementFactory.createShape({\n id: shape.id,\n x: shape.position.x,\n y: shape.position.y,\n width: shape.size.width,\n height: shape.size.height,\n ttKind: \"interaction\",\n mode: shape.mode,\n ...(shape.label ? { ttLabel: shape.label } : {}),\n ...(shape.fill ? { fill: shape.fill } : {}),\n ...(shape.stroke ? { stroke: shape.stroke } : {}),\n } as Partial<TtInteraction>) as unknown as TtInteraction;\n }\n\n createFlow(shape: FlowShape): TtFlow {\n return this.elementFactory.createShape({\n id: shape.id,\n x: shape.position.x,\n y: shape.position.y,\n width: shape.size.width,\n height: shape.size.height,\n ttKind: \"flow\",\n ...(shape.label ? { ttLabel: shape.label } : {}),\n } as Partial<TtFlow>) as unknown as TtFlow;\n }\n\n // --- fresh, not-yet-placed shapes (palette / context-pad create) -------\n //\n // These set an explicit model-style id (`team_…`/`int_…`/`flow_…`, matching\n // the model package's factory). We must NOT fall back to diagram-js' own\n // auto-id: its counter starts at `shape_12` and is not advanced past ids that\n // come in via import, so a re-imported `shape_N` (an element created in a\n // previous session, then autosaved) collides with the next palette create —\n // the first placement after a reload then throws \"element already exists\".\n\n createNewTeam(type: TeamType, label?: string): TtTeam {\n const spec = TEAM_TYPE_SPECS[type];\n return this.elementFactory.createShape({\n id: newId(\"team\"),\n width: spec.defaultSize.width,\n height: spec.defaultSize.height,\n ttKind: \"team\",\n teamType: type,\n ttLabel: label ?? spec.label,\n } as Partial<TtTeam>) as unknown as TtTeam;\n }\n\n createNewInteraction(mode: InteractionMode): TtInteraction {\n const spec = INTERACTION_MODE_SPECS[mode];\n return this.elementFactory.createShape({\n id: newId(\"int\"),\n width: spec.defaultSize.width,\n height: spec.defaultSize.height,\n ttKind: \"interaction\",\n mode,\n } as Partial<TtInteraction>) as unknown as TtInteraction;\n }\n\n createNewFlow(): TtFlow {\n return this.elementFactory.createShape({\n id: newId(\"flow\"),\n width: FLOW_SPEC.defaultSize.width,\n height: FLOW_SPEC.defaultSize.height,\n ttKind: \"flow\",\n ttLabel: FLOW_SPEC.label,\n } as Partial<TtFlow>) as unknown as TtFlow;\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtElementFactory from \"./TtElementFactory.js\";\n\n/** Element factory with Team Topologies defaults. */\nexport const ttModelModule: ModuleDeclaration = {\n ttElementFactory: [\"type\", TtElementFactory],\n};\n\nexport { default as TtElementFactory } from \"./TtElementFactory.js\";\nexport * from \"./di-types.js\";\n","/** Shared rendering constants (typography, accent, priorities). */\n\n/** BaseRenderer default priority is 1000; 1500 wins the render.shape/connection event. */\nexport const TT_RENDER_PRIORITY = 1500;\n\n/** Selection / hover accent (kept in sync with the app theme). */\nexport const ACCENT = \"#4f46e5\";\n\nexport const INK = \"#1f2430\";\nexport const INK_SOFT = \"#525a6b\";\n\nexport const FONT = {\n /**\n * Set directly as the `font-family` attribute on every SVG <text> (canvas\n * labels and therefore the SVG export too) — not inherited from a CSS\n * container. Falls back to system sans when the host doesn't provide Inter.\n */\n family: \"'Inter', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n label: 13.5,\n small: 11,\n} as const;\n\n/** Paper colour used for the label halo so text stays legible over lines. */\nexport const PAPER = \"#ffffff\";\n","/**\n * SVG rendering of the Team Topologies notation (BaseRenderer subclass).\n * Everything is a placed shape:\n * - teams: SOLID resizable boxes (label wrapped inside), distinguished by shape\n * as well as colour;\n * - interactions: DASHED, 50%-transparent glyphs (collaboration = parallelogram,\n * x-as-a-service = triangle, facilitating = circle) laid over team boundaries;\n * - flow: a dashed \"flow of change\" arrow.\n *\n * Colours/shapes come from the single notation source (`@miragon/team-topologies-schema-model`).\n */\n\nimport BaseRenderer from \"diagram-js/lib/draw/BaseRenderer\";\nimport { append as svgAppend, create as svgCreate, attr as svgAttr } from \"tiny-svg\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport type { ElementLike, ShapeLike } from \"diagram-js/lib/model/Types\";\nimport {\n FLOW_SPEC,\n INTERACTION_MODE_SPECS,\n TEAM_TYPE_SPECS,\n dashArray,\n} from \"@miragon/team-topologies-schema-model\";\nimport { FONT, INK, INK_SOFT } from \"./styles.js\";\nimport { TT_RENDER_PRIORITY } from \"./styles.js\";\nimport {\n isTtElement,\n isTtFlow,\n isTtInteraction,\n isTtTeam,\n type TtFlow,\n type TtInteraction,\n type TtTeam,\n} from \"../model/di-types.js\";\n\ntype Attrs = Record<string, string | number>;\n\nexport default class TeamTopologiesRenderer extends BaseRenderer {\n static $inject = [\"eventBus\"];\n\n constructor(eventBus: EventBus) {\n super(eventBus, TT_RENDER_PRIORITY);\n }\n\n override canRender(element: ElementLike): boolean {\n return isTtElement(element);\n }\n\n override drawShape(visuals: SVGElement, element: ShapeLike): SVGElement {\n if (isTtTeam(element)) return this.drawTeam(visuals, element);\n if (isTtInteraction(element)) return this.drawInteraction(visuals, element);\n if (isTtFlow(element)) return this.drawFlow(visuals, element);\n const rect = svgAttr(svgCreate(\"rect\"), {\n width: element.width,\n height: element.height,\n fill: \"#eee\",\n });\n svgAppend(visuals, rect);\n return rect;\n }\n\n override getShapePath(shape: ShapeLike): string {\n const { x, y, width, height } = shape;\n return `M${x},${y}l${width},0l0,${height}l${-width},0z`;\n }\n\n // --- teams ---------------------------------------------------------------\n\n private drawTeam(visuals: SVGElement, team: TtTeam): SVGElement {\n const spec = TEAM_TYPE_SPECS[team.teamType] ?? TEAM_TYPE_SPECS[\"stream-aligned\"];\n const w = Math.max(team.width, 1);\n const h = Math.max(team.height, 1);\n const sw = spec.strokeWidth;\n const dash = dashArray(spec.strokeStyle, sw);\n const outline = this.teamOutline(spec.shape, w, h, sw, {\n fill: team.fill ?? spec.fill,\n stroke: team.stroke ?? spec.stroke,\n \"stroke-width\": sw,\n ...(dash ? { \"stroke-dasharray\": dash } : {}),\n \"stroke-linejoin\": \"round\",\n });\n svgAppend(visuals, outline);\n this.appendLabel(visuals, team.ttLabel ?? \"\", w, h, { \"font-weight\": \"640\" });\n return outline;\n }\n\n private teamOutline(kind: string, w: number, h: number, sw: number, attrs: Attrs): SVGElement {\n const i = sw / 2;\n const iw = w - sw;\n const ih = h - sw;\n if (kind === \"octagon\") {\n const c = Math.min(iw, ih) * 0.29;\n return svgAttr(svgCreate(\"polygon\"), { points: octagon(i, iw, ih, c), ...attrs });\n }\n const rx = kind === \"rect\" ? 4 : Math.min(20, ih / 2, iw / 2);\n return svgAttr(svgCreate(\"rect\"), { x: i, y: i, width: iw, height: ih, rx, ry: rx, ...attrs });\n }\n\n // --- interactions --------------------------------------------------------\n\n private drawInteraction(visuals: SVGElement, el: TtInteraction): SVGElement {\n const spec = INTERACTION_MODE_SPECS[el.mode] ?? INTERACTION_MODE_SPECS.collaboration;\n const w = Math.max(el.width, 1);\n const h = Math.max(el.height, 1);\n const sw = 2;\n const i = sw / 2;\n const common: Attrs = {\n fill: el.fill ?? spec.fill,\n \"fill-opacity\": spec.opacity,\n stroke: el.stroke ?? spec.stroke,\n \"stroke-width\": sw,\n \"stroke-dasharray\": dashArray(spec.strokeStyle, sw) || \"6 4\",\n \"stroke-linejoin\": \"round\",\n };\n\n let glyph: SVGElement;\n if (spec.shape === \"circle\") {\n glyph = svgAttr(svgCreate(\"ellipse\"), {\n cx: w / 2,\n cy: h / 2,\n rx: (w - sw) / 2,\n ry: (h - sw) / 2,\n ...common,\n });\n } else if (spec.shape === \"triangle\") {\n // Point up — the tip indicates the direction the service is provided.\n const pts = `${w / 2},${i} ${w - i},${h - i} ${i},${h - i}`;\n glyph = svgAttr(svgCreate(\"polygon\"), { points: pts, ...common });\n } else {\n const skew = Math.min(w * 0.26, h * 0.85);\n const pts = `${i + skew},${i} ${w - i},${i} ${w - i - skew},${h - i} ${i},${h - i}`;\n glyph = svgAttr(svgCreate(\"polygon\"), { points: pts, ...common });\n }\n svgAppend(visuals, glyph);\n\n if (el.ttLabel) {\n this.appendLabel(visuals, el.ttLabel, w, h, {\n \"font-size\": FONT.small,\n \"font-weight\": \"600\",\n });\n }\n return glyph;\n }\n\n // --- flow of change ------------------------------------------------------\n\n private drawFlow(visuals: SVGElement, el: TtFlow): SVGElement {\n const w = Math.max(el.width, 1);\n const h = Math.max(el.height, 1);\n const sw = FLOW_SPEC.strokeWidth;\n const i = sw / 2;\n const head = Math.min(w * 0.16, h * 1.1);\n const shaft = h * 0.5;\n const top = (h - shaft) / 2;\n const bot = top + shaft;\n const pts = [\n [i, top],\n [w - head, top],\n [w - head, i],\n [w - i, h / 2],\n [w - head, h - i],\n [w - head, bot],\n [i, bot],\n ]\n .map((p) => p.join(\",\"))\n .join(\" \");\n const arrow = svgAttr(svgCreate(\"polygon\"), {\n points: pts,\n fill: \"none\",\n stroke: FLOW_SPEC.stroke,\n \"stroke-width\": sw,\n \"stroke-dasharray\": dashArray(FLOW_SPEC.strokeStyle, sw) || \"6 4\",\n \"stroke-linejoin\": \"round\",\n });\n svgAppend(visuals, arrow);\n if (el.ttLabel) {\n this.appendLabel(visuals, el.ttLabel, w - head, h, {\n \"font-size\": FONT.small,\n \"font-weight\": \"650\",\n \"letter-spacing\": \"0.06em\",\n fill: INK_SOFT,\n });\n }\n return arrow;\n }\n\n // --- shared label rendering (wrapped, centred, no halo) ------------------\n\n private appendLabel(visuals: SVGElement, text: string, w: number, h: number, attrs: Attrs): void {\n const fontSize =\n typeof attrs[\"font-size\"] === \"number\" ? (attrs[\"font-size\"] as number) : FONT.label;\n const lines = wrapLabel(text, w - 20, fontSize);\n const lineHeight = fontSize * 1.2;\n const startY = h / 2 - ((lines.length - 1) * lineHeight) / 2;\n lines.forEach((ln, idx) => {\n const t = svgAttr(svgCreate(\"text\"), {\n x: w / 2,\n y: startY + idx * lineHeight,\n \"font-family\": FONT.family,\n \"font-size\": fontSize,\n fill: INK,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n ...attrs,\n });\n t.textContent = ln;\n svgAppend(visuals, t);\n });\n }\n}\n\n// --- helpers ---------------------------------------------------------------\n\nfunction octagon(i: number, w: number, h: number, c: number): string {\n return [\n [i + c, i],\n [i + w - c, i],\n [i + w, i + c],\n [i + w, i + h - c],\n [i + w - c, i + h],\n [i + c, i + h],\n [i, i + h - c],\n [i, i + c],\n ]\n .map((p) => p.join(\",\"))\n .join(\" \");\n}\n\n/** Greedy word-wrap into lines that roughly fit `maxWidth` at the font size. */\nfunction wrapLabel(text: string, maxWidth: number, fontSize: number): string[] {\n const maxChars = Math.max(4, Math.floor(maxWidth / (fontSize * 0.58)));\n const words = text.split(/\\s+/).filter(Boolean);\n if (words.length === 0) return [];\n const lines: string[] = [];\n let cur = \"\";\n for (const word of words) {\n const candidate = cur ? `${cur} ${word}` : word;\n if (candidate.length > maxChars && cur) {\n lines.push(cur);\n cur = word;\n } else {\n cur = candidate;\n }\n }\n if (cur) lines.push(cur);\n return lines;\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TeamTopologiesRenderer from \"./TeamTopologiesRenderer.js\";\n\n/** SVG rendering of all Team Topologies element types (BaseRenderer, priority 1500). */\nexport const ttDrawModule: ModuleDeclaration = {\n __init__: [\"ttRenderer\"],\n ttRenderer: [\"type\", TeamTopologiesRenderer],\n};\n\nexport { default as TeamTopologiesRenderer } from \"./TeamTopologiesRenderer.js\";\n","/**\n * Bridges the canonical `TtDocument` into the diagram-js canvas. Everything is a\n * shape; stacking order (back → front) is flows, teams, interactions, so the\n * translucent interaction glyphs read on top of the team boxes they overlay.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type ElementFactory from \"diagram-js/lib/core/ElementFactory\";\nimport type ElementRegistry from \"diagram-js/lib/core/ElementRegistry\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport type { Root } from \"diagram-js/lib/model/Types\";\nimport type { TtDocument } from \"@miragon/team-topologies-schema-model\";\nimport type TtElementFactory from \"../model/TtElementFactory.js\";\nimport { ROOT_ID, type ImportWarning, type RootBusinessObject } from \"./types.js\";\n\ntype RootWithMeta = Root & { businessObject?: RootBusinessObject };\n\nexport default class TtImporter {\n static $inject = [\"canvas\", \"elementFactory\", \"ttElementFactory\", \"eventBus\", \"elementRegistry\"];\n\n constructor(\n private readonly canvas: Canvas,\n private readonly elementFactory: ElementFactory,\n private readonly factory: TtElementFactory,\n private readonly eventBus: EventBus,\n private readonly elementRegistry: ElementRegistry,\n ) {}\n\n import(doc: TtDocument): ImportWarning[] {\n const warnings: ImportWarning[] = [];\n this.eventBus.fire(\"import.render.start\", { document: doc });\n\n let existing: RootWithMeta | undefined;\n try {\n existing = this.canvas.getRootElement() as RootWithMeta;\n } catch {\n existing = undefined;\n }\n let root: RootWithMeta;\n if (existing && existing.id === ROOT_ID) {\n root = existing;\n } else {\n root = this.elementFactory.createRoot({ id: ROOT_ID }) as RootWithMeta;\n this.canvas.setRootElement(root);\n }\n root.businessObject = { title: doc.title };\n\n // Back → front: flows, teams, interactions.\n for (const flow of doc.flows) {\n this.canvas.addShape(this.factory.createFlow(flow), root);\n }\n for (const node of doc.nodes) {\n this.canvas.addShape(this.factory.createTeam(node), root);\n }\n for (const interaction of doc.interactions) {\n this.canvas.addShape(this.factory.createInteraction(interaction), root);\n }\n\n this.eventBus.fire(\"import.render.done\", { warnings });\n return warnings;\n }\n\n /** Removes every element (for re-import). */\n clear(): void {\n for (const el of [...this.elementRegistry.getAll()]) {\n if (el.id === ROOT_ID) continue;\n try {\n this.canvas.removeShape(el.id);\n } catch {\n // already removed — ignore\n }\n }\n }\n}\n","/**\n * Rebuilds a canonical `TtDocument` from the diagram-js runtime model. Position\n * and size truth are the live `x/y/width/height`; editable fields (label, type,\n * mode, colours) are read from the runtime properties.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type ElementRegistry from \"diagram-js/lib/core/ElementRegistry\";\nimport type { Root } from \"diagram-js/lib/model/Types\";\nimport { DOCUMENT_VERSION } from \"@miragon/team-topologies-schema-model\";\nimport type {\n FlowShape,\n InteractionShape,\n TeamNode,\n TtDocument,\n} from \"@miragon/team-topologies-schema-model\";\nimport { isTtFlow, isTtInteraction, isTtTeam } from \"../model/di-types.js\";\nimport { ROOT_ID, type RootBusinessObject } from \"./types.js\";\n\nexport default class TtExporter {\n static $inject = [\"elementRegistry\", \"canvas\"];\n\n constructor(\n private readonly elementRegistry: ElementRegistry,\n private readonly canvas: Canvas,\n ) {}\n\n export(): TtDocument {\n let meta: RootBusinessObject | undefined;\n try {\n const root = this.canvas.getRootElement() as Root & {\n businessObject?: RootBusinessObject;\n };\n meta = root.businessObject;\n } catch {\n meta = undefined;\n }\n\n const nodes: TeamNode[] = [];\n const interactions: InteractionShape[] = [];\n const flows: FlowShape[] = [];\n\n for (const el of this.elementRegistry.getAll()) {\n if (el.id === ROOT_ID) continue;\n const geom = el as unknown as { x: number; y: number; width: number; height: number };\n const position = { x: geom.x, y: geom.y };\n const size = { width: geom.width, height: geom.height };\n\n if (isTtTeam(el)) {\n nodes.push({\n id: el.id,\n type: el.teamType,\n label: el.ttLabel ?? \"\",\n position,\n size,\n ...(el.description ? { description: el.description } : {}),\n ...(el.fill ? { fill: el.fill } : {}),\n ...(el.stroke ? { stroke: el.stroke } : {}),\n });\n } else if (isTtInteraction(el)) {\n interactions.push({\n id: el.id,\n mode: el.mode,\n position,\n size,\n ...(el.ttLabel ? { label: el.ttLabel } : {}),\n ...(el.fill ? { fill: el.fill } : {}),\n ...(el.stroke ? { stroke: el.stroke } : {}),\n });\n } else if (isTtFlow(el)) {\n flows.push({\n id: el.id,\n position,\n size,\n ...(el.ttLabel ? { label: el.ttLabel } : {}),\n });\n }\n }\n\n return {\n version: DOCUMENT_VERSION,\n title: meta?.title ?? \"Untitled team topology\",\n nodes,\n interactions,\n flows,\n };\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtImporter from \"./TtImporter.js\";\nimport TtExporter from \"./TtExporter.js\";\n\n/** Document <-> diagram-js bridge (import / export). */\nexport const ioModule: ModuleDeclaration = {\n ttImporter: [\"type\", TtImporter],\n ttExporter: [\"type\", TtExporter],\n};\n\nexport { default as TtImporter } from \"./TtImporter.js\";\nexport { default as TtExporter } from \"./TtExporter.js\";\nexport { saveSVG } from \"./saveSvg.js\";\nexport { ROOT_ID } from \"./types.js\";\nexport type { ImportWarning, RootBusinessObject } from \"./types.js\";\n","import type { ModuleDeclaration } from \"didi\";\nimport { TtBaseViewer } from \"./TtBaseViewer.js\";\nimport { ttModelModule } from \"./model/index.js\";\nimport { ttDrawModule } from \"./draw/index.js\";\nimport { ioModule } from \"./io/index.js\";\n\n/** Read-only renderer: draws a Team Topologies diagram with no interaction. */\nexport class Viewer extends TtBaseViewer {\n protected _getModules(): ModuleDeclaration[] {\n return [ttModelModule, ttDrawModule, ioModule];\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport SelectionModule from \"diagram-js/lib/features/selection\";\nimport ZoomScrollModule from \"diagram-js/lib/navigation/zoomscroll\";\nimport MoveCanvasModule from \"diagram-js/lib/navigation/movecanvas\";\nimport { Viewer } from \"./Viewer.js\";\n\n/** Read-only + navigation: zoom (scroll), pan (drag), selection. */\nexport class NavigatedViewer extends Viewer {\n protected override _getModules(): ModuleDeclaration[] {\n return [...super._getModules(), SelectionModule, ZoomScrollModule, MoveCanvasModule];\n }\n}\n","/**\n * Generic, undo-able command that sets arbitrary Team Topologies properties\n * (ttLabel, teamType, mode, fill, stroke, description). Returns the changed\n * element so the CommandStack fires `elements.changed` → re-render.\n */\n\nimport type { ElementLike } from \"diagram-js/lib/core/Types\";\nimport type CommandHandler from \"diagram-js/lib/command/CommandHandler\";\n\nexport interface UpdatePropertiesContext {\n element: ElementLike & Record<string, unknown>;\n properties: Record<string, unknown>;\n /** set internally by the handler (for revert). */\n oldProperties?: Record<string, unknown>;\n}\n\nfunction setOrDelete(obj: Record<string, unknown>, key: string, value: unknown): void {\n if (value === undefined) delete obj[key];\n else obj[key] = value;\n}\n\nexport default class UpdatePropertiesHandler implements CommandHandler {\n execute(context: UpdatePropertiesContext): ElementLike[] {\n const { element, properties } = context;\n const target = element as unknown as Record<string, unknown>;\n const old: Record<string, unknown> = {};\n for (const key of Object.keys(properties)) {\n old[key] = target[key];\n setOrDelete(target, key, properties[key]);\n }\n context.oldProperties = old;\n return [element];\n }\n\n revert(context: UpdatePropertiesContext): ElementLike[] {\n const { element, oldProperties } = context;\n const target = element as unknown as Record<string, unknown>;\n if (oldProperties) {\n for (const key of Object.keys(oldProperties)) setOrDelete(target, key, oldProperties[key]);\n }\n return [element];\n }\n}\n","/**\n * High-level Team Topologies mutations that go through the command stack\n * (undo/redo). Registers the generic property command handler.\n */\n\nimport type CommandStack from \"diagram-js/lib/command/CommandStack\";\nimport type { InteractionMode, TeamType } from \"@miragon/team-topologies-schema-model\";\nimport type { TtElement, TtInteraction, TtTeam } from \"../model/di-types.js\";\nimport UpdatePropertiesHandler from \"./cmd/UpdatePropertiesHandler.js\";\n\nconst UPDATE_PROPERTIES = \"element.updateProperties\";\n\nexport default class TtModeling {\n static $inject = [\"commandStack\"];\n\n constructor(private readonly commandStack: CommandStack) {\n commandStack.registerHandler(UPDATE_PROPERTIES, UpdatePropertiesHandler);\n }\n\n updateProperties(element: TtElement, properties: Record<string, unknown>): void {\n this.commandStack.execute(UPDATE_PROPERTIES, { element, properties });\n }\n\n /** Rename / relabel any element. */\n updateLabel(element: TtElement, label: string): void {\n this.updateProperties(element, { ttLabel: label || undefined });\n }\n\n setTeamType(team: TtTeam, teamType: TeamType): void {\n this.updateProperties(team, { teamType });\n }\n\n setInteractionMode(interaction: TtInteraction, mode: InteractionMode): void {\n this.updateProperties(interaction, { mode });\n }\n\n /** Set or clear per-element colour overrides (`undefined` reverts to default). */\n setColors(\n element: TtTeam | TtInteraction,\n fill: string | undefined,\n stroke: string | undefined,\n ): void {\n this.updateProperties(element, { fill, stroke });\n }\n\n setDescription(team: TtTeam, description: string | undefined): void {\n this.updateProperties(team, { description });\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtModeling from \"./TtModeling.js\";\n\n/** High-level Team Topologies mutations + registration of the command handlers. */\nexport const ttModelingModule: ModuleDeclaration = {\n __init__: [\"ttModeling\"],\n ttModeling: [\"type\", TtModeling],\n};\n\nexport { default as TtModeling } from \"./TtModeling.js\";\n","/**\n * Allowed editing operations. Every Team Topologies element is a free, placed\n * shape — movable, creatable and resizable. There are no connections (the\n * official notation models interactions as overlapping shapes, not lines).\n */\n\nimport RuleProvider from \"diagram-js/lib/features/rules/RuleProvider\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\n\ninterface MoveContext {\n target?: { parent?: unknown } | null;\n}\n\nexport default class TtRules extends RuleProvider {\n static override $inject = [\"eventBus\"];\n\n constructor(eventBus: EventBus) {\n super(eventBus);\n }\n\n override init(): void {\n // By default diagram-js re-parents a dragged shape into whatever element it\n // is dropped on, so the two then move together as if glued. Team Topologies\n // shapes are independent and only overlap, so ignore (return `null`) any\n // element drop target — the shapes keep their root parent. Dropping on the\n // canvas (the root, which has no parent) still allows the move.\n this.addRule([\"shape.move\", \"elements.move\"], (context: MoveContext) =>\n context.target && context.target.parent ? null : true,\n );\n this.addRule(\"shape.create\", () => true);\n this.addRule(\"shape.resize\", () => true);\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport RulesModule from \"diagram-js/lib/features/rules\";\nimport TtRules from \"./TtRules.js\";\n\n/** Team Topologies editing rules (connect, move, create, resize). */\nexport const ttRulesModule: ModuleDeclaration = {\n __depends__: [RulesModule],\n __init__: [\"ttRules\"],\n ttRules: [\"type\", TtRules],\n};\n\nexport { default as TtRules } from \"./TtRules.js\";\n","/**\n * Keeps the diagram flat: Team Topologies shapes overlap but never nest.\n *\n * diagram-js parents a newly created shape to whatever element it is dropped on\n * (`context.parent` defaults to the drop target). Interaction glyphs are meant\n * to be placed *over* the teams they relate to, so the natural workflow would\n * otherwise nest the interaction inside a team — gluing it so it moves along\n * with the team. Force every created shape onto the diagram root instead.\n *\n * Re-parenting on *move* is prevented separately in TtRules.\n */\n\nimport CommandInterceptor from \"diagram-js/lib/command/CommandInterceptor\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\n\nexport default class TtFlatModelBehavior extends CommandInterceptor {\n static override $inject = [\"eventBus\", \"canvas\"];\n\n constructor(eventBus: EventBus, canvas: Canvas) {\n super(eventBus);\n\n this.preExecute(\n [\"shape.create\", \"elements.create\"],\n (context: { parent?: unknown }) => {\n context.parent = canvas.getRootElement();\n },\n true,\n );\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtFlatModelBehavior from \"./TtFlatModelBehavior.js\";\n\n/** Editing behaviors that keep the Team Topologies model flat (no nesting). */\nexport const ttBehaviorsModule: ModuleDeclaration = {\n __init__: [\"ttFlatModelBehavior\"],\n ttFlatModelBehavior: [\"type\", TtFlatModelBehavior],\n};\n\nexport { default as TtFlatModelBehavior } from \"./TtFlatModelBehavior.js\";\n","/**\n * Tiny inline-SVG glyphs for the palette entries — the same shapes the canvas\n * draws (so the palette is a faithful preview of each team type / interaction\n * mode). Returned as HTML strings for diagram-js palette `html`.\n */\n\nimport {\n INTERACTION_MODE_SPECS,\n TEAM_TYPE_SPECS,\n dashArray,\n} from \"@miragon/team-topologies-schema-model\";\nimport type { InteractionMode, TeamType } from \"@miragon/team-topologies-schema-model\";\n\nfunction svg(inner: string): string {\n return `<svg class=\"tt-palette-svg\" width=\"24\" height=\"24\" viewBox=\"0 0 26 26\" aria-hidden=\"true\">${inner}</svg>`;\n}\n\nexport function teamIconSvg(type: TeamType): string {\n const s = TEAM_TYPE_SPECS[type];\n const dash = dashArray(s.strokeStyle, 1.5);\n const common =\n `fill=\"${s.fill}\" stroke=\"${s.stroke}\" stroke-width=\"1.5\"` +\n (dash ? ` stroke-dasharray=\"${dash}\"` : \"\");\n switch (s.shape) {\n case \"octagon\":\n return svg(`<polygon points=\"8,3 18,3 23,8 23,18 18,23 8,23 3,18 3,8\" ${common}/>`);\n case \"rounded-rect-vertical\":\n return svg(`<rect x=\"8\" y=\"3\" width=\"10\" height=\"20\" rx=\"4\" ${common}/>`);\n case \"rect\":\n return svg(`<rect x=\"3\" y=\"7\" width=\"20\" height=\"12\" rx=\"1.5\" ${common}/>`);\n default:\n return svg(`<rect x=\"3\" y=\"8\" width=\"20\" height=\"10\" rx=\"5\" ${common}/>`);\n }\n}\n\nexport function flowIconSvg(): string {\n return svg(\n `<g fill=\"none\" stroke=\"#6b6459\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-dasharray=\"3 2\">` +\n `<polygon points=\"3,9 16,9 16,5 23,13 16,21 16,17 3,17\"/></g>`,\n );\n}\n\nexport function interactionIconSvg(mode: InteractionMode): string {\n const s = INTERACTION_MODE_SPECS[mode];\n const dash = dashArray(s.strokeStyle, 1.5);\n const common =\n `fill=\"${s.fill}\" fill-opacity=\"${s.opacity}\" stroke=\"${s.stroke}\" stroke-width=\"1.5\"` +\n (dash ? ` stroke-dasharray=\"${dash}\"` : \"\");\n switch (s.shape) {\n case \"circle\":\n return svg(`<circle cx=\"13\" cy=\"13\" r=\"9\" ${common}/>`);\n case \"triangle\":\n return svg(`<polygon points=\"5,6 22,13 5,20\" ${common}/>`);\n default:\n return svg(`<polygon points=\"9,6 23,6 17,20 3,20\" ${common}/>`);\n }\n}\n","/**\n * The floating tool palette (styled top-centre, Excalidraw style). Every entry\n * is drag-to-create: the four team types, the three interaction-mode glyphs\n * (placed over team boundaries), and the flow-of-change arrow.\n */\n\nimport type Palette from \"diagram-js/lib/features/palette/Palette\";\nimport type Create from \"diagram-js/lib/features/create/Create\";\nimport type {\n PaletteEntries,\n default as PaletteProvider,\n} from \"diagram-js/lib/features/palette/PaletteProvider\";\nimport type { Element } from \"diagram-js/lib/model/Types\";\nimport {\n ALL_INTERACTION_SPECS,\n ALL_TEAM_SPECS,\n FLOW_SPEC,\n} from \"@miragon/team-topologies-schema-model\";\nimport { flowIconSvg, interactionIconSvg, teamIconSvg } from \"../draw/palette-icons.js\";\nimport type TtElementFactory from \"../model/TtElementFactory.js\";\n\nconst GROUP_TEAMS = \"tt-1-teams\";\nconst GROUP_MODES = \"tt-2-modes\";\nconst GROUP_FLOW = \"tt-3-flow\";\n\nfunction entryHtml(icon: string, title: string): string {\n return `<div class=\"entry tt-palette-entry\" draggable=\"true\" title=\"${title}\">${icon}</div>`;\n}\n\nexport default class TtPaletteProvider implements PaletteProvider {\n static $inject = [\"palette\", \"create\", \"ttElementFactory\"];\n\n constructor(\n palette: Palette,\n private readonly create: Create,\n private readonly factory: TtElementFactory,\n ) {\n palette.registerProvider(this);\n }\n\n getPaletteEntries(): PaletteEntries {\n const entries: PaletteEntries = {};\n\n for (const spec of ALL_TEAM_SPECS) {\n const start = (event: Event) =>\n this.create.start(\n event as MouseEvent,\n this.factory.createNewTeam(spec.type, spec.label) as unknown as Element,\n );\n entries[`team.${spec.type}`] = {\n group: GROUP_TEAMS,\n title: `${spec.label} team — ${spec.description}`,\n html: entryHtml(teamIconSvg(spec.type), `${spec.label} team — ${spec.description}`),\n action: { dragstart: start, click: start },\n };\n }\n\n for (const spec of ALL_INTERACTION_SPECS) {\n const start = (event: Event) =>\n this.create.start(\n event as MouseEvent,\n this.factory.createNewInteraction(spec.mode) as unknown as Element,\n );\n entries[`mode.${spec.mode}`] = {\n group: GROUP_MODES,\n title: `${spec.label} — ${spec.description} (place over the teams it relates to)`,\n html: entryHtml(interactionIconSvg(spec.mode), `${spec.label} — ${spec.description}`),\n action: { dragstart: start, click: start },\n };\n }\n\n const startFlow = (event: Event) =>\n this.create.start(event as MouseEvent, this.factory.createNewFlow() as unknown as Element);\n entries[\"flow\"] = {\n group: GROUP_FLOW,\n title: `${FLOW_SPEC.label} — the implied left-to-right flow`,\n html: entryHtml(flowIconSvg(), FLOW_SPEC.label),\n action: { dragstart: startFlow, click: startFlow },\n };\n\n return entries;\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport PaletteModule from \"diagram-js/lib/features/palette\";\nimport CreateModule from \"diagram-js/lib/features/create\";\nimport TtPaletteProvider from \"./TtPaletteProvider.js\";\n\n/** Tool palette (drag-to-create teams, pick interaction mode). */\nexport const ttPaletteModule: ModuleDeclaration = {\n __depends__: [PaletteModule, CreateModule],\n __init__: [\"ttPaletteProvider\"],\n ttPaletteProvider: [\"type\", TtPaletteProvider],\n};\n\nexport { default as TtPaletteProvider } from \"./TtPaletteProvider.js\";\n","/**\n * A handful of Material-style icon paths (Apache-2.0) used by the context pad,\n * exposed as HTML markup. Reusable by host chrome too.\n */\n\nexport const ICON_ARROW_FORWARD = \"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\";\nexport const ICON_EDIT =\n \"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.9959.9959 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\";\nexport const ICON_DELETE =\n \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\";\nexport const ICON_SWAP = \"M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z\";\n\nexport function iconMarkup(path: string, size = 18): string {\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"${path}\"/></svg>`;\n}\n","/**\n * Context-pad actions: rename and delete. Every Team Topologies element is a\n * free shape, so the actions are uniform (no connect — interactions are placed,\n * not wired).\n */\n\nimport type ContextPad from \"diagram-js/lib/features/context-pad/ContextPad\";\nimport type Modeling from \"diagram-js/lib/features/modeling/Modeling\";\nimport type {\n ContextPadEntries,\n default as ContextPadProvider,\n} from \"diagram-js/lib/features/context-pad/ContextPadProvider\";\nimport type { Element } from \"diagram-js/lib/model/Types\";\nimport { isTtElement } from \"../model/di-types.js\";\nimport type TtLabelEditing from \"../label-editing/TtLabelEditing.js\";\nimport { ICON_DELETE, ICON_EDIT, iconMarkup } from \"../draw/icons.js\";\n\nfunction cpHtml(path: string, title: string): string {\n return `<div class=\"entry tt-cp-entry\" title=\"${title}\">${iconMarkup(path)}</div>`;\n}\n\nexport default class TtContextPadProvider implements ContextPadProvider {\n static $inject = [\"contextPad\", \"modeling\", \"ttLabelEditing\"];\n\n constructor(\n contextPad: ContextPad,\n private readonly modeling: Modeling,\n private readonly labelEditing: TtLabelEditing,\n ) {\n contextPad.registerProvider(this);\n }\n\n getContextPadEntries(element: Element): ContextPadEntries {\n if (!isTtElement(element)) return {};\n return {\n \"edit-label\": {\n group: \"edit\",\n title: \"Rename\",\n html: cpHtml(ICON_EDIT, \"Rename\"),\n action: { click: () => this.labelEditing.activate(element) },\n },\n delete: {\n group: \"edit\",\n title: \"Delete\",\n html: cpHtml(ICON_DELETE, \"Delete\"),\n action: { click: () => this.modeling.removeElements([element]) },\n },\n };\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport ContextPadModule from \"diagram-js/lib/features/context-pad\";\nimport TtContextPadProvider from \"./TtContextPadProvider.js\";\n\n/** Per-element context actions (rename, delete). */\nexport const ttContextPadModule: ModuleDeclaration = {\n __depends__: [ContextPadModule],\n __init__: [\"ttContextPadProvider\"],\n ttContextPadProvider: [\"type\", TtContextPadProvider],\n};\n\nexport { default as TtContextPadProvider } from \"./TtContextPadProvider.js\";\n","/**\n * Inline label editing as an HTML overlay (an <input> centred over the element).\n * Commit goes through `ttModeling.updateLabel` → command stack (undoable).\n * Double-click any element (team / interaction / flow) to (re)label it.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport { isTtElement, type TtElement } from \"../model/di-types.js\";\nimport type TtModeling from \"../modeling/TtModeling.js\";\n\ninterface ActiveEdit {\n commit: () => void;\n cleanup: () => void;\n}\n\nexport default class TtLabelEditing {\n static $inject = [\"eventBus\", \"canvas\", \"ttModeling\"];\n\n private active: ActiveEdit | null = null;\n\n constructor(\n eventBus: EventBus,\n private readonly canvas: Canvas,\n private readonly modeling: TtModeling,\n ) {\n eventBus.on(\"element.dblclick\", (event: { element?: unknown }) => {\n if (isTtElement(event.element)) this.activate(event.element);\n });\n // Any click/drag/pan outside the input commits (only Escape discards).\n eventBus.on([\"element.mousedown\", \"drag.init\", \"canvas.viewbox.changing\"], () =>\n this.active?.commit(),\n );\n }\n\n activate(element: TtElement): void {\n this.active?.commit();\n\n const container = this.canvas.getContainer();\n const scale = this.canvas.zoom();\n const vb = this.canvas.viewbox();\n const cx = element.x + element.width / 2;\n const cy = element.y + element.height / 2;\n const width = 170;\n const left = (cx - vb.x) * scale - width / 2;\n const top = (cy - vb.y) * scale - 14;\n\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.className = \"tt-label-input\";\n input.value = element.ttLabel ?? \"\";\n input.style.position = \"absolute\";\n input.style.left = `${left}px`;\n input.style.top = `${top}px`;\n input.style.width = `${width}px`;\n container.appendChild(input);\n input.focus();\n input.select();\n\n let done = false;\n const cleanup = () => {\n if (done) return;\n done = true;\n input.removeEventListener(\"keydown\", onKey);\n input.removeEventListener(\"blur\", onBlur);\n input.remove();\n this.active = null;\n };\n const commit = () => {\n if (done) return;\n const value = input.value.trim();\n const changed = value !== (element.ttLabel ?? \"\");\n cleanup();\n if (changed) this.modeling.updateLabel(element, value);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n cleanup();\n }\n };\n const onBlur = () => commit();\n input.addEventListener(\"keydown\", onKey);\n input.addEventListener(\"blur\", onBlur);\n\n this.active = { commit, cleanup };\n }\n\n cancel(): void {\n this.active?.cleanup();\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtLabelEditing from \"./TtLabelEditing.js\";\n\n/** Inline label editing (double-click a team to rename). */\nexport const ttLabelEditingModule: ModuleDeclaration = {\n __init__: [\"ttLabelEditing\"],\n ttLabelEditing: [\"type\", TtLabelEditing],\n};\n\nexport { default as TtLabelEditing } from \"./TtLabelEditing.js\";\n","/**\n * Keyboard shortcuts: undo / redo / delete-selection. Bound to the document so\n * they work without first clicking (focusing) the canvas — typing inside form\n * fields is left untouched. No container `tabindex`, so the canvas never shows a\n * focus ring.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type CommandStack from \"diagram-js/lib/command/CommandStack\";\nimport type Selection from \"diagram-js/lib/features/selection/Selection\";\nimport type Modeling from \"diagram-js/lib/features/modeling/Modeling\";\nimport type { Element } from \"diagram-js/lib/model/Types\";\n\nfunction isTypingTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null;\n if (!el) return false;\n return (\n el.tagName === \"INPUT\" ||\n el.tagName === \"TEXTAREA\" ||\n el.tagName === \"SELECT\" ||\n el.isContentEditable\n );\n}\n\nexport default class TtKeyboard {\n static $inject = [\"canvas\", \"commandStack\", \"selection\", \"modeling\"];\n\n constructor(\n canvas: Canvas,\n commandStack: CommandStack,\n selection: Selection,\n modeling: Modeling,\n ) {\n const doc = canvas.getContainer().ownerDocument ?? document;\n\n doc.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (isTypingTarget(e.target)) return;\n const cmd = e.ctrlKey || e.metaKey;\n const key = e.key.toLowerCase();\n\n if (cmd && key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n if (commandStack.canUndo()) commandStack.undo();\n } else if ((cmd && key === \"z\" && e.shiftKey) || (cmd && key === \"y\")) {\n e.preventDefault();\n if (commandStack.canRedo()) commandStack.redo();\n } else if (key === \"delete\" || key === \"backspace\") {\n const sel = selection.get() as Element[];\n if (sel.length) {\n e.preventDefault();\n modeling.removeElements([...sel]);\n }\n }\n });\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtKeyboard from \"./TtKeyboard.js\";\n\n/** Undo/redo + delete-selection on the canvas container. */\nexport const ttKeyboardModule: ModuleDeclaration = {\n __init__: [\"ttKeyboard\"],\n ttKeyboard: [\"type\", TtKeyboard],\n};\n\nexport { default as TtKeyboard } from \"./TtKeyboard.js\";\n","/**\n * Enforces a fixed stacking order regardless of creation order, by reordering\n * the element graphics within the canvas layer. Back → front:\n *\n * flow < stream-aligned / platform < complicated-subsystem < enabling < interactions\n *\n * So interaction glyphs always read on top; enabling teams sit above the\n * complicated-subsystem teams, which in turn sit above the stream-aligned /\n * platform base teams they overlap.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type ElementRegistry from \"diagram-js/lib/core/ElementRegistry\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport {\n isTtElement,\n isTtFlow,\n isTtInteraction,\n isTtTeam,\n type TtElement,\n} from \"../model/di-types.js\";\n\n/** Lower = further back. */\nfunction tier(el: TtElement): number {\n if (isTtFlow(el)) return 0;\n if (isTtTeam(el)) {\n if (el.teamType === \"enabling\") return 3;\n if (el.teamType === \"complicated-subsystem\") return 2;\n return 1; // stream-aligned, platform\n }\n if (isTtInteraction(el)) return 4;\n return 1;\n}\n\nexport default class TtZOrder {\n static $inject = [\"eventBus\", \"canvas\", \"elementRegistry\"];\n\n private importing = false;\n\n constructor(\n eventBus: EventBus,\n private readonly canvas: Canvas,\n private readonly elementRegistry: ElementRegistry,\n ) {\n eventBus.on(\"import.render.start\", () => {\n this.importing = true;\n });\n eventBus.on(\"import.render.done\", () => {\n this.importing = false;\n this.reorder();\n });\n // Covers create + team-type changes (and harmlessly re-runs on move/resize).\n eventBus.on(\"commandStack.changed\", () => {\n if (!this.importing) this.reorder();\n });\n }\n\n /** Re-append each element's graphics group in ascending tier order (back → front). */\n reorder(): void {\n const ordered = (this.elementRegistry.getAll().filter(isTtElement) as TtElement[]).sort(\n (a, b) => tier(a) - tier(b),\n );\n for (const el of ordered) {\n const gfx = this.canvas.getGraphics(el) as SVGElement | undefined;\n const wrapper = gfx?.parentNode as (Node & ChildNode) | null;\n const layer = wrapper?.parentNode as (Node & { appendChild(n: Node): Node }) | null;\n if (wrapper && layer) layer.appendChild(wrapper);\n }\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtZOrder from \"./TtZOrder.js\";\n\n/** Keeps the fixed stacking order (interactions on top, base teams at the back). */\nexport const ttZOrderModule: ModuleDeclaration = {\n __init__: [\"ttZOrder\"],\n ttZOrder: [\"type\", TtZOrder],\n};\n\nexport { default as TtZOrder } from \"./TtZOrder.js\";\n","import type { ModuleDeclaration } from \"didi\";\nimport type CommandStack from \"diagram-js/lib/command/CommandStack\";\n\nimport ModelingModule from \"diagram-js/lib/features/modeling\";\nimport MoveModule from \"diagram-js/lib/features/move\";\nimport OutlineModule from \"diagram-js/lib/features/outline\";\nimport ResizeModule from \"diagram-js/lib/features/resize\";\n\nimport { NavigatedViewer } from \"./NavigatedViewer.js\";\nimport { ttModelingModule } from \"./modeling/index.js\";\nimport { ttRulesModule } from \"./rules/index.js\";\nimport { ttBehaviorsModule } from \"./behaviors/index.js\";\nimport { ttPaletteModule } from \"./palette/index.js\";\nimport { ttContextPadModule } from \"./context-pad/index.js\";\nimport { ttLabelEditingModule } from \"./label-editing/index.js\";\nimport { ttKeyboardModule } from \"./keyboard/index.js\";\nimport { ttZOrderModule } from \"./zorder/index.js\";\n\n/**\n * Full Team Topologies editor: palette/create, move, resize, connect with\n * rules, context pad, inline label editing, undo/redo.\n */\nexport class Modeler extends NavigatedViewer {\n protected override _getModules(): ModuleDeclaration[] {\n return [\n ...super._getModules(),\n // diagram-js stock\n ModelingModule,\n MoveModule,\n OutlineModule,\n ResizeModule,\n // Team Topologies editor\n ttModelingModule,\n ttRulesModule,\n ttBehaviorsModule,\n ttPaletteModule,\n ttContextPadModule,\n ttLabelEditingModule,\n ttKeyboardModule,\n ttZOrderModule,\n ];\n }\n\n undo(): void {\n this.get<CommandStack>(\"commandStack\").undo();\n }\n\n redo(): void {\n this.get<CommandStack>(\"commandStack\").redo();\n }\n\n canUndo(): boolean {\n return this.get<CommandStack>(\"commandStack\").canUndo();\n }\n\n canRedo(): boolean {\n return this.get<CommandStack>(\"commandStack\").canRedo();\n }\n}\n"],"names":["kindOf","el","isTtElement","isTtTeam","isTtInteraction","isTtFlow","MARGIN","saveSVG","canvas","elementRegistry","source","minX","minY","maxX","maxY","s","x","y","width","height","clone","viewport","ROOT_ID","sizeToCss","value","TtBaseViewer","options","container","modules","Diagram","name","event","callback","priority","doc","diagram","eventBus","importer","warnings","partial","root","current","topInset","pad","registry","e","rect","W","H","cw","ch","target","TtElementFactory","elementFactory","node","shape","type","label","spec","TEAM_TYPE_SPECS","newId","mode","INTERACTION_MODE_SPECS","FLOW_SPEC","ttModelModule","TT_RENDER_PRIORITY","INK","INK_SOFT","FONT","TeamTopologiesRenderer","BaseRenderer","element","visuals","svgAttr","svgCreate","svgAppend","team","w","h","sw","dash","dashArray","outline","kind","attrs","i","iw","ih","c","octagon","rx","common","glyph","pts","skew","head","shaft","top","bot","p","arrow","text","fontSize","lines","wrapLabel","lineHeight","startY","ln","idx","t","maxWidth","maxChars","words","cur","word","candidate","ttDrawModule","TtImporter","factory","existing","flow","interaction","TtExporter","meta","nodes","interactions","flows","geom","position","size","DOCUMENT_VERSION","ioModule","Viewer","NavigatedViewer","SelectionModule","ZoomScrollModule","MoveCanvasModule","setOrDelete","obj","key","UpdatePropertiesHandler","context","properties","old","oldProperties","UPDATE_PROPERTIES","TtModeling","commandStack","teamType","fill","stroke","description","ttModelingModule","TtRules","RuleProvider","ttRulesModule","RulesModule","TtFlatModelBehavior","CommandInterceptor","ttBehaviorsModule","svg","inner","teamIconSvg","flowIconSvg","interactionIconSvg","GROUP_TEAMS","GROUP_MODES","GROUP_FLOW","entryHtml","icon","title","TtPaletteProvider","palette","create","entries","ALL_TEAM_SPECS","start","ALL_INTERACTION_SPECS","startFlow","ttPaletteModule","PaletteModule","CreateModule","ICON_EDIT","ICON_DELETE","iconMarkup","path","cpHtml","TtContextPadProvider","contextPad","modeling","labelEditing","ttContextPadModule","ContextPadModule","TtLabelEditing","scale","vb","cx","cy","left","input","done","cleanup","onKey","onBlur","commit","changed","ttLabelEditingModule","isTypingTarget","TtKeyboard","selection","cmd","sel","ttKeyboardModule","tier","TtZOrder","ordered","a","b","wrapper","layer","ttZOrderModule","Modeler","ModelingModule","MoveModule","OutlineModule","ResizeModule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/model/di-types.ts","../src/io/saveSvg.ts","../src/io/types.ts","../src/TtBaseViewer.ts","../src/model/TtElementFactory.ts","../src/model/index.ts","../src/draw/styles.ts","../src/draw/TeamTopologiesRenderer.ts","../src/draw/index.ts","../src/io/TtImporter.ts","../src/io/TtExporter.ts","../src/io/index.ts","../src/Viewer.ts","../src/NavigatedViewer.ts","../src/modeling/cmd/UpdatePropertiesHandler.ts","../src/modeling/TtModeling.ts","../src/modeling/index.ts","../src/rules/TtRules.ts","../src/rules/index.ts","../src/behaviors/TtFlatModelBehavior.ts","../src/behaviors/index.ts","../src/draw/palette-icons.ts","../src/palette/TtPaletteProvider.ts","../src/palette/index.ts","../src/draw/icons.ts","../src/context-pad/TtContextPadProvider.ts","../src/context-pad/index.ts","../src/label-editing/TtLabelEditing.ts","../src/label-editing/index.ts","../src/keyboard/TtKeyboard.ts","../src/keyboard/index.ts","../src/zorder/TtZOrder.ts","../src/zorder/index.ts","../src/Modeler.ts"],"sourcesContent":["/**\n * diagram-js runtime model for the Team Topologies notation. Every element is a\n * placed, resizable SHAPE discriminated by `ttKind`:\n * - `team` — one of the four team types (label inside the box)\n * - `interaction` — a mode glyph (parallelogram / triangle / circle), 50%\n * transparent, overlaid on the boundary between teams\n * - `flow` — the \"flow of change\" arrow guide\n *\n * These runtime properties are the source of truth while editing; the exporter\n * rebuilds the canonical `TtDocument` from them.\n */\n\nimport type { Shape } from \"diagram-js/lib/model/Types\";\nimport type { InteractionMode, TeamType } from \"@miragon/team-topologies-schema-model\";\n\nexport type TtKind = \"team\" | \"interaction\" | \"flow\";\n\nexport interface TtTeam extends Shape {\n ttKind: \"team\";\n teamType: TeamType;\n /** Display name (separate from diagram-js `label`). */\n ttLabel?: string;\n description?: string;\n fill?: string;\n stroke?: string;\n}\n\nexport interface TtInteraction extends Shape {\n ttKind: \"interaction\";\n mode: InteractionMode;\n ttLabel?: string;\n fill?: string;\n stroke?: string;\n}\n\nexport interface TtFlow extends Shape {\n ttKind: \"flow\";\n ttLabel?: string;\n}\n\nexport type TtElement = TtTeam | TtInteraction | TtFlow;\n\nfunction kindOf(el: unknown): string | undefined {\n return typeof el === \"object\" && el !== null\n ? ((el as { ttKind?: unknown }).ttKind as string | undefined)\n : undefined;\n}\n\nexport function isTtElement(el: unknown): el is TtElement {\n return typeof kindOf(el) === \"string\";\n}\n\nexport function isTtTeam(el: unknown): el is TtTeam {\n return kindOf(el) === \"team\";\n}\n\nexport function isTtInteraction(el: unknown): el is TtInteraction {\n return kindOf(el) === \"interaction\";\n}\n\nexport function isTtFlow(el: unknown): el is TtFlow {\n return kindOf(el) === \"flow\";\n}\n","/**\n * Serialises the current canvas into a standalone SVG (snapshot / export),\n * fitted to the content bounds and independent of the current zoom / scroll.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type ElementRegistry from \"diagram-js/lib/core/ElementRegistry\";\nimport { isTtElement } from \"../model/di-types.js\";\n\nconst MARGIN = 40;\n\nexport function saveSVG(canvas: Canvas, elementRegistry: ElementRegistry): { svg: string } {\n const container = canvas.getContainer();\n const source = container.querySelector(\"svg\");\n if (!source) throw new Error(\"No SVG found in the canvas container.\");\n\n // Content bounds from the team shapes (interactions sit between them).\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const el of elementRegistry.getAll()) {\n if (!isTtElement(el)) continue;\n const s = el as unknown as { x: number; y: number; width: number; height: number };\n minX = Math.min(minX, s.x);\n minY = Math.min(minY, s.y);\n maxX = Math.max(maxX, s.x + s.width);\n maxY = Math.max(maxY, s.y + s.height);\n }\n if (!Number.isFinite(minX)) {\n minX = 0;\n minY = 0;\n maxX = 100;\n maxY = 100;\n }\n\n const x = minX - MARGIN;\n const y = minY - MARGIN;\n const width = maxX - minX + MARGIN * 2;\n const height = maxY - minY + MARGIN * 2;\n\n const clone = source.cloneNode(true) as SVGSVGElement;\n clone.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n clone.setAttribute(\"viewBox\", `${x} ${y} ${width} ${height}`);\n clone.setAttribute(\"width\", String(Math.round(width)));\n clone.setAttribute(\"height\", String(Math.round(height)));\n\n // Neutralise pan/zoom: let the viewBox (above) drive the geometry.\n const viewport = clone.querySelector<SVGGElement>(\".viewport\");\n if (viewport) viewport.removeAttribute(\"transform\");\n\n const svg = new XMLSerializer().serializeToString(clone);\n return { svg: '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + svg };\n}\n","/** ID of the diagram-js root element holding the Team Topologies diagram. */\nexport const ROOT_ID = \"tt-root\";\n\nexport interface ImportWarning {\n readonly message: string;\n readonly elementId?: string;\n}\n\n/** Diagram-level metadata stashed on the root element. */\nexport interface RootBusinessObject {\n title: string;\n}\n","/**\n * Shared lifecycle & DI bootstrap for every Team Topologies viewer. Subclasses\n * only override `_getModules()`. The renderer\n * is framework-agnostic — mount it into any element (e.g. a VS Code webview).\n */\n\nimport Diagram from \"diagram-js/lib/Diagram\";\nimport type { ModuleDeclaration } from \"didi\";\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type ElementRegistry from \"diagram-js/lib/core/ElementRegistry\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport type { Root } from \"diagram-js/lib/model/Types\";\nimport type { TtDocument } from \"@miragon/team-topologies-schema-model\";\nimport { saveSVG } from \"./io/saveSvg.js\";\nimport type TtImporter from \"./io/TtImporter.js\";\nimport type TtExporter from \"./io/TtExporter.js\";\nimport { ROOT_ID, type ImportWarning, type RootBusinessObject } from \"./io/types.js\";\n\nexport interface TtViewerOptions {\n /** Host element. When absent, a detached <div> is created (attach later). */\n container?: HTMLElement;\n width?: number | string;\n height?: number | string;\n /** Appended to the module list (extension point). */\n additionalModules?: ModuleDeclaration[];\n}\n\nexport type EventCallback<T = unknown> = (event: T) => void;\n\ntype RootWithMeta = Root & { businessObject?: RootBusinessObject };\n\nfunction sizeToCss(value: number | string): string {\n return typeof value === \"number\" ? `${value}px` : value;\n}\n\nexport abstract class TtBaseViewer {\n protected abstract _getModules(): ModuleDeclaration[];\n\n private _diagram: Diagram | undefined;\n private readonly _container: HTMLElement;\n private readonly _options: TtViewerOptions;\n\n constructor(options: TtViewerOptions = {}) {\n this._options = options;\n this._container = this._createContainer(options);\n }\n\n private _createContainer(options: TtViewerOptions): HTMLElement {\n const container = options.container ?? document.createElement(\"div\");\n container.classList.add(\"tt-djs-container\");\n container.style.width = sizeToCss(options.width ?? \"100%\");\n container.style.height = sizeToCss(options.height ?? (options.container ? \"100%\" : \"600px\"));\n return container;\n }\n\n private _ensureDiagram(): Diagram {\n if (!this._diagram) {\n const modules = [...this._getModules(), ...(this._options.additionalModules ?? [])];\n this._diagram = new Diagram({ canvas: { container: this._container }, modules });\n }\n return this._diagram;\n }\n\n /** Resolve a diagram-js service from the didi injector. */\n get<T>(name: string): T {\n return this._ensureDiagram().get<T>(name);\n }\n\n on<T = unknown>(event: string, callback: EventCallback<T>, priority = 1000): void {\n this.get<EventBus>(\"eventBus\").on(event, priority, callback as EventCallback);\n }\n\n off(event: string, callback: EventCallback): void {\n this.get<EventBus>(\"eventBus\").off(event, callback);\n }\n\n /** Load a document into the canvas (replaces existing content). */\n importDocument(doc: TtDocument): { warnings: ImportWarning[] } {\n const diagram = this._ensureDiagram();\n const eventBus = diagram.get<EventBus>(\"eventBus\");\n const importer = diagram.get<TtImporter>(\"ttImporter\");\n importer.clear();\n const warnings = importer.import(doc);\n this._fit();\n eventBus.fire(\"import.done\", { warnings });\n return { warnings };\n }\n\n /** Current canvas state as a canonical document. */\n exportDocument(): TtDocument {\n return this.get<TtExporter>(\"ttExporter\").export();\n }\n\n /** Update diagram-level metadata (title / flow-of-change) on the root. */\n setMeta(partial: Partial<RootBusinessObject>): void {\n const canvas = this.get<Canvas>(\"canvas\");\n let root: RootWithMeta | undefined;\n try {\n root = canvas.getRootElement() as RootWithMeta;\n } catch {\n return;\n }\n if (!root || root.id !== ROOT_ID) return;\n const current = root.businessObject ?? { title: \"Untitled team topology\" };\n root.businessObject = { ...current, ...partial };\n }\n\n /** Read diagram-level metadata (title / flow-of-change) from the root. */\n getMeta(): RootBusinessObject | undefined {\n try {\n const root = this.get<Canvas>(\"canvas\").getRootElement() as RootWithMeta;\n return root.businessObject;\n } catch {\n return undefined;\n }\n }\n\n /** Standalone, self-contained SVG snapshot. */\n saveSVG(): { svg: string } {\n return saveSVG(this.get<Canvas>(\"canvas\"), this.get<ElementRegistry>(\"elementRegistry\"));\n }\n\n /** Fit the content into the viewport, leaving room at the top for the palette. */\n private _fit(topInset = 84, pad = 56): void {\n const canvas = this.get<Canvas>(\"canvas\");\n const registry = this.get<ElementRegistry>(\"elementRegistry\");\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const el of registry.getAll()) {\n const e = el as { x?: number; y?: number; width?: number; height?: number };\n if (\n typeof e.x !== \"number\" ||\n typeof e.y !== \"number\" ||\n typeof e.width !== \"number\" ||\n typeof e.height !== \"number\"\n ) {\n continue;\n }\n minX = Math.min(minX, e.x);\n minY = Math.min(minY, e.y);\n maxX = Math.max(maxX, e.x + e.width);\n maxY = Math.max(maxY, e.y + e.height);\n }\n if (!Number.isFinite(minX)) return;\n\n const rect = this._container.getBoundingClientRect();\n const W = rect.width;\n const H = rect.height;\n const cw = Math.max(maxX - minX, 1);\n const ch = Math.max(maxY - minY, 1);\n if (!W || !H) {\n canvas.zoom(\"fit-viewport\");\n return;\n }\n const s = Math.min((W - 2 * pad) / cw, (H - topInset - pad) / ch, 1.25);\n canvas.viewbox({\n x: minX + cw / 2 - W / 2 / s,\n y: minY - topInset / s,\n width: W / s,\n height: H / s,\n });\n }\n\n /** Attach the container into `target`. */\n attachTo(target: HTMLElement): void {\n target.appendChild(this._container);\n this.get<Canvas>(\"canvas\").resized();\n }\n\n /** Detach the container from the DOM, preserving state. */\n detach(): void {\n this._container.remove();\n }\n\n clear(): void {\n this._ensureDiagram().clear();\n }\n\n destroy(): void {\n if (this._diagram) {\n this._diagram.destroy();\n this._diagram = undefined;\n }\n this._container.remove();\n }\n\n get container(): HTMLElement {\n return this._container;\n }\n}\n","/**\n * Creates diagram-js runtime shapes carrying Team Topologies markers, from\n * canonical document elements (import) or from scratch (palette drag-to-create).\n * Everything is a shape — teams, interaction glyphs and the flow arrow.\n */\n\nimport type ElementFactory from \"diagram-js/lib/core/ElementFactory\";\nimport {\n FLOW_SPEC,\n INTERACTION_MODE_SPECS,\n TEAM_TYPE_SPECS,\n newId,\n} from \"@miragon/team-topologies-schema-model\";\nimport type {\n FlowShape,\n InteractionMode,\n InteractionShape,\n TeamNode,\n TeamType,\n} from \"@miragon/team-topologies-schema-model\";\nimport type { TtFlow, TtInteraction, TtTeam } from \"./di-types.js\";\n\nexport default class TtElementFactory {\n static $inject = [\"elementFactory\"];\n\n constructor(private readonly elementFactory: ElementFactory) {}\n\n // --- from canonical document elements (import) -------------------------\n\n createTeam(node: TeamNode): TtTeam {\n return this.elementFactory.createShape({\n id: node.id,\n x: node.position.x,\n y: node.position.y,\n width: node.size.width,\n height: node.size.height,\n ttKind: \"team\",\n teamType: node.type,\n ttLabel: node.label,\n ...(node.description ? { description: node.description } : {}),\n ...(node.fill ? { fill: node.fill } : {}),\n ...(node.stroke ? { stroke: node.stroke } : {}),\n } as Partial<TtTeam>) as unknown as TtTeam;\n }\n\n createInteraction(shape: InteractionShape): TtInteraction {\n return this.elementFactory.createShape({\n id: shape.id,\n x: shape.position.x,\n y: shape.position.y,\n width: shape.size.width,\n height: shape.size.height,\n ttKind: \"interaction\",\n mode: shape.mode,\n ...(shape.label ? { ttLabel: shape.label } : {}),\n ...(shape.fill ? { fill: shape.fill } : {}),\n ...(shape.stroke ? { stroke: shape.stroke } : {}),\n } as Partial<TtInteraction>) as unknown as TtInteraction;\n }\n\n createFlow(shape: FlowShape): TtFlow {\n return this.elementFactory.createShape({\n id: shape.id,\n x: shape.position.x,\n y: shape.position.y,\n width: shape.size.width,\n height: shape.size.height,\n ttKind: \"flow\",\n ...(shape.label ? { ttLabel: shape.label } : {}),\n } as Partial<TtFlow>) as unknown as TtFlow;\n }\n\n // --- fresh, not-yet-placed shapes (palette / context-pad create) -------\n //\n // These set an explicit model-style id (`team_…`/`int_…`/`flow_…`, matching\n // the model package's factory). We must NOT fall back to diagram-js' own\n // auto-id: its counter starts at `shape_12` and is not advanced past ids that\n // come in via import, so a re-imported `shape_N` (an element created in a\n // previous session, then autosaved) collides with the next palette create —\n // the first placement after a reload then throws \"element already exists\".\n\n createNewTeam(type: TeamType, label?: string): TtTeam {\n const spec = TEAM_TYPE_SPECS[type];\n return this.elementFactory.createShape({\n id: newId(\"team\"),\n width: spec.defaultSize.width,\n height: spec.defaultSize.height,\n ttKind: \"team\",\n teamType: type,\n ttLabel: label ?? spec.label,\n } as Partial<TtTeam>) as unknown as TtTeam;\n }\n\n createNewInteraction(mode: InteractionMode): TtInteraction {\n const spec = INTERACTION_MODE_SPECS[mode];\n return this.elementFactory.createShape({\n id: newId(\"int\"),\n width: spec.defaultSize.width,\n height: spec.defaultSize.height,\n ttKind: \"interaction\",\n mode,\n } as Partial<TtInteraction>) as unknown as TtInteraction;\n }\n\n createNewFlow(): TtFlow {\n return this.elementFactory.createShape({\n id: newId(\"flow\"),\n width: FLOW_SPEC.defaultSize.width,\n height: FLOW_SPEC.defaultSize.height,\n ttKind: \"flow\",\n ttLabel: FLOW_SPEC.label,\n } as Partial<TtFlow>) as unknown as TtFlow;\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtElementFactory from \"./TtElementFactory.js\";\n\n/** Element factory with Team Topologies defaults. */\nexport const ttModelModule: ModuleDeclaration = {\n ttElementFactory: [\"type\", TtElementFactory],\n};\n\nexport { default as TtElementFactory } from \"./TtElementFactory.js\";\nexport * from \"./di-types.js\";\n","/** Shared rendering constants (typography, accent, priorities). */\n\n/** BaseRenderer default priority is 1000; 1500 wins the render.shape/connection event. */\nexport const TT_RENDER_PRIORITY = 1500;\n\n/** Selection / hover accent (kept in sync with the app theme). */\nexport const ACCENT = \"#4f46e5\";\n\nexport const INK = \"#1f2430\";\nexport const INK_SOFT = \"#525a6b\";\n\nexport const FONT = {\n /**\n * Set directly as the `font-family` attribute on every SVG <text> (canvas\n * labels and therefore the SVG export too) — not inherited from a CSS\n * container. Falls back to system sans when the host doesn't provide Inter.\n */\n family: \"'Inter', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n label: 13.5,\n small: 11,\n} as const;\n\n/** Paper colour used for the label halo so text stays legible over lines. */\nexport const PAPER = \"#ffffff\";\n","/**\n * SVG rendering of the Team Topologies notation (BaseRenderer subclass).\n * Everything is a placed shape:\n * - teams: SOLID resizable boxes (label wrapped inside), distinguished by shape\n * as well as colour;\n * - interactions: DASHED, 50%-transparent glyphs (collaboration = parallelogram,\n * x-as-a-service = triangle, facilitating = circle) laid over team boundaries;\n * - flow: a dashed \"flow of change\" arrow.\n *\n * Colours/shapes come from the single notation source (`@miragon/team-topologies-schema-model`).\n */\n\nimport BaseRenderer from \"diagram-js/lib/draw/BaseRenderer\";\nimport { append as svgAppend, create as svgCreate, attr as svgAttr } from \"tiny-svg\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport type { ElementLike, ShapeLike } from \"diagram-js/lib/model/Types\";\nimport {\n FLOW_SPEC,\n INTERACTION_MODE_SPECS,\n TEAM_TYPE_SPECS,\n dashArray,\n} from \"@miragon/team-topologies-schema-model\";\nimport { FONT, INK, INK_SOFT } from \"./styles.js\";\nimport { TT_RENDER_PRIORITY } from \"./styles.js\";\nimport {\n isTtElement,\n isTtFlow,\n isTtInteraction,\n isTtTeam,\n type TtFlow,\n type TtInteraction,\n type TtTeam,\n} from \"../model/di-types.js\";\n\ntype Attrs = Record<string, string | number>;\n\nexport default class TeamTopologiesRenderer extends BaseRenderer {\n static $inject = [\"eventBus\"];\n\n constructor(eventBus: EventBus) {\n super(eventBus, TT_RENDER_PRIORITY);\n }\n\n override canRender(element: ElementLike): boolean {\n return isTtElement(element);\n }\n\n override drawShape(visuals: SVGElement, element: ShapeLike): SVGElement {\n if (isTtTeam(element)) return this.drawTeam(visuals, element);\n if (isTtInteraction(element)) return this.drawInteraction(visuals, element);\n if (isTtFlow(element)) return this.drawFlow(visuals, element);\n const rect = svgAttr(svgCreate(\"rect\"), {\n width: element.width,\n height: element.height,\n fill: \"#eee\",\n });\n svgAppend(visuals, rect);\n return rect;\n }\n\n override getShapePath(shape: ShapeLike): string {\n const { x, y, width, height } = shape;\n return `M${x},${y}l${width},0l0,${height}l${-width},0z`;\n }\n\n // --- teams ---------------------------------------------------------------\n\n private drawTeam(visuals: SVGElement, team: TtTeam): SVGElement {\n const spec = TEAM_TYPE_SPECS[team.teamType] ?? TEAM_TYPE_SPECS[\"stream-aligned\"];\n const w = Math.max(team.width, 1);\n const h = Math.max(team.height, 1);\n const sw = spec.strokeWidth;\n const dash = dashArray(spec.strokeStyle, sw);\n const outline = this.teamOutline(spec.shape, w, h, sw, {\n fill: team.fill ?? spec.fill,\n stroke: team.stroke ?? spec.stroke,\n \"stroke-width\": sw,\n ...(dash ? { \"stroke-dasharray\": dash } : {}),\n \"stroke-linejoin\": \"round\",\n });\n svgAppend(visuals, outline);\n this.appendLabel(visuals, team.ttLabel ?? \"\", w, h, { \"font-weight\": \"640\" });\n return outline;\n }\n\n private teamOutline(kind: string, w: number, h: number, sw: number, attrs: Attrs): SVGElement {\n const i = sw / 2;\n const iw = w - sw;\n const ih = h - sw;\n if (kind === \"octagon\") {\n const c = Math.min(iw, ih) * 0.29;\n return svgAttr(svgCreate(\"polygon\"), { points: octagon(i, iw, ih, c), ...attrs });\n }\n const rx = kind === \"rect\" ? 4 : Math.min(20, ih / 2, iw / 2);\n return svgAttr(svgCreate(\"rect\"), { x: i, y: i, width: iw, height: ih, rx, ry: rx, ...attrs });\n }\n\n // --- interactions --------------------------------------------------------\n\n private drawInteraction(visuals: SVGElement, el: TtInteraction): SVGElement {\n const spec = INTERACTION_MODE_SPECS[el.mode] ?? INTERACTION_MODE_SPECS.collaboration;\n const w = Math.max(el.width, 1);\n const h = Math.max(el.height, 1);\n const sw = 2;\n const i = sw / 2;\n const common: Attrs = {\n fill: el.fill ?? spec.fill,\n \"fill-opacity\": spec.opacity,\n stroke: el.stroke ?? spec.stroke,\n \"stroke-width\": sw,\n \"stroke-dasharray\": dashArray(spec.strokeStyle, sw) || \"6 4\",\n \"stroke-linejoin\": \"round\",\n };\n\n let glyph: SVGElement;\n if (spec.shape === \"circle\") {\n glyph = svgAttr(svgCreate(\"ellipse\"), {\n cx: w / 2,\n cy: h / 2,\n rx: (w - sw) / 2,\n ry: (h - sw) / 2,\n ...common,\n });\n } else if (spec.shape === \"triangle\") {\n // Point up — the tip indicates the direction the service is provided.\n const pts = `${w / 2},${i} ${w - i},${h - i} ${i},${h - i}`;\n glyph = svgAttr(svgCreate(\"polygon\"), { points: pts, ...common });\n } else {\n const skew = Math.min(w * 0.26, h * 0.85);\n const pts = `${i + skew},${i} ${w - i},${i} ${w - i - skew},${h - i} ${i},${h - i}`;\n glyph = svgAttr(svgCreate(\"polygon\"), { points: pts, ...common });\n }\n svgAppend(visuals, glyph);\n\n if (el.ttLabel) {\n this.appendLabel(visuals, el.ttLabel, w, h, {\n \"font-size\": FONT.small,\n \"font-weight\": \"600\",\n });\n }\n return glyph;\n }\n\n // --- flow of change ------------------------------------------------------\n\n private drawFlow(visuals: SVGElement, el: TtFlow): SVGElement {\n const w = Math.max(el.width, 1);\n const h = Math.max(el.height, 1);\n const sw = FLOW_SPEC.strokeWidth;\n const i = sw / 2;\n const head = Math.min(w * 0.16, h * 1.1);\n const shaft = h * 0.5;\n const top = (h - shaft) / 2;\n const bot = top + shaft;\n const pts = [\n [i, top],\n [w - head, top],\n [w - head, i],\n [w - i, h / 2],\n [w - head, h - i],\n [w - head, bot],\n [i, bot],\n ]\n .map((p) => p.join(\",\"))\n .join(\" \");\n const arrow = svgAttr(svgCreate(\"polygon\"), {\n points: pts,\n fill: \"none\",\n stroke: FLOW_SPEC.stroke,\n \"stroke-width\": sw,\n \"stroke-dasharray\": dashArray(FLOW_SPEC.strokeStyle, sw) || \"6 4\",\n \"stroke-linejoin\": \"round\",\n });\n svgAppend(visuals, arrow);\n if (el.ttLabel) {\n this.appendLabel(visuals, el.ttLabel, w - head, h, {\n \"font-size\": FONT.small,\n \"font-weight\": \"650\",\n \"letter-spacing\": \"0.06em\",\n fill: INK_SOFT,\n });\n }\n return arrow;\n }\n\n // --- shared label rendering (wrapped, centred, no halo) ------------------\n\n private appendLabel(visuals: SVGElement, text: string, w: number, h: number, attrs: Attrs): void {\n const fontSize =\n typeof attrs[\"font-size\"] === \"number\" ? (attrs[\"font-size\"] as number) : FONT.label;\n const lines = wrapLabel(text, w - 20, fontSize);\n const lineHeight = fontSize * 1.2;\n const startY = h / 2 - ((lines.length - 1) * lineHeight) / 2;\n lines.forEach((ln, idx) => {\n const t = svgAttr(svgCreate(\"text\"), {\n x: w / 2,\n y: startY + idx * lineHeight,\n \"font-family\": FONT.family,\n \"font-size\": fontSize,\n fill: INK,\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n ...attrs,\n });\n t.textContent = ln;\n svgAppend(visuals, t);\n });\n }\n}\n\n// --- helpers ---------------------------------------------------------------\n\nfunction octagon(i: number, w: number, h: number, c: number): string {\n return [\n [i + c, i],\n [i + w - c, i],\n [i + w, i + c],\n [i + w, i + h - c],\n [i + w - c, i + h],\n [i + c, i + h],\n [i, i + h - c],\n [i, i + c],\n ]\n .map((p) => p.join(\",\"))\n .join(\" \");\n}\n\n/** Greedy word-wrap into lines that roughly fit `maxWidth` at the font size. */\nfunction wrapLabel(text: string, maxWidth: number, fontSize: number): string[] {\n const maxChars = Math.max(4, Math.floor(maxWidth / (fontSize * 0.58)));\n const words = text.split(/\\s+/).filter(Boolean);\n if (words.length === 0) return [];\n const lines: string[] = [];\n let cur = \"\";\n for (const word of words) {\n const candidate = cur ? `${cur} ${word}` : word;\n if (candidate.length > maxChars && cur) {\n lines.push(cur);\n cur = word;\n } else {\n cur = candidate;\n }\n }\n if (cur) lines.push(cur);\n return lines;\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TeamTopologiesRenderer from \"./TeamTopologiesRenderer.js\";\n\n/** SVG rendering of all Team Topologies element types (BaseRenderer, priority 1500). */\nexport const ttDrawModule: ModuleDeclaration = {\n __init__: [\"ttRenderer\"],\n ttRenderer: [\"type\", TeamTopologiesRenderer],\n};\n\nexport { default as TeamTopologiesRenderer } from \"./TeamTopologiesRenderer.js\";\n","/**\n * Bridges the canonical `TtDocument` into the diagram-js canvas. Everything is a\n * shape; stacking order (back → front) is flows, teams, interactions, so the\n * translucent interaction glyphs read on top of the team boxes they overlay.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type ElementFactory from \"diagram-js/lib/core/ElementFactory\";\nimport type ElementRegistry from \"diagram-js/lib/core/ElementRegistry\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport type { Root } from \"diagram-js/lib/model/Types\";\nimport type { TtDocument } from \"@miragon/team-topologies-schema-model\";\nimport type TtElementFactory from \"../model/TtElementFactory.js\";\nimport { ROOT_ID, type ImportWarning, type RootBusinessObject } from \"./types.js\";\n\ntype RootWithMeta = Root & { businessObject?: RootBusinessObject };\n\nexport default class TtImporter {\n static $inject = [\"canvas\", \"elementFactory\", \"ttElementFactory\", \"eventBus\", \"elementRegistry\"];\n\n constructor(\n private readonly canvas: Canvas,\n private readonly elementFactory: ElementFactory,\n private readonly factory: TtElementFactory,\n private readonly eventBus: EventBus,\n private readonly elementRegistry: ElementRegistry,\n ) {}\n\n import(doc: TtDocument): ImportWarning[] {\n const warnings: ImportWarning[] = [];\n this.eventBus.fire(\"import.render.start\", { document: doc });\n\n let existing: RootWithMeta | undefined;\n try {\n existing = this.canvas.getRootElement() as RootWithMeta;\n } catch {\n existing = undefined;\n }\n let root: RootWithMeta;\n if (existing && existing.id === ROOT_ID) {\n root = existing;\n } else {\n root = this.elementFactory.createRoot({ id: ROOT_ID }) as RootWithMeta;\n this.canvas.setRootElement(root);\n }\n root.businessObject = { title: doc.title };\n\n // Back → front: flows, teams, interactions.\n for (const flow of doc.flows) {\n this.canvas.addShape(this.factory.createFlow(flow), root);\n }\n for (const node of doc.nodes) {\n this.canvas.addShape(this.factory.createTeam(node), root);\n }\n for (const interaction of doc.interactions) {\n this.canvas.addShape(this.factory.createInteraction(interaction), root);\n }\n\n this.eventBus.fire(\"import.render.done\", { warnings });\n return warnings;\n }\n\n /** Removes every element (for re-import). */\n clear(): void {\n for (const el of [...this.elementRegistry.getAll()]) {\n if (el.id === ROOT_ID) continue;\n try {\n this.canvas.removeShape(el.id);\n } catch {\n // already removed — ignore\n }\n }\n }\n}\n","/**\n * Rebuilds a canonical `TtDocument` from the diagram-js runtime model. Position\n * and size truth are the live `x/y/width/height`; editable fields (label, type,\n * mode, colours) are read from the runtime properties.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type ElementRegistry from \"diagram-js/lib/core/ElementRegistry\";\nimport type { Root } from \"diagram-js/lib/model/Types\";\nimport { DOCUMENT_VERSION } from \"@miragon/team-topologies-schema-model\";\nimport type {\n FlowShape,\n InteractionShape,\n TeamNode,\n TtDocument,\n} from \"@miragon/team-topologies-schema-model\";\nimport { isTtFlow, isTtInteraction, isTtTeam } from \"../model/di-types.js\";\nimport { ROOT_ID, type RootBusinessObject } from \"./types.js\";\n\nexport default class TtExporter {\n static $inject = [\"elementRegistry\", \"canvas\"];\n\n constructor(\n private readonly elementRegistry: ElementRegistry,\n private readonly canvas: Canvas,\n ) {}\n\n export(): TtDocument {\n let meta: RootBusinessObject | undefined;\n try {\n const root = this.canvas.getRootElement() as Root & {\n businessObject?: RootBusinessObject;\n };\n meta = root.businessObject;\n } catch {\n meta = undefined;\n }\n\n const nodes: TeamNode[] = [];\n const interactions: InteractionShape[] = [];\n const flows: FlowShape[] = [];\n\n for (const el of this.elementRegistry.getAll()) {\n if (el.id === ROOT_ID) continue;\n const geom = el as unknown as { x: number; y: number; width: number; height: number };\n const position = { x: geom.x, y: geom.y };\n const size = { width: geom.width, height: geom.height };\n\n if (isTtTeam(el)) {\n nodes.push({\n id: el.id,\n type: el.teamType,\n label: el.ttLabel ?? \"\",\n position,\n size,\n ...(el.description ? { description: el.description } : {}),\n ...(el.fill ? { fill: el.fill } : {}),\n ...(el.stroke ? { stroke: el.stroke } : {}),\n });\n } else if (isTtInteraction(el)) {\n interactions.push({\n id: el.id,\n mode: el.mode,\n position,\n size,\n ...(el.ttLabel ? { label: el.ttLabel } : {}),\n ...(el.fill ? { fill: el.fill } : {}),\n ...(el.stroke ? { stroke: el.stroke } : {}),\n });\n } else if (isTtFlow(el)) {\n flows.push({\n id: el.id,\n position,\n size,\n ...(el.ttLabel ? { label: el.ttLabel } : {}),\n });\n }\n }\n\n return {\n version: DOCUMENT_VERSION,\n title: meta?.title ?? \"Untitled team topology\",\n nodes,\n interactions,\n flows,\n };\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtImporter from \"./TtImporter.js\";\nimport TtExporter from \"./TtExporter.js\";\n\n/** Document <-> diagram-js bridge (import / export). */\nexport const ioModule: ModuleDeclaration = {\n ttImporter: [\"type\", TtImporter],\n ttExporter: [\"type\", TtExporter],\n};\n\nexport { default as TtImporter } from \"./TtImporter.js\";\nexport { default as TtExporter } from \"./TtExporter.js\";\nexport { saveSVG } from \"./saveSvg.js\";\nexport { ROOT_ID } from \"./types.js\";\nexport type { ImportWarning, RootBusinessObject } from \"./types.js\";\n","import type { ModuleDeclaration } from \"didi\";\nimport { TtBaseViewer } from \"./TtBaseViewer.js\";\nimport { ttModelModule } from \"./model/index.js\";\nimport { ttDrawModule } from \"./draw/index.js\";\nimport { ioModule } from \"./io/index.js\";\n\n/** Read-only renderer: draws a Team Topologies diagram with no interaction. */\nexport class Viewer extends TtBaseViewer {\n protected _getModules(): ModuleDeclaration[] {\n return [ttModelModule, ttDrawModule, ioModule];\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport SelectionModule from \"diagram-js/lib/features/selection\";\nimport ZoomScrollModule from \"diagram-js/lib/navigation/zoomscroll\";\nimport MoveCanvasModule from \"diagram-js/lib/navigation/movecanvas\";\nimport { Viewer } from \"./Viewer.js\";\n\n/** Read-only + navigation: zoom (scroll), pan (drag), selection. */\nexport class NavigatedViewer extends Viewer {\n protected override _getModules(): ModuleDeclaration[] {\n return [...super._getModules(), SelectionModule, ZoomScrollModule, MoveCanvasModule];\n }\n}\n","/**\n * Generic, undo-able command that sets arbitrary Team Topologies properties\n * (ttLabel, teamType, mode, fill, stroke, description). Returns the changed\n * element so the CommandStack fires `elements.changed` → re-render.\n */\n\nimport type { ElementLike } from \"diagram-js/lib/core/Types\";\nimport type CommandHandler from \"diagram-js/lib/command/CommandHandler\";\n\nexport interface UpdatePropertiesContext {\n element: ElementLike & Record<string, unknown>;\n properties: Record<string, unknown>;\n /** set internally by the handler (for revert). */\n oldProperties?: Record<string, unknown>;\n}\n\nfunction setOrDelete(obj: Record<string, unknown>, key: string, value: unknown): void {\n if (value === undefined) delete obj[key];\n else obj[key] = value;\n}\n\nexport default class UpdatePropertiesHandler implements CommandHandler {\n execute(context: UpdatePropertiesContext): ElementLike[] {\n const { element, properties } = context;\n const target = element as unknown as Record<string, unknown>;\n const old: Record<string, unknown> = {};\n for (const key of Object.keys(properties)) {\n old[key] = target[key];\n setOrDelete(target, key, properties[key]);\n }\n context.oldProperties = old;\n return [element];\n }\n\n revert(context: UpdatePropertiesContext): ElementLike[] {\n const { element, oldProperties } = context;\n const target = element as unknown as Record<string, unknown>;\n if (oldProperties) {\n for (const key of Object.keys(oldProperties)) setOrDelete(target, key, oldProperties[key]);\n }\n return [element];\n }\n}\n","/**\n * High-level Team Topologies mutations that go through the command stack\n * (undo/redo). Registers the generic property command handler.\n */\n\nimport type CommandStack from \"diagram-js/lib/command/CommandStack\";\nimport type { InteractionMode, TeamType } from \"@miragon/team-topologies-schema-model\";\nimport type { TtElement, TtInteraction, TtTeam } from \"../model/di-types.js\";\nimport UpdatePropertiesHandler from \"./cmd/UpdatePropertiesHandler.js\";\n\nconst UPDATE_PROPERTIES = \"element.updateProperties\";\n\nexport default class TtModeling {\n static $inject = [\"commandStack\"];\n\n constructor(private readonly commandStack: CommandStack) {\n commandStack.registerHandler(UPDATE_PROPERTIES, UpdatePropertiesHandler);\n }\n\n updateProperties(element: TtElement, properties: Record<string, unknown>): void {\n this.commandStack.execute(UPDATE_PROPERTIES, { element, properties });\n }\n\n /** Rename / relabel any element. */\n updateLabel(element: TtElement, label: string): void {\n this.updateProperties(element, { ttLabel: label || undefined });\n }\n\n setTeamType(team: TtTeam, teamType: TeamType): void {\n this.updateProperties(team, { teamType });\n }\n\n setInteractionMode(interaction: TtInteraction, mode: InteractionMode): void {\n this.updateProperties(interaction, { mode });\n }\n\n /** Set or clear per-element colour overrides (`undefined` reverts to default). */\n setColors(\n element: TtTeam | TtInteraction,\n fill: string | undefined,\n stroke: string | undefined,\n ): void {\n this.updateProperties(element, { fill, stroke });\n }\n\n setDescription(team: TtTeam, description: string | undefined): void {\n this.updateProperties(team, { description });\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtModeling from \"./TtModeling.js\";\n\n/** High-level Team Topologies mutations + registration of the command handlers. */\nexport const ttModelingModule: ModuleDeclaration = {\n __init__: [\"ttModeling\"],\n ttModeling: [\"type\", TtModeling],\n};\n\nexport { default as TtModeling } from \"./TtModeling.js\";\n","/**\n * Allowed editing operations. Every Team Topologies element is a free, placed\n * shape — movable, creatable and resizable. There are no connections (the\n * official notation models interactions as overlapping shapes, not lines).\n */\n\nimport RuleProvider from \"diagram-js/lib/features/rules/RuleProvider\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\n\ninterface MoveContext {\n target?: { parent?: unknown } | null;\n}\n\nexport default class TtRules extends RuleProvider {\n static override $inject = [\"eventBus\"];\n\n constructor(eventBus: EventBus) {\n super(eventBus);\n }\n\n override init(): void {\n // By default diagram-js re-parents a dragged shape into whatever element it\n // is dropped on, so the two then move together as if glued. Team Topologies\n // shapes are independent and only overlap, so ignore (return `null`) any\n // element drop target — the shapes keep their root parent. Dropping on the\n // canvas (the root, which has no parent) still allows the move.\n this.addRule([\"shape.move\", \"elements.move\"], (context: MoveContext) =>\n context.target && context.target.parent ? null : true,\n );\n this.addRule(\"shape.create\", () => true);\n this.addRule(\"shape.resize\", () => true);\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport RulesModule from \"diagram-js/lib/features/rules\";\nimport TtRules from \"./TtRules.js\";\n\n/** Team Topologies editing rules (connect, move, create, resize). */\nexport const ttRulesModule: ModuleDeclaration = {\n __depends__: [RulesModule],\n __init__: [\"ttRules\"],\n ttRules: [\"type\", TtRules],\n};\n\nexport { default as TtRules } from \"./TtRules.js\";\n","/**\n * Keeps the diagram flat: Team Topologies shapes overlap but never nest.\n *\n * diagram-js parents a newly created shape to whatever element it is dropped on\n * (`context.parent` defaults to the drop target). Interaction glyphs are meant\n * to be placed *over* the teams they relate to, so the natural workflow would\n * otherwise nest the interaction inside a team — gluing it so it moves along\n * with the team. Force every created shape onto the diagram root instead.\n *\n * Re-parenting on *move* is prevented separately in TtRules.\n */\n\nimport CommandInterceptor from \"diagram-js/lib/command/CommandInterceptor\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\n\nexport default class TtFlatModelBehavior extends CommandInterceptor {\n static override $inject = [\"eventBus\", \"canvas\"];\n\n constructor(eventBus: EventBus, canvas: Canvas) {\n super(eventBus);\n\n this.preExecute(\n [\"shape.create\", \"elements.create\"],\n (context: { parent?: unknown }) => {\n context.parent = canvas.getRootElement();\n },\n true,\n );\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtFlatModelBehavior from \"./TtFlatModelBehavior.js\";\n\n/** Editing behaviors that keep the Team Topologies model flat (no nesting). */\nexport const ttBehaviorsModule: ModuleDeclaration = {\n __init__: [\"ttFlatModelBehavior\"],\n ttFlatModelBehavior: [\"type\", TtFlatModelBehavior],\n};\n\nexport { default as TtFlatModelBehavior } from \"./TtFlatModelBehavior.js\";\n","/**\n * Tiny inline-SVG glyphs for the palette entries — the same shapes the canvas\n * draws (so the palette is a faithful preview of each team type / interaction\n * mode). Returned as HTML strings for diagram-js palette `html`.\n */\n\nimport {\n INTERACTION_MODE_SPECS,\n TEAM_TYPE_SPECS,\n dashArray,\n} from \"@miragon/team-topologies-schema-model\";\nimport type { InteractionMode, TeamType } from \"@miragon/team-topologies-schema-model\";\n\nfunction svg(inner: string): string {\n return `<svg class=\"tt-palette-svg\" width=\"24\" height=\"24\" viewBox=\"0 0 26 26\" aria-hidden=\"true\">${inner}</svg>`;\n}\n\nexport function teamIconSvg(type: TeamType): string {\n const s = TEAM_TYPE_SPECS[type];\n const dash = dashArray(s.strokeStyle, 1.5);\n const common =\n `fill=\"${s.fill}\" stroke=\"${s.stroke}\" stroke-width=\"1.5\"` +\n (dash ? ` stroke-dasharray=\"${dash}\"` : \"\");\n switch (s.shape) {\n case \"octagon\":\n return svg(`<polygon points=\"8,3 18,3 23,8 23,18 18,23 8,23 3,18 3,8\" ${common}/>`);\n case \"rounded-rect-vertical\":\n return svg(`<rect x=\"8\" y=\"3\" width=\"10\" height=\"20\" rx=\"4\" ${common}/>`);\n case \"rect\":\n return svg(`<rect x=\"3\" y=\"7\" width=\"20\" height=\"12\" rx=\"1.5\" ${common}/>`);\n default:\n return svg(`<rect x=\"3\" y=\"8\" width=\"20\" height=\"10\" rx=\"5\" ${common}/>`);\n }\n}\n\nexport function flowIconSvg(): string {\n return svg(\n `<g fill=\"none\" stroke=\"#6b6459\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-dasharray=\"3 2\">` +\n `<polygon points=\"3,9 16,9 16,5 23,13 16,21 16,17 3,17\"/></g>`,\n );\n}\n\nexport function interactionIconSvg(mode: InteractionMode): string {\n const s = INTERACTION_MODE_SPECS[mode];\n const dash = dashArray(s.strokeStyle, 1.5);\n const common =\n `fill=\"${s.fill}\" fill-opacity=\"${s.opacity}\" stroke=\"${s.stroke}\" stroke-width=\"1.5\"` +\n (dash ? ` stroke-dasharray=\"${dash}\"` : \"\");\n switch (s.shape) {\n case \"circle\":\n return svg(`<circle cx=\"13\" cy=\"13\" r=\"9\" ${common}/>`);\n case \"triangle\":\n return svg(`<polygon points=\"5,6 22,13 5,20\" ${common}/>`);\n default:\n return svg(`<polygon points=\"9,6 23,6 17,20 3,20\" ${common}/>`);\n }\n}\n","/**\n * The floating tool palette (styled top-centre, Excalidraw style). Every entry\n * is drag-to-create: the four team types, the three interaction-mode glyphs\n * (placed over team boundaries), and the flow-of-change arrow.\n */\n\nimport type Palette from \"diagram-js/lib/features/palette/Palette\";\nimport type Create from \"diagram-js/lib/features/create/Create\";\nimport type {\n PaletteEntries,\n default as PaletteProvider,\n} from \"diagram-js/lib/features/palette/PaletteProvider\";\nimport type { Element } from \"diagram-js/lib/model/Types\";\nimport {\n ALL_INTERACTION_SPECS,\n ALL_TEAM_SPECS,\n FLOW_SPEC,\n} from \"@miragon/team-topologies-schema-model\";\nimport { flowIconSvg, interactionIconSvg, teamIconSvg } from \"../draw/palette-icons.js\";\nimport type TtElementFactory from \"../model/TtElementFactory.js\";\n\nconst GROUP_TEAMS = \"tt-1-teams\";\nconst GROUP_MODES = \"tt-2-modes\";\nconst GROUP_FLOW = \"tt-3-flow\";\n\nfunction entryHtml(icon: string, title: string): string {\n return `<div class=\"entry tt-palette-entry\" draggable=\"true\" title=\"${title}\">${icon}</div>`;\n}\n\nexport default class TtPaletteProvider implements PaletteProvider {\n static $inject = [\"palette\", \"create\", \"ttElementFactory\"];\n\n constructor(\n palette: Palette,\n private readonly create: Create,\n private readonly factory: TtElementFactory,\n ) {\n palette.registerProvider(this);\n }\n\n getPaletteEntries(): PaletteEntries {\n const entries: PaletteEntries = {};\n\n for (const spec of ALL_TEAM_SPECS) {\n const start = (event: Event) =>\n this.create.start(\n event as MouseEvent,\n this.factory.createNewTeam(spec.type, spec.label) as unknown as Element,\n );\n entries[`team.${spec.type}`] = {\n group: GROUP_TEAMS,\n title: `${spec.label} team — ${spec.description}`,\n html: entryHtml(teamIconSvg(spec.type), `${spec.label} team — ${spec.description}`),\n action: { dragstart: start, click: start },\n };\n }\n\n for (const spec of ALL_INTERACTION_SPECS) {\n const start = (event: Event) =>\n this.create.start(\n event as MouseEvent,\n this.factory.createNewInteraction(spec.mode) as unknown as Element,\n );\n entries[`mode.${spec.mode}`] = {\n group: GROUP_MODES,\n title: `${spec.label} — ${spec.description} (place over the teams it relates to)`,\n html: entryHtml(interactionIconSvg(spec.mode), `${spec.label} — ${spec.description}`),\n action: { dragstart: start, click: start },\n };\n }\n\n const startFlow = (event: Event) =>\n this.create.start(event as MouseEvent, this.factory.createNewFlow() as unknown as Element);\n entries[\"flow\"] = {\n group: GROUP_FLOW,\n title: `${FLOW_SPEC.label} — the implied left-to-right flow`,\n html: entryHtml(flowIconSvg(), FLOW_SPEC.label),\n action: { dragstart: startFlow, click: startFlow },\n };\n\n return entries;\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport PaletteModule from \"diagram-js/lib/features/palette\";\nimport CreateModule from \"diagram-js/lib/features/create\";\nimport TtPaletteProvider from \"./TtPaletteProvider.js\";\n\n/** Tool palette (drag-to-create teams, pick interaction mode). */\nexport const ttPaletteModule: ModuleDeclaration = {\n __depends__: [PaletteModule, CreateModule],\n __init__: [\"ttPaletteProvider\"],\n ttPaletteProvider: [\"type\", TtPaletteProvider],\n};\n\nexport { default as TtPaletteProvider } from \"./TtPaletteProvider.js\";\n","/**\n * A handful of Material-style icon paths (Apache-2.0) used by the context pad,\n * exposed as HTML markup. Reusable by host chrome too.\n */\n\nexport const ICON_ARROW_FORWARD = \"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\";\nexport const ICON_EDIT =\n \"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.9959.9959 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\";\nexport const ICON_DELETE =\n \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\";\nexport const ICON_SWAP = \"M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z\";\n\nexport function iconMarkup(path: string, size = 18): string {\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"${path}\"/></svg>`;\n}\n","/**\n * Context-pad actions: rename and delete. Every Team Topologies element is a\n * free shape, so the actions are uniform (no connect — interactions are placed,\n * not wired).\n */\n\nimport type ContextPad from \"diagram-js/lib/features/context-pad/ContextPad\";\nimport type Modeling from \"diagram-js/lib/features/modeling/Modeling\";\nimport type {\n ContextPadEntries,\n default as ContextPadProvider,\n} from \"diagram-js/lib/features/context-pad/ContextPadProvider\";\nimport type { Element } from \"diagram-js/lib/model/Types\";\nimport { isTtElement } from \"../model/di-types.js\";\nimport type TtLabelEditing from \"../label-editing/TtLabelEditing.js\";\nimport { ICON_DELETE, ICON_EDIT, iconMarkup } from \"../draw/icons.js\";\n\nfunction cpHtml(path: string, title: string): string {\n return `<div class=\"entry tt-cp-entry\" title=\"${title}\">${iconMarkup(path)}</div>`;\n}\n\nexport default class TtContextPadProvider implements ContextPadProvider {\n static $inject = [\"contextPad\", \"modeling\", \"ttLabelEditing\"];\n\n constructor(\n contextPad: ContextPad,\n private readonly modeling: Modeling,\n private readonly labelEditing: TtLabelEditing,\n ) {\n contextPad.registerProvider(this);\n }\n\n getContextPadEntries(element: Element): ContextPadEntries {\n if (!isTtElement(element)) return {};\n return {\n \"edit-label\": {\n group: \"edit\",\n title: \"Rename\",\n html: cpHtml(ICON_EDIT, \"Rename\"),\n action: { click: () => this.labelEditing.activate(element) },\n },\n delete: {\n group: \"edit\",\n title: \"Delete\",\n html: cpHtml(ICON_DELETE, \"Delete\"),\n action: { click: () => this.modeling.removeElements([element]) },\n },\n };\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport ContextPadModule from \"diagram-js/lib/features/context-pad\";\nimport TtContextPadProvider from \"./TtContextPadProvider.js\";\n\n/** Per-element context actions (rename, delete). */\nexport const ttContextPadModule: ModuleDeclaration = {\n __depends__: [ContextPadModule],\n __init__: [\"ttContextPadProvider\"],\n ttContextPadProvider: [\"type\", TtContextPadProvider],\n};\n\nexport { default as TtContextPadProvider } from \"./TtContextPadProvider.js\";\n","/**\n * Inline label editing as an HTML overlay (an <input> centred over the element).\n * Commit goes through `ttModeling.updateLabel` → command stack (undoable).\n * Double-click any element (team / interaction / flow) to (re)label it.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport { isTtElement, type TtElement } from \"../model/di-types.js\";\nimport type TtModeling from \"../modeling/TtModeling.js\";\n\ninterface ActiveEdit {\n commit: () => void;\n cleanup: () => void;\n}\n\nexport default class TtLabelEditing {\n static $inject = [\"eventBus\", \"canvas\", \"ttModeling\"];\n\n private active: ActiveEdit | null = null;\n\n constructor(\n eventBus: EventBus,\n private readonly canvas: Canvas,\n private readonly modeling: TtModeling,\n ) {\n eventBus.on(\"element.dblclick\", (event: { element?: unknown }) => {\n if (isTtElement(event.element)) this.activate(event.element);\n });\n // Any click/drag/pan outside the input commits (only Escape discards).\n eventBus.on([\"element.mousedown\", \"drag.init\", \"canvas.viewbox.changing\"], () =>\n this.active?.commit(),\n );\n }\n\n activate(element: TtElement): void {\n this.active?.commit();\n\n const container = this.canvas.getContainer();\n const scale = this.canvas.zoom();\n const vb = this.canvas.viewbox();\n const cx = element.x + element.width / 2;\n const cy = element.y + element.height / 2;\n const width = 170;\n const left = (cx - vb.x) * scale - width / 2;\n const top = (cy - vb.y) * scale - 14;\n\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.className = \"tt-label-input\";\n input.value = element.ttLabel ?? \"\";\n input.style.position = \"absolute\";\n input.style.left = `${left}px`;\n input.style.top = `${top}px`;\n input.style.width = `${width}px`;\n container.appendChild(input);\n input.focus();\n input.select();\n\n let done = false;\n const cleanup = () => {\n if (done) return;\n done = true;\n input.removeEventListener(\"keydown\", onKey);\n input.removeEventListener(\"blur\", onBlur);\n input.remove();\n this.active = null;\n };\n const commit = () => {\n if (done) return;\n const value = input.value.trim();\n const changed = value !== (element.ttLabel ?? \"\");\n cleanup();\n if (changed) this.modeling.updateLabel(element, value);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n cleanup();\n }\n };\n const onBlur = () => commit();\n input.addEventListener(\"keydown\", onKey);\n input.addEventListener(\"blur\", onBlur);\n\n this.active = { commit, cleanup };\n }\n\n cancel(): void {\n this.active?.cleanup();\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtLabelEditing from \"./TtLabelEditing.js\";\n\n/** Inline label editing (double-click a team to rename). */\nexport const ttLabelEditingModule: ModuleDeclaration = {\n __init__: [\"ttLabelEditing\"],\n ttLabelEditing: [\"type\", TtLabelEditing],\n};\n\nexport { default as TtLabelEditing } from \"./TtLabelEditing.js\";\n","/**\n * Keyboard shortcuts: undo / redo / delete-selection. Bound to the document so\n * they work without first clicking (focusing) the canvas — typing inside form\n * fields is left untouched. No container `tabindex`, so the canvas never shows a\n * focus ring.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type CommandStack from \"diagram-js/lib/command/CommandStack\";\nimport type Selection from \"diagram-js/lib/features/selection/Selection\";\nimport type Modeling from \"diagram-js/lib/features/modeling/Modeling\";\nimport type { Element } from \"diagram-js/lib/model/Types\";\n\nfunction isTypingTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null;\n if (!el) return false;\n return (\n el.tagName === \"INPUT\" ||\n el.tagName === \"TEXTAREA\" ||\n el.tagName === \"SELECT\" ||\n el.isContentEditable\n );\n}\n\nexport default class TtKeyboard {\n static $inject = [\"canvas\", \"commandStack\", \"selection\", \"modeling\"];\n\n constructor(\n canvas: Canvas,\n commandStack: CommandStack,\n selection: Selection,\n modeling: Modeling,\n ) {\n const doc = canvas.getContainer().ownerDocument ?? document;\n\n doc.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (isTypingTarget(e.target)) return;\n const cmd = e.ctrlKey || e.metaKey;\n const key = e.key.toLowerCase();\n\n if (cmd && key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n if (commandStack.canUndo()) commandStack.undo();\n } else if ((cmd && key === \"z\" && e.shiftKey) || (cmd && key === \"y\")) {\n e.preventDefault();\n if (commandStack.canRedo()) commandStack.redo();\n } else if (key === \"delete\" || key === \"backspace\") {\n const sel = selection.get() as Element[];\n if (sel.length) {\n e.preventDefault();\n modeling.removeElements([...sel]);\n }\n }\n });\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtKeyboard from \"./TtKeyboard.js\";\n\n/** Undo/redo + delete-selection on the canvas container. */\nexport const ttKeyboardModule: ModuleDeclaration = {\n __init__: [\"ttKeyboard\"],\n ttKeyboard: [\"type\", TtKeyboard],\n};\n\nexport { default as TtKeyboard } from \"./TtKeyboard.js\";\n","/**\n * Enforces a fixed stacking order regardless of creation order, by reordering\n * the element graphics within the canvas layer. Back → front:\n *\n * flow < stream-aligned / platform < complicated-subsystem < enabling < interactions\n *\n * So interaction glyphs always read on top; enabling teams sit above the\n * complicated-subsystem teams, which in turn sit above the stream-aligned /\n * platform base teams they overlap.\n */\n\nimport type Canvas from \"diagram-js/lib/core/Canvas\";\nimport type ElementRegistry from \"diagram-js/lib/core/ElementRegistry\";\nimport type EventBus from \"diagram-js/lib/core/EventBus\";\nimport {\n isTtElement,\n isTtFlow,\n isTtInteraction,\n isTtTeam,\n type TtElement,\n} from \"../model/di-types.js\";\n\n/** Lower = further back. */\nfunction tier(el: TtElement): number {\n if (isTtFlow(el)) return 0;\n if (isTtTeam(el)) {\n if (el.teamType === \"enabling\") return 3;\n if (el.teamType === \"complicated-subsystem\") return 2;\n return 1; // stream-aligned, platform\n }\n if (isTtInteraction(el)) return 4;\n return 1;\n}\n\nexport default class TtZOrder {\n static $inject = [\"eventBus\", \"canvas\", \"elementRegistry\"];\n\n private importing = false;\n\n constructor(\n eventBus: EventBus,\n private readonly canvas: Canvas,\n private readonly elementRegistry: ElementRegistry,\n ) {\n eventBus.on(\"import.render.start\", () => {\n this.importing = true;\n });\n eventBus.on(\"import.render.done\", () => {\n this.importing = false;\n this.reorder();\n });\n // Covers create + team-type changes (and harmlessly re-runs on move/resize).\n eventBus.on(\"commandStack.changed\", () => {\n if (!this.importing) this.reorder();\n });\n }\n\n /** Re-append each element's graphics group in ascending tier order (back → front). */\n reorder(): void {\n const ordered = (this.elementRegistry.getAll().filter(isTtElement) as TtElement[]).sort(\n (a, b) => tier(a) - tier(b),\n );\n for (const el of ordered) {\n const gfx = this.canvas.getGraphics(el) as SVGElement | undefined;\n const wrapper = gfx?.parentNode as (Node & ChildNode) | null;\n const layer = wrapper?.parentNode as (Node & { appendChild(n: Node): Node }) | null;\n if (wrapper && layer) layer.appendChild(wrapper);\n }\n }\n}\n","import type { ModuleDeclaration } from \"didi\";\nimport TtZOrder from \"./TtZOrder.js\";\n\n/** Keeps the fixed stacking order (interactions on top, base teams at the back). */\nexport const ttZOrderModule: ModuleDeclaration = {\n __init__: [\"ttZOrder\"],\n ttZOrder: [\"type\", TtZOrder],\n};\n\nexport { default as TtZOrder } from \"./TtZOrder.js\";\n","import type { ModuleDeclaration } from \"didi\";\nimport type CommandStack from \"diagram-js/lib/command/CommandStack\";\n\nimport ModelingModule from \"diagram-js/lib/features/modeling\";\nimport MoveModule from \"diagram-js/lib/features/move\";\nimport OutlineModule from \"diagram-js/lib/features/outline\";\nimport ResizeModule from \"diagram-js/lib/features/resize\";\n\nimport { NavigatedViewer } from \"./NavigatedViewer.js\";\nimport { ttModelingModule } from \"./modeling/index.js\";\nimport { ttRulesModule } from \"./rules/index.js\";\nimport { ttBehaviorsModule } from \"./behaviors/index.js\";\nimport { ttPaletteModule } from \"./palette/index.js\";\nimport { ttContextPadModule } from \"./context-pad/index.js\";\nimport { ttLabelEditingModule } from \"./label-editing/index.js\";\nimport { ttKeyboardModule } from \"./keyboard/index.js\";\nimport { ttZOrderModule } from \"./zorder/index.js\";\n\n/**\n * Full Team Topologies editor: palette/create, move, resize, connect with\n * rules, context pad, inline label editing, undo/redo.\n */\nexport class Modeler extends NavigatedViewer {\n protected override _getModules(): ModuleDeclaration[] {\n return [\n ...super._getModules(),\n // diagram-js stock\n ModelingModule,\n MoveModule,\n OutlineModule,\n ResizeModule,\n // Team Topologies editor\n ttModelingModule,\n ttRulesModule,\n ttBehaviorsModule,\n ttPaletteModule,\n ttContextPadModule,\n ttLabelEditingModule,\n ttKeyboardModule,\n ttZOrderModule,\n ];\n }\n\n undo(): void {\n this.get<CommandStack>(\"commandStack\").undo();\n }\n\n redo(): void {\n this.get<CommandStack>(\"commandStack\").redo();\n }\n\n canUndo(): boolean {\n return this.get<CommandStack>(\"commandStack\").canUndo();\n }\n\n canRedo(): boolean {\n return this.get<CommandStack>(\"commandStack\").canRedo();\n }\n}\n"],"names":["kindOf","el","isTtElement","isTtTeam","isTtInteraction","isTtFlow","MARGIN","saveSVG","canvas","elementRegistry","source","minX","minY","maxX","maxY","s","x","y","width","height","clone","viewport","ROOT_ID","sizeToCss","value","TtBaseViewer","options","container","modules","Diagram","name","event","callback","priority","doc","diagram","eventBus","importer","warnings","partial","root","current","topInset","pad","registry","e","rect","W","H","cw","ch","target","TtElementFactory","elementFactory","node","shape","type","label","spec","TEAM_TYPE_SPECS","newId","mode","INTERACTION_MODE_SPECS","FLOW_SPEC","ttModelModule","TT_RENDER_PRIORITY","INK","INK_SOFT","FONT","TeamTopologiesRenderer","BaseRenderer","element","visuals","svgAttr","svgCreate","svgAppend","team","w","h","sw","dash","dashArray","outline","kind","attrs","i","iw","ih","c","octagon","rx","common","glyph","pts","skew","head","shaft","top","bot","p","arrow","text","fontSize","lines","wrapLabel","lineHeight","startY","ln","idx","t","maxWidth","maxChars","words","cur","word","candidate","ttDrawModule","TtImporter","factory","existing","flow","interaction","TtExporter","meta","nodes","interactions","flows","geom","position","size","DOCUMENT_VERSION","ioModule","Viewer","NavigatedViewer","SelectionModule","ZoomScrollModule","MoveCanvasModule","setOrDelete","obj","key","UpdatePropertiesHandler","context","properties","old","oldProperties","UPDATE_PROPERTIES","TtModeling","commandStack","teamType","fill","stroke","description","ttModelingModule","TtRules","RuleProvider","ttRulesModule","RulesModule","TtFlatModelBehavior","CommandInterceptor","ttBehaviorsModule","svg","inner","teamIconSvg","flowIconSvg","interactionIconSvg","GROUP_TEAMS","GROUP_MODES","GROUP_FLOW","entryHtml","icon","title","TtPaletteProvider","palette","create","entries","ALL_TEAM_SPECS","start","ALL_INTERACTION_SPECS","startFlow","ttPaletteModule","PaletteModule","CreateModule","ICON_EDIT","ICON_DELETE","iconMarkup","path","cpHtml","TtContextPadProvider","contextPad","modeling","labelEditing","ttContextPadModule","ContextPadModule","TtLabelEditing","scale","vb","cx","cy","left","input","done","cleanup","onKey","onBlur","commit","changed","ttLabelEditingModule","isTypingTarget","TtKeyboard","selection","cmd","sel","ttKeyboardModule","tier","TtZOrder","ordered","a","b","wrapper","layer","ttZOrderModule","Modeler","ModelingModule","MoveModule","OutlineModule","ResizeModule"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@miragon/team-topologies-renderer",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Render and edit Team Topologies diagrams in the browser, with a framework-agnostic viewer and modeler built on diagram-js.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "git+https://github.com/
|
|
8
|
+
"url": "git+https://github.com/Miragon/team-topologies-modeler.git",
|
|
9
9
|
"directory": "packages/renderer"
|
|
10
10
|
},
|
|
11
|
-
"homepage": "https://github.com/
|
|
12
|
-
"bugs": "https://github.com/
|
|
11
|
+
"homepage": "https://github.com/Miragon/team-topologies-modeler/tree/main/packages/renderer#readme",
|
|
12
|
+
"bugs": "https://github.com/Miragon/team-topologies-modeler/issues",
|
|
13
13
|
"type": "module",
|
|
14
14
|
"sideEffects": [
|
|
15
15
|
"**/*.css"
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"test:browser": "npm --prefix ../.. run test:browser"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@miragon/team-topologies-schema-model": "0.1
|
|
40
|
+
"@miragon/team-topologies-schema-model": "0.3.1",
|
|
41
41
|
"diagram-js": "15.16.0",
|
|
42
42
|
"didi": "11.0.0",
|
|
43
43
|
"tiny-svg": "4.1.4"
|