prince-ui-bpmn 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.css +434 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +284 -0
- package/dist/index.js +1173 -0
- package/dist/index.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme/diagram-theme.ts","../src/theme/apple-renderer.ts","../src/viewer/status.ts","../src/viewer/overlays.ts","../src/viewer/BpmnViewer.tsx","../src/editor/lintConfig.ts","../src/editor/lintHints.ts","../src/editor/ErrorPanel.tsx","../src/editor/parseBpmnElements.ts","../src/editor/BpmnTableView.tsx","../src/editor/BpmnEditor.tsx"],"names":["jsxs","jsx","Button","useState","useRef","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Theme-Bridge für bpmn-js/diagram-js.\n *\n * SVG-Diagramme von bpmn.io werden NICHT über CSS gethemt, sondern über die\n * Renderer-Config (`bpmnRenderer`/`textRenderer`). Diese Bridge liest die\n * prince-ui-Tokens (`--prn-*`) vom Dokument und liefert konkrete Farbwerte —\n * ersetzt das frühere `data-sap-theme`-Coupling aus finops/maco-process-studio.\n *\n * Kolokiert je Paket (kein geteiltes 4. Paket) — das dmn-Paket hält eine Kopie.\n */\n\nimport type { DiagramColorScheme } from \"../types\";\n\nexport interface DiagramColors {\n /** Füllfarbe der Shapes */\n defaultFillColor: string;\n /** Konturfarbe der Shapes/Connections */\n defaultStrokeColor: string;\n /** Textfarbe der Labels */\n defaultLabelColor: string;\n /** Canvas-Hintergrund (für den umgebenden Container) */\n canvasBackground: string;\n /** Akzentfarbe (Selektion/aktive Elemente) */\n accent: string;\n}\n\n/** Liest einen CSS-Custom-Property-Wert vom `:root`, mit Fallback. */\nexport function readToken(name: string, fallback: string): string {\n if (typeof window === \"undefined\" || !document?.documentElement) return fallback;\n const value = getComputedStyle(document.documentElement)\n .getPropertyValue(name)\n .trim();\n return value || fallback;\n}\n\n/** Ermittelt, ob der Dark-Mode aktiv ist (data-theme bzw. System). */\nexport function isDarkMode(scheme: DiagramColorScheme = \"auto\"): boolean {\n if (scheme === \"dark\") return true;\n if (scheme === \"light\") return false;\n if (typeof document !== \"undefined\") {\n const attr = document.documentElement.getAttribute(\"data-theme\");\n // CU ist ein dunkler Surface → wie dark behandeln (Diagramm-Shapes dunkel).\n if (attr === \"dark\" || attr === \"cu\") return true;\n if (attr === \"light\") return false;\n }\n if (typeof window !== \"undefined\" && window.matchMedia) {\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n }\n return false;\n}\n\n/**\n * Liefert die Diagrammfarben aus den prince-ui-Tokens.\n * Fallbacks entsprechen den Token-Defaults aus `packages/tokens/src/tokens.css`.\n */\nexport function getDiagramColors(scheme: DiagramColorScheme = \"auto\"): DiagramColors {\n const dark = isDarkMode(scheme);\n return {\n defaultFillColor: readToken(\"--prn-bg-elevated\", dark ? \"#1c1c1e\" : \"#ffffff\"),\n defaultStrokeColor: readToken(\"--prn-label\", dark ? \"#e4e4e6\" : \"#1d1d1f\"),\n defaultLabelColor: readToken(\"--prn-label\", dark ? \"#e4e4e6\" : \"#1d1d1f\"),\n canvasBackground: readToken(\"--prn-bg\", dark ? \"#000000\" : \"#f5f5f7\"),\n accent: readToken(\"--prn-accent\", \"#a0d22b\"),\n };\n}\n\n/**\n * Beobachtet `data-theme`-Wechsel am `<html>` und ruft `onChange` auf.\n * Gibt eine Cleanup-Funktion zurück.\n */\nexport function onThemeChange(onChange: () => void): () => void {\n if (typeof window === \"undefined\" || !window.MutationObserver) return () => {};\n const observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n if (m.type === \"attributes\" && m.attributeName === \"data-theme\") {\n onChange();\n return;\n }\n }\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"data-theme\"],\n });\n\n let media: MediaQueryList | undefined;\n if (window.matchMedia) {\n media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n media.addEventListener?.(\"change\", onChange);\n }\n\n return () => {\n observer.disconnect();\n media?.removeEventListener?.(\"change\", onChange);\n };\n}\n","/**\n * Apple-Look-Custom-Renderer (diagram-js `additionalModules`).\n *\n * Erbt vom `BpmnRenderer`, delegiert für alle Typen an die Original-Zeichenroutine\n * (Geometrie/Hit-Boxes/Bendpoints bleiben unangetastet) und passt nur die weiche\n * Optik nachträglich an: stärkere Eck-Rundung bei Tasks, Hairline-Stroke, dezenter\n * Schatten. Reines SVG — unabhängig vom Icon-Font.\n *\n * Wird als Factory exportiert, damit `bpmn-js` per Dynamic Import geladen werden\n * kann (kein Top-Level-Import der Engine im Paket-Entry).\n */\n\nimport type { DiagramColors } from \"./diagram-theme\";\n\n/** Apple-Systemschrift-Stack (SF Pro), passend zum `--prn-font`-Token. */\nconst APPLE_FONT =\n '-apple-system, BlinkMacSystemFont, \"SF Pro Text\", system-ui, \"Helvetica Neue\", sans-serif';\n\n/** Baut die `bpmnRenderer`/`textRenderer`-Config aus den Token-Farben.\n * Setzt zusätzlich SF-Pro auf alle Diagramm-Labels (interne + externe), damit\n * die Beschriftungen nicht in der bpmn-js-Default-Schrift erscheinen. */\nexport function buildRendererConfig(colors: DiagramColors) {\n const labelStyle = {\n fill: colors.defaultLabelColor,\n fontFamily: APPLE_FONT,\n fontSize: 12,\n fontWeight: 500,\n };\n return {\n bpmnRenderer: {\n defaultFillColor: colors.defaultFillColor,\n defaultStrokeColor: colors.defaultStrokeColor,\n defaultLabelColor: colors.defaultLabelColor,\n },\n textRenderer: {\n defaultStyle: labelStyle,\n externalStyle: labelStyle,\n },\n };\n}\n\n/**\n * Erzeugt das `additionalModules`-Eintrag-Objekt für den Apple-Look-Renderer.\n * `BpmnRenderer` wird injiziert (per Dynamic Import geladen), damit der Paket-Entry\n * frei von bpmn-js-Top-Level-Imports bleibt.\n */\nexport function createAppleRendererModule(BpmnRenderer: new (...args: unknown[]) => unknown) {\n /**\n * @constructor\n * Höhere Render-Priorität (1500) als der Default-BpmnRenderer (1000),\n * damit `canRender`/`drawShape` zuerst greifen und wir an `super` delegieren.\n */\n function AppleRenderer(this: Record<string, unknown>, ...args: unknown[]) {\n // args: eventBus, styles, pathMap, canvas, textRenderer, ... (bpmn-js-Reihenfolge)\n Reflect.apply(BpmnRenderer as unknown as (...a: unknown[]) => void, this, args);\n }\n\n AppleRenderer.prototype = Object.create((BpmnRenderer as unknown as { prototype: object }).prototype);\n AppleRenderer.prototype.constructor = AppleRenderer;\n\n // canRender: nur Standard-BPMN-Elemente; an super delegieren.\n AppleRenderer.prototype.canRender = function canRender(this: Record<string, unknown>, element: unknown) {\n const parentProto = Object.getPrototypeOf(AppleRenderer.prototype);\n return parentProto.canRender.call(this, element);\n };\n\n // drawShape: super zeichnen lassen, danach Apple-Feinschliff anwenden.\n AppleRenderer.prototype.drawShape = function drawShape(\n this: Record<string, unknown>,\n parentNode: SVGElement,\n element: { type?: string; width?: number; height?: number },\n ) {\n const parentProto = Object.getPrototypeOf(AppleRenderer.prototype);\n const gfx = parentProto.drawShape.call(this, parentNode, element) as SVGElement | undefined;\n\n try {\n const type = element.type ?? \"\";\n // Task-/Activity-Rechtecke runder (Apple-Card-Radius).\n if (type.includes(\"Task\") || type.includes(\"SubProcess\") || type.includes(\"CallActivity\")) {\n const rect = parentNode.querySelector(\"rect\");\n if (rect) {\n rect.setAttribute(\"rx\", \"12\");\n rect.setAttribute(\"ry\", \"12\");\n }\n }\n // Dünne Hairline-Konturen auf der Hauptform (statt 2px-Stock-Linien).\n const main = (gfx ?? parentNode) as SVGElement;\n const stroke = main.querySelector?.(\"rect, circle, polygon, path\") as SVGElement | null;\n if (stroke && stroke.getAttribute(\"stroke-width\") === \"2\") {\n stroke.setAttribute(\"stroke-width\", \"1.5\");\n }\n // Dezenter Apple-Schatten auf der gesamten Form (nicht auf Labels/Connections).\n const isLabel = type === \"label\";\n if (!isLabel && main?.style) {\n main.style.filter = \"drop-shadow(0 1px 2px rgba(0, 0, 0, 0.12))\";\n }\n } catch {\n /* defensiv — Optik darf das Rendern nie brechen */\n }\n\n return gfx;\n };\n\n // drawConnection: super zeichnen lassen, danach Pfeile/Linien verschlanken.\n AppleRenderer.prototype.drawConnection = function drawConnection(\n this: Record<string, unknown>,\n parentNode: SVGElement,\n element: unknown,\n ) {\n const parentProto = Object.getPrototypeOf(AppleRenderer.prototype);\n const gfx = parentProto.drawConnection.call(this, parentNode, element) as SVGElement | undefined;\n try {\n const main = (gfx ?? parentNode) as SVGElement;\n const path = main.querySelector?.(\"path\") as SVGElement | null;\n if (path && path.getAttribute(\"stroke-width\") === \"2\") {\n path.setAttribute(\"stroke-width\", \"1.5\");\n }\n } catch {\n /* defensiv */\n }\n return gfx;\n };\n\n // $inject muss exakt dem BpmnRenderer entsprechen, damit DI die Args füllt.\n AppleRenderer.$inject = (BpmnRenderer as unknown as { $inject?: string[] }).$inject ?? [\n \"config.bpmnRenderer\",\n \"eventBus\",\n \"styles\",\n \"pathMap\",\n \"canvas\",\n \"textRenderer\",\n ];\n\n return {\n __init__: [\"appleRenderer\"],\n appleRenderer: [\"type\", AppleRenderer],\n };\n}\n","/**\n * Reine Logik für das Status/Historie-Highlighting des BpmnViewers.\n *\n * Ersetzt das fragile imperative SVG-Recoloring aus finops `BpmnDiagram.tsx`\n * durch pure, getestete Funktionen:\n * - Activity↔Element-Matching (direkt, case-insensitive, Name-Matching für CallActivities)\n * - Status-Ableitung aus History/Incidents/Runtime\n * - Status→Token-Mapping\n * - Sequenzfluss-„ausgeführt\"-Erkennung\n *\n * Das DOM/Overlay-/Marker-Setup baut darauf auf (siehe `overlays.ts`).\n */\n\nimport type {\n ActivityStatus,\n HistoryActivityInstance,\n Incident,\n} from \"../types\";\n\n/** Minimaler Ausschnitt eines diagram-js-Elements, den die Logik braucht. */\nexport interface DiagramElementLike {\n id: string;\n type?: string;\n businessObject?: {\n id?: string;\n name?: string;\n $type?: string;\n sourceRef?: { id?: string };\n targetRef?: { id?: string };\n };\n}\n\n/** Status→prince-ui-Token (CSS-Custom-Property-Name). */\nexport const STATUS_TOKEN: Record<ActivityStatus, string> = {\n active: \"--prn-blue\",\n completed: \"--prn-green\",\n incident: \"--prn-red\",\n canceled: \"--prn-orange\",\n};\n\n/** Deutsche Kurzbezeichnung je Status (für Tooltips/Legende/A11y). */\nexport const STATUS_LABEL: Record<ActivityStatus, string> = {\n active: \"Aktiv\",\n completed: \"Abgeschlossen\",\n incident: \"Fehler\",\n canceled: \"Abgebrochen\",\n};\n\n/**\n * Baut eine Lookup-Map über alle Matching-Schlüssel einer Aktivität:\n * `activityId`, `id` und (lowercased) `activityName`. Mehrere History-Einträge\n * derselben `activityId` werden zusammengeführt (jüngster „gewinnt\" beim Status).\n */\nexport function buildActivityMap(\n activities: HistoryActivityInstance[],\n): Map<string, HistoryActivityInstance> {\n const map = new Map<string, HistoryActivityInstance>();\n for (const activity of activities) {\n if (activity.activityId) {\n map.set(activity.activityId, activity);\n if (activity.id && activity.id !== activity.activityId) {\n map.set(activity.id, activity);\n }\n } else if (activity.id) {\n map.set(activity.id, activity);\n }\n if (activity.activityName) {\n const key = activity.activityName.toLowerCase().trim();\n if (key && !map.has(key)) map.set(key, activity);\n }\n }\n return map;\n}\n\n/** Ermittelt, welche `activityId`s mehrfach durchlaufen wurden (Retry/Loop). */\nexport function findMultiExecutionIds(\n activities: HistoryActivityInstance[],\n): Set<string> {\n const counts = new Map<string, number>();\n for (const a of activities) {\n if (a.activityId) counts.set(a.activityId, (counts.get(a.activityId) ?? 0) + 1);\n }\n const multi = new Set<string>();\n for (const [id, count] of counts) if (count > 1) multi.add(id);\n return multi;\n}\n\n/** Ist das Element ein Flow-Knoten (Task/Event/Gateway/CallActivity)? */\nexport function isFlowNode(element: DiagramElementLike): boolean {\n const type = element.type ?? element.businessObject?.$type ?? \"\";\n return (\n type.includes(\"Task\") ||\n type.includes(\"Event\") ||\n type.includes(\"Gateway\") ||\n type.includes(\"CallActivity\") ||\n type.includes(\"SubProcess\")\n );\n}\n\n/** Ist das Element ein Sequenzfluss? */\nexport function isSequenceFlow(element: DiagramElementLike): boolean {\n const type = element.type ?? element.businessObject?.$type ?? \"\";\n return type === \"bpmn:SequenceFlow\";\n}\n\n/**\n * Matcht ein Diagramm-Element auf einen History-Eintrag.\n * Strategien (in Reihenfolge): direktes ID-Matching, case-insensitive,\n * Name-Matching für CallActivities.\n */\nexport function matchActivity(\n element: DiagramElementLike,\n map: Map<string, HistoryActivityInstance>,\n): HistoryActivityInstance | null {\n const elementId = element.id ?? element.businessObject?.id;\n const boId = element.businessObject?.id ?? element.id;\n if (!elementId) return null;\n\n if (map.has(elementId)) return map.get(elementId)!;\n if (boId && map.has(boId)) return map.get(boId)!;\n\n const lowerId = elementId.toLowerCase();\n for (const [key, activity] of map) {\n if (\n key.toLowerCase() === lowerId ||\n activity.activityId?.toLowerCase() === lowerId\n ) {\n return activity;\n }\n }\n\n const type = element.type ?? element.businessObject?.$type ?? \"\";\n if (type.includes(\"CallActivity\") || type.includes(\"Call\")) {\n const name = element.businessObject?.name?.toLowerCase().trim();\n if (name) {\n if (map.has(name)) return map.get(name)!;\n for (const activity of map.values()) {\n if (\n activity.activityName?.toLowerCase().trim() === name ||\n activity.activityId?.toLowerCase().trim() === name\n ) {\n return activity;\n }\n }\n }\n }\n return null;\n}\n\n/** Liegt für die gegebenen IDs ein Incident vor? */\nexport function hasIncident(\n ids: Array<string | null | undefined>,\n incidents: Incident[],\n): boolean {\n const set = new Set(ids.filter(Boolean) as string[]);\n if (set.size === 0) return false;\n return incidents.some(\n (i) =>\n (i.activityId != null && set.has(i.activityId)) ||\n (i.failedActivityId != null && set.has(i.failedActivityId)),\n );\n}\n\nexport interface StatusContext {\n incidents: Incident[];\n runtimeActiveActivityIds?: Set<string>;\n multiExecutionIds?: Set<string>;\n}\n\n/**\n * Leitet den Status eines Elements aus History + Incidents + Runtime ab.\n * Priorität: Incident > Runtime-aktiv > abgeschlossen > History-aktiv > abgebrochen.\n * Gibt `null` für „nicht ausgeführt\" zurück.\n */\nexport function deriveStatus(\n element: DiagramElementLike,\n activity: HistoryActivityInstance | null,\n ctx: StatusContext,\n): { status: ActivityStatus; isMultiExecution: boolean } | null {\n const elementId = element.id ?? element.businessObject?.id ?? \"\";\n const activityId = activity?.activityId ?? undefined;\n const ids = [elementId, activityId];\n\n if (hasIncident(ids, ctx.incidents)) {\n return { status: \"incident\", isMultiExecution: false };\n }\n\n const runtimeActive =\n ctx.runtimeActiveActivityIds != null &&\n ids.some((id) => id != null && ctx.runtimeActiveActivityIds!.has(id));\n if (runtimeActive) return { status: \"active\", isMultiExecution: false };\n\n if (!activity) return null;\n\n const isCanceled = activity.cancelTime != null || activity.canceled === true;\n const isMultiExecution =\n (ctx.multiExecutionIds?.has(activity.activityId ?? elementId) ?? false);\n\n if (activity.startTime && activity.endTime && !isCanceled) {\n return { status: \"completed\", isMultiExecution };\n }\n if (activity.startTime && !activity.endTime && !isCanceled) {\n return { status: \"active\", isMultiExecution: false };\n }\n if (activity.startTime && isCanceled) {\n return { status: \"canceled\", isMultiExecution: false };\n }\n return null;\n}\n\n/**\n * Ein Sequenzfluss gilt als ausgeführt, wenn die Quell-Aktivität beendet\n * (und nicht abgebrochen) ist und die Ziel-Aktivität gestartet wurde.\n */\nexport function isSequenceFlowExecuted(\n element: DiagramElementLike,\n map: Map<string, HistoryActivityInstance>,\n): boolean {\n const sourceId = element.businessObject?.sourceRef?.id;\n const targetId = element.businessObject?.targetRef?.id;\n if (!sourceId || !targetId) return false;\n\n const source = matchActivity({ id: sourceId, businessObject: { id: sourceId } }, map);\n const target = matchActivity({ id: targetId, businessObject: { id: targetId } }, map);\n\n return Boolean(\n source?.endTime && !source.cancelTime && target?.startTime,\n );\n}\n\nexport interface ElementStatusEntry {\n elementId: string;\n status: ActivityStatus;\n token: string;\n label: string;\n isMultiExecution: boolean;\n activity: HistoryActivityInstance | null;\n}\n\n/**\n * Berechnet den Status aller Flow-Knoten aus den gegebenen Elementen.\n * Reines Mapping — kein DOM-Zugriff. Die Komponente übersetzt das Ergebnis\n * in diagram-js-Marker + Overlays.\n */\nexport function computeElementStatuses(\n elements: DiagramElementLike[],\n activities: HistoryActivityInstance[],\n options: {\n incidents?: Incident[];\n runtimeActiveActivityIds?: string[];\n } = {},\n): ElementStatusEntry[] {\n const incidents = options.incidents ?? [];\n const runtimeActive = options.runtimeActiveActivityIds\n ? new Set(options.runtimeActiveActivityIds)\n : undefined;\n const map = buildActivityMap(activities);\n const multiExecutionIds = findMultiExecutionIds(activities);\n const ctx: StatusContext = { incidents, runtimeActiveActivityIds: runtimeActive, multiExecutionIds };\n\n const result: ElementStatusEntry[] = [];\n for (const element of elements) {\n if (!isFlowNode(element)) continue;\n const elementId = element.id ?? element.businessObject?.id;\n if (!elementId) continue;\n const activity = matchActivity(element, map);\n const derived = deriveStatus(element, activity, ctx);\n if (!derived) continue;\n result.push({\n elementId,\n status: derived.status,\n token: STATUS_TOKEN[derived.status],\n label: STATUS_LABEL[derived.status],\n isMultiExecution: derived.isMultiExecution,\n activity,\n });\n }\n return result;\n}\n\n/** Liefert die IDs aller ausgeführten Sequenzflüsse. */\nexport function computeExecutedFlows(\n elements: DiagramElementLike[],\n activities: HistoryActivityInstance[],\n): string[] {\n const map = buildActivityMap(activities);\n const result: string[] = [];\n for (const element of elements) {\n if (!isSequenceFlow(element)) continue;\n const id = element.id ?? element.businessObject?.id;\n if (id && isSequenceFlowExecuted(element, map)) result.push(id);\n }\n return result;\n}\n","/**\n * Overlay-/Marker-Aufbau für das Status-Highlighting.\n *\n * Statt der Hauptform imperativ ein `fill` zu setzen (fragil, bricht bei\n * Theme/Renderer-Wechsel), arbeiten wir deklarativ:\n * - ein diagram-js *Marker* (CSS-Klasse `prn-bpmn-status-<status>`) auf dem\n * Element → CSS in `viewer.css` färbt Kontur/Füllung tokenbasiert,\n * - ein optionales *Overlay* (kleiner Status-Punkt) oben rechts am Element.\n *\n * Die Funktionen hier sind rein bis auf das Erzeugen von DOM-Knoten über ein\n * injiziertes `Document` — dadurch in jsdom testbar.\n */\n\nimport type { ActivityStatus } from \"../types\";\nimport { STATUS_LABEL } from \"./status\";\n\n/** CSS-Klasse, die als diagram-js-Marker gesetzt wird. */\nexport function statusMarker(status: ActivityStatus): string {\n return `prn-bpmn-status-${status}`;\n}\n\n/** Marker für mehrfach durchlaufene (heller dargestellte) Elemente. */\nexport const MULTI_EXECUTION_MARKER = \"prn-bpmn-status-multi\";\n\n/** Marker für ausgeführte Sequenzflüsse. */\nexport const FLOW_EXECUTED_MARKER = \"prn-bpmn-flow-executed\";\n\n/** Alle möglichen Marker-Klassen (für sauberes Aufräumen vor Re-Apply). */\nexport function allStatusMarkers(): string[] {\n const statuses: ActivityStatus[] = [\"active\", \"completed\", \"incident\", \"canceled\"];\n return [...statuses.map(statusMarker), MULTI_EXECUTION_MARKER];\n}\n\n/**\n * Baut den DOM-Knoten für das kleine Status-Overlay (Punkt + a11y-Label).\n * `doc` wird injiziert, damit die Funktion in jsdom getestet werden kann.\n */\nexport function buildStatusOverlay(\n status: ActivityStatus,\n doc: Document = document,\n): HTMLElement {\n const el = doc.createElement(\"div\");\n el.className = `prn-bpmn-overlay prn-bpmn-overlay-${status}`;\n el.setAttribute(\"role\", \"img\");\n el.setAttribute(\"aria-label\", STATUS_LABEL[status]);\n el.title = STATUS_LABEL[status];\n return el;\n}\n\n/** Standardposition des Status-Overlays relativ zum Element (oben rechts). */\nexport const STATUS_OVERLAY_POSITION = { top: -6, right: -6 } as const;\n","/**\n * `<BpmnViewer>` — read-only BPMN-Anzeige mit Status/Historie-Highlighting.\n *\n * Kapselt `bpmn-js/lib/NavigatedViewer` (per Dynamic Import — der Paket-Entry\n * bleibt frei von bpmn-js-Top-Level-Imports). Status wird **deklarativ** über\n * diagram-js-Marker (CSS-Klassen, tokenbasiert in `viewer.css`) + Overlays\n * gesetzt — kein imperatives SVG-Recoloring mehr.\n *\n * Theming läuft über die Renderer-Config (`getDiagramColors`), nicht über CSS;\n * `data-theme`-Wechsel triggert via `onThemeChange` einen Remount.\n *\n * Die Komponente bringt ihre eigene Höhe + `ResizeObserver` mit — der Canvas\n * darf nie in einen auto-höhenden Container gewickelt werden.\n */\n\nimport { useEffect, useRef, useState, useCallback } from \"react\";\nimport { Button } from \"prince-ui\";\nimport type {\n BpmnElementClick,\n DiagramColorScheme,\n HistoryActivityInstance,\n Incident,\n} from \"../types\";\nimport { getDiagramColors, onThemeChange } from \"../theme/diagram-theme\";\nimport { buildRendererConfig, createAppleRendererModule } from \"../theme/apple-renderer\";\nimport {\n computeElementStatuses,\n computeExecutedFlows,\n type DiagramElementLike,\n} from \"./status\";\nimport {\n statusMarker,\n buildStatusOverlay,\n allStatusMarkers,\n MULTI_EXECUTION_MARKER,\n FLOW_EXECUTED_MARKER,\n STATUS_OVERLAY_POSITION,\n} from \"./overlays\";\nimport \"./viewer.css\";\n\nexport interface BpmnViewerProps {\n /** Das anzuzeigende BPMN 2.0 XML. */\n xml: string;\n /** Camunda-7-History-Einträge zur Status-Färbung. */\n activityHistory?: HistoryActivityInstance[];\n /** Camunda-7-Incidents (färben das betroffene Element rot). */\n incidents?: Incident[];\n /** IDs der zur Laufzeit aktiven Aktivitäten (überschreiben History → blau). */\n runtimeActiveActivityIds?: string[];\n /** Light/Dark-Steuerung. Default `auto` (folgt `data-theme`). */\n colorScheme?: DiagramColorScheme;\n /** Klick auf ein Element. */\n onElementClick?: (event: BpmnElementClick) => void;\n /** Bei Container-Resize automatisch neu einpassen. Default `true`. */\n fitOnResize?: boolean;\n /** Zoom-Steuerung (Buttons) anzeigen. Default `true`. */\n showZoomControls?: boolean;\n /** Höhe des Containers. Default `\"100%\"`. Canvas braucht eine feste Höhe. */\n height?: string | number;\n /** Optionaler Klassennamen-Override für den äußeren Container. */\n className?: string;\n}\n\ninterface ViewerInstance {\n importXML(xml: string): Promise<{ warnings: string[] }>;\n destroy(): void;\n get(service: string): unknown;\n}\n\n/**\n * Apple-styled, read-only BPMN-Viewer mit deklarativem Status-Highlighting.\n */\nexport function BpmnViewer({\n xml,\n activityHistory,\n incidents,\n runtimeActiveActivityIds,\n colorScheme = \"auto\",\n onElementClick,\n fitOnResize = true,\n showZoomControls = true,\n height = \"100%\",\n className,\n}: BpmnViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<ViewerInstance | null>(null);\n const overlayIdsRef = useRef<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [themeTick, setThemeTick] = useState(0);\n\n // latest props in refs so the highlight-effect can reuse the loaded viewer\n // without re-importing the XML.\n const onElementClickRef = useRef(onElementClick);\n onElementClickRef.current = onElementClick;\n\n useEffect(() => onThemeChange(() => setThemeTick((t) => t + 1)), []);\n\n /** Marker + Overlays aus den puren Status-Funktionen anwenden. */\n const applyHighlighting = useCallback(() => {\n const viewer = viewerRef.current;\n if (!viewer) return;\n try {\n const elementRegistry = viewer.get(\"elementRegistry\") as {\n getAll(): DiagramElementLike[];\n get(id: string): unknown;\n };\n const canvas = viewer.get(\"canvas\") as {\n addMarker(id: string, cls: string): void;\n removeMarker(id: string, cls: string): void;\n };\n const overlays = viewer.get(\"overlays\") as {\n add(id: string, cfg: unknown): string;\n remove(id: string): void;\n };\n\n // 1. Aufräumen: alte Marker + Overlays entfernen.\n const all = elementRegistry.getAll();\n const markers = [...allStatusMarkers(), FLOW_EXECUTED_MARKER];\n for (const el of all) {\n if (!el.id) continue;\n for (const m of markers) canvas.removeMarker(el.id, m);\n }\n for (const oid of overlayIdsRef.current) {\n try {\n overlays.remove(oid);\n } catch {\n /* ignore */\n }\n }\n overlayIdsRef.current = [];\n\n // 2. Status-Marker + Overlays setzen.\n const statuses = computeElementStatuses(all, activityHistory ?? [], {\n incidents,\n runtimeActiveActivityIds,\n });\n const doc = containerRef.current?.ownerDocument ?? document;\n for (const entry of statuses) {\n canvas.addMarker(entry.elementId, statusMarker(entry.status));\n if (entry.isMultiExecution) {\n canvas.addMarker(entry.elementId, MULTI_EXECUTION_MARKER);\n }\n try {\n const id = overlays.add(entry.elementId, {\n position: STATUS_OVERLAY_POSITION,\n html: buildStatusOverlay(entry.status, doc),\n });\n overlayIdsRef.current.push(id);\n } catch {\n /* element may not be on canvas — ignore */\n }\n }\n\n // 3. Ausgeführte Sequenzflüsse markieren.\n const flows = computeExecutedFlows(all, activityHistory ?? []);\n for (const id of flows) canvas.addMarker(id, FLOW_EXECUTED_MARKER);\n } catch {\n /* highlighting is best-effort — never crash the viewer */\n }\n }, [activityHistory, incidents, runtimeActiveActivityIds]);\n\n // Viewer-Init + XML-Import. Remount bei xml/colorScheme/themeTick.\n useEffect(() => {\n let cancelled = false;\n setError(null);\n\n const init = async () => {\n if (!containerRef.current || !xml || !xml.trim()) return;\n\n // alten Viewer wegräumen\n if (viewerRef.current) {\n try {\n viewerRef.current.destroy();\n } catch {\n /* ignore */\n }\n viewerRef.current = null;\n }\n overlayIdsRef.current = [];\n\n const [{ default: NavigatedViewer }, { default: BpmnRenderer }] = await Promise.all([\n import(/* @vite-ignore */ \"bpmn-js/lib/NavigatedViewer\"),\n import(/* @vite-ignore */ \"bpmn-js/lib/draw/BpmnRenderer\"),\n ]);\n if (cancelled || !containerRef.current) return;\n\n const colors = getDiagramColors(colorScheme);\n const viewer = new NavigatedViewer({\n container: containerRef.current,\n additionalModules: [\n createAppleRendererModule(BpmnRenderer as new (...a: unknown[]) => unknown),\n ],\n ...buildRendererConfig(colors),\n }) as unknown as ViewerInstance;\n viewerRef.current = viewer;\n\n try {\n await viewer.importXML(xml);\n if (cancelled) return;\n\n // Klick-Handler\n const eventBus = viewer.get(\"eventBus\") as {\n on(event: string, cb: (e: Record<string, unknown>) => void): void;\n };\n eventBus.on(\"element.click\", (e) => {\n const element = e.element as DiagramElementLike | undefined;\n const original = e.originalEvent as MouseEvent | undefined;\n if (!element) return;\n const handler = onElementClickRef.current;\n if (!handler) return;\n handler({\n elementId: element.id ?? element.businessObject?.id ?? \"\",\n elementType: element.type ?? element.businessObject?.$type ?? \"\",\n businessObject: element.businessObject,\n screenPosition: original\n ? { x: original.clientX, y: original.clientY }\n : undefined,\n });\n });\n\n // Fit + Highlighting\n const canvas = viewer.get(\"canvas\") as { zoom(level: string | number): void };\n if (\n containerRef.current &&\n containerRef.current.clientWidth > 0 &&\n containerRef.current.clientHeight > 0\n ) {\n canvas.zoom(\"fit-viewport\");\n }\n applyHighlighting();\n } catch (e) {\n if (!cancelled) setError((e as Error).message);\n }\n };\n\n void init();\n return () => {\n cancelled = true;\n if (viewerRef.current) {\n try {\n viewerRef.current.destroy();\n } catch {\n /* ignore */\n }\n viewerRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [xml, colorScheme, themeTick]);\n\n // Re-Highlight bei Status-Datenänderung ohne Remount.\n useEffect(() => {\n applyHighlighting();\n }, [applyHighlighting]);\n\n // ResizeObserver → fit-viewport.\n useEffect(() => {\n if (!fitOnResize || !containerRef.current) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const ro = new ResizeObserver(() => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n try {\n (viewerRef.current?.get(\"canvas\") as { zoom(l: string): void } | undefined)?.zoom(\n \"fit-viewport\",\n );\n } catch {\n /* ignore */\n }\n }, 150);\n });\n ro.observe(containerRef.current);\n return () => {\n if (timer) clearTimeout(timer);\n ro.disconnect();\n };\n }, [fitOnResize]);\n\n const zoom = useCallback((factor: number | \"fit\") => {\n const canvas = viewerRef.current?.get(\"canvas\") as\n | { zoom(level?: string | number): number }\n | undefined;\n if (!canvas) return;\n try {\n if (factor === \"fit\") canvas.zoom(\"fit-viewport\");\n else canvas.zoom(canvas.zoom() * factor);\n } catch {\n /* ignore */\n }\n }, []);\n\n return (\n <div\n className={[\"prn-bpmn\", \"prn-bpmn-viewer\", className].filter(Boolean).join(\" \")}\n data-color-scheme={colorScheme}\n style={{ height }}\n >\n {showZoomControls && (\n <div className=\"prn-bpmn-zoom\" role=\"group\" aria-label=\"Zoom\">\n <Button variant=\"tinted\" aria-label=\"Hineinzoomen\" onPress={() => zoom(1.2)}>\n <span className=\"bpmn-icon-screen-fullscreen\" aria-hidden>+</span>\n </Button>\n <Button variant=\"tinted\" aria-label=\"Herauszoomen\" onPress={() => zoom(0.8)}>\n <span aria-hidden>−</span>\n </Button>\n <Button variant=\"tinted\" aria-label=\"Einpassen\" onPress={() => zoom(\"fit\")}>\n <span aria-hidden>⤢</span>\n </Button>\n </div>\n )}\n <div className=\"prn-bpmn-canvas\" ref={containerRef} />\n {error && (\n <div className=\"prn-bpmn-error\" role=\"alert\">\n BPMN konnte nicht geladen werden: {error}\n </div>\n )}\n </div>\n );\n}\n\nexport default BpmnViewer;\n","/**\n * bpmnlint-Konfiguration für den BpmnEditor.\n *\n * Die Regel-Module von `bpmnlint` werden im Editor **lazy** geladen und hier\n * über einen Resolver injiziert — so bleibt der Paket-Entry frei von\n * Top-Level-Engine-Imports. Portiert aus maco `BpmnEditor/lintConfig.ts`\n * (4 Regeln: label-required, no-disconnected, no-implicit-split, no-complex-gateway).\n */\n\n/** Ein einzelnes, flach normalisiertes Lint-Ergebnis aus bpmn-js-bpmnlint. */\nexport interface LintIssue {\n id: string;\n message: string;\n category: \"error\" | \"warning\";\n element?: string;\n}\n\n/** Severity je Regel. */\nexport type LintSeverity = \"error\" | \"warn\" | \"off\";\n\n/** Regel-Konfiguration: Regelname → Severity. */\nexport type LintRuleConfig = Record<string, LintSeverity>;\n\n/** Default-Regeln (MaKo-tauglich). */\nexport const DEFAULT_LINT_RULES: LintRuleConfig = {\n \"bpmnlint/label-required\": \"error\",\n \"bpmnlint/no-disconnected\": \"error\",\n \"bpmnlint/no-implicit-split\": \"warn\",\n \"bpmnlint/no-complex-gateway\": \"warn\",\n};\n\n/**\n * Baut das `linting.bpmnlint`-Konfigobjekt für den Modeler.\n * `rules` mappt vollqualifizierte Regelnamen auf die geladenen Regel-Module.\n */\nexport function buildLintConfig(\n ruleModules: Record<string, unknown>,\n rules: LintRuleConfig = DEFAULT_LINT_RULES,\n) {\n const ruleCache: Record<string, unknown> = {};\n for (const [name, mod] of Object.entries(ruleModules)) {\n ruleCache[`rule:${name}`] = mod;\n }\n\n return {\n config: { rules },\n resolver: {\n resolveRule(pkg: string, ruleName: string): unknown {\n const key = `rule:${pkg}/${ruleName}`;\n const resolved = ruleCache[key];\n if (!resolved) throw new Error(`unknown rule <${pkg}/${ruleName}>`);\n return resolved;\n },\n resolveConfig(_pkg: string, configName: string): unknown {\n throw new Error(`unknown config <${configName}>`);\n },\n },\n };\n}\n","/** Kuratierte, deutsche Erklärungen + Handlungsempfehlungen je bpmnlint-Regel.\n * Portiert aus maco `BpmnEditor/lintHints.ts`. */\nexport interface LintHint {\n title: string;\n explanation: string;\n howto: string;\n}\n\nconst HINTS: Record<string, LintHint> = {\n \"label-required\": {\n title: \"Beschriftung fehlt\",\n explanation:\n \"Aufgaben, Ereignisse und Gateways brauchen einen sprechenden Namen, damit der Prozess lesbar bleibt.\",\n howto: \"Element anklicken und im Properties-Panel unter „Name“ eine Beschriftung eintragen.\",\n },\n \"no-disconnected\": {\n title: \"Element nicht verbunden\",\n explanation:\n \"Ein Element ist über keine Sequenzfluss-Kante erreichbar — der Prozessfluss bricht ab.\",\n howto: \"Eine Verbindung (Pfeil) vom vorherigen Element hierher und/oder weiter zum nächsten ziehen.\",\n },\n \"no-implicit-split\": {\n title: \"Impliziter Split\",\n explanation:\n \"Ein Element hat mehrere ausgehende Sequenzflüsse ohne explizites Gateway — das Verzweigungsverhalten ist mehrdeutig.\",\n howto: \"Ein Gateway (exklusiv/parallel) einfügen und die ausgehenden Flüsse darüber führen.\",\n },\n \"no-complex-gateway\": {\n title: \"Komplexes Gateway\",\n explanation: \"Komplexe Gateways sind schwer verständlich und in den MaKo-Prozessen unerwünscht.\",\n howto: \"Durch exklusive (XOR) oder parallele (AND) Gateways ersetzen.\",\n },\n};\n\nconst FALLBACK: LintHint = {\n title: \"Validierungshinweis\",\n explanation: \"Der Linter hat ein Problem an diesem Element gemeldet.\",\n howto: \"Element prüfen und gemäß der Meldung korrigieren. Bei Unsicherheit den KI-Fix nutzen.\",\n};\n\nexport function lintHint(ruleId: string): LintHint {\n return HINTS[ruleId] ?? FALLBACK;\n}\n","/**\n * Validierungs-/Fehler-Panel (prince-ui). Listet bpmnlint-Befunde mit\n * kuratierten Hinweisen; Klick auf den Element-Link selektiert das Element,\n * optionaler KI-Fix-Button. Portiert aus maco `BpmnEditor/ErrorPanel.tsx`.\n */\nimport type { ReactNode } from \"react\";\nimport { Button, Link } from \"prince-ui\";\nimport { lintHint } from \"./lintHints\";\nimport type { LintIssue } from \"./lintConfig\";\nimport \"./editor.css\";\n\nexport interface ErrorPanelProps {\n issues: LintIssue[];\n /** Auflösung Element-ID → Anzeigename. */\n elementName: (elementId: string | undefined) => string;\n onSelectElement: (elementId: string) => void;\n /** Optionaler KI-Fix (z. B. Prompt an einen Agenten). */\n onKiFix?: () => void;\n onClose: () => void;\n /** Optionale zusätzliche Aktionen (App-Slot), rechts neben KI-Fix. */\n actionsSlot?: ReactNode;\n}\n\nexport function ErrorPanel({\n issues,\n elementName,\n onSelectElement,\n onKiFix,\n onClose,\n actionsSlot,\n}: ErrorPanelProps) {\n return (\n <div className=\"prn-bpmn-errorpanel\" role=\"region\" aria-label=\"Validierung\">\n <div className=\"prn-bpmn-errorpanel-head\">\n <strong>Validierung — {issues.length} Befund(e)</strong>\n <div className=\"prn-bpmn-errorpanel-actions\">\n {actionsSlot}\n {onKiFix && (\n <Button variant=\"tinted\" onPress={onKiFix} data-testid=\"ki-fix-all\">\n KI-Fix\n </Button>\n )}\n <Button variant=\"plain\" aria-label=\"Schließen\" onPress={onClose}>\n ✕\n </Button>\n </div>\n </div>\n <ul className=\"prn-bpmn-errorpanel-list\">\n {issues.map((issue, idx) => {\n const hint = lintHint(issue.id);\n const name = elementName(issue.element);\n return (\n <li\n key={`${issue.id}-${issue.element}-${idx}`}\n className=\"prn-bpmn-errorpanel-item\"\n data-category={issue.category}\n >\n <div className=\"prn-bpmn-errorpanel-title\">\n <span className=\"prn-bpmn-errorpanel-icon\" aria-hidden>\n {issue.category === \"error\" ? \"✕\" : \"⚠\"}\n </span>\n <span>{hint.title}</span>\n {issue.element && (\n <Link onPress={() => onSelectElement(issue.element as string)}>{name}</Link>\n )}\n </div>\n <p className=\"prn-bpmn-muted prn-bpmn-errorpanel-text\">{hint.explanation}</p>\n <p className=\"prn-bpmn-errorpanel-text\">➜ {hint.howto}</p>\n <p className=\"prn-bpmn-muted prn-bpmn-errorpanel-meta\">\n {issue.message} ({issue.id})\n </p>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\nexport default ErrorPanel;\n","/**\n * Pure BPMN-XML-Parser für die Tabellenansicht.\n * Liest alle Flow-Elemente (Tasks, Gateways, Events, …) + Lane-Zuordnung aus\n * dem XML. Reines DOMParser-Parsing — getestet ohne bpmn-js.\n */\n\nconst BPMN_NS = \"http://www.omg.org/spec/BPMN/20100524/MODEL\";\n\nexport const BPMN_ELEMENT_TYPES = [\n \"startEvent\",\n \"endEvent\",\n \"serviceTask\",\n \"userTask\",\n \"sendTask\",\n \"receiveTask\",\n \"manualTask\",\n \"businessRuleTask\",\n \"scriptTask\",\n \"task\",\n \"exclusiveGateway\",\n \"parallelGateway\",\n \"inclusiveGateway\",\n \"eventBasedGateway\",\n \"complexGateway\",\n \"intermediateCatchEvent\",\n \"intermediateThrowEvent\",\n \"boundaryEvent\",\n \"subProcess\",\n \"callActivity\",\n] as const;\n\nexport const BPMN_TYPE_LABEL: Record<string, string> = {\n startEvent: \"Start\",\n endEvent: \"Ende\",\n serviceTask: \"Service Task\",\n userTask: \"User Task\",\n sendTask: \"Send Task\",\n receiveTask: \"Receive Task\",\n manualTask: \"Manuell\",\n businessRuleTask: \"Business Rule\",\n scriptTask: \"Script\",\n task: \"Task\",\n exclusiveGateway: \"Gateway (XOR)\",\n parallelGateway: \"Gateway (AND)\",\n inclusiveGateway: \"Gateway (OR)\",\n eventBasedGateway: \"Gateway (Event)\",\n complexGateway: \"Gateway (komplex)\",\n intermediateCatchEvent: \"Ereignis (catch)\",\n intermediateThrowEvent: \"Ereignis (throw)\",\n boundaryEvent: \"Grenzereignis\",\n subProcess: \"Teilprozess\",\n callActivity: \"Call Activity\",\n};\n\nexport interface BpmnTableElement {\n id: string;\n type: string;\n name: string;\n lane: string;\n}\n\n/** prince-ui-Badge-Ton je Elementtyp. */\nexport function typeTone(\n type: string,\n): \"blue\" | \"green\" | \"red\" | \"orange\" | \"neutral\" {\n if (type.includes(\"Gateway\")) return \"orange\";\n if (type === \"startEvent\") return \"green\";\n if (type === \"endEvent\") return \"red\";\n if (type.includes(\"Task\")) return \"blue\";\n return \"neutral\";\n}\n\n/** Parst alle Flow-Elemente aus dem BPMN-XML (mit Lane-Zuordnung). */\nexport function parseBpmnElements(xml: string): BpmnTableElement[] {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n\n const laneMap: Record<string, string> = {};\n const lanes = doc.getElementsByTagNameNS(BPMN_NS, \"lane\");\n for (let i = 0; i < lanes.length; i++) {\n const lane = lanes[i];\n if (!lane) continue;\n const laneName = lane.getAttribute(\"name\") ?? \"\";\n const refs = lane.getElementsByTagNameNS(BPMN_NS, \"flowNodeRef\");\n for (let j = 0; j < refs.length; j++) {\n const refId = refs[j]?.textContent?.trim() ?? \"\";\n if (refId) laneMap[refId] = laneName;\n }\n }\n\n const elements: BpmnTableElement[] = [];\n for (const type of BPMN_ELEMENT_TYPES) {\n const nodes = doc.getElementsByTagNameNS(BPMN_NS, type);\n for (let i = 0; i < nodes.length; i++) {\n const el = nodes[i];\n if (!el) continue;\n const id = el.getAttribute(\"id\") ?? \"\";\n if (id) {\n elements.push({\n id,\n type,\n name: el.getAttribute(\"name\") ?? \"\",\n lane: laneMap[id] ?? \"\",\n });\n }\n }\n }\n return elements;\n}\n","/**\n * Tabellenansicht für BPMN-Prozessschritte (prince-ui).\n * Parst das BPMN-XML client-seitig (pure `parseBpmnElements`) und zeigt alle\n * Flow-Elemente als `AnalyticalTable` mit `SearchField` + `Badge` an.\n * Portiert aus maco `BpmnEditor/BpmnTableView.tsx` (UI5 → prince-ui).\n */\nimport { useMemo, useState } from \"react\";\nimport { AnalyticalTable, Badge, SearchField, type AnalyticalColumn } from \"prince-ui\";\nimport {\n parseBpmnElements,\n typeTone,\n BPMN_TYPE_LABEL,\n type BpmnTableElement,\n} from \"./parseBpmnElements\";\nimport \"./editor.css\";\n\nexport interface BpmnTableViewProps {\n /** BPMN 2.0 XML. */\n xml: string;\n /** Sichtbare Zeilen (Höhe der Tabelle). Default 30. */\n visibleRows?: number;\n /** Klassennamen-Override. */\n className?: string;\n}\n\ninterface BpmnRow extends BpmnTableElement {\n idx: number;\n}\n\nexport function BpmnTableView({ xml, visibleRows = 30, className }: BpmnTableViewProps) {\n const [search, setSearch] = useState(\"\");\n\n const elements = useMemo(() => parseBpmnElements(xml), [xml]);\n\n const filtered = useMemo(() => {\n if (!search.trim()) return elements;\n const q = search.toLowerCase();\n return elements.filter(\n (e) =>\n e.name.toLowerCase().includes(q) ||\n (BPMN_TYPE_LABEL[e.type] ?? e.type).toLowerCase().includes(q) ||\n e.lane.toLowerCase().includes(q) ||\n e.id.toLowerCase().includes(q),\n );\n }, [elements, search]);\n\n const columns = useMemo<AnalyticalColumn<BpmnRow>[]>(\n () => [\n {\n header: \"#\",\n accessorKey: \"idx\",\n width: \"56px\",\n disableFilters: true,\n cellRender: (row) => <span className=\"prn-bpmn-muted\">{row.idx}</span>,\n },\n {\n header: \"Typ\",\n accessorKey: \"type\",\n width: \"168px\",\n cellRender: (row) => (\n <Badge tone={typeTone(row.type)}>{BPMN_TYPE_LABEL[row.type] ?? row.type}</Badge>\n ),\n },\n {\n header: \"Name / Bezeichnung\",\n accessorKey: \"name\",\n cellRender: (row) =>\n row.name ? <span>{row.name}</span> : <span className=\"prn-bpmn-muted\">—</span>,\n },\n {\n header: \"Lane / Rolle\",\n accessorKey: \"lane\",\n cellRender: (row) => <span className=\"prn-bpmn-muted\">{row.lane}</span>,\n },\n {\n header: \"ID\",\n accessorKey: \"id\",\n cellRender: (row) => <span className=\"prn-bpmn-mono\">{row.id}</span>,\n },\n ],\n [],\n );\n\n const tableData = useMemo<BpmnRow[]>(\n () => filtered.map((el, idx) => ({ ...el, idx: idx + 1 })),\n [filtered],\n );\n\n return (\n <div className={[\"prn-bpmn-table\", className].filter(Boolean).join(\" \")}>\n <div className=\"prn-bpmn-table-bar\">\n <SearchField\n aria-label=\"Elemente durchsuchen\"\n placeholder=\"Suche nach Name, Typ, Lane, ID…\"\n value={search}\n onChange={setSearch}\n />\n <span className=\"prn-bpmn-muted prn-bpmn-table-count\">\n {filtered.length} / {elements.length} Elemente\n </span>\n </div>\n <div className=\"prn-bpmn-table-body\">\n <AnalyticalTable\n data={tableData}\n columns={columns}\n visibleRows={visibleRows}\n alternateRowColor\n selectionMode=\"none\"\n />\n </div>\n </div>\n );\n}\n\nexport default BpmnTableView;\n","/**\n * `<BpmnEditor>` — vollwertiger bpmn-js-Modeler im Apple-Look.\n *\n * - `bpmn-js/lib/Modeler` + Properties-Panel (eigener Container) +\n * bpmnlint (Regeln lazy geladen, ErrorPanel) + camunda-moddle.\n * - Apple-Look-Custom-Renderer (`additionalModules`, `super(eventBus, 1500)`),\n * delegiert an `BpmnRenderer`, passt nur Optik an.\n * - Original-bpmn.io-Icons in Palette/Context-Pad bleiben erhalten\n * (über `bpmn-font` aus `base.css`).\n * - Controlled (`value`/`onChange`) **oder** uncontrolled (`defaultValue`),\n * `onSave` via `saveXML({ format: true })`.\n * - `BpmnTableView` als Tabellen-Umschaltung integriert.\n * - Theme-Wechsel (`data-theme`) → Remount mit frischer Renderer-Config.\n *\n * Alle Engines werden per Dynamic Import geladen — der Paket-Entry bleibt\n * frei von bpmn-js-Top-Level-Imports (Code-Splitting).\n */\n\nimport { useEffect, useRef, useState, useCallback, type ReactNode } from \"react\";\nimport { Button, SegmentedControl, Segment, Notice } from \"prince-ui\";\nimport type { DiagramColorScheme } from \"../types\";\nimport { getDiagramColors, onThemeChange } from \"../theme/diagram-theme\";\nimport { buildRendererConfig, createAppleRendererModule } from \"../theme/apple-renderer\";\nimport {\n buildLintConfig,\n DEFAULT_LINT_RULES,\n type LintIssue,\n type LintRuleConfig,\n} from \"./lintConfig\";\nimport { ErrorPanel } from \"./ErrorPanel\";\nimport { BpmnTableView } from \"./BpmnTableView\";\nimport \"./editor.css\";\n\nexport interface BpmnEditorProps {\n /** Controlled BPMN-XML. Bei gesetztem `value` ist die Komponente controlled. */\n value?: string;\n /** Uncontrolled Initial-XML. */\n defaultValue?: string;\n /** Wird bei jeder Modell-Änderung mit dem aktuellen XML aufgerufen. */\n onChange?: (xml: string) => void;\n /** Speichern (z. B. ⌘S / Toolbar-Button) → erhält `saveXML({format:true})`. */\n onSave?: (xml: string) => void | Promise<void>;\n /** bpmnlint-Regeln (Default: 4 MaKo-Regeln). */\n lintRules?: LintRuleConfig;\n /** Element-Selektion (ID + Name). */\n onElementSelect?: (selection: { id: string; name?: string } | null) => void;\n /** Dirty-State (ungespeicherte Änderungen). */\n onDirtyChange?: (dirty: boolean) => void;\n /** App-Slot für Zusatzaktionen in der Toolbar (z. B. KI-Button). */\n actionsSlot?: ReactNode;\n /** App-Slot im ErrorPanel (z. B. KI-Fix-Handler stellt eigenen Button bereit). */\n onKiFix?: (issues: LintIssue[]) => void;\n /** Light/Dark. Default `auto`. */\n colorScheme?: DiagramColorScheme;\n /** Properties-Panel anzeigen. Default `true`. */\n propertiesPanel?: boolean;\n /** Minimap (Übersichtskarte) anzeigen. Default `true`. */\n minimap?: boolean;\n /** Camunda-Element-Templates (JSON-Array) — im Properties-Panel anwendbar. */\n elementTemplates?: unknown[];\n /** Höhe des Editors. Default `\"100%\"`. */\n height?: string | number;\n /** Klassennamen-Override. */\n className?: string;\n}\n\ninterface ModelerInstance {\n importXML(xml: string): Promise<{ warnings: string[] }>;\n saveXML(opts?: { format?: boolean }): Promise<{ xml: string }>;\n destroy(): void;\n get(service: string): unknown;\n}\n\nexport function BpmnEditor({\n value,\n defaultValue,\n onChange,\n onSave,\n lintRules = DEFAULT_LINT_RULES,\n onElementSelect,\n onDirtyChange,\n actionsSlot,\n onKiFix,\n colorScheme = \"auto\",\n propertiesPanel = true,\n minimap = true,\n elementTemplates,\n height = \"100%\",\n className,\n}: BpmnEditorProps) {\n const canvasRef = useRef<HTMLDivElement>(null);\n const propsRef = useRef<HTMLDivElement>(null);\n const modelerRef = useRef<ModelerInstance | null>(null);\n const isControlled = value !== undefined;\n\n const [error, setError] = useState<string | null>(null);\n const [lintIssues, setLintIssues] = useState<LintIssue[]>([]);\n const [errorPanelOpen, setErrorPanelOpen] = useState(false);\n const [view, setView] = useState<\"diagram\" | \"table\">(\"diagram\");\n const [tableXml, setTableXml] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [themeTick, setThemeTick] = useState(0);\n\n // latest callbacks in refs (avoid re-init on identity change)\n const cb = useRef({ onChange, onElementSelect, onDirtyChange });\n cb.current = { onChange, onElementSelect, onDirtyChange };\n // Element-Templates per Ref → Update ohne Modeler-Remount.\n const templatesRef = useRef(elementTemplates);\n templatesRef.current = elementTemplates;\n\n useEffect(() => onThemeChange(() => setThemeTick((t) => t + 1)), []);\n\n const getXml = useCallback(async (): Promise<string | null> => {\n if (!modelerRef.current) return null;\n try {\n const { xml } = await modelerRef.current.saveXML({ format: true });\n return xml;\n } catch {\n return null;\n }\n }, []);\n\n // Fit mit Inset: nach fit-viewport leicht auszoomen und nach rechts/unten\n // verschieben, damit die linke Palette & Toolbar keine Elemente überdecken.\n const fitWithPadding = useCallback(() => {\n const canvas = modelerRef.current?.get(\"canvas\") as\n | {\n zoom(level: string | number, center?: unknown): void;\n viewbox(): { scale: number };\n scroll(delta: { dx: number; dy: number }): void;\n }\n | undefined;\n if (!canvas) return;\n try {\n canvas.zoom(\"fit-viewport\", \"auto\");\n const vb = canvas.viewbox();\n const padded = Math.min(vb.scale * 0.92, 1.5);\n canvas.zoom(padded, \"auto\");\n canvas.scroll({ dx: 90, dy: 24 }); // Palette (48px@left20) freihalten\n } catch {\n /* ignore */\n }\n }, []);\n\n // The initial XML to load: controlled value wins, else defaultValue.\n const initialXml = isControlled ? value : defaultValue;\n // We only re-import on controlled `value` change, not on every onChange echo.\n const lastImportedRef = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n let cancelled = false;\n setError(null);\n\n const init = async () => {\n if (!canvasRef.current) return;\n // destroy previous\n if (modelerRef.current) {\n try {\n modelerRef.current.destroy();\n } catch {\n /* ignore */\n }\n modelerRef.current = null;\n }\n\n const [\n { default: BpmnModeler },\n propsPanel,\n { default: CamundaModdle },\n { default: lintModule },\n { default: BpmnRenderer },\n { default: MinimapModule },\n elementTemplatesMod,\n labelRequired,\n noComplexGateway,\n noDisconnected,\n noImplicitSplit,\n ] = await Promise.all([\n import(/* @vite-ignore */ \"bpmn-js/lib/Modeler\"),\n import(/* @vite-ignore */ \"bpmn-js-properties-panel\"),\n import(/* @vite-ignore */ \"camunda-bpmn-moddle/resources/camunda.json\"),\n import(/* @vite-ignore */ \"bpmn-js-bpmnlint\"),\n import(/* @vite-ignore */ \"bpmn-js/lib/draw/BpmnRenderer\"),\n import(/* @vite-ignore */ \"diagram-js-minimap\"),\n import(/* @vite-ignore */ \"bpmn-js-element-templates\"),\n import(/* @vite-ignore */ \"bpmnlint/rules/label-required\"),\n import(/* @vite-ignore */ \"bpmnlint/rules/no-complex-gateway\"),\n import(/* @vite-ignore */ \"bpmnlint/rules/no-disconnected\"),\n import(/* @vite-ignore */ \"bpmnlint/rules/no-implicit-split\"),\n ]);\n\n if (cancelled || !canvasRef.current) return;\n\n const {\n BpmnPropertiesPanelModule,\n BpmnPropertiesProviderModule,\n CamundaPlatformPropertiesProviderModule,\n } = propsPanel as Record<string, unknown>;\n\n const lintConfig = buildLintConfig(\n {\n \"bpmnlint/label-required\": (labelRequired as { default: unknown }).default,\n \"bpmnlint/no-complex-gateway\": (noComplexGateway as { default: unknown }).default,\n \"bpmnlint/no-disconnected\": (noDisconnected as { default: unknown }).default,\n \"bpmnlint/no-implicit-split\": (noImplicitSplit as { default: unknown }).default,\n },\n lintRules,\n );\n\n const { ElementTemplatesPropertiesProviderModule } =\n elementTemplatesMod as Record<string, unknown>;\n\n const colors = getDiagramColors(colorScheme);\n const additionalModules: unknown[] = [\n lintModule,\n createAppleRendererModule(BpmnRenderer as new (...a: unknown[]) => unknown),\n ];\n if (minimap) additionalModules.push(MinimapModule);\n if (propertiesPanel) {\n additionalModules.unshift(\n BpmnPropertiesPanelModule,\n BpmnPropertiesProviderModule,\n CamundaPlatformPropertiesProviderModule,\n ElementTemplatesPropertiesProviderModule,\n );\n }\n\n const modeler = new BpmnModeler({\n container: canvasRef.current,\n ...(propertiesPanel && propsRef.current\n ? { propertiesPanel: { parent: propsRef.current } }\n : {}),\n linting: { bpmnlint: lintConfig, active: true },\n ...buildRendererConfig(colors),\n additionalModules,\n moddleExtensions: { camunda: CamundaModdle },\n }) as unknown as ModelerInstance;\n modelerRef.current = modeler;\n\n // Element-Templates anwenden (falls übergeben).\n if (Array.isArray(templatesRef.current)) {\n try {\n (modeler.get(\"elementTemplates\") as { set(t: unknown[]): void }).set(\n templatesRef.current,\n );\n } catch {\n /* ignore */\n }\n }\n // Minimap initial geöffnet zeigen.\n if (minimap) {\n try {\n (modeler.get(\"minimap\") as { open(): void }).open();\n } catch {\n /* ignore */\n }\n }\n\n const eventBus = modeler.get(\"eventBus\") as {\n on(event: string, cb: (e: Record<string, unknown>) => void): void;\n };\n\n eventBus.on(\"linting.completed\", (e) => {\n const results = (e as { issues?: Record<string, { message: string; category?: string; id?: string; rule?: string }[]> }).issues ?? {};\n const flat: LintIssue[] = [];\n for (const [elId, issues] of Object.entries(results)) {\n for (const issue of issues) {\n flat.push({\n id: issue.rule ?? issue.id ?? elId,\n message: issue.message,\n category: (issue.category as \"error\" | \"warning\") ?? \"warning\",\n element: elId,\n });\n }\n }\n setLintIssues(flat);\n });\n\n eventBus.on(\"selection.changed\", (e) => {\n const sel = (e as { newSelection?: { id?: string; businessObject?: { name?: string } }[] }).newSelection ?? [];\n const only = sel.length === 1 ? sel[0] : undefined;\n if (only?.id) {\n cb.current.onElementSelect?.({ id: only.id, name: only.businessObject?.name });\n } else {\n cb.current.onElementSelect?.(null);\n }\n });\n\n // changes → onChange + dirty\n eventBus.on(\"commandStack.changed\", () => {\n cb.current.onDirtyChange?.(true);\n if (cb.current.onChange) {\n void modeler.saveXML({ format: true }).then(({ xml }) => {\n lastImportedRef.current = xml;\n cb.current.onChange?.(xml);\n });\n }\n });\n\n // import initial XML\n if (initialXml && initialXml.trim()) {\n try {\n await modeler.importXML(initialXml);\n lastImportedRef.current = initialXml;\n fitWithPadding();\n } catch (err) {\n if (!cancelled) setError((err as Error).message);\n }\n }\n };\n\n void init();\n return () => {\n cancelled = true;\n if (modelerRef.current) {\n try {\n modelerRef.current.destroy();\n } catch {\n /* ignore */\n }\n modelerRef.current = null;\n }\n };\n // re-init on theme/colorScheme/propertiesPanel/minimap; NOT on value (below)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [themeTick, colorScheme, propertiesPanel, minimap]);\n\n // Controlled: re-import when external value changes (and differs from our echo).\n useEffect(() => {\n if (!isControlled || value === undefined) return;\n if (value === lastImportedRef.current) return;\n const modeler = modelerRef.current;\n if (!modeler || !value.trim()) return;\n let cancelled = false;\n void modeler.importXML(value).then(() => {\n if (cancelled) return;\n lastImportedRef.current = value;\n fitWithPadding();\n });\n return () => {\n cancelled = true;\n };\n }, [value, isControlled, fitWithPadding]);\n\n // KEIN ResizeObserver-Re-Fit mehr: diagram-js behält die Viewbox bei\n // Container-Resize von selbst bei. Das frühere zoom(\"fit-viewport\") bei jedem\n // Resize ließ das Diagramm bei jeder Änderung (Lint-Leiste ein/aus →\n // Höhenänderung) neu zentrieren/springen. Fit passiert nur noch beim\n // initialen Import / Controlled-Reimport (fitWithPadding).\n\n const elementName = useCallback((elementId: string | undefined): string => {\n if (!elementId) return \"(unbenannt)\";\n const reg = modelerRef.current?.get(\"elementRegistry\") as\n | { get(id: string): { businessObject?: { name?: string } } | undefined }\n | undefined;\n return reg?.get(elementId)?.businessObject?.name || elementId;\n }, []);\n\n const selectElement = useCallback((elementId: string) => {\n const reg = modelerRef.current?.get(\"elementRegistry\") as\n | { get(id: string): unknown }\n | undefined;\n const el = reg?.get(elementId);\n if (!el) return;\n try {\n (modelerRef.current?.get(\"selection\") as { select(e: unknown): void } | undefined)?.select(el);\n (modelerRef.current?.get(\"canvas\") as { scrollToElement(e: unknown): void } | undefined)?.scrollToElement(el);\n } catch {\n /* ignore */\n }\n }, []);\n\n const handleSave = useCallback(async () => {\n if (!onSave) return;\n setSaving(true);\n try {\n const xml = await getXml();\n if (xml != null) {\n await onSave(xml);\n cb.current.onDirtyChange?.(false);\n }\n } finally {\n setSaving(false);\n }\n }, [onSave, getXml]);\n\n // Suchfeld (bpmn-js SearchPad) öffnen — via Toolbar-Button oder ⌘/Ctrl+F.\n const handleSearch = useCallback(() => {\n const m = modelerRef.current;\n if (!m) return;\n try {\n (m.get(\"editorActions\") as { trigger(a: string): void }).trigger(\"find\");\n } catch {\n try {\n (m.get(\"searchPad\") as { toggle(): void }).toggle();\n } catch {\n /* ignore */\n }\n }\n }, []);\n\n // Element-Templates aktualisieren, ohne den Modeler neu zu bauen.\n useEffect(() => {\n const m = modelerRef.current;\n if (!m) return;\n try {\n (m.get(\"elementTemplates\") as { set(t: unknown[]): void }).set(\n Array.isArray(elementTemplates) ? elementTemplates : [],\n );\n } catch {\n /* ignore */\n }\n }, [elementTemplates]);\n\n const handleToggleView = useCallback(\n async (next: \"diagram\" | \"table\") => {\n if (next === \"table\") {\n const xml = await getXml();\n setTableXml(xml ?? initialXml ?? \"\");\n }\n setView(next);\n },\n [getXml, initialXml],\n );\n\n const errors = lintIssues.filter((i) => i.category === \"error\");\n const warnings = lintIssues.filter((i) => i.category === \"warning\");\n\n return (\n <div\n className={[\"prn-bpmn\", \"prn-bpmn-editor\", className].filter(Boolean).join(\" \")}\n data-color-scheme={colorScheme}\n style={{ height }}\n >\n {/* Toolbar */}\n <div className=\"prn-bpmn-editor-toolbar\" role=\"toolbar\" aria-label=\"BPMN-Editor-Aktionen\">\n <SegmentedControl\n aria-label=\"Ansicht\"\n selectedKeys={new Set([view])}\n onSelectionChange={(keys) => {\n const next = [...(keys as Set<string>)][0] as \"diagram\" | \"table\";\n if (next) void handleToggleView(next);\n }}\n >\n <Segment id=\"diagram\">Diagramm</Segment>\n <Segment id=\"table\">Tabelle</Segment>\n </SegmentedControl>\n {view === \"diagram\" && (\n <Button variant=\"plain\" onPress={handleSearch} aria-label=\"Element suchen\">\n 🔍 Suchen\n </Button>\n )}\n <div className=\"prn-bpmn-editor-toolbar-spacer\" />\n {actionsSlot}\n {onSave && (\n <Button variant=\"filled\" onPress={() => void handleSave()} isDisabled={saving}>\n {saving ? \"Speichern…\" : \"Speichern\"}\n </Button>\n )}\n </div>\n\n {error && (\n <Notice tone=\"negative\" title=\"Fehler\">\n {error}\n </Notice>\n )}\n\n {/* Hauptbereich */}\n <div className=\"prn-bpmn-editor-main\">\n <div className=\"prn-bpmn-editor-stage\">\n {/* Canvas — immer im DOM, bei Tabellenansicht versteckt */}\n <div\n ref={canvasRef}\n className=\"prn-bpmn-canvas\"\n style={{ display: view === \"table\" ? \"none\" : \"block\" }}\n />\n {view === \"table\" && (\n <div className=\"prn-bpmn-editor-table\">\n <BpmnTableView xml={tableXml} />\n </div>\n )}\n </div>\n\n {/* Properties-Panel-Container (vom Modeler befüllt) */}\n {propertiesPanel && view === \"diagram\" && (\n <div ref={propsRef} className=\"prn-bpmn-editor-properties\" />\n )}\n </div>\n\n {/* Linter-Footer */}\n {lintIssues.length > 0 && !errorPanelOpen && (\n <button\n type=\"button\"\n className=\"prn-bpmn-editor-lintbar\"\n onClick={() => setErrorPanelOpen(true)}\n data-testid=\"lint-footer-toggle\"\n >\n {errors.length > 0 && (\n <span className=\"prn-bpmn-lint-error\">✕ {errors.length} Fehler</span>\n )}\n {warnings.length > 0 && (\n <span className=\"prn-bpmn-lint-warning\">⚠ {warnings.length} Warnungen</span>\n )}\n <span className=\"prn-bpmn-muted\">— Details anzeigen</span>\n </button>\n )}\n\n {lintIssues.length > 0 && errorPanelOpen && (\n <ErrorPanel\n issues={lintIssues}\n elementName={elementName}\n onSelectElement={selectElement}\n onKiFix={onKiFix ? () => onKiFix(lintIssues) : undefined}\n onClose={() => setErrorPanelOpen(false)}\n />\n )}\n </div>\n );\n}\n\nexport default BpmnEditor;\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "prince-ui-bpmn",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "BPMN-Viewer und -Editor im prince-ui-Look auf Basis von bpmn-js (Original-bpmn.io-Icons, Apple-Styling).",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"private": false,
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": [
|
|
9
|
+
"*.css"
|
|
10
|
+
],
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"module": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./styles.css": "./dist/index.css",
|
|
23
|
+
"./package.json": "./package.json"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@bpmn-io/cm-theme": "^0.2.0",
|
|
27
|
+
"@bpmn-io/properties-panel": "^3.0.0",
|
|
28
|
+
"bpmn-font": "^0.12.1",
|
|
29
|
+
"bpmn-js": "^18.0.0",
|
|
30
|
+
"bpmn-js-bpmnlint": "^0.24.0",
|
|
31
|
+
"bpmn-js-element-templates": "^2.26.0",
|
|
32
|
+
"bpmn-js-properties-panel": "^5.0.0",
|
|
33
|
+
"bpmnlint": "^11.0.0",
|
|
34
|
+
"camunda-bpmn-moddle": "^7.0.0",
|
|
35
|
+
"diagram-js": "^15.0.0",
|
|
36
|
+
"diagram-js-minimap": "^5.3.0",
|
|
37
|
+
"prince-ui-tokens": "0.4.0"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"react": ">=18 <20",
|
|
41
|
+
"react-dom": ">=18 <20",
|
|
42
|
+
"prince-ui": "0.9.2"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
46
|
+
"@testing-library/react": "^16.0.1",
|
|
47
|
+
"@testing-library/user-event": "^14.5.2",
|
|
48
|
+
"@types/react": "^18.3.12",
|
|
49
|
+
"@types/react-dom": "^18.3.1",
|
|
50
|
+
"@vitest/coverage-v8": "^2.1.5",
|
|
51
|
+
"jsdom": "^25.0.1",
|
|
52
|
+
"react": "^18.3.1",
|
|
53
|
+
"react-dom": "^18.3.1",
|
|
54
|
+
"tsup": "^8.3.0",
|
|
55
|
+
"typescript": "^5.6.3",
|
|
56
|
+
"vitest": "^2.1.5",
|
|
57
|
+
"prince-ui": "0.9.2"
|
|
58
|
+
},
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"registry": "https://registry.npmjs.org"
|
|
61
|
+
},
|
|
62
|
+
"repository": {
|
|
63
|
+
"type": "git",
|
|
64
|
+
"url": "git+https://github.com/conuti-das/prince-ui.git",
|
|
65
|
+
"directory": "packages/bpmn"
|
|
66
|
+
},
|
|
67
|
+
"scripts": {
|
|
68
|
+
"build": "tsup",
|
|
69
|
+
"dev": "tsup --watch",
|
|
70
|
+
"typecheck": "tsc --noEmit",
|
|
71
|
+
"test": "vitest run",
|
|
72
|
+
"test:watch": "vitest",
|
|
73
|
+
"test:coverage": "vitest run --coverage"
|
|
74
|
+
}
|
|
75
|
+
}
|