@bimetal/whiteboard-angular-components 0.35.0 → 0.37.0

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.
@@ -1,6 +1,6 @@
1
1
  import { Component, Input, ViewChild, ElementRef, ChangeDetectionStrategy, NgZone, inject, signal, } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
- import { screenToBoard, boardToScreen, WHITEBOARD_TOOLS, WHITEBOARD_ALIGN, WHITEBOARD_DISTRIBUTE, whiteboardConnectorPath, whiteboardDrawPath, whiteboardDashArray, whiteboardCommentAnchor, } from '@bimetal/whiteboard-headless';
3
+ import { screenToBoard, boardToScreen, WHITEBOARD_TOOLS, WHITEBOARD_ALIGN, WHITEBOARD_DISTRIBUTE, whiteboardConnectorPath, whiteboardDrawPath, whiteboardDashArray, whiteboardCommentAnchor, whiteboardShapeDomId, reportUnroutedWhiteboardError, } from '@bimetal/whiteboard-headless';
4
4
  import { createWhiteboardControllerBinding } from '@bimetal/angular';
5
5
  import { WhiteboardShapeComponent } from './WhiteboardShape.js';
6
6
  import { TransformHandlesComponent } from './TransformHandles.js';
@@ -13,7 +13,7 @@ import * as i1 from "@angular/common";
13
13
  const _c0 = ["viewportRef"];
14
14
  function WhiteboardComponent_button_2_Template(rf, ctx) { if (rf & 1) {
15
15
  const _r2 = i0.ɵɵgetCurrentView();
16
- i0.ɵɵelementStart(0, "button", 36);
16
+ i0.ɵɵelementStart(0, "button", 31);
17
17
  i0.ɵɵlistener("click", function WhiteboardComponent_button_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onUndo()); });
18
18
  i0.ɵɵtext(1, "\u21B6");
19
19
  i0.ɵɵelementEnd();
@@ -24,7 +24,7 @@ function WhiteboardComponent_button_2_Template(rf, ctx) { if (rf & 1) {
24
24
  } }
25
25
  function WhiteboardComponent_button_3_Template(rf, ctx) { if (rf & 1) {
26
26
  const _r4 = i0.ɵɵgetCurrentView();
27
- i0.ɵɵelementStart(0, "button", 37);
27
+ i0.ɵɵelementStart(0, "button", 32);
28
28
  i0.ɵɵlistener("click", function WhiteboardComponent_button_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onRedo()); });
29
29
  i0.ɵɵtext(1, "\u21B7");
30
30
  i0.ɵɵelementEnd();
@@ -38,7 +38,7 @@ function WhiteboardComponent_span_4_Template(rf, ctx) { if (rf & 1) {
38
38
  } }
39
39
  function WhiteboardComponent_button_5_Template(rf, ctx) { if (rf & 1) {
40
40
  const _r5 = i0.ɵɵgetCurrentView();
41
- i0.ɵɵelementStart(0, "button", 38);
41
+ i0.ɵɵelementStart(0, "button", 33);
42
42
  i0.ɵɵlistener("click", function WhiteboardComponent_button_5_Template_button_click_0_listener() { const t_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onTool(t_r6.id)); });
43
43
  i0.ɵɵtext(1);
44
44
  i0.ɵɵelementEnd();
@@ -50,175 +50,240 @@ function WhiteboardComponent_button_5_Template(rf, ctx) { if (rf & 1) {
50
50
  i0.ɵɵadvance();
51
51
  i0.ɵɵtextInterpolate(t_r6.glyph);
52
52
  } }
53
- function WhiteboardComponent_button_22_Template(rf, ctx) { if (rf & 1) {
54
- const _r7 = i0.ɵɵgetCurrentView();
55
- i0.ɵɵelementStart(0, "button", 8);
56
- i0.ɵɵlistener("click", function WhiteboardComponent_button_22_Template_button_click_0_listener() { const a_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onAlign(a_r8.edge)); });
53
+ function WhiteboardComponent_ng_container_7_button_16_Template(rf, ctx) { if (rf & 1) {
54
+ const _r8 = i0.ɵɵgetCurrentView();
55
+ i0.ɵɵelementStart(0, "button", 34);
56
+ i0.ɵɵlistener("click", function WhiteboardComponent_ng_container_7_button_16_Template_button_click_0_listener() { const a_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onAlign(a_r9.edge)); });
57
57
  i0.ɵɵtext(1);
58
58
  i0.ɵɵelementEnd();
59
59
  } if (rf & 2) {
60
- const a_r8 = ctx.$implicit;
61
- const ctx_r2 = i0.ɵɵnextContext();
60
+ const a_r9 = ctx.$implicit;
61
+ const ctx_r2 = i0.ɵɵnextContext(2);
62
62
  i0.ɵɵproperty("disabled", !ctx_r2.canAlign);
63
- i0.ɵɵattribute("title", ctx_r2.locale.alignLabels[a_r8.edge])("data-align", a_r8.edge);
63
+ i0.ɵɵattribute("title", ctx_r2.locale.alignLabels[a_r9.edge])("data-align", a_r9.edge);
64
64
  i0.ɵɵadvance();
65
- i0.ɵɵtextInterpolate(a_r8.glyph);
65
+ i0.ɵɵtextInterpolate(a_r9.glyph);
66
66
  } }
67
- function WhiteboardComponent_button_23_Template(rf, ctx) { if (rf & 1) {
68
- const _r9 = i0.ɵɵgetCurrentView();
69
- i0.ɵɵelementStart(0, "button", 8);
70
- i0.ɵɵlistener("click", function WhiteboardComponent_button_23_Template_button_click_0_listener() { const d_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDistribute(d_r10.axis)); });
67
+ function WhiteboardComponent_ng_container_7_button_17_Template(rf, ctx) { if (rf & 1) {
68
+ const _r10 = i0.ɵɵgetCurrentView();
69
+ i0.ɵɵelementStart(0, "button", 34);
70
+ i0.ɵɵlistener("click", function WhiteboardComponent_ng_container_7_button_17_Template_button_click_0_listener() { const d_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onDistribute(d_r11.axis)); });
71
71
  i0.ɵɵtext(1);
72
72
  i0.ɵɵelementEnd();
73
73
  } if (rf & 2) {
74
- const d_r10 = ctx.$implicit;
75
- const ctx_r2 = i0.ɵɵnextContext();
74
+ const d_r11 = ctx.$implicit;
75
+ const ctx_r2 = i0.ɵɵnextContext(2);
76
76
  i0.ɵɵproperty("disabled", !ctx_r2.canDistribute);
77
- i0.ɵɵattribute("title", ctx_r2.locale.distributeLabels[d_r10.axis])("data-distribute", d_r10.axis);
77
+ i0.ɵɵattribute("title", ctx_r2.locale.distributeLabels[d_r11.axis])("data-distribute", d_r11.axis);
78
78
  i0.ɵɵadvance();
79
- i0.ɵɵtextInterpolate(d_r10.glyph);
79
+ i0.ɵɵtextInterpolate(d_r11.glyph);
80
80
  } }
81
- function WhiteboardComponent__svg_path_36_Template(rf, ctx) { if (rf & 1) {
82
- i0.ɵɵnamespaceSVG();
83
- i0.ɵɵelement(0, "path", 39);
81
+ function WhiteboardComponent_ng_container_7_Template(rf, ctx) { if (rf & 1) {
82
+ const _r7 = i0.ɵɵgetCurrentView();
83
+ i0.ɵɵelementContainerStart(0);
84
+ i0.ɵɵelementStart(1, "button", 34);
85
+ i0.ɵɵlistener("click", function WhiteboardComponent_ng_container_7_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onBringToFront()); });
86
+ i0.ɵɵtext(2, "\u2B06");
87
+ i0.ɵɵelementEnd();
88
+ i0.ɵɵelementStart(3, "button", 34);
89
+ i0.ɵɵlistener("click", function WhiteboardComponent_ng_container_7_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSendToBack()); });
90
+ i0.ɵɵtext(4, "\u2B07");
91
+ i0.ɵɵelementEnd();
92
+ i0.ɵɵelementStart(5, "button", 35);
93
+ i0.ɵɵlistener("click", function WhiteboardComponent_ng_container_7_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onToggleLock()); });
94
+ i0.ɵɵtext(6, "\uD83D\uDD12");
95
+ i0.ɵɵelementEnd();
96
+ i0.ɵɵelementStart(7, "button", 36);
97
+ i0.ɵɵlistener("click", function WhiteboardComponent_ng_container_7_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onGroup()); });
98
+ i0.ɵɵtext(8, "\u29C9");
99
+ i0.ɵɵelementEnd();
100
+ i0.ɵɵelementStart(9, "button", 37);
101
+ i0.ɵɵlistener("click", function WhiteboardComponent_ng_container_7_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onUngroup()); });
102
+ i0.ɵɵtext(10, "\u229F");
103
+ i0.ɵɵelementEnd();
104
+ i0.ɵɵelementStart(11, "button", 38);
105
+ i0.ɵɵlistener("click", function WhiteboardComponent_ng_container_7_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDuplicate()); });
106
+ i0.ɵɵtext(12, "\u29C9\u207A");
107
+ i0.ɵɵelementEnd();
108
+ i0.ɵɵelementStart(13, "button", 34);
109
+ i0.ɵɵlistener("click", function WhiteboardComponent_ng_container_7_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDeleteSelection()); });
110
+ i0.ɵɵtext(14, "\uD83D\uDDD1");
111
+ i0.ɵɵelementEnd();
112
+ i0.ɵɵelement(15, "span", 7);
113
+ i0.ɵɵtemplate(16, WhiteboardComponent_ng_container_7_button_16_Template, 2, 4, "button", 39)(17, WhiteboardComponent_ng_container_7_button_17_Template, 2, 4, "button", 39);
114
+ i0.ɵɵelement(18, "span", 7);
115
+ i0.ɵɵelementContainerEnd();
84
116
  } if (rf & 2) {
85
- const c_r11 = ctx.$implicit;
86
- i0.ɵɵattribute("data-connector-id", c_r11.id)("d", c_r11.d)("stroke", c_r11.stroke)("stroke-width", c_r11.strokeWidth)("stroke-dasharray", c_r11.dash)("opacity", c_r11.opacity)("marker-end", c_r11.markerEnd)("marker-start", c_r11.markerStart);
117
+ const ctx_r2 = i0.ɵɵnextContext();
118
+ i0.ɵɵadvance();
119
+ i0.ɵɵproperty("disabled", !ctx_r2.hasSel);
120
+ i0.ɵɵattribute("title", ctx_r2.locale.bringToFront);
121
+ i0.ɵɵadvance(2);
122
+ i0.ɵɵproperty("disabled", !ctx_r2.hasSel);
123
+ i0.ɵɵattribute("title", ctx_r2.locale.sendToBack);
124
+ i0.ɵɵadvance(2);
125
+ i0.ɵɵproperty("disabled", !ctx_r2.hasSel);
126
+ i0.ɵɵattribute("title", ctx_r2.locale.lock);
127
+ i0.ɵɵadvance(2);
128
+ i0.ɵɵproperty("disabled", !ctx_r2.canGroup);
129
+ i0.ɵɵattribute("title", ctx_r2.locale.group);
130
+ i0.ɵɵadvance(2);
131
+ i0.ɵɵproperty("disabled", !ctx_r2.canUngroup);
132
+ i0.ɵɵattribute("title", ctx_r2.locale.ungroup);
133
+ i0.ɵɵadvance(2);
134
+ i0.ɵɵproperty("disabled", !ctx_r2.hasSel);
135
+ i0.ɵɵattribute("title", ctx_r2.locale.duplicate);
136
+ i0.ɵɵadvance(2);
137
+ i0.ɵɵproperty("disabled", !ctx_r2.hasSel);
138
+ i0.ɵɵattribute("title", ctx_r2.locale.delete);
139
+ i0.ɵɵadvance(3);
140
+ i0.ɵɵproperty("ngForOf", ctx_r2.aligns);
141
+ i0.ɵɵadvance();
142
+ i0.ɵɵproperty("ngForOf", ctx_r2.distributes);
87
143
  } }
