@activecollab/components 2.0.440 → 2.0.442

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 (74) hide show
  1. package/dist/cjs/components/Dialog/Dialog.js +8 -1
  2. package/dist/cjs/components/Dialog/Dialog.js.map +1 -1
  3. package/dist/cjs/components/Modal/Modal.js +16 -4
  4. package/dist/cjs/components/Modal/Modal.js.map +1 -1
  5. package/dist/cjs/components/Transitions/Fade/Fade.js +3 -2
  6. package/dist/cjs/components/Transitions/Fade/Fade.js.map +1 -1
  7. package/dist/cjs/components/Transitions/SlideFromTop/SlideFromTop.js +7 -5
  8. package/dist/cjs/components/Transitions/SlideFromTop/SlideFromTop.js.map +1 -1
  9. package/dist/cjs/presentation/shared/UserDetailsDialog.js +125 -0
  10. package/dist/cjs/presentation/shared/UserDetailsDialog.js.map +1 -0
  11. package/dist/cjs/presentation/shared/index.js +15 -0
  12. package/dist/cjs/presentation/shared/index.js.map +1 -1
  13. package/dist/cjs/presentation/whiteboard/bottomDock.js +10 -3
  14. package/dist/cjs/presentation/whiteboard/bottomDock.js.map +1 -1
  15. package/dist/cjs/presentation/whiteboard/canvasElements.js +114 -25
  16. package/dist/cjs/presentation/whiteboard/canvasElements.js.map +1 -1
  17. package/dist/cjs/presentation/whiteboard/entityCardActions.js +79 -0
  18. package/dist/cjs/presentation/whiteboard/entityCardActions.js.map +1 -0
  19. package/dist/cjs/presentation/whiteboard/inspector.js +20 -5
  20. package/dist/cjs/presentation/whiteboard/inspector.js.map +1 -1
  21. package/dist/cjs/presentation/whiteboard/outline.js +4 -2
  22. package/dist/cjs/presentation/whiteboard/outline.js.map +1 -1
  23. package/dist/cjs/presentation/whiteboard/projectElements.js +188 -53
  24. package/dist/cjs/presentation/whiteboard/projectElements.js.map +1 -1
  25. package/dist/esm/components/Dialog/Dialog.d.ts.map +1 -1
  26. package/dist/esm/components/Dialog/Dialog.js +10 -3
  27. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  28. package/dist/esm/components/Modal/Modal.d.ts +5 -0
  29. package/dist/esm/components/Modal/Modal.d.ts.map +1 -1
  30. package/dist/esm/components/Modal/Modal.js +16 -4
  31. package/dist/esm/components/Modal/Modal.js.map +1 -1
  32. package/dist/esm/components/Transitions/Fade/Fade.d.ts +1 -0
  33. package/dist/esm/components/Transitions/Fade/Fade.d.ts.map +1 -1
  34. package/dist/esm/components/Transitions/Fade/Fade.js +2 -1
  35. package/dist/esm/components/Transitions/Fade/Fade.js.map +1 -1
  36. package/dist/esm/components/Transitions/SlideFromTop/SlideFromTop.d.ts +2 -0
  37. package/dist/esm/components/Transitions/SlideFromTop/SlideFromTop.d.ts.map +1 -1
  38. package/dist/esm/components/Transitions/SlideFromTop/SlideFromTop.js +6 -4
  39. package/dist/esm/components/Transitions/SlideFromTop/SlideFromTop.js.map +1 -1
  40. package/dist/esm/presentation/shared/UserDetailsDialog.d.ts +45 -0
  41. package/dist/esm/presentation/shared/UserDetailsDialog.d.ts.map +1 -0
  42. package/dist/esm/presentation/shared/UserDetailsDialog.js +115 -0
  43. package/dist/esm/presentation/shared/UserDetailsDialog.js.map +1 -0
  44. package/dist/esm/presentation/shared/index.d.ts +2 -0
  45. package/dist/esm/presentation/shared/index.d.ts.map +1 -1
  46. package/dist/esm/presentation/shared/index.js +1 -0
  47. package/dist/esm/presentation/shared/index.js.map +1 -1
  48. package/dist/esm/presentation/whiteboard/bottomDock.d.ts +3 -2
  49. package/dist/esm/presentation/whiteboard/bottomDock.d.ts.map +1 -1
  50. package/dist/esm/presentation/whiteboard/bottomDock.js +9 -4
  51. package/dist/esm/presentation/whiteboard/bottomDock.js.map +1 -1
  52. package/dist/esm/presentation/whiteboard/canvasElements.d.ts.map +1 -1
  53. package/dist/esm/presentation/whiteboard/canvasElements.js +94 -25
  54. package/dist/esm/presentation/whiteboard/canvasElements.js.map +1 -1
  55. package/dist/esm/presentation/whiteboard/entityCardActions.d.ts +37 -0
  56. package/dist/esm/presentation/whiteboard/entityCardActions.d.ts.map +1 -0
  57. package/dist/esm/presentation/whiteboard/entityCardActions.js +69 -0
  58. package/dist/esm/presentation/whiteboard/entityCardActions.js.map +1 -0
  59. package/dist/esm/presentation/whiteboard/inspector.d.ts.map +1 -1
  60. package/dist/esm/presentation/whiteboard/inspector.js +29 -7
  61. package/dist/esm/presentation/whiteboard/inspector.js.map +1 -1
  62. package/dist/esm/presentation/whiteboard/outline.d.ts +1 -1
  63. package/dist/esm/presentation/whiteboard/outline.d.ts.map +1 -1
  64. package/dist/esm/presentation/whiteboard/outline.js +5 -3
  65. package/dist/esm/presentation/whiteboard/outline.js.map +1 -1
  66. package/dist/esm/presentation/whiteboard/projectElements.d.ts +40 -8
  67. package/dist/esm/presentation/whiteboard/projectElements.d.ts.map +1 -1
  68. package/dist/esm/presentation/whiteboard/projectElements.js +181 -55
  69. package/dist/esm/presentation/whiteboard/projectElements.js.map +1 -1
  70. package/dist/index.js +34 -10
  71. package/dist/index.js.map +1 -1
  72. package/dist/index.min.js +1 -1
  73. package/dist/index.min.js.map +1 -1
  74. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"canvasElements.d.ts","sourceRoot":"","sources":["../../../../src/presentation/whiteboard/canvasElements.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,YAAY,EAKb,MAAM,OAAO,CAAC;AAEf,OAAO,EACL,SAAS,EAMV,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,gBAAgB,EAChB,QAAQ,EAGR,iBAAiB,EAEjB,eAAe,EAShB,MAAM,YAAY,CAAC;AACpB,OAAO,EAGL,cAAc,EAIf,MAAM,eAAe,CAAC;AACvB,OAAO,EAIL,cAAc,EAMf,MAAM,eAAe,CAAC;AACvB,OAAO,EAKL,iBAAiB,EASlB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,+CAA+C,CAAC;AAE7E;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,SAAS,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;IAKvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAKxE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,YAAY,EAAE,KAAK,CAAC,QAAQ,CAC1B,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAC/D,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,SAAS,EAAE,KAAK,CAAC,QAAQ,CACvB,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CACxD,CAAC;IACF,WAAW,EAAE,eAAe,CAAC;IAC7B,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC;IAGtE,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACjE,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAGjE,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAG9E,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAE3E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAGlC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACzE;AAUD,eAAO,MAAM,cAAc,GAAI,sTAyB5B,mBAAmB,KAAG,YA6lCxB,CAAC"}
