@activecollab/components 2.0.408 → 2.0.409

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 (83) hide show
  1. package/dist/cjs/components/Icons/collection/Project.js +98 -0
  2. package/dist/cjs/components/Icons/collection/Project.js.map +1 -0
  3. package/dist/cjs/components/Icons/collection/Task.js +61 -0
  4. package/dist/cjs/components/Icons/collection/Task.js.map +1 -0
  5. package/dist/cjs/components/Icons/collection/index.js +14 -0
  6. package/dist/cjs/components/Icons/collection/index.js.map +1 -1
  7. package/dist/cjs/presentation/stackedCard/content/NoteCard.js +7 -3
  8. package/dist/cjs/presentation/stackedCard/content/NoteCard.js.map +1 -1
  9. package/dist/cjs/presentation/stackedCard/content/ProjectCard.js +136 -0
  10. package/dist/cjs/presentation/stackedCard/content/ProjectCard.js.map +1 -0
  11. package/dist/cjs/presentation/stackedCard/content/TaskCard.js +183 -56
  12. package/dist/cjs/presentation/stackedCard/content/TaskCard.js.map +1 -1
  13. package/dist/cjs/presentation/stackedCard/content/index.js +11 -0
  14. package/dist/cjs/presentation/stackedCard/content/index.js.map +1 -1
  15. package/dist/cjs/presentation/stackedCard/content/shared.js +66 -19
  16. package/dist/cjs/presentation/stackedCard/content/shared.js.map +1 -1
  17. package/dist/cjs/presentation/whiteboard/bottomDock.js +95 -32
  18. package/dist/cjs/presentation/whiteboard/bottomDock.js.map +1 -1
  19. package/dist/cjs/presentation/whiteboard/canvasElements.js +196 -8
  20. package/dist/cjs/presentation/whiteboard/canvasElements.js.map +1 -1
  21. package/dist/cjs/presentation/whiteboard/inspector.js +149 -47
  22. package/dist/cjs/presentation/whiteboard/inspector.js.map +1 -1
  23. package/dist/cjs/presentation/whiteboard/outline.js +91 -18
  24. package/dist/cjs/presentation/whiteboard/outline.js.map +1 -1
  25. package/dist/cjs/presentation/whiteboard/projectElements.js +883 -0
  26. package/dist/cjs/presentation/whiteboard/projectElements.js.map +1 -0
  27. package/dist/esm/components/Icons/collection/Project.d.ts +36 -0
  28. package/dist/esm/components/Icons/collection/Project.d.ts.map +1 -0
  29. package/dist/esm/components/Icons/collection/Project.js +91 -0
  30. package/dist/esm/components/Icons/collection/Project.js.map +1 -0
  31. package/dist/esm/components/Icons/collection/Task.d.ts +32 -0
  32. package/dist/esm/components/Icons/collection/Task.d.ts.map +1 -0
  33. package/dist/esm/components/Icons/collection/Task.js +54 -0
  34. package/dist/esm/components/Icons/collection/Task.js.map +1 -0
  35. package/dist/esm/components/Icons/collection/index.d.ts +2 -0
  36. package/dist/esm/components/Icons/collection/index.d.ts.map +1 -1
  37. package/dist/esm/components/Icons/collection/index.js +2 -0
  38. package/dist/esm/components/Icons/collection/index.js.map +1 -1
  39. package/dist/esm/presentation/stackedCard/content/NoteCard.d.ts +8 -1
  40. package/dist/esm/presentation/stackedCard/content/NoteCard.d.ts.map +1 -1
  41. package/dist/esm/presentation/stackedCard/content/NoteCard.js +8 -4
  42. package/dist/esm/presentation/stackedCard/content/NoteCard.js.map +1 -1
  43. package/dist/esm/presentation/stackedCard/content/ProjectCard.d.ts +64 -0
  44. package/dist/esm/presentation/stackedCard/content/ProjectCard.d.ts.map +1 -0
  45. package/dist/esm/presentation/stackedCard/content/ProjectCard.js +128 -0
  46. package/dist/esm/presentation/stackedCard/content/ProjectCard.js.map +1 -0
  47. package/dist/esm/presentation/stackedCard/content/TaskCard.d.ts +64 -2
  48. package/dist/esm/presentation/stackedCard/content/TaskCard.d.ts.map +1 -1
  49. package/dist/esm/presentation/stackedCard/content/TaskCard.js +181 -58
  50. package/dist/esm/presentation/stackedCard/content/TaskCard.js.map +1 -1
  51. package/dist/esm/presentation/stackedCard/content/index.d.ts +1 -0
  52. package/dist/esm/presentation/stackedCard/content/index.d.ts.map +1 -1
  53. package/dist/esm/presentation/stackedCard/content/index.js +1 -0
  54. package/dist/esm/presentation/stackedCard/content/index.js.map +1 -1
  55. package/dist/esm/presentation/stackedCard/content/shared.d.ts +30 -0
  56. package/dist/esm/presentation/stackedCard/content/shared.d.ts.map +1 -1
  57. package/dist/esm/presentation/stackedCard/content/shared.js +66 -19
  58. package/dist/esm/presentation/stackedCard/content/shared.js.map +1 -1
  59. package/dist/esm/presentation/whiteboard/bottomDock.d.ts +30 -7
  60. package/dist/esm/presentation/whiteboard/bottomDock.d.ts.map +1 -1
  61. package/dist/esm/presentation/whiteboard/bottomDock.js +79 -32
  62. package/dist/esm/presentation/whiteboard/bottomDock.js.map +1 -1
  63. package/dist/esm/presentation/whiteboard/canvasElements.d.ts +4 -1
  64. package/dist/esm/presentation/whiteboard/canvasElements.d.ts.map +1 -1
  65. package/dist/esm/presentation/whiteboard/canvasElements.js +158 -7
  66. package/dist/esm/presentation/whiteboard/canvasElements.js.map +1 -1
  67. package/dist/esm/presentation/whiteboard/inspector.d.ts +35 -1
  68. package/dist/esm/presentation/whiteboard/inspector.d.ts.map +1 -1
  69. package/dist/esm/presentation/whiteboard/inspector.js +170 -68
  70. package/dist/esm/presentation/whiteboard/inspector.js.map +1 -1
  71. package/dist/esm/presentation/whiteboard/outline.d.ts +23 -3
  72. package/dist/esm/presentation/whiteboard/outline.d.ts.map +1 -1
  73. package/dist/esm/presentation/whiteboard/outline.js +89 -18
  74. package/dist/esm/presentation/whiteboard/outline.js.map +1 -1
  75. package/dist/esm/presentation/whiteboard/projectElements.d.ts +267 -0
  76. package/dist/esm/presentation/whiteboard/projectElements.d.ts.map +1 -0
  77. package/dist/esm/presentation/whiteboard/projectElements.js +824 -0
  78. package/dist/esm/presentation/whiteboard/projectElements.js.map +1 -0
  79. package/dist/index.js +629 -490
  80. package/dist/index.js.map +1 -1
  81. package/dist/index.min.js +1 -1
  82. package/dist/index.min.js.map +1 -1
  83. package/package.json +1 -1
