@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
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.taskDisplayName = exports.projectElementTitle = exports.projectClientLabel = exports.projectCardWidth = exports.isProjectTool = exports.groupTasks = exports.groupProjects = exports.TaskElementCard = exports.TASK_CARD_WIDTH = exports.StyledResolving = exports.StyledProjectElementBox = exports.StyledProjectDraft = exports.StyledPlaceholder = exports.StyledLimitedCard = exports.SEEDED_PROJECT_ELEMENT_POSITIONS = exports.SEEDED_PROJECT_ELEMENTS = exports.RESOLVE_MS = exports.ProjectElementPicker = exports.ProjectElementNode = exports.ProjectElementCard = exports.PROJECT_CARD_WIDTH = exports.PLACEHOLDER_MIN_WIDTH = exports.PLACEHOLDER_MIN_HEIGHT = exports.PICKER_PROJECT_LABELS = exports.PICKER_PROJECTS = exports.PICKER_PEOPLE = exports.PICKER_LABELS = exports.LimitedElementCard = exports.LIMITED_ACCESS_MESSAGE = exports.LIMITED_ACCESS_LABEL = exports.INTERNAL_CLIENT_LABEL = void 0;
6
+ exports.taskDisplayName = exports.projectElementTitle = exports.projectClientLabel = exports.projectCardWidth = exports.isProjectTool = exports.groupTasks = exports.groupProjects = exports.clampPersonSize = exports.TaskElementCard = exports.TASK_CARD_WIDTH = exports.StyledResolving = exports.StyledProjectElementBox = exports.StyledProjectDraft = exports.StyledPlaceholder = exports.StyledPersonResolving = exports.StyledPersonPlaceholder = exports.StyledPersonFace = exports.StyledPersonDraft = exports.StyledLimitedCard = exports.SEEDED_PROJECT_ELEMENT_POSITIONS = exports.SEEDED_PROJECT_ELEMENTS = exports.RESOLVE_MS = exports.ProjectElementPicker = exports.ProjectElementNode = exports.ProjectElementCard = exports.PersonElementFace = exports.PROJECT_CARD_WIDTH = exports.PLACEHOLDER_MIN_WIDTH = exports.PLACEHOLDER_MIN_HEIGHT = exports.PICKER_PROJECT_LABELS = exports.PICKER_PROJECTS = exports.PICKER_PEOPLE_LIST = exports.PICKER_PEOPLE = exports.PICKER_LABELS = exports.PERSON_MIN_SIZE = exports.PERSON_MAX_SIZE = exports.PERSON_DEFAULT_SIZE = exports.LimitedElementCard = exports.LIMITED_ACCESS_MESSAGE = exports.LIMITED_ACCESS_LABEL = exports.INTERNAL_CLIENT_LABEL = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _styledComponents = _interopRequireDefault(require("styled-components"));
9
9
  var _elements = require("./elements");
@@ -21,17 +21,17 @@ var _shared = require("../shared");
21
21
  var _content = require("../stackedCard/content");
22
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
23
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
24
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
25
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
26
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
27
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
28
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
24
29
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
25
30
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
26
31
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
27
32
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
28
33
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
29
34
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
30
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
31
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
32
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
33
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
34
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
35
35
  /* ------------------------------------------------------------------ */
36
36
  /* Project elements — placeholder → picker → resolved card */
37
37
  /* ------------------------------------------------------------------ */
@@ -71,9 +71,19 @@ var TASK_CARD_WIDTH = exports.TASK_CARD_WIDTH = 260;
71
71
 
72
72
  /* How long the "details are being resolved from the backend" flash lasts. */
73
73
  var RESOLVE_MS = exports.RESOLVE_MS = 480;
74
- /** True for the two board tools this module owns. */
74
+ /** True for the three board tools this module owns. */
75
75
  var isProjectTool = exports.isProjectTool = function isProjectTool(tool) {
76
- return tool === "project" || tool === "task";
76
+ return tool === "project" || tool === "task" || tool === "person";
77
+ };
78
+
79
+ /* A person is not a card: a square whose width IS its height, so the avatar
80
+ circle stays a circle. The drawn width is its side, clamped to these bounds —
81
+ the same 1:1 lock the app enforces on the canvas grip and in the Inspector. */
82
+ var PERSON_DEFAULT_SIZE = exports.PERSON_DEFAULT_SIZE = 96;
83
+ var PERSON_MIN_SIZE = exports.PERSON_MIN_SIZE = 48;
84
+ var PERSON_MAX_SIZE = exports.PERSON_MAX_SIZE = 240;
85
+ var clampPersonSize = exports.clampPersonSize = function clampPersonSize(size) {
86
+ return Math.min(PERSON_MAX_SIZE, Math.max(PERSON_MIN_SIZE, Math.round(size)));
77
87
  };