1
+ {"version":3,"file":"canvasElements.d.ts","sourceRoot":"","sources":["../../../../src/presentation/whiteboard/canvasElements.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,YAAY,EAKb,MAAM,OAAO,CAAC;AAEf,OAAO,EACL,SAAS,EAMV,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,gBAAgB,EAChB,QAAQ,EAGR,iBAAiB,EAEjB,eAAe,EAShB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAGL,cAAc,EAIf,MAAM,eAAe,CAAC;AACvB,OAAO,EAIL,cAAc,EAMf,MAAM,eAAe,CAAC;AAEvB,OAAO,EAIL,iBAAiB,EAWlB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,+CAA+C,CAAC;AAE7E;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,SAAS,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;IAKvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAKxE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,YAAY,EAAE,KAAK,CAAC,QAAQ,CAC1B,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAC/D,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,SAAS,EAAE,KAAK,CAAC,QAAQ,CACvB,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CACxD,CAAC;IACF,WAAW,EAAE,eAAe,CAAC;IAC7B,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC;IAGtE,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IACjE,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAGjE,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAG9E,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAE3E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAGlC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACzE;AAUD,eAAO,MAAM,cAAc,GAAI,sTAyB5B,mBAAmB,KAAG,YAitCxB,CAAC"}
@@ -2,9 +2,11 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import React, { useCallback, useEffect, useRef, useState } from "react";
3
3
  import { CARD_PREVIEW_HEIGHT, SHAPE_DEFAULT_SIZES, isShapeTool } from "./bottomDock";
4
4
  import { CANVAS_ELEMENTS, PostitFormattingToolbar, ResizeHandles, ShapeFormattingToolbar, StyledCanvasElement, StyledCanvasLayer, StyledSticky, defaultShapeState, gridLevel, renderShapeBody, snapValue, stickyGradient } from "./elements";
5
+ import { PersonCardToolbar, personDetailsProps } from "./entityCardActions";
5
6
  import { FILE_DEFAULT_WIDTH, FileElement, binaryFrom, describeFile, revokeThumbnail } from "./fileElement";
6
7
  import { CARD_DRAW_THRESHOLD, LINK_DEFAULT_WIDTH, LinkElement, StyledLinkDraft, StyledShapePreview, clampCardWidth, isValidLinkUrl, shapePreviewGlyph } from "./linkElement";
7
- import { PLACEHOLDER_MIN_HEIGHT, PLACEHOLDER_MIN_WIDTH, ProjectElementNode, ProjectElementPicker, RESOLVE_MS, StyledProjectDraft, StyledProjectElementBox, isProjectTool, projectCardWidth } from "./projectElements";
8
+ import { UserDetailsDialog } from "../shared";
9
+ import { PERSON_DEFAULT_SIZE, PLACEHOLDER_MIN_HEIGHT, PLACEHOLDER_MIN_WIDTH, ProjectElementNode, ProjectElementPicker, RESOLVE_MS, StyledPersonDraft, StyledProjectDraft, StyledProjectElementBox, clampPersonSize, isProjectTool, projectCardWidth } from "./projectElements";
8
10
 
9
11
  /**
10
12
  * A card is full of its own controls — the URL field, the display toggle, the
@@ -37,7 +39,7 @@ export const DRAG_THROUGH_SELECTOR = "[data-drag-through]";
37
39
  Link elements are created here too — by drawing a box with the Link tool
38
40
  armed, or by pasting a URL onto the canvas. */
39
41
  export const CanvasElements = _ref => {
40
- var _projectElements$find;
42
+ var _projectElements$find, _projectElements$find2, _projectElements$find3;
41
43
  let gridSize = _ref.gridSize,
42
44
  snapToGrid = _ref.snapToGrid,
43
45
  activeTool = _ref.activeTool,
@@ -435,7 +437,8 @@ export const CanvasElements = _ref => {
435
437
  height: size.height,
436
438
  status: "placeholder",
437
439
  project: null,
438
- task: null
440
+ task: null,
441
+ person: null
439
442
  }]);