88
- function WhiteboardComponent__svg_path_37_Template(rf, ctx) { if (rf & 1) {
144
+ function WhiteboardComponent__svg_path_19_Template(rf, ctx) { if (rf & 1) {
89
145
  i0.ɵɵnamespaceSVG();
90
146
  i0.ɵɵelement(0, "path", 40);
147
+ } if (rf & 2) {
148
+ const c_r12 = ctx.$implicit;
149
+ i0.ɵɵattribute("data-connector-id", c_r12.id)("d", c_r12.d)("stroke", c_r12.stroke)("stroke-width", c_r12.strokeWidth)("stroke-dasharray", c_r12.dash)("opacity", c_r12.opacity)("marker-end", c_r12.markerEnd)("marker-start", c_r12.markerStart);
150
+ } }
151
+ function WhiteboardComponent__svg_path_20_Template(rf, ctx) { if (rf & 1) {
152
+ i0.ɵɵnamespaceSVG();
153
+ i0.ɵɵelement(0, "path", 41);
91
154
  } if (rf & 2) {
92
155
  const ctx_r2 = i0.ɵɵnextContext();
93
156
  i0.ɵɵattribute("d", ctx_r2.connectorPreviewD);
94
157
  } }
95
- function WhiteboardComponent__svg_path_38_Template(rf, ctx) { if (rf & 1) {
158
+ function WhiteboardComponent__svg_path_21_Template(rf, ctx) { if (rf & 1) {
96
159
  i0.ɵɵnamespaceSVG();
97
- i0.ɵɵelement(0, "path", 41);
160
+ i0.ɵɵelement(0, "path", 42);
98
161
  } if (rf & 2) {
99
162
  const ctx_r2 = i0.ɵɵnextContext();
100
163
  i0.ɵɵattribute("d", ctx_r2.drawPreviewPath);
101
164
  } }
102
- function WhiteboardComponent__svg_line_39_Template(rf, ctx) { if (rf & 1) {
165
+ function WhiteboardComponent__svg_line_22_Template(rf, ctx) { if (rf & 1) {
103
166
  i0.ɵɵnamespaceSVG();
104
- i0.ɵɵelement(0, "line", 42);
167
+ i0.ɵɵelement(0, "line", 43);
105
168
  } if (rf & 2) {
106
- const g_r12 = ctx.$implicit;
107
- i0.ɵɵattribute("data-guide-axis", g_r12.axis)("x1", g_r12.x1)("y1", g_r12.y1)("x2", g_r12.x2)("y2", g_r12.y2);
169
+ const g_r13 = ctx.$implicit;
170
+ i0.ɵɵattribute("data-guide-axis", g_r13.axis)("x1", g_r13.x1)("y1", g_r13.y1)("x2", g_r13.x2)("y2", g_r13.y2);
108
171
  } }
109
- function WhiteboardComponent_bm_wb_shape_40_Template(rf, ctx) { if (rf & 1) {
110
- const _r13 = i0.ɵɵgetCurrentView();
111
- i0.ɵɵelementStart(0, "bm-wb-shape", 43);
112
- i0.ɵɵlistener("shapePointerDown", function WhiteboardComponent_bm_wb_shape_40_Template_bm_wb_shape_shapePointerDown_0_listener($event) { const v_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onShapeDown(v_r14.shape.id, $event)); })("shapeDoubleClick", function WhiteboardComponent_bm_wb_shape_40_Template_bm_wb_shape_shapeDoubleClick_0_listener($event) { const v_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onShapeDblClick(v_r14.shape.id, $event)); });
172
+ function WhiteboardComponent_bm_wb_shape_23_Template(rf, ctx) { if (rf & 1) {
173
+ const _r14 = i0.ɵɵgetCurrentView();
174
+ i0.ɵɵelementStart(0, "bm-wb-shape", 44);
175
+ i0.ɵɵlistener("shapePointerDown", function WhiteboardComponent_bm_wb_shape_23_Template_bm_wb_shape_shapePointerDown_0_listener($event) { const v_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onShapeDown(v_r15.shape.id, $event)); })("shapeDoubleClick", function WhiteboardComponent_bm_wb_shape_23_Template_bm_wb_shape_shapeDoubleClick_0_listener($event) { const v_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onShapeDblClick(v_r15.shape.id, $event)); });
113
176
  i0.ɵɵelementEnd();
114
177
  } if (rf & 2) {
115
- const v_r14 = ctx.$implicit;
178
+ const v_r15 = ctx.$implicit;
116
179
  const ctx_r2 = i0.ɵɵnextContext();
117
- i0.ɵɵproperty("shape", v_r14.shape)("selected", v_r14.selected)("dropTarget", ctx_r2.snapshot.dropTargetId === v_r14.shape.id)("lockedLabel", ctx_r2.locale.locked);
180
+ i0.ɵɵproperty("shape", v_r15.shape)("selected", v_r15.selected)("focused", v_r15.focused)("dropTarget", ctx_r2.snapshot.dropTargetId === v_r15.shape.id)("lockedLabel", ctx_r2.locale.locked)("domId", ctx_r2.shapeDomId(v_r15.shape.id))("ariaLabel", v_r15.ariaLabel);
118
181
  } }
119
- function WhiteboardComponent_div_41_Template(rf, ctx) { if (rf & 1) {
120
- i0.ɵɵelement(0, "div", 44);
182
+ function WhiteboardComponent_div_24_Template(rf, ctx) { if (rf & 1) {
183
+ i0.ɵɵelement(0, "div", 45);
121
184
  } if (rf & 2) {
122
- const mq_r15 = ctx.ngIf;
123
- i0.ɵɵstyleProp("left", mq_r15.x, "px")("top", mq_r15.y, "px")("width", mq_r15.width, "px")("height", mq_r15.height, "px");
185
+ const mq_r16 = ctx.ngIf;
186
+ i0.ɵɵstyleProp("left", mq_r16.x, "px")("top", mq_r16.y, "px")("width", mq_r16.width, "px")("height", mq_r16.height, "px");
124
187
  } }
125
- function WhiteboardComponent_div_42_Template(rf, ctx) { if (rf & 1) {
126
- i0.ɵɵelement(0, "div", 45);
188
+ function WhiteboardComponent_div_25_Template(rf, ctx) { if (rf & 1) {
189
+ i0.ɵɵelement(0, "div", 46);
127
190
  } if (rf & 2) {
128
- const cp_r16 = ctx.ngIf;
129
- i0.ɵɵstyleProp("left", cp_r16.x, "px")("top", cp_r16.y, "px")("width", cp_r16.width, "px")("height", cp_r16.height, "px");
191
+ const cp_r17 = ctx.ngIf;
192
+ i0.ɵɵstyleProp("left", cp_r17.x, "px")("top", cp_r17.y, "px")("width", cp_r17.width, "px")("height", cp_r17.height, "px");
130
193
  } }
131
- function WhiteboardComponent_bm_wb_transform_handles_43_Template(rf, ctx) { if (rf & 1) {
132
- const _r17 = i0.ɵɵgetCurrentView();
133
- i0.ɵɵelementStart(0, "bm-wb-transform-handles", 46);
134
- i0.ɵɵlistener("resize", function WhiteboardComponent_bm_wb_transform_handles_43_Template_bm_wb_transform_handles_resize_0_listener($event) { const tv_r18 = i0.ɵɵrestoreView(_r17).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onResizeIntent(tv_r18.shape.id, $event)); })("rotate", function WhiteboardComponent_bm_wb_transform_handles_43_Template_bm_wb_transform_handles_rotate_0_listener($event) { const tv_r18 = i0.ɵɵrestoreView(_r17).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onRotate(tv_r18.shape.id, $event)); });
194
+ function WhiteboardComponent_bm_wb_transform_handles_26_Template(rf, ctx) { if (rf & 1) {
195
+ const _r18 = i0.ɵɵgetCurrentView();
196
+ i0.ɵɵelementStart(0, "bm-wb-transform-handles", 47);
197
+ i0.ɵɵlistener("resize", function WhiteboardComponent_bm_wb_transform_handles_26_Template_bm_wb_transform_handles_resize_0_listener($event) { const tv_r19 = i0.ɵɵrestoreView(_r18).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onResizeIntent(tv_r19.shape.id, $event)); })("rotate", function WhiteboardComponent_bm_wb_transform_handles_26_Template_bm_wb_transform_handles_rotate_0_listener($event) { const tv_r19 = i0.ɵɵrestoreView(_r18).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onRotate(tv_r19.shape.id, $event)); });
135
198
  i0.ɵɵelementEnd();
136
199
  } if (rf & 2) {
137
- const tv_r18 = ctx.ngIf;
138
- i0.ɵɵproperty("view", tv_r18);
200
+ const tv_r19 = ctx.ngIf;
201
+ i0.ɵɵproperty("view", tv_r19);
139
202
  } }
140
- function WhiteboardComponent_button_44_Template(rf, ctx) { if (rf & 1) {
141
- const _r19 = i0.ɵɵgetCurrentView();
142
- i0.ɵɵelementStart(0, "button", 47);
143
- i0.ɵɵlistener("pointerdown", function WhiteboardComponent_button_44_Template_button_pointerdown_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.stop($event)); })("click", function WhiteboardComponent_button_44_Template_button_click_0_listener($event) { const p_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onPinClick(p_r20.id, $event)); });
203
+ function WhiteboardComponent_button_27_Template(rf, ctx) { if (rf & 1) {
204
+ const _r20 = i0.ɵɵgetCurrentView();
205
+ i0.ɵɵelementStart(0, "button", 48);
206
+ i0.ɵɵlistener("pointerdown", function WhiteboardComponent_button_27_Template_button_pointerdown_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.stop($event)); })("click", function WhiteboardComponent_button_27_Template_button_click_0_listener($event) { const p_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onPinClick(p_r21.id, $event)); });
144
207
  i0.ɵɵtext(1);
145
208
  i0.ɵɵelementEnd();
146
209
  } if (rf & 2) {
147
- const p_r20 = ctx.$implicit;
210
+ const p_r21 = ctx.$implicit;
148
211
  const ctx_r2 = i0.ɵɵnextContext();
149
- i0.ɵɵclassMap(ctx_r2.pinClass(p_r20));
150
- i0.ɵɵstyleProp("left", p_r20.x, "px")("top", p_r20.y, "px");
151
- i0.ɵɵattribute("data-comment-id", p_r20.id)("title", p_r20.text);
212
+ i0.ɵɵclassMap(ctx_r2.pinClass(p_r21));
213
+ i0.ɵɵstyleProp("left", p_r21.x, "px")("top", p_r21.y, "px");
214
+ i0.ɵɵattribute("data-comment-id", p_r21.id)("title", p_r21.text);
152
215
  i0.ɵɵadvance();
153
- i0.ɵɵtextInterpolate(p_r20.glyph);
216
+ i0.ɵɵtextInterpolate(p_r21.glyph);
154
217
  } }
155
- function WhiteboardComponent__svg_svg_45__svg_line_1_Template(rf, ctx) { if (rf & 1) {
218
+ function WhiteboardComponent__svg_svg_28__svg_line_1_Template(rf, ctx) { if (rf & 1) {
156
219
  i0.ɵɵnamespaceSVG();
157
- i0.ɵɵelement(0, "line", 50);
220
+ i0.ɵɵelement(0, "line", 51);
158
221
  } if (rf & 2) {
159
- const seg_r21 = ctx.$implicit;
160
- i0.ɵɵattribute("x1", seg_r21.x1)("y1", seg_r21.y1)("x2", seg_r21.x2)("y2", seg_r21.y2)("stroke-opacity", seg_r21.opacity);
222
+ const seg_r22 = ctx.$implicit;
223
+ i0.ɵɵattribute("x1", seg_r22.x1)("y1", seg_r22.y1)("x2", seg_r22.x2)("y2", seg_r22.y2)("stroke-opacity", seg_r22.opacity);
161
224
  } }
162
- function WhiteboardComponent__svg_svg_45_Template(rf, ctx) { if (rf & 1) {
225
+ function WhiteboardComponent__svg_svg_28_Template(rf, ctx) { if (rf & 1) {
163
226
  i0.ɵɵnamespaceSVG();
164
- i0.ɵɵelementStart(0, "svg", 48);
165
- i0.ɵɵtemplate(1, WhiteboardComponent__svg_svg_45__svg_line_1_Template, 1, 5, "line", 49);
227
+ i0.ɵɵelementStart(0, "svg", 49);
228
+ i0.ɵɵtemplate(1, WhiteboardComponent__svg_svg_28__svg_line_1_Template, 1, 5, "line", 50);
166
229
  i0.ɵɵelementEnd();
167
230
  } if (rf & 2) {
168
- const ls_r22 = ctx.ngIf;
231
+ const ls_r23 = ctx.ngIf;
169
232
  const ctx_r2 = i0.ɵɵnextContext();
170
233
  i0.ɵɵadvance();
171
- i0.ɵɵproperty("ngForOf", ls_r22)("ngForTrackBy", ctx_r2.trackIndex);
234
+ i0.ɵɵproperty("ngForOf", ls_r23)("ngForTrackBy", ctx_r2.trackIndex);
172
235
  } }
173
- function WhiteboardComponent_bm_wb_comment_thread_46_Template(rf, ctx) { if (rf & 1) {
174
- const _r23 = i0.ɵɵgetCurrentView();
175
- i0.ɵɵelementStart(0, "bm-wb-comment-thread", 51);
176
- i0.ɵɵlistener("commit", function WhiteboardComponent_bm_wb_comment_thread_46_Template_bm_wb_comment_thread_commit_0_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCommitDraft($event)); })("close", function WhiteboardComponent_bm_wb_comment_thread_46_Template_bm_wb_comment_thread_close_0_listener() { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCancelDraft()); });
236
+ function WhiteboardComponent_bm_wb_comment_thread_29_Template(rf, ctx) { if (rf & 1) {
237
+ const _r24 = i0.ɵɵgetCurrentView();
238
+ i0.ɵɵelementStart(0, "bm-wb-comment-thread", 52);
239
+ i0.ɵɵlistener("commit", function WhiteboardComponent_bm_wb_comment_thread_29_Template_bm_wb_comment_thread_commit_0_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCommitDraft($event)); })("close", function WhiteboardComponent_bm_wb_comment_thread_29_Template_bm_wb_comment_thread_close_0_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCancelDraft()); });
177
240
  i0.ɵɵelementEnd();
178
241
  } if (rf & 2) {
179
- const at_r24 = ctx.ngIf;
242
+ const at_r25 = ctx.ngIf;
180
243
  const ctx_r2 = i0.ɵɵnextContext();
181
- i0.ɵɵproperty("at", at_r24)("initial", "")("existing", false)("resolved", false)("locale", ctx_r2.locale);
244
+ i0.ɵɵproperty("at", at_r25)("initial", "")("existing", false)("resolved", false)("locale", ctx_r2.locale);
182
245
  } }
183
- function WhiteboardComponent_bm_wb_comment_thread_47_Template(rf, ctx) { if (rf & 1) {
184
- const _r25 = i0.ɵɵgetCurrentView();
185
- i0.ɵɵelementStart(0, "bm-wb-comment-thread", 52);
186
- i0.ɵɵlistener("commit", function WhiteboardComponent_bm_wb_comment_thread_47_Template_bm_wb_comment_thread_commit_0_listener($event) { const ot_r26 = i0.ɵɵrestoreView(_r25).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCommitThread(ot_r26.id, $event)); })("close", function WhiteboardComponent_bm_wb_comment_thread_47_Template_bm_wb_comment_thread_close_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCloseThread()); })("resolve", function WhiteboardComponent_bm_wb_comment_thread_47_Template_bm_wb_comment_thread_resolve_0_listener() { const ot_r26 = i0.ɵɵrestoreView(_r25).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onResolveThread(ot_r26.id)); })("delete", function WhiteboardComponent_bm_wb_comment_thread_47_Template_bm_wb_comment_thread_delete_0_listener() { const ot_r26 = i0.ɵɵrestoreView(_r25).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDeleteThread(ot_r26.id)); });
246
+ function WhiteboardComponent_bm_wb_comment_thread_30_Template(rf, ctx) { if (rf & 1) {
247
+ const _r26 = i0.ɵɵgetCurrentView();
248
+ i0.ɵɵelementStart(0, "bm-wb-comment-thread", 53);
249
+ i0.ɵɵlistener("commit", function WhiteboardComponent_bm_wb_comment_thread_30_Template_bm_wb_comment_thread_commit_0_listener($event) { const ot_r27 = i0.ɵɵrestoreView(_r26).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCommitThread(ot_r27.id, $event)); })("close", function WhiteboardComponent_bm_wb_comment_thread_30_Template_bm_wb_comment_thread_close_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCloseThread()); })("resolve", function WhiteboardComponent_bm_wb_comment_thread_30_Template_bm_wb_comment_thread_resolve_0_listener() { const ot_r27 = i0.ɵɵrestoreView(_r26).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onResolveThread(ot_r27.id)); })("delete", function WhiteboardComponent_bm_wb_comment_thread_30_Template_bm_wb_comment_thread_delete_0_listener() { const ot_r27 = i0.ɵɵrestoreView(_r26).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDeleteThread(ot_r27.id)); });
187
250
  i0.ɵɵelementEnd();
