@vertexvis/viewer 0.18.1 → 0.18.2-testing.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.
Files changed (226) hide show
  1. package/dist/components/_commonjsHelpers.js +41 -0
  2. package/dist/components/_commonjsHelpers.js.map +1 -0
  3. package/dist/components/browser.esm.js +3173 -0
  4. package/dist/components/browser.esm.js.map +1 -0
  5. package/dist/components/bundle.esm.js +2250 -0
  6. package/dist/components/bundle.esm.js.map +1 -0
  7. package/dist/components/bundle.esm2.js +39740 -0
  8. package/dist/components/bundle.esm2.js.map +1 -0
  9. package/dist/components/config.js +81 -0
  10. package/dist/components/config.js.map +1 -0
  11. package/dist/components/controller.js +7627 -0
  12. package/dist/components/controller.js.map +1 -0
  13. package/dist/components/controller2.js +124 -0
  14. package/dist/components/controller2.js.map +1 -0
  15. package/dist/components/controller3.js +111 -0
  16. package/dist/components/controller3.js.map +1 -0
  17. package/dist/components/cursors.js +110 -0
  18. package/dist/components/cursors.js.map +1 -0
  19. package/dist/components/dom.js +43 -0
  20. package/dist/components/dom.js.map +1 -0
  21. package/dist/components/dom2.js +10 -0
  22. package/dist/components/dom2.js.map +1 -0
  23. package/dist/components/elementRectObserver.js +25 -0
  24. package/dist/components/elementRectObserver.js.map +1 -0
  25. package/dist/components/entities.js +179 -0
  26. package/dist/components/entities.js.map +1 -0
  27. package/dist/components/errors.js +80 -0
  28. package/dist/components/errors.js.map +1 -0
  29. package/dist/components/events.js +11 -0
  30. package/dist/components/events.js.map +1 -0
  31. package/dist/components/index.d.ts +26 -0
  32. package/dist/components/index.js +365 -0
  33. package/dist/components/index.js.map +1 -0
  34. package/dist/components/index2.js +63 -0
  35. package/dist/components/index2.js.map +1 -0
  36. package/dist/components/interactions.js +236 -0
  37. package/dist/components/interactions.js.map +1 -0
  38. package/dist/components/mapper.js +9811 -0
  39. package/dist/components/mapper.js.map +1 -0
  40. package/dist/components/markup.js +33 -0
  41. package/dist/components/markup.js.map +1 -0
  42. package/dist/components/model.js +134 -0
  43. package/dist/components/model.js.map +1 -0
  44. package/dist/components/model2.js +157 -0
  45. package/dist/components/model2.js.map +1 -0
  46. package/dist/components/overlays.js +76 -0
  47. package/dist/components/overlays.js.map +1 -0
  48. package/dist/components/png-decoder.js +2405 -0
  49. package/dist/components/png-decoder.js.map +1 -0
  50. package/dist/components/regl-component.js +12582 -0
  51. package/dist/components/regl-component.js.map +1 -0
  52. package/dist/components/results.js +24 -0
  53. package/dist/components/results.js.map +1 -0
  54. package/dist/components/row.js +32 -0
  55. package/dist/components/row.js.map +1 -0
  56. package/dist/components/scene-tree-search.js +146 -0
  57. package/dist/components/scene-tree-search.js.map +1 -0
  58. package/dist/components/scene-tree-table-layout.js +928 -0
  59. package/dist/components/scene-tree-table-layout.js.map +1 -0
  60. package/dist/components/scene-tree-toolbar.js +35 -0
  61. package/dist/components/scene-tree-toolbar.js.map +1 -0
  62. package/dist/components/scene.js +1508 -0
  63. package/dist/components/scene.js.map +1 -0
  64. package/dist/components/stencil.js +25 -0
  65. package/dist/components/stencil.js.map +1 -0
  66. package/dist/components/streamAttributes.js +40833 -0
  67. package/dist/components/streamAttributes.js.map +1 -0
  68. package/dist/components/templates.js +36 -0
  69. package/dist/components/templates.js.map +1 -0
  70. package/dist/components/tslib.es6.js +125 -0
  71. package/dist/components/tslib.es6.js.map +1 -0
  72. package/dist/components/vertex-scene-tree-search.d.ts +11 -0
  73. package/dist/components/vertex-scene-tree-search.js +11 -0
  74. package/dist/components/vertex-scene-tree-search.js.map +1 -0
  75. package/dist/components/vertex-scene-tree-table-cell.d.ts +11 -0
  76. package/dist/components/vertex-scene-tree-table-cell.js +209 -0
  77. package/dist/components/vertex-scene-tree-table-cell.js.map +1 -0
  78. package/dist/components/vertex-scene-tree-table-column.d.ts +11 -0
  79. package/dist/components/vertex-scene-tree-table-column.js +42 -0
  80. package/dist/components/vertex-scene-tree-table-column.js.map +1 -0
  81. package/dist/components/vertex-scene-tree-table-header.d.ts +11 -0
  82. package/dist/components/vertex-scene-tree-table-header.js +38 -0
  83. package/dist/components/vertex-scene-tree-table-header.js.map +1 -0
  84. package/dist/components/vertex-scene-tree-table-layout.d.ts +11 -0
  85. package/dist/components/vertex-scene-tree-table-layout.js +11 -0
  86. package/dist/components/vertex-scene-tree-table-layout.js.map +1 -0
  87. package/dist/components/vertex-scene-tree-table-resize-divider.d.ts +11 -0
  88. package/dist/components/vertex-scene-tree-table-resize-divider.js +57 -0
  89. package/dist/components/vertex-scene-tree-table-resize-divider.js.map +1 -0
  90. package/dist/components/vertex-scene-tree-toolbar-group.d.ts +11 -0
  91. package/dist/components/vertex-scene-tree-toolbar-group.js +38 -0
  92. package/dist/components/vertex-scene-tree-toolbar-group.js.map +1 -0
  93. package/dist/components/vertex-scene-tree-toolbar.d.ts +11 -0
  94. package/dist/components/vertex-scene-tree-toolbar.js +11 -0
  95. package/dist/components/vertex-scene-tree-toolbar.js.map +1 -0
  96. package/dist/components/vertex-scene-tree.d.ts +11 -0
  97. package/dist/components/vertex-scene-tree.js +803 -0
  98. package/dist/components/vertex-scene-tree.js.map +1 -0
  99. package/dist/components/vertex-viewer-box-query-tool.d.ts +11 -0
  100. package/dist/components/vertex-viewer-box-query-tool.js +352 -0
  101. package/dist/components/vertex-viewer-box-query-tool.js.map +1 -0
  102. package/dist/components/vertex-viewer-button.d.ts +11 -0
  103. package/dist/components/vertex-viewer-button.js +11 -0
  104. package/dist/components/vertex-viewer-button.js.map +1 -0
  105. package/dist/components/vertex-viewer-default-toolbar.d.ts +11 -0
  106. package/dist/components/vertex-viewer-default-toolbar.js +99 -0
  107. package/dist/components/vertex-viewer-default-toolbar.js.map +1 -0
  108. package/dist/components/vertex-viewer-dom-element.d.ts +11 -0
  109. package/dist/components/vertex-viewer-dom-element.js +11 -0
  110. package/dist/components/vertex-viewer-dom-element.js.map +1 -0
  111. package/dist/components/vertex-viewer-dom-group.d.ts +11 -0
  112. package/dist/components/vertex-viewer-dom-group.js +11 -0
  113. package/dist/components/vertex-viewer-dom-group.js.map +1 -0
  114. package/dist/components/vertex-viewer-dom-renderer.d.ts +11 -0
  115. package/dist/components/vertex-viewer-dom-renderer.js +11 -0
  116. package/dist/components/vertex-viewer-dom-renderer.js.map +1 -0
  117. package/dist/components/vertex-viewer-hit-result-indicator.d.ts +11 -0
  118. package/dist/components/vertex-viewer-hit-result-indicator.js +335 -0
  119. package/dist/components/vertex-viewer-hit-result-indicator.js.map +1 -0
  120. package/dist/components/vertex-viewer-icon.d.ts +11 -0
  121. package/dist/components/vertex-viewer-icon.js +11 -0
  122. package/dist/components/vertex-viewer-icon.js.map +1 -0
  123. package/dist/components/vertex-viewer-layer.d.ts +11 -0
  124. package/dist/components/vertex-viewer-layer.js +11 -0
  125. package/dist/components/vertex-viewer-layer.js.map +1 -0
  126. package/dist/components/vertex-viewer-markup-arrow.d.ts +11 -0
  127. package/dist/components/vertex-viewer-markup-arrow.js +11 -0
  128. package/dist/components/vertex-viewer-markup-arrow.js.map +1 -0
  129. package/dist/components/vertex-viewer-markup-circle.d.ts +11 -0
  130. package/dist/components/vertex-viewer-markup-circle.js +11 -0
  131. package/dist/components/vertex-viewer-markup-circle.js.map +1 -0
  132. package/dist/components/vertex-viewer-markup-freeform.d.ts +11 -0
  133. package/dist/components/vertex-viewer-markup-freeform.js +11 -0
  134. package/dist/components/vertex-viewer-markup-freeform.js.map +1 -0
  135. package/dist/components/vertex-viewer-markup-tool.d.ts +11 -0
  136. package/dist/components/vertex-viewer-markup-tool.js +257 -0
  137. package/dist/components/vertex-viewer-markup-tool.js.map +1 -0
  138. package/dist/components/vertex-viewer-markup.d.ts +11 -0
  139. package/dist/components/vertex-viewer-markup.js +362 -0
  140. package/dist/components/vertex-viewer-markup.js.map +1 -0
  141. package/dist/components/vertex-viewer-measurement-details.d.ts +11 -0
  142. package/dist/components/vertex-viewer-measurement-details.js +307 -0
  143. package/dist/components/vertex-viewer-measurement-details.js.map +1 -0
  144. package/dist/components/vertex-viewer-measurement-distance.d.ts +11 -0
  145. package/dist/components/vertex-viewer-measurement-distance.js +1067 -0
  146. package/dist/components/vertex-viewer-measurement-distance.js.map +1 -0
  147. package/dist/components/vertex-viewer-measurement-line.d.ts +11 -0
  148. package/dist/components/vertex-viewer-measurement-line.js +11 -0
  149. package/dist/components/vertex-viewer-measurement-line.js.map +1 -0
  150. package/dist/components/vertex-viewer-measurement-overlays.d.ts +11 -0
  151. package/dist/components/vertex-viewer-measurement-overlays.js +11 -0
  152. package/dist/components/vertex-viewer-measurement-overlays.js.map +1 -0
  153. package/dist/components/vertex-viewer-measurement-precise.d.ts +11 -0
  154. package/dist/components/vertex-viewer-measurement-precise.js +362 -0
  155. package/dist/components/vertex-viewer-measurement-precise.js.map +1 -0
  156. package/dist/components/vertex-viewer-pin-group.d.ts +11 -0
  157. package/dist/components/vertex-viewer-pin-group.js +11 -0
  158. package/dist/components/vertex-viewer-pin-group.js.map +1 -0
  159. package/dist/components/vertex-viewer-pin-label-line.d.ts +11 -0
  160. package/dist/components/vertex-viewer-pin-label-line.js +11 -0
  161. package/dist/components/vertex-viewer-pin-label-line.js.map +1 -0
  162. package/dist/components/vertex-viewer-pin-label.d.ts +11 -0
  163. package/dist/components/vertex-viewer-pin-label.js +11 -0
  164. package/dist/components/vertex-viewer-pin-label.js.map +1 -0
  165. package/dist/components/vertex-viewer-pin-tool.d.ts +11 -0
  166. package/dist/components/vertex-viewer-pin-tool.js +430 -0
  167. package/dist/components/vertex-viewer-pin-tool.js.map +1 -0
  168. package/dist/components/vertex-viewer-spinner.d.ts +11 -0
  169. package/dist/components/vertex-viewer-spinner.js +11 -0
  170. package/dist/components/vertex-viewer-spinner.js.map +1 -0
  171. package/dist/components/vertex-viewer-toolbar-group.d.ts +11 -0
  172. package/dist/components/vertex-viewer-toolbar-group.js +11 -0
  173. package/dist/components/vertex-viewer-toolbar-group.js.map +1 -0
  174. package/dist/components/vertex-viewer-toolbar.d.ts +11 -0
  175. package/dist/components/vertex-viewer-toolbar.js +11 -0
  176. package/dist/components/vertex-viewer-toolbar.js.map +1 -0
  177. package/dist/components/vertex-viewer-transform-widget.d.ts +11 -0
  178. package/dist/components/vertex-viewer-transform-widget.js +838 -0
  179. package/dist/components/vertex-viewer-transform-widget.js.map +1 -0
  180. package/dist/components/vertex-viewer-view-cube.d.ts +11 -0
  181. package/dist/components/vertex-viewer-view-cube.js +270 -0
  182. package/dist/components/vertex-viewer-view-cube.js.map +1 -0
  183. package/dist/components/vertex-viewer.d.ts +11 -0
  184. package/dist/components/vertex-viewer.js +3543 -0
  185. package/dist/components/vertex-viewer.js.map +1 -0
  186. package/dist/components/viewer-button.js +35 -0
  187. package/dist/components/viewer-button.js.map +1 -0
  188. package/dist/components/viewer-dom-element.js +250 -0
  189. package/dist/components/viewer-dom-element.js.map +1 -0
  190. package/dist/components/viewer-dom-group.js +214 -0
  191. package/dist/components/viewer-dom-group.js.map +1 -0
  192. package/dist/components/viewer-dom-renderer.js +295 -0
  193. package/dist/components/viewer-dom-renderer.js.map +1 -0
  194. package/dist/components/viewer-icon.js +87 -0
  195. package/dist/components/viewer-icon.js.map +1 -0
  196. package/dist/components/viewer-layer.js +46 -0
  197. package/dist/components/viewer-layer.js.map +1 -0
  198. package/dist/components/viewer-markup-arrow.js +235 -0
  199. package/dist/components/viewer-markup-arrow.js.map +1 -0
  200. package/dist/components/viewer-markup-circle-components.js +42 -0
  201. package/dist/components/viewer-markup-circle-components.js.map +1 -0
  202. package/dist/components/viewer-markup-circle.js +201 -0
  203. package/dist/components/viewer-markup-circle.js.map +1 -0
  204. package/dist/components/viewer-markup-freeform.js +251 -0
  205. package/dist/components/viewer-markup-freeform.js.map +1 -0
  206. package/dist/components/viewer-measurement-line.js +77 -0
  207. package/dist/components/viewer-measurement-line.js.map +1 -0
  208. package/dist/components/viewer-measurement-overlays.js +184 -0
  209. package/dist/components/viewer-measurement-overlays.js.map +1 -0
  210. package/dist/components/viewer-pin-group.js +207 -0
  211. package/dist/components/viewer-pin-group.js.map +1 -0
  212. package/dist/components/viewer-pin-label-line.js +43 -0
  213. package/dist/components/viewer-pin-label-line.js.map +1 -0
  214. package/dist/components/viewer-pin-label.js +427 -0
  215. package/dist/components/viewer-pin-label.js.map +1 -0
  216. package/dist/components/viewer-spinner.js +53 -0
  217. package/dist/components/viewer-spinner.js.map +1 -0
  218. package/dist/components/viewer-toolbar-group.js +42 -0
  219. package/dist/components/viewer-toolbar-group.js.map +1 -0
  220. package/dist/components/viewer-toolbar.js +61 -0
  221. package/dist/components/viewer-toolbar.js.map +1 -0
  222. package/dist/components/viewport.js +188 -0
  223. package/dist/components/viewport.js.map +1 -0
  224. package/dist/components/wrappers_pb.js +1926 -0
  225. package/dist/components/wrappers_pb.js.map +1 -0
  226. package/package.json +7 -7