@@ -3,12 +3,13 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.sameColor = exports.elementTraits = exports.colorName = exports.TYPE_LABEL = exports.TRANSPARENT_OPTION = exports.StyledSegmented = exports.StyledPropRow = exports.StyledPropGroups = exports.StyledPropGroup = exports.StyledInspectorSidebar = exports.StyledInspectorResizer = exports.StyledInspectorHeader = exports.StyledInspectorEmpty = exports.StyledInspectorBody = exports.StyledFieldGrid = exports.StyledControl = exports.StyledCheckboxRow = exports.StyledBody = exports.StyledAutoField = exports.RightInspector = exports.OptionSelect = exports.NumberField = exports.ColorPickerField = exports.AutoField = void 0;
6
+ exports.sameColor = exports.elementTraits = exports.colorName = exports.TYPE_LABEL = exports.TRANSPARENT_OPTION = exports.StyledSegmented = exports.StyledPropRow = exports.StyledPropGroups = exports.StyledPropGroup = exports.StyledInspectorSidebar = exports.StyledInspectorResizer = exports.StyledInspectorHeader = exports.StyledInspectorEmpty = exports.StyledInspectorBody = exports.StyledFieldGrid = exports.StyledControl = exports.StyledCheckboxRow = exports.StyledBody = exports.StyledAutoField = exports.RightInspector = exports.ReadOnlyField = exports.PROJECT_ELEMENT_TRAITS = exports.OptionSelect = exports.NumberField = exports.LIMITED_ELEMENT_TRAITS = exports.ColorPickerField = exports.AutoField = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _styledComponents = _interopRequireDefault(require("styled-components"));
9
9
  var _elements = require("./elements");