188
251
  } if (rf & 2) {
189
- const ot_r26 = ctx.ngIf;
252
+ const ot_r27 = ctx.ngIf;
190
253
  const ctx_r2 = i0.ɵɵnextContext();
191
- i0.ɵɵproperty("at", ot_r26.at)("initial", ot_r26.text)("existing", true)("resolved", ot_r26.resolved)("locale", ctx_r2.locale);
254
+ i0.ɵɵproperty("at", ot_r27.at)("identity", ot_r27.id)("initial", ot_r27.text)("existing", true)("resolved", ot_r27.resolved)("locale", ctx_r2.locale);
192
255
  } }
193
- function WhiteboardComponent_bm_wb_style_panel_48_Template(rf, ctx) { if (rf & 1) {
194
- const _r27 = i0.ɵɵgetCurrentView();
195
- i0.ɵɵelementStart(0, "bm-wb-style-panel", 53);
196
- i0.ɵɵlistener("styleInput", function WhiteboardComponent_bm_wb_style_panel_48_Template_bm_wb_style_panel_styleInput_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onStyleInput($event)); });
256
+ function WhiteboardComponent_bm_wb_style_panel_31_Template(rf, ctx) { if (rf & 1) {
257
+ const _r28 = i0.ɵɵgetCurrentView();
258
+ i0.ɵɵelementStart(0, "bm-wb-style-panel", 54);
259
+ i0.ɵɵlistener("styleInput", function WhiteboardComponent_bm_wb_style_panel_31_Template_bm_wb_style_panel_styleInput_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onStyleInput($event)); });
197
260
  i0.ɵɵelementEnd();