78
88
 
79
89
  /* ------------------------------------------------------------------ */
@@ -138,6 +148,21 @@ var PICKER_PEOPLE = exports.PICKER_PEOPLE = {
138
148
  }
139
149
  };
140
150
 
151
+ /* The People picker's one flat list: everyone the board knows, by name, with
152
+ no company or project layer — a person chip points at a user, not at a
153
+ membership. The record key doubles as the row id. */
154
+ var PICKER_PEOPLE_LIST = exports.PICKER_PEOPLE_LIST = Object.entries(PICKER_PEOPLE).map(function (_ref) {
155
+ var _ref2 = _slicedToArray(_ref, 2),
156
+ id = _ref2[0],
157
+ person = _ref2[1];
158
+ return {
159
+ id,
160
+ person
161
+ };
162
+ }).sort(function (a, b) {
163
+ return a.person.name.localeCompare(b.person.name);
164
+ });
165
+
141
166
  /* Label colours are data too: they are the label's own colour in the app. */
142
167
  var PICKER_LABELS = exports.PICKER_LABELS = {
143
168
  assigned: {
@@ -450,6 +475,10 @@ var projectElementTitle = exports.projectElementTitle = function projectElementT
450
475
  if (element.limited) {
451
476
  return LIMITED_ACCESS_LABEL;
452
477
  }
478
+ if (element.kind === "person") {
479
+ var _element$person$name, _element$person;
480
+ return (_element$person$name = (_element$person = element.person) === null || _element$person === void 0 ? void 0 : _element$person.name) !== null && _element$person$name !== void 0 ? _element$person$name : "Person";
481
+ }
453
482
  if (element.kind === "project") {
454
483
  var _element$project$name, _element$project;
455
484
  return (_element$project$name = (_element$project = element.project) === null || _element$project === void 0 ? void 0 : _element$project.name) !== null && _element$project$name !== void 0 ? _element$project$name : "Project";
@@ -483,7 +512,8 @@ var SEEDED = [{
483
512
  status: "resolved",
484
513
  limited: true,
485
514
  project: null,
486
- task: null
515
+ task: null,
516
+ person: null
487
517
  },
488
518
  x: 120,
489
519
  y: 200
@@ -496,7 +526,8 @@ var SEEDED = [{
496
526
  status: "resolved",
497
527
  limited: true,
498
528
  project: null,
499
- task: null
529
+ task: null,
530
+ person: null
500
531
  },
501
532
  x: 120,
502
533
  y: 380
@@ -522,7 +553,7 @@ var SEEDED_PROJECT_ELEMENT_POSITIONS = exports.SEEDED_PROJECT_ELEMENT_POSITIONS
522
553
  var StyledProjectElementBox = exports.StyledProjectElementBox = (0, _styledComponents.default)(_elements.StyledCanvasElement).withConfig({
523
554
  displayName: "projectElements__StyledProjectElementBox",
524
555
  componentId: "sc-1cayxi5-0"
525
- })(["border-radius:8px;transition:width 160ms ease;&.limited{cursor:not-allowed;}"]);
556
+ })(["border-radius:8px;transition:width 160ms ease;&.limited{cursor:not-allowed;}&.person{border-radius:50%;}"]);
526
557
 
527
558
  /* The rubber band and the armed tool's hover preview — the same blue dashed
528
559
  box the link tool draws, so the gesture reads as one board convention. */
@@ -531,18 +562,44 @@ var StyledProjectDraft = exports.StyledProjectDraft = _styledComponents.default.
531
562
  componentId: "sc-1cayxi5-1"
532
563
  })(["position:absolute;box-sizing:border-box;border:1.5px dashed ", ";border-radius:8px;background-color:rgba(59,130,246,0.08);pointer-events:none;"], _elements.SELECTION_BLUE);
533
564
 
565
+ /* The person rubber band and hover preview: the same dashed blue, round. */
566
+ var StyledPersonDraft = exports.StyledPersonDraft = (0, _styledComponents.default)(StyledProjectDraft).withConfig({
567
+ displayName: "projectElements__StyledPersonDraft",
568
+ componentId: "sc-1cayxi5-2"
569
+ })(["border-radius:50%;"]);
570
+
534
571
  /* The placeholder that waits for the picker's answer. Card-like on purpose:
535
572
  rounded, dashed, tinted — a card-shaped hole, not a selection marquee. */
536
573
  var StyledPlaceholder = exports.StyledPlaceholder = _styledComponents.default.div.withConfig({
537
574
  displayName: "projectElements__StyledPlaceholder",
538
- componentId: "sc-1cayxi5-2"
575
+ componentId: "sc-1cayxi5-3"
539
576
  })(["box-sizing:border-box;width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:12px;border:1.5px dashed var(--border-primary);border-radius:8px;background-color:var(--color-theme-200);user-select:none;"]);
540
577
 
578
+ /* A person's placeholder is the circle its avatar will fill — dashed and
579
+ tinted like the card placeholder, with the person glyph where the face will
580
+ be, so the pick swaps one circle for another without a change of shape. */
581
+ var StyledPersonPlaceholder = exports.StyledPersonPlaceholder = (0, _styledComponents.default)(StyledPlaceholder).withConfig({
582
+ displayName: "projectElements__StyledPersonPlaceholder",
583
+ componentId: "sc-1cayxi5-4"
584
+ })(["border-radius:50%;padding:0;color:var(--color-theme-600);svg{width:40%;height:40%;fill:currentColor;}"]);
585
+ var StyledPersonResolving = exports.StyledPersonResolving = _styledComponents.default.div.withConfig({
586
+ displayName: "projectElements__StyledPersonResolving",
587
+ componentId: "sc-1cayxi5-5"
588
+ })(["width:100%;height:100%;border-radius:50%;overflow:hidden;.c-loader{width:100%;height:100%;border-radius:50%;}"]);
589
+
590
+ /* The resolved chip. The avatar fills the element's square and the name hangs
591
+ below it, outside the box: the circle is the whole footprint the board
592
+ measures, so the caption never changes the element's size. */
593
+ var StyledPersonFace = exports.StyledPersonFace = _styledComponents.default.div.withConfig({
594
+ displayName: "projectElements__StyledPersonFace",
595
+ componentId: "sc-1cayxi5-6"
596
+ })(["position:relative;width:100%;height:100%;border-radius:50%;user-select:none;.person-avatar{width:100%;height:100%;}.person-name{position:absolute;top:100%;left:50%;transform:translateX(-50%);margin-top:6px;white-space:nowrap;}"]);
597
+
541
598
  /* The resolving flash: the placeholder's box, with the card's rows sketched in
542
599
  so the swap to the real card does not read as a different element. */
543
600
  var StyledResolving = exports.StyledResolving = (0, _styledComponents.default)(StyledPlaceholder).withConfig({
544
601
  displayName: "projectElements__StyledResolving",
545
- componentId: "sc-1cayxi5-3"
602
+ componentId: "sc-1cayxi5-7"
546
603
  })(["flex-direction:column;align-items:stretch;justify-content:center;gap:10px;.c-loader{height:12px;}"]);
547
604
 
548
605
  /**
@@ -564,8 +621,8 @@ var StyledResolving = exports.StyledResolving = (0, _styledComponents.default)(S
564
621
  */
565
622
  var StyledLimitedCard = exports.StyledLimitedCard = _styledComponents.default.div.withConfig({
566
623
  displayName: "projectElements__StyledLimitedCard",
567
- componentId: "sc-1cayxi5-4"
568
- })(["box-sizing:border-box;width:100%;height:100%;min-height:96px;display:flex;align-items:center;justify-content:center;padding:12px;border:1px solid var(--border-primary);border-radius:8px;background-color:var(--muted-surface);background-image:repeating-linear-gradient( -45deg,transparent,transparent 5px,var(--stripe-pattern) 5px,var(--stripe-pattern) 5.7px );color:var(--muted-surface-text);cursor:not-allowed;user-select:none;.limited-label{color:var(--muted-surface-text);}"]);
624
+ componentId: "sc-1cayxi5-8"
625
+ })(["box-sizing:border-box;width:100%;height:100%;min-height:96px;display:flex;align-items:center;justify-content:center;padding:12px;border:1px solid var(--border-primary);border-radius:8px;background-color:var(--muted-surface);background-image:repeating-linear-gradient( -45deg,transparent,transparent 5px,var(--stripe-pattern) 5px,var(--stripe-pattern) 5.7px );color:var(--muted-surface-text);cursor:not-allowed;user-select:none;.limited-label{color:var(--muted-surface-text);}&.round{border-radius:50%;min-height:0;}"]);
569
626
 
