@bpmnkit/operate 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +131 -0
  2. package/dist/components/badge.d.ts +2 -0
  3. package/dist/components/badge.js +2 -0
  4. package/dist/components/card.d.ts +2 -0
  5. package/dist/components/card.js +2 -0
  6. package/dist/components/chart.d.ts +6 -0
  7. package/dist/components/chart.js +161 -0
  8. package/dist/components/filter-table.d.ts +20 -0
  9. package/dist/components/filter-table.js +215 -0
  10. package/dist/components/table.d.ts +2 -0
  11. package/dist/components/table.js +2 -0
  12. package/dist/css.d.ts +2 -0
  13. package/dist/css.js +1071 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.js +2 -0
  16. package/dist/mock-data.d.ts +18 -0
  17. package/dist/mock-data.js +509 -0
  18. package/dist/operate.d.ts +3 -0
  19. package/dist/operate.js +308 -0
  20. package/dist/router.d.ts +9 -0
  21. package/dist/router.js +49 -0
  22. package/dist/stores/base.d.ts +20 -0
  23. package/dist/stores/base.js +32 -0
  24. package/dist/stores/dashboard.d.ts +6 -0
  25. package/dist/stores/dashboard.js +19 -0
  26. package/dist/stores/decisions.d.ts +9 -0
  27. package/dist/stores/decisions.js +19 -0
  28. package/dist/stores/definitions.d.ts +9 -0
  29. package/dist/stores/definitions.js +19 -0
  30. package/dist/stores/incidents.d.ts +10 -0
  31. package/dist/stores/incidents.js +27 -0
  32. package/dist/stores/instances.d.ts +15 -0
  33. package/dist/stores/instances.js +33 -0
  34. package/dist/stores/jobs.d.ts +10 -0
  35. package/dist/stores/jobs.js +19 -0
  36. package/dist/stores/tasks.d.ts +10 -0
  37. package/dist/stores/tasks.js +19 -0
  38. package/dist/stream.d.ts +12 -0
  39. package/dist/stream.js +42 -0
  40. package/dist/types.d.ts +48 -0
  41. package/dist/types.js +2 -0
  42. package/dist/views/dashboard.d.ts +6 -0
  43. package/dist/views/dashboard.js +98 -0
  44. package/dist/views/decision-detail.d.ts +15 -0
  45. package/dist/views/decision-detail.js +167 -0
  46. package/dist/views/decisions.d.ts +7 -0
  47. package/dist/views/decisions.js +78 -0
  48. package/dist/views/definition-detail.d.ts +15 -0
  49. package/dist/views/definition-detail.js +339 -0
  50. package/dist/views/definitions.d.ts +7 -0
  51. package/dist/views/definitions.js +70 -0
  52. package/dist/views/header.d.ts +9 -0
  53. package/dist/views/header.js +49 -0
  54. package/dist/views/incident-detail.d.ts +14 -0
  55. package/dist/views/incident-detail.js +540 -0
  56. package/dist/views/incidents.d.ts +7 -0
  57. package/dist/views/incidents.js +108 -0
  58. package/dist/views/instance-detail.d.ts +16 -0
  59. package/dist/views/instance-detail.js +728 -0
  60. package/dist/views/instances.d.ts +7 -0
  61. package/dist/views/instances.js +249 -0
  62. package/dist/views/jobs.d.ts +6 -0
  63. package/dist/views/jobs.js +60 -0
  64. package/dist/views/messages.d.ts +11 -0
  65. package/dist/views/messages.js +431 -0
  66. package/dist/views/nav.d.ts +10 -0
  67. package/dist/views/nav.js +60 -0
  68. package/dist/views/task-detail.d.ts +13 -0
  69. package/dist/views/task-detail.js +187 -0
  70. package/dist/views/tasks.d.ts +7 -0
  71. package/dist/views/tasks.js +72 -0
  72. package/package.json +46 -0