198
261
  } if (rf & 2) {
199
- const ps_r28 = ctx.ngIf;
262
+ const ps_r29 = ctx.ngIf;
200
263
  const ctx_r2 = i0.ɵɵnextContext();
201
- i0.ɵɵstyleMap(ps_r28);
264
+ i0.ɵɵstyleMap(ps_r29);
202
265
  i0.ɵɵproperty("locale", ctx_r2.locale);
203
266
  } }
204
- function WhiteboardComponent_div_49_Template(rf, ctx) { if (rf & 1) {
205
- i0.ɵɵelementStart(0, "div", 54)(1, "span");
267
+ function WhiteboardComponent_div_32_Template(rf, ctx) { if (rf & 1) {
268
+ i0.ɵɵelementStart(0, "div")(1, "span");
206
269
  i0.ɵɵtext(2);
207
270
  i0.ɵɵelementEnd()();
208
271
  } if (rf & 2) {
209
- const u_r29 = ctx.ngIf;
272
+ const u_r30 = ctx.ngIf;
273
+ i0.ɵɵclassMap("bm-wb__toast" + (u_r30.kind === "error" ? " bm-wb__toast--error" : ""));
274
+ i0.ɵɵattribute("role", u_r30.kind === "error" ? "alert" : "status");
210
275
  i0.ɵɵadvance(2);
211
- i0.ɵɵtextInterpolate(u_r29.description);
276
+ i0.ɵɵtextInterpolate(u_r30.description);
212
277
  } }
213
- function WhiteboardComponent_bm_wb_text_dialog_50_Template(rf, ctx) { if (rf & 1) {
214
- const _r30 = i0.ɵɵgetCurrentView();
278
+ function WhiteboardComponent_bm_wb_text_dialog_33_Template(rf, ctx) { if (rf & 1) {
279
+ const _r31 = i0.ɵɵgetCurrentView();
215
280
  i0.ɵɵelementStart(0, "bm-wb-text-dialog", 55);
216
- i0.ɵɵlistener("save", function WhiteboardComponent_bm_wb_text_dialog_50_Template_bm_wb_text_dialog_save_0_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSaveShape($event)); })("close", function WhiteboardComponent_bm_wb_text_dialog_50_Template_bm_wb_text_dialog_close_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCloseDialog()); })("delete", function WhiteboardComponent_bm_wb_text_dialog_50_Template_bm_wb_text_dialog_delete_0_listener() { const ds_r31 = i0.ɵɵrestoreView(_r30).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDeleteShape(ds_r31.id)); });
281
+ i0.ɵɵlistener("save", function WhiteboardComponent_bm_wb_text_dialog_33_Template_bm_wb_text_dialog_save_0_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSaveShape($event)); })("close", function WhiteboardComponent_bm_wb_text_dialog_33_Template_bm_wb_text_dialog_close_0_listener() { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCloseDialog()); })("delete", function WhiteboardComponent_bm_wb_text_dialog_33_Template_bm_wb_text_dialog_delete_0_listener() { const ds_r32 = i0.ɵɵrestoreView(_r31).ngIf; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDeleteShape(ds_r32.id)); });
217
282
  i0.ɵɵelementEnd();