570
627
  /**
571
628
  * Both resolved faces are the design system's `StackedCard` — the same shell the
@@ -578,7 +635,7 @@ var StyledLimitedCard = exports.StyledLimitedCard = _styledComponents.default.di
578
635
  */
579
636
  var StyledEntityCard = (0, _styledComponents.default)(_StackedCard.StackedCard).withConfig({
580
637
  displayName: "projectElements__StyledEntityCard",
581
- componentId: "sc-1cayxi5-5"
638
+ componentId: "sc-1cayxi5-9"
582
639
  })(["&&{width:100%;}user-select:none;"]);
583
640
  /**
584
641
  * The task face — the shared `TaskCard`, with the project line switched on.
@@ -593,11 +650,11 @@ var StyledEntityCard = (0, _styledComponents.default)(_StackedCard.StackedCard).
593
650
  * The title is the app's own display name (`#123: Name`, `taskDisplayName`), so
594
651
  * the card's separate task-number prefix stays off.
595
652
  */
596
- var TaskElementCard = exports.TaskElementCard = function TaskElementCard(_ref) {
653
+ var TaskElementCard = exports.TaskElementCard = function TaskElementCard(_ref3) {
597
654
  var _task$subtasks, _task$comments, _task$date;
598
- var project = _ref.project,
599
- task = _ref.task,
600
- selected = _ref.selected;
655
+ var project = _ref3.project,
656
+ task = _ref3.task,
657
+ selected = _ref3.selected;
601
658
  return /*#__PURE__*/_react.default.createElement(StyledEntityCard, {
602
659
  selected: selected
603
660
  }, /*#__PURE__*/_react.default.createElement(_content.TaskCard, {
@@ -622,9 +679,9 @@ var TaskElementCard = exports.TaskElementCard = function TaskElementCard(_ref) {
622
679
  * right. No progress indicator, and no row at all when the project has neither a
623
680
  * leader nor a label.
624
681
  */
625
- var ProjectElementCard = exports.ProjectElementCard = function ProjectElementCard(_ref2) {
626
- var project = _ref2.project,
627
- selected = _ref2.selected;
682
+ var ProjectElementCard = exports.ProjectElementCard = function ProjectElementCard(_ref4) {
683
+ var project = _ref4.project,
684
+ selected = _ref4.selected;
628
685
  return /*#__PURE__*/_react.default.createElement(StyledEntityCard, {
629
686
  selected: selected
630
687
  }, /*#__PURE__*/_react.default.createElement(_content.ProjectCard, {
@@ -650,25 +707,74 @@ var ProjectElementCard = exports.ProjectElementCard = function ProjectElementCar
650
707
  * not the entity's identity — the opposite of the tooltip Workload disables on
651
708
  * a limited event, which would have leaked the name.
652
709
  */
653
- var LimitedElementCard = exports.LimitedElementCard = function LimitedElementCard() {
710
+ var LimitedElementCard = exports.LimitedElementCard = function LimitedElementCard(_ref5) {
711
+ var _ref5$round = _ref5.round,
712
+ round = _ref5$round === void 0 ? false : _ref5$round;
654
713
  return /*#__PURE__*/_react.default.createElement(_Tooltip.Tooltip, {
655
714
  title: LIMITED_ACCESS_MESSAGE
656
715
  }, /*#__PURE__*/_react.default.createElement(StyledLimitedCard, {
657
- "data-testid": "wb-limited-card"
716
+ "data-testid": "wb-limited-card",
717
+ className: round ? "round" : undefined
658
718
  }, /*#__PURE__*/_react.default.createElement(_Typography.Caption1, {
659
719
  weight: "bold",
660
720
  className: "limited-label"
661
721
  }, LIMITED_ACCESS_LABEL)));
662
722
  };
723
+ /**
724
+ * The person face — an avatar circle with a name caption. Always a chip: never
725
+ * a StackedCard, it never expands, no hover card, no online-status dot. The
726
+ * initials avatar stands in for the server-rendered avatar, as it does on the
727
+ * cards.
728
+ */
729
+ var PersonElementFace = exports.PersonElementFace = function PersonElementFace(_ref6) {
730
+ var person = _ref6.person,
731
+ size = _ref6.size;
732
+ return /*#__PURE__*/_react.default.createElement(StyledPersonFace, {
733
+ "data-testid": "wb-person-face"
734
+ }, /*#__PURE__*/_react.default.createElement(_shared.RoundAvatar, {
735
+ className: "person-avatar",
736
+ $bg: person.color,
737
+ $size: size,
738
+ $bordered: false,
739
+ style: {
740
+ fontSize: Math.round(size * 0.28)
741
+ },
742
+ "aria-label": person.name
743
+ }, person.initials), /*#__PURE__*/_react.default.createElement(_Typography.Caption1, {
744
+ weight: "bold",
745
+ className: "person-name"
746
+ }, person.name));
747
+ };
663
748
 
664
749
  /** One board element, in whichever of its three states it currently is. */
665
- var ProjectElementNode = exports.ProjectElementNode = function ProjectElementNode(_ref3) {
666
- var element = _ref3.element,
667
- selected = _ref3.selected;
750
+ var ProjectElementNode = exports.ProjectElementNode = function ProjectElementNode(_ref7) {
751
+ var element = _ref7.element,
752
+ selected = _ref7.selected;
668
753
  /* Checked before anything else: a limited element must never be able to fall
669
754
  through to a branch that renders entity data. */
670
755
  if (element.limited) {
671
- return /*#__PURE__*/_react.default.createElement(LimitedElementCard, null);
756
+ return /*#__PURE__*/_react.default.createElement(LimitedElementCard, {
757
+ round: element.kind === "person"
758
+ });
759
+ }
760
+
761
+ /* A person is the board's second non-card render: every state is a circle. */
762
+ if (element.kind === "person") {
763
+ if (element.status === "placeholder") {
764
+ return /*#__PURE__*/_react.default.createElement(StyledPersonPlaceholder, {
765
+ "aria-label": "Pick a person"
766
+ }, /*#__PURE__*/_react.default.createElement(_Icons.PersonIcon, null));
767
+ }
768
+ if (element.status === "resolving") {
769
+ return /*#__PURE__*/_react.default.createElement(StyledPersonResolving, null, /*#__PURE__*/_react.default.createElement(_Loaders.SkeletonLoader, null));
770
+ }
771
+ if (element.person) {
772
+ return /*#__PURE__*/_react.default.createElement(PersonElementFace, {
773
+ person: element.person,
774
+ size: element.width
775
+ });
776
+ }
777
+ return /*#__PURE__*/_react.default.createElement(StyledPersonPlaceholder, null);
672
778
  }
673
779
  if (element.status === "placeholder") {
674
780
  return /*#__PURE__*/_react.default.createElement(StyledPlaceholder, null, /*#__PURE__*/_react.default.createElement(_Typography.Caption1, {
@@ -716,30 +822,31 @@ var ProjectElementNode = exports.ProjectElementNode = function ProjectElementNod
716
822
  share: the portal, the overlay, the focus lock and the Esc handler. */
717
823
  var StyledPickerPanel = (0, _styledComponents.default)(_Paper.Paper).withConfig({
718
824
  displayName: "projectElements__StyledPickerPanel",
719
- componentId: "sc-1cayxi5-6"
825
+ componentId: "sc-1cayxi5-10"
720
826
  })(["position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;flex-direction:column;width:470px;max-width:calc(100vw - 32px);max-height:70vh;overflow:hidden;&&{border-radius:12px;border:1px solid var(--border-primary);box-shadow:0 18px 48px rgba(0,0,0,0.24);}"]);
721
827
 
722
828
  /* Search + adornments, mirroring `Select`'s own form row: the back arrow is a
723
829
  start adornment (TaskList), the group-by sort a end adornment (ProjectList). */
724
830
  var StyledPickerHeader = _styledComponents.default.div.withConfig({
725
831
  displayName: "projectElements__StyledPickerHeader",
726
- componentId: "sc-1cayxi5-7"
832
+ componentId: "sc-1cayxi5-11"
727
833
  })(["display:flex;align-items:center;gap:8px;flex-shrink:0;padding:12px 12px 8px;.picker-search{width:100%;border-radius:8px;}.picker-search:focus-within{border-color:var(--color-primary);outline:1px solid var(--color-primary);}"]);
728
834
  var StyledPickerList = _styledComponents.default.div.withConfig({
729
835
  displayName: "projectElements__StyledPickerList",
730
- componentId: "sc-1cayxi5-8"
836
+ componentId: "sc-1cayxi5-12"
731
837
  })(["flex:1 1 auto;min-height:0;overflow-y:auto;padding:4px 0 12px;.picker-group-header{box-sizing:border-box;height:36px;display:flex;align-items:center;padding:0 20px;margin-top:4px;}.picker-empty{padding:24px 20px;text-align:center;}"]);
732
838
 
733
839
  /* A generously spaced row: the name on the left, an empty radio on the right —
734
840
  the shape `Select` gives a single-choice option, at picker scale. */
735
841
  var StyledPickerRow = _styledComponents.default.div.withConfig({
736
842
  displayName: "projectElements__StyledPickerRow",
737
- componentId: "sc-1cayxi5-9"
738
- })(["box-sizing:border-box;height:56px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 20px;cursor:pointer;outline:none;&:hover,&:focus-visible{background-color:var(--color-theme-200);}.row-name{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.c-radio-btn{flex-shrink:0;}"]);
739
- var PickerRow = function PickerRow(_ref4) {
740
- var id = _ref4.id,
741
- name = _ref4.name,
742
- onSelect = _ref4.onSelect;
843
+ componentId: "sc-1cayxi5-13"
844
+ })(["box-sizing:border-box;height:56px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 20px;cursor:pointer;outline:none;&:hover,&:focus-visible{background-color:var(--color-theme-200);}.row-lead{display:flex;align-items:center;gap:12px;min-width:0;}.row-name{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.c-radio-btn{flex-shrink:0;}"]);
845
+ var PickerRow = function PickerRow(_ref8) {
846
+ var id = _ref8.id,
847
+ name = _ref8.name,
848
+ avatar = _ref8.avatar,
849
+ onSelect = _ref8.onSelect;
743
850
  return /*#__PURE__*/_react.default.createElement(StyledPickerRow, {
744
851
  role: "button",
745
852
  tabIndex: 0,
@@ -751,23 +858,31 @@ var PickerRow = function PickerRow(_ref4) {
751
858
  }
752
859
  }
753
860
  }, /*#__PURE__*/_react.default.createElement("span", {
861
+ className: "row-lead"
862
+ }, avatar ? /*#__PURE__*/_react.default.createElement(_shared.RoundAvatar, {
863
+ $bg: avatar.color,
864
+ $size: 24,
865
+ $bordered: false
866
+ }, avatar.initials) : null, /*#__PURE__*/_react.default.createElement("span", {
754
867
  className: "row-name"
755
- }, /*#__PURE__*/_react.default.createElement(_Typography.Body2, null, name)), /*#__PURE__*/_react.default.createElement(_RadioButton.RadioButton, {
868
+ }, /*#__PURE__*/_react.default.createElement(_Typography.Body2, null, name))), /*#__PURE__*/_react.default.createElement(_RadioButton.RadioButton, {
756
869
  id: "wb-picker-".concat(id),
757
870
  tabIndex: -1
758
871
  }));
759
872
  };
760
873
  /**
761
- * One picker, two flows — the same split the app makes between
762
- * `MenuSelector/ProjectList` (one step) and `ProjectTaskMenuSelector` (project,
763
- * then task). The task flow deliberately drops the app's "Directly on project"
764
- * default option: a task card has to be a task.
874
+ * One picker, three flows — the same split the app makes between
875
+ * `MenuSelector/ProjectList` (one step), `ProjectTaskMenuSelector` (project,
876
+ * then task) and the flat People list (one step, no grouping). The task flow
877
+ * deliberately drops the app's "Directly on project" default option: a task
878
+ * card has to be a task.
765
879
  */
766
- var ProjectElementPicker = exports.ProjectElementPicker = function ProjectElementPicker(_ref5) {
767
- var kind = _ref5.kind,
768
- onSelectProject = _ref5.onSelectProject,
769
- onSelectTask = _ref5.onSelectTask,
770
- onCancel = _ref5.onCancel;
880
+ var ProjectElementPicker = exports.ProjectElementPicker = function ProjectElementPicker(_ref9) {
881
+ var kind = _ref9.kind,
882
+ onSelectProject = _ref9.onSelectProject,
883
+ onSelectTask = _ref9.onSelectTask,
884
+ onSelectPerson = _ref9.onSelectPerson,
885
+ onCancel = _ref9.onCancel;
771
886
  var _useState = (0, _react.useState)(null),
772
887
  _useState2 = _slicedToArray(_useState, 2),
773
888
  project = _useState2[0],
@@ -783,6 +898,7 @@ var ProjectElementPicker = exports.ProjectElementPicker = function ProjectElemen
783
898
  gesture that created it. */
784
899
  var pressedInsideRef = (0, _react.useRef)(false);
785
900
  var onTaskStep = kind === "task" && project !== null;
901
+ var onPeopleStep = kind === "person";
786
902
  var projectGroups = (0, _react.useMemo)(function () {
787
903
  return groupProjects(PICKER_PROJECTS.filter(function (entry) {
788
904
  return matchesQuery(entry.name, query);
@@ -805,7 +921,14 @@ var ProjectElementPicker = exports.ProjectElementPicker = function ProjectElemen
805
921
  setProject(null);
806
922
  setQuery("");
807
923
  };
808
- var isEmpty = onTaskStep ? taskGroups.length === 0 : projectGroups.length === 0;
924
+ var people = (0, _react.useMemo)(function () {
925
+ return PICKER_PEOPLE_LIST.filter(function (entry) {
926
+ return matchesQuery(entry.person.name, query);
927
+ });
928
+ }, [query]);
929
+ var isEmpty = onPeopleStep ? people.length === 0 : onTaskStep ? taskGroups.length === 0 : projectGroups.length === 0;
930
+ var searchPlaceholder = onPeopleStep ? "Search a person" : onTaskStep ? "Search a task" : "Search a project";
931
+ var emptyLabel = onPeopleStep ? "No people" : onTaskStep ? "No Result" : "No Projects";
809
932
  return /*#__PURE__*/_react.default.createElement(_Modal.Modal, {
810
933
  open: true,
811
934
  onClose: onCancel,
@@ -831,11 +954,11 @@ var ProjectElementPicker = exports.ProjectElementPicker = function ProjectElemen
831
954
  className: "picker-search",
832
955
  autoFocus: true,
833
956
  value: query,
834
- placeholder: onTaskStep ? "Search a task" : "Search a project",
957
+ placeholder: searchPlaceholder,
835
958
  onChange: function onChange(event) {
836
959
  return setQuery(event.target.value);
837
960
  }
838
- }), onTaskStep ? null : /*#__PURE__*/_react.default.createElement(_Tooltip.Tooltip, {
961
+ }), onTaskStep || onPeopleStep ? null : /*#__PURE__*/_react.default.createElement(_Tooltip.Tooltip, {
839
962
  title: "Group by"
840
963
  }, /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
841
964
  type: "button",
@@ -844,7 +967,19 @@ var ProjectElementPicker = exports.ProjectElementPicker = function ProjectElemen
844
967
  className: "picker-empty"
845
968
  }, /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
846
969
  color: "tertiary"
847
- }, onTaskStep ? "No Result" : "No Projects")) : null, onTaskStep && project ? taskGroups.map(function (group) {
970
+ }, emptyLabel)) : null, onPeopleStep ? people.map(function (_ref0) {
971
+ var id = _ref0.id,
972
+ person = _ref0.person;
973
+ return /*#__PURE__*/_react.default.createElement(PickerRow, {
974
+ key: id,
975
+ id: id,
976
+ name: person.name,
977
+ avatar: person,
978
+ onSelect: function onSelect() {
979
+ return onSelectPerson(person);
980
+ }
981
+ });
982
+ }) : null, onTaskStep && project ? taskGroups.map(function (group) {
848
983
  return /*#__PURE__*/_react.default.createElement("div", {
849
984
  key: group.taskList
850
985
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -861,7 +996,7 @@ var ProjectElementPicker = exports.ProjectElementPicker = function ProjectElemen
861
996
  }
862
997
  });
863
998
  }));
864
- }) : null, onTaskStep ? null : projectGroups.map(function (group) {
999
+ }) : null, onTaskStep || onPeopleStep ? null : projectGroups.map(function (group) {
865
1000
  return /*#__PURE__*/_react.default.createElement("div", {
866
1001
  key: group.client
867
1002
  }, /*#__PURE__*/_react.default.createElement("div", {