440
443
  setSelectedId(id);
441
444
  setPickerFor(id);
@@ -444,21 +447,21 @@ export const CanvasElements = _ref => {
444
447
  /* The picker answered. The card keeps the placeholder's top-left and flashes
445
448
  a skeleton while the "backend" fills the details in — the same two-phase
446
449
  honesty the file card's upload / preparing pair has. */
447
- const resolveProjectElement = useCallback((id, project, task) => {
450
+ const resolveProjectElement = useCallback((id, fill) => {
448
451
  setPickerFor(null);
449
452
  setProjectElements(current => current.map(entry => entry.id === id ? _extends({}, entry, {
450
- status: "resolving",
451
- project,
452
- task
453
- }) : entry));
453
+ status: "resolving"
454
+ }, fill) : entry));
454
455
  const timer = window.setTimeout(() => {
455
456
  setProjectElements(current => current.map(entry => entry.id === id ? _extends({}, entry, {
456
457
  status: "resolved",
457
458
  /* The card takes its natural width HERE rather than the
458
459
  renderer deriving it, so from this moment on there is a
459
460
  single stored width for the canvas, the drag and the
460
- Inspector's Width field to agree on. */
461
- width: projectCardWidth(entry.kind)
461
+ Inspector's Width field to agree on. A person keeps the
462
+ square that was drawn: the avatar fills whatever circle
463
+ the gesture made. */
464
+ width: entry.kind === "person" ? entry.width : projectCardWidth(entry.kind)
462
465
  }) : entry));
463
466
  }, RESOLVE_MS);
464
467
  resolveTimersRef.current.push(timer);
@@ -474,6 +477,20 @@ export const CanvasElements = _ref => {
474
477
  }, [setProjectElements, setSelectedId]);