10
10
  var _fileElement = require("./fileElement");
11
11
  var _outline = require("./outline");
12
+ var _projectElements = require("./projectElements");
12
13
  var _Checkbox = require("../../components/Checkbox");
13
14
  var _ChooseV = require("../../components/ChooseV2");
14
15
  var _Dot = require("../../components/Dot");
@@ -23,17 +24,17 @@ var _Tooltip = require("../../components/Tooltip");
23
24
  var _Typography = require("../../components/Typography");
24
25
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
25
26
  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); }
26
- 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; }
27
- 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; }
28
- 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; }
29
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
30
- 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); }
31
27
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
32
28
  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."); }
33
29
  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; } }
34
30
  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; }
35
31
  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; } }
36
32
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
33
+ 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; }
34
+ 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; }
35
+ 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; }
36
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
37
+ 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); }
37
38
  /* ------------------------------------------------------------------ */
38
39
  /* Right Inspector — selected-element properties panel */
39
40
  /* ------------------------------------------------------------------ */
@@ -65,6 +66,42 @@ var elementTraits = exports.elementTraits = function elementTraits(def) {
65
66
  text: true
66
67
  };
67
68
  };
69
+
70
+ /**
71
+ * A project / task card's traits. It is the most constrained element on the
72
+ * board, and every "false" here is a fact about the card rather than a feature
73
+ * that has not been built yet:
74
+ *
75
+ * fill / stroke / text the card's appearance is the design system's, not
76
+ * the board's — recolouring it would make a task look
77
+ * like something it is not on another person's screen.
78
+ * autoHeight the card is content-sized; only its width is given.
79
+ * renamable the title belongs to the task / project record.
80
+ *
81
+ * Rotation is absent for the same reason it is absent on link and file cards:
82
+ * the Geometry group for a card simply does not render one.
83
+ */
84
+ var PROJECT_ELEMENT_TRAITS = exports.PROJECT_ELEMENT_TRAITS = {
85
+ geometry: true,
86
+ fill: false,
87
+ stroke: false,
88
+ text: false,
89
+ autoHeight: true,
90
+ renamable: false
91
+ };
92
+
93
+ /**
94
+ * A LIMITED-ACCESS card's traits: the project card's, with everything the
95
+ * viewer could have changed taken away.
96
+ *
97
+ * The panel is not empty, and that is deliberate — geometry still renders, so
98
+ * the viewer can see that the thing has a position and a size, which is
99
+ * precisely the amount that Workload's limited cell exposes (its data shape is
100
+ * a quantity and an offset). It simply cannot be edited.
101
+ */
102
+ var LIMITED_ELEMENT_TRAITS = exports.LIMITED_ELEMENT_TRAITS = _objectSpread(_objectSpread({}, PROJECT_ELEMENT_TRAITS), {}, {
103
+ readOnly: true
104
+ });
68
105
  var TYPE_LABEL = exports.TYPE_LABEL = {
69
106
  rectangle: "Rectangle",
70
107
  roundedRectangle: "Rounded Rectangle",
@@ -104,7 +141,7 @@ var StyledPropGroups = exports.StyledPropGroups = _styledComponents.default.div.
104
141
  var StyledInspectorHeader = exports.StyledInspectorHeader = _styledComponents.default.div.withConfig({
105
142
  displayName: "inspector__StyledInspectorHeader",
106
143
  componentId: "sc-do334k-4"
107
- })(["display:flex;align-items:center;gap:8px;height:56px;padding:0 16px;box-sizing:border-box;flex-shrink:0;.inspector-type-icon{display:flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0;color:var(--color-theme-700);}.inspector-type-icon svg{width:20px;height:20px;}.inspector-name{flex:1;min-width:0;}"]);
144
+ })(["display:flex;align-items:center;gap:8px;height:56px;padding:0 16px;box-sizing:border-box;flex-shrink:0;.inspector-type-icon{display:flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0;color:var(--color-theme-700);}.inspector-type-icon svg{width:20px;height:20px;}.inspector-name{flex:1;min-width:0;}.inspector-name-static{padding:0 4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}"]);
108
145
 
