@vertexvis/viewer 0.18.2-testing.0 → 0.18.2-testing.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/dist/cjs/index-b99cd335.js +126 -1
  2. package/dist/esm/index-fd7d7b68.js +126 -1
  3. package/package.json +7 -7
  4. package/dist/components/_commonjsHelpers.js +0 -41
  5. package/dist/components/_commonjsHelpers.js.map +0 -1
  6. package/dist/components/browser.esm.js +0 -3173
  7. package/dist/components/browser.esm.js.map +0 -1
  8. package/dist/components/bundle.esm.js +0 -2250
  9. package/dist/components/bundle.esm.js.map +0 -1
  10. package/dist/components/bundle.esm2.js +0 -39740
  11. package/dist/components/bundle.esm2.js.map +0 -1
  12. package/dist/components/config.js +0 -81
  13. package/dist/components/config.js.map +0 -1
  14. package/dist/components/controller.js +0 -7627
  15. package/dist/components/controller.js.map +0 -1
  16. package/dist/components/controller2.js +0 -124
  17. package/dist/components/controller2.js.map +0 -1
  18. package/dist/components/controller3.js +0 -111
  19. package/dist/components/controller3.js.map +0 -1
  20. package/dist/components/cursors.js +0 -110
  21. package/dist/components/cursors.js.map +0 -1
  22. package/dist/components/dom.js +0 -43
  23. package/dist/components/dom.js.map +0 -1
  24. package/dist/components/dom2.js +0 -10
  25. package/dist/components/dom2.js.map +0 -1
  26. package/dist/components/elementRectObserver.js +0 -25
  27. package/dist/components/elementRectObserver.js.map +0 -1
  28. package/dist/components/entities.js +0 -179
  29. package/dist/components/entities.js.map +0 -1
  30. package/dist/components/errors.js +0 -80
  31. package/dist/components/errors.js.map +0 -1
  32. package/dist/components/events.js +0 -11
  33. package/dist/components/events.js.map +0 -1
  34. package/dist/components/index.d.ts +0 -26
  35. package/dist/components/index.js +0 -365
  36. package/dist/components/index.js.map +0 -1
  37. package/dist/components/index2.js +0 -63
  38. package/dist/components/index2.js.map +0 -1
  39. package/dist/components/interactions.js +0 -236
  40. package/dist/components/interactions.js.map +0 -1
  41. package/dist/components/mapper.js +0 -9811
  42. package/dist/components/mapper.js.map +0 -1
  43. package/dist/components/markup.js +0 -33
  44. package/dist/components/markup.js.map +0 -1
  45. package/dist/components/model.js +0 -134
  46. package/dist/components/model.js.map +0 -1
  47. package/dist/components/model2.js +0 -157
  48. package/dist/components/model2.js.map +0 -1
  49. package/dist/components/overlays.js +0 -76
  50. package/dist/components/overlays.js.map +0 -1
  51. package/dist/components/png-decoder.js +0 -2405
  52. package/dist/components/png-decoder.js.map +0 -1
  53. package/dist/components/regl-component.js +0 -12582
  54. package/dist/components/regl-component.js.map +0 -1
  55. package/dist/components/results.js +0 -24
  56. package/dist/components/results.js.map +0 -1
  57. package/dist/components/row.js +0 -32
  58. package/dist/components/row.js.map +0 -1
  59. package/dist/components/scene-tree-search.js +0 -146
  60. package/dist/components/scene-tree-search.js.map +0 -1
  61. package/dist/components/scene-tree-table-layout.js +0 -928
  62. package/dist/components/scene-tree-table-layout.js.map +0 -1
  63. package/dist/components/scene-tree-toolbar.js +0 -35
  64. package/dist/components/scene-tree-toolbar.js.map +0 -1
  65. package/dist/components/scene.js +0 -1508
  66. package/dist/components/scene.js.map +0 -1
  67. package/dist/components/stencil.js +0 -25
  68. package/dist/components/stencil.js.map +0 -1
  69. package/dist/components/streamAttributes.js +0 -40833
  70. package/dist/components/streamAttributes.js.map +0 -1
  71. package/dist/components/templates.js +0 -36
  72. package/dist/components/templates.js.map +0 -1
  73. package/dist/components/tslib.es6.js +0 -125
  74. package/dist/components/tslib.es6.js.map +0 -1
  75. package/dist/components/vertex-scene-tree-search.d.ts +0 -11
  76. package/dist/components/vertex-scene-tree-search.js +0 -11
  77. package/dist/components/vertex-scene-tree-search.js.map +0 -1
  78. package/dist/components/vertex-scene-tree-table-cell.d.ts +0 -11
  79. package/dist/components/vertex-scene-tree-table-cell.js +0 -209
  80. package/dist/components/vertex-scene-tree-table-cell.js.map +0 -1
  81. package/dist/components/vertex-scene-tree-table-column.d.ts +0 -11
  82. package/dist/components/vertex-scene-tree-table-column.js +0 -42
  83. package/dist/components/vertex-scene-tree-table-column.js.map +0 -1
  84. package/dist/components/vertex-scene-tree-table-header.d.ts +0 -11
  85. package/dist/components/vertex-scene-tree-table-header.js +0 -38
  86. package/dist/components/vertex-scene-tree-table-header.js.map +0 -1
  87. package/dist/components/vertex-scene-tree-table-layout.d.ts +0 -11
  88. package/dist/components/vertex-scene-tree-table-layout.js +0 -11
  89. package/dist/components/vertex-scene-tree-table-layout.js.map +0 -1
  90. package/dist/components/vertex-scene-tree-table-resize-divider.d.ts +0 -11
  91. package/dist/components/vertex-scene-tree-table-resize-divider.js +0 -57
  92. package/dist/components/vertex-scene-tree-table-resize-divider.js.map +0 -1
  93. package/dist/components/vertex-scene-tree-toolbar-group.d.ts +0 -11
  94. package/dist/components/vertex-scene-tree-toolbar-group.js +0 -38
  95. package/dist/components/vertex-scene-tree-toolbar-group.js.map +0 -1
  96. package/dist/components/vertex-scene-tree-toolbar.d.ts +0 -11
  97. package/dist/components/vertex-scene-tree-toolbar.js +0 -11
  98. package/dist/components/vertex-scene-tree-toolbar.js.map +0 -1
  99. package/dist/components/vertex-scene-tree.d.ts +0 -11
  100. package/dist/components/vertex-scene-tree.js +0 -803
  101. package/dist/components/vertex-scene-tree.js.map +0 -1
  102. package/dist/components/vertex-viewer-box-query-tool.d.ts +0 -11
  103. package/dist/components/vertex-viewer-box-query-tool.js +0 -352
  104. package/dist/components/vertex-viewer-box-query-tool.js.map +0 -1
  105. package/dist/components/vertex-viewer-button.d.ts +0 -11
  106. package/dist/components/vertex-viewer-button.js +0 -11
  107. package/dist/components/vertex-viewer-button.js.map +0 -1
  108. package/dist/components/vertex-viewer-default-toolbar.d.ts +0 -11
  109. package/dist/components/vertex-viewer-default-toolbar.js +0 -99
  110. package/dist/components/vertex-viewer-default-toolbar.js.map +0 -1
  111. package/dist/components/vertex-viewer-dom-element.d.ts +0 -11
  112. package/dist/components/vertex-viewer-dom-element.js +0 -11
  113. package/dist/components/vertex-viewer-dom-element.js.map +0 -1
  114. package/dist/components/vertex-viewer-dom-group.d.ts +0 -11
  115. package/dist/components/vertex-viewer-dom-group.js +0 -11
  116. package/dist/components/vertex-viewer-dom-group.js.map +0 -1
  117. package/dist/components/vertex-viewer-dom-renderer.d.ts +0 -11
  118. package/dist/components/vertex-viewer-dom-renderer.js +0 -11
  119. package/dist/components/vertex-viewer-dom-renderer.js.map +0 -1
  120. package/dist/components/vertex-viewer-hit-result-indicator.d.ts +0 -11
  121. package/dist/components/vertex-viewer-hit-result-indicator.js +0 -335
  122. package/dist/components/vertex-viewer-hit-result-indicator.js.map +0 -1
  123. package/dist/components/vertex-viewer-icon.d.ts +0 -11
  124. package/dist/components/vertex-viewer-icon.js +0 -11
  125. package/dist/components/vertex-viewer-icon.js.map +0 -1
  126. package/dist/components/vertex-viewer-layer.d.ts +0 -11
  127. package/dist/components/vertex-viewer-layer.js +0 -11
  128. package/dist/components/vertex-viewer-layer.js.map +0 -1
  129. package/dist/components/vertex-viewer-markup-arrow.d.ts +0 -11
  130. package/dist/components/vertex-viewer-markup-arrow.js +0 -11
  131. package/dist/components/vertex-viewer-markup-arrow.js.map +0 -1
  132. package/dist/components/vertex-viewer-markup-circle.d.ts +0 -11
  133. package/dist/components/vertex-viewer-markup-circle.js +0 -11
  134. package/dist/components/vertex-viewer-markup-circle.js.map +0 -1
  135. package/dist/components/vertex-viewer-markup-freeform.d.ts +0 -11
  136. package/dist/components/vertex-viewer-markup-freeform.js +0 -11
  137. package/dist/components/vertex-viewer-markup-freeform.js.map +0 -1
  138. package/dist/components/vertex-viewer-markup-tool.d.ts +0 -11
  139. package/dist/components/vertex-viewer-markup-tool.js +0 -257
  140. package/dist/components/vertex-viewer-markup-tool.js.map +0 -1
  141. package/dist/components/vertex-viewer-markup.d.ts +0 -11
  142. package/dist/components/vertex-viewer-markup.js +0 -362
  143. package/dist/components/vertex-viewer-markup.js.map +0 -1
  144. package/dist/components/vertex-viewer-measurement-details.d.ts +0 -11
  145. package/dist/components/vertex-viewer-measurement-details.js +0 -307
  146. package/dist/components/vertex-viewer-measurement-details.js.map +0 -1
  147. package/dist/components/vertex-viewer-measurement-distance.d.ts +0 -11
  148. package/dist/components/vertex-viewer-measurement-distance.js +0 -1067
  149. package/dist/components/vertex-viewer-measurement-distance.js.map +0 -1
  150. package/dist/components/vertex-viewer-measurement-line.d.ts +0 -11
  151. package/dist/components/vertex-viewer-measurement-line.js +0 -11
  152. package/dist/components/vertex-viewer-measurement-line.js.map +0 -1
  153. package/dist/components/vertex-viewer-measurement-overlays.d.ts +0 -11
  154. package/dist/components/vertex-viewer-measurement-overlays.js +0 -11
  155. package/dist/components/vertex-viewer-measurement-overlays.js.map +0 -1
  156. package/dist/components/vertex-viewer-measurement-precise.d.ts +0 -11
  157. package/dist/components/vertex-viewer-measurement-precise.js +0 -362
  158. package/dist/components/vertex-viewer-measurement-precise.js.map +0 -1
  159. package/dist/components/vertex-viewer-pin-group.d.ts +0 -11
  160. package/dist/components/vertex-viewer-pin-group.js +0 -11
  161. package/dist/components/vertex-viewer-pin-group.js.map +0 -1
  162. package/dist/components/vertex-viewer-pin-label-line.d.ts +0 -11
  163. package/dist/components/vertex-viewer-pin-label-line.js +0 -11
  164. package/dist/components/vertex-viewer-pin-label-line.js.map +0 -1
  165. package/dist/components/vertex-viewer-pin-label.d.ts +0 -11
  166. package/dist/components/vertex-viewer-pin-label.js +0 -11
  167. package/dist/components/vertex-viewer-pin-label.js.map +0 -1
  168. package/dist/components/vertex-viewer-pin-tool.d.ts +0 -11
  169. package/dist/components/vertex-viewer-pin-tool.js +0 -430
  170. package/dist/components/vertex-viewer-pin-tool.js.map +0 -1
  171. package/dist/components/vertex-viewer-spinner.d.ts +0 -11
  172. package/dist/components/vertex-viewer-spinner.js +0 -11
  173. package/dist/components/vertex-viewer-spinner.js.map +0 -1
  174. package/dist/components/vertex-viewer-toolbar-group.d.ts +0 -11
  175. package/dist/components/vertex-viewer-toolbar-group.js +0 -11
  176. package/dist/components/vertex-viewer-toolbar-group.js.map +0 -1
  177. package/dist/components/vertex-viewer-toolbar.d.ts +0 -11
  178. package/dist/components/vertex-viewer-toolbar.js +0 -11
  179. package/dist/components/vertex-viewer-toolbar.js.map +0 -1
  180. package/dist/components/vertex-viewer-transform-widget.d.ts +0 -11
  181. package/dist/components/vertex-viewer-transform-widget.js +0 -838
  182. package/dist/components/vertex-viewer-transform-widget.js.map +0 -1
  183. package/dist/components/vertex-viewer-view-cube.d.ts +0 -11
  184. package/dist/components/vertex-viewer-view-cube.js +0 -270
  185. package/dist/components/vertex-viewer-view-cube.js.map +0 -1
  186. package/dist/components/vertex-viewer.d.ts +0 -11
  187. package/dist/components/vertex-viewer.js +0 -3543
  188. package/dist/components/vertex-viewer.js.map +0 -1
  189. package/dist/components/viewer-button.js +0 -35
  190. package/dist/components/viewer-button.js.map +0 -1
  191. package/dist/components/viewer-dom-element.js +0 -250
  192. package/dist/components/viewer-dom-element.js.map +0 -1
  193. package/dist/components/viewer-dom-group.js +0 -214
  194. package/dist/components/viewer-dom-group.js.map +0 -1
  195. package/dist/components/viewer-dom-renderer.js +0 -295
  196. package/dist/components/viewer-dom-renderer.js.map +0 -1
  197. package/dist/components/viewer-icon.js +0 -87
  198. package/dist/components/viewer-icon.js.map +0 -1
  199. package/dist/components/viewer-layer.js +0 -46
  200. package/dist/components/viewer-layer.js.map +0 -1
  201. package/dist/components/viewer-markup-arrow.js +0 -235
  202. package/dist/components/viewer-markup-arrow.js.map +0 -1
  203. package/dist/components/viewer-markup-circle-components.js +0 -42
  204. package/dist/components/viewer-markup-circle-components.js.map +0 -1
  205. package/dist/components/viewer-markup-circle.js +0 -201
  206. package/dist/components/viewer-markup-circle.js.map +0 -1
  207. package/dist/components/viewer-markup-freeform.js +0 -251
  208. package/dist/components/viewer-markup-freeform.js.map +0 -1
  209. package/dist/components/viewer-measurement-line.js +0 -77
  210. package/dist/components/viewer-measurement-line.js.map +0 -1
  211. package/dist/components/viewer-measurement-overlays.js +0 -184
  212. package/dist/components/viewer-measurement-overlays.js.map +0 -1
  213. package/dist/components/viewer-pin-group.js +0 -207
  214. package/dist/components/viewer-pin-group.js.map +0 -1
  215. package/dist/components/viewer-pin-label-line.js +0 -43
  216. package/dist/components/viewer-pin-label-line.js.map +0 -1
  217. package/dist/components/viewer-pin-label.js +0 -427
  218. package/dist/components/viewer-pin-label.js.map +0 -1
  219. package/dist/components/viewer-spinner.js +0 -53
  220. package/dist/components/viewer-spinner.js.map +0 -1
  221. package/dist/components/viewer-toolbar-group.js +0 -42
  222. package/dist/components/viewer-toolbar-group.js.map +0 -1
  223. package/dist/components/viewer-toolbar.js +0 -61
  224. package/dist/components/viewer-toolbar.js.map +0 -1
  225. package/dist/components/viewport.js +0 -188
  226. package/dist/components/viewport.js.map +0 -1
  227. package/dist/components/wrappers_pb.js +0 -1926
  228. package/dist/components/wrappers_pb.js.map +0 -1
@@ -1,235 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"file":"viewer-markup-arrow.js","mappings":"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","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}
@@ -1,42 +0,0 @@
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
@@ -1 +0,0 @@
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}
@@ -1,201 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"file":"viewer-markup-circle.js","mappings":"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","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}