218
283
  } if (rf & 2) {
219
- const ds_r31 = ctx.ngIf;
284
+ const ds_r32 = ctx.ngIf;
220
285
  const ctx_r2 = i0.ɵɵnextContext();
221
- i0.ɵɵproperty("initial", ds_r31.text)("locale", ctx_r2.locale);
286
+ i0.ɵɵproperty("initial", ds_r32.text)("locale", ctx_r2.locale);
222
287
  } }
223
288
  /** Per-instance SVG marker id counter — document-global ids would collide across
224
289
  * two mounted boards and `url(#…)` would resolve to the wrong marker. */
@@ -257,11 +322,24 @@ export class WhiteboardComponent {
257
322
  unsub;
258
323
  zone = inject(NgZone, { optional: true }) ?? undefined;
259
324
  resizeObserver;
260
- tools = WHITEBOARD_TOOLS;
325
+ /** mcp-64: im View-Only bleiben nur select/laser. */
326
+ get tools() { return this.snapshot.config.readOnly ? WHITEBOARD_TOOLS.filter(t => t.id === 'select' || t.id === 'laser') : WHITEBOARD_TOOLS; }
261
327
  aligns = WHITEBOARD_ALIGN;
262
328
  distributes = WHITEBOARD_DISTRIBUTE;
263
- arrowId = `bm-wb-arrow-${wbMarkerSeq++}`;
329
+ // One instance token worn by every id this board mints: the arrow marker (existing
330
+ // shape, unchanged) and the shapes (mcp-78).
331
+ instance = wbMarkerSeq++;
332
+ arrowId = `bm-wb-arrow-${this.instance}`;
333
+ uid = `bm-wb-${this.instance}`;
264
334
  markerUrl = `url(#${this.arrowId})`;
335
+ /** The shared id formula — never a per-stack string concat. */
336
+ shapeDomId(shapeId) { return whiteboardShapeDomId(this.uid, shapeId); }
337
+ /** aria-activedescendant for the board: the controller publishes the id ONLY while
338
+ * that shape is rendered (shapes are culled), so this can never dangle. */
339
+ activeDescendantDomId() {
340
+ const id = this.snapshot.activeDescendantId;
341
+ return id ? this.shapeDomId(id) : null;
342
+ }
265
343
  get ctrl() { return this.ctrlRef; }
266
344
  get snapshot() { return this.snapshotSig(); }
267
345
  get viewport() { return this.snapshot.viewport; }
@@ -430,13 +508,15 @@ export class WhiteboardComponent {
430
508
  this.snapshotSig = sig;
431
509
  }
432
510
  else {
433
- this.binding = createWhiteboardControllerBinding({
511
+ // bimetal-181: der GETTER ist die Aussage — die Pfeilfunktion liest `this` bei
512
+ // jedem Callback-Aufruf erneut, statt den Stand von ngOnInit festzunageln.
513
+ this.binding = createWhiteboardControllerBinding(() => ({
434
514
  store: this.store,
435
515
  canvasId: this.canvasId,
436
516
  config: this.config,
437
- onError: (err) => this.onError?.(err),
517
+ onError: (err) => (this.onError ?? reportUnroutedWhiteboardError)(err),
438
518
  onSelectionChange: this.onSelectionChange,
439
- }, this.zone);
519
+ }), this.zone);
440
520
  this.ctrlRef = this.binding.ctrl;
441
521
  this.snapshotSig = this.binding.snapshot;
442
522
  }
@@ -531,7 +611,9 @@ export class WhiteboardComponent {
531
611
  }
532
612
  onKeydown(e) {
533
613
  this.ctrl.handleKeydown({
534
- key: e.key, ctrlKey: e.ctrlKey, metaKey: e.metaKey, shiftKey: e.shiftKey,
614
+ key: e.key, ctrlKey: e.ctrlKey, metaKey: e.metaKey, shiftKey: e.shiftKey, altKey: e.altKey,
615
+ // isSelfTarget (mcp-78 review R1): the toolbar lives inside this root, so its buttons' keystrokes bubble here. Without this the scene keys swallowed Tab/Enter/Space for every button in the component.
616
+ isSelfTarget: e.target === e.currentTarget,
535
617
  isEditable: isEditableTarget(e.target), preventDefault: () => e.preventDefault(),
536
618
  });
537
619
  }
@@ -573,103 +655,50 @@ export class WhiteboardComponent {
573
655
  } if (rf & 2) {
574
656
  let _t;
575
657
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.viewportRef = _t.first);
576
- } }, hostAttrs: [2, "display", "block", "width", "100%", "height", "100%"], inputs: { controller: "controller", store: "store", canvasId: "canvasId", config: "config", darkMode: "darkMode", dir: "dir", showUndoRedo: "showUndoRedo", onError: "onError", onSelectionChange: "onSelectionChange" }, features: [i0.ɵɵNgOnChangesFeature], decls: 51, vars: 50, consts: [["viewportRef", ""], ["role", "application", "tabindex", "0", 1, "bm-wb", 3, "keydown"], [1, "bm-wb__toolbar"], ["type", "button", "class", "bm-wb__btn bm-wb__btn--undo", 3, "disabled", "click", 4, "ngIf"], ["type", "button", "class", "bm-wb__btn bm-wb__btn--redo", 3, "disabled", "click", 4, "ngIf"], ["class", "bm-wb__toolbar-sep", 4, "ngIf"], ["type", "button", 3, "class", "click", 4, "ngFor", "ngForOf"], [1, "bm-wb__toolbar-sep"], ["type", "button", 1, "bm-wb__btn", 3, "click", "disabled"], ["type", "button", 1, "bm-wb__btn", "bm-wb__lock-btn", 3, "click", "disabled"], ["type", "button", "data-action", "group", 1, "bm-wb__btn", 3, "click", "disabled"], ["type", "button", "data-action", "ungroup", 1, "bm-wb__btn", 3, "click", "disabled"], ["type", "button", "data-action", "duplicate", 1, "bm-wb__btn", 3, "click", "disabled"], ["type", "button", "class", "bm-wb__btn", 3, "disabled", "click", 4, "ngFor", "ngForOf"], ["type", "button", 1, "bm-wb__btn", 3, "click"], [1, "bm-wb__toolbar-zoom"], ["data-testid", "wb-viewport", 3, "pointerdown", "ngStyle"], [1, "bm-wb__scene"], ["data-testid", "wb-connectors", 1, "bm-wb__connectors"], ["markerWidth", "8", "markerHeight", "8", "refX", "7", "refY", "4", "orient", "auto"], ["d", "M0,0 L7,4 L0,8 Z", "fill", "context-stroke"], ["class", "bm-wb__connector", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["class", "bm-wb__connector-preview", 4, "ngIf"], ["class", "bm-wb__draw-preview", "data-testid", "wb-draw-preview", 4, "ngIf"], ["class", "bm-wb__guide", 4, "ngFor", "ngForOf", "ngForTrackBy"], [3, "shape", "selected", "dropTarget", "lockedLabel", "shapePointerDown", "shapeDoubleClick", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["class", "bm-wb__marquee", 3, "left", "top", "width", "height", 4, "ngIf"], ["class", "bm-wb__create-preview", 3, "left", "top", "width", "height", 4, "ngIf"], [3, "view", "resize", "rotate", 4, "ngIf"], ["type", "button", 3, "class", "left", "top", "pointerdown", "click", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["class", "bm-wb__laser-layer", "data-testid", "wb-laser-layer", 4, "ngIf"], [3, "at", "initial", "existing", "resolved", "locale", "commit", "close", 4, "ngIf"], [3, "at", "initial", "existing", "resolved", "locale", "commit", "close", "resolve", "delete", 4, "ngIf"], [3, "style", "locale", "styleInput", 4, "ngIf"], ["class", "bm-wb__toast", "role", "status", 4, "ngIf"], [3, "initial", "locale", "save", "close", "delete", 4, "ngIf"], ["type", "button", 1, "bm-wb__btn", "bm-wb__btn--undo", 3, "click", "disabled"], ["type", "button", 1, "bm-wb__btn", "bm-wb__btn--redo", 3, "click", "disabled"], ["type", "button", 3, "click"], [1, "bm-wb__connector"], [1, "bm-wb__connector-preview"], ["data-testid", "wb-draw-preview", 1, "bm-wb__draw-preview"], [1, "bm-wb__guide"], [3, "shapePointerDown", "shapeDoubleClick", "shape", "selected", "dropTarget", "lockedLabel"], [1, "bm-wb__marquee"], [1, "bm-wb__create-preview"], [3, "resize", "rotate", "view"], ["type", "button", 3, "pointerdown", "click"], ["data-testid", "wb-laser-layer", 1, "bm-wb__laser-layer"], ["class", "bm-wb__laser", "data-testid", "wb-laser", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["data-testid", "wb-laser", 1, "bm-wb__laser"], [3, "commit", "close", "at", "initial", "existing", "resolved", "locale"], [3, "commit", "close", "resolve", "delete", "at", "initial", "existing", "resolved", "locale"], [3, "styleInput", "locale"], ["role", "status", 1, "bm-wb__toast"], [3, "save", "close", "delete", "initial", "locale"]], template: function WhiteboardComponent_Template(rf, ctx) { if (rf & 1) {
658
+ } }, hostAttrs: [2, "display", "block", "width", "100%", "height", "100%"], inputs: { controller: "controller", store: "store", canvasId: "canvasId", config: "config", darkMode: "darkMode", dir: "dir", showUndoRedo: "showUndoRedo", onError: "onError", onSelectionChange: "onSelectionChange" }, features: [i0.ɵɵNgOnChangesFeature], decls: 34, vars: 36, consts: [["viewportRef", ""], ["role", "application", "tabindex", "0", 1, "bm-wb", 3, "keydown"], [1, "bm-wb__toolbar"], ["type", "button", "class", "bm-wb__btn bm-wb__btn--undo", 3, "disabled", "click", 4, "ngIf"], ["type", "button", "class", "bm-wb__btn bm-wb__btn--redo", 3, "disabled", "click", 4, "ngIf"], ["class", "bm-wb__toolbar-sep", 4, "ngIf"], ["type", "button", 3, "class", "click", 4, "ngFor", "ngForOf"], [1, "bm-wb__toolbar-sep"], [4, "ngIf"], ["type", "button", 1, "bm-wb__btn", 3, "click"], [1, "bm-wb__toolbar-zoom"], ["data-testid", "wb-viewport", 3, "pointerdown", "ngStyle"], [1, "bm-wb__scene"], ["data-testid", "wb-connectors", 1, "bm-wb__connectors"], ["markerWidth", "8", "markerHeight", "8", "refX", "7", "refY", "4", "orient", "auto"], ["d", "M0,0 L7,4 L0,8 Z", "fill", "context-stroke"], ["class", "bm-wb__connector", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["class", "bm-wb__connector-preview", 4, "ngIf"], ["class", "bm-wb__draw-preview", "data-testid", "wb-draw-preview", 4, "ngIf"], ["class", "bm-wb__guide", 4, "ngFor", "ngForOf", "ngForTrackBy"], [3, "shape", "selected", "focused", "dropTarget", "lockedLabel", "domId", "ariaLabel", "shapePointerDown", "shapeDoubleClick", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["class", "bm-wb__marquee", 3, "left", "top", "width", "height", 4, "ngIf"], ["class", "bm-wb__create-preview", 3, "left", "top", "width", "height", 4, "ngIf"], [3, "view", "resize", "rotate", 4, "ngIf"], ["type", "button", 3, "class", "left", "top", "pointerdown", "click", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["class", "bm-wb__laser-layer", "data-testid", "wb-laser-layer", 4, "ngIf"], [3, "at", "initial", "existing", "resolved", "locale", "commit", "close", 4, "ngIf"], [3, "at", "identity", "initial", "existing", "resolved", "locale", "commit", "close", "resolve", "delete", 4, "ngIf"], [3, "style", "locale", "styleInput", 4, "ngIf"], [3, "class", 4, "ngIf"], [3, "initial", "locale", "save", "close", "delete", 4, "ngIf"], ["type", "button", 1, "bm-wb__btn", "bm-wb__btn--undo", 3, "click", "disabled"], ["type", "button", 1, "bm-wb__btn", "bm-wb__btn--redo", 3, "click", "disabled"], ["type", "button", 3, "click"], ["type", "button", 1, "bm-wb__btn", 3, "click", "disabled"], ["type", "button", 1, "bm-wb__btn", "bm-wb__lock-btn", 3, "click", "disabled"], ["type", "button", "data-action", "group", 1, "bm-wb__btn", 3, "click", "disabled"], ["type", "button", "data-action", "ungroup", 1, "bm-wb__btn", 3, "click", "disabled"], ["type", "button", "data-action", "duplicate", 1, "bm-wb__btn", 3, "click", "disabled"], ["type", "button", "class", "bm-wb__btn", 3, "disabled", "click", 4, "ngFor", "ngForOf"], [1, "bm-wb__connector"], [1, "bm-wb__connector-preview"], ["data-testid", "wb-draw-preview", 1, "bm-wb__draw-preview"], [1, "bm-wb__guide"], [3, "shapePointerDown", "shapeDoubleClick", "shape", "selected", "focused", "dropTarget", "lockedLabel", "domId", "ariaLabel"], [1, "bm-wb__marquee"], [1, "bm-wb__create-preview"], [3, "resize", "rotate", "view"], ["type", "button", 3, "pointerdown", "click"], ["data-testid", "wb-laser-layer", 1, "bm-wb__laser-layer"], ["class", "bm-wb__laser", "data-testid", "wb-laser", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["data-testid", "wb-laser", 1, "bm-wb__laser"], [3, "commit", "close", "at", "initial", "existing", "resolved", "locale"], [3, "commit", "close", "resolve", "delete", "at", "identity", "initial", "existing", "resolved", "locale"], [3, "styleInput", "locale"], [3, "save", "close", "delete", "initial", "locale"]], template: function WhiteboardComponent_Template(rf, ctx) { if (rf & 1) {
577
659
  const _r1 = i0.ɵɵgetCurrentView();
578
660
  i0.ɵɵelementStart(0, "div", 1);
579
661
  i0.ɵɵlistener("keydown", function WhiteboardComponent_Template_div_keydown_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onKeydown($event)); });
580
662
  i0.ɵɵelementStart(1, "div", 2);
581
663
  i0.ɵɵtemplate(2, WhiteboardComponent_button_2_Template, 2, 3, "button", 3)(3, WhiteboardComponent_button_3_Template, 2, 3, "button", 4)(4, WhiteboardComponent_span_4_Template, 1, 0, "span", 5)(5, WhiteboardComponent_button_5_Template, 2, 6, "button", 6);
582
664
  i0.ɵɵelement(6, "span", 7);
583
- i0.ɵɵelementStart(7, "button", 8);
584
- i0.ɵɵlistener("click", function WhiteboardComponent_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onBringToFront()); });
585
- i0.ɵɵtext(8, "\u2B06");
586
- i0.ɵɵelementEnd();
587
- i0.ɵɵelementStart(9, "button", 8);
588
- i0.ɵɵlistener("click", function WhiteboardComponent_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSendToBack()); });
589
- i0.ɵɵtext(10, "\u2B07");
590
- i0.ɵɵelementEnd();
591
- i0.ɵɵelementStart(11, "button", 9);
592
- i0.ɵɵlistener("click", function WhiteboardComponent_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onToggleLock()); });
593
- i0.ɵɵtext(12, "\uD83D\uDD12");
594
- i0.ɵɵelementEnd();
595
- i0.ɵɵelementStart(13, "button", 10);
596
- i0.ɵɵlistener("click", function WhiteboardComponent_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onGroup()); });
597
- i0.ɵɵtext(14, "\u29C9");
598
- i0.ɵɵelementEnd();
599
- i0.ɵɵelementStart(15, "button", 11);
600
- i0.ɵɵlistener("click", function WhiteboardComponent_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onUngroup()); });
601
- i0.ɵɵtext(16, "\u229F");
665
+ i0.ɵɵtemplate(7, WhiteboardComponent_ng_container_7_Template, 19, 16, "ng-container", 8);
666
+ i0.ɵɵelementStart(8, "button", 9);
667
+ i0.ɵɵlistener("click", function WhiteboardComponent_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onResetViewport()); });
668
+ i0.ɵɵtext(9, "\u2316");
602
669
  i0.ɵɵelementEnd();