@@ -0,0 +1,339 @@
1
+ import { BpmnCanvas } from "@bpmnkit/canvas";
2
+ import { createConfigPanelPlugin } from "@bpmnkit/plugins/config-panel";
3
+ import { createConfigPanelBpmnPlugin } from "@bpmnkit/plugins/config-panel-bpmn";
4
+ import { MOCK_BPMN_XML } from "../mock-data.js";
5
+ function parseVariables(raw) {
6
+ const trimmed = raw.trim();
7
+ if (!trimmed)
8
+ return null;
9
+ try {
10
+ const parsed = JSON.parse(trimmed);
11
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
12
+ return parsed;
13
+ }
14
+ return null;
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ export function createDefinitionDetailView(definitionKey, store, cfg, onBack) {
21
+ const el = document.createElement("div");
22
+ el.className = "op-view op-def-detail";
23
+ // Breadcrumb
24
+ const breadcrumb = document.createElement("div");
25
+ breadcrumb.className = "op-breadcrumb";
26
+ const backBtn = document.createElement("button");
27
+ backBtn.className = "op-back-btn";
28
+ backBtn.textContent = "← Processes";
29
+ backBtn.addEventListener("click", onBack);
30
+ breadcrumb.appendChild(backBtn);
31
+ el.appendChild(breadcrumb);
32
+ // Metadata row
33
+ const meta = document.createElement("div");
34
+ meta.className = "op-def-meta";
35
+ el.appendChild(meta);
36
+ // Canvas + sidebar layout
37
+ const layout = document.createElement("div");
38
+ layout.className = "op-detail-layout";
39
+ el.appendChild(layout);
40
+ const canvasWrap = document.createElement("div");
41
+ canvasWrap.className = "op-detail-canvas";
42
+ layout.appendChild(canvasWrap);
43
+ const sidebar = document.createElement("div");
44
+ sidebar.className = "op-detail-sidebar";
45
+ sidebar.dataset.bpmnHudTheme = cfg.theme;
46
+ layout.appendChild(sidebar);
47
+ const tabBar = document.createElement("div");
48
+ tabBar.className = "op-detail-tabs";
49
+ const propsTabBtn = document.createElement("button");
50
+ propsTabBtn.className = "op-detail-tab op-detail-tab--active";
51
+ propsTabBtn.textContent = "Properties";
52
+ tabBar.appendChild(propsTabBtn);
53
+ sidebar.appendChild(tabBar);
54
+ const propsPane = document.createElement("div");
55
+ propsPane.className = "op-detail-panel op-props-pane";
56
+ sidebar.appendChild(propsPane);
57
+ const propsPlaceholder = document.createElement("div");
58
+ propsPlaceholder.className = "op-props-placeholder";
59
+ propsPlaceholder.textContent = "Click an element to view its properties";
60
+ propsPane.appendChild(propsPlaceholder);
61
+ // Config panel (read-only: applyChange is a no-op)
62
+ let latestDefs = null;
63
+ const configPanel = createConfigPanelPlugin({
64
+ getDefinitions: () => latestDefs,
65
+ applyChange: () => { },
66
+ container: propsPane,
67
+ readonly: true,
68
+ onPanelShow: () => {
69
+ propsPlaceholder.style.display = "none";
70
+ },
71
+ onPanelHide: () => {
72
+ propsPlaceholder.style.display = "";
73
+ },
74
+ });
75
+ const configPanelBpmn = createConfigPanelBpmnPlugin(configPanel);
76
+ const bridgePlugin = {
77
+ name: "op-select-bridge",
78
+ install(api) {
79
+ const emit = api.emit.bind(api);
80
+ api.on("element:click", (id) => emit("editor:select", [id]));
81
+ api.on("diagram:load", (defs) => {
82
+ latestDefs = defs;
83
+ });
84
+ },
85
+ };
86
+ let canvas = null;
87
+ function getDef() {
88
+ return store.state.data?.items.find((d) => d.processDefinitionKey === definitionKey) ?? null;
89
+ }
90
+ function getVersions() {
91
+ const def = getDef();
92
+ if (!def)
93
+ return [];
94
+ const id = def.processDefinitionId;
95
+ return (store.state.data?.items ?? [])
96
+ .filter((d) => d.processDefinitionId === id)
97
+ .sort((a, b) => (b.version ?? 0) - (a.version ?? 0));
98
+ }
99
+ function renderMeta(def) {
100
+ meta.innerHTML = "";
101
+ if (!def)
102
+ return;
103
+ const name = document.createElement("span");
104
+ name.className = "op-def-meta-name";
105
+ name.textContent = def.name ?? def.processDefinitionId ?? "—";
106
+ meta.appendChild(name);
107
+ const versions = getVersions();
108
+ if (versions.length > 1 && cfg.navigate) {
109
+ const select = document.createElement("select");
110
+ select.className = "op-version-select";
111
+ for (const v of versions) {
112
+ const opt = document.createElement("option");
113
+ opt.value = v.processDefinitionKey ?? "";
114
+ opt.textContent = `v${v.version ?? "?"}${v.versionTag ? ` (${v.versionTag})` : ""}`;
115
+ opt.selected = v.processDefinitionKey === definitionKey;
116
+ select.appendChild(opt);
117
+ }
118
+ select.addEventListener("change", () => {
119
+ cfg.navigate?.(`/definitions/${select.value}`);
120
+ });
121
+ meta.appendChild(select);
122
+ }
123
+ else {
124
+ const ver = document.createElement("span");
125
+ ver.className = "op-def-meta-version";
126
+ ver.textContent = `v${def.version ?? "?"}${def.versionTag ? ` · ${def.versionTag}` : ""}`;
127
+ meta.appendChild(ver);
128
+ }
129
+ if (def.tenantId) {
130
+ const tenant = document.createElement("span");
131
+ tenant.className = "op-def-meta-version";
132
+ tenant.textContent = `tenant: ${def.tenantId}`;
133
+ meta.appendChild(tenant);
134
+ }
135
+ const key = document.createElement("span");
136
+ key.className = "op-instance-key";
137
+ key.textContent = def.processDefinitionKey ?? "";
138
+ meta.appendChild(key);
139
+ const startBtn = document.createElement("button");
140
+ startBtn.className = "op-action-btn op-action-btn--primary";
141
+ startBtn.textContent = "▶ Start Instance";
142
+ startBtn.style.marginLeft = "auto";
143
+ startBtn.addEventListener("click", () => showStartModal(def));
144
+ meta.appendChild(startBtn);
145
+ }
146
+ function showStartModal(def) {
147
+ const overlay = document.createElement("div");
148
+ overlay.className = "op-modal-overlay";
149
+ const dialog = document.createElement("div");
150
+ dialog.className = "op-modal op-modal--form";
151
+ const header = document.createElement("div");
152
+ header.className = "op-modal-header";
153
+ const titleEl = document.createElement("span");
154
+ titleEl.className = "op-modal-title";
155
+ titleEl.textContent = `Start — ${def.name ?? def.processDefinitionId ?? definitionKey}`;
156
+ header.appendChild(titleEl);
157
+ const closeBtn = document.createElement("button");
158
+ closeBtn.className = "op-modal-close";
159
+ closeBtn.textContent = "✕";
160
+ closeBtn.addEventListener("click", () => overlay.remove());
161
+ header.appendChild(closeBtn);
162
+ const body = document.createElement("div");
163
+ body.className = "op-modal-form-body";
164
+ const bizGroup = document.createElement("div");
165
+ bizGroup.className = "op-form-group";
166
+ const bizLabel = document.createElement("label");
167
+ bizLabel.className = "op-form-label";
168
+ bizLabel.textContent = "Business ID";
169
+ const bizInput = document.createElement("input");
170
+ bizInput.type = "text";
171
+ bizInput.className = "op-form-input";
172
+ bizInput.placeholder = "Optional unique identifier (e.g. ORD-10050)";
173
+ bizGroup.appendChild(bizLabel);
174
+ bizGroup.appendChild(bizInput);
175
+ body.appendChild(bizGroup);
176
+ const varsGroup = document.createElement("div");
177
+ varsGroup.className = "op-form-group";
178
+ const varsLabel = document.createElement("label");
179
+ varsLabel.className = "op-form-label";
180
+ varsLabel.textContent = "Variables";
181
+ const varsInput = document.createElement("textarea");
182
+ varsInput.className = "op-form-textarea";
183
+ varsInput.placeholder = '{"orderId": "ORD-10050", "amount": 49.99}';
184
+ varsInput.rows = 5;
185
+ const varsHint = document.createElement("span");
186
+ varsHint.className = "op-form-hint";
187
+ varsHint.textContent = "Optional JSON object of initial process variables.";
188
+ varsGroup.appendChild(varsLabel);
189
+ varsGroup.appendChild(varsInput);
190
+ varsGroup.appendChild(varsHint);
191
+ body.appendChild(varsGroup);
192
+ const footer = document.createElement("div");
193
+ footer.className = "op-modal-form-footer";
194
+ const errorEl = document.createElement("div");
195
+ errorEl.className = "op-form-error";
196
+ errorEl.style.display = "none";
197
+ footer.appendChild(errorEl);
198
+ const feedbackEl = document.createElement("div");
199
+ feedbackEl.className = "op-action-feedback";
200
+ feedbackEl.style.display = "none";
201
+ footer.appendChild(feedbackEl);
202
+ const cancelBtn = document.createElement("button");
203
+ cancelBtn.className = "op-action-btn";
204
+ cancelBtn.textContent = "Cancel";
205
+ cancelBtn.style.marginLeft = "auto";
206
+ cancelBtn.addEventListener("click", () => overlay.remove());
207
+ footer.appendChild(cancelBtn);
208
+ const submitBtn = document.createElement("button");
209
+ submitBtn.className = "op-action-btn op-action-btn--primary";
210
+ submitBtn.textContent = "▶ Start";
211
+ footer.appendChild(submitBtn);
212
+ submitBtn.addEventListener("click", () => {
213
+ errorEl.style.display = "none";
214
+ const bizId = bizInput.value.trim();
215
+ const varsRaw = varsInput.value.trim();
216
+ let vars = null;
217
+ if (varsRaw) {
218
+ vars = parseVariables(varsRaw);
219
+ if (!vars) {
220
+ errorEl.textContent = "Variables must be a valid JSON object.";
221
+ errorEl.style.display = "";
222
+ return;
223
+ }
224
+ }
225
+ if (cfg.mock) {
226
+ feedbackEl.textContent = "Mock mode — instance not created on server.";
227
+ feedbackEl.className = "op-action-feedback op-action-feedback--ok";
228
+ feedbackEl.style.display = "";
229
+ submitBtn.style.display = "none";
230
+ cancelBtn.textContent = "Close";
231
+ return;
232
+ }
233
+ submitBtn.disabled = true;
234
+ cancelBtn.disabled = true;
235
+ submitBtn.textContent = "Starting…";
236
+ const body2 = { processDefinitionKey: definitionKey };
237
+ if (bizId)
238
+ body2.businessId = bizId;
239
+ if (vars)
240
+ body2.variables = vars;
241
+ const headers = { "Content-Type": "application/json" };
242
+ if (cfg.profile)
243
+ headers["x-profile"] = cfg.profile;
244
+ fetch(`${cfg.proxyUrl}/api/process-instances`, {
245
+ method: "POST",
246
+ headers,
247
+ body: JSON.stringify(body2),
248
+ })
249
+ .then((r) => r.ok
250
+ ? r.json()
251
+ : r.text().then((msg) => {
252
+ throw new Error(`${r.status}: ${msg}`);
253
+ }))
254
+ .then((result) => {
255
+ const instKey = result.processInstanceKey;
256
+ feedbackEl.innerHTML = "";
257
+ feedbackEl.textContent = `Instance created: ${instKey}`;
258
+ if (cfg.navigate) {
259
+ const link = document.createElement("button");
260
+ link.className = "op-back-btn";
261
+ link.textContent = " → View Instance";
262
+ link.style.marginLeft = "8px";
263
+ const key = instKey;
264
+ link.addEventListener("click", () => {
265
+ overlay.remove();
266
+ cfg.navigate?.(`/instances/${key}`);
267
+ });
268
+ feedbackEl.appendChild(link);
269
+ }
270
+ feedbackEl.className = "op-action-feedback op-action-feedback--ok";
271
+ feedbackEl.style.display = "";
272
+ submitBtn.style.display = "none";
273
+ cancelBtn.disabled = false;
274
+ cancelBtn.textContent = "Close";
275
+ })
276
+ .catch((err) => {
277
+ errorEl.textContent = String(err);
278
+ errorEl.style.display = "";
279
+ submitBtn.disabled = false;
280
+ cancelBtn.disabled = false;
281
+ submitBtn.textContent = "▶ Start";
282
+ });
283
+ });
284
+ dialog.appendChild(header);
285
+ dialog.appendChild(body);
286
+ dialog.appendChild(footer);
287
+ overlay.appendChild(dialog);
288
+ overlay.addEventListener("click", (e) => {
289
+ if (e.target === overlay)
290
+ overlay.remove();
291
+ });
292
+ el.appendChild(overlay);
293
+ setTimeout(() => bizInput.focus(), 0);
294
+ }
295
+ function loadCanvas(xml) {
296
+ canvas?.destroy();
297
+ canvasWrap.innerHTML = "";
298
+ canvas = new BpmnCanvas({
299
+ container: canvasWrap,
300
+ xml,
301
+ theme: cfg.theme,
302
+ plugins: [bridgePlugin, configPanel, configPanelBpmn],
303
+ });
304
+ }
305
+ if (cfg.mock) {
306
+ renderMeta(getDef());
307
+ loadCanvas(MOCK_BPMN_XML);
308
+ }
309
+ else {
310
+ const def = getDef();
311
+ renderMeta(def);
312
+ fetch(`${cfg.proxyUrl}/api/process-definitions/${definitionKey}/xml`, {
313
+ headers: {
314
+ accept: "text/xml",
315
+ ...(cfg.profile ? { "x-profile": cfg.profile } : {}),
316
+ },
317
+ })
318
+ .then((r) => r.text())
319
+ .then((xml) => loadCanvas(xml))
320
+ .catch(() => {
321
+ canvasWrap.innerHTML = `<div style="padding:24px;color:var(--bpmnkit-fg-muted)">Failed to load diagram</div>`;
322
+ });
323
+ }
324
+ const defUnsub = store.subscribe(() => {
325
+ renderMeta(getDef());
326
+ });
327
+ return {
328
+ el,
329
+ setTheme(t) {
330
+ canvas?.setTheme(t);
331
+ sidebar.dataset.bpmnHudTheme = t;
332
+ },
333
+ destroy() {
334
+ canvas?.destroy();
335
+ defUnsub();
336
+ },
337
+ };
338
+ }
339
+ //# sourceMappingURL=definition-detail.js.map
@@ -0,0 +1,7 @@
1
+ import type { DefinitionsStore } from "../stores/definitions.js";
2
+ import type { ProcessDefinitionResult } from "../types.js";
3
+ export declare function createDefinitionsView(store: DefinitionsStore, onSelect: (def: ProcessDefinitionResult) => void): {
4
+ el: HTMLElement;
5
+ destroy(): void;
6
+ };
7
+ //# sourceMappingURL=definitions.d.ts.map
@@ -0,0 +1,70 @@
1
+ import { createFilterTable } from "../components/filter-table.js";
2
+ export function createDefinitionsView(store, onSelect) {
3
+ const el = document.createElement("div");
4
+ el.className = "op-view op-def-view";
5
+ const { el: tableEl, setRows } = createFilterTable({
6
+ columns: [
7
+ {
8
+ label: "Name",
9
+ render: (row) => row.latest.name ?? row.latest.processDefinitionId ?? "—",
10
+ sortValue: (row) => row.latest.name ?? row.latest.processDefinitionId ?? "",
11
+ },
12
+ {
13
+ label: "ID",
14
+ width: "200px",
15
+ render: (row) => {
16
+ const span = document.createElement("span");
17
+ span.className = "op-mono-cell";
18
+ span.textContent = row.latest.processDefinitionId ?? "—";
19
+ return span;
20
+ },
21
+ sortValue: (row) => row.latest.processDefinitionId ?? "",
22
+ },
23
+ {
24
+ label: "Versions",
25
+ width: "80px",
26
+ render: (row) => String(row.versionCount),
27
+ sortValue: (row) => row.versionCount,
28
+ },
29
+ {
30
+ label: "Latest",
31
+ width: "100px",
32
+ render: (row) => {
33
+ const v = row.latest;
34
+ return v.versionTag ?? `v${v.version ?? "?"}`;
35
+ },
36
+ sortValue: (row) => row.latest.version ?? 0,
37
+ },
38
+ ],
39
+ searchFn: (row) => [row.latest.name, row.latest.processDefinitionId, row.latest.processDefinitionKey]
40
+ .filter(Boolean)
41
+ .join(" "),
42
+ onRowClick: (row) => onSelect(row.latest),
43
+ emptyText: "No process definitions deployed",
44
+ });
45
+ el.appendChild(tableEl);
46
+ function buildRows(items) {
47
+ const map = new Map();
48
+ for (const item of items) {
49
+ const id = item.processDefinitionId ?? item.processDefinitionKey ?? "";
50
+ const existing = map.get(id);
51
+ if (!existing) {
52
+ map.set(id, { latest: item, versionCount: 1 });
53
+ }
54
+ else {
55
+ existing.versionCount++;
56
+ if ((item.version ?? 0) > (existing.latest.version ?? 0)) {
57
+ existing.latest = item;
58
+ }
59
+ }
60
+ }
61
+ return Array.from(map.values());
62
+ }
63
+ function render() {
64
+ setRows(buildRows(store.state.data?.items ?? []));
65
+ }
66
+ const unsub = store.subscribe(render);
67
+ render();
68
+ return { el, destroy: unsub };
69
+ }
70
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1,9 @@
1
+ import { type Theme } from "@bpmnkit/ui";
2
+ import type { ProfileInfo } from "../types.js";
3
+ export declare function createHeader(onProfileChange: (name: string) => void, onThemeChange: (theme: Theme, resolved: "light" | "dark") => void, initialTheme?: Theme): {
4
+ el: HTMLElement;
5
+ setTitle(title: string): void;
6
+ setProfiles(profiles: ProfileInfo[], active: string | null): void;
7
+ setTheme(t: Theme): void;
8
+ };
9
+ //# sourceMappingURL=header.d.ts.map
@@ -0,0 +1,49 @@
1
+ import { createThemeSwitcher } from "@bpmnkit/ui";
2
+ export function createHeader(onProfileChange, onThemeChange, initialTheme = "auto") {
3
+ const el = document.createElement("header");
4
+ el.className = "op-header";
5
+ const title = document.createElement("h1");
6
+ title.className = "op-header-title";
7
+ title.textContent = "Dashboard";
8
+ el.appendChild(title);
9
+ const right = document.createElement("div");
10
+ right.className = "op-header-right";
11
+ const select = document.createElement("select");
12
+ select.className = "op-profile-select";
13
+ select.setAttribute("aria-label", "Active profile");
14
+ select.addEventListener("change", () => {
15
+ if (select.value)
16
+ onProfileChange(select.value);
17
+ });
18
+ right.appendChild(select);
19
+ const themeSwitcher = createThemeSwitcher({
20
+ initial: initialTheme,
21
+ persist: true,
22
+ onChange: onThemeChange,
23
+ });
24
+ right.appendChild(themeSwitcher.el);
25
+ el.appendChild(right);
26
+ function setTitle(t) {
27
+ title.textContent = t;
28
+ }
29
+ function setProfiles(profiles, active) {
30
+ select.innerHTML = "";
31
+ if (profiles.length === 0) {
32
+ const opt = document.createElement("option");
33
+ opt.value = "";
34
+ opt.textContent = "No profiles";
35
+ select.appendChild(opt);
36
+ return;
37
+ }
38
+ for (const p of profiles) {
39
+ const opt = document.createElement("option");
40
+ opt.value = p.name;
41
+ opt.textContent = `${p.name}${p.active ? " ✓" : ""}`;
42
+ if (p.name === active || (active === null && p.active))
43
+ opt.selected = true;
44
+ select.appendChild(opt);
45
+ }
46
+ }
47
+ return { el, setTitle, setProfiles, setTheme: themeSwitcher.setTheme };
48
+ }
49
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1,14 @@
1
+ import type { IncidentsStore } from "../stores/incidents.js";
2
+ interface Config {
3
+ proxyUrl: string;
4
+ profile: string | null;
5
+ mock: boolean;
6
+ theme: "light" | "dark";
7
+ navigate?: (path: string) => void;
8
+ }
9
+ export declare function createIncidentDetailView(incidentKey: string, store: IncidentsStore, cfg: Config, onBack: () => void): {
10
+ el: HTMLElement;
11
+ destroy(): void;
12
+ };
13
+ export {};
14
+ //# sourceMappingURL=incident-detail.d.ts.map