475
478
  const pickerElement = (_projectElements$find = projectElements.find(entry => entry.id === pickerFor)) != null ? _projectElements$find : null;
476
479
 
480
+ /* A selected element's Delete, the same removal the link and file cards' own
481
+ toolbars do: the board element goes, the entity is never touched. */
482
+ const deleteProjectElement = useCallback(id => {
483
+ setProjectElements(current => current.filter(entry => entry.id !== id));
484
+ setSelectedId(selected => selected === id ? null : selected);
485
+ }, [setProjectElements, setSelectedId]);
486
+
487
+ /* Which person's Details dialog is open — keyed off the element id so the
488
+ element stays the single source of the person it shows. */
489
+ const _useState6 = useState(null),
490
+ detailsId = _useState6[0],
491
+ setDetailsId = _useState6[1];
492
+ const detailsPerson = (_projectElements$find2 = (_projectElements$find3 = projectElements.find(entry => entry.id === detailsId)) == null ? void 0 : _projectElements$find3.person) != null ? _projectElements$find2 : null;
493
+
477
494
  /* ---- draw-to-place ------------------------------------------------ */
478
495
 
479
496
  const drawRef = useRef(null);
@@ -528,6 +545,14 @@ export const CanvasElements = _ref => {
528
545
  width,
529
546
  height
530
547
  } : SHAPE_DEFAULT_SIZES[origin.tool]);