603
- i0.ɵɵelementStart(17, "button", 12);
604
- i0.ɵɵlistener("click", function WhiteboardComponent_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDuplicate()); });
605
- i0.ɵɵtext(18, "\u29C9\u207A");
606
- i0.ɵɵelementEnd();
607
- i0.ɵɵelementStart(19, "button", 8);
608
- i0.ɵɵlistener("click", function WhiteboardComponent_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDeleteSelection()); });
609
- i0.ɵɵtext(20, "\uD83D\uDDD1");
610
- i0.ɵɵelementEnd();
611
- i0.ɵɵelement(21, "span", 7);
612
- i0.ɵɵtemplate(22, WhiteboardComponent_button_22_Template, 2, 4, "button", 13)(23, WhiteboardComponent_button_23_Template, 2, 4, "button", 13);
613
- i0.ɵɵelement(24, "span", 7);
614
- i0.ɵɵelementStart(25, "button", 14);
615
- i0.ɵɵlistener("click", function WhiteboardComponent_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onResetViewport()); });
616
- i0.ɵɵtext(26, "\u2316");
617
- i0.ɵɵelementEnd();
618
- i0.ɵɵelementStart(27, "span", 15);
619
- i0.ɵɵtext(28);
670
+ i0.ɵɵelementStart(10, "span", 10);
671
+ i0.ɵɵtext(11);
620
672
  i0.ɵɵelementEnd()();