@@ -0,0 +1,235 @@
1
+ /*!
2
+ * Copyright (c) 2023 Vertex Software LLC. All rights reserved.
3
+ */
4
+ import { h, proxyCustomElement, HTMLElement, createEvent, Host } from '@stencil/core/internal/client';
5
+ import { g as getMarkupBoundingClientRect } from './dom2.js';
6
+ import { M as MarkupInteractionHandler, t as translatePointToRelative, c as translatePointToScreen, R as RelativeAnchor, d as isValidStartEvent, p as parsePoint, e as createArrowheadPoints, f as isValidPointData, S as SvgShadow, g as arrowheadPointsToPolygonPoints } from './interactions.js';
7
+ import { p as point, c as angle } from './bundle.esm.js';
8
+ import { g as getMouseClientPosition } from './dom.js';
9
+ import { c as classnames } from './index2.js';
10
+
11
+ class ArrowMarkupInteractionHandler extends MarkupInteractionHandler {
12
+ constructor(markupEl, editBegin, editEnd) {
13
+ super();
14
+ this.markupEl = markupEl;
15
+ this.editBegin = editBegin;
16
+ this.editEnd = editEnd;
17
+ this.anchor = 'end';
18
+ }
19
+ editAnchor(anchor, event) {
20
+ if (this.markupEl.mode === 'edit') {
21
+ this.anchor = anchor;
22
+ this.startInteraction(event);
23
+ }
24
+ }
25
+ startInteraction(event) {
26
+ this.handleInteractionAttempt(event);
27
+ }
28
+ computeBoundingRect() {
29
+ return getMarkupBoundingClientRect(this.markupEl);
30
+ }
31
+ handleInteractionAttempt(event) {
32
+ var _a;
33
+ if (this.markupEl.mode !== '' &&
34
+ this.pointerId == null &&
35
+ this.elementBounds != null) {
36
+ this.pointerId = event.pointerId;
37
+ this.markupEl.start =
38
+ (_a = this.markupEl.start) !== null && _a !== void 0 ? _a : translatePointToRelative(getMouseClientPosition(event, this.elementBounds), this.elementBounds);
39
+ this.editBegin.emit();
40
+ this.acceptInteraction();
41
+ }
42
+ }
43
+ handleInteractionMove(event) {
44
+ if (this.elementBounds != null && this.pointerId === event.pointerId) {
45
+ const position = translatePointToRelative(getMouseClientPosition(event, this.elementBounds), this.elementBounds);
46
+ if (this.anchor === 'start') {
47
+ this.markupEl.start = position;
48
+ }
49
+ else if (this.anchor === 'end') {
50
+ this.markupEl.end = position;
51
+ }
52
+ else if (this.markupEl.start != null && this.markupEl.end != null) {
53
+ const center = point.create((this.markupEl.start.x + this.markupEl.end.x) / 2, (this.markupEl.start.y + this.markupEl.end.y) / 2);
54
+ const xDifference = center.x - position.x;
55
+ const yDifference = center.y - position.y;
56
+ this.markupEl.start = point.create(this.markupEl.start.x - xDifference, this.markupEl.start.y - yDifference);
57
+ this.markupEl.end = point.create(this.markupEl.end.x - xDifference, this.markupEl.end.y - yDifference);
58
+ }
59
+ }
60
+ }
61
+ handleInteractionEnd(event) {
62
+ if (this.pointerId === event.pointerId) {
63
+ const screenStart = this.markupEl.start != null && this.elementBounds != null
64
+ ? translatePointToScreen(this.markupEl.start, this.elementBounds)
65
+ : undefined;
66
+ const screenEnd = this.markupEl.end != null && this.elementBounds != null
67
+ ? translatePointToScreen(this.markupEl.end, this.elementBounds)
68
+ : undefined;
69
+ if (this.markupEl.mode !== '' &&
70
+ screenStart != null &&
71
+ screenEnd != null &&
72
+ point.distance(screenStart, screenEnd) >= 2) {
73
+ this.editEnd.emit();
74
+ }
75
+ else {
76
+ this.markupEl.start = undefined;
77
+ this.markupEl.end = undefined;
78
+ }
79
+ this.pointerId = undefined;
80
+ }
81
+ }
82
+ }
83
+
84
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
85
+ const BoundingBox1d = ({ start, end, onStartAnchorPointerDown, onCenterAnchorPointerDown, onEndAnchorPointerDown, }) => {
86
+ const angle$1 = angle.normalize(angle.toDegrees(angle.fromPoints(start, end)) - 270);
87
+ const center = point.create((start.x + end.x) / 2, (start.y + end.y) / 2);
88
+ return (h("div", { class: "bounds-container" },
89
+ h(RelativeAnchor, { id: "bounding-box-1d-start-anchor", name: "start-anchor", rotation: angle$1, point: start, onPointerDown: onStartAnchorPointerDown },
90
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-cap-anchor') })),
91
+ h(RelativeAnchor, { id: "bounding-box-1d-end-anchor", name: "end-anchor", rotation: angle$1, point: end, onPointerDown: onEndAnchorPointerDown },
92
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-cap-anchor') })),
93
+ h(RelativeAnchor, { id: "bounding-box-1d-center-anchor", name: "center-anchor", point: center, onPointerDown: onCenterAnchorPointerDown },
94
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-center-anchor') }))));
95
+ };
96
+
97
+ const viewerMarkupArrowCss = ":host{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;--viewer-markup-arrow-line-stroke-color:var(--red-800);--viewer-markup-arrow-line-stroke-width:4;--viewer-markup-arrow-head-stroke-color:var(--red-800);--viewer-markup-arrow-head-stroke-width:4;--viewer-markup-arrow-head-fill-color:var(--red-800);--viewer-markup-arrow-head-fill-opacity:1;--viewer-markup-arrow-bounds-cap-border-color:var(--blue-400);--viewer-markup-arrow-bounds-cap-border-width:1px;--viewer-markup-arrow-bounds-cap-background-color:white;--viewer-markup-arrow-bounds-center-anchor-border-color:white;--viewer-markup-arrow-bounds-center-anchor-border-width:1px;--viewer-markup-arrow-bounds-center-anchor-background-color:var(--blue-400);--viewer-markup-arrow-bounds-outline-width:1px;--viewer-markup-arrow-bounds-outline-color:var(--blue-400);--viewer-markup-arrow-bounds-anchor-width:9px;--viewer-markup-arrow-bounds-anchor-height:9px}.svg{pointer-events:none;width:100%;height:100%}.create-overlay{pointer-events:auto;position:absolute;left:0;top:0;width:100%;height:100%;cursor:crosshair}.line{pointer-events:auto;stroke:var(--viewer-markup-arrow-line-stroke-color);stroke-width:var(--viewer-markup-arrow-line-stroke-width);cursor:default}.head{pointer-events:auto;stroke:var(--viewer-markup-arrow-head-stroke-color);stroke-width:var(--viewer-markup-arrow-head-stroke-width);fill:var(--viewer-markup-arrow-head-fill-color);fill-opacity:var(--viewer-markup-arrow-head-fill-opacity);cursor:default}.bounds-line{pointer-events:auto;stroke:var(--viewer-markup-arrow-bounds-outline-color);stroke-width:var(--viewer-markup-arrow-bounds-outline-width)}.bounds-container{pointer-events:none;position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden}.bounds-anchor-position{position:absolute;transform:translate(-50%, -50%)}.bounds-anchor{pointer-events:auto;cursor:default;user-select:none}.bounds-default-anchor{width:var(--viewer-markup-arrow-bounds-anchor-width);height:var(--viewer-markup-arrow-bounds-anchor-height);box-sizing:border-box;box-shadow:0 0 2px rgba(0, 0, 0, 0.3)}.bounds-center-anchor{border-radius:100%;border-width:var(--viewer-markup-arrow-bounds-center-anchor-border-width);border-color:var(--viewer-markup-arrow-bounds-center-anchor-border-color);border-style:solid;background-color:var(--viewer-markup-arrow-bounds-center-anchor-background-color)}.bounds-cap-anchor{border-width:var(--viewer-markup-arrow-bounds-cap-border-width);border-color:var(--viewer-markup-arrow-bounds-cap-border-color);border-style:solid;background-color:var(--viewer-markup-arrow-bounds-cap-background-color)}";
98
+
99
+ const ViewerMarkupArrow = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
100
+ constructor() {
101
+ super();
102
+ this.__registerHost();
103
+ this.__attachShadow();
104
+ this.editBegin = createEvent(this, "editBegin", 7);
105
+ this.editEnd = createEvent(this, "editEnd", 7);
106
+ this.viewRendered = createEvent(this, "viewRendered", 7);
107
+ /**
108
+ * A mode that specifies how the markup component should behave. When
109
+ * unset, the component will not respond to interactions with the handles.
110
+ * When `edit`, the markup anchors are interactive and the user is able
111
+ * to reposition them. When `create`, anytime the user clicks on the canvas,
112
+ * a new markup will be performed.
113
+ */
114
+ this.mode = '';
115
+ this.interactionHandler = new ArrowMarkupInteractionHandler(this.hostEl, this.editBegin, this.editEnd);
116
+ this.handleWindowPointerDown = (event) => {
117
+ if (isValidStartEvent(event)) {
118
+ this.interactionHandler.startInteraction(event);
119
+ }
120
+ };
121
+ this.handleTouchStart = (event) => {
122
+ event.preventDefault();
123
+ };
124
+ }
125
+ /**
126
+ * @ignore
127
+ */
128
+ componentWillLoad() {
129
+ this.updateViewport();
130
+ this.handleViewerChanged(this.viewer);
131
+ this.updatePointsFromProps();
132
+ }
133
+ componentDidLoad() {
134
+ this.updatePointsFromProps();
135
+ const resize = new ResizeObserver(() => this.updateViewport());
136
+ resize.observe(this.hostEl);
137
+ if (this.mode === 'create') {
138
+ window.addEventListener('pointerdown', this.handleWindowPointerDown);
139
+ }
140
+ }
141
+ componentDidRender() {
142
+ if (this.mode === '') {
143
+ this.viewRendered.emit();
144
+ }
145
+ }
146
+ disconnectedCallback() {
147
+ this.dispose();
148
+ }
149
+ async dispose() {
150
+ var _a;
151
+ (_a = this.registeredInteraction) === null || _a === void 0 ? void 0 : _a.dispose();
152
+ this.registeredInteraction = undefined;
153
+ window.removeEventListener('pointerdown', this.handleWindowPointerDown);
154
+ }
155
+ /**
156
+ * @ignore
157
+ */
158
+ async handleViewerChanged(newViewer) {
159
+ var _a;
160
+ (_a = this.registeredInteraction) === null || _a === void 0 ? void 0 : _a.dispose();
161
+ this.registeredInteraction = undefined;
162
+ if (newViewer != null) {
163
+ this.registeredInteraction = await newViewer.registerInteractionHandler(this.interactionHandler);
164
+ }
165
+ }
166
+ handleStartJsonChange() {
167
+ this.updatePointsFromProps();
168
+ }
169
+ handleEndJsonChange() {
170
+ this.updatePointsFromProps();
171
+ }
172
+ handleModeChange() {
173
+ if (this.mode !== 'create') {
174
+ window.removeEventListener('pointerdown', this.handleWindowPointerDown);
175
+ }
176
+ }
177
+ updateViewport() {
178
+ const rect = getMarkupBoundingClientRect(this.hostEl);
179
+ this.elementBounds = rect;
180
+ }
181
+ updatePointsFromProps() {
182
+ this.start = this.start || parsePoint(this.startJson);
183
+ this.end = this.end || parsePoint(this.endJson);
184
+ }
185
+ render() {
186
+ if (this.start != null && this.end != null && this.elementBounds != null) {
187
+ const screenStart = translatePointToScreen(this.start, this.elementBounds);
188
+ const screenEnd = translatePointToScreen(this.end, this.elementBounds);
189
+ const arrowheadPoints = createArrowheadPoints(screenStart, screenEnd);
190
+ if (isValidPointData(screenStart, screenEnd)) {
191
+ return (h(Host, null, h("svg", { class: "svg", onTouchStart: this.handleTouchStart }, h("defs", null, h(SvgShadow, { id: "arrow-shadow" })), h("g", { filter: "url(#arrow-shadow)" }, h("polygon", { id: "arrow-head", class: "head", points: arrowheadPointsToPolygonPoints(arrowheadPoints) }), h("line", { id: "arrow-line", class: "line", x1: screenStart.x, y1: screenStart.y, x2: arrowheadPoints.base.x, y2: arrowheadPoints.base.y }), this.mode === 'edit' && (h("line", { id: "bounding-box-1d-line", class: "bounds-line", x1: screenStart.x, y1: screenStart.y, x2: screenEnd.x, y2: screenEnd.y })))), this.mode === 'edit' && (h(BoundingBox1d, { start: screenStart, end: screenEnd, onStartAnchorPointerDown: (event) => this.interactionHandler.editAnchor('start', event), onCenterAnchorPointerDown: (event) => this.interactionHandler.editAnchor('center', event), onEndAnchorPointerDown: (event) => this.interactionHandler.editAnchor('end', event) })), this.mode === 'create' && (h("div", { class: "create-overlay", onTouchStart: this.handleTouchStart }))));
192
+ }
193
+ else {
194
+ return h(Host, null);
195
+ }
196
+ }
197
+ else {
198
+ return (h(Host, null, h("div", { class: "create-overlay", onTouchStart: this.handleTouchStart })));
199
+ }
200
+ }
201
+ get hostEl() { return this; }
202
+ static get watchers() { return {
203
+ "viewer": ["handleViewerChanged"],
204
+ "start": ["handleStartJsonChange"],
205
+ "end": ["handleEndJsonChange"],
206
+ "mode": ["handleModeChange"]
207
+ }; }
208
+ static get style() { return viewerMarkupArrowCss; }
209
+ }, [1, "vertex-viewer-markup-arrow", {
210
+ "start": [1040],
211
+ "startJson": [1, "start"],
212
+ "end": [1040],
213
+ "endJson": [1, "end"],
214
+ "mode": [513],
215
+ "viewer": [16],
216
+ "elementBounds": [32],
217
+ "dispose": [64]
218
+ }]);
219
+ function defineCustomElement() {
220
+ if (typeof customElements === "undefined") {
221
+ return;
222
+ }
223
+ const components = ["vertex-viewer-markup-arrow"];
224
+ components.forEach(tagName => { switch (tagName) {
225
+ case "vertex-viewer-markup-arrow":
226
+ if (!customElements.get(tagName)) {
227
+ customElements.define(tagName, ViewerMarkupArrow);
228
+ }
229
+ break;
230
+ } });
231
+ }
232
+
233
+ export { ViewerMarkupArrow as V, defineCustomElement as d };
234
+
235
+ //# sourceMappingURL=viewer-markup-arrow.js.map
@@ -0,0 +1 @@
1
+ {"file":"viewer-markup-arrow.js","mappings":";;;;;;;;;;MAaa,6BAA8B,SAAQ,wBAAwB;EAIzE,YACmB,QAA4C,EAC5C,SAA6B,EAC7B,OAA2B;IAE5C,KAAK,EAAE,CAAC;IAJS,aAAQ,GAAR,QAAQ,CAAoC;IAC5C,cAAS,GAAT,SAAS,CAAoB;IAC7B,YAAO,GAAP,OAAO,CAAoB;IALtC,WAAM,GAAgC,KAAK,CAAC;GAQnD;EAEM,UAAU,CACf,MAAmC,EACnC,KAAmB;IAEnB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE;MACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;MACrB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;KAC9B;GACF;EAEM,gBAAgB,CAAC,KAAmB;IACzC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;GACtC;EAES,mBAAmB;IAC3B,OAAO,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;GACnD;EAES,wBAAwB,CAAC,KAAmB;;IACpD,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE;MACzB,IAAI,CAAC,SAAS,IAAI,IAAI;MACtB,IAAI,CAAC,aAAa,IAAI,IAAI,EAC1B;MACA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;MACjC,IAAI,CAAC,QAAQ,CAAC,KAAK;QACjB,MAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,mCACnB,wBAAwB,CACtB,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EACjD,IAAI,CAAC,aAAa,CACnB,CAAC;MAEJ,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;MACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;GACF;EAES,qBAAqB,CAAC,KAAmB;IACjD,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;MACpE,MAAM,QAAQ,GAAG,wBAAwB,CACvC,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EACjD,IAAI,CAAC,aAAa,CACnB,CAAC;MACF,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;QAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;OAChC;WAAM,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC;OAC9B;WAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,EAAE;QACnE,MAAM,MAAM,GAAGA,KAAK,CAAC,MAAM,CACzB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EACjD,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAClD,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAE1C,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAGA,KAAK,CAAC,MAAM,CAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,WAAW,EACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,WAAW,CACpC,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAGA,KAAK,CAAC,MAAM,CAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,EACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAClC,CAAC;OACH;KACF;GACF;EAES,oBAAoB,CAAC,KAAmB;IAChD,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;MACtC,MAAM,WAAW,GACf,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;UACrD,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC;UAC/D,SAAS,CAAC;MAChB,MAAM,SAAS,GACb,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;UACnD,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC;UAC7D,SAAS,CAAC;MAEhB,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE;QACzB,WAAW,IAAI,IAAI;QACnB,SAAS,IAAI,IAAI;QACjBA,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,EAC3C;QACA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;OACrB;WAAM;QACL,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,SAAS,CAAC;OAC/B;MAED,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;KAC5B;GACF;;;ACrHH;AAeO,MAAM,aAAa,GAA4C,CAAC,EACrE,KAAK,EACL,GAAG,EACH,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,GACvB;EACC,MAAMC,OAAK,GAAGC,KAAK,CAAC,SAAS,CAC3BA,KAAK,CAAC,SAAS,CAACA,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CACpD,CAAC;EACF,MAAM,MAAM,GAAGF,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;EAE1E,QACE,WAAK,KAAK,EAAC,kBAAkB;IAC3B,EAAC,cAAc,IACb,EAAE,EAAC,8BAA8B,EACjC,IAAI,EAAC,cAAc,EACnB,QAAQ,EAAEC,OAAK,EACf,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,wBAAwB;MAEvC,WAAK,KAAK,EAAEE,UAAU,CAAC,uBAAuB,EAAE,mBAAmB,CAAC,GAAI,CACzD;IACjB,EAAC,cAAc,IACb,EAAE,EAAC,4BAA4B,EAC/B,IAAI,EAAC,YAAY,EACjB,QAAQ,EAAEF,OAAK,EACf,KAAK,EAAE,GAAG,EACV,aAAa,EAAE,sBAAsB;MAErC,WAAK,KAAK,EAAEE,UAAU,CAAC,uBAAuB,EAAE,mBAAmB,CAAC,GAAI,CACzD;IACjB,EAAC,cAAc,IACb,EAAE,EAAC,+BAA+B,EAClC,IAAI,EAAC,eAAe,EACpB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,yBAAyB;MAExC,WACE,KAAK,EAAEA,UAAU,CAAC,uBAAuB,EAAE,sBAAsB,CAAC,GAClE,CACa,CACb,EACN;AACJ,CAAC;;AC3DD,MAAM,oBAAoB,GAAG,wjFAAwjF;;MC0CxkF,iBAAiB;EAL9B;;;;;;;;;;;;;;IA0DS,SAAI,GAA0B,EAAE,CAAC;IAsChC,uBAAkB,GAAG,IAAI,6BAA6B,CAC5D,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,CACb,CAAC;IAsKM,4BAAuB,GAAG,CAAC,KAAmB;MACpD,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE;QAC5B,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;OACjD;KACF,CAAC;IAEM,qBAAgB,GAAG,CAAC,KAAiB;MAC3C,KAAK,CAAC,cAAc,EAAE,CAAC;KACxB,CAAC;GACH;;;;EAxKW,iBAAiB;IACzB,IAAI,CAAC,cAAc,EAAE,CAAC;IACtB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,qBAAqB,EAAE,CAAC;GAC9B;EAES,gBAAgB;IACxB,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAE7B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;MAC1B,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;KACtE;GACF;EAES,kBAAkB;IAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,EAAE;MACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;KAC1B;GACF;EAES,oBAAoB;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;GAChB;EAGM,MAAM,OAAO;;IAClB,MAAA,IAAI,CAAC,qBAAqB,0CAAE,OAAO,EAAE,CAAC;IACtC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAEvC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;GACzE;;;;EAMS,MAAM,mBAAmB,CACjC,SAAmC;;IAEnC,MAAA,IAAI,CAAC,qBAAqB,0CAAE,OAAO,EAAE,CAAC;IACtC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAEvC,IAAI,SAAS,IAAI,IAAI,EAAE;MACrB,IAAI,CAAC,qBAAqB,GAAG,MAAM,SAAS,CAAC,0BAA0B,CACrE,IAAI,CAAC,kBAAkB,CACxB,CAAC;KACH;GACF;EAGS,qBAAqB;IAC7B,IAAI,CAAC,qBAAqB,EAAE,CAAC;GAC9B;EAGS,mBAAmB;IAC3B,IAAI,CAAC,qBAAqB,EAAE,CAAC;GAC9B;EAGS,gBAAgB;IACxB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;MAC1B,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;KACzE;GACF;EAEO,cAAc;IACpB,MAAM,IAAI,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;GAC3B;EAEO,qBAAqB;IAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;GACjD;EAEM,MAAM;IACX,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;MACxE,MAAM,WAAW,GAAG,sBAAsB,CACxC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,aAAa,CACnB,CAAC;MACF,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;MACvE,MAAM,eAAe,GAAG,qBAAqB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;MAEtE,IAAI,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE;QAC5C,QACE,EAAC,IAAI,QACH,WAAK,KAAK,EAAC,KAAK,EAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,IAClD,gBACE,EAAC,SAAS,IAAC,EAAE,EAAC,cAAc,GAAG,CAC1B,EACP,SAAG,MAAM,EAAC,oBAAoB,IAC5B,eACE,EAAE,EAAC,YAAY,EACf,KAAK,EAAC,MAAM,EACZ,MAAM,EAAE,8BAA8B,CAAC,eAAe,CAAC,GACvD,EACF,YACE,EAAE,EAAC,YAAY,EACf,KAAK,EAAC,MAAM,EACZ,EAAE,EAAE,WAAW,CAAC,CAAC,EACjB,EAAE,EAAE,WAAW,CAAC,CAAC,EACjB,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,EAC1B,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,GAC1B,EACD,IAAI,CAAC,IAAI,KAAK,MAAM,KACnB,YACE,EAAE,EAAC,sBAAsB,EACzB,KAAK,EAAC,aAAa,EACnB,EAAE,EAAE,WAAW,CAAC,CAAC,EACjB,EAAE,EAAE,WAAW,CAAC,CAAC,EACjB,EAAE,EAAE,SAAS,CAAC,CAAC,EACf,EAAE,EAAE,SAAS,CAAC,CAAC,GACf,CACH,CACC,CACA,EACL,IAAI,CAAC,IAAI,KAAK,MAAM,KACnB,EAAC,aAAa,IACZ,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,SAAS,EACd,wBAAwB,EAAE,CAAC,KAAK,KAC9B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,EAEpD,yBAAyB,EAAE,CAAC,KAAK,KAC/B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,EAErD,sBAAsB,EAAE,CAAC,KAAK,KAC5B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,GAElD,CACH,EACA,IAAI,CAAC,IAAI,KAAK,QAAQ,KACrB,WACE,KAAK,EAAC,gBAAgB,EACtB,YAAY,EAAE,IAAI,CAAC,gBAAgB,GAC9B,CACR,CACI,EACP;OACH;WAAM;QACL,OAAO,EAAC,IAAI,OAAQ,CAAC;OACtB;KACF;SAAM;MACL,QACE,EAAC,IAAI,QACH,WACE,KAAK,EAAC,gBAAgB,EACtB,YAAY,EAAE,IAAI,CAAC,gBAAgB,GAC9B,CACF,EACP;KACH;GACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["Point","angle","Angle","classNames"],"sources":["./src/components/viewer-markup-arrow/interactions.ts","./src/components/viewer-markup-arrow/viewer-markup-arrow-components.tsx","./src/components/viewer-markup-arrow/viewer-markup-arrow.css?tag=vertex-viewer-markup-arrow&encapsulation=shadow","./src/components/viewer-markup-arrow/viewer-markup-arrow.tsx"],"sourcesContent":["import type { EventEmitter } from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { MarkupInteractionHandler } from '../../lib/markup/interactions';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n translatePointToRelative,\n translatePointToScreen,\n} from '../viewer-markup/markup-utils';\n\ntype ViewerMarkupArrowEditAnchor = 'start' | 'end' | 'center';\n\nexport class ArrowMarkupInteractionHandler extends MarkupInteractionHandler {\n private pointerId?: number;\n private anchor: ViewerMarkupArrowEditAnchor = 'end';\n\n public constructor(\n private readonly markupEl: HTMLVertexViewerMarkupArrowElement,\n private readonly editBegin: EventEmitter<void>,\n private readonly editEnd: EventEmitter<void>\n ) {\n super();\n }\n\n public editAnchor(\n anchor: ViewerMarkupArrowEditAnchor,\n event: PointerEvent\n ): void {\n if (this.markupEl.mode === 'edit') {\n this.anchor = anchor;\n this.startInteraction(event);\n }\n }\n\n public startInteraction(event: PointerEvent): void {\n this.handleInteractionAttempt(event);\n }\n\n protected computeBoundingRect(): DOMRect {\n return getMarkupBoundingClientRect(this.markupEl);\n }\n\n protected handleInteractionAttempt(event: PointerEvent): void {\n if (\n this.markupEl.mode !== '' &&\n this.pointerId == null &&\n this.elementBounds != null\n ) {\n this.pointerId = event.pointerId;\n this.markupEl.start =\n this.markupEl.start ??\n translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n\n this.editBegin.emit();\n this.acceptInteraction();\n }\n }\n\n protected handleInteractionMove(event: PointerEvent): void {\n if (this.elementBounds != null && this.pointerId === event.pointerId) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n if (this.anchor === 'start') {\n this.markupEl.start = position;\n } else if (this.anchor === 'end') {\n this.markupEl.end = position;\n } else if (this.markupEl.start != null && this.markupEl.end != null) {\n const center = Point.create(\n (this.markupEl.start.x + this.markupEl.end.x) / 2,\n (this.markupEl.start.y + this.markupEl.end.y) / 2\n );\n const xDifference = center.x - position.x;\n const yDifference = center.y - position.y;\n\n this.markupEl.start = Point.create(\n this.markupEl.start.x - xDifference,\n this.markupEl.start.y - yDifference\n );\n this.markupEl.end = Point.create(\n this.markupEl.end.x - xDifference,\n this.markupEl.end.y - yDifference\n );\n }\n }\n }\n\n protected handleInteractionEnd(event: PointerEvent): void {\n if (this.pointerId === event.pointerId) {\n const screenStart =\n this.markupEl.start != null && this.elementBounds != null\n ? translatePointToScreen(this.markupEl.start, this.elementBounds)\n : undefined;\n const screenEnd =\n this.markupEl.end != null && this.elementBounds != null\n ? translatePointToScreen(this.markupEl.end, this.elementBounds)\n : undefined;\n\n if (\n this.markupEl.mode !== '' &&\n screenStart != null &&\n screenEnd != null &&\n Point.distance(screenStart, screenEnd) >= 2\n ) {\n this.editEnd.emit();\n } else {\n this.markupEl.start = undefined;\n this.markupEl.end = undefined;\n }\n\n this.pointerId = undefined;\n }\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Angle, Point } from '@vertexvis/geometry';\nimport classNames from 'classnames';\n\nimport { RelativeAnchor } from '../viewer-markup/viewer-markup-components';\n\nexport interface BoundingBox1dProps {\n start: Point.Point;\n end: Point.Point;\n onStartAnchorPointerDown?: (event: PointerEvent) => void;\n onCenterAnchorPointerDown?: (event: PointerEvent) => void;\n onEndAnchorPointerDown?: (event: PointerEvent) => void;\n}\n\nexport const BoundingBox1d: FunctionalComponent<BoundingBox1dProps> = ({\n start,\n end,\n onStartAnchorPointerDown,\n onCenterAnchorPointerDown,\n onEndAnchorPointerDown,\n}) => {\n const angle = Angle.normalize(\n Angle.toDegrees(Angle.fromPoints(start, end)) - 270\n );\n const center = Point.create((start.x + end.x) / 2, (start.y + end.y) / 2);\n\n return (\n <div class=\"bounds-container\">\n <RelativeAnchor\n id=\"bounding-box-1d-start-anchor\"\n name=\"start-anchor\"\n rotation={angle}\n point={start}\n onPointerDown={onStartAnchorPointerDown}\n >\n <div class={classNames('bounds-default-anchor', 'bounds-cap-anchor')} />\n </RelativeAnchor>\n <RelativeAnchor\n id=\"bounding-box-1d-end-anchor\"\n name=\"end-anchor\"\n rotation={angle}\n point={end}\n onPointerDown={onEndAnchorPointerDown}\n >\n <div class={classNames('bounds-default-anchor', 'bounds-cap-anchor')} />\n </RelativeAnchor>\n <RelativeAnchor\n id=\"bounding-box-1d-center-anchor\"\n name=\"center-anchor\"\n point={center}\n onPointerDown={onCenterAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-center-anchor')}\n />\n </RelativeAnchor>\n </div>\n );\n};\n",":host {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n /**\n * @prop --viewer-markup-arrow-line-stroke-color: A CSS color that\n * specifies the color of the arrow line's outline.\n */\n --viewer-markup-arrow-line-stroke-color: var(--red-800);\n /**\n * @prop --viewer-markup-arrow-line-stroke-width: A CSS length that\n * specifies the width of the arrow line's outline.\n */\n --viewer-markup-arrow-line-stroke-width: 4;\n /**\n * @prop --viewer-markup-arrow-head-stroke-color: A CSS color that\n * specifies the color of the arrow head's outline.\n */\n --viewer-markup-arrow-head-stroke-color: var(--red-800);\n /**\n * @prop --viewer-markup-arrow-head-stroke-width: A CSS length that\n * specifies the width of the arrow head's outline.\n */\n --viewer-markup-arrow-head-stroke-width: 4;\n /**\n * @prop --viewer-markup-arrow-head-fill-color: A CSS color that\n * specifies the color of the arrow head's fill.\n */\n --viewer-markup-arrow-head-fill-color: var(--red-800);\n /**\n * @prop --viewer-markup-arrow-head-fill-opacity: A number between \n * 0 and 1 that specifies the opacity of the arrow head's fill.\n */\n --viewer-markup-arrow-head-fill-opacity: 1;\n /**\n * @prop --viewer-markup-arrow-bounds-cap-border-color: A CSS color that\n * specifies the color of arrow start/end resize anchors' border.\n */\n --viewer-markup-arrow-bounds-cap-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-arrow-bounds-cap-border-width: A CSS length that\n * specifies the width of arrow start/end resize anchors' border.\n */\n --viewer-markup-arrow-bounds-cap-border-width: 1px;\n /**\n * @prop --viewer-markup-arrow-bounds-cap-background-color: A CSS color that\n * specifies the background color of the arrow start/end resize anchors.\n */\n --viewer-markup-arrow-bounds-cap-background-color: white;\n /**\n * @prop --viewer-markup-arrow-bounds-center-anchor-border-color: A CSS color that\n * specifies the color of the center resize anchor's border.\n */\n --viewer-markup-arrow-bounds-center-anchor-border-color: white;\n /**\n * @prop --viewer-markup-arrow-bounds-center-anchor-border-width: A CSS length that\n * specifies the width of the center resize anchor's border.\n */\n --viewer-markup-arrow-bounds-center-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-arrow-bounds-center-anchor-background-color: A CSS color that\n * specifies the background color of the center resize anchor.\n */\n --viewer-markup-arrow-bounds-center-anchor-background-color: var(--blue-400);\n /**\n * @prop --viewer-markup-arrow-bounds-outline-width: A CSS color that\n * specifies the width of the selected arrow outline.\n */\n --viewer-markup-arrow-bounds-outline-width: 1px;\n /**\n * @prop --viewer-markup-arrow-bounds-outline-color: A CSS color that\n * specifies the color of selected arrow outline.\n */\n --viewer-markup-arrow-bounds-outline-color: var(--blue-400);\n /**\n * @prop --viewer-markup-arrow-bounds-anchor-width: A CSS length that\n * specifies the width of the resize and reposition anchors.\n */\n --viewer-markup-arrow-bounds-anchor-width: 9px;\n /**\n * @prop --viewer-markup-arrow-bounds-anchor-height: A CSS length that\n * specifies the height of the resize and reposition anchors.\n */\n --viewer-markup-arrow-bounds-anchor-height: 9px;\n ;\n}\n\n.svg {\n pointer-events: none;\n width: 100%;\n height: 100%;\n}\n\n.create-overlay {\n pointer-events: auto;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n cursor: crosshair;\n}\n\n.line {\n pointer-events: auto;\n stroke: var(--viewer-markup-arrow-line-stroke-color);\n stroke-width: var(--viewer-markup-arrow-line-stroke-width);\n cursor: default;\n}\n\n.head {\n pointer-events: auto;\n stroke: var(--viewer-markup-arrow-head-stroke-color);\n stroke-width: var(--viewer-markup-arrow-head-stroke-width);\n fill: var(--viewer-markup-arrow-head-fill-color);\n fill-opacity: var(--viewer-markup-arrow-head-fill-opacity);\n cursor: default;\n}\n\n.bounds-line {\n pointer-events: auto;\n stroke: var(--viewer-markup-arrow-bounds-outline-color);\n stroke-width: var(--viewer-markup-arrow-bounds-outline-width);\n}\n\n.bounds-container {\n pointer-events: none;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n.bounds-anchor-position {\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.bounds-anchor {\n pointer-events: auto;\n cursor: default;\n user-select: none;\n}\n\n.bounds-default-anchor {\n width: var(--viewer-markup-arrow-bounds-anchor-width);\n height: var(--viewer-markup-arrow-bounds-anchor-height);\n box-sizing: border-box;\n box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-center-anchor {\n border-radius: 100%;\n border-width: var(--viewer-markup-arrow-bounds-center-anchor-border-width);\n border-color: var(--viewer-markup-arrow-bounds-center-anchor-border-color);\n border-style: solid;\n background-color: var(--viewer-markup-arrow-bounds-center-anchor-background-color);\n}\n\n.bounds-cap-anchor {\n border-width: var(--viewer-markup-arrow-bounds-cap-border-width);\n border-color: var(--viewer-markup-arrow-bounds-cap-border-color);\n border-style: solid;\n background-color: var(--viewer-markup-arrow-bounds-cap-background-color);\n}","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidPointData,\n isValidStartEvent,\n translatePointToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { ArrowMarkupInteractionHandler } from './interactions';\nimport {\n arrowheadPointsToPolygonPoints,\n createArrowheadPoints,\n parsePoint,\n} from './utils';\nimport { BoundingBox1d } from './viewer-markup-arrow-components';\n\n/**\n * The supported arrow markup modes.\n *\n * @see {@link ViewerMarkupArrowMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupArrowMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-arrow',\n styleUrl: 'viewer-markup-arrow.css',\n shadow: true,\n})\nexport class ViewerMarkupArrow {\n /**\n * The position of the starting anchor. Can either be an instance of a\n * `Point` or a JSON string representation in the format of `[x, y]` or\n * `{\"x\": 0, \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public start?: Point.Point;\n\n /**\n * The position of the starting anchor, as a JSON string. Can either be an\n * instance of a `Point` or a JSON string representation in the format of\n * `[x, y]` or `{\"x\": 0, \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ attribute: 'start' })\n public startJson?: string;\n\n /**\n * The position of the ending anchor. Can either be an instance of a `Point`\n * or a JSON string representation in the format of `[x, y]` or `{\"x\": 0,\n * \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ mutable: true })\n public end?: Point.Point;\n\n /**\n * The position of the ending anchor, as a JSON string. Can either be an\n * instance of a `Point` or a JSON string representation in the format of\n * `[x, y]` or `{\"x\": 0, \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ attribute: 'end' })\n public endJson?: string;\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupArrowMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * An event that is dispatched anytime the user begins editing the\n * markup.\n */\n @Event({ bubbles: true })\n public editBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished editing the\n * markup.\n */\n @Event({ bubbles: true })\n public editEnd!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when this markup element is in view\n * mode (`this.mode === \"\"`), and it completes a rerender.\n */\n @Event({ bubbles: true })\n public viewRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupArrowElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n private interactionHandler = new ArrowMarkupInteractionHandler(\n this.hostEl,\n this.editBegin,\n this.editEnd\n );\n\n private registeredInteraction?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.updatePointsFromProps();\n }\n\n protected componentDidLoad(): void {\n this.updatePointsFromProps();\n\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected componentDidRender(): void {\n if (this.mode === '') {\n this.viewRendered.emit();\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(\n newViewer?: HTMLVertexViewerElement\n ): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n if (newViewer != null) {\n this.registeredInteraction = await newViewer.registerInteractionHandler(\n this.interactionHandler\n );\n }\n }\n\n @Watch('start')\n protected handleStartJsonChange(): void {\n this.updatePointsFromProps();\n }\n\n @Watch('end')\n protected handleEndJsonChange(): void {\n this.updatePointsFromProps();\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private updatePointsFromProps(): void {\n this.start = this.start || parsePoint(this.startJson);\n this.end = this.end || parsePoint(this.endJson);\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (this.start != null && this.end != null && this.elementBounds != null) {\n const screenStart = translatePointToScreen(\n this.start,\n this.elementBounds\n );\n const screenEnd = translatePointToScreen(this.end, this.elementBounds);\n const arrowheadPoints = createArrowheadPoints(screenStart, screenEnd);\n\n if (isValidPointData(screenStart, screenEnd)) {\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"arrow-shadow\" />\n </defs>\n <g filter=\"url(#arrow-shadow)\">\n <polygon\n id=\"arrow-head\"\n class=\"head\"\n points={arrowheadPointsToPolygonPoints(arrowheadPoints)}\n />\n <line\n id=\"arrow-line\"\n class=\"line\"\n x1={screenStart.x}\n y1={screenStart.y}\n x2={arrowheadPoints.base.x}\n y2={arrowheadPoints.base.y}\n />\n {this.mode === 'edit' && (\n <line\n id=\"bounding-box-1d-line\"\n class=\"bounds-line\"\n x1={screenStart.x}\n y1={screenStart.y}\n x2={screenEnd.x}\n y2={screenEnd.y}\n />\n )}\n </g>\n </svg>\n {this.mode === 'edit' && (\n <BoundingBox1d\n start={screenStart}\n end={screenEnd}\n onStartAnchorPointerDown={(event) =>\n this.interactionHandler.editAnchor('start', event)\n }\n onCenterAnchorPointerDown={(event) =>\n this.interactionHandler.editAnchor('center', event)\n }\n onEndAnchorPointerDown={(event) =>\n this.interactionHandler.editAnchor('end', event)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return <Host></Host>;\n }\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n}\n"],"version":3}
@@ -0,0 +1,42 @@
1
+ /*!
2
+ * Copyright (c) 2023 Vertex Software LLC. All rights reserved.
3
+ */
4
+ import { h } from '@stencil/core/internal/client';
5
+ import { e as rectangle } from './bundle.esm.js';
6
+ import { c as classnames } from './index2.js';
7
+ import { R as RelativeAnchor, n as getBoundingBox2dAnchorPosition } from './interactions.js';
8
+
9
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
10
+ const BoundingBox2d = ({ bounds, onTopLeftAnchorPointerDown, onLeftAnchorPointerDown, onTopRightAnchorPointerDown, onRightAnchorPointerDown, onBottomLeftAnchorPointerDown, onBottomAnchorPointerDown, onBottomRightAnchorPointerDown, onTopAnchorPointerDown, onCenterAnchorPointerDown, }) => {
11
+ const padded = rectangle.pad(bounds, 6);
12
+ const center = rectangle.center(padded);
13
+ return (h("div", { class: "bounds-container" },
14
+ h("div", { class: "bounds-outline", style: {
15
+ top: `${padded.y}px`,
16
+ left: `${padded.x}px`,
17
+ width: `${padded.width}px`,
18
+ height: `${padded.height}px`,
19
+ } }),
20
+ h(RelativeAnchor, { id: "bounding-box-2d-top-left-anchor", name: "top-left-anchor", point: getBoundingBox2dAnchorPosition(padded, 'top-left'), onPointerDown: onTopLeftAnchorPointerDown },
21
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-edge-anchor') })),
22
+ h(RelativeAnchor, { id: "bounding-box-2d-left-anchor", name: "left-anchor", point: getBoundingBox2dAnchorPosition(padded, 'left'), onPointerDown: onLeftAnchorPointerDown },
23
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-edge-anchor') })),
24
+ h(RelativeAnchor, { id: "bounding-box-2d-top-right-anchor", name: "top-right-anchor", point: getBoundingBox2dAnchorPosition(padded, 'top-right'), onPointerDown: onTopRightAnchorPointerDown },
25
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-edge-anchor') })),
26
+ h(RelativeAnchor, { id: "bounding-box-2d-right-anchor", name: "right-anchor", point: getBoundingBox2dAnchorPosition(padded, 'right'), onPointerDown: onRightAnchorPointerDown },
27
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-edge-anchor') })),
28
+ h(RelativeAnchor, { id: "bounding-box-2d-bottom-left-anchor", name: "bottom-left-anchor", point: getBoundingBox2dAnchorPosition(padded, 'bottom-left'), onPointerDown: onBottomLeftAnchorPointerDown },
29
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-edge-anchor') })),
30
+ h(RelativeAnchor, { id: "bounding-box-2d-bottom-anchor", name: "bottom-anchor", point: getBoundingBox2dAnchorPosition(padded, 'bottom'), onPointerDown: onBottomAnchorPointerDown },
31
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-edge-anchor') })),
32
+ h(RelativeAnchor, { id: "bounding-box-2d-bottom-right-anchor", name: "bottom-right-anchor", point: getBoundingBox2dAnchorPosition(padded, 'bottom-right'), onPointerDown: onBottomRightAnchorPointerDown },
33
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-edge-anchor') })),
34
+ h(RelativeAnchor, { id: "bounding-box-2d-top-anchor", name: "top-anchor", point: getBoundingBox2dAnchorPosition(padded, 'top'), onPointerDown: onTopAnchorPointerDown },
35
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-edge-anchor') })),
36
+ h(RelativeAnchor, { id: "bounding-box-2d-center-anchor", name: "center-anchor", point: center, onPointerDown: onCenterAnchorPointerDown },
37
+ h("div", { class: classnames('bounds-default-anchor', 'bounds-center-anchor') }))));
38
+ };
39
+
40
+ export { BoundingBox2d as B };
41
+
42
+ //# sourceMappingURL=viewer-markup-circle-components.js.map
@@ -0,0 +1 @@
1
+ {"file":"viewer-markup-circle-components.js","mappings":"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","names":["Rectangle","classNames"],"sources":["./src/components/viewer-markup-circle/viewer-markup-circle-components.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Rectangle } from '@vertexvis/geometry';\nimport classNames from 'classnames';\n\nimport { getBoundingBox2dAnchorPosition } from '../viewer-markup/markup-utils';\nimport { RelativeAnchor } from '../viewer-markup/viewer-markup-components';\n\nexport interface BoundingBox2dProps {\n bounds: Rectangle.Rectangle;\n onTopLeftAnchorPointerDown?: (event: PointerEvent) => void;\n onLeftAnchorPointerDown?: (event: PointerEvent) => void;\n onTopRightAnchorPointerDown?: (event: PointerEvent) => void;\n onRightAnchorPointerDown?: (event: PointerEvent) => void;\n onBottomLeftAnchorPointerDown?: (event: PointerEvent) => void;\n onBottomAnchorPointerDown?: (event: PointerEvent) => void;\n onBottomRightAnchorPointerDown?: (event: PointerEvent) => void;\n onTopAnchorPointerDown?: (event: PointerEvent) => void;\n onCenterAnchorPointerDown?: (event: PointerEvent) => void;\n}\n\nexport const BoundingBox2d: FunctionalComponent<BoundingBox2dProps> = ({\n bounds,\n onTopLeftAnchorPointerDown,\n onLeftAnchorPointerDown,\n onTopRightAnchorPointerDown,\n onRightAnchorPointerDown,\n onBottomLeftAnchorPointerDown,\n onBottomAnchorPointerDown,\n onBottomRightAnchorPointerDown,\n onTopAnchorPointerDown,\n onCenterAnchorPointerDown,\n}) => {\n const padded = Rectangle.pad(bounds, 6);\n const center = Rectangle.center(padded);\n\n return (\n <div class=\"bounds-container\">\n <div\n class=\"bounds-outline\"\n style={{\n top: `${padded.y}px`,\n left: `${padded.x}px`,\n width: `${padded.width}px`,\n height: `${padded.height}px`,\n }}\n ></div>\n <RelativeAnchor\n id=\"bounding-box-2d-top-left-anchor\"\n name=\"top-left-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'top-left')}\n onPointerDown={onTopLeftAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n id=\"bounding-box-2d-left-anchor\"\n name=\"left-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'left')}\n onPointerDown={onLeftAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n id=\"bounding-box-2d-top-right-anchor\"\n name=\"top-right-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'top-right')}\n onPointerDown={onTopRightAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n id=\"bounding-box-2d-right-anchor\"\n name=\"right-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'right')}\n onPointerDown={onRightAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n id=\"bounding-box-2d-bottom-left-anchor\"\n name=\"bottom-left-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'bottom-left')}\n onPointerDown={onBottomLeftAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n id=\"bounding-box-2d-bottom-anchor\"\n name=\"bottom-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'bottom')}\n onPointerDown={onBottomAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n id=\"bounding-box-2d-bottom-right-anchor\"\n name=\"bottom-right-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'bottom-right')}\n onPointerDown={onBottomRightAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n id=\"bounding-box-2d-top-anchor\"\n name=\"top-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'top')}\n onPointerDown={onTopAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n id=\"bounding-box-2d-center-anchor\"\n name=\"center-anchor\"\n point={center}\n onPointerDown={onCenterAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-center-anchor')}\n />\n </RelativeAnchor>\n </div>\n );\n};\n"],"version":3}
@@ -0,0 +1,201 @@
1
+ /*!
2
+ * Copyright (c) 2023 Vertex Software LLC. All rights reserved.
3
+ */
4
+ import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
5
+ import { e as rectangle } from './bundle.esm.js';
6
+ import { g as getMarkupBoundingClientRect } from './dom2.js';
7
+ import { M as MarkupInteractionHandler, t as translatePointToRelative, h as transformRectangle, d as isValidStartEvent, j as parseBounds, k as translateRectToScreen, S as SvgShadow } from './interactions.js';
8
+ import { g as getMouseClientPosition } from './dom.js';
9
+ import { B as BoundingBox2d } from './viewer-markup-circle-components.js';
10
+
11
+ class CircleMarkupInteractionHandler extends MarkupInteractionHandler {
12
+ constructor(markupEl, editBegin, editEnd) {
13
+ super();
14
+ this.markupEl = markupEl;
15
+ this.editBegin = editBegin;
16
+ this.editEnd = editEnd;
17
+ this.anchor = 'bottom-right';
18
+ }
19
+ editAnchor(anchor, event) {
20
+ if (this.markupEl.mode === 'edit') {
21
+ this.anchor = anchor;
22
+ this.resizeBounds = this.markupEl.bounds;
23
+ this.startInteraction(event);
24
+ }
25
+ }
26
+ startInteraction(event) {
27
+ this.handleInteractionAttempt(event);
28
+ }
29
+ computeBoundingRect() {
30
+ return getMarkupBoundingClientRect(this.markupEl);
31
+ }
32
+ handleInteractionAttempt(event) {
33
+ var _a;
34
+ if (this.markupEl.mode !== '' &&
35
+ this.pointerId == null &&
36
+ this.elementBounds != null) {
37
+ const position = translatePointToRelative(getMouseClientPosition(event, this.elementBounds), this.elementBounds);
38
+ this.pointerId = event.pointerId;
39
+ this.startPosition = position;
40
+ this.markupEl.bounds =
41
+ (_a = this.markupEl.bounds) !== null && _a !== void 0 ? _a : rectangle.create(position.x, position.y, 0, 0);
42
+ this.resizeBounds = this.markupEl.bounds;
43
+ this.editBegin.emit();
44
+ this.acceptInteraction();
45
+ }
46
+ }
47
+ handleInteractionMove(event) {
48
+ var _a;
49
+ if (this.markupEl.bounds != null &&
50
+ this.startPosition != null &&
51
+ this.elementBounds != null &&
52
+ this.pointerId === event.pointerId) {
53
+ const position = translatePointToRelative(getMouseClientPosition(event, this.elementBounds), this.elementBounds);
54
+ this.markupEl.bounds = transformRectangle((_a = this.resizeBounds) !== null && _a !== void 0 ? _a : this.markupEl.bounds, this.startPosition, position, this.anchor, event.shiftKey);
55
+ }
56
+ }
57
+ handleInteractionEnd(event) {
58
+ var _a, _b;
59
+ if (this.pointerId === event.pointerId) {
60
+ if (this.markupEl.mode !== '' &&
61
+ this.markupEl.bounds != null &&
62
+ ((_a = this.markupEl.bounds) === null || _a === void 0 ? void 0 : _a.width) > 0 &&
63
+ ((_b = this.markupEl.bounds) === null || _b === void 0 ? void 0 : _b.height) > 0) {
64
+ this.anchor = 'bottom-right';
65
+ this.editEnd.emit();
66
+ }
67
+ else {
68
+ this.markupEl.bounds = undefined;
69
+ }
70
+ this.pointerId = undefined;
71
+ }
72
+ }
73
+ }
74
+
75
+ const viewerMarkupCircleCss = ":host{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;--viewer-markup-circle-ellipse-stroke-color:var(--red-700);--viewer-markup-circle-ellipse-stroke-width:4;--viewer-markup-circle-ellipse-fill-color:none;--viewer-markup-circle-ellipse-fill-opacity:0;--viewer-markup-circle-bounds-outline-border-color:var(--blue-400);--viewer-markup-circle-bounds-outline-border-width:1px;--viewer-markup-circle-bounds-edge-anchor-border-color:var(--blue-400);--viewer-markup-circle-bounds-edge-anchor-border-width:1px;--viewer-markup-circle-bounds-edge-anchor-background-color:white;--viewer-markup-circle-bounds-center-anchor-border-color:white;--viewer-markup-circle-bounds-center-anchor-border-width:1px;--viewer-markup-circle-bounds-center-anchor-background-color:var(--blue-400);--viewer-markup-circle-bounds-anchor-width:9px;--viewer-markup-circle-bounds-anchor-height:9px}.svg{pointer-events:none;width:100%;height:100%}.create-overlay{pointer-events:auto;position:absolute;left:0;top:0;width:100%;height:100%;cursor:crosshair}.ellipse{pointer-events:auto;stroke:var(--viewer-markup-circle-ellipse-stroke-color);stroke-width:var(--viewer-markup-circle-ellipse-stroke-width);fill:var(--viewer-markup-circle-ellipse-fill-color);fill-opacity:var(--viewer-markup-circle-ellipse-fill-opacity);cursor:default}.bounds-container{pointer-events:none;position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden}.bounds-outline{position:absolute;border-width:var(--viewer-markup-circle-bounds-outline-border-width);border-color:var(--viewer-markup-circle-bounds-outline-border-color);border-style:solid;box-shadow:0 0 3px rgba(0, 0, 0, 0.3)}.bounds-anchor-position{position:absolute;transform:translate(-50%, -50%)}.bounds-anchor{pointer-events:auto;cursor:default;user-select:none}.bounds-default-anchor{width:var(--viewer-markup-circle-bounds-anchor-width);height:var(--viewer-markup-circle-bounds-anchor-height);box-sizing:border-box;box-shadow:0 0 2px rgba(0, 0, 0, 0.3)}.bounds-center-anchor{border-radius:100%;border-width:var(--viewer-markup-circle-bounds-center-anchor-border-width);border-color:var(--viewer-markup-circle-bounds-center-anchor-border-color);border-style:solid;background-color:var(--viewer-markup-circle-bounds-center-anchor-background-color)}.bounds-edge-anchor{border-width:var(--viewer-markup-circle-bounds-edge-anchor-border-width);border-color:var(--viewer-markup-circle-bounds-edge-anchor-border-color);border-style:solid;background-color:var(--viewer-markup-circle-bounds-edge-anchor-background-color)}";
76
+
77
+ const ViewerMarkupCircle = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
78
+ constructor() {
79
+ super();
80
+ this.__registerHost();
81
+ this.__attachShadow();
82
+ this.editBegin = createEvent(this, "editBegin", 7);
83
+ this.editEnd = createEvent(this, "editEnd", 7);
84
+ this.viewRendered = createEvent(this, "viewRendered", 7);
85
+ /**
86
+ * A mode that specifies how the markup component should behave. When
87
+ * unset, the component will not respond to interactions with the handles.
88
+ * When `edit`, the markup anchors are interactive and the user is able
89
+ * to reposition them. When `create`, anytime the user clicks on the canvas,
90
+ * a new markup will be performed.
91
+ */
92
+ this.mode = '';
93
+ this.interactionHandler = new CircleMarkupInteractionHandler(this.hostEl, this.editBegin, this.editEnd);
94
+ this.handleWindowPointerDown = (event) => {
95
+ if (isValidStartEvent(event)) {
96
+ this.interactionHandler.startInteraction(event);
97
+ }
98
+ };
99
+ this.handleTouchStart = (event) => {
100
+ event.preventDefault();
101
+ };
102
+ }
103
+ /**
104
+ * @ignore
105
+ */
106
+ componentWillLoad() {
107
+ this.updateViewport();
108
+ this.handleViewerChanged(this.viewer);
109
+ this.updateBoundsFromProps();
110
+ }
111
+ componentDidLoad() {
112
+ this.updateBoundsFromProps();
113
+ const resize = new ResizeObserver(() => this.updateViewport());
114
+ resize.observe(this.hostEl);
115
+ if (this.mode === 'create') {
116
+ window.addEventListener('pointerdown', this.handleWindowPointerDown);
117
+ }
118
+ }
119
+ componentDidRender() {
120
+ if (this.mode === '') {
121
+ this.viewRendered.emit();
122
+ }
123
+ }
124
+ disconnectedCallback() {
125
+ this.dispose();
126
+ }
127
+ async dispose() {
128
+ var _a;
129
+ (_a = this.registeredHandler) === null || _a === void 0 ? void 0 : _a.dispose();
130
+ this.registeredHandler = undefined;
131
+ window.removeEventListener('pointerdown', this.handleWindowPointerDown);
132
+ }
133
+ /**
134
+ * @ignore
135
+ */
136
+ async handleViewerChanged(newViewer) {
137
+ var _a;
138
+ (_a = this.registeredHandler) === null || _a === void 0 ? void 0 : _a.dispose();
139
+ this.registeredHandler = undefined;
140
+ if (newViewer != null) {
141
+ this.registeredHandler = await newViewer.registerInteractionHandler(this.interactionHandler);
142
+ }
143
+ }
144
+ handleBoundsJsonChange() {
145
+ this.updateBoundsFromProps();
146
+ }
147
+ handleModeChange() {
148
+ if (this.mode !== 'create') {
149
+ window.removeEventListener('pointerdown', this.handleWindowPointerDown);
150
+ }
151
+ }
152
+ updateViewport() {
153
+ const rect = getMarkupBoundingClientRect(this.hostEl);
154
+ this.elementBounds = rect;
155
+ }
156
+ updateBoundsFromProps() {
157
+ var _a;
158
+ this.bounds = (_a = this.bounds) !== null && _a !== void 0 ? _a : parseBounds(this.boundsJson);
159
+ }
160
+ render() {
161
+ if (this.bounds != null && this.elementBounds != null) {
162
+ const relativeBounds = translateRectToScreen(this.bounds, this.elementBounds);
163
+ const center = rectangle.center(relativeBounds);
164
+ return (h(Host, null, h("svg", { class: "svg", onTouchStart: this.handleTouchStart }, h("defs", null, h(SvgShadow, { id: "circle-shadow" })), h("g", { filter: "url(#circle-shadow)" }, h("ellipse", { class: "ellipse", cx: center.x, cy: center.y, rx: relativeBounds.width / 2, ry: relativeBounds.height / 2, stroke: '#000ff0', "stroke-width": 4, fill: 'none' }))), this.mode === 'edit' && (h(BoundingBox2d, { bounds: relativeBounds, onTopLeftAnchorPointerDown: (e) => this.interactionHandler.editAnchor('top-left', e), onTopRightAnchorPointerDown: (e) => this.interactionHandler.editAnchor('top-right', e), onTopAnchorPointerDown: (e) => this.interactionHandler.editAnchor('top', e), onBottomLeftAnchorPointerDown: (e) => this.interactionHandler.editAnchor('bottom-left', e), onBottomRightAnchorPointerDown: (e) => this.interactionHandler.editAnchor('bottom-right', e), onBottomAnchorPointerDown: (e) => this.interactionHandler.editAnchor('bottom', e), onLeftAnchorPointerDown: (e) => this.interactionHandler.editAnchor('left', e), onRightAnchorPointerDown: (e) => this.interactionHandler.editAnchor('right', e), onCenterAnchorPointerDown: (e) => this.interactionHandler.editAnchor('center', e) })), this.mode === 'create' && (h("div", { class: "create-overlay", onTouchStart: this.handleTouchStart }))));
165
+ }
166
+ else {
167
+ return (h(Host, null, h("div", { class: "create-overlay", onTouchStart: this.handleTouchStart })));
168
+ }
169
+ }
170
+ get hostEl() { return this; }
171
+ static get watchers() { return {
172
+ "viewer": ["handleViewerChanged"],
173
+ "bounds": ["handleBoundsJsonChange"],
174
+ "mode": ["handleModeChange"]
175
+ }; }
176
+ static get style() { return viewerMarkupCircleCss; }
177
+ }, [1, "vertex-viewer-markup-circle", {
178
+ "bounds": [1040],
179
+ "boundsJson": [1, "bounds"],
180
+ "mode": [513],
181
+ "viewer": [16],
182
+ "elementBounds": [32],
183
+ "dispose": [64]
184
+ }]);
185
+ function defineCustomElement() {
186
+ if (typeof customElements === "undefined") {
187
+ return;
188
+ }
189
+ const components = ["vertex-viewer-markup-circle"];
190
+ components.forEach(tagName => { switch (tagName) {
191
+ case "vertex-viewer-markup-circle":
192
+ if (!customElements.get(tagName)) {
193
+ customElements.define(tagName, ViewerMarkupCircle);
194
+ }
195
+ break;
196
+ } });
197
+ }
198
+
199
+ export { ViewerMarkupCircle as V, defineCustomElement as d };
200
+
201
+ //# sourceMappingURL=viewer-markup-circle.js.map
@@ -0,0 +1 @@
1
+ {"file":"viewer-markup-circle.js","mappings":";;;;;;;;;;MAYa,8BAA+B,SAAQ,wBAAwB;EAO1E,YACmB,QAA6C,EAC7C,SAA6B,EAC7B,OAA2B;IAE5C,KAAK,EAAE,CAAC;IAJS,aAAQ,GAAR,QAAQ,CAAqC;IAC7C,cAAS,GAAT,SAAS,CAAoB;IAC7B,YAAO,GAAP,OAAO,CAAoB;IALtC,WAAM,GAAgC,cAAc,CAAC;GAQ5D;EAEM,UAAU,CACf,MAAmC,EACnC,KAAmB;IAEnB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE;MACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;MACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;MACzC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;KAC9B;GACF;EAEM,gBAAgB,CAAC,KAAmB;IACzC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;GACtC;EAES,mBAAmB;IAC3B,OAAO,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;GACnD;EAES,wBAAwB,CAAC,KAAmB;;IACpD,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE;MACzB,IAAI,CAAC,SAAS,IAAI,IAAI;MACtB,IAAI,CAAC,aAAa,IAAI,IAAI,EAC1B;MACA,MAAM,QAAQ,GAAG,wBAAwB,CACvC,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EACjD,IAAI,CAAC,aAAa,CACnB,CAAC;MACF,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;MACjC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;MAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM;QAClB,MAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,mCAAIA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;MACzE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;MAEzC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;MACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;GACF;EAES,qBAAqB,CAAC,KAAmB;;IACjD,IACE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI;MAC5B,IAAI,CAAC,aAAa,IAAI,IAAI;MAC1B,IAAI,CAAC,aAAa,IAAI,IAAI;MAC1B,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAClC;MACA,MAAM,QAAQ,GAAG,wBAAwB,CACvC,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EACjD,IAAI,CAAC,aAAa,CACnB,CAAC;MAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,kBAAkB,CACvC,MAAA,IAAI,CAAC,YAAY,mCAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EACzC,IAAI,CAAC,aAAa,EAClB,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,KAAK,CAAC,QAAQ,CACf,CAAC;KACH;GACF;EAES,oBAAoB,CAAC,KAAmB;;IAChD,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;MACtC,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE;QACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI;QAC5B,CAAA,MAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,0CAAE,KAAK,IAAG,CAAC;QAC/B,CAAA,MAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,0CAAE,MAAM,IAAG,CAAC,EAChC;QACA,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;OACrB;WAAM;QACL,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;OAClC;MAED,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;KAC5B;GACF;;;ACzGH,MAAM,qBAAqB,GAAG,0/EAA0/E;;MCqC3gF,kBAAkB;EAL/B;;;;;;;;;;;;;;IAsCS,SAAI,GAA2B,EAAE,CAAC;IAsCjC,uBAAkB,GAAG,IAAI,8BAA8B,CAC7D,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,CACb,CAAC;IA+JM,4BAAuB,GAAG,CAAC,KAAmB;MACpD,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE;QAC5B,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;OACjD;KACF,CAAC;IAEM,qBAAgB,GAAG,CAAC,KAAiB;MAC3C,KAAK,CAAC,cAAc,EAAE,CAAC;KACxB,CAAC;GACH;;;;EAjKW,iBAAiB;IACzB,IAAI,CAAC,cAAc,EAAE,CAAC;IACtB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,qBAAqB,EAAE,CAAC;GAC9B;EAES,gBAAgB;IACxB,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAE7B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;MAC1B,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;KACtE;GACF;EAES,kBAAkB;IAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,EAAE;MACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;KAC1B;GACF;EAES,oBAAoB;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;GAChB;EAGM,MAAM,OAAO;;IAClB,MAAA,IAAI,CAAC,iBAAiB,0CAAE,OAAO,EAAE,CAAC;IAClC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAEnC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;GACzE;;;;EAMS,MAAM,mBAAmB,CACjC,SAAmC;;IAEnC,MAAA,IAAI,CAAC,iBAAiB,0CAAE,OAAO,EAAE,CAAC;IAClC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAEnC,IAAI,SAAS,IAAI,IAAI,EAAE;MACrB,IAAI,CAAC,iBAAiB,GAAG,MAAM,SAAS,CAAC,0BAA0B,CACjE,IAAI,CAAC,kBAAkB,CACxB,CAAC;KACH;GACF;EAGS,sBAAsB;IAC9B,IAAI,CAAC,qBAAqB,EAAE,CAAC;GAC9B;EAGS,gBAAgB;IACxB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;MAC1B,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;KACzE;GACF;EAEO,cAAc;IACpB,MAAM,IAAI,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;GAC3B;EAEO,qBAAqB;;IAC3B,IAAI,CAAC,MAAM,GAAG,MAAA,IAAI,CAAC,MAAM,mCAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;GAC3D;EAEM,MAAM;IACX,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;MACrD,MAAM,cAAc,GAAG,qBAAqB,CAC1C,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,CACnB,CAAC;MACF,MAAM,MAAM,GAAGA,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;MAEhD,QACE,EAAC,IAAI,QACH,WAAK,KAAK,EAAC,KAAK,EAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,IAClD,gBACE,EAAC,SAAS,IAAC,EAAE,EAAC,eAAe,GAAG,CAC3B,EACP,SAAG,MAAM,EAAC,qBAAqB,IAC7B,eACE,KAAK,EAAC,SAAS,EACf,EAAE,EAAE,MAAM,CAAC,CAAC,EACZ,EAAE,EAAE,MAAM,CAAC,CAAC,EACZ,EAAE,EAAE,cAAc,CAAC,KAAK,GAAG,CAAC,EAC5B,EAAE,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,EAC7B,MAAM,EAAE,SAAS,kBACH,CAAC,EACf,IAAI,EAAE,MAAM,GACZ,CACA,CACA,EACL,IAAI,CAAC,IAAI,KAAK,MAAM,KACnB,EAAC,aAAa,IACZ,MAAM,EAAE,cAAc,EACtB,0BAA0B,EAAE,CAAC,CAAC,KAC5B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,EAEnD,2BAA2B,EAAE,CAAC,CAAC,KAC7B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,EAEpD,sBAAsB,EAAE,CAAC,CAAC,KACxB,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,EAE9C,6BAA6B,EAAE,CAAC,CAAC,KAC/B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,EAEtD,8BAA8B,EAAE,CAAC,CAAC,KAChC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,EAEvD,yBAAyB,EAAE,CAAC,CAAC,KAC3B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,EAEjD,uBAAuB,EAAE,CAAC,CAAC,KACzB,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,EAE/C,wBAAwB,EAAE,CAAC,CAAC,KAC1B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,EAEhD,yBAAyB,EAAE,CAAC,CAAC,KAC3B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,GAEjD,CACH,EACA,IAAI,CAAC,IAAI,KAAK,QAAQ,KACrB,WACE,KAAK,EAAC,gBAAgB,EACtB,YAAY,EAAE,IAAI,CAAC,gBAAgB,GAC9B,CACR,CACI,EACP;KACH;SAAM;MACL,QACE,EAAC,IAAI,QACH,WACE,KAAK,EAAC,gBAAgB,EACtB,YAAY,EAAE,IAAI,CAAC,gBAAgB,GAC9B,CACF,EACP;KACH;GACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["Rectangle"],"sources":["./src/components/viewer-markup-circle/interactions.ts","./src/components/viewer-markup-circle/viewer-markup-circle.css?tag=vertex-viewer-markup-circle&encapsulation=shadow","./src/components/viewer-markup-circle/viewer-markup-circle.tsx"],"sourcesContent":["import type { EventEmitter } from '@stencil/core';\nimport { Point, Rectangle } from '@vertexvis/geometry';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { MarkupInteractionHandler } from '../../lib/markup/interactions';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n BoundingBox2dAnchorPosition,\n transformRectangle,\n translatePointToRelative,\n} from '../viewer-markup/markup-utils';\n\nexport class CircleMarkupInteractionHandler extends MarkupInteractionHandler {\n private pointerId?: number;\n private startPosition?: Point.Point;\n private resizeBounds?: Rectangle.Rectangle;\n\n private anchor: BoundingBox2dAnchorPosition = 'bottom-right';\n\n public constructor(\n private readonly markupEl: HTMLVertexViewerMarkupCircleElement,\n private readonly editBegin: EventEmitter<void>,\n private readonly editEnd: EventEmitter<void>\n ) {\n super();\n }\n\n public editAnchor(\n anchor: BoundingBox2dAnchorPosition,\n event: PointerEvent\n ): void {\n if (this.markupEl.mode === 'edit') {\n this.anchor = anchor;\n this.resizeBounds = this.markupEl.bounds;\n this.startInteraction(event);\n }\n }\n\n public startInteraction(event: PointerEvent): void {\n this.handleInteractionAttempt(event);\n }\n\n protected computeBoundingRect(): DOMRect {\n return getMarkupBoundingClientRect(this.markupEl);\n }\n\n protected handleInteractionAttempt(event: PointerEvent): void {\n if (\n this.markupEl.mode !== '' &&\n this.pointerId == null &&\n this.elementBounds != null\n ) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n this.pointerId = event.pointerId;\n this.startPosition = position;\n this.markupEl.bounds =\n this.markupEl.bounds ?? Rectangle.create(position.x, position.y, 0, 0);\n this.resizeBounds = this.markupEl.bounds;\n\n this.editBegin.emit();\n this.acceptInteraction();\n }\n }\n\n protected handleInteractionMove(event: PointerEvent): void {\n if (\n this.markupEl.bounds != null &&\n this.startPosition != null &&\n this.elementBounds != null &&\n this.pointerId === event.pointerId\n ) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n\n this.markupEl.bounds = transformRectangle(\n this.resizeBounds ?? this.markupEl.bounds,\n this.startPosition,\n position,\n this.anchor,\n event.shiftKey\n );\n }\n }\n\n protected handleInteractionEnd(event: PointerEvent): void {\n if (this.pointerId === event.pointerId) {\n if (\n this.markupEl.mode !== '' &&\n this.markupEl.bounds != null &&\n this.markupEl.bounds?.width > 0 &&\n this.markupEl.bounds?.height > 0\n ) {\n this.anchor = 'bottom-right';\n this.editEnd.emit();\n } else {\n this.markupEl.bounds = undefined;\n }\n\n this.pointerId = undefined;\n }\n }\n}\n",":host {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n /**\n * @prop --viewer-markup-circle-ellipse-stroke-color: A CSS color that\n * specifies the color of the circle's outline.\n */\n --viewer-markup-circle-ellipse-stroke-color: var(--red-700);\n /**\n * @prop --viewer-markup-circle-ellipse-stroke-width: A CSS length that\n * specifies the width of the circle's outline.\n */\n --viewer-markup-circle-ellipse-stroke-width: 4;\n /**\n * @prop --viewer-markup-circle-ellipse-fill-color: A CSS color that\n * specifies the color of the circle's fill.\n */\n --viewer-markup-circle-ellipse-fill-color: none;\n /**\n * @prop --viewer-markup-circle-ellipse-fill-opacity: A number between \n * 0 and 1 that specifies the opacity of the circle's fill.\n */\n --viewer-markup-circle-ellipse-fill-opacity: 0;\n /**\n * @prop --viewer-markup-circle-bounds-outline-border-color: A CSS color that\n * specifies the color of the circle's selected bounding box border.\n */\n --viewer-markup-circle-bounds-outline-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-circle-bounds-outline-border-width: A CSS length that\n * specifies the width of the circle's selected bounding box border.\n */\n --viewer-markup-circle-bounds-outline-border-width: 1px;\n /**\n * @prop --viewer-markup-circle-bounds-edge-anchor-border-color: A CSS color that\n * specifies the color of the edge and corner resize anchors' borders.\n */\n --viewer-markup-circle-bounds-edge-anchor-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-circle-bounds-edge-anchor-border-width: A CSS length that\n * specifies the width of the edge and corner resize anchors' borders.\n */\n --viewer-markup-circle-bounds-edge-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-circle-bounds-edge-anchor-background-color: A CSS color that\n * specifies the background color of the edge and corner resize anchors.\n */\n --viewer-markup-circle-bounds-edge-anchor-background-color: white;\n /**\n * @prop --viewer-markup-circle-bounds-center-anchor-border-color: A CSS color that\n * specifies the color of the center reposition anchor's border.\n */\n --viewer-markup-circle-bounds-center-anchor-border-color: white;\n /**\n * @prop --viewer-markup-circle-bounds-center-anchor-border-width: A CSS length that\n * specifies the width of the center reposition anchor's border.\n */\n --viewer-markup-circle-bounds-center-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-circle-bounds-center-anchor-background-color: A CSS color that\n * specifies the background color of the center reposition anchor.\n */\n --viewer-markup-circle-bounds-center-anchor-background-color: var(--blue-400);\n /**\n * @prop --viewer-markup-circle-bounds-anchor-width: A CSS length that\n * specifies the width of the resize and reposition anchors.\n */\n --viewer-markup-circle-bounds-anchor-width: 9px;\n /**\n * @prop --viewer-markup-circle-bounds-anchor-height: A CSS length that\n * specifies the height of the resize and reposition anchors.\n */\n --viewer-markup-circle-bounds-anchor-height: 9px;\n}\n\n.svg {\n pointer-events: none;\n width: 100%;\n height: 100%;\n}\n\n.create-overlay {\n pointer-events: auto;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n cursor: crosshair;\n}\n\n.ellipse {\n pointer-events: auto;\n stroke: var(--viewer-markup-circle-ellipse-stroke-color);\n stroke-width: var(--viewer-markup-circle-ellipse-stroke-width);\n fill: var(--viewer-markup-circle-ellipse-fill-color);\n fill-opacity: var(--viewer-markup-circle-ellipse-fill-opacity);\n cursor: default;\n}\n\n.bounds-container {\n pointer-events: none;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n.bounds-outline {\n position: absolute;\n border-width: var(--viewer-markup-circle-bounds-outline-border-width);\n border-color: var(--viewer-markup-circle-bounds-outline-border-color);\n border-style: solid;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-anchor-position {\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.bounds-anchor {\n pointer-events: auto;\n cursor: default;\n user-select: none;\n}\n\n.bounds-default-anchor {\n width: var(--viewer-markup-circle-bounds-anchor-width);\n height: var(--viewer-markup-circle-bounds-anchor-height);\n box-sizing: border-box;\n box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-center-anchor {\n border-radius: 100%;\n border-width: var(--viewer-markup-circle-bounds-center-anchor-border-width);\n border-color: var(--viewer-markup-circle-bounds-center-anchor-border-color);\n border-style: solid;\n background-color: var(--viewer-markup-circle-bounds-center-anchor-background-color);\n}\n\n.bounds-edge-anchor {\n border-width: var(--viewer-markup-circle-bounds-edge-anchor-border-width);\n border-color: var(--viewer-markup-circle-bounds-edge-anchor-border-color);\n border-style: solid;\n background-color: var(--viewer-markup-circle-bounds-edge-anchor-background-color);\n}","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Rectangle } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidStartEvent,\n translateRectToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { CircleMarkupInteractionHandler } from './interactions';\nimport { parseBounds } from './utils';\nimport { BoundingBox2d } from './viewer-markup-circle-components';\n\n/**\n * The supported markup modes.\n *\n * @see {@link ViewerMarkupCircleMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupCircleMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-circle',\n styleUrl: 'viewer-markup-circle.css',\n shadow: true,\n})\nexport class ViewerMarkupCircle {\n /**\n * The bounds of the circle. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 10, \"height\": 10}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a circle\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public bounds?: Rectangle.Rectangle;\n\n /**\n * The bounds of the circle. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 0.1, \"height\": 0.1}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a circle\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ attribute: 'bounds' })\n public boundsJson?: string;\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupCircleMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * An event that is dispatched anytime the user begins editing the\n * markup.\n */\n @Event({ bubbles: true })\n public editBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished editing the\n * markup.\n */\n @Event({ bubbles: true })\n public editEnd!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when this markup element is in view\n * mode (`this.mode === \"\"`), and it completes a rerender.\n */\n @Event({ bubbles: true })\n public viewRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupCircleElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n private interactionHandler = new CircleMarkupInteractionHandler(\n this.hostEl,\n this.editBegin,\n this.editEnd\n );\n\n private registeredHandler?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.updateBoundsFromProps();\n }\n\n protected componentDidLoad(): void {\n this.updateBoundsFromProps();\n\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected componentDidRender(): void {\n if (this.mode === '') {\n this.viewRendered.emit();\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredHandler?.dispose();\n this.registeredHandler = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(\n newViewer?: HTMLVertexViewerElement\n ): Promise<void> {\n this.registeredHandler?.dispose();\n this.registeredHandler = undefined;\n\n if (newViewer != null) {\n this.registeredHandler = await newViewer.registerInteractionHandler(\n this.interactionHandler\n );\n }\n }\n\n @Watch('bounds')\n protected handleBoundsJsonChange(): void {\n this.updateBoundsFromProps();\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private updateBoundsFromProps(): void {\n this.bounds = this.bounds ?? parseBounds(this.boundsJson);\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (this.bounds != null && this.elementBounds != null) {\n const relativeBounds = translateRectToScreen(\n this.bounds,\n this.elementBounds\n );\n const center = Rectangle.center(relativeBounds);\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"circle-shadow\" />\n </defs>\n <g filter=\"url(#circle-shadow)\">\n <ellipse\n class=\"ellipse\"\n cx={center.x}\n cy={center.y}\n rx={relativeBounds.width / 2}\n ry={relativeBounds.height / 2}\n stroke={'#000ff0'}\n stroke-width={4}\n fill={'none'}\n />\n </g>\n </svg>\n {this.mode === 'edit' && (\n <BoundingBox2d\n bounds={relativeBounds}\n onTopLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-left', e)\n }\n onTopRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-right', e)\n }\n onTopAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top', e)\n }\n onBottomLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-left', e)\n }\n onBottomRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-right', e)\n }\n onBottomAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom', e)\n }\n onLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('left', e)\n }\n onRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('right', e)\n }\n onCenterAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('center', e)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n}\n"],"version":3}