548
+ } else if (origin.tool === "person") {
549
+ /* A person is a square: the drawn WIDTH is its side, clamped to the
550
+ person bounds, and a plain click drops the default size. */
551
+ const side = drawn ? clampPersonSize(width) : PERSON_DEFAULT_SIZE;
552
+ addProjectElement(at, {
553
+ width: side,
554
+ height: side
555
+ }, "person");
531
556
  } else if (isProjectTool(origin.tool)) {
532
557
  /* Both dimensions matter here (a project card is not auto-height the
533
558
  way a link is), and a card smaller than the minimum could not hold
@@ -570,9 +595,9 @@ export const CanvasElements = _ref => {
570
595
 
571
596
  /* Where the armed tool's hover preview sits — cleared while a draw gesture
572
597
  runs (the rubber band takes over) and whenever the tool disarms. */
573
- const _useState6 = useState(null),
574
- hoverPoint = _useState6[0],
575
- setHoverPoint = _useState6[1];
598
+ const _useState7 = useState(null),
599
+ hoverPoint = _useState7[0],
600
+ setHoverPoint = _useState7[1];
576
601
  useEffect(() => {
577
602
  if (activeTool === "select") {
578
603
  setHoverPoint(null);
@@ -795,23 +820,25 @@ export const CanvasElements = _ref => {
795
820
  onDelete: () => deleteFile(entry.id)
796
821
  }));
797
822
  }), projectElements.map(entry => {
798
- var _positions$entry$id$x2, _positions$entry$id3, _positions$entry$id$y2, _positions$entry$id4;
823
+ var _positions$entry$id$x2, _positions$entry$id3, _positions$entry$id$y2, _positions$entry$id4, _locks$entry$id;
799
824
  const selected = entry.id === selectedId;
800
825
  return /*#__PURE__*/React.createElement(StyledProjectElementBox, {
801
826
  key: entry.id,
802
- className: [selected ? "selected" : "", entry.limited ? "limited" : "",
827
+ className: [selected ? "selected" : "", entry.limited ? "limited" : "", entry.kind === "person" ? "person" : "",
803
828
  /* A resolved card is a StackedCard, and the shell draws its own
804
829
  ring — so the box stands down, exactly as it does for the link
805
- and file cards. The placeholder, the resolving flash and the
806
- limited card are not StackedCards and keep the box's ring. */
807
- entry.status === "resolved" && !entry.limited ? "is-card" : ""].filter(Boolean).join(" "),
830
+ and file cards. The placeholder, the resolving flash, the
831
+ limited card and the person chip are not StackedCards and keep
832
+ the box's ring. */
833
+ entry.status === "resolved" && !entry.limited && entry.kind !== "person" ? "is-card" : ""].filter(Boolean).join(" "),
808
834
  style: {
809
835
  left: (_positions$entry$id$x2 = (_positions$entry$id3 = positions[entry.id]) == null ? void 0 : _positions$entry$id3.x) != null ? _positions$entry$id$x2 : 0,
810
836
  top: (_positions$entry$id$y2 = (_positions$entry$id4 = positions[entry.id]) == null ? void 0 : _positions$entry$id4.y) != null ? _positions$entry$id$y2 : 0,
811
837
  width: entry.width,
812
838
  /* Only the placeholder box is measured in both directions; the
813
- resolved card is auto-height like every other card here. */
814
- height: entry.status === "resolved" ? undefined : entry.height
839
+ resolved card is auto-height like every other card here. A
840
+ person is a fixed square in every state. */
841
+ height: entry.status === "resolved" && entry.kind !== "person" ? undefined : entry.height
815
842
  },
816
843
  onMouseDown: event => entry.limited ? handleLimitedMouseDown(event, entry.id) : handleElementMouseDown(event, entry.id),
817
844
  onClickCapture: handleElementClickCapture,
@@ -819,7 +846,12 @@ export const CanvasElements = _ref => {
819
846
  }, /*#__PURE__*/React.createElement(ProjectElementNode, {
820
847
  element: entry,
821
848
  selected: selected
822
- }));
849
+ }), selected && entry.kind === "person" && entry.status === "resolved" && !entry.limited && entry.person ? /*#__PURE__*/React.createElement(PersonCardToolbar, {
850
+ onDetails: () => setDetailsId(entry.id),
851
+ locked: (_locks$entry$id = locks[entry.id]) != null ? _locks$entry$id : false,
852
+ onToggleLock: () => toggleLock(entry.id),
853
+ onDelete: () => deleteProjectElement(entry.id)
854
+ }) : null);
823
855
  }), draft && !isShapeTool(draft.tool) && !isProjectTool(draft.tool) ? /*#__PURE__*/React.createElement(StyledLinkDraft, {
824
856
  style: {
825
857
  left: draft.x,
@@ -829,7 +861,17 @@ export const CanvasElements = _ref => {
829
861
  }
830
862
  }, /*#__PURE__*/React.createElement("span", {
831
863
  className: "draft-width"
832
- }, "W", " ", draft.width >= CARD_DRAW_THRESHOLD ? clampCardWidth(draft.width) : draft.tool === "file" ? FILE_DEFAULT_WIDTH : LINK_DEFAULT_WIDTH, " ", "\xB7 height follows content")) : null, draft && isProjectTool(draft.tool) ? /*#__PURE__*/React.createElement(StyledProjectDraft, {
864
+ }, "W", " ", draft.width >= CARD_DRAW_THRESHOLD ? clampCardWidth(draft.width) : draft.tool === "file" ? FILE_DEFAULT_WIDTH : LINK_DEFAULT_WIDTH, " ", "\xB7 height follows content")) : null, draft && draft.tool === "person" ? (() => {
865
+ const side = draft.width >= CARD_DRAW_THRESHOLD ? clampPersonSize(draft.width) : PERSON_DEFAULT_SIZE;
866
+ return /*#__PURE__*/React.createElement(StyledPersonDraft, {
867
+ style: {
868
+ left: draft.x,
869
+ top: draft.y,
870
+ width: side,
871
+ height: side
872
+ }
873
+ });
874
+ })() : null, draft && isProjectTool(draft.tool) && draft.tool !== "person" ? /*#__PURE__*/React.createElement(StyledProjectDraft, {
833
875
  style: {
834
876
  left: draft.x,
835
877
  top: draft.y,
@@ -858,6 +900,16 @@ export const CanvasElements = _ref => {
858
900
  }, size)
859
901
  }, shapePreviewGlyph(activeTool, size.width, size.height));