621
- i0.ɵɵelementStart(29, "div", 16, 0);
622
- i0.ɵɵlistener("pointerdown", function WhiteboardComponent_Template_div_pointerdown_29_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onViewportPointerDown($event)); });
623
- i0.ɵɵelementStart(31, "div", 17);
673
+ i0.ɵɵelementStart(12, "div", 11, 0);
674
+ i0.ɵɵlistener("pointerdown", function WhiteboardComponent_Template_div_pointerdown_12_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onViewportPointerDown($event)); });
675
+ i0.ɵɵelementStart(14, "div", 12);
624
676
  i0.ɵɵnamespaceSVG();
625
- i0.ɵɵelementStart(32, "svg", 18)(33, "defs")(34, "marker", 19);
626
- i0.ɵɵelement(35, "path", 20);
677
+ i0.ɵɵelementStart(15, "svg", 13)(16, "defs")(17, "marker", 14);
678
+ i0.ɵɵelement(18, "path", 15);
627
679
  i0.ɵɵelementEnd()();
628
- i0.ɵɵtemplate(36, WhiteboardComponent__svg_path_36_Template, 1, 8, "path", 21)(37, WhiteboardComponent__svg_path_37_Template, 1, 1, "path", 22)(38, WhiteboardComponent__svg_path_38_Template, 1, 1, "path", 23)(39, WhiteboardComponent__svg_line_39_Template, 1, 5, "line", 24);
680
+ i0.ɵɵtemplate(19, WhiteboardComponent__svg_path_19_Template, 1, 8, "path", 16)(20, WhiteboardComponent__svg_path_20_Template, 1, 1, "path", 17)(21, WhiteboardComponent__svg_path_21_Template, 1, 1, "path", 18)(22, WhiteboardComponent__svg_line_22_Template, 1, 5, "line", 19);
629
681
  i0.ɵɵelementEnd();
630
- i0.ɵɵtemplate(40, WhiteboardComponent_bm_wb_shape_40_Template, 1, 4, "bm-wb-shape", 25)(41, WhiteboardComponent_div_41_Template, 1, 8, "div", 26)(42, WhiteboardComponent_div_42_Template, 1, 8, "div", 27)(43, WhiteboardComponent_bm_wb_transform_handles_43_Template, 1, 1, "bm-wb-transform-handles", 28)(44, WhiteboardComponent_button_44_Template, 2, 9, "button", 29)(45, WhiteboardComponent__svg_svg_45_Template, 2, 2, "svg", 30);
682
+ i0.ɵɵtemplate(23, WhiteboardComponent_bm_wb_shape_23_Template, 1, 7, "bm-wb-shape", 20)(24, WhiteboardComponent_div_24_Template, 1, 8, "div", 21)(25, WhiteboardComponent_div_25_Template, 1, 8, "div", 22)(26, WhiteboardComponent_bm_wb_transform_handles_26_Template, 1, 1, "bm-wb-transform-handles", 23)(27, WhiteboardComponent_button_27_Template, 2, 9, "button", 24)(28, WhiteboardComponent__svg_svg_28_Template, 2, 2, "svg", 25);
631
683
  i0.ɵɵelementEnd();
632
- i0.ɵɵtemplate(46, WhiteboardComponent_bm_wb_comment_thread_46_Template, 1, 5, "bm-wb-comment-thread", 31)(47, WhiteboardComponent_bm_wb_comment_thread_47_Template, 1, 5, "bm-wb-comment-thread", 32);
684
+ i0.ɵɵtemplate(29, WhiteboardComponent_bm_wb_comment_thread_29_Template, 1, 5, "bm-wb-comment-thread", 26)(30, WhiteboardComponent_bm_wb_comment_thread_30_Template, 1, 6, "bm-wb-comment-thread", 27);
633
685
  i0.ɵɵelementEnd();
634
- i0.ɵɵtemplate(48, WhiteboardComponent_bm_wb_style_panel_48_Template, 1, 3, "bm-wb-style-panel", 33)(49, WhiteboardComponent_div_49_Template, 3, 1, "div", 34)(50, WhiteboardComponent_bm_wb_text_dialog_50_Template, 1, 2, "bm-wb-text-dialog", 35);
686
+ i0.ɵɵtemplate(31, WhiteboardComponent_bm_wb_style_panel_31_Template, 1, 3, "bm-wb-style-panel", 28)(32, WhiteboardComponent_div_32_Template, 3, 4, "div", 29)(33, WhiteboardComponent_bm_wb_text_dialog_33_Template, 1, 2, "bm-wb-text-dialog", 30);
635
687
  i0.ɵɵelementEnd();