109
146
  /* Empty state — same muted treatment the outline uses for unnamed rows. */
110
147
  var StyledInspectorEmpty = exports.StyledInspectorEmpty = _styledComponents.default.div.withConfig({
@@ -193,11 +230,24 @@ var AutoField = exports.AutoField = function AutoField(_ref2) {
193
230
  weight: "regular"
194
231
  }, label), /*#__PURE__*/_react.default.createElement(StyledAutoField, null, "Auto"));
195
232
  };
196
- var OptionSelect = exports.OptionSelect = function OptionSelect(_ref3) {
197
- var options = _ref3.options,
198
- value = _ref3.value,
199
- triggerLabel = _ref3.triggerLabel,
200
- _onChange = _ref3.onChange;
233
+
234
+ /* A geometry value the viewer may READ but not change — the same field
235
+ `AutoField` and the file card's Size already use, with a real value in it.
236
+ Showing the number greyed out is the point: a limited card still has a
237
+ position and a size, and those are the only facts about it there are. */
238
+ var ReadOnlyField = exports.ReadOnlyField = function ReadOnlyField(_ref3) {
239
+ var label = _ref3.label,
240
+ value = _ref3.value;
241
+ return /*#__PURE__*/_react.default.createElement(StyledPropRow, null, /*#__PURE__*/_react.default.createElement(_Label.Label, {
242
+ size: "small",
243
+ weight: "regular"
244
+ }, label), /*#__PURE__*/_react.default.createElement(StyledAutoField, null, value));
245
+ };
246
+ var OptionSelect = exports.OptionSelect = function OptionSelect(_ref4) {
247
+ var options = _ref4.options,
248
+ value = _ref4.value,
249
+ triggerLabel = _ref4.triggerLabel,
250
+ _onChange = _ref4.onChange;
201
251
  return /*#__PURE__*/_react.default.createElement(StyledControl, null, /*#__PURE__*/_react.default.createElement(_Select.Select, {
202
252
  type: "single",
203
253
  disableSearch: true,
@@ -232,11 +282,11 @@ var colorName = exports.colorName = function colorName(hex) {
232
282
  /* The regular design-system named-colour picker (the one in the label dialogs):
233
283
  a Select whose trigger is a Dot + colour name, and whose menu is the standard
234
284
  dot-and-radio list. Custom colours are deferred. */
235
- var ColorPickerField = exports.ColorPickerField = function ColorPickerField(_ref4) {
236
- var value = _ref4.value,
237
- disabled = _ref4.disabled,
238
- includeTransparent = _ref4.includeTransparent,
239
- onSelect = _ref4.onSelect;
285
+ var ColorPickerField = exports.ColorPickerField = function ColorPickerField(_ref5) {
286
+ var value = _ref5.value,
287
+ disabled = _ref5.disabled,
288
+ includeTransparent = _ref5.includeTransparent,
289
+ onSelect = _ref5.onSelect;
240
290
  var options = includeTransparent ? [TRANSPARENT_OPTION, ..._elements.COLOR_OPTIONS] : _elements.COLOR_OPTIONS;
241
291
  var isTransparent = !value || sameColor(value, "transparent");
242
292
  return /*#__PURE__*/_react.default.createElement(StyledControl, {
@@ -265,26 +315,28 @@ var ColorPickerField = exports.ColorPickerField = function ColorPickerField(_ref
265
315
  }), colorName(value)))
266
316
  }));
267
317
  };
268
- var RightInspector = exports.RightInspector = function RightInspector(_ref5) {
318
+ var RightInspector = exports.RightInspector = function RightInspector(_ref6) {
269
319
  var _sizes$def$id, _positions$def$id, _rotations$def$id, _names$def$id, _shape$align, _BORDER_STYLE_OPTIONS, _BORDER_STYLE_OPTIONS2;
270
- var selectedId = _ref5.selectedId,
271
- positions = _ref5.positions,
272
- setPositions = _ref5.setPositions,
273
- sizes = _ref5.sizes,
274
- setSizes = _ref5.setSizes,
275
- rotations = _ref5.rotations,
276
- setRotations = _ref5.setRotations,
277
- shapes = _ref5.shapes,
278
- setShapes = _ref5.setShapes,
279
- stickyStyle = _ref5.stickyStyle,
280
- setStickyStyle = _ref5.setStickyStyle,
281
- links = _ref5.links,
282
- setLinks = _ref5.setLinks,
283
- files = _ref5.files,
284
- setFiles = _ref5.setFiles,
285
- createdShapes = _ref5.createdShapes,
286
- locks = _ref5.locks,
287
- setLocks = _ref5.setLocks;
320
+ var selectedId = _ref6.selectedId,
321
+ positions = _ref6.positions,
322
+ setPositions = _ref6.setPositions,
323
+ sizes = _ref6.sizes,
324
+ setSizes = _ref6.setSizes,
325
+ rotations = _ref6.rotations,
326
+ setRotations = _ref6.setRotations,
327
+ shapes = _ref6.shapes,
328
+ setShapes = _ref6.setShapes,
329
+ stickyStyle = _ref6.stickyStyle,
330
+ setStickyStyle = _ref6.setStickyStyle,
331
+ links = _ref6.links,
332
+ setLinks = _ref6.setLinks,
333
+ files = _ref6.files,
334
+ setFiles = _ref6.setFiles,
335
+ createdShapes = _ref6.createdShapes,
336
+ projectElements = _ref6.projectElements,
337
+ setProjectElements = _ref6.setProjectElements,
338
+ locks = _ref6.locks,
339
+ setLocks = _ref6.setLocks;
288
340
  var _useState = (0, _react.useState)(_outline.OUTLINE_WIDTH),
289
341
  _useState2 = _slicedToArray(_useState, 2),
290
342
  width = _useState2[0],
@@ -340,6 +392,9 @@ var RightInspector = exports.RightInspector = function RightInspector(_ref5) {
340
392
  var fileDef = selectedId ? files.find(function (file) {
341
393
  return file.id === selectedId;
342
394
  }) : undefined;
395
+ var projectDef = selectedId ? projectElements.find(function (entry) {
396
+ return entry.id === selectedId;
397
+ }) : undefined;
343
398
  var shell = function shell(content) {
344
399
  return /*#__PURE__*/_react.default.createElement(StyledInspectorSidebar, {
345
400
  style: {
@@ -375,11 +430,17 @@ var RightInspector = exports.RightInspector = function RightInspector(_ref5) {
375
430
 
376
431
  /* The Locked checkbox — shown for every element kind, toggling a design lock
377
432
  flag keyed by element id. */
433
+ /* `forced` is the limited-access case: the element is locked FOR THIS VIEWER
434
+ and the checkbox is the honest place to say so — ticked, and disabled so it
435
+ reads as a statement about the element rather than a switch that was left
436
+ on. */
378
437
  var renderLocked = function renderLocked(id) {
379
438
  var _locks$id;
439
+ var forced = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
380
440
  return /*#__PURE__*/_react.default.createElement(StyledCheckboxRow, null, /*#__PURE__*/_react.default.createElement(_Checkbox.Checkbox, {
381
441
  id: "wb-lock-".concat(id),
382
- checked: (_locks$id = locks[id]) !== null && _locks$id !== void 0 ? _locks$id : false,
442
+ checked: forced || ((_locks$id = locks[id]) !== null && _locks$id !== void 0 ? _locks$id : false),
443
+ disabled: forced,
383
444
  onChange: function onChange() {
384
445
  return setLocks(function (current) {
385
446
  var _current$id;
@@ -395,11 +456,15 @@ var RightInspector = exports.RightInspector = function RightInspector(_ref5) {
395
456
  }, "Locked"));
396
457
  };
397
458
 
398
- /* Geometry for a card (link / file): X/Y from the shared positions map, an
399
- editable width and an auto height (cards are content-sized). Cards cannot
400
- be rotated, so there is no Rotation field. */
459
+ /* Geometry for a card (link / file / project / task): X/Y from the shared
460
+ positions map, an editable width and an auto height (cards are
461
+ content-sized). Cards cannot be rotated, so there is no Rotation field.
462
+ `readOnly` keeps the same three values in the same three places and swaps
463
+ the inputs for read-only fields — a limited card's geometry is information,
464
+ not a control. */
401
465
  var renderCardGeometry = function renderCardGeometry(id, cardWidth, onWidth) {
402
466
  var _positions$id;
467
+ var readOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
403
468
  var cardPosition = (_positions$id = positions[id]) !== null && _positions$id !== void 0 ? _positions$id : {
404
469
  x: 0,
405
470
  y: 0
@@ -407,7 +472,10 @@ var RightInspector = exports.RightInspector = function RightInspector(_ref5) {
407
472
  return /*#__PURE__*/_react.default.createElement(StyledPropGroup, null, /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
408
473
  weight: "bold",
409
474
  className: "group-title"
410
- }, "Geometry"), /*#__PURE__*/_react.default.createElement(StyledFieldGrid, null, /*#__PURE__*/_react.default.createElement(NumberField, {
475
+ }, "Geometry"), /*#__PURE__*/_react.default.createElement(StyledFieldGrid, null, readOnly ? /*#__PURE__*/_react.default.createElement(ReadOnlyField, {
476
+ label: "X",
477
+ value: "".concat(cardPosition.x, " px")
478
+ }) : /*#__PURE__*/_react.default.createElement(NumberField, {
411
479
  label: "X",
412
480
  unit: "px",
413
481
  value: cardPosition.x,
@@ -424,7 +492,10 @@ var RightInspector = exports.RightInspector = function RightInspector(_ref5) {
424
492
  });
425
493
  });
426
494
  }
427
- }), /*#__PURE__*/_react.default.createElement(NumberField, {
495
+ }), readOnly ? /*#__PURE__*/_react.default.createElement(ReadOnlyField, {
496
+ label: "Y",
497
+ value: "".concat(cardPosition.y, " px")
498
+ }) : /*#__PURE__*/_react.default.createElement(NumberField, {
428
499
  label: "Y",
429
500
  unit: "px",
430
501
  value: cardPosition.y,
@@ -441,7 +512,10 @@ var RightInspector = exports.RightInspector = function RightInspector(_ref5) {
441
512
  });
442
513
  });
443
514
  }
444
- })), /*#__PURE__*/_react.default.createElement(StyledFieldGrid, null, /*#__PURE__*/_react.default.createElement(NumberField, {
515
+ })), /*#__PURE__*/_react.default.createElement(StyledFieldGrid, null, readOnly ? /*#__PURE__*/_react.default.createElement(ReadOnlyField, {
516
+ label: "Width",
517
+ value: "".concat(cardWidth, " px")
518
+ }) : /*#__PURE__*/_react.default.createElement(NumberField, {
445
519
  label: "Width",
446
520
  unit: "px",
447
521
  value: cardWidth,
@@ -453,13 +527,15 @@ var RightInspector = exports.RightInspector = function RightInspector(_ref5) {
453
527
  };
454
528
 
455
529
  /* Header + panel switch + body, shared by every element kind — only the
456
- groups inside differ. */
530
+ groups inside differ. `renamable` false swaps the live EditableText for
531
+ read-only text, for elements whose name is not the board's to change. */
457
532
  var renderInspectorBody = function renderInspectorBody(icon, headerName, id, groups) {
533
+ var renamable = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
458
534
  return /*#__PURE__*/_react.default.createElement(StyledInspectorBody, null, /*#__PURE__*/_react.default.createElement(StyledInspectorHeader, null, /*#__PURE__*/_react.default.createElement("span", {
459
535
  className: "inspector-type-icon"
460
536
  }, icon), /*#__PURE__*/_react.default.createElement("span", {
461
537
  className: "inspector-name"
462
- }, /*#__PURE__*/_react.default.createElement(_EditableText.EditableText, {
538
+ }, renamable ? /*#__PURE__*/_react.default.createElement(_EditableText.EditableText, {
463
539
  value: headerName,
464
540
  variant: "Header 3",
465
541
  weight: "bold",
@@ -473,7 +549,10 @@ var RightInspector = exports.RightInspector = function RightInspector(_ref5) {
473
549
  inputProps: {
474
550
  maxLength: 120
475
551
  }
476
- }))), /*#__PURE__*/_react.default.createElement(_outline.StyledChooseRow, null, /*#__PURE__*/_react.default.createElement(_outline.StyledPanelChooseSlot, null, /*#__PURE__*/_react.default.createElement(_ChooseV.ChooseV2, {
552
+ }) : /*#__PURE__*/_react.default.createElement(_Typography.Header3, {
553
+ className: "inspector-name-static",
554
+ title: headerName
555
+ }, headerName))), /*#__PURE__*/_react.default.createElement(_outline.StyledChooseRow, null, /*#__PURE__*/_react.default.createElement(_outline.StyledPanelChooseSlot, null, /*#__PURE__*/_react.default.createElement(_ChooseV.ChooseV2, {
477
556
  required: true,
478
557
  options: [{
479
558
  id: "properties",
@@ -490,10 +569,33 @@ var RightInspector = exports.RightInspector = function RightInspector(_ref5) {
490
569
  };
491
570
 
492
571
  /* Nothing selected. */
493
- if (!def && !linkDef && !fileDef) {
572
+ if (!def && !linkDef && !fileDef && !projectDef) {
494
573
  return shell(/*#__PURE__*/_react.default.createElement(StyledInspectorEmpty, null, /*#__PURE__*/_react.default.createElement(_Typography.Body2, null, "Select an element to see its properties.")));
495
574
  }
496
575
 
576
+ /* Project / task card — the most constrained element here. Its look is not
577
+ the board's to change (no Fill, Stroke or Text), and its title belongs to
578
+ the record it shows, so the header is read-only. What is left is what the
579
+ board really does own: where the card sits, how wide it is, and whether it
580
+ is locked. */
581
+ if (projectDef) {
582
+ var limited = projectDef.limited === true;
583
+ var cardTraits = limited ? LIMITED_ELEMENT_TRAITS : PROJECT_ELEMENT_TRAITS;
584
+ return shell(renderInspectorBody(
585
+ /* A limited card gets a NEUTRAL icon. The task and project glyphs would
586
+ each say which kind of record is behind the card, and the kind is
587
+ part of what the viewer is not entitled to. */
588
+ limited ? /*#__PURE__*/_react.default.createElement(_Icons.LockIcon, null) : projectDef.kind === "project" ? /*#__PURE__*/_react.default.createElement(_Icons.ProjectIcon, null) : /*#__PURE__*/_react.default.createElement(_Icons.TaskIcon, null), (0, _projectElements.projectElementTitle)(projectDef), projectDef.id, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(StyledPropGroup, null, renderLocked(projectDef.id, cardTraits.readOnly)), cardTraits.geometry ? renderCardGeometry(projectDef.id, projectDef.width, function (width) {
589
+ return setProjectElements(function (current) {
590
+ return current.map(function (entry) {
591
+ return entry.id === projectDef.id ? _objectSpread(_objectSpread({}, entry), {}, {
592
+ width
593
+ }) : entry;
594
+ });
595
+ });
596
+ }, cardTraits.readOnly) : null), cardTraits.renamable));
597
+ }
598
+
497
599
  /* Link card — its URL plus the shared Locked flag. */
498
600
  if (linkDef) {
499
601
  var _names$linkDef$id, _linkDef$url;