860
902
  }
903
+ if (activeTool === "person") {
904
+ return /*#__PURE__*/React.createElement(StyledPersonDraft, {
905
+ style: {
906
+ left: at.x,
907
+ top: at.y,
908
+ width: PERSON_DEFAULT_SIZE,
909
+ height: PERSON_DEFAULT_SIZE
910
+ }
911
+ });
912
+ }
861
913
  if (isProjectTool(activeTool)) {
862
914
  return /*#__PURE__*/React.createElement(StyledProjectDraft, {
863
915
  style: {
@@ -887,10 +939,27 @@ export const CanvasElements = _ref => {
887
939
  rx: 8,
888
940
  ry: 8
889
941
  })));
890
- })() : null, pickerElement ? /*#__PURE__*/React.createElement(ProjectElementPicker, {
942
+ })() : null, detailsPerson ? /*#__PURE__*/React.createElement(UserDetailsDialog, _extends({
943
+ open: true
944
+ }, personDetailsProps(detailsPerson), {
945
+ onClose: () => setDetailsId(null)
946
+ })) : null, pickerElement ? /*#__PURE__*/React.createElement(ProjectElementPicker, {
891
947
  kind: pickerElement.kind,
892
- onSelectProject: project => resolveProjectElement(pickerElement.id, project, null),
893
- onSelectTask: (project, task) => resolveProjectElement(pickerElement.id, project, task),
948
+ onSelectProject: project => resolveProjectElement(pickerElement.id, {
949
+ project,
950
+ task: null,
951
+ person: null
952
+ }),
953
+ onSelectTask: (project, task) => resolveProjectElement(pickerElement.id, {
954
+ project,
955
+ task,
956
+ person: null
957
+ }),
958
+ onSelectPerson: person => resolveProjectElement(pickerElement.id, {
959
+ project: null,
960
+ task: null,
961
+ person
962
+ }),
894
963
  onCancel: () => cancelProjectElement(pickerElement.id)
895
964
  }) : null);
896
965
  };