636
688
  } if (rf & 2) {
637
689
  let tmp_2_0;
638
- i0.ɵɵattribute("data-theme", ctx.darkMode ? "dark" : null)("dir", (tmp_2_0 = ctx.dir) !== null && tmp_2_0 !== undefined ? tmp_2_0 : null)("aria-label", ctx.snapshot.ariaLabel);
690
+ i0.ɵɵattribute("data-theme", ctx.darkMode ? "dark" : null)("dir", (tmp_2_0 = ctx.dir) !== null && tmp_2_0 !== undefined ? tmp_2_0 : null)("aria-label", ctx.snapshot.ariaLabel)("aria-activedescendant", ctx.activeDescendantDomId());
639
691
  i0.ɵɵadvance(2);
640
- i0.ɵɵproperty("ngIf", ctx.showUndoRedo);
692
+ i0.ɵɵproperty("ngIf", ctx.showUndoRedo && !ctx.snapshot.config.readOnly);
641
693
  i0.ɵɵadvance();
642
- i0.ɵɵproperty("ngIf", ctx.showUndoRedo);
694
+ i0.ɵɵproperty("ngIf", ctx.showUndoRedo && !ctx.snapshot.config.readOnly);
643
695
  i0.ɵɵadvance();
644
- i0.ɵɵproperty("ngIf", ctx.showUndoRedo);
696
+ i0.ɵɵproperty("ngIf", ctx.showUndoRedo && !ctx.snapshot.config.readOnly);
645
697
  i0.ɵɵadvance();
646
698
  i0.ɵɵproperty("ngForOf", ctx.tools);
647
699
  i0.ɵɵadvance(2);
648
- i0.ɵɵproperty("disabled", !ctx.hasSel);
649
- i0.ɵɵattribute("title", ctx.locale.bringToFront);
650
- i0.ɵɵadvance(2);
651
- i0.ɵɵproperty("disabled", !ctx.hasSel);
652
- i0.ɵɵattribute("title", ctx.locale.sendToBack);
653
- i0.ɵɵadvance(2);
654
- i0.ɵɵproperty("disabled", !ctx.hasSel);
655
- i0.ɵɵattribute("title", ctx.locale.lock);
656
- i0.ɵɵadvance(2);
657
- i0.ɵɵproperty("disabled", !ctx.canGroup);
658
- i0.ɵɵattribute("title", ctx.locale.group);
659
- i0.ɵɵadvance(2);
660
- i0.ɵɵproperty("disabled", !ctx.canUngroup);
661
- i0.ɵɵattribute("title", ctx.locale.ungroup);
662
- i0.ɵɵadvance(2);
663
- i0.ɵɵproperty("disabled", !ctx.hasSel);
664
- i0.ɵɵattribute("title", ctx.locale.duplicate);
665
- i0.ɵɵadvance(2);
666
- i0.ɵɵproperty("disabled", !ctx.hasSel);
667
- i0.ɵɵattribute("title", ctx.locale.delete);
668
- i0.ɵɵadvance(3);
669
- i0.ɵɵproperty("ngForOf", ctx.aligns);
700
+ i0.ɵɵproperty("ngIf", !ctx.snapshot.config.readOnly);
670
701
  i0.ɵɵadvance();
671
- i0.ɵɵproperty("ngForOf", ctx.distributes);
672
- i0.ɵɵadvance(2);
673
702
  i0.ɵɵattribute("title", ctx.locale.resetZoom);
674
703
  i0.ɵɵadvance(3);
675
704
  i0.ɵɵtextInterpolate1("", ctx.zoomPct, "%");
@@ -705,7 +734,7 @@ export class WhiteboardComponent {
705
734
  i0.ɵɵadvance();
706
735
  i0.ɵɵproperty("ngIf", ctx.openThread);
707
736
  i0.ɵɵadvance();
708
- i0.ɵɵproperty("ngIf", ctx.panelStyle);
737
+ i0.ɵɵproperty("ngIf", !ctx.snapshot.config.readOnly && ctx.panelStyle);
709
738
  i0.ɵɵadvance();
710
739
  i0.ɵɵproperty("ngIf", ctx.undo);
711
740
  i0.ɵɵadvance();
@@ -729,11 +758,12 @@ export class WhiteboardComponent {
729
758
  ],
730
759
  changeDetection: ChangeDetectionStrategy.OnPush,
731
760
  template: `
732
- <div class="bm-wb" [attr.data-theme]="darkMode ? 'dark' : null" [attr.dir]="dir ?? null" role="application" [attr.aria-label]="snapshot.ariaLabel" tabindex="0" (keydown)="onKeydown($event)">
761
+ <div class="bm-wb" [attr.data-theme]="darkMode ? 'dark' : null" [attr.dir]="dir ?? null" role="application" [attr.aria-label]="snapshot.ariaLabel" tabindex="0"
762
+ [attr.aria-activedescendant]="activeDescendantDomId()" (keydown)="onKeydown($event)">
733
763
  <div class="bm-wb__toolbar">
734
- <button *ngIf="showUndoRedo" type="button" class="bm-wb__btn bm-wb__btn--undo" [attr.aria-label]="locale.undo" [attr.title]="locale.undo" [disabled]="!snapshot.canUndo" (click)="onUndo()">↶</button>
735
- <button *ngIf="showUndoRedo" type="button" class="bm-wb__btn bm-wb__btn--redo" [attr.aria-label]="locale.redo" [attr.title]="locale.redo" [disabled]="!snapshot.canRedo" (click)="onRedo()">↷</button>
736
- <span *ngIf="showUndoRedo" class="bm-wb__toolbar-sep"></span>
764
+ <button *ngIf="showUndoRedo && !snapshot.config.readOnly" type="button" class="bm-wb__btn bm-wb__btn--undo" [attr.aria-label]="locale.undo" [attr.title]="locale.undo" [disabled]="!snapshot.canUndo" (click)="onUndo()">↶</button>
765
+ <button *ngIf="showUndoRedo && !snapshot.config.readOnly" type="button" class="bm-wb__btn bm-wb__btn--redo" [attr.aria-label]="locale.redo" [attr.title]="locale.redo" [disabled]="!snapshot.canRedo" (click)="onRedo()">↷</button>
766
+ <span *ngIf="showUndoRedo && !snapshot.config.readOnly" class="bm-wb__toolbar-sep"></span>
737
767
  <button
738
768
  *ngFor="let t of tools"
739
769
  type="button"
@@ -743,6 +773,8 @@ export class WhiteboardComponent {
743
773
  [attr.data-tool]="t.id"
744
774
  (click)="onTool(t.id)">{{ t.glyph }}</button>
745
775
  <span class="bm-wb__toolbar-sep"></span>
776
+ <!-- mcp-64: Mutations-Cluster fällt im View-Only-Modus. -->
777
+ <ng-container *ngIf="!snapshot.config.readOnly">
746
778
  <button type="button" class="bm-wb__btn" [attr.title]="locale.bringToFront" [disabled]="!hasSel" (click)="onBringToFront()">⬆</button>
747
779
  <button type="button" class="bm-wb__btn" [attr.title]="locale.sendToBack" [disabled]="!hasSel" (click)="onSendToBack()">⬇</button>
748
780
  <button type="button" class="bm-wb__btn bm-wb__lock-btn" [attr.title]="locale.lock" [disabled]="!hasSel" (click)="onToggleLock()">🔒</button>
@@ -768,6 +800,7 @@ export class WhiteboardComponent {
768
800
  [disabled]="!canDistribute"
769
801
  (click)="onDistribute(d.axis)">{{ d.glyph }}</button>
770
802
  <span class="bm-wb__toolbar-sep"></span>
803
+ </ng-container>
771
804
  <button type="button" class="bm-wb__btn" [attr.title]="locale.resetZoom" (click)="onResetViewport()">⌖</button>
772
805
  <span class="bm-wb__toolbar-zoom">{{ zoomPct }}%</span>
773
806
  </div>
@@ -809,8 +842,11 @@ export class WhiteboardComponent {
809
842
  *ngFor="let v of snapshot.shapes; trackBy: trackShape"
810
843
  [shape]="v.shape"
811
844
  [selected]="v.selected"
845
+ [focused]="v.focused"
812
846
  [dropTarget]="snapshot.dropTargetId === v.shape.id"
813
847
  [lockedLabel]="locale.locked"
848
+ [domId]="shapeDomId(v.shape.id)"
849
+ [ariaLabel]="v.ariaLabel"
814
850
  (shapePointerDown)="onShapeDown(v.shape.id, $event)"
815
851
  (shapeDoubleClick)="onShapeDblClick(v.shape.id, $event)"></bm-wb-shape>
816
852
 
@@ -858,6 +894,7 @@ export class WhiteboardComponent {
858
894
  <bm-wb-comment-thread
859
895
  *ngIf="openThread as ot"
860
896
  [at]="ot.at"
897
+ [identity]="ot.id"
861
898
  [initial]="ot.text"
862
899
  [existing]="true"
863
900
  [resolved]="ot.resolved"
@@ -868,15 +905,16 @@ export class WhiteboardComponent {
868
905
  (delete)="onDeleteThread(ot.id)"></bm-wb-comment-thread>
869
906
  </div>
870
907
 
908
+ <!-- mcp-64 R1 (Review F7): das Stil-Panel ist eine reine Mutations-Fläche — im View-Only fällt es ganz. -->
871
909
  <bm-wb-style-panel
872
- *ngIf="panelStyle as ps"
910
+ *ngIf="!snapshot.config.readOnly && panelStyle as ps"
873
911
  [style]="ps"
874
912
  [locale]="locale"
875
913
  (styleInput)="onStyleInput($event)"></bm-wb-style-panel>
876
914
 
877
915
  <!-- Feedback-only now (ticket-15): the undo/redo affordance moved to the persistent
878
916
  toolbar buttons; the toast just narrates the last outcome. -->
879
- <div *ngIf="undo as u" class="bm-wb__toast" role="status">
917
+ <div *ngIf="undo as u" [class]="'bm-wb__toast' + (u.kind === 'error' ? ' bm-wb__toast--error' : '')" [attr.role]="u.kind === 'error' ? 'alert' : 'status'">
880
918
  <span>{{ u.description }}</span>
881
919
  </div>
882
920
 
@@ -914,5 +952,5 @@ export class WhiteboardComponent {
914
952
  type: ViewChild,
915
953
  args: ['viewportRef']
916
954
  }] }); })();
917
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WhiteboardComponent, { className: "WhiteboardComponent", filePath: "components/whiteboard.ts", lineNumber: 233 }); })();
955
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WhiteboardComponent, { className: "WhiteboardComponent", filePath: "components/whiteboard.ts", lineNumber: 243 }); })();
918
956
  //# sourceMappingURL=Whiteboard.js.map