@burdenoff/microfe-planmagnet 2026.1008.2 → 2026.1008.3

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 (1969) hide show
  1. package/dist/_virtual/__vite-browser-external.js +0 -2
  2. package/dist/components/MarkdownEditor.js +0 -2
  3. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +0 -2
  4. package/dist/node_modules/@apollo/client/errors/ServerError.js +0 -2
  5. package/dist/node_modules/@apollo/client/errors/utils.js +0 -2
  6. package/dist/node_modules/clsx/dist/clsx.js +0 -2
  7. package/dist/node_modules/d3-array/src/ascending.js +0 -2
  8. package/dist/node_modules/d3-array/src/bisect.js +0 -2
  9. package/dist/node_modules/d3-array/src/bisector.js +0 -2
  10. package/dist/node_modules/d3-array/src/descending.js +0 -2
  11. package/dist/node_modules/d3-array/src/max.js +0 -2
  12. package/dist/node_modules/d3-array/src/min.js +0 -2
  13. package/dist/node_modules/d3-array/src/number.js +0 -2
  14. package/dist/node_modules/d3-array/src/quantile.js +0 -2
  15. package/dist/node_modules/d3-array/src/quickselect.js +0 -2
  16. package/dist/node_modules/d3-array/src/range.js +0 -2
  17. package/dist/node_modules/d3-array/src/sort.js +0 -2
  18. package/dist/node_modules/d3-array/src/ticks.js +0 -2
  19. package/dist/node_modules/d3-color/src/color.js +0 -2
  20. package/dist/node_modules/d3-color/src/define.js +0 -2
  21. package/dist/node_modules/d3-format/src/defaultLocale.js +0 -2
  22. package/dist/node_modules/d3-format/src/exponent.js +0 -2
  23. package/dist/node_modules/d3-format/src/formatDecimal.js +0 -2
  24. package/dist/node_modules/d3-format/src/formatGroup.js +0 -2
  25. package/dist/node_modules/d3-format/src/formatNumerals.js +0 -2
  26. package/dist/node_modules/d3-format/src/formatPrefixAuto.js +0 -2
  27. package/dist/node_modules/d3-format/src/formatRounded.js +0 -2
  28. package/dist/node_modules/d3-format/src/formatSpecifier.js +0 -2
  29. package/dist/node_modules/d3-format/src/formatTrim.js +0 -2
  30. package/dist/node_modules/d3-format/src/formatTypes.js +0 -2
  31. package/dist/node_modules/d3-format/src/identity.js +0 -2
  32. package/dist/node_modules/d3-format/src/locale.js +0 -2
  33. package/dist/node_modules/d3-format/src/precisionFixed.js +0 -2
  34. package/dist/node_modules/d3-format/src/precisionPrefix.js +0 -2
  35. package/dist/node_modules/d3-format/src/precisionRound.js +0 -2
  36. package/dist/node_modules/d3-interpolate/src/array.js +0 -2
  37. package/dist/node_modules/d3-interpolate/src/basis.js +0 -2
  38. package/dist/node_modules/d3-interpolate/src/basisClosed.js +0 -2
  39. package/dist/node_modules/d3-interpolate/src/color.js +0 -2
  40. package/dist/node_modules/d3-interpolate/src/constant.js +0 -2
  41. package/dist/node_modules/d3-interpolate/src/date.js +0 -2
  42. package/dist/node_modules/d3-interpolate/src/number.js +0 -2
  43. package/dist/node_modules/d3-interpolate/src/numberArray.js +0 -2
  44. package/dist/node_modules/d3-interpolate/src/object.js +0 -2
  45. package/dist/node_modules/d3-interpolate/src/piecewise.js +0 -2
  46. package/dist/node_modules/d3-interpolate/src/rgb.js +0 -2
  47. package/dist/node_modules/d3-interpolate/src/round.js +0 -2
  48. package/dist/node_modules/d3-interpolate/src/string.js +0 -2
  49. package/dist/node_modules/d3-interpolate/src/value.js +0 -2
  50. package/dist/node_modules/d3-path/src/path.js +0 -2
  51. package/dist/node_modules/d3-scale/src/band.js +0 -2
  52. package/dist/node_modules/d3-scale/src/constant.js +0 -2
  53. package/dist/node_modules/d3-scale/src/continuous.js +0 -2
  54. package/dist/node_modules/d3-scale/src/diverging.js +0 -2
  55. package/dist/node_modules/d3-scale/src/identity.js +0 -2
  56. package/dist/node_modules/d3-scale/src/init.js +0 -2
  57. package/dist/node_modules/d3-scale/src/linear.js +0 -2
  58. package/dist/node_modules/d3-scale/src/log.js +0 -2
  59. package/dist/node_modules/d3-scale/src/nice.js +0 -2
  60. package/dist/node_modules/d3-scale/src/number.js +0 -2
  61. package/dist/node_modules/d3-scale/src/ordinal.js +0 -2
  62. package/dist/node_modules/d3-scale/src/pow.js +0 -2
  63. package/dist/node_modules/d3-scale/src/quantile.js +0 -2
  64. package/dist/node_modules/d3-scale/src/quantize.js +0 -2
  65. package/dist/node_modules/d3-scale/src/radial.js +0 -2
  66. package/dist/node_modules/d3-scale/src/sequential.js +0 -2
  67. package/dist/node_modules/d3-scale/src/sequentialQuantile.js +0 -2
  68. package/dist/node_modules/d3-scale/src/symlog.js +0 -2
  69. package/dist/node_modules/d3-scale/src/threshold.js +0 -2
  70. package/dist/node_modules/d3-scale/src/tickFormat.js +0 -2
  71. package/dist/node_modules/d3-scale/src/time.js +0 -2
  72. package/dist/node_modules/d3-scale/src/utcTime.js +0 -2
  73. package/dist/node_modules/d3-shape/src/area.js +0 -2
  74. package/dist/node_modules/d3-shape/src/array.js +0 -2
  75. package/dist/node_modules/d3-shape/src/constant.js +0 -2
  76. package/dist/node_modules/d3-shape/src/curve/basis.js +0 -2
  77. package/dist/node_modules/d3-shape/src/curve/basisClosed.js +0 -2
  78. package/dist/node_modules/d3-shape/src/curve/basisOpen.js +0 -2
  79. package/dist/node_modules/d3-shape/src/curve/bump.js +0 -2
  80. package/dist/node_modules/d3-shape/src/curve/linear.js +0 -2
  81. package/dist/node_modules/d3-shape/src/curve/linearClosed.js +0 -2
  82. package/dist/node_modules/d3-shape/src/curve/monotone.js +0 -2
  83. package/dist/node_modules/d3-shape/src/curve/natural.js +0 -2
  84. package/dist/node_modules/d3-shape/src/curve/step.js +0 -2
  85. package/dist/node_modules/d3-shape/src/line.js +0 -2
  86. package/dist/node_modules/d3-shape/src/math.js +0 -2
  87. package/dist/node_modules/d3-shape/src/noop.js +0 -2
  88. package/dist/node_modules/d3-shape/src/offset/expand.js +0 -2
  89. package/dist/node_modules/d3-shape/src/offset/none.js +0 -2
  90. package/dist/node_modules/d3-shape/src/offset/silhouette.js +0 -2
  91. package/dist/node_modules/d3-shape/src/offset/wiggle.js +0 -2
  92. package/dist/node_modules/d3-shape/src/order/none.js +0 -2
  93. package/dist/node_modules/d3-shape/src/path.js +0 -2
  94. package/dist/node_modules/d3-shape/src/point.js +0 -2
  95. package/dist/node_modules/d3-shape/src/stack.js +0 -2
  96. package/dist/node_modules/d3-shape/src/symbol/circle.js +0 -2
  97. package/dist/node_modules/d3-shape/src/symbol/cross.js +0 -2
  98. package/dist/node_modules/d3-shape/src/symbol/diamond.js +0 -2
  99. package/dist/node_modules/d3-shape/src/symbol/square.js +0 -2
  100. package/dist/node_modules/d3-shape/src/symbol/star.js +0 -2
  101. package/dist/node_modules/d3-shape/src/symbol/triangle.js +0 -2
  102. package/dist/node_modules/d3-shape/src/symbol/wye.js +0 -2
  103. package/dist/node_modules/d3-shape/src/symbol.js +0 -2
  104. package/dist/node_modules/d3-time/src/day.js +0 -2
  105. package/dist/node_modules/d3-time/src/duration.js +0 -2
  106. package/dist/node_modules/d3-time/src/hour.js +0 -2
  107. package/dist/node_modules/d3-time/src/interval.js +0 -2
  108. package/dist/node_modules/d3-time/src/millisecond.js +0 -2
  109. package/dist/node_modules/d3-time/src/minute.js +0 -2
  110. package/dist/node_modules/d3-time/src/month.js +0 -2
  111. package/dist/node_modules/d3-time/src/second.js +0 -2
  112. package/dist/node_modules/d3-time/src/ticks.js +0 -2
  113. package/dist/node_modules/d3-time/src/week.js +0 -2
  114. package/dist/node_modules/d3-time/src/year.js +0 -2
  115. package/dist/node_modules/d3-time-format/src/defaultLocale.js +0 -2
  116. package/dist/node_modules/d3-time-format/src/locale.js +0 -2
  117. package/dist/node_modules/decimal.js-light/decimal.js +0 -2
  118. package/dist/node_modules/eventemitter3/index.js +0 -2
  119. package/dist/node_modules/fast-equals/dist/es/index.js +0 -2
  120. package/dist/node_modules/fflate/esm/browser.js +0 -2
  121. package/dist/node_modules/internmap/src/index.js +0 -2
  122. package/dist/node_modules/jszip/dist/jszip.min.js +0 -2
  123. package/dist/node_modules/lodash/_DataView.js +0 -2
  124. package/dist/node_modules/lodash/_Hash.js +0 -2
  125. package/dist/node_modules/lodash/_ListCache.js +0 -2
  126. package/dist/node_modules/lodash/_Map.js +0 -2
  127. package/dist/node_modules/lodash/_MapCache.js +0 -2
  128. package/dist/node_modules/lodash/_Promise.js +0 -2
  129. package/dist/node_modules/lodash/_Set.js +0 -2
  130. package/dist/node_modules/lodash/_SetCache.js +0 -2
  131. package/dist/node_modules/lodash/_Stack.js +0 -2
  132. package/dist/node_modules/lodash/_Symbol.js +0 -2
  133. package/dist/node_modules/lodash/_Uint8Array.js +0 -2
  134. package/dist/node_modules/lodash/_WeakMap.js +0 -2
  135. package/dist/node_modules/lodash/_apply.js +0 -2
  136. package/dist/node_modules/lodash/_arrayEach.js +0 -2
  137. package/dist/node_modules/lodash/_arrayEvery.js +0 -2
  138. package/dist/node_modules/lodash/_arrayFilter.js +0 -2
  139. package/dist/node_modules/lodash/_arrayIncludes.js +0 -2
  140. package/dist/node_modules/lodash/_arrayIncludesWith.js +0 -2
  141. package/dist/node_modules/lodash/_arrayLikeKeys.js +0 -2
  142. package/dist/node_modules/lodash/_arrayMap.js +0 -2
  143. package/dist/node_modules/lodash/_arrayPush.js +0 -2
  144. package/dist/node_modules/lodash/_arraySome.js +0 -2
  145. package/dist/node_modules/lodash/_asciiToArray.js +0 -2
  146. package/dist/node_modules/lodash/_assignValue.js +0 -2
  147. package/dist/node_modules/lodash/_assocIndexOf.js +0 -2
  148. package/dist/node_modules/lodash/_baseAssign.js +0 -2
  149. package/dist/node_modules/lodash/_baseAssignIn.js +0 -2
  150. package/dist/node_modules/lodash/_baseAssignValue.js +0 -2
  151. package/dist/node_modules/lodash/_baseClone.js +0 -2
  152. package/dist/node_modules/lodash/_baseCreate.js +0 -2
  153. package/dist/node_modules/lodash/_baseEach.js +0 -2
  154. package/dist/node_modules/lodash/_baseEvery.js +0 -2
  155. package/dist/node_modules/lodash/_baseExtremum.js +0 -2
  156. package/dist/node_modules/lodash/_baseFindIndex.js +0 -2
  157. package/dist/node_modules/lodash/_baseFlatten.js +0 -2
  158. package/dist/node_modules/lodash/_baseFor.js +0 -2
  159. package/dist/node_modules/lodash/_baseForOwn.js +0 -2
  160. package/dist/node_modules/lodash/_baseGet.js +0 -2
  161. package/dist/node_modules/lodash/_baseGetAllKeys.js +0 -2
  162. package/dist/node_modules/lodash/_baseGetTag.js +0 -2
  163. package/dist/node_modules/lodash/_baseGt.js +0 -2
  164. package/dist/node_modules/lodash/_baseHasIn.js +0 -2
  165. package/dist/node_modules/lodash/_baseIndexOf.js +0 -2
  166. package/dist/node_modules/lodash/_baseIsArguments.js +0 -2
  167. package/dist/node_modules/lodash/_baseIsEqual.js +0 -2
  168. package/dist/node_modules/lodash/_baseIsEqualDeep.js +0 -2
  169. package/dist/node_modules/lodash/_baseIsMap.js +0 -2
  170. package/dist/node_modules/lodash/_baseIsMatch.js +0 -2
  171. package/dist/node_modules/lodash/_baseIsNaN.js +0 -2
  172. package/dist/node_modules/lodash/_baseIsNative.js +0 -2
  173. package/dist/node_modules/lodash/_baseIsSet.js +0 -2
  174. package/dist/node_modules/lodash/_baseIsTypedArray.js +0 -2
  175. package/dist/node_modules/lodash/_baseIteratee.js +0 -2
  176. package/dist/node_modules/lodash/_baseKeys.js +0 -2
  177. package/dist/node_modules/lodash/_baseKeysIn.js +0 -2
  178. package/dist/node_modules/lodash/_baseLt.js +0 -2
  179. package/dist/node_modules/lodash/_baseMap.js +0 -2
  180. package/dist/node_modules/lodash/_baseMatches.js +0 -2
  181. package/dist/node_modules/lodash/_baseMatchesProperty.js +0 -2
  182. package/dist/node_modules/lodash/_baseOrderBy.js +0 -2
  183. package/dist/node_modules/lodash/_baseProperty.js +0 -2
  184. package/dist/node_modules/lodash/_basePropertyDeep.js +0 -2
  185. package/dist/node_modules/lodash/_baseRange.js +0 -2
  186. package/dist/node_modules/lodash/_baseRest.js +0 -2
  187. package/dist/node_modules/lodash/_baseSetToString.js +0 -2
  188. package/dist/node_modules/lodash/_baseSlice.js +0 -2
  189. package/dist/node_modules/lodash/_baseSome.js +0 -2
  190. package/dist/node_modules/lodash/_baseSortBy.js +0 -2
  191. package/dist/node_modules/lodash/_baseSum.js +0 -2
  192. package/dist/node_modules/lodash/_baseTimes.js +0 -2
  193. package/dist/node_modules/lodash/_baseToString.js +0 -2
  194. package/dist/node_modules/lodash/_baseTrim.js +0 -2
  195. package/dist/node_modules/lodash/_baseUnary.js +0 -2
  196. package/dist/node_modules/lodash/_baseUniq.js +0 -2
  197. package/dist/node_modules/lodash/_baseUnset.js +0 -2
  198. package/dist/node_modules/lodash/_cacheHas.js +0 -2
  199. package/dist/node_modules/lodash/_castPath.js +0 -2
  200. package/dist/node_modules/lodash/_castSlice.js +0 -2
  201. package/dist/node_modules/lodash/_cloneArrayBuffer.js +0 -2
  202. package/dist/node_modules/lodash/_cloneBuffer.js +0 -2
  203. package/dist/node_modules/lodash/_cloneDataView.js +0 -2
  204. package/dist/node_modules/lodash/_cloneRegExp.js +0 -2
  205. package/dist/node_modules/lodash/_cloneSymbol.js +0 -2
  206. package/dist/node_modules/lodash/_cloneTypedArray.js +0 -2
  207. package/dist/node_modules/lodash/_compareAscending.js +0 -2
  208. package/dist/node_modules/lodash/_compareMultiple.js +0 -2
  209. package/dist/node_modules/lodash/_copyArray.js +0 -2
  210. package/dist/node_modules/lodash/_copyObject.js +0 -2
  211. package/dist/node_modules/lodash/_copySymbols.js +0 -2
  212. package/dist/node_modules/lodash/_copySymbolsIn.js +0 -2
  213. package/dist/node_modules/lodash/_coreJsData.js +0 -2
  214. package/dist/node_modules/lodash/_createBaseEach.js +0 -2
  215. package/dist/node_modules/lodash/_createBaseFor.js +0 -2
  216. package/dist/node_modules/lodash/_createCaseFirst.js +0 -2
  217. package/dist/node_modules/lodash/_createFind.js +0 -2
  218. package/dist/node_modules/lodash/_createRange.js +0 -2
  219. package/dist/node_modules/lodash/_createSet.js +0 -2
  220. package/dist/node_modules/lodash/_customOmitClone.js +0 -2
  221. package/dist/node_modules/lodash/_defineProperty.js +0 -2
  222. package/dist/node_modules/lodash/_equalArrays.js +0 -2
  223. package/dist/node_modules/lodash/_equalByTag.js +0 -2
  224. package/dist/node_modules/lodash/_equalObjects.js +0 -2
  225. package/dist/node_modules/lodash/_flatRest.js +0 -2
  226. package/dist/node_modules/lodash/_freeGlobal.js +0 -2
  227. package/dist/node_modules/lodash/_getAllKeys.js +0 -2
  228. package/dist/node_modules/lodash/_getAllKeysIn.js +0 -2
  229. package/dist/node_modules/lodash/_getMapData.js +0 -2
  230. package/dist/node_modules/lodash/_getMatchData.js +0 -2
  231. package/dist/node_modules/lodash/_getNative.js +0 -2
  232. package/dist/node_modules/lodash/_getPrototype.js +0 -2
  233. package/dist/node_modules/lodash/_getRawTag.js +0 -2
  234. package/dist/node_modules/lodash/_getSymbols.js +0 -2
  235. package/dist/node_modules/lodash/_getSymbolsIn.js +0 -2
  236. package/dist/node_modules/lodash/_getTag.js +0 -2
  237. package/dist/node_modules/lodash/_getValue.js +0 -2
  238. package/dist/node_modules/lodash/_hasPath.js +0 -2
  239. package/dist/node_modules/lodash/_hasUnicode.js +0 -2
  240. package/dist/node_modules/lodash/_hashClear.js +0 -2
  241. package/dist/node_modules/lodash/_hashDelete.js +0 -2
  242. package/dist/node_modules/lodash/_hashGet.js +0 -2
  243. package/dist/node_modules/lodash/_hashHas.js +0 -2
  244. package/dist/node_modules/lodash/_hashSet.js +0 -2
  245. package/dist/node_modules/lodash/_initCloneArray.js +0 -2
  246. package/dist/node_modules/lodash/_initCloneByTag.js +0 -2
  247. package/dist/node_modules/lodash/_initCloneObject.js +0 -2
  248. package/dist/node_modules/lodash/_isFlattenable.js +0 -2
  249. package/dist/node_modules/lodash/_isIndex.js +0 -2
  250. package/dist/node_modules/lodash/_isIterateeCall.js +0 -2
  251. package/dist/node_modules/lodash/_isKey.js +0 -2
  252. package/dist/node_modules/lodash/_isKeyable.js +0 -2
  253. package/dist/node_modules/lodash/_isMasked.js +0 -2
  254. package/dist/node_modules/lodash/_isPrototype.js +0 -2
  255. package/dist/node_modules/lodash/_isStrictComparable.js +0 -2
  256. package/dist/node_modules/lodash/_listCacheClear.js +0 -2
  257. package/dist/node_modules/lodash/_listCacheDelete.js +0 -2
  258. package/dist/node_modules/lodash/_listCacheGet.js +0 -2
  259. package/dist/node_modules/lodash/_listCacheHas.js +0 -2
  260. package/dist/node_modules/lodash/_listCacheSet.js +0 -2
  261. package/dist/node_modules/lodash/_mapCacheClear.js +0 -2
  262. package/dist/node_modules/lodash/_mapCacheDelete.js +0 -2
  263. package/dist/node_modules/lodash/_mapCacheGet.js +0 -2
  264. package/dist/node_modules/lodash/_mapCacheHas.js +0 -2
  265. package/dist/node_modules/lodash/_mapCacheSet.js +0 -2
  266. package/dist/node_modules/lodash/_mapToArray.js +0 -2
  267. package/dist/node_modules/lodash/_matchesStrictComparable.js +0 -2
  268. package/dist/node_modules/lodash/_memoizeCapped.js +0 -2
  269. package/dist/node_modules/lodash/_nativeCreate.js +0 -2
  270. package/dist/node_modules/lodash/_nativeKeys.js +0 -2
  271. package/dist/node_modules/lodash/_nativeKeysIn.js +0 -2
  272. package/dist/node_modules/lodash/_nodeUtil.js +0 -2
  273. package/dist/node_modules/lodash/_objectToString.js +0 -2
  274. package/dist/node_modules/lodash/_overArg.js +0 -2
  275. package/dist/node_modules/lodash/_overRest.js +0 -2
  276. package/dist/node_modules/lodash/_parent.js +0 -2
  277. package/dist/node_modules/lodash/_root.js +0 -2
  278. package/dist/node_modules/lodash/_setCacheAdd.js +0 -2
  279. package/dist/node_modules/lodash/_setCacheHas.js +0 -2
  280. package/dist/node_modules/lodash/_setToArray.js +0 -2
  281. package/dist/node_modules/lodash/_setToString.js +0 -2
  282. package/dist/node_modules/lodash/_shortOut.js +0 -2
  283. package/dist/node_modules/lodash/_stackClear.js +0 -2
  284. package/dist/node_modules/lodash/_stackDelete.js +0 -2
  285. package/dist/node_modules/lodash/_stackGet.js +0 -2
  286. package/dist/node_modules/lodash/_stackHas.js +0 -2
  287. package/dist/node_modules/lodash/_stackSet.js +0 -2
  288. package/dist/node_modules/lodash/_strictIndexOf.js +0 -2
  289. package/dist/node_modules/lodash/_stringToArray.js +0 -2
  290. package/dist/node_modules/lodash/_stringToPath.js +0 -2
  291. package/dist/node_modules/lodash/_toKey.js +0 -2
  292. package/dist/node_modules/lodash/_toSource.js +0 -2
  293. package/dist/node_modules/lodash/_trimmedEndIndex.js +0 -2
  294. package/dist/node_modules/lodash/_unicodeToArray.js +0 -2
  295. package/dist/node_modules/lodash/constant.js +0 -2
  296. package/dist/node_modules/lodash/debounce.js +0 -2
  297. package/dist/node_modules/lodash/eq.js +0 -2
  298. package/dist/node_modules/lodash/every.js +0 -2
  299. package/dist/node_modules/lodash/find.js +0 -2
  300. package/dist/node_modules/lodash/findIndex.js +0 -2
  301. package/dist/node_modules/lodash/flatMap.js +0 -2
  302. package/dist/node_modules/lodash/flatten.js +0 -2
  303. package/dist/node_modules/lodash/get.js +0 -2
  304. package/dist/node_modules/lodash/hasIn.js +0 -2
  305. package/dist/node_modules/lodash/identity.js +0 -2
  306. package/dist/node_modules/lodash/isArguments.js +0 -2
  307. package/dist/node_modules/lodash/isArray.js +0 -2
  308. package/dist/node_modules/lodash/isArrayLike.js +0 -2
  309. package/dist/node_modules/lodash/isBoolean.js +0 -2
  310. package/dist/node_modules/lodash/isBuffer.js +0 -2
  311. package/dist/node_modules/lodash/isEqual.js +0 -2
  312. package/dist/node_modules/lodash/isFunction.js +0 -2
  313. package/dist/node_modules/lodash/isLength.js +0 -2
  314. package/dist/node_modules/lodash/isMap.js +0 -2
  315. package/dist/node_modules/lodash/isNaN.js +0 -2
  316. package/dist/node_modules/lodash/isNil.js +0 -2
  317. package/dist/node_modules/lodash/isNumber.js +0 -2
  318. package/dist/node_modules/lodash/isObject.js +0 -2
  319. package/dist/node_modules/lodash/isObjectLike.js +0 -2
  320. package/dist/node_modules/lodash/isPlainObject.js +0 -2
  321. package/dist/node_modules/lodash/isSet.js +0 -2
  322. package/dist/node_modules/lodash/isString.js +0 -2
  323. package/dist/node_modules/lodash/isSymbol.js +0 -2
  324. package/dist/node_modules/lodash/isTypedArray.js +0 -2
  325. package/dist/node_modules/lodash/keys.js +0 -2
  326. package/dist/node_modules/lodash/keysIn.js +0 -2
  327. package/dist/node_modules/lodash/last.js +0 -2
  328. package/dist/node_modules/lodash/map.js +0 -2
  329. package/dist/node_modules/lodash/mapValues.js +0 -2
  330. package/dist/node_modules/lodash/max.js +0 -2
  331. package/dist/node_modules/lodash/maxBy.js +0 -2
  332. package/dist/node_modules/lodash/memoize.js +0 -2
  333. package/dist/node_modules/lodash/min.js +0 -2
  334. package/dist/node_modules/lodash/noop.js +0 -2
  335. package/dist/node_modules/lodash/now.js +0 -2
  336. package/dist/node_modules/lodash/omit.js +0 -2
  337. package/dist/node_modules/lodash/property.js +0 -2
  338. package/dist/node_modules/lodash/range.js +0 -2
  339. package/dist/node_modules/lodash/some.js +0 -2
  340. package/dist/node_modules/lodash/sortBy.js +0 -2
  341. package/dist/node_modules/lodash/stubArray.js +0 -2
  342. package/dist/node_modules/lodash/stubFalse.js +0 -2
  343. package/dist/node_modules/lodash/sumBy.js +0 -2
  344. package/dist/node_modules/lodash/throttle.js +0 -2
  345. package/dist/node_modules/lodash/toFinite.js +0 -2
  346. package/dist/node_modules/lodash/toInteger.js +0 -2
  347. package/dist/node_modules/lodash/toNumber.js +0 -2
  348. package/dist/node_modules/lodash/toString.js +0 -2
  349. package/dist/node_modules/lodash/uniqBy.js +0 -2
  350. package/dist/node_modules/lodash/upperFirst.js +0 -2
  351. package/dist/node_modules/object-assign/index.js +0 -2
  352. package/dist/node_modules/pptxgenjs/dist/pptxgen.es.js +0 -2
  353. package/dist/node_modules/prop-types/checkPropTypes.js +0 -2
  354. package/dist/node_modules/prop-types/factoryWithThrowingShims.js +0 -2
  355. package/dist/node_modules/prop-types/factoryWithTypeCheckers.js +0 -2
  356. package/dist/node_modules/prop-types/index.js +0 -2
  357. package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js +0 -2
  358. package/dist/node_modules/prop-types/lib/has.js +0 -2
  359. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js +0 -2
  360. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js +0 -2
  361. package/dist/node_modules/prop-types/node_modules/react-is/index.js +0 -2
  362. package/dist/node_modules/react-is/cjs/react-is.development.js +0 -2
  363. package/dist/node_modules/react-is/cjs/react-is.production.min.js +0 -2
  364. package/dist/node_modules/react-is/index.js +0 -2
  365. package/dist/node_modules/react-smooth/es6/Animate.js +0 -2
  366. package/dist/node_modules/react-smooth/es6/AnimateManager.js +0 -2
  367. package/dist/node_modules/react-smooth/es6/configUpdate.js +0 -2
  368. package/dist/node_modules/react-smooth/es6/easing.js +0 -2
  369. package/dist/node_modules/react-smooth/es6/index.js +0 -2
  370. package/dist/node_modules/react-smooth/es6/setRafTimeout.js +0 -2
  371. package/dist/node_modules/react-smooth/es6/util.js +0 -2
  372. package/dist/node_modules/recharts/es6/cartesian/Area.js +0 -2
  373. package/dist/node_modules/recharts/es6/cartesian/Bar.js +0 -2
  374. package/dist/node_modules/recharts/es6/cartesian/Brush.js +0 -2
  375. package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js +0 -2
  376. package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js +0 -2
  377. package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js +0 -2
  378. package/dist/node_modules/recharts/es6/cartesian/Line.js +0 -2
  379. package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js +0 -2
  380. package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js +0 -2
  381. package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js +0 -2
  382. package/dist/node_modules/recharts/es6/cartesian/XAxis.js +0 -2
  383. package/dist/node_modules/recharts/es6/cartesian/YAxis.js +0 -2
  384. package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js +0 -2
  385. package/dist/node_modules/recharts/es6/cartesian/getTicks.js +0 -2
  386. package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js +0 -2
  387. package/dist/node_modules/recharts/es6/chart/AreaChart.js +0 -2
  388. package/dist/node_modules/recharts/es6/chart/BarChart.js +0 -2
  389. package/dist/node_modules/recharts/es6/chart/LineChart.js +0 -2
  390. package/dist/node_modules/recharts/es6/chart/Sankey.js +0 -2
  391. package/dist/node_modules/recharts/es6/chart/Treemap.js +0 -2
  392. package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js +0 -2
  393. package/dist/node_modules/recharts/es6/component/Cell.js +0 -2
  394. package/dist/node_modules/recharts/es6/component/Cursor.js +0 -2
  395. package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js +0 -2
  396. package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js +0 -2
  397. package/dist/node_modules/recharts/es6/component/Label.js +0 -2
  398. package/dist/node_modules/recharts/es6/component/LabelList.js +0 -2
  399. package/dist/node_modules/recharts/es6/component/Legend.js +0 -2
  400. package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js +0 -2
  401. package/dist/node_modules/recharts/es6/component/Text.js +0 -2
  402. package/dist/node_modules/recharts/es6/component/Tooltip.js +0 -2
  403. package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js +0 -2
  404. package/dist/node_modules/recharts/es6/container/Layer.js +0 -2
  405. package/dist/node_modules/recharts/es6/container/Surface.js +0 -2
  406. package/dist/node_modules/recharts/es6/context/chartLayoutContext.js +0 -2
  407. package/dist/node_modules/recharts/es6/shape/Cross.js +0 -2
  408. package/dist/node_modules/recharts/es6/shape/Curve.js +0 -2
  409. package/dist/node_modules/recharts/es6/shape/Dot.js +0 -2
  410. package/dist/node_modules/recharts/es6/shape/Polygon.js +0 -2
  411. package/dist/node_modules/recharts/es6/shape/Rectangle.js +0 -2
  412. package/dist/node_modules/recharts/es6/shape/Sector.js +0 -2
  413. package/dist/node_modules/recharts/es6/shape/Symbols.js +0 -2
  414. package/dist/node_modules/recharts/es6/shape/Trapezoid.js +0 -2
  415. package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js +0 -2
  416. package/dist/node_modules/recharts/es6/util/BarUtils.js +0 -2
  417. package/dist/node_modules/recharts/es6/util/CartesianUtils.js +0 -2
  418. package/dist/node_modules/recharts/es6/util/ChartUtils.js +0 -2
  419. package/dist/node_modules/recharts/es6/util/Constants.js +0 -2
  420. package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js +0 -2
  421. package/dist/node_modules/recharts/es6/util/DOMUtils.js +0 -2
  422. package/dist/node_modules/recharts/es6/util/DataUtils.js +0 -2
  423. package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js +0 -2
  424. package/dist/node_modules/recharts/es6/util/Events.js +0 -2
  425. package/dist/node_modules/recharts/es6/util/Global.js +0 -2
  426. package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js +0 -2
  427. package/dist/node_modules/recharts/es6/util/LogUtils.js +0 -2
  428. package/dist/node_modules/recharts/es6/util/PolarUtils.js +0 -2
  429. package/dist/node_modules/recharts/es6/util/ReactUtils.js +0 -2
  430. package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js +0 -2
  431. package/dist/node_modules/recharts/es6/util/ShallowEqual.js +0 -2
  432. package/dist/node_modules/recharts/es6/util/TickUtils.js +0 -2
  433. package/dist/node_modules/recharts/es6/util/calculateViewBox.js +0 -2
  434. package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js +0 -2
  435. package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js +0 -2
  436. package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js +0 -2
  437. package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js +0 -2
  438. package/dist/node_modules/recharts/es6/util/getLegendProps.js +0 -2
  439. package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js +0 -2
  440. package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js +0 -2
  441. package/dist/node_modules/recharts/es6/util/tooltip/translate.js +0 -2
  442. package/dist/node_modules/recharts/es6/util/types.js +0 -2
  443. package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js +0 -2
  444. package/dist/node_modules/recharts-scale/es6/util/arithmetic.js +0 -2
  445. package/dist/node_modules/recharts-scale/es6/util/utils.js +0 -2
  446. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +0 -2
  447. package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js +0 -2
  448. package/dist/node_modules/victory-vendor/es/d3-scale.js +0 -2
  449. package/dist/node_modules/write-excel-file/modules/export/convertFileContentToUint8ArrayBrowser.js +0 -2
  450. package/dist/node_modules/write-excel-file/modules/export/convertFilesContentToUint8Arrays.js +0 -2
  451. package/dist/node_modules/write-excel-file/modules/export/downloadBlob.js +0 -2
  452. package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileBrowser.js +0 -2
  453. package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileUniversal.js +0 -2
  454. package/dist/node_modules/write-excel-file/modules/getSheetData/getSheetData.js +0 -2
  455. package/dist/node_modules/write-excel-file/modules/xlsx/features/conditionalFormatting.js +0 -2
  456. package/dist/node_modules/write-excel-file/modules/xlsx/features/images.js +0 -2
  457. package/dist/node_modules/write-excel-file/modules/xlsx/features/stickyRowsOrColumns.js +0 -2
  458. package/dist/node_modules/write-excel-file/modules/xlsx/files/_Content_Types_.xml.js +0 -2
  459. package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.js +0 -2
  460. package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.rels.js +0 -2
  461. package/dist/node_modules/write-excel-file/modules/xlsx/files/rels.js +0 -2
  462. package/dist/node_modules/write-excel-file/modules/xlsx/files/sharedStrings.xml.js +0 -2
  463. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/cell.js +0 -2
  464. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/column.js +0 -2
  465. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/columns.js +0 -2
  466. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/drawingReference.js +0 -2
  467. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/helpers/getCellStyleProperties.js +0 -2
  468. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/mergedCellsDescription.js +0 -2
  469. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageMargins.js +0 -2
  470. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageSetup.js +0 -2
  471. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/processMergedCells.js +0 -2
  472. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/row.js +0 -2
  473. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheet.xml.js +0 -2
  474. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetData.js +0 -2
  475. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetViews.js +0 -2
  476. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml.rels.js +0 -2
  477. package/dist/node_modules/write-excel-file/modules/xlsx/files/styles.xml.js +0 -2
  478. package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.js +0 -2
  479. package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.rels.js +0 -2
  480. package/dist/node_modules/write-excel-file/modules/xlsx/generateXlsxFileContents.js +0 -2
  481. package/dist/node_modules/write-excel-file/modules/xlsx/getFeatures.js +0 -2
  482. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/convertDateToSerialNumber.js +0 -2
  483. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getAdditionalContent.js +0 -2
  484. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getElementXml.js +0 -2
  485. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getWrittenFiles.js +0 -2
  486. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/transformContent.js +0 -2
  487. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getAlignmentXml.js +0 -2
  488. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getBorderXml.js +0 -2
  489. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getCellAddress.js +0 -2
  490. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFileExtensionForContentType.js +0 -2
  491. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFillXml.js +0 -2
  492. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFontXml.js +0 -2
  493. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getOrderOfSiblings.js +0 -2
  494. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getXlsxColorForHexColor.js +0 -2
  495. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasAlignment.js +0 -2
  496. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasBorder.js +0 -2
  497. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFill.js +0 -2
  498. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFont.js +0 -2
  499. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isCellObject.js +0 -2
  500. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isObject.js +0 -2
  501. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/orderOfSiblings.js +0 -2
  502. package/dist/node_modules/write-excel-file/modules/xlsx/initializeSharedStrings.js +0 -2
  503. package/dist/node_modules/write-excel-file/modules/xlsx/initializeSheets.js +0 -2
  504. package/dist/node_modules/write-excel-file/modules/xlsx/initializeStyles.js +0 -2
  505. package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetData.js +0 -2
  506. package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetName.js +0 -2
  507. package/dist/node_modules/write-excel-file/modules/xml/appendMarkupInsideElement.js +0 -2
  508. package/dist/node_modules/write-excel-file/modules/xml/applyEnclosingElementOffset.js +0 -2
  509. package/dist/node_modules/write-excel-file/modules/xml/escapeXmlSpecialCharacters.js +0 -2
  510. package/dist/node_modules/write-excel-file/modules/xml/findElement.js +0 -2
  511. package/dist/node_modules/write-excel-file/modules/xml/findElementInsideElement.js +0 -2
  512. package/dist/node_modules/write-excel-file/modules/xml/findElementsNonRecursive_.js +0 -2
  513. package/dist/node_modules/write-excel-file/modules/xml/getAttributesString.js +0 -2
  514. package/dist/node_modules/write-excel-file/modules/xml/getChildElements.js +0 -2
  515. package/dist/node_modules/write-excel-file/modules/xml/getClosingTagMarkup.js +0 -2
  516. package/dist/node_modules/write-excel-file/modules/xml/getMarkupInsideElement.js +0 -2
  517. package/dist/node_modules/write-excel-file/modules/xml/getOpeningTagMarkup.js +0 -2
  518. package/dist/node_modules/write-excel-file/modules/xml/getSelfClosingTagMarkup.js +0 -2
  519. package/dist/node_modules/write-excel-file/modules/xml/insertElementMarkupAccordingToOrderOfSiblings.js +0 -2
  520. package/dist/node_modules/write-excel-file/modules/xml/prependMarkupInsideElement.js +0 -2
  521. package/dist/node_modules/write-excel-file/modules/xml/removeInvalidXmlCharacters.js +0 -2
  522. package/dist/node_modules/write-excel-file/modules/xml/replaceElement.js +0 -2
  523. package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeName.js +0 -2
  524. package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeValue.js +0 -2
  525. package/dist/node_modules/write-excel-file/modules/xml/sanitizeTextContent.js +0 -2
  526. package/dist/node_modules/write-excel-file/modules/xml/setMarkupInsideElement.js +0 -2
  527. package/dist/node_modules/write-excel-file/modules/zip/zipToArrayBuffer.js +0 -2
  528. package/dist/planmagnet/PlanMagnetRoot.js +0 -2
  529. package/dist/planmagnet/PlanMagnetRoutes.js +0 -2
  530. package/dist/planmagnet/activity/activityDescribe.js +0 -2
  531. package/dist/planmagnet/activity/relativeTime.js +0 -2
  532. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +0 -2
  533. package/dist/planmagnet/automation/AutomationExecutionsPanel.js +0 -2
  534. package/dist/planmagnet/automation/AutomationRuleFields.js +0 -2
  535. package/dist/planmagnet/automation/automationRuleTypes.js +0 -2
  536. package/dist/planmagnet/board/BoardViewBar.js +0 -2
  537. package/dist/planmagnet/board/BulkActions.js +0 -2
  538. package/dist/planmagnet/board/ProjectBoard.js +0 -2
  539. package/dist/planmagnet/board/boardViewConfig.js +0 -2
  540. package/dist/planmagnet/budgets/BudgetControls.js +0 -2
  541. package/dist/planmagnet/budgets/ExpenseControls.js +0 -2
  542. package/dist/planmagnet/budgets/ProjectBudgetsSummary.js +0 -2
  543. package/dist/planmagnet/budgets/budgetMath.js +0 -2
  544. package/dist/planmagnet/comments/CommentAttachmentUpload.js +0 -2
  545. package/dist/planmagnet/comments/CommentAttachments.js +0 -2
  546. package/dist/planmagnet/comments/CommentBody.js +0 -2
  547. package/dist/planmagnet/comments/CommentThread.js +0 -2
  548. package/dist/planmagnet/comments/MentionComposer.js +0 -2
  549. package/dist/planmagnet/comments/RoadmapComments.js +0 -2
  550. package/dist/planmagnet/comments/TargetComments.js +0 -2
  551. package/dist/planmagnet/comments/WorkItemActivity.js +0 -2
  552. package/dist/planmagnet/comments/WorkItemComments.js +0 -2
  553. package/dist/planmagnet/comments/commentAttachmentUploadClient.js +0 -2
  554. package/dist/planmagnet/comments/commentImageTokens.js +0 -2
  555. package/dist/planmagnet/comments/commentTokens.js +0 -2
  556. package/dist/planmagnet/comments/fileDisplay.js +0 -2
  557. package/dist/planmagnet/comments/useCommentFileUrl.js +0 -2
  558. package/dist/planmagnet/controls/AutomationRuleControls.js +0 -2
  559. package/dist/planmagnet/controls/CompetitorControls.js +0 -2
  560. package/dist/planmagnet/controls/ConfirmButton.js +0 -2
  561. package/dist/planmagnet/controls/CustomFieldControls.js +0 -2
  562. package/dist/planmagnet/controls/CustomFieldValuesPanel.js +0 -2
  563. package/dist/planmagnet/controls/FeatureControls.js +0 -2
  564. package/dist/planmagnet/controls/FeatureTriage.js +0 -2
  565. package/dist/planmagnet/controls/FeedbackControls.js +0 -2
  566. package/dist/planmagnet/controls/LiveStatus.js +0 -2
  567. package/dist/planmagnet/controls/MilestoneControls.js +0 -2
  568. package/dist/planmagnet/controls/ObjectiveControls.js +0 -2
  569. package/dist/planmagnet/controls/Pickers.js +0 -2
  570. package/dist/planmagnet/controls/PortfolioControls.js +0 -2
  571. package/dist/planmagnet/controls/PrioritizationControls.js +0 -2
  572. package/dist/planmagnet/controls/ProgramControls.js +0 -2
  573. package/dist/planmagnet/controls/ProjectControls.js +0 -2
  574. package/dist/planmagnet/controls/QualityGateControls.js +0 -2
  575. package/dist/planmagnet/controls/ReleaseControls.js +0 -2
  576. package/dist/planmagnet/controls/RiskControls.js +0 -2
  577. package/dist/planmagnet/controls/SyncControls.js +0 -2
  578. package/dist/planmagnet/controls/TemplateControls.js +0 -2
  579. package/dist/planmagnet/controls/WebhookSubscriptionControls.js +0 -2
  580. package/dist/planmagnet/controls/WorkItemControls.js +0 -2
  581. package/dist/planmagnet/create/CreateDialogs.js +0 -2
  582. package/dist/planmagnet/dashboards/DashboardUI.js +0 -2
  583. package/dist/planmagnet/dashboards/cards/DeliveryTimelineCard.js +0 -2
  584. package/dist/planmagnet/dashboards/cards/ObjectivesProgressCard.js +0 -2
  585. package/dist/planmagnet/dashboards/cards/PortfolioHealthCard.js +0 -2
  586. package/dist/planmagnet/dashboards/cards/QualityMetricsCard.js +0 -2
  587. package/dist/planmagnet/dashboards/cards/RiskSeverityCard.js +0 -2
  588. package/dist/planmagnet/dashboards/cards/RoadmapHorizonCard.js +0 -2
  589. package/dist/planmagnet/dashboards/cards/SprintCapacityCard.js +0 -2
  590. package/dist/planmagnet/dashboards/cards/TaskCompletionCard.js +0 -2
  591. package/dist/planmagnet/dashboards/cards/TeamCapacityCard.js +0 -2
  592. package/dist/planmagnet/dashboards/cards/TeamOverviewCard.js +0 -2
  593. package/dist/planmagnet/dashboards/cards/TeamWorkloadCard.js +0 -2
  594. package/dist/planmagnet/dashboards/cards/TimeLoggedCard.js +0 -2
  595. package/dist/planmagnet/dependency/DependencyGraph.js +0 -2
  596. package/dist/planmagnet/dependency/DependencyPanel.js +0 -2
  597. package/dist/planmagnet/dependency/GanttChart.js +0 -2
  598. package/dist/planmagnet/dependency/useProjectWorkItemsGraph.js +0 -2
  599. package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js +0 -2
  600. package/dist/planmagnet/docs/DocDiffView.js +0 -2
  601. package/dist/planmagnet/docs/DocStatusBadge.js +0 -2
  602. package/dist/planmagnet/docs/DocSuggestionsPanel.js +0 -2
  603. package/dist/planmagnet/docs/DocVersionCompare.js +0 -2
  604. package/dist/planmagnet/export/ExportWorkItemsButton.js +0 -2
  605. package/dist/planmagnet/export/workItemsCsv.js +0 -2
  606. package/dist/planmagnet/forecast/DeliveryForecastCard.js +0 -2
  607. package/dist/planmagnet/forecast/ProjectOutlookCard.js +0 -2
  608. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +0 -2
  609. package/dist/planmagnet/forecast/ResourceForecastCard.js +0 -2
  610. package/dist/planmagnet/forecast/riskFlags.js +0 -2
  611. package/dist/planmagnet/hooks/useCounts.js +0 -2
  612. package/dist/planmagnet/hooks/useEntityId.js +0 -2
  613. package/dist/planmagnet/hooks/useLiveRefresh.js +0 -2
  614. package/dist/planmagnet/hooks/usePresence.js +0 -2
  615. package/dist/planmagnet/hooks/useProjectWorkflow.js +0 -2
  616. package/dist/planmagnet/import/exportColumns.js +0 -2
  617. package/dist/planmagnet/integrations/routes.js +0 -2
  618. package/dist/planmagnet/integrations/syncTypes.js +0 -2
  619. package/dist/planmagnet/integrations/useSyncProviderCapabilities.js +0 -2
  620. package/dist/planmagnet/links/CodeLinksPanel.js +0 -2
  621. package/dist/planmagnet/links/IssueLinksPanel.js +0 -2
  622. package/dist/planmagnet/meetings/MeetingActionItemsPanel.js +0 -2
  623. package/dist/planmagnet/meetings/MeetingsCard.js +0 -2
  624. package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js +0 -2
  625. package/dist/planmagnet/meetings/ScheduleMeetingDialog.js +0 -2
  626. package/dist/planmagnet/meetings/UnlinkMeetingDialog.js +0 -2
  627. package/dist/planmagnet/meetings/meetingActions.js +0 -2
  628. package/dist/planmagnet/meetings/meetingGraphql.js +0 -2
  629. package/dist/planmagnet/meetings/meetingModel.js +0 -2
  630. package/dist/planmagnet/milestones/MilestoneControls.js +0 -2
  631. package/dist/planmagnet/pages/ActivityActivityPagePage.js +0 -2
  632. package/dist/planmagnet/pages/AiActivityPagePage.js +0 -2
  633. package/dist/planmagnet/pages/AiPlanPagePage.js +0 -2
  634. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +0 -2
  635. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +0 -2
  636. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js +0 -2
  637. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +0 -2
  638. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js +0 -2
  639. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js +0 -2
  640. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js +0 -2
  641. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js +0 -2
  642. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +0 -2
  643. package/dist/planmagnet/pages/DashboardsExecutivePagePage.js +0 -2
  644. package/dist/planmagnet/pages/DashboardsLeadershipPagePage.js +0 -2
  645. package/dist/planmagnet/pages/DashboardsProjectManagerPagePage.js +0 -2
  646. package/dist/planmagnet/pages/DashboardsTeamUtilizationPagePage.js +0 -2
  647. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +0 -2
  648. package/dist/planmagnet/pages/DocsDocsPagePage.js +0 -2
  649. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js +0 -2
  650. package/dist/planmagnet/pages/GoalsGoalsPagePage.js +0 -2
  651. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +0 -2
  652. package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js +0 -2
  653. package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.js +0 -2
  654. package/dist/planmagnet/pages/IntegrationsSyncsPagePage.js +0 -2
  655. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.js +0 -2
  656. package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js +0 -2
  657. package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js +0 -2
  658. package/dist/planmagnet/pages/NotFoundPage.js +0 -2
  659. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js +0 -2
  660. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js +0 -2
  661. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +0 -2
  662. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js +0 -2
  663. package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +0 -2
  664. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +0 -2
  665. package/dist/planmagnet/pages/ProductsCustomerSatisfactionPagePage.js +0 -2
  666. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +0 -2
  667. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +0 -2
  668. package/dist/planmagnet/pages/ProductsEditRoadmapPagePage.js +0 -2
  669. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +0 -2
  670. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +0 -2
  671. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +0 -2
  672. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +0 -2
  673. package/dist/planmagnet/pages/ProductsPrioritizationPagePage.js +0 -2
  674. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +0 -2
  675. package/dist/planmagnet/pages/ProductsProductFeatureDetailPagePage.js +0 -2
  676. package/dist/planmagnet/pages/ProductsProductHierarchyPagePage.js +0 -2
  677. package/dist/planmagnet/pages/ProductsProductLinesPagePage.js +0 -2
  678. package/dist/planmagnet/pages/ProductsProductsPagePage.js +0 -2
  679. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +0 -2
  680. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +0 -2
  681. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +0 -2
  682. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +0 -2
  683. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +0 -2
  684. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js +0 -2
  685. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js +0 -2
  686. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js +0 -2
  687. package/dist/planmagnet/pages/ProgramsProgramsPagePage.js +0 -2
  688. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +0 -2
  689. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +0 -2
  690. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js +0 -2
  691. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js +0 -2
  692. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +0 -2
  693. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js +0 -2
  694. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js +0 -2
  695. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +0 -2
  696. package/dist/planmagnet/pages/ProjectsGanttPagePage.js +0 -2
  697. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +0 -2
  698. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +0 -2
  699. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +0 -2
  700. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +0 -2
  701. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +0 -2
  702. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +0 -2
  703. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +0 -2
  704. package/dist/planmagnet/pages/ProjectsQualityGatesPagePage.js +0 -2
  705. package/dist/planmagnet/pages/ProjectsWorkflowPagePage.js +0 -2
  706. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js +0 -2
  707. package/dist/planmagnet/pages/ReportsEditReportPagePage.js +0 -2
  708. package/dist/planmagnet/pages/ReportsReportPagePage.js +0 -2
  709. package/dist/planmagnet/pages/ReportsReportsPagePage.js +0 -2
  710. package/dist/planmagnet/pages/RisksRiskDetailPagePage.js +0 -2
  711. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js +0 -2
  712. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +0 -2
  713. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +0 -2
  714. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +0 -2
  715. package/dist/planmagnet/pages/TasksImportPagePage.js +0 -2
  716. package/dist/planmagnet/pages/TasksMyDashboardPagePage.js +0 -2
  717. package/dist/planmagnet/pages/TasksMyWorkPagePage.js +0 -2
  718. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +0 -2
  719. package/dist/planmagnet/pages/TasksTasksPagePage.js +0 -2
  720. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js +0 -2
  721. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js +0 -2
  722. package/dist/planmagnet/pages/TasksTimesheetsPagePage.js +0 -2
  723. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js +0 -2
  724. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +0 -2
  725. package/dist/planmagnet/pages/TeamTeamDetailPagePage.js +0 -2
  726. package/dist/planmagnet/pages/TeamTeamEditPagePage.js +0 -2
  727. package/dist/planmagnet/pages/TeamTeamPagePage.js +0 -2
  728. package/dist/planmagnet/pages/TeamTeamsListPagePage.js +0 -2
  729. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js +0 -2
  730. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js +0 -2
  731. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +0 -2
  732. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +0 -2
  733. package/dist/planmagnet/pages/analytics/DeliveryKpisCard.js +0 -2
  734. package/dist/planmagnet/pages/analytics/MetricsCard.js +0 -2
  735. package/dist/planmagnet/pages/analytics/QualityMetricsCard.js +0 -2
  736. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +0 -2
  737. package/dist/planmagnet/pages/analytics/StatusFlowCard.js +0 -2
  738. package/dist/planmagnet/pages/analytics/ThroughputCard.js +0 -2
  739. package/dist/planmagnet/pages/analytics/WorkBreakdownCard.js +0 -2
  740. package/dist/planmagnet/pages/analytics/analyticsRange.js +0 -2
  741. package/dist/planmagnet/people/People.js +0 -2
  742. package/dist/planmagnet/presence/PresenceAvatars.js +0 -2
  743. package/dist/planmagnet/product/FeatureLinkPanels.js +0 -2
  744. package/dist/planmagnet/product/ProductControls.js +0 -2
  745. package/dist/planmagnet/product/ProductFeatureControls.js +0 -2
  746. package/dist/planmagnet/product/ProductFeatureLinkCard.js +0 -2
  747. package/dist/planmagnet/product/ProductLineControls.js +0 -2
  748. package/dist/planmagnet/product/ProductTeamsPanel.js +0 -2
  749. package/dist/planmagnet/product/WorkItemProductFeatureChip.js +0 -2
  750. package/dist/planmagnet/product/hierarchy.js +0 -2
  751. package/dist/planmagnet/product/hierarchyOperations.js +0 -2
  752. package/dist/planmagnet/product/refusal.js +0 -2
  753. package/dist/planmagnet/product/routes.js +0 -2
  754. package/dist/planmagnet/providers/PlanMagnetProvider.js +0 -2
  755. package/dist/planmagnet/releases/ReleaseChecklistCard.js +0 -2
  756. package/dist/planmagnet/releases/ReleaseGatesCard.js +0 -2
  757. package/dist/planmagnet/releases/ReleaseNotesCard.js +0 -2
  758. package/dist/planmagnet/releases/ReleaseReadinessCard.js +0 -2
  759. package/dist/planmagnet/releases/ReleaseWorkItemsCard.js +0 -2
  760. package/dist/planmagnet/releases/useReleaseOptions.js +0 -2
  761. package/dist/planmagnet/reports/ExportMenu.js +0 -2
  762. package/dist/planmagnet/reports/PrintReportView.js +0 -2
  763. package/dist/planmagnet/reports/ReportBuilderCanvas.js +0 -2
  764. package/dist/planmagnet/reports/ReportBuilderPage.js +0 -2
  765. package/dist/planmagnet/reports/ReportRunHistory.js +0 -2
  766. package/dist/planmagnet/reports/ReportWidgetRenderer.js +0 -2
  767. package/dist/planmagnet/reports/SchedulesPanel.js +0 -2
  768. package/dist/planmagnet/reports/ShareDialog.js +0 -2
  769. package/dist/planmagnet/reports/SharedReportPage.js +0 -2
  770. package/dist/planmagnet/reports/WidgetEditorDialog.js +0 -2
  771. package/dist/planmagnet/reports/reportExportPptx.js +0 -2
  772. package/dist/planmagnet/reports/reportExportXlsx.js +0 -2
  773. package/dist/planmagnet/reports/reportGraphql.js +0 -2
  774. package/dist/planmagnet/reports/reportModel.js +0 -2
  775. package/dist/planmagnet/reports/sharedReportRoute.js +0 -2
  776. package/dist/planmagnet/roadmaps/FeatureInitiativeCard.js +0 -2
  777. package/dist/planmagnet/roadmaps/RoadmapControls.js +0 -2
  778. package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js +0 -2
  779. package/dist/planmagnet/roadmaps/RoadmapPresentation.js +0 -2
  780. package/dist/planmagnet/roadmaps/RoadmapReviewPanel.js +0 -2
  781. package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.js +0 -2
  782. package/dist/planmagnet/roadmaps/planningFocus.js +0 -2
  783. package/dist/planmagnet/satisfaction/DeliverySatisfactionSection.js +0 -2
  784. package/dist/planmagnet/satisfaction/SatisfactionFigures.js +0 -2
  785. package/dist/planmagnet/satisfaction/SatisfactionImportDialog.js +0 -2
  786. package/dist/planmagnet/satisfaction/SatisfactionLinkFields.js +0 -2
  787. package/dist/planmagnet/satisfaction/SatisfactionReleaseSelect.js +0 -2
  788. package/dist/planmagnet/satisfaction/SatisfactionResponseDialog.js +0 -2
  789. package/dist/planmagnet/satisfaction/SatisfactionResponsesTable.js +0 -2
  790. package/dist/planmagnet/satisfaction/SatisfactionSummaryCard.js +0 -2
  791. package/dist/planmagnet/satisfaction/SatisfactionWindowPicker.js +0 -2
  792. package/dist/planmagnet/satisfaction/satisfaction.js +0 -2
  793. package/dist/planmagnet/satisfaction/satisfactionCsv.js +0 -2
  794. package/dist/planmagnet/satisfaction/satisfactionForm.js +0 -2
  795. package/dist/planmagnet/satisfaction/satisfactionOperations.js +0 -2
  796. package/dist/planmagnet/satisfaction/useSatisfactionAccess.js +0 -2
  797. package/dist/planmagnet/skills/RequiredSkillsEditor.js +0 -2
  798. package/dist/planmagnet/skills/SkillChips.js +0 -2
  799. package/dist/planmagnet/skills/SkillCoverageCard.js +0 -2
  800. package/dist/planmagnet/skills/WorkItemRequiredSkills.js +0 -2
  801. package/dist/planmagnet/skills/skillOperations.js +0 -2
  802. package/dist/planmagnet/skills/skillTags.js +0 -2
  803. package/dist/planmagnet/skills/useRequiredSkillsDraft.js +0 -2
  804. package/dist/planmagnet/sprints/SprintControls.js +0 -2
  805. package/dist/planmagnet/sprints/SprintDates.js +0 -2
  806. package/dist/planmagnet/store/planmagnetStore.js +0 -2
  807. package/dist/planmagnet/team/PendingInvitations.js +0 -2
  808. package/dist/planmagnet/team/TeamControls.js +0 -2
  809. package/dist/planmagnet/team/UnmatchedCrewIdentities.js +0 -2
  810. package/dist/planmagnet/team/invitationEmail.js +0 -2
  811. package/dist/planmagnet/time/TaskTimePanel.js +0 -2
  812. package/dist/planmagnet/time/TimeEntryControls.js +0 -2
  813. package/dist/planmagnet/time/TimesheetControls.js +0 -2
  814. package/dist/planmagnet/time/timeShared.js +0 -2
  815. package/dist/planmagnet/utils/cn.js +0 -2
  816. package/dist/planmagnet/utils/email.js +0 -2
  817. package/dist/planmagnet/utils/formValidation.js +0 -2
  818. package/dist/planmagnet/utils/graphqlErrors.js +0 -2
  819. package/dist/planmagnet/utils/lineDiff.js +0 -2
  820. package/dist/planmagnet/utils/mutationResult.js +0 -2
  821. package/dist/planmagnet/utils/navigation.js +0 -2
  822. package/dist/planmagnet/utils/qualityGateCriteria.js +0 -2
  823. package/dist/planmagnet/utils/rowNavigation.js +0 -2
  824. package/dist/planmagnet/utils/statusColor.js +0 -2
  825. package/dist/planmagnet/utils/urlParam.js +0 -2
  826. package/dist/planmagnet/webhooks/webhookTypes.js +0 -2
  827. package/dist/shared/hooks/useTr.js +0 -2
  828. package/dist/shared/utils/i18n.js +0 -2
  829. package/package.json +2 -1
  830. package/dist/_virtual/__vite-browser-external.js.map +0 -1
  831. package/dist/components/Button.d.ts.map +0 -1
  832. package/dist/components/Button.stories.d.ts.map +0 -1
  833. package/dist/components/MarkdownEditor.d.ts.map +0 -1
  834. package/dist/components/MarkdownEditor.js.map +0 -1
  835. package/dist/dev/main.d.ts.map +0 -1
  836. package/dist/generated/global-operations.d.ts.map +0 -1
  837. package/dist/generated/global-types.d.ts.map +0 -1
  838. package/dist/generated/wspace-operations.d.ts.map +0 -1
  839. package/dist/generated/wspace-types.d.ts.map +0 -1
  840. package/dist/index.d.ts.map +0 -1
  841. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +0 -1
  842. package/dist/node_modules/@apollo/client/errors/ServerError.js.map +0 -1
  843. package/dist/node_modules/@apollo/client/errors/utils.js.map +0 -1
  844. package/dist/node_modules/clsx/dist/clsx.js.map +0 -1
  845. package/dist/node_modules/d3-array/src/ascending.js.map +0 -1
  846. package/dist/node_modules/d3-array/src/bisect.js.map +0 -1
  847. package/dist/node_modules/d3-array/src/bisector.js.map +0 -1
  848. package/dist/node_modules/d3-array/src/descending.js.map +0 -1
  849. package/dist/node_modules/d3-array/src/max.js.map +0 -1
  850. package/dist/node_modules/d3-array/src/min.js.map +0 -1
  851. package/dist/node_modules/d3-array/src/number.js.map +0 -1
  852. package/dist/node_modules/d3-array/src/quantile.js.map +0 -1
  853. package/dist/node_modules/d3-array/src/quickselect.js.map +0 -1
  854. package/dist/node_modules/d3-array/src/range.js.map +0 -1
  855. package/dist/node_modules/d3-array/src/sort.js.map +0 -1
  856. package/dist/node_modules/d3-array/src/ticks.js.map +0 -1
  857. package/dist/node_modules/d3-color/src/color.js.map +0 -1
  858. package/dist/node_modules/d3-color/src/define.js.map +0 -1
  859. package/dist/node_modules/d3-format/src/defaultLocale.js.map +0 -1
  860. package/dist/node_modules/d3-format/src/exponent.js.map +0 -1
  861. package/dist/node_modules/d3-format/src/formatDecimal.js.map +0 -1
  862. package/dist/node_modules/d3-format/src/formatGroup.js.map +0 -1
  863. package/dist/node_modules/d3-format/src/formatNumerals.js.map +0 -1
  864. package/dist/node_modules/d3-format/src/formatPrefixAuto.js.map +0 -1
  865. package/dist/node_modules/d3-format/src/formatRounded.js.map +0 -1
  866. package/dist/node_modules/d3-format/src/formatSpecifier.js.map +0 -1
  867. package/dist/node_modules/d3-format/src/formatTrim.js.map +0 -1
  868. package/dist/node_modules/d3-format/src/formatTypes.js.map +0 -1
  869. package/dist/node_modules/d3-format/src/identity.js.map +0 -1
  870. package/dist/node_modules/d3-format/src/locale.js.map +0 -1
  871. package/dist/node_modules/d3-format/src/precisionFixed.js.map +0 -1
  872. package/dist/node_modules/d3-format/src/precisionPrefix.js.map +0 -1
  873. package/dist/node_modules/d3-format/src/precisionRound.js.map +0 -1
  874. package/dist/node_modules/d3-interpolate/src/array.js.map +0 -1
  875. package/dist/node_modules/d3-interpolate/src/basis.js.map +0 -1
  876. package/dist/node_modules/d3-interpolate/src/basisClosed.js.map +0 -1
  877. package/dist/node_modules/d3-interpolate/src/color.js.map +0 -1
  878. package/dist/node_modules/d3-interpolate/src/constant.js.map +0 -1
  879. package/dist/node_modules/d3-interpolate/src/date.js.map +0 -1
  880. package/dist/node_modules/d3-interpolate/src/number.js.map +0 -1
  881. package/dist/node_modules/d3-interpolate/src/numberArray.js.map +0 -1
  882. package/dist/node_modules/d3-interpolate/src/object.js.map +0 -1
  883. package/dist/node_modules/d3-interpolate/src/piecewise.js.map +0 -1
  884. package/dist/node_modules/d3-interpolate/src/rgb.js.map +0 -1
  885. package/dist/node_modules/d3-interpolate/src/round.js.map +0 -1
  886. package/dist/node_modules/d3-interpolate/src/string.js.map +0 -1
  887. package/dist/node_modules/d3-interpolate/src/value.js.map +0 -1
  888. package/dist/node_modules/d3-path/src/path.js.map +0 -1
  889. package/dist/node_modules/d3-scale/src/band.js.map +0 -1
  890. package/dist/node_modules/d3-scale/src/constant.js.map +0 -1
  891. package/dist/node_modules/d3-scale/src/continuous.js.map +0 -1
  892. package/dist/node_modules/d3-scale/src/diverging.js.map +0 -1
  893. package/dist/node_modules/d3-scale/src/identity.js.map +0 -1
  894. package/dist/node_modules/d3-scale/src/init.js.map +0 -1
  895. package/dist/node_modules/d3-scale/src/linear.js.map +0 -1
  896. package/dist/node_modules/d3-scale/src/log.js.map +0 -1
  897. package/dist/node_modules/d3-scale/src/nice.js.map +0 -1
  898. package/dist/node_modules/d3-scale/src/number.js.map +0 -1
  899. package/dist/node_modules/d3-scale/src/ordinal.js.map +0 -1
  900. package/dist/node_modules/d3-scale/src/pow.js.map +0 -1
  901. package/dist/node_modules/d3-scale/src/quantile.js.map +0 -1
  902. package/dist/node_modules/d3-scale/src/quantize.js.map +0 -1
  903. package/dist/node_modules/d3-scale/src/radial.js.map +0 -1
  904. package/dist/node_modules/d3-scale/src/sequential.js.map +0 -1
  905. package/dist/node_modules/d3-scale/src/sequentialQuantile.js.map +0 -1
  906. package/dist/node_modules/d3-scale/src/symlog.js.map +0 -1
  907. package/dist/node_modules/d3-scale/src/threshold.js.map +0 -1
  908. package/dist/node_modules/d3-scale/src/tickFormat.js.map +0 -1
  909. package/dist/node_modules/d3-scale/src/time.js.map +0 -1
  910. package/dist/node_modules/d3-scale/src/utcTime.js.map +0 -1
  911. package/dist/node_modules/d3-shape/src/area.js.map +0 -1
  912. package/dist/node_modules/d3-shape/src/array.js.map +0 -1
  913. package/dist/node_modules/d3-shape/src/constant.js.map +0 -1
  914. package/dist/node_modules/d3-shape/src/curve/basis.js.map +0 -1
  915. package/dist/node_modules/d3-shape/src/curve/basisClosed.js.map +0 -1
  916. package/dist/node_modules/d3-shape/src/curve/basisOpen.js.map +0 -1
  917. package/dist/node_modules/d3-shape/src/curve/bump.js.map +0 -1
  918. package/dist/node_modules/d3-shape/src/curve/linear.js.map +0 -1
  919. package/dist/node_modules/d3-shape/src/curve/linearClosed.js.map +0 -1
  920. package/dist/node_modules/d3-shape/src/curve/monotone.js.map +0 -1
  921. package/dist/node_modules/d3-shape/src/curve/natural.js.map +0 -1
  922. package/dist/node_modules/d3-shape/src/curve/step.js.map +0 -1
  923. package/dist/node_modules/d3-shape/src/line.js.map +0 -1
  924. package/dist/node_modules/d3-shape/src/math.js.map +0 -1
  925. package/dist/node_modules/d3-shape/src/noop.js.map +0 -1
  926. package/dist/node_modules/d3-shape/src/offset/expand.js.map +0 -1
  927. package/dist/node_modules/d3-shape/src/offset/none.js.map +0 -1
  928. package/dist/node_modules/d3-shape/src/offset/silhouette.js.map +0 -1
  929. package/dist/node_modules/d3-shape/src/offset/wiggle.js.map +0 -1
  930. package/dist/node_modules/d3-shape/src/order/none.js.map +0 -1
  931. package/dist/node_modules/d3-shape/src/path.js.map +0 -1
  932. package/dist/node_modules/d3-shape/src/point.js.map +0 -1
  933. package/dist/node_modules/d3-shape/src/stack.js.map +0 -1
  934. package/dist/node_modules/d3-shape/src/symbol/circle.js.map +0 -1
  935. package/dist/node_modules/d3-shape/src/symbol/cross.js.map +0 -1
  936. package/dist/node_modules/d3-shape/src/symbol/diamond.js.map +0 -1
  937. package/dist/node_modules/d3-shape/src/symbol/square.js.map +0 -1
  938. package/dist/node_modules/d3-shape/src/symbol/star.js.map +0 -1
  939. package/dist/node_modules/d3-shape/src/symbol/triangle.js.map +0 -1
  940. package/dist/node_modules/d3-shape/src/symbol/wye.js.map +0 -1
  941. package/dist/node_modules/d3-shape/src/symbol.js.map +0 -1
  942. package/dist/node_modules/d3-time/src/day.js.map +0 -1
  943. package/dist/node_modules/d3-time/src/duration.js.map +0 -1
  944. package/dist/node_modules/d3-time/src/hour.js.map +0 -1
  945. package/dist/node_modules/d3-time/src/interval.js.map +0 -1
  946. package/dist/node_modules/d3-time/src/millisecond.js.map +0 -1
  947. package/dist/node_modules/d3-time/src/minute.js.map +0 -1
  948. package/dist/node_modules/d3-time/src/month.js.map +0 -1
  949. package/dist/node_modules/d3-time/src/second.js.map +0 -1
  950. package/dist/node_modules/d3-time/src/ticks.js.map +0 -1
  951. package/dist/node_modules/d3-time/src/week.js.map +0 -1
  952. package/dist/node_modules/d3-time/src/year.js.map +0 -1
  953. package/dist/node_modules/d3-time-format/src/defaultLocale.js.map +0 -1
  954. package/dist/node_modules/d3-time-format/src/locale.js.map +0 -1
  955. package/dist/node_modules/decimal.js-light/decimal.js.map +0 -1
  956. package/dist/node_modules/eventemitter3/index.js.map +0 -1
  957. package/dist/node_modules/fast-equals/dist/es/index.js.map +0 -1
  958. package/dist/node_modules/fflate/esm/browser.js.map +0 -1
  959. package/dist/node_modules/internmap/src/index.js.map +0 -1
  960. package/dist/node_modules/jszip/dist/jszip.min.js.map +0 -1
  961. package/dist/node_modules/lodash/_DataView.js.map +0 -1
  962. package/dist/node_modules/lodash/_Hash.js.map +0 -1
  963. package/dist/node_modules/lodash/_ListCache.js.map +0 -1
  964. package/dist/node_modules/lodash/_Map.js.map +0 -1
  965. package/dist/node_modules/lodash/_MapCache.js.map +0 -1
  966. package/dist/node_modules/lodash/_Promise.js.map +0 -1
  967. package/dist/node_modules/lodash/_Set.js.map +0 -1
  968. package/dist/node_modules/lodash/_SetCache.js.map +0 -1
  969. package/dist/node_modules/lodash/_Stack.js.map +0 -1
  970. package/dist/node_modules/lodash/_Symbol.js.map +0 -1
  971. package/dist/node_modules/lodash/_Uint8Array.js.map +0 -1
  972. package/dist/node_modules/lodash/_WeakMap.js.map +0 -1
  973. package/dist/node_modules/lodash/_apply.js.map +0 -1
  974. package/dist/node_modules/lodash/_arrayEach.js.map +0 -1
  975. package/dist/node_modules/lodash/_arrayEvery.js.map +0 -1
  976. package/dist/node_modules/lodash/_arrayFilter.js.map +0 -1
  977. package/dist/node_modules/lodash/_arrayIncludes.js.map +0 -1
  978. package/dist/node_modules/lodash/_arrayIncludesWith.js.map +0 -1
  979. package/dist/node_modules/lodash/_arrayLikeKeys.js.map +0 -1
  980. package/dist/node_modules/lodash/_arrayMap.js.map +0 -1
  981. package/dist/node_modules/lodash/_arrayPush.js.map +0 -1
  982. package/dist/node_modules/lodash/_arraySome.js.map +0 -1
  983. package/dist/node_modules/lodash/_asciiToArray.js.map +0 -1
  984. package/dist/node_modules/lodash/_assignValue.js.map +0 -1
  985. package/dist/node_modules/lodash/_assocIndexOf.js.map +0 -1
  986. package/dist/node_modules/lodash/_baseAssign.js.map +0 -1
  987. package/dist/node_modules/lodash/_baseAssignIn.js.map +0 -1
  988. package/dist/node_modules/lodash/_baseAssignValue.js.map +0 -1
  989. package/dist/node_modules/lodash/_baseClone.js.map +0 -1
  990. package/dist/node_modules/lodash/_baseCreate.js.map +0 -1
  991. package/dist/node_modules/lodash/_baseEach.js.map +0 -1
  992. package/dist/node_modules/lodash/_baseEvery.js.map +0 -1
  993. package/dist/node_modules/lodash/_baseExtremum.js.map +0 -1
  994. package/dist/node_modules/lodash/_baseFindIndex.js.map +0 -1
  995. package/dist/node_modules/lodash/_baseFlatten.js.map +0 -1
  996. package/dist/node_modules/lodash/_baseFor.js.map +0 -1
  997. package/dist/node_modules/lodash/_baseForOwn.js.map +0 -1
  998. package/dist/node_modules/lodash/_baseGet.js.map +0 -1
  999. package/dist/node_modules/lodash/_baseGetAllKeys.js.map +0 -1
  1000. package/dist/node_modules/lodash/_baseGetTag.js.map +0 -1
  1001. package/dist/node_modules/lodash/_baseGt.js.map +0 -1
  1002. package/dist/node_modules/lodash/_baseHasIn.js.map +0 -1
  1003. package/dist/node_modules/lodash/_baseIndexOf.js.map +0 -1
  1004. package/dist/node_modules/lodash/_baseIsArguments.js.map +0 -1
  1005. package/dist/node_modules/lodash/_baseIsEqual.js.map +0 -1
  1006. package/dist/node_modules/lodash/_baseIsEqualDeep.js.map +0 -1
  1007. package/dist/node_modules/lodash/_baseIsMap.js.map +0 -1
  1008. package/dist/node_modules/lodash/_baseIsMatch.js.map +0 -1
  1009. package/dist/node_modules/lodash/_baseIsNaN.js.map +0 -1
  1010. package/dist/node_modules/lodash/_baseIsNative.js.map +0 -1
  1011. package/dist/node_modules/lodash/_baseIsSet.js.map +0 -1
  1012. package/dist/node_modules/lodash/_baseIsTypedArray.js.map +0 -1
  1013. package/dist/node_modules/lodash/_baseIteratee.js.map +0 -1
  1014. package/dist/node_modules/lodash/_baseKeys.js.map +0 -1
  1015. package/dist/node_modules/lodash/_baseKeysIn.js.map +0 -1
  1016. package/dist/node_modules/lodash/_baseLt.js.map +0 -1
  1017. package/dist/node_modules/lodash/_baseMap.js.map +0 -1
  1018. package/dist/node_modules/lodash/_baseMatches.js.map +0 -1
  1019. package/dist/node_modules/lodash/_baseMatchesProperty.js.map +0 -1
  1020. package/dist/node_modules/lodash/_baseOrderBy.js.map +0 -1
  1021. package/dist/node_modules/lodash/_baseProperty.js.map +0 -1
  1022. package/dist/node_modules/lodash/_basePropertyDeep.js.map +0 -1
  1023. package/dist/node_modules/lodash/_baseRange.js.map +0 -1
  1024. package/dist/node_modules/lodash/_baseRest.js.map +0 -1
  1025. package/dist/node_modules/lodash/_baseSetToString.js.map +0 -1
  1026. package/dist/node_modules/lodash/_baseSlice.js.map +0 -1
  1027. package/dist/node_modules/lodash/_baseSome.js.map +0 -1
  1028. package/dist/node_modules/lodash/_baseSortBy.js.map +0 -1
  1029. package/dist/node_modules/lodash/_baseSum.js.map +0 -1
  1030. package/dist/node_modules/lodash/_baseTimes.js.map +0 -1
  1031. package/dist/node_modules/lodash/_baseToString.js.map +0 -1
  1032. package/dist/node_modules/lodash/_baseTrim.js.map +0 -1
  1033. package/dist/node_modules/lodash/_baseUnary.js.map +0 -1
  1034. package/dist/node_modules/lodash/_baseUniq.js.map +0 -1
  1035. package/dist/node_modules/lodash/_baseUnset.js.map +0 -1
  1036. package/dist/node_modules/lodash/_cacheHas.js.map +0 -1
  1037. package/dist/node_modules/lodash/_castPath.js.map +0 -1
  1038. package/dist/node_modules/lodash/_castSlice.js.map +0 -1
  1039. package/dist/node_modules/lodash/_cloneArrayBuffer.js.map +0 -1
  1040. package/dist/node_modules/lodash/_cloneBuffer.js.map +0 -1
  1041. package/dist/node_modules/lodash/_cloneDataView.js.map +0 -1
  1042. package/dist/node_modules/lodash/_cloneRegExp.js.map +0 -1
  1043. package/dist/node_modules/lodash/_cloneSymbol.js.map +0 -1
  1044. package/dist/node_modules/lodash/_cloneTypedArray.js.map +0 -1
  1045. package/dist/node_modules/lodash/_compareAscending.js.map +0 -1
  1046. package/dist/node_modules/lodash/_compareMultiple.js.map +0 -1
  1047. package/dist/node_modules/lodash/_copyArray.js.map +0 -1
  1048. package/dist/node_modules/lodash/_copyObject.js.map +0 -1
  1049. package/dist/node_modules/lodash/_copySymbols.js.map +0 -1
  1050. package/dist/node_modules/lodash/_copySymbolsIn.js.map +0 -1
  1051. package/dist/node_modules/lodash/_coreJsData.js.map +0 -1
  1052. package/dist/node_modules/lodash/_createBaseEach.js.map +0 -1
  1053. package/dist/node_modules/lodash/_createBaseFor.js.map +0 -1
  1054. package/dist/node_modules/lodash/_createCaseFirst.js.map +0 -1
  1055. package/dist/node_modules/lodash/_createFind.js.map +0 -1
  1056. package/dist/node_modules/lodash/_createRange.js.map +0 -1
  1057. package/dist/node_modules/lodash/_createSet.js.map +0 -1
  1058. package/dist/node_modules/lodash/_customOmitClone.js.map +0 -1
  1059. package/dist/node_modules/lodash/_defineProperty.js.map +0 -1
  1060. package/dist/node_modules/lodash/_equalArrays.js.map +0 -1
  1061. package/dist/node_modules/lodash/_equalByTag.js.map +0 -1
  1062. package/dist/node_modules/lodash/_equalObjects.js.map +0 -1
  1063. package/dist/node_modules/lodash/_flatRest.js.map +0 -1
  1064. package/dist/node_modules/lodash/_freeGlobal.js.map +0 -1
  1065. package/dist/node_modules/lodash/_getAllKeys.js.map +0 -1
  1066. package/dist/node_modules/lodash/_getAllKeysIn.js.map +0 -1
  1067. package/dist/node_modules/lodash/_getMapData.js.map +0 -1
  1068. package/dist/node_modules/lodash/_getMatchData.js.map +0 -1
  1069. package/dist/node_modules/lodash/_getNative.js.map +0 -1
  1070. package/dist/node_modules/lodash/_getPrototype.js.map +0 -1
  1071. package/dist/node_modules/lodash/_getRawTag.js.map +0 -1
  1072. package/dist/node_modules/lodash/_getSymbols.js.map +0 -1
  1073. package/dist/node_modules/lodash/_getSymbolsIn.js.map +0 -1
  1074. package/dist/node_modules/lodash/_getTag.js.map +0 -1
  1075. package/dist/node_modules/lodash/_getValue.js.map +0 -1
  1076. package/dist/node_modules/lodash/_hasPath.js.map +0 -1
  1077. package/dist/node_modules/lodash/_hasUnicode.js.map +0 -1
  1078. package/dist/node_modules/lodash/_hashClear.js.map +0 -1
  1079. package/dist/node_modules/lodash/_hashDelete.js.map +0 -1
  1080. package/dist/node_modules/lodash/_hashGet.js.map +0 -1
  1081. package/dist/node_modules/lodash/_hashHas.js.map +0 -1
  1082. package/dist/node_modules/lodash/_hashSet.js.map +0 -1
  1083. package/dist/node_modules/lodash/_initCloneArray.js.map +0 -1
  1084. package/dist/node_modules/lodash/_initCloneByTag.js.map +0 -1
  1085. package/dist/node_modules/lodash/_initCloneObject.js.map +0 -1
  1086. package/dist/node_modules/lodash/_isFlattenable.js.map +0 -1
  1087. package/dist/node_modules/lodash/_isIndex.js.map +0 -1
  1088. package/dist/node_modules/lodash/_isIterateeCall.js.map +0 -1
  1089. package/dist/node_modules/lodash/_isKey.js.map +0 -1
  1090. package/dist/node_modules/lodash/_isKeyable.js.map +0 -1
  1091. package/dist/node_modules/lodash/_isMasked.js.map +0 -1
  1092. package/dist/node_modules/lodash/_isPrototype.js.map +0 -1
  1093. package/dist/node_modules/lodash/_isStrictComparable.js.map +0 -1
  1094. package/dist/node_modules/lodash/_listCacheClear.js.map +0 -1
  1095. package/dist/node_modules/lodash/_listCacheDelete.js.map +0 -1
  1096. package/dist/node_modules/lodash/_listCacheGet.js.map +0 -1
  1097. package/dist/node_modules/lodash/_listCacheHas.js.map +0 -1
  1098. package/dist/node_modules/lodash/_listCacheSet.js.map +0 -1
  1099. package/dist/node_modules/lodash/_mapCacheClear.js.map +0 -1
  1100. package/dist/node_modules/lodash/_mapCacheDelete.js.map +0 -1
  1101. package/dist/node_modules/lodash/_mapCacheGet.js.map +0 -1
  1102. package/dist/node_modules/lodash/_mapCacheHas.js.map +0 -1
  1103. package/dist/node_modules/lodash/_mapCacheSet.js.map +0 -1
  1104. package/dist/node_modules/lodash/_mapToArray.js.map +0 -1
  1105. package/dist/node_modules/lodash/_matchesStrictComparable.js.map +0 -1
  1106. package/dist/node_modules/lodash/_memoizeCapped.js.map +0 -1
  1107. package/dist/node_modules/lodash/_nativeCreate.js.map +0 -1
  1108. package/dist/node_modules/lodash/_nativeKeys.js.map +0 -1
  1109. package/dist/node_modules/lodash/_nativeKeysIn.js.map +0 -1
  1110. package/dist/node_modules/lodash/_nodeUtil.js.map +0 -1
  1111. package/dist/node_modules/lodash/_objectToString.js.map +0 -1
  1112. package/dist/node_modules/lodash/_overArg.js.map +0 -1
  1113. package/dist/node_modules/lodash/_overRest.js.map +0 -1
  1114. package/dist/node_modules/lodash/_parent.js.map +0 -1
  1115. package/dist/node_modules/lodash/_root.js.map +0 -1
  1116. package/dist/node_modules/lodash/_setCacheAdd.js.map +0 -1
  1117. package/dist/node_modules/lodash/_setCacheHas.js.map +0 -1
  1118. package/dist/node_modules/lodash/_setToArray.js.map +0 -1
  1119. package/dist/node_modules/lodash/_setToString.js.map +0 -1
  1120. package/dist/node_modules/lodash/_shortOut.js.map +0 -1
  1121. package/dist/node_modules/lodash/_stackClear.js.map +0 -1
  1122. package/dist/node_modules/lodash/_stackDelete.js.map +0 -1
  1123. package/dist/node_modules/lodash/_stackGet.js.map +0 -1
  1124. package/dist/node_modules/lodash/_stackHas.js.map +0 -1
  1125. package/dist/node_modules/lodash/_stackSet.js.map +0 -1
  1126. package/dist/node_modules/lodash/_strictIndexOf.js.map +0 -1
  1127. package/dist/node_modules/lodash/_stringToArray.js.map +0 -1
  1128. package/dist/node_modules/lodash/_stringToPath.js.map +0 -1
  1129. package/dist/node_modules/lodash/_toKey.js.map +0 -1
  1130. package/dist/node_modules/lodash/_toSource.js.map +0 -1
  1131. package/dist/node_modules/lodash/_trimmedEndIndex.js.map +0 -1
  1132. package/dist/node_modules/lodash/_unicodeToArray.js.map +0 -1
  1133. package/dist/node_modules/lodash/constant.js.map +0 -1
  1134. package/dist/node_modules/lodash/debounce.js.map +0 -1
  1135. package/dist/node_modules/lodash/eq.js.map +0 -1
  1136. package/dist/node_modules/lodash/every.js.map +0 -1
  1137. package/dist/node_modules/lodash/find.js.map +0 -1
  1138. package/dist/node_modules/lodash/findIndex.js.map +0 -1
  1139. package/dist/node_modules/lodash/flatMap.js.map +0 -1
  1140. package/dist/node_modules/lodash/flatten.js.map +0 -1
  1141. package/dist/node_modules/lodash/get.js.map +0 -1
  1142. package/dist/node_modules/lodash/hasIn.js.map +0 -1
  1143. package/dist/node_modules/lodash/identity.js.map +0 -1
  1144. package/dist/node_modules/lodash/isArguments.js.map +0 -1
  1145. package/dist/node_modules/lodash/isArray.js.map +0 -1
  1146. package/dist/node_modules/lodash/isArrayLike.js.map +0 -1
  1147. package/dist/node_modules/lodash/isBoolean.js.map +0 -1
  1148. package/dist/node_modules/lodash/isBuffer.js.map +0 -1
  1149. package/dist/node_modules/lodash/isEqual.js.map +0 -1
  1150. package/dist/node_modules/lodash/isFunction.js.map +0 -1
  1151. package/dist/node_modules/lodash/isLength.js.map +0 -1
  1152. package/dist/node_modules/lodash/isMap.js.map +0 -1
  1153. package/dist/node_modules/lodash/isNaN.js.map +0 -1
  1154. package/dist/node_modules/lodash/isNil.js.map +0 -1
  1155. package/dist/node_modules/lodash/isNumber.js.map +0 -1
  1156. package/dist/node_modules/lodash/isObject.js.map +0 -1
  1157. package/dist/node_modules/lodash/isObjectLike.js.map +0 -1
  1158. package/dist/node_modules/lodash/isPlainObject.js.map +0 -1
  1159. package/dist/node_modules/lodash/isSet.js.map +0 -1
  1160. package/dist/node_modules/lodash/isString.js.map +0 -1
  1161. package/dist/node_modules/lodash/isSymbol.js.map +0 -1
  1162. package/dist/node_modules/lodash/isTypedArray.js.map +0 -1
  1163. package/dist/node_modules/lodash/keys.js.map +0 -1
  1164. package/dist/node_modules/lodash/keysIn.js.map +0 -1
  1165. package/dist/node_modules/lodash/last.js.map +0 -1
  1166. package/dist/node_modules/lodash/map.js.map +0 -1
  1167. package/dist/node_modules/lodash/mapValues.js.map +0 -1
  1168. package/dist/node_modules/lodash/max.js.map +0 -1
  1169. package/dist/node_modules/lodash/maxBy.js.map +0 -1
  1170. package/dist/node_modules/lodash/memoize.js.map +0 -1
  1171. package/dist/node_modules/lodash/min.js.map +0 -1
  1172. package/dist/node_modules/lodash/noop.js.map +0 -1
  1173. package/dist/node_modules/lodash/now.js.map +0 -1
  1174. package/dist/node_modules/lodash/omit.js.map +0 -1
  1175. package/dist/node_modules/lodash/property.js.map +0 -1
  1176. package/dist/node_modules/lodash/range.js.map +0 -1
  1177. package/dist/node_modules/lodash/some.js.map +0 -1
  1178. package/dist/node_modules/lodash/sortBy.js.map +0 -1
  1179. package/dist/node_modules/lodash/stubArray.js.map +0 -1
  1180. package/dist/node_modules/lodash/stubFalse.js.map +0 -1
  1181. package/dist/node_modules/lodash/sumBy.js.map +0 -1
  1182. package/dist/node_modules/lodash/throttle.js.map +0 -1
  1183. package/dist/node_modules/lodash/toFinite.js.map +0 -1
  1184. package/dist/node_modules/lodash/toInteger.js.map +0 -1
  1185. package/dist/node_modules/lodash/toNumber.js.map +0 -1
  1186. package/dist/node_modules/lodash/toString.js.map +0 -1
  1187. package/dist/node_modules/lodash/uniqBy.js.map +0 -1
  1188. package/dist/node_modules/lodash/upperFirst.js.map +0 -1
  1189. package/dist/node_modules/object-assign/index.js.map +0 -1
  1190. package/dist/node_modules/pptxgenjs/dist/pptxgen.es.js.map +0 -1
  1191. package/dist/node_modules/prop-types/checkPropTypes.js.map +0 -1
  1192. package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +0 -1
  1193. package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +0 -1
  1194. package/dist/node_modules/prop-types/index.js.map +0 -1
  1195. package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +0 -1
  1196. package/dist/node_modules/prop-types/lib/has.js.map +0 -1
  1197. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js.map +0 -1
  1198. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js.map +0 -1
  1199. package/dist/node_modules/prop-types/node_modules/react-is/index.js.map +0 -1
  1200. package/dist/node_modules/react-is/cjs/react-is.development.js.map +0 -1
  1201. package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +0 -1
  1202. package/dist/node_modules/react-is/index.js.map +0 -1
  1203. package/dist/node_modules/react-smooth/es6/Animate.js.map +0 -1
  1204. package/dist/node_modules/react-smooth/es6/AnimateManager.js.map +0 -1
  1205. package/dist/node_modules/react-smooth/es6/configUpdate.js.map +0 -1
  1206. package/dist/node_modules/react-smooth/es6/easing.js.map +0 -1
  1207. package/dist/node_modules/react-smooth/es6/index.js.map +0 -1
  1208. package/dist/node_modules/react-smooth/es6/setRafTimeout.js.map +0 -1
  1209. package/dist/node_modules/react-smooth/es6/util.js.map +0 -1
  1210. package/dist/node_modules/recharts/es6/cartesian/Area.js.map +0 -1
  1211. package/dist/node_modules/recharts/es6/cartesian/Bar.js.map +0 -1
  1212. package/dist/node_modules/recharts/es6/cartesian/Brush.js.map +0 -1
  1213. package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js.map +0 -1
  1214. package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js.map +0 -1
  1215. package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js.map +0 -1
  1216. package/dist/node_modules/recharts/es6/cartesian/Line.js.map +0 -1
  1217. package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js.map +0 -1
  1218. package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js.map +0 -1
  1219. package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js.map +0 -1
  1220. package/dist/node_modules/recharts/es6/cartesian/XAxis.js.map +0 -1
  1221. package/dist/node_modules/recharts/es6/cartesian/YAxis.js.map +0 -1
  1222. package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js.map +0 -1
  1223. package/dist/node_modules/recharts/es6/cartesian/getTicks.js.map +0 -1
  1224. package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js.map +0 -1
  1225. package/dist/node_modules/recharts/es6/chart/AreaChart.js.map +0 -1
  1226. package/dist/node_modules/recharts/es6/chart/BarChart.js.map +0 -1
  1227. package/dist/node_modules/recharts/es6/chart/LineChart.js.map +0 -1
  1228. package/dist/node_modules/recharts/es6/chart/Sankey.js.map +0 -1
  1229. package/dist/node_modules/recharts/es6/chart/Treemap.js.map +0 -1
  1230. package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js.map +0 -1
  1231. package/dist/node_modules/recharts/es6/component/Cell.js.map +0 -1
  1232. package/dist/node_modules/recharts/es6/component/Cursor.js.map +0 -1
  1233. package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js.map +0 -1
  1234. package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js.map +0 -1
  1235. package/dist/node_modules/recharts/es6/component/Label.js.map +0 -1
  1236. package/dist/node_modules/recharts/es6/component/LabelList.js.map +0 -1
  1237. package/dist/node_modules/recharts/es6/component/Legend.js.map +0 -1
  1238. package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js.map +0 -1
  1239. package/dist/node_modules/recharts/es6/component/Text.js.map +0 -1
  1240. package/dist/node_modules/recharts/es6/component/Tooltip.js.map +0 -1
  1241. package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js.map +0 -1
  1242. package/dist/node_modules/recharts/es6/container/Layer.js.map +0 -1
  1243. package/dist/node_modules/recharts/es6/container/Surface.js.map +0 -1
  1244. package/dist/node_modules/recharts/es6/context/chartLayoutContext.js.map +0 -1
  1245. package/dist/node_modules/recharts/es6/shape/Cross.js.map +0 -1
  1246. package/dist/node_modules/recharts/es6/shape/Curve.js.map +0 -1
  1247. package/dist/node_modules/recharts/es6/shape/Dot.js.map +0 -1
  1248. package/dist/node_modules/recharts/es6/shape/Polygon.js.map +0 -1
  1249. package/dist/node_modules/recharts/es6/shape/Rectangle.js.map +0 -1
  1250. package/dist/node_modules/recharts/es6/shape/Sector.js.map +0 -1
  1251. package/dist/node_modules/recharts/es6/shape/Symbols.js.map +0 -1
  1252. package/dist/node_modules/recharts/es6/shape/Trapezoid.js.map +0 -1
  1253. package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js.map +0 -1
  1254. package/dist/node_modules/recharts/es6/util/BarUtils.js.map +0 -1
  1255. package/dist/node_modules/recharts/es6/util/CartesianUtils.js.map +0 -1
  1256. package/dist/node_modules/recharts/es6/util/ChartUtils.js.map +0 -1
  1257. package/dist/node_modules/recharts/es6/util/Constants.js.map +0 -1
  1258. package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js.map +0 -1
  1259. package/dist/node_modules/recharts/es6/util/DOMUtils.js.map +0 -1
  1260. package/dist/node_modules/recharts/es6/util/DataUtils.js.map +0 -1
  1261. package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js.map +0 -1
  1262. package/dist/node_modules/recharts/es6/util/Events.js.map +0 -1
  1263. package/dist/node_modules/recharts/es6/util/Global.js.map +0 -1
  1264. package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js.map +0 -1
  1265. package/dist/node_modules/recharts/es6/util/LogUtils.js.map +0 -1
  1266. package/dist/node_modules/recharts/es6/util/PolarUtils.js.map +0 -1
  1267. package/dist/node_modules/recharts/es6/util/ReactUtils.js.map +0 -1
  1268. package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js.map +0 -1
  1269. package/dist/node_modules/recharts/es6/util/ShallowEqual.js.map +0 -1
  1270. package/dist/node_modules/recharts/es6/util/TickUtils.js.map +0 -1
  1271. package/dist/node_modules/recharts/es6/util/calculateViewBox.js.map +0 -1
  1272. package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js.map +0 -1
  1273. package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js.map +0 -1
  1274. package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js.map +0 -1
  1275. package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js.map +0 -1
  1276. package/dist/node_modules/recharts/es6/util/getLegendProps.js.map +0 -1
  1277. package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js.map +0 -1
  1278. package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js.map +0 -1
  1279. package/dist/node_modules/recharts/es6/util/tooltip/translate.js.map +0 -1
  1280. package/dist/node_modules/recharts/es6/util/types.js.map +0 -1
  1281. package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js.map +0 -1
  1282. package/dist/node_modules/recharts-scale/es6/util/arithmetic.js.map +0 -1
  1283. package/dist/node_modules/recharts-scale/es6/util/utils.js.map +0 -1
  1284. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
  1285. package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +0 -1
  1286. package/dist/node_modules/victory-vendor/es/d3-scale.js.map +0 -1
  1287. package/dist/node_modules/write-excel-file/modules/export/convertFileContentToUint8ArrayBrowser.js.map +0 -1
  1288. package/dist/node_modules/write-excel-file/modules/export/convertFilesContentToUint8Arrays.js.map +0 -1
  1289. package/dist/node_modules/write-excel-file/modules/export/downloadBlob.js.map +0 -1
  1290. package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileBrowser.js.map +0 -1
  1291. package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileUniversal.js.map +0 -1
  1292. package/dist/node_modules/write-excel-file/modules/getSheetData/getSheetData.js.map +0 -1
  1293. package/dist/node_modules/write-excel-file/modules/xlsx/features/conditionalFormatting.js.map +0 -1
  1294. package/dist/node_modules/write-excel-file/modules/xlsx/features/images.js.map +0 -1
  1295. package/dist/node_modules/write-excel-file/modules/xlsx/features/stickyRowsOrColumns.js.map +0 -1
  1296. package/dist/node_modules/write-excel-file/modules/xlsx/files/_Content_Types_.xml.js.map +0 -1
  1297. package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.js.map +0 -1
  1298. package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.rels.js.map +0 -1
  1299. package/dist/node_modules/write-excel-file/modules/xlsx/files/rels.js.map +0 -1
  1300. package/dist/node_modules/write-excel-file/modules/xlsx/files/sharedStrings.xml.js.map +0 -1
  1301. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/cell.js.map +0 -1
  1302. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/column.js.map +0 -1
  1303. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/columns.js.map +0 -1
  1304. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/drawingReference.js.map +0 -1
  1305. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/helpers/getCellStyleProperties.js.map +0 -1
  1306. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/mergedCellsDescription.js.map +0 -1
  1307. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageMargins.js.map +0 -1
  1308. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageSetup.js.map +0 -1
  1309. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/processMergedCells.js.map +0 -1
  1310. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/row.js.map +0 -1
  1311. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheet.xml.js.map +0 -1
  1312. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetData.js.map +0 -1
  1313. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetViews.js.map +0 -1
  1314. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml.rels.js.map +0 -1
  1315. package/dist/node_modules/write-excel-file/modules/xlsx/files/styles.xml.js.map +0 -1
  1316. package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.js.map +0 -1
  1317. package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.rels.js.map +0 -1
  1318. package/dist/node_modules/write-excel-file/modules/xlsx/generateXlsxFileContents.js.map +0 -1
  1319. package/dist/node_modules/write-excel-file/modules/xlsx/getFeatures.js.map +0 -1
  1320. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/convertDateToSerialNumber.js.map +0 -1
  1321. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getAdditionalContent.js.map +0 -1
  1322. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getElementXml.js.map +0 -1
  1323. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getWrittenFiles.js.map +0 -1
  1324. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/transformContent.js.map +0 -1
  1325. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getAlignmentXml.js.map +0 -1
  1326. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getBorderXml.js.map +0 -1
  1327. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getCellAddress.js.map +0 -1
  1328. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFileExtensionForContentType.js.map +0 -1
  1329. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFillXml.js.map +0 -1
  1330. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFontXml.js.map +0 -1
  1331. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getOrderOfSiblings.js.map +0 -1
  1332. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getXlsxColorForHexColor.js.map +0 -1
  1333. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasAlignment.js.map +0 -1
  1334. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasBorder.js.map +0 -1
  1335. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFill.js.map +0 -1
  1336. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFont.js.map +0 -1
  1337. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isCellObject.js.map +0 -1
  1338. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isObject.js.map +0 -1
  1339. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/orderOfSiblings.js.map +0 -1
  1340. package/dist/node_modules/write-excel-file/modules/xlsx/initializeSharedStrings.js.map +0 -1
  1341. package/dist/node_modules/write-excel-file/modules/xlsx/initializeSheets.js.map +0 -1
  1342. package/dist/node_modules/write-excel-file/modules/xlsx/initializeStyles.js.map +0 -1
  1343. package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetData.js.map +0 -1
  1344. package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetName.js.map +0 -1
  1345. package/dist/node_modules/write-excel-file/modules/xml/appendMarkupInsideElement.js.map +0 -1
  1346. package/dist/node_modules/write-excel-file/modules/xml/applyEnclosingElementOffset.js.map +0 -1
  1347. package/dist/node_modules/write-excel-file/modules/xml/escapeXmlSpecialCharacters.js.map +0 -1
  1348. package/dist/node_modules/write-excel-file/modules/xml/findElement.js.map +0 -1
  1349. package/dist/node_modules/write-excel-file/modules/xml/findElementInsideElement.js.map +0 -1
  1350. package/dist/node_modules/write-excel-file/modules/xml/findElementsNonRecursive_.js.map +0 -1
  1351. package/dist/node_modules/write-excel-file/modules/xml/getAttributesString.js.map +0 -1
  1352. package/dist/node_modules/write-excel-file/modules/xml/getChildElements.js.map +0 -1
  1353. package/dist/node_modules/write-excel-file/modules/xml/getClosingTagMarkup.js.map +0 -1
  1354. package/dist/node_modules/write-excel-file/modules/xml/getMarkupInsideElement.js.map +0 -1
  1355. package/dist/node_modules/write-excel-file/modules/xml/getOpeningTagMarkup.js.map +0 -1
  1356. package/dist/node_modules/write-excel-file/modules/xml/getSelfClosingTagMarkup.js.map +0 -1
  1357. package/dist/node_modules/write-excel-file/modules/xml/insertElementMarkupAccordingToOrderOfSiblings.js.map +0 -1
  1358. package/dist/node_modules/write-excel-file/modules/xml/prependMarkupInsideElement.js.map +0 -1
  1359. package/dist/node_modules/write-excel-file/modules/xml/removeInvalidXmlCharacters.js.map +0 -1
  1360. package/dist/node_modules/write-excel-file/modules/xml/replaceElement.js.map +0 -1
  1361. package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeName.js.map +0 -1
  1362. package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeValue.js.map +0 -1
  1363. package/dist/node_modules/write-excel-file/modules/xml/sanitizeTextContent.js.map +0 -1
  1364. package/dist/node_modules/write-excel-file/modules/xml/setMarkupInsideElement.js.map +0 -1
  1365. package/dist/node_modules/write-excel-file/modules/zip/zipToArrayBuffer.js.map +0 -1
  1366. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +0 -1
  1367. package/dist/planmagnet/PlanMagnetRoot.js.map +0 -1
  1368. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +0 -1
  1369. package/dist/planmagnet/PlanMagnetRoutes.js.map +0 -1
  1370. package/dist/planmagnet/activity/activityDescribe.d.ts.map +0 -1
  1371. package/dist/planmagnet/activity/activityDescribe.js.map +0 -1
  1372. package/dist/planmagnet/activity/relativeTime.d.ts.map +0 -1
  1373. package/dist/planmagnet/activity/relativeTime.js.map +0 -1
  1374. package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +0 -1
  1375. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +0 -1
  1376. package/dist/planmagnet/automation/AutomationExecutionsPanel.d.ts.map +0 -1
  1377. package/dist/planmagnet/automation/AutomationExecutionsPanel.js.map +0 -1
  1378. package/dist/planmagnet/automation/AutomationRuleFields.d.ts.map +0 -1
  1379. package/dist/planmagnet/automation/AutomationRuleFields.js.map +0 -1
  1380. package/dist/planmagnet/automation/automationRuleTypes.d.ts.map +0 -1
  1381. package/dist/planmagnet/automation/automationRuleTypes.js.map +0 -1
  1382. package/dist/planmagnet/board/BoardViewBar.d.ts.map +0 -1
  1383. package/dist/planmagnet/board/BoardViewBar.js.map +0 -1
  1384. package/dist/planmagnet/board/BulkActions.d.ts.map +0 -1
  1385. package/dist/planmagnet/board/BulkActions.js.map +0 -1
  1386. package/dist/planmagnet/board/ProjectBoard.d.ts.map +0 -1
  1387. package/dist/planmagnet/board/ProjectBoard.js.map +0 -1
  1388. package/dist/planmagnet/board/boardViewConfig.d.ts.map +0 -1
  1389. package/dist/planmagnet/board/boardViewConfig.js.map +0 -1
  1390. package/dist/planmagnet/budgets/BudgetControls.d.ts.map +0 -1
  1391. package/dist/planmagnet/budgets/BudgetControls.js.map +0 -1
  1392. package/dist/planmagnet/budgets/ExpenseControls.d.ts.map +0 -1
  1393. package/dist/planmagnet/budgets/ExpenseControls.js.map +0 -1
  1394. package/dist/planmagnet/budgets/ProjectBudgetsSummary.d.ts.map +0 -1
  1395. package/dist/planmagnet/budgets/ProjectBudgetsSummary.js.map +0 -1
  1396. package/dist/planmagnet/budgets/budgetMath.d.ts.map +0 -1
  1397. package/dist/planmagnet/budgets/budgetMath.js.map +0 -1
  1398. package/dist/planmagnet/comments/CommentAttachmentUpload.d.ts.map +0 -1
  1399. package/dist/planmagnet/comments/CommentAttachmentUpload.js.map +0 -1
  1400. package/dist/planmagnet/comments/CommentAttachments.d.ts.map +0 -1
  1401. package/dist/planmagnet/comments/CommentAttachments.js.map +0 -1
  1402. package/dist/planmagnet/comments/CommentBody.d.ts.map +0 -1
  1403. package/dist/planmagnet/comments/CommentBody.js.map +0 -1
  1404. package/dist/planmagnet/comments/CommentThread.d.ts.map +0 -1
  1405. package/dist/planmagnet/comments/CommentThread.js.map +0 -1
  1406. package/dist/planmagnet/comments/MentionComposer.d.ts.map +0 -1
  1407. package/dist/planmagnet/comments/MentionComposer.js.map +0 -1
  1408. package/dist/planmagnet/comments/RoadmapComments.d.ts.map +0 -1
  1409. package/dist/planmagnet/comments/RoadmapComments.js.map +0 -1
  1410. package/dist/planmagnet/comments/TargetComments.d.ts.map +0 -1
  1411. package/dist/planmagnet/comments/TargetComments.js.map +0 -1
  1412. package/dist/planmagnet/comments/WorkItemActivity.d.ts.map +0 -1
  1413. package/dist/planmagnet/comments/WorkItemActivity.js.map +0 -1
  1414. package/dist/planmagnet/comments/WorkItemComments.d.ts.map +0 -1
  1415. package/dist/planmagnet/comments/WorkItemComments.js.map +0 -1
  1416. package/dist/planmagnet/comments/commentAttachmentUploadClient.d.ts.map +0 -1
  1417. package/dist/planmagnet/comments/commentAttachmentUploadClient.js.map +0 -1
  1418. package/dist/planmagnet/comments/commentImageTokens.d.ts.map +0 -1
  1419. package/dist/planmagnet/comments/commentImageTokens.js.map +0 -1
  1420. package/dist/planmagnet/comments/commentTokens.d.ts.map +0 -1
  1421. package/dist/planmagnet/comments/commentTokens.js.map +0 -1
  1422. package/dist/planmagnet/comments/fileDisplay.d.ts.map +0 -1
  1423. package/dist/planmagnet/comments/fileDisplay.js.map +0 -1
  1424. package/dist/planmagnet/comments/useCommentFileUrl.d.ts.map +0 -1
  1425. package/dist/planmagnet/comments/useCommentFileUrl.js.map +0 -1
  1426. package/dist/planmagnet/controls/AutomationRuleControls.d.ts.map +0 -1
  1427. package/dist/planmagnet/controls/AutomationRuleControls.js.map +0 -1
  1428. package/dist/planmagnet/controls/CompetitorControls.d.ts.map +0 -1
  1429. package/dist/planmagnet/controls/CompetitorControls.js.map +0 -1
  1430. package/dist/planmagnet/controls/ConfirmButton.d.ts.map +0 -1
  1431. package/dist/planmagnet/controls/ConfirmButton.js.map +0 -1
  1432. package/dist/planmagnet/controls/CustomFieldControls.d.ts.map +0 -1
  1433. package/dist/planmagnet/controls/CustomFieldControls.js.map +0 -1
  1434. package/dist/planmagnet/controls/CustomFieldValuesPanel.d.ts.map +0 -1
  1435. package/dist/planmagnet/controls/CustomFieldValuesPanel.js.map +0 -1
  1436. package/dist/planmagnet/controls/FeatureControls.d.ts.map +0 -1
  1437. package/dist/planmagnet/controls/FeatureControls.js.map +0 -1
  1438. package/dist/planmagnet/controls/FeatureTriage.d.ts.map +0 -1
  1439. package/dist/planmagnet/controls/FeatureTriage.js.map +0 -1
  1440. package/dist/planmagnet/controls/FeedbackControls.d.ts.map +0 -1
  1441. package/dist/planmagnet/controls/FeedbackControls.js.map +0 -1
  1442. package/dist/planmagnet/controls/LiveStatus.d.ts.map +0 -1
  1443. package/dist/planmagnet/controls/LiveStatus.js.map +0 -1
  1444. package/dist/planmagnet/controls/MilestoneControls.d.ts.map +0 -1
  1445. package/dist/planmagnet/controls/MilestoneControls.js.map +0 -1
  1446. package/dist/planmagnet/controls/ObjectiveControls.d.ts.map +0 -1
  1447. package/dist/planmagnet/controls/ObjectiveControls.js.map +0 -1
  1448. package/dist/planmagnet/controls/Pickers.d.ts.map +0 -1
  1449. package/dist/planmagnet/controls/Pickers.js.map +0 -1
  1450. package/dist/planmagnet/controls/PortfolioControls.d.ts.map +0 -1
  1451. package/dist/planmagnet/controls/PortfolioControls.js.map +0 -1
  1452. package/dist/planmagnet/controls/PrioritizationControls.d.ts.map +0 -1
  1453. package/dist/planmagnet/controls/PrioritizationControls.js.map +0 -1
  1454. package/dist/planmagnet/controls/ProgramControls.d.ts.map +0 -1
  1455. package/dist/planmagnet/controls/ProgramControls.js.map +0 -1
  1456. package/dist/planmagnet/controls/ProjectControls.d.ts.map +0 -1
  1457. package/dist/planmagnet/controls/ProjectControls.js.map +0 -1
  1458. package/dist/planmagnet/controls/QualityGateControls.d.ts.map +0 -1
  1459. package/dist/planmagnet/controls/QualityGateControls.js.map +0 -1
  1460. package/dist/planmagnet/controls/ReleaseControls.d.ts.map +0 -1
  1461. package/dist/planmagnet/controls/ReleaseControls.js.map +0 -1
  1462. package/dist/planmagnet/controls/RiskControls.d.ts.map +0 -1
  1463. package/dist/planmagnet/controls/RiskControls.js.map +0 -1
  1464. package/dist/planmagnet/controls/SyncControls.d.ts.map +0 -1
  1465. package/dist/planmagnet/controls/SyncControls.js.map +0 -1
  1466. package/dist/planmagnet/controls/TemplateControls.d.ts.map +0 -1
  1467. package/dist/planmagnet/controls/TemplateControls.js.map +0 -1
  1468. package/dist/planmagnet/controls/WebhookSubscriptionControls.d.ts.map +0 -1
  1469. package/dist/planmagnet/controls/WebhookSubscriptionControls.js.map +0 -1
  1470. package/dist/planmagnet/controls/WorkItemControls.d.ts.map +0 -1
  1471. package/dist/planmagnet/controls/WorkItemControls.js.map +0 -1
  1472. package/dist/planmagnet/create/CreateDialogs.d.ts.map +0 -1
  1473. package/dist/planmagnet/create/CreateDialogs.js.map +0 -1
  1474. package/dist/planmagnet/dashboards/DashboardUI.d.ts.map +0 -1
  1475. package/dist/planmagnet/dashboards/DashboardUI.js.map +0 -1
  1476. package/dist/planmagnet/dashboards/cards/DeliveryTimelineCard.d.ts.map +0 -1
  1477. package/dist/planmagnet/dashboards/cards/DeliveryTimelineCard.js.map +0 -1
  1478. package/dist/planmagnet/dashboards/cards/ObjectivesProgressCard.d.ts.map +0 -1
  1479. package/dist/planmagnet/dashboards/cards/ObjectivesProgressCard.js.map +0 -1
  1480. package/dist/planmagnet/dashboards/cards/PortfolioHealthCard.d.ts.map +0 -1
  1481. package/dist/planmagnet/dashboards/cards/PortfolioHealthCard.js.map +0 -1
  1482. package/dist/planmagnet/dashboards/cards/QualityMetricsCard.d.ts.map +0 -1
  1483. package/dist/planmagnet/dashboards/cards/QualityMetricsCard.js.map +0 -1
  1484. package/dist/planmagnet/dashboards/cards/RiskSeverityCard.d.ts.map +0 -1
  1485. package/dist/planmagnet/dashboards/cards/RiskSeverityCard.js.map +0 -1
  1486. package/dist/planmagnet/dashboards/cards/RoadmapHorizonCard.d.ts.map +0 -1
  1487. package/dist/planmagnet/dashboards/cards/RoadmapHorizonCard.js.map +0 -1
  1488. package/dist/planmagnet/dashboards/cards/SprintCapacityCard.d.ts.map +0 -1
  1489. package/dist/planmagnet/dashboards/cards/SprintCapacityCard.js.map +0 -1
  1490. package/dist/planmagnet/dashboards/cards/TaskCompletionCard.d.ts.map +0 -1
  1491. package/dist/planmagnet/dashboards/cards/TaskCompletionCard.js.map +0 -1
  1492. package/dist/planmagnet/dashboards/cards/TeamCapacityCard.d.ts.map +0 -1
  1493. package/dist/planmagnet/dashboards/cards/TeamCapacityCard.js.map +0 -1
  1494. package/dist/planmagnet/dashboards/cards/TeamOverviewCard.d.ts.map +0 -1
  1495. package/dist/planmagnet/dashboards/cards/TeamOverviewCard.js.map +0 -1
  1496. package/dist/planmagnet/dashboards/cards/TeamWorkloadCard.d.ts.map +0 -1
  1497. package/dist/planmagnet/dashboards/cards/TeamWorkloadCard.js.map +0 -1
  1498. package/dist/planmagnet/dashboards/cards/TimeLoggedCard.d.ts.map +0 -1
  1499. package/dist/planmagnet/dashboards/cards/TimeLoggedCard.js.map +0 -1
  1500. package/dist/planmagnet/dependency/DependencyGraph.d.ts.map +0 -1
  1501. package/dist/planmagnet/dependency/DependencyGraph.js.map +0 -1
  1502. package/dist/planmagnet/dependency/DependencyPanel.d.ts.map +0 -1
  1503. package/dist/planmagnet/dependency/DependencyPanel.js.map +0 -1
  1504. package/dist/planmagnet/dependency/GanttChart.d.ts.map +0 -1
  1505. package/dist/planmagnet/dependency/GanttChart.js.map +0 -1
  1506. package/dist/planmagnet/dependency/useProjectWorkItemsGraph.d.ts.map +0 -1
  1507. package/dist/planmagnet/dependency/useProjectWorkItemsGraph.js.map +0 -1
  1508. package/dist/planmagnet/discussion/WorkItemDiscussionPanel.d.ts.map +0 -1
  1509. package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js.map +0 -1
  1510. package/dist/planmagnet/docs/DocDiffView.d.ts.map +0 -1
  1511. package/dist/planmagnet/docs/DocDiffView.js.map +0 -1
  1512. package/dist/planmagnet/docs/DocStatusBadge.d.ts.map +0 -1
  1513. package/dist/planmagnet/docs/DocStatusBadge.js.map +0 -1
  1514. package/dist/planmagnet/docs/DocSuggestionsPanel.d.ts.map +0 -1
  1515. package/dist/planmagnet/docs/DocSuggestionsPanel.js.map +0 -1
  1516. package/dist/planmagnet/docs/DocVersionCompare.d.ts.map +0 -1
  1517. package/dist/planmagnet/docs/DocVersionCompare.js.map +0 -1
  1518. package/dist/planmagnet/export/ExportWorkItemsButton.d.ts.map +0 -1
  1519. package/dist/planmagnet/export/ExportWorkItemsButton.js.map +0 -1
  1520. package/dist/planmagnet/export/workItemsCsv.d.ts.map +0 -1
  1521. package/dist/planmagnet/export/workItemsCsv.js.map +0 -1
  1522. package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts.map +0 -1
  1523. package/dist/planmagnet/forecast/DeliveryForecastCard.js.map +0 -1
  1524. package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts.map +0 -1
  1525. package/dist/planmagnet/forecast/ProjectOutlookCard.js.map +0 -1
  1526. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts.map +0 -1
  1527. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js.map +0 -1
  1528. package/dist/planmagnet/forecast/ResourceForecastCard.d.ts.map +0 -1
  1529. package/dist/planmagnet/forecast/ResourceForecastCard.js.map +0 -1
  1530. package/dist/planmagnet/forecast/riskFlags.d.ts.map +0 -1
  1531. package/dist/planmagnet/forecast/riskFlags.js.map +0 -1
  1532. package/dist/planmagnet/hooks/useCounts.d.ts.map +0 -1
  1533. package/dist/planmagnet/hooks/useCounts.js.map +0 -1
  1534. package/dist/planmagnet/hooks/useEntityId.d.ts.map +0 -1
  1535. package/dist/planmagnet/hooks/useEntityId.js.map +0 -1
  1536. package/dist/planmagnet/hooks/useLiveRefresh.d.ts.map +0 -1
  1537. package/dist/planmagnet/hooks/useLiveRefresh.js.map +0 -1
  1538. package/dist/planmagnet/hooks/usePresence.d.ts.map +0 -1
  1539. package/dist/planmagnet/hooks/usePresence.js.map +0 -1
  1540. package/dist/planmagnet/hooks/useProjectWorkflow.d.ts.map +0 -1
  1541. package/dist/planmagnet/hooks/useProjectWorkflow.js.map +0 -1
  1542. package/dist/planmagnet/import/exportColumns.d.ts.map +0 -1
  1543. package/dist/planmagnet/import/exportColumns.js.map +0 -1
  1544. package/dist/planmagnet/index.d.ts.map +0 -1
  1545. package/dist/planmagnet/integrations/routes.d.ts.map +0 -1
  1546. package/dist/planmagnet/integrations/routes.js.map +0 -1
  1547. package/dist/planmagnet/integrations/syncTypes.d.ts.map +0 -1
  1548. package/dist/planmagnet/integrations/syncTypes.js.map +0 -1
  1549. package/dist/planmagnet/integrations/useSyncProviderCapabilities.d.ts.map +0 -1
  1550. package/dist/planmagnet/integrations/useSyncProviderCapabilities.js.map +0 -1
  1551. package/dist/planmagnet/links/CodeLinksPanel.d.ts.map +0 -1
  1552. package/dist/planmagnet/links/CodeLinksPanel.js.map +0 -1
  1553. package/dist/planmagnet/links/IssueLinksPanel.d.ts.map +0 -1
  1554. package/dist/planmagnet/links/IssueLinksPanel.js.map +0 -1
  1555. package/dist/planmagnet/meetings/MeetingActionItemsPanel.d.ts.map +0 -1
  1556. package/dist/planmagnet/meetings/MeetingActionItemsPanel.js.map +0 -1
  1557. package/dist/planmagnet/meetings/MeetingsCard.d.ts.map +0 -1
  1558. package/dist/planmagnet/meetings/MeetingsCard.js.map +0 -1
  1559. package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.d.ts.map +0 -1
  1560. package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js.map +0 -1
  1561. package/dist/planmagnet/meetings/ScheduleMeetingDialog.d.ts.map +0 -1
  1562. package/dist/planmagnet/meetings/ScheduleMeetingDialog.js.map +0 -1
  1563. package/dist/planmagnet/meetings/UnlinkMeetingDialog.d.ts.map +0 -1
  1564. package/dist/planmagnet/meetings/UnlinkMeetingDialog.js.map +0 -1
  1565. package/dist/planmagnet/meetings/meetingActions.d.ts.map +0 -1
  1566. package/dist/planmagnet/meetings/meetingActions.js.map +0 -1
  1567. package/dist/planmagnet/meetings/meetingGraphql.d.ts.map +0 -1
  1568. package/dist/planmagnet/meetings/meetingGraphql.js.map +0 -1
  1569. package/dist/planmagnet/meetings/meetingModel.d.ts.map +0 -1
  1570. package/dist/planmagnet/meetings/meetingModel.js.map +0 -1
  1571. package/dist/planmagnet/milestones/MilestoneControls.d.ts.map +0 -1
  1572. package/dist/planmagnet/milestones/MilestoneControls.js.map +0 -1
  1573. package/dist/planmagnet/pages/ActivityActivityPagePage.d.ts.map +0 -1
  1574. package/dist/planmagnet/pages/ActivityActivityPagePage.js.map +0 -1
  1575. package/dist/planmagnet/pages/AiActivityPagePage.d.ts.map +0 -1
  1576. package/dist/planmagnet/pages/AiActivityPagePage.js.map +0 -1
  1577. package/dist/planmagnet/pages/AiPlanPagePage.d.ts.map +0 -1
  1578. package/dist/planmagnet/pages/AiPlanPagePage.js.map +0 -1
  1579. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +0 -1
  1580. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +0 -1
  1581. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.d.ts.map +0 -1
  1582. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js.map +0 -1
  1583. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.d.ts.map +0 -1
  1584. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js.map +0 -1
  1585. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.d.ts.map +0 -1
  1586. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js.map +0 -1
  1587. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts.map +0 -1
  1588. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js.map +0 -1
  1589. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts.map +0 -1
  1590. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js.map +0 -1
  1591. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts.map +0 -1
  1592. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js.map +0 -1
  1593. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts.map +0 -1
  1594. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js.map +0 -1
  1595. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +0 -1
  1596. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +0 -1
  1597. package/dist/planmagnet/pages/DashboardsExecutivePagePage.d.ts.map +0 -1
  1598. package/dist/planmagnet/pages/DashboardsExecutivePagePage.js.map +0 -1
  1599. package/dist/planmagnet/pages/DashboardsLeadershipPagePage.d.ts.map +0 -1
  1600. package/dist/planmagnet/pages/DashboardsLeadershipPagePage.js.map +0 -1
  1601. package/dist/planmagnet/pages/DashboardsProjectManagerPagePage.d.ts.map +0 -1
  1602. package/dist/planmagnet/pages/DashboardsProjectManagerPagePage.js.map +0 -1
  1603. package/dist/planmagnet/pages/DashboardsTeamUtilizationPagePage.d.ts.map +0 -1
  1604. package/dist/planmagnet/pages/DashboardsTeamUtilizationPagePage.js.map +0 -1
  1605. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +0 -1
  1606. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +0 -1
  1607. package/dist/planmagnet/pages/DocsDocsPagePage.d.ts.map +0 -1
  1608. package/dist/planmagnet/pages/DocsDocsPagePage.js.map +0 -1
  1609. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.d.ts.map +0 -1
  1610. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js.map +0 -1
  1611. package/dist/planmagnet/pages/GoalsGoalsPagePage.d.ts.map +0 -1
  1612. package/dist/planmagnet/pages/GoalsGoalsPagePage.js.map +0 -1
  1613. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +0 -1
  1614. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +0 -1
  1615. package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.d.ts.map +0 -1
  1616. package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js.map +0 -1
  1617. package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.d.ts.map +0 -1
  1618. package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.js.map +0 -1
  1619. package/dist/planmagnet/pages/IntegrationsSyncsPagePage.d.ts.map +0 -1
  1620. package/dist/planmagnet/pages/IntegrationsSyncsPagePage.js.map +0 -1
  1621. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.d.ts.map +0 -1
  1622. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.js.map +0 -1
  1623. package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.d.ts.map +0 -1
  1624. package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js.map +0 -1
  1625. package/dist/planmagnet/pages/MeetingsMeetingsPagePage.d.ts.map +0 -1
  1626. package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js.map +0 -1
  1627. package/dist/planmagnet/pages/NotFoundPage.d.ts.map +0 -1
  1628. package/dist/planmagnet/pages/NotFoundPage.js.map +0 -1
  1629. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts.map +0 -1
  1630. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js.map +0 -1
  1631. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts.map +0 -1
  1632. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js.map +0 -1
  1633. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +0 -1
  1634. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +0 -1
  1635. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts.map +0 -1
  1636. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js.map +0 -1
  1637. package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +0 -1
  1638. package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +0 -1
  1639. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +0 -1
  1640. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +0 -1
  1641. package/dist/planmagnet/pages/ProductsCustomerSatisfactionPagePage.d.ts.map +0 -1
  1642. package/dist/planmagnet/pages/ProductsCustomerSatisfactionPagePage.js.map +0 -1
  1643. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +0 -1
  1644. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +0 -1
  1645. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +0 -1
  1646. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +0 -1
  1647. package/dist/planmagnet/pages/ProductsEditRoadmapPagePage.d.ts.map +0 -1
  1648. package/dist/planmagnet/pages/ProductsEditRoadmapPagePage.js.map +0 -1
  1649. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts.map +0 -1
  1650. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +0 -1
  1651. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +0 -1
  1652. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +0 -1
  1653. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +0 -1
  1654. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +0 -1
  1655. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +0 -1
  1656. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +0 -1
  1657. package/dist/planmagnet/pages/ProductsPrioritizationPagePage.d.ts.map +0 -1
  1658. package/dist/planmagnet/pages/ProductsPrioritizationPagePage.js.map +0 -1
  1659. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +0 -1
  1660. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +0 -1
  1661. package/dist/planmagnet/pages/ProductsProductFeatureDetailPagePage.d.ts.map +0 -1
  1662. package/dist/planmagnet/pages/ProductsProductFeatureDetailPagePage.js.map +0 -1
  1663. package/dist/planmagnet/pages/ProductsProductHierarchyPagePage.d.ts.map +0 -1
  1664. package/dist/planmagnet/pages/ProductsProductHierarchyPagePage.js.map +0 -1
  1665. package/dist/planmagnet/pages/ProductsProductLinesPagePage.d.ts.map +0 -1
  1666. package/dist/planmagnet/pages/ProductsProductLinesPagePage.js.map +0 -1
  1667. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +0 -1
  1668. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +0 -1
  1669. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +0 -1
  1670. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +0 -1
  1671. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +0 -1
  1672. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +0 -1
  1673. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +0 -1
  1674. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +0 -1
  1675. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +0 -1
  1676. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +0 -1
  1677. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +0 -1
  1678. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +0 -1
  1679. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts.map +0 -1
  1680. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js.map +0 -1
  1681. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts.map +0 -1
  1682. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js.map +0 -1
  1683. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts.map +0 -1
  1684. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js.map +0 -1
  1685. package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts.map +0 -1
  1686. package/dist/planmagnet/pages/ProgramsProgramsPagePage.js.map +0 -1
  1687. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +0 -1
  1688. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +0 -1
  1689. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts.map +0 -1
  1690. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js.map +0 -1
  1691. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.d.ts.map +0 -1
  1692. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js.map +0 -1
  1693. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.d.ts.map +0 -1
  1694. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js.map +0 -1
  1695. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +0 -1
  1696. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +0 -1
  1697. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.d.ts.map +0 -1
  1698. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js.map +0 -1
  1699. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.d.ts.map +0 -1
  1700. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js.map +0 -1
  1701. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +0 -1
  1702. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +0 -1
  1703. package/dist/planmagnet/pages/ProjectsGanttPagePage.d.ts.map +0 -1
  1704. package/dist/planmagnet/pages/ProjectsGanttPagePage.js.map +0 -1
  1705. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +0 -1
  1706. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +0 -1
  1707. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +0 -1
  1708. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +0 -1
  1709. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +0 -1
  1710. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +0 -1
  1711. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +0 -1
  1712. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +0 -1
  1713. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +0 -1
  1714. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +0 -1
  1715. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +0 -1
  1716. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +0 -1
  1717. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +0 -1
  1718. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +0 -1
  1719. package/dist/planmagnet/pages/ProjectsQualityGatesPagePage.d.ts.map +0 -1
  1720. package/dist/planmagnet/pages/ProjectsQualityGatesPagePage.js.map +0 -1
  1721. package/dist/planmagnet/pages/ProjectsWorkflowPagePage.d.ts.map +0 -1
  1722. package/dist/planmagnet/pages/ProjectsWorkflowPagePage.js.map +0 -1
  1723. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts.map +0 -1
  1724. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js.map +0 -1
  1725. package/dist/planmagnet/pages/ReportsEditReportPagePage.d.ts.map +0 -1
  1726. package/dist/planmagnet/pages/ReportsEditReportPagePage.js.map +0 -1
  1727. package/dist/planmagnet/pages/ReportsReportPagePage.d.ts.map +0 -1
  1728. package/dist/planmagnet/pages/ReportsReportPagePage.js.map +0 -1
  1729. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +0 -1
  1730. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +0 -1
  1731. package/dist/planmagnet/pages/RisksRiskDetailPagePage.d.ts.map +0 -1
  1732. package/dist/planmagnet/pages/RisksRiskDetailPagePage.js.map +0 -1
  1733. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.d.ts.map +0 -1
  1734. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js.map +0 -1
  1735. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +0 -1
  1736. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +0 -1
  1737. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +0 -1
  1738. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +0 -1
  1739. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +0 -1
  1740. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +0 -1
  1741. package/dist/planmagnet/pages/TasksImportPagePage.d.ts.map +0 -1
  1742. package/dist/planmagnet/pages/TasksImportPagePage.js.map +0 -1
  1743. package/dist/planmagnet/pages/TasksMyDashboardPagePage.d.ts.map +0 -1
  1744. package/dist/planmagnet/pages/TasksMyDashboardPagePage.js.map +0 -1
  1745. package/dist/planmagnet/pages/TasksMyWorkPagePage.d.ts.map +0 -1
  1746. package/dist/planmagnet/pages/TasksMyWorkPagePage.js.map +0 -1
  1747. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +0 -1
  1748. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +0 -1
  1749. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +0 -1
  1750. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +0 -1
  1751. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.d.ts.map +0 -1
  1752. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js.map +0 -1
  1753. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.d.ts.map +0 -1
  1754. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js.map +0 -1
  1755. package/dist/planmagnet/pages/TasksTimesheetsPagePage.d.ts.map +0 -1
  1756. package/dist/planmagnet/pages/TasksTimesheetsPagePage.js.map +0 -1
  1757. package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts.map +0 -1
  1758. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js.map +0 -1
  1759. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +0 -1
  1760. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +0 -1
  1761. package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts.map +0 -1
  1762. package/dist/planmagnet/pages/TeamTeamDetailPagePage.js.map +0 -1
  1763. package/dist/planmagnet/pages/TeamTeamEditPagePage.d.ts.map +0 -1
  1764. package/dist/planmagnet/pages/TeamTeamEditPagePage.js.map +0 -1
  1765. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +0 -1
  1766. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +0 -1
  1767. package/dist/planmagnet/pages/TeamTeamsListPagePage.d.ts.map +0 -1
  1768. package/dist/planmagnet/pages/TeamTeamsListPagePage.js.map +0 -1
  1769. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.d.ts.map +0 -1
  1770. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js.map +0 -1
  1771. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.d.ts.map +0 -1
  1772. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js.map +0 -1
  1773. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +0 -1
  1774. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +0 -1
  1775. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +0 -1
  1776. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +0 -1
  1777. package/dist/planmagnet/pages/analytics/DeliveryKpisCard.d.ts.map +0 -1
  1778. package/dist/planmagnet/pages/analytics/DeliveryKpisCard.js.map +0 -1
  1779. package/dist/planmagnet/pages/analytics/MetricsCard.d.ts.map +0 -1
  1780. package/dist/planmagnet/pages/analytics/MetricsCard.js.map +0 -1
  1781. package/dist/planmagnet/pages/analytics/QualityMetricsCard.d.ts.map +0 -1
  1782. package/dist/planmagnet/pages/analytics/QualityMetricsCard.js.map +0 -1
  1783. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.d.ts.map +0 -1
  1784. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js.map +0 -1
  1785. package/dist/planmagnet/pages/analytics/StatusFlowCard.d.ts.map +0 -1
  1786. package/dist/planmagnet/pages/analytics/StatusFlowCard.js.map +0 -1
  1787. package/dist/planmagnet/pages/analytics/ThroughputCard.d.ts.map +0 -1
  1788. package/dist/planmagnet/pages/analytics/ThroughputCard.js.map +0 -1
  1789. package/dist/planmagnet/pages/analytics/WorkBreakdownCard.d.ts.map +0 -1
  1790. package/dist/planmagnet/pages/analytics/WorkBreakdownCard.js.map +0 -1
  1791. package/dist/planmagnet/pages/analytics/analyticsRange.d.ts.map +0 -1
  1792. package/dist/planmagnet/pages/analytics/analyticsRange.js.map +0 -1
  1793. package/dist/planmagnet/people/People.d.ts.map +0 -1
  1794. package/dist/planmagnet/people/People.js.map +0 -1
  1795. package/dist/planmagnet/presence/PresenceAvatars.d.ts.map +0 -1
  1796. package/dist/planmagnet/presence/PresenceAvatars.js.map +0 -1
  1797. package/dist/planmagnet/product/FeatureLinkPanels.d.ts.map +0 -1
  1798. package/dist/planmagnet/product/FeatureLinkPanels.js.map +0 -1
  1799. package/dist/planmagnet/product/ProductControls.d.ts.map +0 -1
  1800. package/dist/planmagnet/product/ProductControls.js.map +0 -1
  1801. package/dist/planmagnet/product/ProductFeatureControls.d.ts.map +0 -1
  1802. package/dist/planmagnet/product/ProductFeatureControls.js.map +0 -1
  1803. package/dist/planmagnet/product/ProductFeatureLinkCard.d.ts.map +0 -1
  1804. package/dist/planmagnet/product/ProductFeatureLinkCard.js.map +0 -1
  1805. package/dist/planmagnet/product/ProductLineControls.d.ts.map +0 -1
  1806. package/dist/planmagnet/product/ProductLineControls.js.map +0 -1
  1807. package/dist/planmagnet/product/ProductTeamsPanel.d.ts.map +0 -1
  1808. package/dist/planmagnet/product/ProductTeamsPanel.js.map +0 -1
  1809. package/dist/planmagnet/product/WorkItemProductFeatureChip.d.ts.map +0 -1
  1810. package/dist/planmagnet/product/WorkItemProductFeatureChip.js.map +0 -1
  1811. package/dist/planmagnet/product/hierarchy.d.ts.map +0 -1
  1812. package/dist/planmagnet/product/hierarchy.js.map +0 -1
  1813. package/dist/planmagnet/product/hierarchyOperations.d.ts.map +0 -1
  1814. package/dist/planmagnet/product/hierarchyOperations.js.map +0 -1
  1815. package/dist/planmagnet/product/refusal.d.ts.map +0 -1
  1816. package/dist/planmagnet/product/refusal.js.map +0 -1
  1817. package/dist/planmagnet/product/routes.d.ts.map +0 -1
  1818. package/dist/planmagnet/product/routes.js.map +0 -1
  1819. package/dist/planmagnet/providers/PlanMagnetProvider.d.ts.map +0 -1
  1820. package/dist/planmagnet/providers/PlanMagnetProvider.js.map +0 -1
  1821. package/dist/planmagnet/releases/ReleaseChecklistCard.d.ts.map +0 -1
  1822. package/dist/planmagnet/releases/ReleaseChecklistCard.js.map +0 -1
  1823. package/dist/planmagnet/releases/ReleaseGatesCard.d.ts.map +0 -1
  1824. package/dist/planmagnet/releases/ReleaseGatesCard.js.map +0 -1
  1825. package/dist/planmagnet/releases/ReleaseNotesCard.d.ts.map +0 -1
  1826. package/dist/planmagnet/releases/ReleaseNotesCard.js.map +0 -1
  1827. package/dist/planmagnet/releases/ReleaseReadinessCard.d.ts.map +0 -1
  1828. package/dist/planmagnet/releases/ReleaseReadinessCard.js.map +0 -1
  1829. package/dist/planmagnet/releases/ReleaseWorkItemsCard.d.ts.map +0 -1
  1830. package/dist/planmagnet/releases/ReleaseWorkItemsCard.js.map +0 -1
  1831. package/dist/planmagnet/releases/useReleaseOptions.d.ts.map +0 -1
  1832. package/dist/planmagnet/releases/useReleaseOptions.js.map +0 -1
  1833. package/dist/planmagnet/reports/ExportMenu.d.ts.map +0 -1
  1834. package/dist/planmagnet/reports/ExportMenu.js.map +0 -1
  1835. package/dist/planmagnet/reports/PrintReportView.d.ts.map +0 -1
  1836. package/dist/planmagnet/reports/PrintReportView.js.map +0 -1
  1837. package/dist/planmagnet/reports/ReportBuilderCanvas.d.ts.map +0 -1
  1838. package/dist/planmagnet/reports/ReportBuilderCanvas.js.map +0 -1
  1839. package/dist/planmagnet/reports/ReportBuilderPage.d.ts.map +0 -1
  1840. package/dist/planmagnet/reports/ReportBuilderPage.js.map +0 -1
  1841. package/dist/planmagnet/reports/ReportRunHistory.d.ts.map +0 -1
  1842. package/dist/planmagnet/reports/ReportRunHistory.js.map +0 -1
  1843. package/dist/planmagnet/reports/ReportWidgetRenderer.d.ts.map +0 -1
  1844. package/dist/planmagnet/reports/ReportWidgetRenderer.js.map +0 -1
  1845. package/dist/planmagnet/reports/SchedulesPanel.d.ts.map +0 -1
  1846. package/dist/planmagnet/reports/SchedulesPanel.js.map +0 -1
  1847. package/dist/planmagnet/reports/ShareDialog.d.ts.map +0 -1
  1848. package/dist/planmagnet/reports/ShareDialog.js.map +0 -1
  1849. package/dist/planmagnet/reports/SharedReportPage.d.ts.map +0 -1
  1850. package/dist/planmagnet/reports/SharedReportPage.js.map +0 -1
  1851. package/dist/planmagnet/reports/WidgetEditorDialog.d.ts.map +0 -1
  1852. package/dist/planmagnet/reports/WidgetEditorDialog.js.map +0 -1
  1853. package/dist/planmagnet/reports/reportExportPptx.d.ts.map +0 -1
  1854. package/dist/planmagnet/reports/reportExportPptx.js.map +0 -1
  1855. package/dist/planmagnet/reports/reportExportXlsx.d.ts.map +0 -1
  1856. package/dist/planmagnet/reports/reportExportXlsx.js.map +0 -1
  1857. package/dist/planmagnet/reports/reportGraphql.d.ts.map +0 -1
  1858. package/dist/planmagnet/reports/reportGraphql.js.map +0 -1
  1859. package/dist/planmagnet/reports/reportModel.d.ts.map +0 -1
  1860. package/dist/planmagnet/reports/reportModel.js.map +0 -1
  1861. package/dist/planmagnet/reports/sharedReportRoute.d.ts.map +0 -1
  1862. package/dist/planmagnet/reports/sharedReportRoute.js.map +0 -1
  1863. package/dist/planmagnet/roadmaps/FeatureInitiativeCard.d.ts.map +0 -1
  1864. package/dist/planmagnet/roadmaps/FeatureInitiativeCard.js.map +0 -1
  1865. package/dist/planmagnet/roadmaps/RoadmapControls.d.ts.map +0 -1
  1866. package/dist/planmagnet/roadmaps/RoadmapControls.js.map +0 -1
  1867. package/dist/planmagnet/roadmaps/RoadmapNowNextLater.d.ts.map +0 -1
  1868. package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js.map +0 -1
  1869. package/dist/planmagnet/roadmaps/RoadmapPresentation.d.ts.map +0 -1
  1870. package/dist/planmagnet/roadmaps/RoadmapPresentation.js.map +0 -1
  1871. package/dist/planmagnet/roadmaps/RoadmapReviewPanel.d.ts.map +0 -1
  1872. package/dist/planmagnet/roadmaps/RoadmapReviewPanel.js.map +0 -1
  1873. package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.d.ts.map +0 -1
  1874. package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.js.map +0 -1
  1875. package/dist/planmagnet/roadmaps/planningFocus.d.ts.map +0 -1
  1876. package/dist/planmagnet/roadmaps/planningFocus.js.map +0 -1
  1877. package/dist/planmagnet/satisfaction/DeliverySatisfactionSection.d.ts.map +0 -1
  1878. package/dist/planmagnet/satisfaction/DeliverySatisfactionSection.js.map +0 -1
  1879. package/dist/planmagnet/satisfaction/SatisfactionFigures.d.ts.map +0 -1
  1880. package/dist/planmagnet/satisfaction/SatisfactionFigures.js.map +0 -1
  1881. package/dist/planmagnet/satisfaction/SatisfactionImportDialog.d.ts.map +0 -1
  1882. package/dist/planmagnet/satisfaction/SatisfactionImportDialog.js.map +0 -1
  1883. package/dist/planmagnet/satisfaction/SatisfactionLinkFields.d.ts.map +0 -1
  1884. package/dist/planmagnet/satisfaction/SatisfactionLinkFields.js.map +0 -1
  1885. package/dist/planmagnet/satisfaction/SatisfactionReleaseSelect.d.ts.map +0 -1
  1886. package/dist/planmagnet/satisfaction/SatisfactionReleaseSelect.js.map +0 -1
  1887. package/dist/planmagnet/satisfaction/SatisfactionResponseDialog.d.ts.map +0 -1
  1888. package/dist/planmagnet/satisfaction/SatisfactionResponseDialog.js.map +0 -1
  1889. package/dist/planmagnet/satisfaction/SatisfactionResponsesTable.d.ts.map +0 -1
  1890. package/dist/planmagnet/satisfaction/SatisfactionResponsesTable.js.map +0 -1
  1891. package/dist/planmagnet/satisfaction/SatisfactionSummaryCard.d.ts.map +0 -1
  1892. package/dist/planmagnet/satisfaction/SatisfactionSummaryCard.js.map +0 -1
  1893. package/dist/planmagnet/satisfaction/SatisfactionWindowPicker.d.ts.map +0 -1
  1894. package/dist/planmagnet/satisfaction/SatisfactionWindowPicker.js.map +0 -1
  1895. package/dist/planmagnet/satisfaction/satisfaction.d.ts.map +0 -1
  1896. package/dist/planmagnet/satisfaction/satisfaction.js.map +0 -1
  1897. package/dist/planmagnet/satisfaction/satisfactionCsv.d.ts.map +0 -1
  1898. package/dist/planmagnet/satisfaction/satisfactionCsv.js.map +0 -1
  1899. package/dist/planmagnet/satisfaction/satisfactionForm.d.ts.map +0 -1
  1900. package/dist/planmagnet/satisfaction/satisfactionForm.js.map +0 -1
  1901. package/dist/planmagnet/satisfaction/satisfactionOperations.d.ts.map +0 -1
  1902. package/dist/planmagnet/satisfaction/satisfactionOperations.js.map +0 -1
  1903. package/dist/planmagnet/satisfaction/useSatisfactionAccess.d.ts.map +0 -1
  1904. package/dist/planmagnet/satisfaction/useSatisfactionAccess.js.map +0 -1
  1905. package/dist/planmagnet/skills/RequiredSkillsEditor.d.ts.map +0 -1
  1906. package/dist/planmagnet/skills/RequiredSkillsEditor.js.map +0 -1
  1907. package/dist/planmagnet/skills/SkillChips.d.ts.map +0 -1
  1908. package/dist/planmagnet/skills/SkillChips.js.map +0 -1
  1909. package/dist/planmagnet/skills/SkillCoverageCard.d.ts.map +0 -1
  1910. package/dist/planmagnet/skills/SkillCoverageCard.js.map +0 -1
  1911. package/dist/planmagnet/skills/WorkItemRequiredSkills.d.ts.map +0 -1
  1912. package/dist/planmagnet/skills/WorkItemRequiredSkills.js.map +0 -1
  1913. package/dist/planmagnet/skills/skillOperations.d.ts.map +0 -1
  1914. package/dist/planmagnet/skills/skillOperations.js.map +0 -1
  1915. package/dist/planmagnet/skills/skillTags.d.ts.map +0 -1
  1916. package/dist/planmagnet/skills/skillTags.js.map +0 -1
  1917. package/dist/planmagnet/skills/useRequiredSkillsDraft.d.ts.map +0 -1
  1918. package/dist/planmagnet/skills/useRequiredSkillsDraft.js.map +0 -1
  1919. package/dist/planmagnet/sprints/SprintControls.d.ts.map +0 -1
  1920. package/dist/planmagnet/sprints/SprintControls.js.map +0 -1
  1921. package/dist/planmagnet/sprints/SprintDates.d.ts.map +0 -1
  1922. package/dist/planmagnet/sprints/SprintDates.js.map +0 -1
  1923. package/dist/planmagnet/store/planmagnetStore.d.ts.map +0 -1
  1924. package/dist/planmagnet/store/planmagnetStore.js.map +0 -1
  1925. package/dist/planmagnet/team/PendingInvitations.d.ts.map +0 -1
  1926. package/dist/planmagnet/team/PendingInvitations.js.map +0 -1
  1927. package/dist/planmagnet/team/TeamControls.d.ts.map +0 -1
  1928. package/dist/planmagnet/team/TeamControls.js.map +0 -1
  1929. package/dist/planmagnet/team/UnmatchedCrewIdentities.d.ts.map +0 -1
  1930. package/dist/planmagnet/team/UnmatchedCrewIdentities.js.map +0 -1
  1931. package/dist/planmagnet/team/invitationEmail.d.ts.map +0 -1
  1932. package/dist/planmagnet/team/invitationEmail.js.map +0 -1
  1933. package/dist/planmagnet/time/TaskTimePanel.d.ts.map +0 -1
  1934. package/dist/planmagnet/time/TaskTimePanel.js.map +0 -1
  1935. package/dist/planmagnet/time/TimeEntryControls.d.ts.map +0 -1
  1936. package/dist/planmagnet/time/TimeEntryControls.js.map +0 -1
  1937. package/dist/planmagnet/time/TimesheetControls.d.ts.map +0 -1
  1938. package/dist/planmagnet/time/TimesheetControls.js.map +0 -1
  1939. package/dist/planmagnet/time/timeShared.d.ts.map +0 -1
  1940. package/dist/planmagnet/time/timeShared.js.map +0 -1
  1941. package/dist/planmagnet/types/index.d.ts.map +0 -1
  1942. package/dist/planmagnet/utils/cn.d.ts.map +0 -1
  1943. package/dist/planmagnet/utils/cn.js.map +0 -1
  1944. package/dist/planmagnet/utils/email.d.ts.map +0 -1
  1945. package/dist/planmagnet/utils/email.js.map +0 -1
  1946. package/dist/planmagnet/utils/formValidation.d.ts.map +0 -1
  1947. package/dist/planmagnet/utils/formValidation.js.map +0 -1
  1948. package/dist/planmagnet/utils/graphqlErrors.d.ts.map +0 -1
  1949. package/dist/planmagnet/utils/graphqlErrors.js.map +0 -1
  1950. package/dist/planmagnet/utils/lineDiff.d.ts.map +0 -1
  1951. package/dist/planmagnet/utils/lineDiff.js.map +0 -1
  1952. package/dist/planmagnet/utils/mutationResult.d.ts.map +0 -1
  1953. package/dist/planmagnet/utils/mutationResult.js.map +0 -1
  1954. package/dist/planmagnet/utils/navigation.d.ts.map +0 -1
  1955. package/dist/planmagnet/utils/navigation.js.map +0 -1
  1956. package/dist/planmagnet/utils/qualityGateCriteria.d.ts.map +0 -1
  1957. package/dist/planmagnet/utils/qualityGateCriteria.js.map +0 -1
  1958. package/dist/planmagnet/utils/rowNavigation.d.ts.map +0 -1
  1959. package/dist/planmagnet/utils/rowNavigation.js.map +0 -1
  1960. package/dist/planmagnet/utils/statusColor.d.ts.map +0 -1
  1961. package/dist/planmagnet/utils/statusColor.js.map +0 -1
  1962. package/dist/planmagnet/utils/urlParam.d.ts.map +0 -1
  1963. package/dist/planmagnet/utils/urlParam.js.map +0 -1
  1964. package/dist/planmagnet/webhooks/webhookTypes.d.ts.map +0 -1
  1965. package/dist/planmagnet/webhooks/webhookTypes.js.map +0 -1
  1966. package/dist/shared/hooks/useTr.d.ts.map +0 -1
  1967. package/dist/shared/hooks/useTr.js.map +0 -1
  1968. package/dist/shared/utils/i18n.d.ts.map +0 -1
  1969. package/dist/shared/utils/i18n.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"BudgetControls.js","names":[],"sources":["../../../src/planmagnet/budgets/BudgetControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport {\n Button,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle2, Pencil, Plus, Trash2 } from 'lucide-react';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { ProjectSelect } from '../controls/Pickers';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from '../controls/ConfirmButton';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { toDateInputValue } from '../time/timeShared';\n\n/**\n * Budget controls (BOFF-8047): create a budget, edit it, approve it, delete it.\n *\n * Approval is its own mutation (`planmagnetApproveBudget`), not a plain status change: it is the only write\n * that records who approved a budget and when (`approverId`/`approvedAt` — the service's `approve()`, unlike\n * `update()`, sets both). The status select below therefore never offers APPROVED as a target; moving to it\n * goes through the Approve button so that audit trail is never silently skipped.\n */\n\nexport const BUDGET_STATUSES = ['DRAFT', 'ACTIVE', 'APPROVED', 'EXCEEDED', 'CLOSED'] as const;\n/** Selectable directly. APPROVED is reached only through the dedicated Approve action (see above). */\nconst SELECTABLE_STATUSES = BUDGET_STATUSES.filter((s) => s !== 'APPROVED');\n\nconst BUDGET_QUERIES = [\n 'BudgetsList',\n 'GetBudget',\n 'GetBudgetPerformance',\n 'ProjectBudgetsSummary',\n];\n\nconst CREATE_BUDGET = gql`\n mutation BudgetControlsCreate($input: PlanmagnetCreateBudgetInput!) {\n planmagnetCreateBudget(input: $input) {\n id\n name\n status\n plannedAmount\n currency\n createdAt\n }\n }\n`;\n\nconst UPDATE_BUDGET = gql`\n mutation BudgetControlsUpdate($id: ID!, $input: PlanmagnetUpdateBudgetInput!) {\n planmagnetUpdateBudget(id: $id, input: $input) {\n id\n name\n description\n status\n plannedAmount\n currency\n periodStart\n periodEnd\n updatedAt\n }\n }\n`;\n\nconst APPROVE_BUDGET = gql`\n mutation BudgetControlsApprove($id: ID!) {\n planmagnetApproveBudget(id: $id) {\n id\n status\n approverId\n approvedAt\n updatedAt\n }\n }\n`;\n\nconst DELETE_BUDGET = gql`\n mutation BudgetControlsDelete($id: ID!) {\n planmagnetDeleteBudget(id: $id)\n }\n`;\n\nconst FIELD =\n 'mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm disabled:opacity-60';\n\nconst messageOf = (e: unknown, fallback: string) => (e instanceof Error ? e.message : fallback);\n\n/** Create a budget. With `presetProjectId` (the Project Detail entry point) the project picker is skipped. */\nexport function CreateBudgetDialog({\n presetProjectId,\n onCreated,\n triggerSize = 'sm',\n}: {\n presetProjectId?: string;\n onCreated?: (id: string) => void;\n triggerSize?: 'sm' | 'default';\n}) {\n const empty = {\n projectId: presetProjectId ?? '',\n name: '',\n description: '',\n plannedAmount: '',\n currency: 'USD',\n periodStart: '',\n periodEnd: '',\n };\n const [open, setOpen] = useState(false);\n const [form, setForm] = useState(empty);\n const [error, setError] = useState<string | null>(null);\n const [create, { loading }] = useMutation<{ planmagnetCreateBudget: { id: string } }>(\n CREATE_BUDGET,\n { refetchQueries: BUDGET_QUERIES, awaitRefetchQueries: true }\n );\n\n const invertedLocally = form.periodStart && form.periodEnd && form.periodEnd < form.periodStart;\n const amount = Number(form.plannedAmount);\n const canSubmit =\n !loading &&\n form.name.trim() !== '' &&\n !!form.projectId &&\n Number.isFinite(amount) &&\n amount >= 0 &&\n form.currency.trim() !== '' &&\n !invertedLocally;\n\n const submit = async () => {\n setError(null);\n try {\n const result = await throwOnError(\n create({\n variables: {\n input: {\n projectId: form.projectId,\n name: form.name.trim(),\n ...(form.description.trim() ? { description: form.description.trim() } : {}),\n plannedAmount: amount,\n currency: form.currency.trim().toUpperCase(),\n ...(form.periodStart ? { periodStart: form.periodStart } : {}),\n ...(form.periodEnd ? { periodEnd: form.periodEnd } : {}),\n },\n },\n })\n );\n const id = result.data?.planmagnetCreateBudget.id;\n setOpen(false);\n setForm(empty);\n if (id) onCreated?.(id);\n } catch (e) {\n setError(messageOf(e, 'The budget could not be created.'));\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) setForm(empty);\n else setError(null);\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size={triggerSize} data-testid=\"new-budget-open\">\n <Plus className=\"mr-1 h-4 w-4\" />\n New budget\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New budget</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>The budget starts in Draft.</ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n {!presetProjectId && (\n <div>\n <label htmlFor=\"new-budget-project\" className=\"text-sm font-medium\">\n Project\n </label>\n <div className=\"mt-1\">\n <ProjectSelect\n id=\"new-budget-project\"\n value={form.projectId}\n onChange={(projectId) => setForm({ ...form, projectId })}\n />\n </div>\n </div>\n )}\n <div>\n <label htmlFor=\"new-budget-name\" className=\"text-sm font-medium\">\n Name\n </label>\n <Input\n id=\"new-budget-name\"\n className=\"mt-1\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"new-budget-amount\" className=\"text-sm font-medium\">\n Planned amount\n </label>\n <Input\n id=\"new-budget-amount\"\n className=\"mt-1\"\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n inputMode=\"decimal\"\n value={form.plannedAmount}\n onChange={(e) => setForm({ ...form, plannedAmount: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"new-budget-currency\" className=\"text-sm font-medium\">\n Currency\n </label>\n <Input\n id=\"new-budget-currency\"\n className=\"mt-1\"\n placeholder=\"USD\"\n maxLength={3}\n value={form.currency}\n onChange={(e) => setForm({ ...form, currency: e.target.value.toUpperCase() })}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"new-budget-start\" className=\"text-sm font-medium\">\n Period start (optional)\n </label>\n <Input\n id=\"new-budget-start\"\n className=\"mt-1\"\n type=\"date\"\n value={form.periodStart}\n onChange={(e) => setForm({ ...form, periodStart: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"new-budget-end\" className=\"text-sm font-medium\">\n Period end (optional)\n </label>\n <Input\n id=\"new-budget-end\"\n className=\"mt-1\"\n type=\"date\"\n value={form.periodEnd}\n onChange={(e) => setForm({ ...form, periodEnd: e.target.value })}\n />\n </div>\n </div>\n <div>\n <label htmlFor=\"new-budget-description\" className=\"text-sm font-medium\">\n Description\n </label>\n <textarea\n id=\"new-budget-description\"\n className={`${FIELD} min-h-[64px]`}\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n {invertedLocally && (\n <ErrorLine message=\"The period end cannot be before the period start.\" />\n )}\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button\n onClick={() => void submit()}\n disabled={!canSubmit}\n data-testid=\"new-budget-submit\"\n >\n {loading ? 'Creating…' : 'Create budget'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\nexport interface BudgetValues {\n id: string;\n name: string;\n description: string | null;\n status: string;\n plannedAmount: number;\n currency: string;\n periodStart: string | null;\n periodEnd: string | null;\n}\n\n/** Status select, Edit, Approve and Delete for the budget detail header. */\nexport function BudgetHeaderActions({ budget }: { budget: BudgetValues }) {\n const navigate = usePlanMagnetNavigate();\n const [update, updateState] = useMutation(UPDATE_BUDGET, {\n refetchQueries: BUDGET_QUERIES,\n awaitRefetchQueries: true,\n });\n const [approveMutation, approveState] = useMutation(APPROVE_BUDGET, {\n refetchQueries: BUDGET_QUERIES,\n awaitRefetchQueries: true,\n });\n const [remove, removeState] = useMutation(DELETE_BUDGET, {\n refetchQueries: ['BudgetsList', 'ProjectBudgetsSummary'],\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n const busy = updateState.loading || approveState.loading || removeState.loading;\n const statusOptions = SELECTABLE_STATUSES.includes(\n budget.status as (typeof SELECTABLE_STATUSES)[number]\n )\n ? SELECTABLE_STATUSES\n : [budget.status, ...SELECTABLE_STATUSES];\n\n const onStatus = async (status: string) => {\n setError(null);\n try {\n await throwOnError(update({ variables: { id: budget.id, input: { status } } }));\n } catch (e) {\n setError(messageOf(e, 'The status could not be changed.'));\n }\n };\n const onApprove = async () => {\n setError(null);\n try {\n await throwOnError(approveMutation({ variables: { id: budget.id } }));\n } catch (e) {\n setError(messageOf(e, 'The budget could not be approved.'));\n }\n };\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: budget.id } }));\n navigate('/projects/budgets-page');\n } catch (e) {\n setError(messageOf(e, 'The budget could not be deleted.'));\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <select\n aria-label=\"Status\"\n data-testid=\"budget-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={budget.status}\n disabled={busy}\n onChange={(e) => {\n if (e.target.value !== budget.status) void onStatus(e.target.value);\n }}\n >\n {statusOptions.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n {budget.status !== 'APPROVED' && budget.status !== 'CLOSED' && (\n <Button size=\"sm\" variant=\"outline\" disabled={busy} onClick={() => void onApprove()}>\n <CheckCircle2 className=\"mr-1 h-4 w-4\" />\n Approve\n </Button>\n )}\n <BudgetEditDialog budget={budget} />\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete \"${budget.name}\"?`}\n description=\"The budget and its logged expenses are removed. This cannot be undone here.\"\n confirmLabel=\"Delete budget\"\n destructive\n disabled={busy}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/** Name, description, planned amount, currency and period. Only changed fields are sent. */\nfunction BudgetEditDialog({ budget }: { budget: BudgetValues }) {\n const initial = {\n name: budget.name,\n description: budget.description ?? '',\n plannedAmount: String(budget.plannedAmount),\n currency: budget.currency,\n periodStart: toDateInputValue(budget.periodStart),\n periodEnd: toDateInputValue(budget.periodEnd),\n };\n const [open, setOpen] = useState(false);\n const [form, setForm] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n const [update, state] = useMutation(UPDATE_BUDGET, {\n refetchQueries: BUDGET_QUERIES,\n awaitRefetchQueries: true,\n });\n\n const amount = Number(form.plannedAmount);\n const invertedLocally = form.periodStart && form.periodEnd && form.periodEnd < form.periodStart;\n const canSubmit =\n !state.loading &&\n form.name.trim() !== '' &&\n Number.isFinite(amount) &&\n amount >= 0 &&\n !invertedLocally;\n\n const save = async () => {\n setError(null);\n const input: Record<string, unknown> = {};\n if (form.name.trim() !== initial.name) input.name = form.name.trim();\n if (form.description.trim() !== initial.description.trim())\n input.description = form.description.trim() || null;\n if (amount !== budget.plannedAmount) input.plannedAmount = amount;\n if (form.currency.trim().toUpperCase() !== initial.currency)\n input.currency = form.currency.trim().toUpperCase();\n if (form.periodStart !== initial.periodStart) input.periodStart = form.periodStart || null;\n if (form.periodEnd !== initial.periodEnd) input.periodEnd = form.periodEnd || null;\n if (Object.keys(input).length === 0) {\n setOpen(false);\n return;\n }\n try {\n await throwOnError(update({ variables: { id: budget.id, input } }));\n setOpen(false);\n } catch (e) {\n setError(messageOf(e, 'The budget could not be saved.'));\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) setForm(initial);\n else setError(null);\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" data-testid=\"budget-edit\">\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit budget</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Change the name, amount, currency, period or description.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"edit-budget-name\" className=\"text-sm font-medium\">\n Name\n </label>\n <Input\n id=\"edit-budget-name\"\n className=\"mt-1\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"edit-budget-amount\" className=\"text-sm font-medium\">\n Planned amount\n </label>\n <Input\n id=\"edit-budget-amount\"\n className=\"mt-1\"\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n inputMode=\"decimal\"\n value={form.plannedAmount}\n onChange={(e) => setForm({ ...form, plannedAmount: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"edit-budget-currency\" className=\"text-sm font-medium\">\n Currency\n </label>\n <Input\n id=\"edit-budget-currency\"\n className=\"mt-1\"\n maxLength={3}\n value={form.currency}\n onChange={(e) => setForm({ ...form, currency: e.target.value.toUpperCase() })}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"edit-budget-start\" className=\"text-sm font-medium\">\n Period start\n </label>\n <Input\n id=\"edit-budget-start\"\n className=\"mt-1\"\n type=\"date\"\n value={form.periodStart}\n onChange={(e) => setForm({ ...form, periodStart: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"edit-budget-end\" className=\"text-sm font-medium\">\n Period end\n </label>\n <Input\n id=\"edit-budget-end\"\n className=\"mt-1\"\n type=\"date\"\n value={form.periodEnd}\n onChange={(e) => setForm({ ...form, periodEnd: e.target.value })}\n />\n </div>\n </div>\n <div>\n <label htmlFor=\"edit-budget-description\" className=\"text-sm font-medium\">\n Description\n </label>\n <textarea\n id=\"edit-budget-description\"\n className={`${FIELD} min-h-[64px]`}\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n {invertedLocally && (\n <ErrorLine message=\"The period end cannot be before the period start.\" />\n )}\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button onClick={() => void save()} disabled={!canSubmit} data-testid=\"edit-budget-save\">\n {state.loading ? 'Saving…' : 'Save'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExpenseControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/budgets/ExpenseControls.tsx"],"names":[],"mappings":"AAoEA,uCAAuC;AACvC,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,SAAS,EACT,cAAc,GACf,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,2CAwKA;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,4GAA4G;AAC5G,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,cAAc,GACf,EAAE;IACD,OAAO,EAAE,aAAa,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,2CA+IA;AAED,4CAA4C;AAC5C,wBAAgB,mBAAmB,CAAC,EAClC,EAAE,EACF,WAAW,EACX,cAAc,GACf,EAAE;IACD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,2CAiCA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExpenseControls.js","names":[],"sources":["../../../src/planmagnet/budgets/ExpenseControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport {\n Button,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { Pencil, Plus, Trash2 } from 'lucide-react';\nimport { WorkItemSearchSelect } from '../controls/Pickers';\nimport { throwOnError } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from '../controls/ConfirmButton';\nimport { todayInputValue, toDateInputValue } from '../time/timeShared';\n\n/**\n * Expense controls (BOFF-8047): log an expense against a budget, edit one, delete one.\n *\n * `spentAmount` on the parent budget is maintained by the SERVICE (increment on log, adjust on edit,\n * decrement on delete — `BudgetService.logExpense`/`updateExpense`/`deleteExpense`), inside a transaction\n * for edit. This UI never computes or sends a budget total itself; it only refetches the budget after a\n * write so the meter reflects the server's number.\n */\n\nconst LOG_EXPENSE = gql`\n mutation ExpenseControlsLog($input: PlanmagnetLogExpenseInput!) {\n planmagnetLogExpense(input: $input) {\n id\n budgetId\n description\n amount\n category\n date\n workItemId\n referenceUrl\n createdAt\n }\n }\n`;\n\nconst UPDATE_EXPENSE = gql`\n mutation ExpenseControlsUpdate($id: ID!, $input: PlanmagnetUpdateExpenseInput!) {\n planmagnetUpdateExpense(id: $id, input: $input) {\n id\n description\n amount\n category\n date\n workItemId\n referenceUrl\n updatedAt\n }\n }\n`;\n\nconst DELETE_EXPENSE = gql`\n mutation ExpenseControlsDelete($id: ID!) {\n planmagnetDeleteExpense(id: $id)\n }\n`;\n\nconst messageOf = (e: unknown, fallback: string) => (e instanceof Error ? e.message : fallback);\n\n/** Log an expense against a budget. */\nexport function LogExpenseDialog({\n budgetId,\n projectId,\n refetchQueries,\n}: {\n budgetId: string;\n /** Narrows the optional \"work item\" search to the budget's own project, when known. */\n projectId?: string;\n refetchQueries: string[];\n}) {\n const empty = {\n description: '',\n amount: '',\n category: '',\n date: todayInputValue(),\n workItemId: '',\n referenceUrl: '',\n };\n const [open, setOpen] = useState(false);\n const [form, setForm] = useState(empty);\n const [error, setError] = useState<string | null>(null);\n const [log, { loading }] = useMutation(LOG_EXPENSE, {\n refetchQueries,\n awaitRefetchQueries: true,\n });\n\n const amount = Number(form.amount);\n const canSubmit =\n !loading &&\n form.description.trim() !== '' &&\n Number.isFinite(amount) &&\n amount >= 0 &&\n !!form.date;\n\n const submit = async () => {\n setError(null);\n try {\n await throwOnError(\n log({\n variables: {\n input: {\n budgetId,\n description: form.description.trim(),\n amount,\n date: form.date,\n ...(form.category.trim() ? { category: form.category.trim() } : {}),\n ...(form.workItemId ? { workItemId: form.workItemId } : {}),\n ...(form.referenceUrl.trim() ? { referenceUrl: form.referenceUrl.trim() } : {}),\n },\n },\n })\n );\n setOpen(false);\n setForm(empty);\n } catch (e) {\n setError(messageOf(e, 'The expense could not be logged.'));\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) setForm(empty);\n else setError(null);\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" data-testid=\"log-expense-open\">\n <Plus className=\"mr-1 h-4 w-4\" />\n Log expense\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Log an expense</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Logged against this budget; its spent total updates immediately.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"log-expense-description\" className=\"text-sm font-medium\">\n Description\n </label>\n <Input\n id=\"log-expense-description\"\n className=\"mt-1\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"log-expense-amount\" className=\"text-sm font-medium\">\n Amount\n </label>\n <Input\n id=\"log-expense-amount\"\n className=\"mt-1\"\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n inputMode=\"decimal\"\n value={form.amount}\n onChange={(e) => setForm({ ...form, amount: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"log-expense-date\" className=\"text-sm font-medium\">\n Date\n </label>\n <Input\n id=\"log-expense-date\"\n className=\"mt-1\"\n type=\"date\"\n value={form.date}\n onChange={(e) => setForm({ ...form, date: e.target.value })}\n />\n </div>\n </div>\n <div>\n <label htmlFor=\"log-expense-category\" className=\"text-sm font-medium\">\n Category (optional)\n </label>\n <Input\n id=\"log-expense-category\"\n className=\"mt-1\"\n placeholder=\"e.g. Travel, Software, Contractors\"\n value={form.category}\n onChange={(e) => setForm({ ...form, category: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"log-expense-work-item\" className=\"text-sm font-medium\">\n Work item (optional)\n </label>\n <div className=\"mt-1\">\n <WorkItemSearchSelect\n id=\"log-expense-work-item\"\n projectId={projectId}\n value={form.workItemId}\n onChange={(workItemId) => setForm({ ...form, workItemId })}\n />\n </div>\n </div>\n <div>\n <label htmlFor=\"log-expense-reference\" className=\"text-sm font-medium\">\n Receipt / reference URL (optional)\n </label>\n <Input\n id=\"log-expense-reference\"\n className=\"mt-1\"\n type=\"url\"\n placeholder=\"https://…\"\n value={form.referenceUrl}\n onChange={(e) => setForm({ ...form, referenceUrl: e.target.value })}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button\n onClick={() => void submit()}\n disabled={!canSubmit}\n data-testid=\"log-expense-submit\"\n >\n {loading ? 'Logging…' : 'Log expense'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\nexport interface ExpenseValues {\n id: string;\n description: string;\n amount: number;\n category: string | null;\n date: string;\n referenceUrl: string | null;\n}\n\n/** Edit an expense's description, amount, category, date or reference URL. Only changed fields are sent. */\nexport function EditExpenseDialog({\n expense,\n refetchQueries,\n}: {\n expense: ExpenseValues;\n refetchQueries: string[];\n}) {\n const initial = {\n description: expense.description,\n amount: String(expense.amount),\n category: expense.category ?? '',\n date: toDateInputValue(expense.date),\n referenceUrl: expense.referenceUrl ?? '',\n };\n const [open, setOpen] = useState(false);\n const [form, setForm] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n const [update, { loading }] = useMutation(UPDATE_EXPENSE, {\n refetchQueries,\n awaitRefetchQueries: true,\n });\n\n const amount = Number(form.amount);\n const canSubmit =\n !loading && form.description.trim() !== '' && Number.isFinite(amount) && amount >= 0;\n\n const save = async () => {\n setError(null);\n const input: Record<string, unknown> = {};\n if (form.description.trim() !== initial.description)\n input.description = form.description.trim();\n if (amount !== expense.amount) input.amount = amount;\n if (form.category.trim() !== initial.category.trim())\n input.category = form.category.trim() || null;\n if (form.date !== initial.date) input.date = form.date;\n if (form.referenceUrl.trim() !== initial.referenceUrl.trim())\n input.referenceUrl = form.referenceUrl.trim() || null;\n if (Object.keys(input).length === 0) {\n setOpen(false);\n return;\n }\n try {\n await throwOnError(update({ variables: { id: expense.id, input } }));\n setOpen(false);\n } catch (e) {\n setError(messageOf(e, 'The expense could not be saved.'));\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) setForm(initial);\n else setError(null);\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label={`Edit ${expense.description}`}\n data-testid=\"expense-edit\"\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit expense</ResponsiveDialogTitle>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"edit-expense-description\" className=\"text-sm font-medium\">\n Description\n </label>\n <Input\n id=\"edit-expense-description\"\n className=\"mt-1\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"edit-expense-amount\" className=\"text-sm font-medium\">\n Amount\n </label>\n <Input\n id=\"edit-expense-amount\"\n className=\"mt-1\"\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n inputMode=\"decimal\"\n value={form.amount}\n onChange={(e) => setForm({ ...form, amount: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"edit-expense-date\" className=\"text-sm font-medium\">\n Date\n </label>\n <Input\n id=\"edit-expense-date\"\n className=\"mt-1\"\n type=\"date\"\n value={form.date}\n onChange={(e) => setForm({ ...form, date: e.target.value })}\n />\n </div>\n </div>\n <div>\n <label htmlFor=\"edit-expense-category\" className=\"text-sm font-medium\">\n Category\n </label>\n <Input\n id=\"edit-expense-category\"\n className=\"mt-1\"\n value={form.category}\n onChange={(e) => setForm({ ...form, category: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"edit-expense-reference\" className=\"text-sm font-medium\">\n Receipt / reference URL\n </label>\n <Input\n id=\"edit-expense-reference\"\n className=\"mt-1\"\n type=\"url\"\n value={form.referenceUrl}\n onChange={(e) => setForm({ ...form, referenceUrl: e.target.value })}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button onClick={() => void save()} disabled={!canSubmit} data-testid=\"edit-expense-save\">\n {loading ? 'Saving…' : 'Save'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n/** Delete an expense, with confirmation. */\nexport function DeleteExpenseButton({\n id,\n description,\n refetchQueries,\n}: {\n id: string;\n description: string;\n refetchQueries: string[];\n}) {\n const [remove, { loading }] = useMutation(DELETE_EXPENSE, {\n refetchQueries,\n awaitRefetchQueries: true,\n });\n const [error, setError] = useState<string | null>(null);\n\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id } }));\n } catch (e) {\n setError(messageOf(e, 'The expense could not be deleted.'));\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <ConfirmButton\n label=\"\"\n ariaLabel={`Delete ${description}`}\n variant=\"outline\"\n icon={<Trash2 className=\"h-4 w-4\" />}\n title=\"Delete this expense?\"\n description=\"The budget's spent total is adjusted back down. This cannot be undone here.\"\n confirmLabel=\"Delete expense\"\n destructive\n disabled={loading}\n onConfirm={() => void onDelete()}\n />\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProjectBudgetsSummary.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/budgets/ProjectBudgetsSummary.tsx"],"names":[],"mappings":"AA4CA,wBAAgB,qBAAqB,CAAC,EACpC,WAAW,EACX,SAAS,GACV,EAAE;IACD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,2CA+EA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProjectBudgetsSummary.js","names":[],"sources":["../../../src/planmagnet/budgets/ProjectBudgetsSummary.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { ArrowRight, Wallet } from 'lucide-react';\nimport { budgetState, budgetUsage, BUDGET_STATE_STYLE, money } from './budgetMath';\nimport { CreateBudgetDialog } from './BudgetControls';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\n\n/**\n * The Project Detail entry point into Budgets (BOFF-8047, rule 2): a budget is a per-project record, and a\n * PM opens a project expecting to see (and start) its budget from there, not only from a separate top-level\n * list. Shows up to 3 budgets with their meter; \"View all\" carries the project filter into the full page.\n */\n\nconst PROJECT_BUDGETS = gql`\n query ProjectBudgetsSummary($workspaceId: ID!, $projectId: String!) {\n planmagnetBudgets(\n workspaceId: $workspaceId\n filter: { projectId: $projectId }\n pagination: { first: 3 }\n ) {\n items {\n id\n name\n status\n plannedAmount\n spentAmount\n currency\n }\n totalCount\n }\n }\n`;\n\ninterface BudgetRow {\n id: string;\n name: string;\n status: string;\n plannedAmount: number;\n spentAmount: number;\n currency: string;\n}\n\nexport function ProjectBudgetsSummary({\n workspaceId,\n projectId,\n}: {\n workspaceId?: string | null;\n projectId: string;\n}) {\n const navigate = usePlanMagnetNavigate();\n const { data, loading, error } = useQuery<{\n planmagnetBudgets: { items: BudgetRow[]; totalCount: number };\n }>(PROJECT_BUDGETS, {\n variables: { workspaceId, projectId },\n skip: !workspaceId || !projectId,\n });\n\n const budgets = data?.planmagnetBudgets.items ?? [];\n const total = data?.planmagnetBudgets.totalCount ?? 0;\n const viewAll = () =>\n navigate(`/projects/budgets-page?projectId=${encodeURIComponent(projectId)}`);\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle className=\"flex items-center gap-2\">\n <Wallet className=\"h-4 w-4\" />\n Budget{total === 1 ? '' : 's'} {data ? `(${total})` : ''}\n </CardTitle>\n <CreateBudgetDialog\n presetProjectId={projectId}\n onCreated={(id) => navigate(detailPath('/projects/budget-detail-page', id))}\n triggerSize=\"sm\"\n />\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {loading && !data && <p className=\"text-sm text-muted-foreground\">Loading…</p>}\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n Budgets could not be loaded: {error.message}\n </p>\n )}\n {data && budgets.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No budget for this project yet.</p>\n )}\n {budgets.map((budget) => {\n const usage = budgetUsage(budget.plannedAmount, budget.spentAmount);\n const state = budgetState(usage);\n const style = BUDGET_STATE_STYLE[state];\n const percent = usage === null ? null : Math.round(usage * 100);\n return (\n <button\n key={budget.id}\n type=\"button\"\n className=\"block w-full rounded-md border p-2 text-left hover:border-primary transition-colors\"\n onClick={() => navigate(detailPath('/projects/budget-detail-page', budget.id))}\n >\n <div className=\"flex items-center justify-between gap-2 text-sm\">\n <span className=\"truncate font-medium\">{budget.name}</span>\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">\n {money(budget.spentAmount, budget.currency)} /{' '}\n {money(budget.plannedAmount, budget.currency)}\n </span>\n </div>\n <div className={`mt-1.5 h-1.5 w-full overflow-hidden rounded-full ${style.track}`}>\n <div\n className={`h-full rounded-full ${style.fill}`}\n style={{ width: `${Math.min(percent ?? 0, 100)}%` }}\n />\n </div>\n </button>\n );\n })}\n {total > 0 && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"mt-1 w-full justify-between\"\n onClick={viewAll}\n >\n View all budgets\n <ArrowRight className=\"h-4 w-4\" />\n </Button>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAM,IAAkB,CAAG;;;;;;;;;;;;;;;;;;;AA6B3B,SAAgB,EAAsB,EACpC,gBACA,gBAIC;CACD,IAAM,IAAW,GAAuB,EAClC,EAAE,SAAM,YAAS,aAAU,EAE9B,GAAiB;EAClB,WAAW;GAAE;GAAa;GAAW;EACrC,MAAM,CAAC,KAAe,CAAC;EACxB,CAAC,EAEI,IAAU,GAAM,kBAAkB,SAAS,EAAE,EAC7C,IAAQ,GAAM,kBAAkB,cAAc;AAIpD,QACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EAAY,WAAU;YAAtB,CACE,kBAAC,GAAD;GAAW,WAAU;aAArB;IACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;;IACvB,MAAU,IAAI,KAAK;IAAI;IAAE,IAAO,IAAI,EAAM,KAAK;IAC5C;MACZ,kBAAC,GAAD;GACE,iBAAiB;GACjB,YAAY,MAAO,EAAS,EAAW,gCAAgC,EAAG,CAAC;GAC3E,aAAY;GACZ,CAAA,CACS;KACb,kBAAC,GAAD;EAAa,WAAU;YAAvB;GACG,KAAW,CAAC,KAAQ,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAY,CAAA;GAC7E,KACC,kBAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;cAA1B,CAAqD,iCACrB,EAAM,QAClC;;GAEL,KAAQ,EAAQ,WAAW,KAC1B,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAmC,CAAA;GAEjF,EAAQ,KAAK,MAAW;IACvB,IAAM,IAAQ,EAAY,EAAO,eAAe,EAAO,YAAY,EAE7D,IAAQ,EADA,EAAY,EAAM,GAE1B,IAAU,MAAU,OAAO,OAAO,KAAK,MAAM,IAAQ,IAAI;AAC/D,WACE,kBAAC,UAAD;KAEE,MAAK;KACL,WAAU;KACV,eAAe,EAAS,EAAW,gCAAgC,EAAO,GAAG,CAAC;eAJhF,CAME,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAAwB,EAAO;OAAY,CAAA,EAC3D,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QACG,EAAM,EAAO,aAAa,EAAO,SAAS;QAAC;QAAG;QAC9C,EAAM,EAAO,eAAe,EAAO,SAAS;QACxC;SACH;SACN,kBAAC,OAAD;MAAK,WAAW,oDAAoD,EAAM;gBACxE,kBAAC,OAAD;OACE,WAAW,uBAAuB,EAAM;OACxC,OAAO,EAAE,OAAO,GAAG,KAAK,IAAI,KAAW,GAAG,IAAI,CAAC,IAAI;OACnD,CAAA;MACE,CAAA,CACC;OAlBF,EAAO,GAkBL;KAEX;GACD,IAAQ,KACP,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,WAAU;IACV,eA1DR,EAAS,oCAAoC,mBAAmB,EAAU,GAAG;cAsDvE,CAKC,oBAEC,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,CAC3B;;GAEC;IACT,EAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"budgetMath.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/budgets/budgetMath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C;;;;;;;GAOG;AAEH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;AAEhF,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGzE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAM7D;AAED,eAAO,MAAM,kBAAkB,EAAE,MAAM,CACrC,WAAW,EACX;IACE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACrE,IAAI,EAAE,MAAM,CAAC;CACd,CA0BF,CAAC;AAEF,kHAAkH;AAClH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW9D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"budgetMath.js","names":[],"sources":["../../../src/planmagnet/budgets/budgetMath.ts"],"sourcesContent":["import type { ComponentType } from 'react';\nimport { AlertOctagon, AlertTriangle, CheckCircle2, CircleDashed } from 'lucide-react';\n\n/**\n * Budget math and the meter's visual language, shared by every screen that shows a\n * budget's spend against its plan: the Analytics \"Budget performance\" card\n * (`analytics/DeliveryHealthCards.tsx`) and the Budgets list/detail pages (BOFF-8047).\n *\n * Kept in one place so the two surfaces can never disagree about what \"near limit\" or\n * \"over budget\" means — they read the same thresholds and the same colour/icon pairing.\n */\n\nexport type BudgetState = 'no-plan' | 'on-track' | 'near-limit' | 'over-budget';\n\n/** Share of the plan spent; `null` when there is no plan to measure against. */\nexport function budgetUsage(planned: number, spent: number): number | null {\n if (!Number.isFinite(planned) || planned <= 0) return null;\n return spent / planned;\n}\n\nexport function budgetState(usage: number | null): BudgetState {\n // Without a plan there is nothing to be on track AGAINST — say so, rather\n // than reporting a comforting \"On track\" the numbers cannot support.\n if (usage === null) return 'no-plan';\n if (usage <= 0.85) return 'on-track';\n return usage <= 1 ? 'near-limit' : 'over-budget';\n}\n\nexport const BUDGET_STATE_STYLE: Record<\n BudgetState,\n {\n track: string;\n fill: string;\n icon: ComponentType<{ className?: string; 'aria-hidden'?: boolean }>;\n text: string;\n }\n> = {\n 'no-plan': {\n track: 'bg-muted',\n fill: 'bg-muted',\n icon: CircleDashed,\n text: 'text-muted-foreground',\n },\n 'on-track': {\n track: 'bg-primary/15',\n fill: 'bg-primary',\n icon: CheckCircle2,\n text: 'text-muted-foreground',\n },\n 'near-limit': {\n track: 'bg-status-warning-subtle',\n fill: 'bg-status-warning',\n icon: AlertTriangle,\n text: 'text-status-warning-text',\n },\n 'over-budget': {\n track: 'bg-status-error-subtle',\n fill: 'bg-status-error',\n icon: AlertOctagon,\n text: 'text-status-error-text',\n },\n};\n\n/** Money, in the budget's own currency. Falls back to a plain number when the currency code is not recognised. */\nexport function money(amount: number, currency: string): string {\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n }).format(amount);\n } catch {\n // An unrecognised currency code must not blank the whole table.\n return `${Math.round(amount).toLocaleString()} ${currency}`;\n }\n}\n"],"mappings":";;AAeA,SAAgB,EAAY,GAAiB,GAA8B;AAEzE,QADI,CAAC,OAAO,SAAS,EAAQ,IAAI,KAAW,IAAU,OAC/C,IAAQ;;AAGjB,SAAgB,EAAY,GAAmC;AAK7D,QAFI,MAAU,OAAa,YACvB,KAAS,MAAa,aACnB,KAAS,IAAI,eAAe;;AAGrC,IAAa,IAQT;CACF,WAAW;EACT,OAAO;EACP,MAAM;EACN,MAAM;EACN,MAAM;EACP;CACD,YAAY;EACV,OAAO;EACP,MAAM;EACN,MAAM;EACN,MAAM;EACP;CACD,cAAc;EACZ,OAAO;EACP,MAAM;EACN,MAAM;EACN,MAAM;EACP;CACD,eAAe;EACb,OAAO;EACP,MAAM;EACN,MAAM;EACN,MAAM;EACP;CACF;AAGD,SAAgB,EAAM,GAAgB,GAA0B;AAC9D,KAAI;AACF,SAAO,IAAI,KAAK,aAAa,KAAA,GAAW;GACtC,OAAO;GACP;GACA,uBAAuB;GACxB,CAAC,CAAC,OAAO,EAAO;SACX;AAEN,SAAO,GAAG,KAAK,MAAM,EAAO,CAAC,gBAAgB,CAAC,GAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommentAttachmentUpload.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/CommentAttachmentUpload.tsx"],"names":[],"mappings":"AA0CA,MAAM,WAAW,4BAA4B;IAC3C,sGAAsG;IACtG,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;iHAC6G;IAC7G,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,CAAC,KAAK,EAAE,4BAA4B,KAAK,IAAI,CAAC;IACxD,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,uBAAuB,CAAC,EACtC,QAAQ,EACR,aAAa,EACb,aAAa,EACb,QAAQ,EACR,QAAQ,GACT,EAAE,4BAA4B,2CA2P9B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommentAttachmentUpload.js","names":[],"sources":["../../../src/planmagnet/comments/CommentAttachmentUpload.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport { useApolloClient } from '@apollo/client/react';\nimport { Loader2, Paperclip, X } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { formatBytes, mimeTypeIcon } from './fileDisplay';\nimport {\n MAX_COMMENT_ATTACHMENT_BYTES,\n UploadCompletionUncertainError,\n commentUploadErrorMessage,\n createCommentAttachmentUploadTransport,\n retryCommentAttachmentCompletion,\n uploadCommentAttachment,\n type CompletionSession,\n} from './commentAttachmentUploadClient';\n\n/**\n * CWF-12: Upload add/reply attachments into the creator's PRIVATE Files root, not a shared\n * path-based folder. Files chooses direct or multipart at 5 MiB; completion retries only\n * against the original session. Errors remain visible and block posting until resolved.\n */\n\n/** Mirrors `PlanmagnetAdd*CommentInput`'s server-side ten-file cap. */\nconst MAX_ATTACHMENTS = 10;\n\ntype AttachmentStatus = 'queued' | 'uploading' | 'finalizing' | 'ready' | 'error';\n\ninterface PendingAttachment {\n tempId: string;\n file: File;\n status: AttachmentStatus;\n error: string | null;\n fileId: string | null;\n /** Only retained after an ambiguous completion; retry must never re-upload the bytes. */\n completionSession: CompletionSession | null;\n}\n\nlet tempSeq = 0;\nfunction nextTempId(): string {\n tempSeq += 1;\n return `pending-attachment-${Date.now()}-${tempSeq}`;\n}\n\nexport interface CommentAttachmentUploadState {\n /** Successfully-uploaded file ids, in attach order — pass straight through as `attachmentFileIds`. */\n fileIds: string[];\n /** True while an attachment is queued, uploading, finalizing, failed, or a selection was rejected.\n * The composer must not post until the author retries/removes failures or dismisses a rejected selection. */\n pending: boolean;\n}\n\nexport interface CommentAttachmentUploadProps {\n onChange: (state: CommentAttachmentUploadState) => void;\n onInsertImage?: (fileId: string, filename: string) => void;\n onRemoveImage?: (fileId: string) => void;\n disabled?: boolean;\n idPrefix: string;\n}\n\nexport function CommentAttachmentUpload({\n onChange,\n onInsertImage,\n onRemoveImage,\n disabled,\n idPrefix,\n}: CommentAttachmentUploadProps) {\n const client = useApolloClient();\n const transport = useMemo(() => createCommentAttachmentUploadTransport(client), [client]);\n const inputRef = useRef<HTMLInputElement>(null);\n // `items` is what renders. `itemsRef` mirrors it in lockstep (every `commit` below writes both) purely so the\n // sequential upload loop — running across `await` boundaries, outside any render — always reads what is\n // actually attached right now (including files attached mid-upload, or removed while their own upload is\n // still in flight) instead of a stale closure over the array from when the loop began. `itemsRef` is never\n // read from the render body: `react-hooks/refs` (this repo's full React Compiler lint set) rejects that, and\n // correctly — a ref read during render isn't reactive, so React would have no reason to re-render on it.\n const [items, setItems] = useState<PendingAttachment[]>([]);\n const [selectionError, setSelectionError] = useState<string | null>(null);\n const selectionErrorRef = useRef<string | null>(null);\n const itemsRef = useRef<PendingAttachment[]>([]);\n const uploadingRef = useRef(false);\n const mountedRef = useRef(false);\n const controllersRef = useRef(new Map<string, AbortController>());\n\n useEffect(() => {\n mountedRef.current = true;\n const controllers = controllersRef.current;\n return () => {\n mountedRef.current = false;\n controllers.forEach((controller) => controller.abort());\n controllers.clear();\n };\n }, []);\n\n const commit = (next: PendingAttachment[]) => {\n if (!mountedRef.current) return;\n itemsRef.current = next;\n setItems(next);\n onChange({\n fileIds: next.flatMap((item) =>\n item.status === 'ready' && item.fileId ? [item.fileId] : []\n ),\n pending: selectionErrorRef.current !== null || next.some((item) => item.status !== 'ready'),\n });\n };\n\n const runQueue = async () => {\n if (uploadingRef.current) return; // Already draining — that loop will pick up anything just added.\n uploadingRef.current = true;\n try {\n for (;;) {\n if (!mountedRef.current) break;\n const next = itemsRef.current.find((item) => item.status === 'queued');\n if (!next) break;\n const controller = new AbortController();\n controllersRef.current.set(next.tempId, controller);\n commit(\n itemsRef.current.map(\n (item): PendingAttachment =>\n item.tempId === next.tempId\n ? { ...item, status: next.completionSession ? 'finalizing' : 'uploading' }\n : item\n )\n );\n try {\n const fileId = next.completionSession\n ? await retryCommentAttachmentCompletion(\n next.completionSession,\n transport,\n controller.signal\n )\n : await uploadCommentAttachment(next.file, transport, controller.signal, () => {\n commit(\n itemsRef.current.map(\n (item): PendingAttachment =>\n item.tempId === next.tempId ? { ...item, status: 'finalizing' } : item\n )\n );\n });\n // No-op if the attachment was removed during its upload. Finalization cannot be safely\n // canceled after the mutation has been sent, so Remove is disabled while finalizing.\n commit(\n itemsRef.current.map(\n (item): PendingAttachment =>\n item.tempId === next.tempId\n ? { ...item, status: 'ready', fileId, error: null, completionSession: null }\n : item\n )\n );\n } catch (error) {\n if (!controller.signal.aborted || error instanceof UploadCompletionUncertainError) {\n commit(\n itemsRef.current.map(\n (item): PendingAttachment =>\n item.tempId === next.tempId\n ? {\n ...item,\n status: 'error',\n error: commentUploadErrorMessage(error),\n completionSession:\n error instanceof UploadCompletionUncertainError\n ? error.session\n : item.completionSession,\n }\n : item\n )\n );\n }\n } finally {\n controllersRef.current.delete(next.tempId);\n }\n }\n } finally {\n uploadingRef.current = false;\n }\n };\n\n // Render-time derivation from `items` (state), never from `itemsRef` — see the comment on `itemsRef` above.\n const countedTowardCap = items.filter((i) => i.status !== 'error').length;\n const atCap = countedTowardCap >= MAX_ATTACHMENTS;\n\n const handleFiles = (files: FileList | null) => {\n if (!files || files.length === 0) return;\n // Reads itemsRef (not `items`/`countedTowardCap`) deliberately: this handler can fire again before a\n // previous commit's re-render has landed, and itemsRef is always the latest value, synchronously.\n const roomLeft =\n MAX_ATTACHMENTS - itemsRef.current.filter((item) => item.status !== 'error').length;\n const selected = Array.from(files);\n const allowed = selected.filter((file) => file.size <= MAX_COMMENT_ATTACHMENT_BYTES);\n const queued: PendingAttachment[] = allowed.slice(0, Math.max(0, roomLeft)).map((file) => ({\n tempId: nextTempId(),\n file,\n status: 'queued',\n error: null,\n fileId: null,\n completionSession: null,\n }));\n const rejectedForSize = selected.length !== allowed.length;\n const rejectedForCount = allowed.length > queued.length;\n const rejection =\n [\n rejectedForSize\n ? `Each attachment must be at most ${formatBytes(MAX_COMMENT_ATTACHMENT_BYTES)}. The larger files were not attached.`\n : null,\n rejectedForCount\n ? `Only ${MAX_ATTACHMENTS} attachments can be added to one comment. The extra files were not attached.`\n : null,\n ]\n .filter(Boolean)\n .join(' ') || null;\n // A rejected selection remains visible (and blocks posting) even if a later\n // selection succeeds. The author must explicitly dismiss the omitted files.\n if (rejection) {\n const previous = selectionErrorRef.current;\n selectionErrorRef.current =\n previous && !previous.includes(rejection)\n ? `${previous} ${rejection}`\n : (previous ?? rejection);\n setSelectionError(selectionErrorRef.current);\n }\n commit([...itemsRef.current, ...queued]);\n if (queued.length > 0) void runQueue();\n if (inputRef.current) inputRef.current.value = '';\n };\n\n const retryItem = (tempId: string) => {\n // Errors do not count towards the selection cap, but retrying one must not exceed it.\n if (itemsRef.current.filter((item) => item.status !== 'error').length >= MAX_ATTACHMENTS)\n return;\n commit(\n itemsRef.current.map(\n (item): PendingAttachment =>\n item.tempId === tempId && item.status === 'error'\n ? { ...item, status: 'queued', error: null }\n : item\n )\n );\n void runQueue();\n };\n\n const removeItem = (tempId: string) => {\n const item = itemsRef.current.find((entry) => entry.tempId === tempId);\n if (item?.status === 'finalizing') return; // Finalization may already have committed: never abort it.\n controllersRef.current.get(tempId)?.abort();\n if (item?.fileId && item.file.type.startsWith('image/')) onRemoveImage?.(item.fileId);\n commit(itemsRef.current.filter((entry) => entry.tempId !== tempId));\n };\n\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <input\n ref={inputRef}\n id={`${idPrefix}-attach-input`}\n type=\"file\"\n multiple\n className=\"sr-only\"\n disabled={disabled || atCap}\n onChange={(e) => handleFiles(e.target.files)}\n />\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 px-2 text-xs\"\n disabled={disabled || atCap}\n onClick={() => inputRef.current?.click()}\n data-testid={`${idPrefix}-attach-files`}\n >\n <Paperclip className=\"mr-1 h-3.5 w-3.5\" aria-hidden=\"true\" />\n Attach files\n </Button>\n <span className=\"text-xs text-muted-foreground\">\n {items.length > 0\n ? `${countedTowardCap}/${MAX_ATTACHMENTS} attached`\n : `Up to ${MAX_ATTACHMENTS} files`}\n </span>\n </div>\n\n {selectionError && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {selectionError}{' '}\n <button\n type=\"button\"\n className=\"underline\"\n onClick={() => {\n selectionErrorRef.current = null;\n setSelectionError(null);\n commit(itemsRef.current);\n }}\n >\n Dismiss\n </button>\n </p>\n )}\n {items.length > 0 && (\n <ul\n className=\"flex flex-wrap gap-1.5\"\n data-testid={`${idPrefix}-pending-attachments`}\n aria-label=\"Files attached to this comment\"\n >\n {items.map((item) => (\n <li key={item.tempId}>\n <PendingAttachmentChip\n item={item}\n disabled={disabled}\n onInsertImage={onInsertImage}\n onRetry={() => retryItem(item.tempId)}\n retryDisabled={atCap}\n onRemove={() => removeItem(item.tempId)}\n />\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nfunction PendingAttachmentChip({\n item,\n disabled,\n onInsertImage,\n onRetry,\n retryDisabled,\n onRemove,\n}: {\n item: PendingAttachment;\n disabled?: boolean;\n onInsertImage?: (fileId: string, filename: string) => void;\n onRetry: () => void;\n retryDisabled: boolean;\n onRemove: () => void;\n}) {\n const errored = item.status === 'error';\n const imageFileId =\n item.status === 'ready' && item.file.type.startsWith('image/') ? item.fileId : null;\n return (\n <span\n className={`inline-flex max-w-[16rem] items-center gap-1.5 rounded-md border px-2 py-1 text-xs ${\n errored ? 'border-destructive/50 text-destructive' : 'border-border-default'\n }`}\n data-testid=\"pending-attachment\"\n >\n {item.status === 'uploading' || item.status === 'finalizing' ? (\n <Loader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin\" aria-hidden=\"true\" />\n ) : (\n mimeTypeIcon(item.file.type || 'application/octet-stream')\n )}\n <span className=\"truncate\">{item.file.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{formatBytes(item.file.size)}</span>\n {item.status === 'finalizing' && <span className=\"shrink-0\">Finalizing…</span>}\n {errored && (\n <span className=\"shrink-0 truncate\" role=\"alert\">\n · {item.error ?? 'Upload failed'}\n </span>\n )}\n {errored && (\n <button\n type=\"button\"\n className=\"shrink-0 text-primary hover:underline disabled:opacity-50\"\n disabled={disabled || retryDisabled}\n onClick={onRetry}\n title={retryDisabled ? 'Remove another attachment to retry' : undefined}\n >\n {item.completionSession ? 'Retry finalizing' : 'Retry upload'}\n </button>\n )}\n {imageFileId && onInsertImage && (\n <button\n type=\"button\"\n className=\"shrink-0 text-primary hover:underline\"\n disabled={disabled}\n onClick={() => onInsertImage(imageFileId, item.file.name)}\n >\n Insert image\n </button>\n )}\n <button\n type=\"button\"\n aria-label={`Remove ${item.file.name}`}\n className=\"shrink-0 rounded-sm text-muted-foreground hover:text-foreground\"\n disabled={disabled || item.status === 'finalizing'}\n onClick={onRemove}\n >\n <X className=\"h-3 w-3\" aria-hidden=\"true\" />\n </button>\n </span>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommentAttachments.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/CommentAttachments.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,sGAAsG;AACtG,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,MAAM,GACP,EAAE;IACD,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACxC,MAAM,EAAE,iBAAiB,CAAC;CAC3B,kDAWA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommentAttachments.js","names":[],"sources":["../../../src/planmagnet/comments/CommentAttachments.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { formatBytes, mimeTypeIcon } from './fileDisplay';\nimport { useCommentFileUrl, type CommentFileTarget } from './useCommentFileUrl';\n\n/** Server-snapshotted metadata; the attachment ID, not its raw Files ID, authorizes each download. */\nexport interface CommentAttachmentSummary {\n id: string;\n fileId: string;\n name: string;\n mimeType: string;\n size: number;\n}\n\nexport function CommentAttachments({\n attachments,\n target,\n}: {\n attachments: CommentAttachmentSummary[];\n target: CommentFileTarget;\n}) {\n if (attachments.length === 0) return null;\n return (\n <ul className=\"flex flex-wrap gap-1.5\" data-testid=\"comment-attachments\">\n {attachments.map((attachment) => (\n <li key={attachment.id}>\n <CommentAttachmentLink attachment={attachment} target={target} />\n </li>\n ))}\n </ul>\n );\n}\n\nfunction CommentAttachmentLink({\n attachment,\n target,\n}: {\n attachment: CommentAttachmentSummary;\n target: CommentFileTarget;\n}) {\n const getUrl = useCommentFileUrl();\n const [opening, setOpening] = useState(false);\n const [error, setError] = useState(false);\n const pendingTabRef = useRef<Window | null>(null);\n\n useEffect(() => {\n return () => {\n // Navigating away must not leave a blank tab that a finished request could still populate.\n const tab = pendingTabRef.current;\n pendingTabRef.current = null;\n tab?.close();\n };\n }, []);\n\n const open = async () => {\n if (opening) return;\n setError(false);\n // Open in the user's click gesture; browsers often block window.open after an awaited GraphQL request.\n // Sever the opener before making a network request, then navigate only after fresh authorization succeeds.\n const tab = window.open('about:blank', '_blank');\n if (!tab) {\n setError(true);\n return;\n }\n tab.opener = null;\n pendingTabRef.current = tab;\n setOpening(true);\n try {\n const url = await getUrl(target, attachment.id);\n if (pendingTabRef.current === tab && !tab.closed) tab.location.replace(url);\n } catch {\n if (pendingTabRef.current === tab) {\n tab.close();\n setError(true);\n }\n } finally {\n if (pendingTabRef.current === tab) {\n pendingTabRef.current = null;\n setOpening(false);\n }\n }\n };\n\n return (\n <div className=\"space-y-0.5\">\n <button\n type=\"button\"\n disabled={opening}\n title={attachment.name}\n data-testid=\"comment-attachment\"\n className=\"inline-flex max-w-[14rem] items-center gap-1.5 rounded-md border border-border-default px-2 py-1 text-xs hover:bg-muted disabled:opacity-70\"\n onClick={() => void open()}\n >\n {mimeTypeIcon(attachment.mimeType)}\n <span className=\"truncate\">{attachment.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">{formatBytes(attachment.size)}</span>\n {opening && <span className=\"sr-only\">Opening…</span>}\n </button>\n {error && (\n <p role=\"alert\" className=\"max-w-[14rem] text-xs text-destructive\">\n Attachment unavailable. Check your access and pop-up settings.\n </p>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;AAaA,SAAgB,EAAmB,EACjC,gBACA,aAIC;AAED,QADI,EAAY,WAAW,IAAU,OAEnC,kBAAC,MAAD;EAAI,WAAU;EAAyB,eAAY;YAChD,EAAY,KAAK,MAChB,kBAAC,MAAD,EAAA,UACE,kBAAC,GAAD;GAAmC;GAAoB;GAAU,CAAA,EAC9D,EAFI,EAAW,GAEf,CACL;EACC,CAAA;;AAIT,SAAS,EAAsB,EAC7B,eACA,aAIC;CACD,IAAM,IAAS,GAAmB,EAC5B,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAO,KAAY,EAAS,GAAM,EACnC,IAAgB,EAAsB,KAAK;AAEjD,eACe;EAEX,IAAM,IAAM,EAAc;AAE1B,EADA,EAAc,UAAU,MACxB,GAAK,OAAO;IAEb,EAAE,CAAC;CAEN,IAAM,IAAO,YAAY;AACvB,MAAI,EAAS;AACb,IAAS,GAAM;EAGf,IAAM,IAAM,OAAO,KAAK,eAAe,SAAS;AAChD,MAAI,CAAC,GAAK;AACR,KAAS,GAAK;AACd;;AAIF,EAFA,EAAI,SAAS,MACb,EAAc,UAAU,GACxB,EAAW,GAAK;AAChB,MAAI;GACF,IAAM,IAAM,MAAM,EAAO,GAAQ,EAAW,GAAG;AAC/C,GAAI,EAAc,YAAY,KAAO,CAAC,EAAI,UAAQ,EAAI,SAAS,QAAQ,EAAI;UACrE;AACN,GAAI,EAAc,YAAY,MAC5B,EAAI,OAAO,EACX,EAAS,GAAK;YAER;AACR,GAAI,EAAc,YAAY,MAC5B,EAAc,UAAU,MACxB,EAAW,GAAM;;;AAKvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,UAAD;GACE,MAAK;GACL,UAAU;GACV,OAAO,EAAW;GAClB,eAAY;GACZ,WAAU;GACV,eAAe,KAAK,GAAM;aAN5B;IAQG,EAAa,EAAW,SAAS;IAClC,kBAAC,QAAD;KAAM,WAAU;eAAY,EAAW;KAAY,CAAA;IACnD,kBAAC,QAAD;KAAM,WAAU;eAAkC,EAAY,EAAW,KAAK;KAAQ,CAAA;IACrF,KAAW,kBAAC,QAAD;KAAM,WAAU;eAAU;KAAe,CAAA;IAC9C;MACR,KACC,kBAAC,KAAD;GAAG,MAAK;GAAQ,WAAU;aAAyC;GAE/D,CAAA,CAEF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommentBody.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/CommentBody.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAkKrE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACxC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAsBrF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommentBody.js","names":[],"sources":["../../../src/planmagnet/comments/CommentBody.tsx"],"sourcesContent":["import { Fragment, useEffect, useRef, useState } from 'react';\nimport { ImageOff } from 'lucide-react';\nimport { PersonName } from '../people/People';\nimport { tokenizeCommentBody, type CommentToken } from './commentTokens';\nimport { useCommentFileUrl, type CommentFileTarget } from './useCommentFileUrl';\nimport type { CommentAttachmentSummary } from './CommentAttachments';\n\n/** Render only the server's constrained plain-text grammar; raw HTML is always inert React text. */\nfunction TokenView({\n token,\n attachment,\n target,\n}: {\n token: CommentToken;\n attachment?: CommentAttachmentSummary;\n target: CommentFileTarget;\n}) {\n switch (token.kind) {\n case 'text':\n return <>{token.value}</>;\n case 'mention':\n return (\n <span className=\"rounded bg-primary/10 px-1 py-0.5 font-medium text-primary\">\n @<PersonName id={token.actorId} className=\"text-primary\" />\n </span>\n );\n case 'link':\n return (\n <a\n href={token.url}\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n className=\"text-primary underline underline-offset-2 hover:no-underline\"\n >\n {token.text}\n </a>\n );\n case 'image':\n // A text token is not itself a grant to read any Files ID. Only this comment's attachment row\n // permits a download; an unbound fileId in a hand-edited body remains inert.\n return attachment?.mimeType.startsWith('image/') ? (\n <CommentBodyImage\n key={attachment.id}\n attachment={attachment}\n target={target}\n alt={token.alt}\n />\n ) : (\n <UnavailableImage alt={token.alt} />\n );\n case 'inline-code':\n return (\n <code className=\"rounded bg-muted px-1 py-0.5 font-mono text-[0.85em]\">{token.value}</code>\n );\n case 'code-block':\n return (\n <pre className=\"my-1 overflow-x-auto rounded-md bg-muted p-2 font-mono text-[0.85em] whitespace-pre\">\n <code>{token.value}</code>\n </pre>\n );\n case 'bold':\n return <strong className=\"font-semibold\">{token.value}</strong>;\n case 'italic':\n return <em>{token.value}</em>;\n }\n}\n\nfunction UnavailableImage({ alt }: { alt: string }) {\n return (\n <span className=\"my-1 inline-flex items-center gap-1 rounded-md border border-border-default px-2 py-1 align-bottom text-xs text-muted-foreground\">\n <ImageOff className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {alt || 'Image unavailable'}\n </span>\n );\n}\n\n/** Fetch a fresh, short-lived URL only as an attached image enters the viewport. */\nfunction CommentBodyImage({\n attachment,\n target,\n alt,\n}: {\n attachment: CommentAttachmentSummary;\n target: CommentFileTarget;\n alt: string;\n}) {\n const getUrl = useCommentFileUrl();\n const targetType = target.type;\n const targetId = target.id;\n const containerRef = useRef<HTMLSpanElement>(null);\n const [visible, setVisible] = useState(false);\n const [url, setUrl] = useState<string | null>(null);\n const [failed, setFailed] = useState(false);\n const [retry, setRetry] = useState(0);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n if (typeof IntersectionObserver === 'undefined') {\n let active = true;\n queueMicrotask(() => {\n if (active) setVisible(true);\n });\n return () => {\n active = false;\n };\n }\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setVisible(true);\n observer.disconnect();\n }\n },\n { rootMargin: '256px' }\n );\n observer.observe(container);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (!visible) return;\n let active = true;\n void getUrl({ type: targetType, id: targetId }, attachment.id).then(\n (next) => {\n if (active) setUrl(next);\n },\n () => {\n if (active) setFailed(true);\n }\n );\n return () => {\n active = false;\n };\n }, [visible, getUrl, targetType, targetId, attachment.id, retry]);\n\n return (\n <span ref={containerRef}>\n {failed ? (\n <UnavailableImage alt={alt} />\n ) : url ? (\n <img\n src={url}\n alt={alt}\n className=\"my-1 max-h-64 max-w-full rounded-md border border-border-default object-contain align-bottom\"\n loading=\"eager\"\n onError={() => {\n if (retry === 0) {\n // The browser may have delayed an image request until its presign expired. Retry once via\n // the comment-reader query, never by reusing a cached URL or looping forever on failure.\n setUrl(null);\n setRetry(1);\n } else {\n setFailed(true);\n }\n }}\n />\n ) : (\n <span\n className=\"my-1 inline-flex h-20 w-32 animate-pulse items-center justify-center rounded-md bg-muted align-bottom text-xs text-muted-foreground\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n );\n}\n\nexport interface CommentBodyProps {\n text: string;\n attachments: CommentAttachmentSummary[];\n target: CommentFileTarget;\n className?: string;\n}\n\nexport function CommentBody({ text, attachments, target, className }: CommentBodyProps) {\n let tokens: CommentToken[];\n try {\n tokens = tokenizeCommentBody(text);\n } catch {\n tokens = [{ kind: 'text', value: text }];\n }\n const files = new Map(attachments.map((item) => [item.fileId.toLowerCase(), item]));\n\n return (\n <div className={className ?? 'text-sm whitespace-pre-wrap break-words'}>\n {tokens.map((token, index) => (\n <Fragment key={index}>\n <TokenView\n token={token}\n attachment={token.kind === 'image' ? files.get(token.fileId.toLowerCase()) : undefined}\n target={target}\n />\n </Fragment>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommentThread.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/CommentThread.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAY5C,OAAO,EAAsB,KAAK,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAoC7D,KAAK,aAAa,GAAG,MAAM,GAAG,UAAU,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACxC,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAUD,MAAM,WAAW,kBAAkB;IACjC,6FAA6F;IAC7F,MAAM,EAAE,iBAAiB,CAAC;IAC1B,qGAAqG;IACrG,UAAU,EAAE,MAAM,CAAC;IACnB,wGAAwG;IACxG,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QACL,QAAQ,EAAE,YAAY,CAAC;QACvB,0FAA0F;QAC1F,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,GAAG,EAAE;QACH,QAAQ,EAAE,YAAY,CAAC;QACvB,cAAc,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,iBAAiB,EAAE,MAAM,EAAE,KACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9B,CAAC;IACF,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB;mEAC+D;IAC/D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,8FAA8F;IAC9F,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;;uGAEmG;IACnG,QAAQ,CAAC,EAAE;QACT,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;QAClC,YAAY,EAAE,MAAM,IAAI,CAAC;KAC1B,CAAC;CACH;AAID,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,GAAG,EACH,IAAI,EACJ,MAAM,EACN,OAAO,EACP,cAAc,EACd,YAAY,EACZ,QAAQ,GACT,EAAE,kBAAkB,2CAkNpB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommentThread.js","names":[],"sources":["../../../src/planmagnet/comments/CommentThread.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport type { DocumentNode } from 'graphql';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { CheckCircle2, ChevronDown, ChevronRight, Reply, RotateCcw, Trash2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { PersonName, usePersonProfile } from '../people/People';\nimport { ConfirmButton, ErrorLine } from '../controls/ConfirmButton';\nimport { throwOnError } from '../utils/mutationResult';\nimport { isForbidden, mutationErrorMessage } from '../utils/graphqlErrors';\nimport { MentionComposer } from './MentionComposer';\nimport { CommentBody } from './CommentBody';\nimport { appendImageEmbed, removeImageEmbed } from './commentImageTokens';\nimport { CommentAttachments, type CommentAttachmentSummary } from './CommentAttachments';\nimport type { CommentFileTarget } from './useCommentFileUrl';\nimport {\n CommentAttachmentUpload,\n type CommentAttachmentUploadState,\n} from './CommentAttachmentUpload';\nimport { TypingLine } from '../presence/PresenceAvatars';\n\n/**\n * The comment thread engine shared by every commentable surface in this MFE: a work item (CWF-02, via\n * `WorkItemComments.tsx`) and a project/doc (CWF-12, via `TargetComments.tsx`). Modeled on\n * `comments/RoadmapComments.tsx`'s list/add/author-only-edit/delete structure, extended with:\n *\n * - Threading (CWF-02): `PlanmagnetWorkItemComment`/`PlanmagnetComment.replies` are ONE level deep by contract —\n * the server reparents \"a reply to a reply\" onto ITS OWN top-level parent. So a Reply action lives on both a\n * top-level comment and on one of its replies, but both always post with `parentId = <the top-level id>`\n * (`replyTargetId` below), matching what the server would do anyway — never a reply's own id.\n * - Resolution (CWF-14): a top-level-only OPEN/RESOLVED toggle, not restricted to the comment's author. A\n * resolved thread collapses to a one-line summary that can be expanded back out.\n * - Mentions (CWF-13): every composer here (add / reply / edit) is a `MentionComposer`; every rendered body is\n * `CommentBody`, so a `@[Name](actorId)` token always shows as a highlighted name, never raw markup.\n * - Rich text + attachments (CWF-12): the body also carries a small server-sanitized markdown grammar (bold,\n * italic, code, links, mentions, fileId-referenced images — `CommentBody.tsx` renders it, `MentionComposer`'s\n * toolbar writes it) and up to 10 file attachments, addable only when POSTING (add/reply) — none of the Edit\n * mutations take `attachmentFileIds`, so an existing comment's attachments can never change.\n * - A caller-agnostic core: `query`/`add`/`edit`/`remove`/`resolve` are passed in per surface (different\n * operation names, same field shapes — see `graphql/wspace.graphql`'s `PlanmagnetWorkItemComment` vs\n * `PlanmagnetComment` doc comments: \"everything here means exactly what it means on\" the other type).\n *\n * The status filter (Open/Resolved/All) is applied CLIENT-SIDE over the loaded page: none of\n * `planmagnetWorkItemComments`/`planmagnetProjectComments`/`planmagnetDocComments` take a status argument, only\n * `pagination` — same constraint the pre-existing pagination already lived with.\n */\n\nconst PAGE = 30;\nconst MAX_LENGTH = 10_000; // Every Add*CommentInput: \"1 to 10,000 characters after trimming\"\n\ntype CommentStatus = 'OPEN' | 'RESOLVED';\n\nexport interface ThreadComment {\n id: string;\n authorId: string;\n body: string;\n createdAt: string;\n editedAt: string | null;\n parentId: string | null;\n status: CommentStatus;\n resolvedBy: string | null;\n resolvedAt: string | null;\n mentions: string[];\n attachments: CommentAttachmentSummary[];\n replies: ThreadComment[];\n}\n\ninterface ThreadList {\n totalCount: number;\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n items: ThreadComment[];\n}\n\ntype ThreadQueryData = Record<string, ThreadList>;\n\nexport interface CommentThreadProps {\n /** Verified by the matching product-read resource before an attachment can be downloaded. */\n target: CommentFileTarget;\n /** What this thread is attached to, used only in accessible copy (\"Add a comment on this task…\"). */\n targetNoun: string;\n /** Seeds every form-control id this instance renders, so two threads on the same page never collide. */\n idPrefix: string;\n query: {\n document: DocumentNode;\n /** The response field this query's data lands under (`planmagnetWorkItemComments`, …). */\n dataKey: string;\n variables: Record<string, unknown>;\n skip?: boolean;\n };\n add: {\n document: DocumentNode;\n buildVariables: (\n body: string,\n parentId: string | null,\n attachmentFileIds: string[]\n ) => Record<string, unknown>;\n };\n edit: DocumentNode;\n remove: DocumentNode;\n resolve: DocumentNode;\n /** Apollo operation names to refetch after any write here (this thread's own query, plus e.g. an Activity\n * panel on the same page that also shows COMMENTED events). */\n refetchQueries: string[];\n /** Reports the thread's live top-level count up to the caller, for a \"Comments (n)\" title. */\n onTotalCount?: (count: number) => void;\n /** CWF-24 typing presence, owned by the page (one `usePresence` call shared with its `PresenceAvatars`) and\n * threaded down here so the composers can signal typing and the thread can show who else is mid-reply. Omitted\n * entirely on a surface that has not wired presence up (renders nothing extra, same as before). */\n presence?: {\n typingActorIds: readonly string[];\n notifyTyping: () => void;\n };\n}\n\nconst when = (iso: string) => new Date(iso).toLocaleString();\n\nexport function CommentThread({\n target,\n targetNoun,\n idPrefix,\n query,\n add,\n edit,\n remove,\n resolve,\n refetchQueries,\n onTotalCount,\n presence,\n}: CommentThreadProps) {\n const { currentUser, workspaceId, authToken, apiGatewayUrl } = usePlanMagnet();\n const [draft, setDraft] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loadingMore, setLoadingMore] = useState(false);\n const [filter, setFilter] = useState<'OPEN' | 'RESOLVED' | 'ALL'>('ALL');\n const [topAttach, setTopAttach] = useState<CommentAttachmentUploadState>({\n fileIds: [],\n pending: false,\n });\n // Remounts CommentAttachmentUpload (clearing its queue) after a successful top-level post — simpler and more\n // robust than an imperative reset API, same \"change the key to reset\" approach React itself recommends.\n const [topAttachResetKey, setTopAttachResetKey] = useState(0);\n\n const mutationRefetch = { refetchQueries, awaitRefetchQueries: true };\n\n const {\n data,\n loading,\n error: loadError,\n fetchMore,\n } = useQuery<ThreadQueryData>(query.document, {\n variables: { ...query.variables, pagination: { first: PAGE } },\n skip: query.skip,\n });\n const [addComment, addState] = useMutation(add.document, mutationRefetch);\n\n const thread = data?.[query.dataKey];\n // The server returns TOP-LEVEL comments here; each carries its own (bounded, unpaginated) `replies`.\n const topLevel = thread?.items ?? [];\n const visible = filter === 'ALL' ? topLevel : topLevel.filter((c) => c.status === filter);\n const openCount = topLevel.filter((c) => c.status === 'OPEN').length;\n const resolvedCount = topLevel.length - openCount;\n\n const trimmed = draft.trim();\n const tooLong = trimmed.length > MAX_LENGTH;\n\n useEffect(() => {\n if (thread) onTotalCount?.(thread.totalCount);\n }, [thread, onTotalCount]);\n\n const post = async (\n body: string,\n parentId: string | null,\n attachmentFileIds: string[]\n ): Promise<boolean> => {\n setError(null);\n try {\n await throwOnError(\n addComment({ variables: add.buildVariables(body, parentId, attachmentFileIds) })\n );\n return true;\n } catch (e) {\n setError(\n isForbidden(e)\n ? 'Your role can read but not comment.'\n : mutationErrorMessage(e, 'The comment could not be posted.')\n );\n return false;\n }\n };\n\n const submitTop = async () => {\n if (await post(trimmed, null, topAttach.fileIds)) {\n setDraft('');\n setTopAttach({ fileIds: [], pending: false });\n setTopAttachResetKey((k) => k + 1);\n }\n };\n\n const loadMore = async () => {\n const after = thread?.pageInfo.endCursor;\n if (!after) return;\n setLoadingMore(true);\n try {\n await fetchMore({\n variables: { ...query.variables, pagination: { first: PAGE, after } },\n updateQuery: (prev, { fetchMoreResult }) => ({\n [query.dataKey]: {\n ...fetchMoreResult[query.dataKey],\n items: [...prev[query.dataKey].items, ...fetchMoreResult[query.dataKey].items],\n },\n }),\n });\n } finally {\n setLoadingMore(false);\n }\n };\n\n return (\n <div className=\"space-y-4\" data-testid=\"comment-thread\">\n {error && <ErrorLine message={error} />}\n {loading && !data && <p className=\"text-sm text-muted-foreground\">Loading comments…</p>}\n {loadError && <ErrorLine message={`Comments could not be loaded: ${loadError.message}`} />}\n\n {thread && topLevel.length > 0 && (\n <div\n role=\"group\"\n aria-label=\"Filter comments by resolution\"\n data-testid=\"comment-filter\"\n className=\"flex flex-wrap gap-1\"\n >\n {(\n [\n ['OPEN', `Open (${openCount})`],\n ['RESOLVED', `Resolved (${resolvedCount})`],\n ['ALL', `All (${topLevel.length})`],\n ] as const\n ).map(([mode, label]) => (\n <Button\n key={mode}\n type=\"button\"\n size=\"sm\"\n variant={filter === mode ? 'default' : 'outline'}\n aria-pressed={filter === mode}\n className=\"h-7 px-2.5 text-xs\"\n onClick={() => setFilter(mode)}\n >\n {label}\n </Button>\n ))}\n </div>\n )}\n\n {thread && visible.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">\n {topLevel.length === 0 ? 'No comments yet.' : 'No comments match this filter.'}\n </p>\n )}\n\n <ol className=\"space-y-3\">\n {visible.map((comment) => (\n <TopLevelThread\n key={comment.id}\n comment={comment}\n target={target}\n currentUserId={currentUser?.id}\n editMutation={edit}\n removeMutation={remove}\n resolveMutation={resolve}\n addMutation={add.document}\n buildReplyVariables={(body, attachmentFileIds) =>\n add.buildVariables(body, comment.id, attachmentFileIds)\n }\n mutationRefetch={mutationRefetch}\n onError={setError}\n idPrefix={idPrefix}\n workspaceId={workspaceId}\n authToken={authToken}\n apiGatewayUrl={apiGatewayUrl}\n onTyping={presence?.notifyTyping}\n />\n ))}\n </ol>\n\n {thread?.pageInfo.hasNextPage && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => void loadMore()} disabled={loadingMore}>\n {loadingMore ? 'Loading…' : `Show more (${topLevel.length} of ${thread.totalCount})`}\n </Button>\n )}\n\n {presence && <TypingLine typingActorIds={presence.typingActorIds} />}\n\n <div className=\"space-y-2 border-t border-border-default pt-4\">\n <label htmlFor={`${idPrefix}-add`} className=\"sr-only\">\n Add a comment\n </label>\n <MentionComposer\n id={`${idPrefix}-add`}\n ariaLabel={`Add a comment on this ${targetNoun}`}\n placeholder=\"Add a comment…\"\n className=\"min-h-[72px]\"\n value={draft}\n disabled={addState.loading}\n onChange={(value) => {\n setDraft(value);\n presence?.notifyTyping();\n }}\n workspaceId={workspaceId}\n authToken={authToken}\n apiGatewayUrl={apiGatewayUrl}\n />\n {tooLong && <ErrorLine message={`A comment can be at most ${MAX_LENGTH} characters.`} />}\n <CommentAttachmentUpload\n key={topAttachResetKey}\n idPrefix={`${idPrefix}-add`}\n disabled={addState.loading}\n onChange={setTopAttach}\n onInsertImage={(fileId, filename) =>\n setDraft((current) => appendImageEmbed(current, fileId, filename))\n }\n onRemoveImage={(fileId) => setDraft((current) => removeImageEmbed(current, fileId))}\n />\n <div className=\"flex justify-end\">\n <Button\n size=\"sm\"\n onClick={() => void submitTop()}\n disabled={!trimmed || tooLong || addState.loading || topAttach.pending}\n data-testid=\"comment-post\"\n >\n {addState.loading\n ? 'Posting…'\n : topAttach.pending\n ? 'Preparing attachments…'\n : 'Comment'}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\ninterface RowMutationProps {\n target: CommentFileTarget;\n editMutation: DocumentNode;\n removeMutation: DocumentNode;\n mutationRefetch: { refetchQueries: string[]; awaitRefetchQueries: boolean };\n onError: (message: string | null) => void;\n idPrefix: string;\n workspaceId?: string;\n authToken?: string;\n apiGatewayUrl?: string;\n}\n\n/**\n * One top-level comment: header, body, its replies (indented), a Reply action, and — top-level only — the\n * Resolve/Reopen toggle. A resolved thread starts collapsed to a one-line summary; expand/collapse is local UI\n * state that does not reset when Resolve/Reopen flips (so reopening mid-review doesn't yank the view around).\n */\nfunction TopLevelThread({\n comment,\n target,\n currentUserId,\n editMutation,\n removeMutation,\n resolveMutation,\n addMutation,\n buildReplyVariables,\n mutationRefetch,\n onError,\n idPrefix,\n workspaceId,\n authToken,\n apiGatewayUrl,\n onTyping,\n}: RowMutationProps & {\n comment: ThreadComment;\n currentUserId: string | undefined;\n resolveMutation: DocumentNode;\n addMutation: DocumentNode;\n buildReplyVariables: (body: string, attachmentFileIds: string[]) => Record<string, unknown>;\n /** CWF-24: signals typing while the reply box (the only composer a `TopLevelThread` instance owns) is active. */\n onTyping?: () => void;\n}) {\n const [editing, setEditing] = useState(false);\n const [text, setText] = useState(comment.body);\n const [expanded, setExpanded] = useState(comment.status !== 'RESOLVED');\n const [replyOpen, setReplyOpen] = useState(false);\n const [replyDraft, setReplyDraft] = useState('');\n const [replyingToName, setReplyingToName] = useState<string | null>(null);\n const [replyAttach, setReplyAttach] = useState<CommentAttachmentUploadState>({\n fileIds: [],\n pending: false,\n });\n const [replyAttachResetKey, setReplyAttachResetKey] = useState(0);\n const replyUploadEpochRef = useRef(0);\n\n const resetReplyAttachments = () => {\n replyUploadEpochRef.current += 1;\n setReplyAttach({ fileIds: [], pending: false });\n setReplyAttachResetKey(replyUploadEpochRef.current);\n };\n\n const authorProfile = usePersonProfile(comment.authorId);\n const [edit, editState] = useMutation(editMutation, mutationRefetch);\n const [remove, removeState] = useMutation(removeMutation, mutationRefetch);\n const [resolveComment, resolveState] = useMutation(resolveMutation, mutationRefetch);\n const [reply, replyState] = useMutation(addMutation, mutationRefetch);\n\n const mine = comment.authorId === currentUserId;\n const resolved = comment.status === 'RESOLVED';\n const editTooLong = text.trim().length > MAX_LENGTH;\n const replyTooLong = replyDraft.trim().length > MAX_LENGTH;\n\n const save = async () => {\n onError(null);\n try {\n await throwOnError(edit({ variables: { id: comment.id, body: text.trim() } }));\n setEditing(false);\n } catch (e) {\n onError(mutationErrorMessage(e, 'The comment could not be saved.'));\n }\n };\n\n const onRemove = async () => {\n onError(null);\n try {\n await throwOnError(remove({ variables: { id: comment.id } }));\n } catch (e) {\n onError(mutationErrorMessage(e, 'The comment could not be deleted.'));\n }\n };\n\n const toggleResolve = async () => {\n onError(null);\n try {\n await throwOnError(resolveComment({ variables: { id: comment.id, resolved: !resolved } }));\n } catch (e) {\n onError(\n isForbidden(e)\n ? 'Your role can read but not resolve comments.'\n : mutationErrorMessage(e, 'The resolution could not be changed.')\n );\n }\n };\n\n const openReply = (name: string, mentionId?: string, mentionName?: string) => {\n setReplyingToName(name);\n setReplyDraft(mentionId && mentionName ? `@[${mentionName}](${mentionId}) ` : '');\n setReplyOpen(true);\n setExpanded(true);\n };\n\n const submitReply = async () => {\n const body = replyDraft.trim();\n if (!body) return;\n onError(null);\n try {\n await throwOnError(reply({ variables: buildReplyVariables(body, replyAttach.fileIds) }));\n setReplyDraft('');\n setReplyOpen(false);\n setReplyingToName(null);\n resetReplyAttachments();\n } catch (e) {\n onError(\n isForbidden(e)\n ? 'Your role can read but not comment.'\n : mutationErrorMessage(e, 'The reply could not be posted.')\n );\n }\n };\n\n const rowId = `${idPrefix}-comment-${comment.id}`;\n\n return (\n <li\n className=\"rounded-md border border-border-default p-3 space-y-2\"\n data-testid=\"comment-thread-item\"\n >\n {resolved && !expanded ? (\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"min-w-0 truncate text-sm text-muted-foreground\">\n <CheckCircle2\n className=\"mr-1 inline h-3.5 w-3.5 text-status-success-text\"\n aria-hidden=\"true\"\n />\n Resolved by <PersonName id={comment.resolvedBy} />\n {comment.resolvedAt ? ` · ${when(comment.resolvedAt)}` : ''}\n {comment.replies.length > 0\n ? ` · ${comment.replies.length} repl${comment.replies.length === 1 ? 'y' : 'ies'}`\n : ''}\n </p>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 shrink-0 px-2 text-xs\"\n aria-expanded={false}\n aria-controls={rowId}\n onClick={() => setExpanded(true)}\n >\n <ChevronRight className=\"mr-1 h-3.5 w-3.5\" aria-hidden=\"true\" />\n Expand\n </Button>\n </div>\n ) : (\n <div id={rowId} className=\"space-y-2\">\n <div className=\"flex items-start justify-between gap-2 text-xs text-muted-foreground\">\n <span>\n <span className=\"font-medium text-foreground\">\n <PersonName id={comment.authorId} />\n </span>{' '}\n · {when(comment.createdAt)}\n {comment.editedAt && (\n <span title={`Edited ${when(comment.editedAt)}`}> · edited</span>\n )}\n {resolved && (\n <span className=\"ml-1 inline-flex items-center gap-1 text-status-success-text\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n Resolved\n </span>\n )}\n </span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {mine && !editing && (\n <>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => setEditing(true)}\n >\n Edit\n </Button>\n <ConfirmButton\n label=\"\"\n ariaLabel=\"Delete comment\"\n variant=\"outline\"\n icon={<Trash2 className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />}\n title=\"Delete this comment?\"\n description=\"It is removed from the discussion for everyone, replies included. This cannot be undone here.\"\n confirmLabel=\"Delete\"\n destructive\n disabled={removeState.loading}\n onConfirm={() => void onRemove()}\n />\n </>\n )}\n <Button\n size=\"sm\"\n variant={resolved ? 'outline' : 'ghost'}\n className=\"h-6 px-2 text-xs\"\n data-testid=\"comment-resolve\"\n disabled={resolveState.loading}\n onClick={() => void toggleResolve()}\n >\n {resolved ? (\n <>\n <RotateCcw className=\"mr-1 h-3.5 w-3.5\" aria-hidden=\"true\" />\n Reopen\n </>\n ) : (\n <>\n <CheckCircle2 className=\"mr-1 h-3.5 w-3.5\" aria-hidden=\"true\" />\n Resolve\n </>\n )}\n </Button>\n {resolved && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 text-xs\"\n aria-expanded\n aria-controls={rowId}\n onClick={() => setExpanded(false)}\n >\n <ChevronDown className=\"mr-1 h-3.5 w-3.5\" aria-hidden=\"true\" />\n Collapse\n </Button>\n )}\n </span>\n </div>\n\n {editing ? (\n <div className=\"space-y-2\">\n <MentionComposer\n id={`${rowId}-edit`}\n ariaLabel=\"Edit comment\"\n className=\"min-h-[60px]\"\n value={text}\n onChange={setText}\n workspaceId={workspaceId}\n authToken={authToken}\n apiGatewayUrl={apiGatewayUrl}\n />\n {editTooLong && (\n <ErrorLine message={`A comment can be at most ${MAX_LENGTH} characters.`} />\n )}\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setEditing(false);\n setText(comment.body);\n onError(null);\n }}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void save()}\n disabled={!text.trim() || editTooLong || editState.loading}\n >\n {editState.loading ? 'Saving…' : 'Save'}\n </Button>\n </div>\n </div>\n ) : (\n <CommentBody text={comment.body} attachments={comment.attachments} target={target} />\n )}\n\n {!editing && comment.attachments.length > 0 && (\n <CommentAttachments attachments={comment.attachments} target={target} />\n )}\n\n {!editing && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 text-xs\"\n data-testid=\"comment-reply\"\n onClick={() =>\n openReply(\n authorProfile?.displayName ?? 'this comment',\n comment.authorId,\n authorProfile?.displayName\n )\n }\n >\n <Reply className=\"mr-1 h-3.5 w-3.5\" aria-hidden=\"true\" />\n Reply\n </Button>\n )}\n\n {comment.replies.length > 0 && (\n <ol className=\"ml-5 space-y-2 border-l border-border-default pl-3\">\n {comment.replies.map((r) => (\n <ReplyItem\n key={r.id}\n reply={r}\n target={target}\n currentUserId={currentUserId}\n editMutation={editMutation}\n removeMutation={removeMutation}\n mutationRefetch={mutationRefetch}\n onError={onError}\n idPrefix={idPrefix}\n workspaceId={workspaceId}\n authToken={authToken}\n apiGatewayUrl={apiGatewayUrl}\n onReply={openReply}\n />\n ))}\n </ol>\n )}\n\n {replyOpen && (\n <div className=\"ml-5 space-y-2 border-l border-border-default pl-3\">\n {replyingToName && (\n <p className=\"text-xs text-muted-foreground\">Replying to {replyingToName}</p>\n )}\n <MentionComposer\n id={`${rowId}-reply`}\n ariaLabel=\"Write a reply\"\n className=\"min-h-[60px]\"\n value={replyDraft}\n disabled={replyState.loading}\n onChange={(value) => {\n setReplyDraft(value);\n onTyping?.();\n }}\n autoFocus\n workspaceId={workspaceId}\n authToken={authToken}\n apiGatewayUrl={apiGatewayUrl}\n />\n {replyTooLong && (\n <ErrorLine message={`A comment can be at most ${MAX_LENGTH} characters.`} />\n )}\n <CommentAttachmentUpload\n key={replyAttachResetKey}\n idPrefix={`${rowId}-reply`}\n disabled={replyState.loading}\n onChange={(state) => {\n if (replyAttachResetKey === replyUploadEpochRef.current) setReplyAttach(state);\n }}\n onInsertImage={(fileId, filename) =>\n setReplyDraft((current) => appendImageEmbed(current, fileId, filename))\n }\n onRemoveImage={(fileId) =>\n setReplyDraft((current) => removeImageEmbed(current, fileId))\n }\n />\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={replyState.loading}\n onClick={() => {\n setReplyOpen(false);\n setReplyDraft('');\n setReplyingToName(null);\n // Ignore any callback from the old picker even if its in-flight upload resolves before\n // React runs the unmount cleanup. A reopened Reply gets a fresh upload generation.\n resetReplyAttachments();\n }}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void submitReply()}\n disabled={\n !replyDraft.trim() || replyTooLong || replyState.loading || replyAttach.pending\n }\n >\n {replyState.loading\n ? 'Posting…'\n : replyAttach.pending\n ? 'Preparing attachments…'\n : 'Reply'}\n </Button>\n </div>\n </div>\n )}\n </div>\n )}\n </li>\n );\n}\n\n/** One reply, indented under its top-level parent. Replies carry no resolution state of their own (only a\n * top-level comment does — CWF-14) and their own Reply action still targets the TOP-LEVEL thread\n * (`onReply` is the parent's `openReply`, called with this reply's own author as the \"replying to\" context). */\nfunction ReplyItem({\n reply,\n target,\n currentUserId,\n editMutation,\n removeMutation,\n mutationRefetch,\n onError,\n idPrefix,\n workspaceId,\n authToken,\n apiGatewayUrl,\n onReply,\n}: RowMutationProps & {\n reply: ThreadComment;\n currentUserId: string | undefined;\n onReply: (name: string, mentionId?: string, mentionName?: string) => void;\n}) {\n const [editing, setEditing] = useState(false);\n const [text, setText] = useState(reply.body);\n const profile = usePersonProfile(reply.authorId);\n const [edit, editState] = useMutation(editMutation, mutationRefetch);\n const [remove, removeState] = useMutation(removeMutation, mutationRefetch);\n\n const mine = reply.authorId === currentUserId;\n const editTooLong = text.trim().length > MAX_LENGTH;\n\n const save = async () => {\n onError(null);\n try {\n await throwOnError(edit({ variables: { id: reply.id, body: text.trim() } }));\n setEditing(false);\n } catch (e) {\n onError(mutationErrorMessage(e, 'The reply could not be saved.'));\n }\n };\n\n const onRemove = async () => {\n onError(null);\n try {\n await throwOnError(remove({ variables: { id: reply.id } }));\n } catch (e) {\n onError(mutationErrorMessage(e, 'The reply could not be deleted.'));\n }\n };\n\n return (\n <li className=\"space-y-1\" data-testid=\"comment-reply-item\">\n <div className=\"flex items-start justify-between gap-2 text-xs text-muted-foreground\">\n <span>\n <span className=\"font-medium text-foreground\">\n <PersonName id={reply.authorId} />\n </span>{' '}\n · {when(reply.createdAt)}\n {reply.editedAt && <span title={`Edited ${when(reply.editedAt)}`}> · edited</span>}\n </span>\n {mine && !editing && (\n <span className=\"flex shrink-0 items-center gap-1\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => setEditing(true)}\n >\n Edit\n </Button>\n <ConfirmButton\n label=\"\"\n ariaLabel=\"Delete reply\"\n variant=\"outline\"\n icon={<Trash2 className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />}\n title=\"Delete this reply?\"\n description=\"It is removed from the discussion for everyone. This cannot be undone here.\"\n confirmLabel=\"Delete\"\n destructive\n disabled={removeState.loading}\n onConfirm={() => void onRemove()}\n />\n </span>\n )}\n </div>\n\n {editing ? (\n <div className=\"space-y-2\">\n <MentionComposer\n id={`${idPrefix}-reply-${reply.id}-edit`}\n ariaLabel=\"Edit reply\"\n className=\"min-h-[56px]\"\n value={text}\n onChange={setText}\n workspaceId={workspaceId}\n authToken={authToken}\n apiGatewayUrl={apiGatewayUrl}\n />\n {editTooLong && (\n <ErrorLine message={`A comment can be at most ${MAX_LENGTH} characters.`} />\n )}\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setEditing(false);\n setText(reply.body);\n onError(null);\n }}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void save()}\n disabled={!text.trim() || editTooLong || editState.loading}\n >\n {editState.loading ? 'Saving…' : 'Save'}\n </Button>\n </div>\n </div>\n ) : (\n <CommentBody text={reply.body} attachments={reply.attachments} target={target} />\n )}\n\n {!editing && reply.attachments.length > 0 && (\n <CommentAttachments attachments={reply.attachments} target={target} />\n )}\n\n {!editing && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 text-xs\"\n data-testid=\"comment-reply\"\n onClick={() =>\n onReply(profile?.displayName ?? 'this reply', reply.authorId, profile?.displayName)\n }\n >\n <Reply className=\"mr-1 h-3.5 w-3.5\" aria-hidden=\"true\" />\n Reply\n </Button>\n )}\n </li>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA+CA,IAAM,IAAO,IACP,IAAa,KAkEb,KAAQ,MAAgB,IAAI,KAAK,EAAI,CAAC,gBAAgB;AAE5D,SAAgB,EAAc,EAC5B,WACA,eACA,aACA,UACA,QACA,UACA,WACA,aACA,oBACA,iBACA,eACqB;CACrB,IAAM,EAAE,iBAAa,gBAAa,cAAW,qBAAkB,GAAe,EACxE,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,CAAC,GAAO,KAAY,EAAwB,KAAK,EACjD,CAAC,GAAa,KAAkB,EAAS,GAAM,EAC/C,CAAC,GAAQ,KAAa,EAAsC,MAAM,EAClE,CAAC,GAAW,KAAgB,EAAuC;EACvE,SAAS,EAAE;EACX,SAAS;EACV,CAAC,EAGI,CAAC,GAAmB,KAAwB,EAAS,EAAE,EAEvD,IAAkB;EAAE;EAAgB,qBAAqB;EAAM,EAE/D,EACJ,UACA,YACA,OAAO,IACP,iBACE,EAA0B,EAAM,UAAU;EAC5C,WAAW;GAAE,GAAG,EAAM;GAAW,YAAY,EAAE,OAAO,GAAM;GAAE;EAC9D,MAAM,EAAM;EACb,CAAC,EACI,CAAC,GAAY,KAAY,EAAY,EAAI,UAAU,EAAgB,EAEnE,IAAS,KAAO,EAAM,UAEtB,IAAW,GAAQ,SAAS,EAAE,EAC9B,IAAU,MAAW,QAAQ,IAAW,EAAS,QAAQ,MAAM,EAAE,WAAW,EAAO,EACnF,IAAY,EAAS,QAAQ,MAAM,EAAE,WAAW,OAAO,CAAC,QACxD,KAAgB,EAAS,SAAS,GAElC,IAAU,EAAM,MAAM,EACtB,IAAU,EAAQ,SAAS;AAEjC,SAAgB;AACd,EAAI,KAAQ,IAAe,EAAO,WAAW;IAC5C,CAAC,GAAQ,EAAa,CAAC;CAE1B,IAAM,KAAO,OACX,GACA,GACA,MACqB;AACrB,IAAS,KAAK;AACd,MAAI;AAIF,UAHA,MAAM,EACJ,EAAW,EAAE,WAAW,EAAI,eAAe,GAAM,GAAU,EAAkB,EAAE,CAAC,CACjF,EACM;WACA,GAAG;AAMV,UALA,EACE,EAAY,EAAE,GACV,wCACA,EAAqB,GAAG,mCAAmC,CAChE,EACM;;IAIL,KAAY,YAAY;AAC5B,EAAI,MAAM,GAAK,GAAS,MAAM,EAAU,QAAQ,KAC9C,EAAS,GAAG,EACZ,EAAa;GAAE,SAAS,EAAE;GAAE,SAAS;GAAO,CAAC,EAC7C,GAAsB,MAAM,IAAI,EAAE;IAIhC,KAAW,YAAY;EAC3B,IAAM,IAAQ,GAAQ,SAAS;AAC1B,SACL;KAAe,GAAK;AACpB,OAAI;AACF,UAAM,EAAU;KACd,WAAW;MAAE,GAAG,EAAM;MAAW,YAAY;OAAE,OAAO;OAAM;OAAO;MAAE;KACrE,cAAc,GAAM,EAAE,0BAAuB,GAC1C,EAAM,UAAU;MACf,GAAG,EAAgB,EAAM;MACzB,OAAO,CAAC,GAAG,EAAK,EAAM,SAAS,OAAO,GAAG,EAAgB,EAAM,SAAS,MAAM;MAC/E,EACF;KACF,CAAC;aACM;AACR,MAAe,GAAM;;;;AAIzB,QACE,kBAAC,OAAD;EAAK,WAAU;EAAY,eAAY;YAAvC;GACG,KAAS,kBAAC,GAAD,EAAW,SAAS,GAAS,CAAA;GACtC,KAAW,CAAC,MAAQ,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAqB,CAAA;GACtF,MAAa,kBAAC,GAAD,EAAW,SAAS,iCAAiC,GAAU,WAAa,CAAA;GAEzF,KAAU,EAAS,SAAS,KAC3B,kBAAC,OAAD;IACE,MAAK;IACL,cAAW;IACX,eAAY;IACZ,WAAU;cAGR;KACE,CAAC,QAAQ,SAAS,EAAU,GAAG;KAC/B,CAAC,YAAY,aAAa,GAAc,GAAG;KAC3C,CAAC,OAAO,QAAQ,EAAS,OAAO,GAAG;KACpC,CACD,KAAK,CAAC,GAAM,OACZ,kBAAC,GAAD;KAEE,MAAK;KACL,MAAK;KACL,SAAS,MAAW,IAAO,YAAY;KACvC,gBAAc,MAAW;KACzB,WAAU;KACV,eAAe,EAAU,EAAK;eAE7B;KACM,EATF,EASE,CACT;IACE,CAAA;GAGP,KAAU,EAAQ,WAAW,KAC5B,kBAAC,KAAD;IAAG,WAAU;cACV,EAAS,WAAW,IAAI,qBAAqB;IAC5C,CAAA;GAGN,kBAAC,MAAD;IAAI,WAAU;cACX,EAAQ,KAAK,MACZ,kBAAC,GAAD;KAEW;KACD;KACR,eAAe,IAAa;KAC5B,cAAc;KACd,gBAAgB;KAChB,iBAAiB;KACjB,aAAa,EAAI;KACjB,sBAAsB,GAAM,MAC1B,EAAI,eAAe,GAAM,EAAQ,IAAI,EAAkB;KAExC;KACjB,SAAS;KACC;KACG;KACF;KACI;KACf,UAAU,GAAU;KACpB,EAlBK,EAAQ,GAkBb,CACF;IACC,CAAA;GAEJ,GAAQ,SAAS,eAChB,kBAAC,GAAD;IAAQ,MAAK;IAAK,SAAQ;IAAU,eAAe,KAAK,IAAU;IAAE,UAAU;cAC3E,IAAc,aAAa,cAAc,EAAS,OAAO,MAAM,EAAO,WAAW;IAC3E,CAAA;GAGV,KAAY,kBAAC,GAAD,EAAY,gBAAgB,EAAS,gBAAkB,CAAA;GAEpE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,SAAD;MAAO,SAAS,GAAG,EAAS;MAAO,WAAU;gBAAU;MAE/C,CAAA;KACR,kBAAC,GAAD;MACE,IAAI,GAAG,EAAS;MAChB,WAAW,yBAAyB;MACpC,aAAY;MACZ,WAAU;MACV,OAAO;MACP,UAAU,EAAS;MACnB,WAAW,MAAU;AAEnB,OADA,EAAS,EAAM,EACf,GAAU,cAAc;;MAEb;MACF;MACI;MACf,CAAA;KACD,KAAW,kBAAC,GAAD,EAAW,SAAS,4BAA4B,EAAW,eAAiB,CAAA;KACxF,kBAAC,IAAD;MAEE,UAAU,GAAG,EAAS;MACtB,UAAU,EAAS;MACnB,UAAU;MACV,gBAAgB,GAAQ,MACtB,GAAU,MAAY,GAAiB,GAAS,GAAQ,EAAS,CAAC;MAEpE,gBAAgB,MAAW,GAAU,MAAY,GAAiB,GAAS,EAAO,CAAC;MACnF,EARK,EAQL;KACF,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OACE,MAAK;OACL,eAAe,KAAK,IAAW;OAC/B,UAAU,CAAC,KAAW,KAAW,EAAS,WAAW,EAAU;OAC/D,eAAY;iBAEX,EAAS,UACN,aACA,EAAU,UACR,2BACA;OACC,CAAA;MACL,CAAA;KACF;;GACF;;;AAqBV,SAAS,EAAe,EACtB,YACA,WACA,kBACA,iBACA,mBACA,oBACA,gBACA,wBACA,oBACA,YACA,aACA,gBACA,cACA,kBACA,eASC;CACD,IAAM,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAM,KAAW,EAAS,EAAQ,KAAK,EACxC,CAAC,IAAU,KAAe,EAAS,EAAQ,WAAW,WAAW,EACjE,CAAC,IAAW,KAAgB,EAAS,GAAM,EAC3C,CAAC,GAAY,KAAiB,EAAS,GAAG,EAC1C,CAAC,GAAgB,KAAqB,EAAwB,KAAK,EACnE,CAAC,GAAa,KAAkB,EAAuC;EAC3E,SAAS,EAAE;EACX,SAAS;EACV,CAAC,EACI,CAAC,IAAqB,KAA0B,EAAS,EAAE,EAC3D,IAAsB,GAAO,EAAE,EAE/B,WAA8B;AAGlC,EAFA,EAAoB,WAAW,GAC/B,EAAe;GAAE,SAAS,EAAE;GAAE,SAAS;GAAO,CAAC,EAC/C,EAAuB,EAAoB,QAAQ;IAG/C,KAAgB,EAAiB,EAAQ,SAAS,EAClD,CAAC,IAAM,MAAa,EAAY,GAAc,EAAgB,EAC9D,CAAC,IAAQ,MAAe,EAAY,GAAgB,EAAgB,EACpE,CAAC,IAAgB,MAAgB,EAAY,GAAiB,EAAgB,EAC9E,CAAC,IAAO,KAAc,EAAY,GAAa,EAAgB,EAE/D,KAAO,EAAQ,aAAa,GAC5B,IAAW,EAAQ,WAAW,YAC9B,KAAc,EAAK,MAAM,CAAC,SAAS,GACnC,KAAe,EAAW,MAAM,CAAC,SAAS,GAE1C,KAAO,YAAY;AACvB,IAAQ,KAAK;AACb,MAAI;AAEF,GADA,MAAM,EAAa,GAAK,EAAE,WAAW;IAAE,IAAI,EAAQ;IAAI,MAAM,EAAK,MAAM;IAAE,EAAE,CAAC,CAAC,EAC9E,EAAW,GAAM;WACV,GAAG;AACV,KAAQ,EAAqB,GAAG,kCAAkC,CAAC;;IAIjE,KAAW,YAAY;AAC3B,IAAQ,KAAK;AACb,MAAI;AACF,SAAM,EAAa,GAAO,EAAE,WAAW,EAAE,IAAI,EAAQ,IAAI,EAAE,CAAC,CAAC;WACtD,GAAG;AACV,KAAQ,EAAqB,GAAG,oCAAoC,CAAC;;IAInE,KAAgB,YAAY;AAChC,IAAQ,KAAK;AACb,MAAI;AACF,SAAM,EAAa,GAAe,EAAE,WAAW;IAAE,IAAI,EAAQ;IAAI,UAAU,CAAC;IAAU,EAAE,CAAC,CAAC;WACnF,GAAG;AACV,KACE,EAAY,EAAE,GACV,iDACA,EAAqB,GAAG,uCAAuC,CACpE;;IAIC,MAAa,GAAc,GAAoB,MAAyB;AAI5E,EAHA,EAAkB,EAAK,EACvB,EAAc,KAAa,IAAc,KAAK,EAAY,IAAI,EAAU,MAAM,GAAG,EACjF,EAAa,GAAK,EAClB,EAAY,GAAK;IAGb,KAAc,YAAY;EAC9B,IAAM,IAAO,EAAW,MAAM;AACzB,SACL;KAAQ,KAAK;AACb,OAAI;AAKF,IAJA,MAAM,EAAa,GAAM,EAAE,WAAW,EAAoB,GAAM,EAAY,QAAQ,EAAE,CAAC,CAAC,EACxF,EAAc,GAAG,EACjB,EAAa,GAAM,EACnB,EAAkB,KAAK,EACvB,IAAuB;YAChB,GAAG;AACV,MACE,EAAY,EAAE,GACV,wCACA,EAAqB,GAAG,iCAAiC,CAC9D;;;IAIC,IAAQ,GAAG,EAAS,WAAW,EAAQ;AAE7C,QACE,kBAAC,MAAD;EACE,WAAU;EACV,eAAY;YAEX,KAAY,CAAC,KACZ,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAb;KACE,kBAAC,GAAD;MACE,WAAU;MACV,eAAY;MACZ,CAAA;;KACU,kBAAC,GAAD,EAAY,IAAI,EAAQ,YAAc,CAAA;KACjD,EAAQ,aAAa,MAAM,EAAK,EAAQ,WAAW,KAAK;KACxD,EAAQ,QAAQ,SAAS,IACtB,MAAM,EAAQ,QAAQ,OAAO,OAAO,EAAQ,QAAQ,WAAW,IAAI,MAAM,UACzE;KACF;OACJ,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,WAAU;IACV,iBAAe;IACf,iBAAe;IACf,eAAe,EAAY,GAAK;cANlC,CAQE,kBAAC,IAAD;KAAc,WAAU;KAAmB,eAAY;KAAS,CAAA,EAAA,SAEzD;MACL;OAEN,kBAAC,OAAD;GAAK,IAAI;GAAO,WAAU;aAA1B;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD,EAAA,UAAA;MACE,kBAAC,QAAD;OAAM,WAAU;iBACd,kBAAC,GAAD,EAAY,IAAI,EAAQ,UAAY,CAAA;OAC/B,CAAA;MAAC;MAAI;MACT,EAAK,EAAQ,UAAU;MACzB,EAAQ,YACP,kBAAC,QAAD;OAAM,OAAO,UAAU,EAAK,EAAQ,SAAS;iBAAI;OAAgB,CAAA;MAElE,KACC,kBAAC,QAAD;OAAM,WAAU;iBAAhB,CACE,kBAAC,GAAD;QAAc,WAAU;QAAc,eAAY;QAAS,CAAA,EAAA,WAEtD;;MAEJ,EAAA,CAAA,EACP,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACG,MAAQ,CAAC,KACR,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;QACE,MAAK;QACL,SAAQ;QACR,WAAU;QACV,eAAe,EAAW,GAAK;kBAChC;QAEQ,CAAA,EACT,kBAAC,GAAD;QACE,OAAM;QACN,WAAU;QACV,SAAQ;QACR,MAAM,kBAAC,IAAD;SAAQ,WAAU;SAAc,eAAY;SAAS,CAAA;QAC3D,OAAM;QACN,aAAY;QACZ,cAAa;QACb,aAAA;QACA,UAAU,GAAY;QACtB,iBAAiB,KAAK,IAAU;QAChC,CAAA,CACD,EAAA,CAAA;OAEL,kBAAC,GAAD;QACE,MAAK;QACL,SAAS,IAAW,YAAY;QAChC,WAAU;QACV,eAAY;QACZ,UAAU,GAAa;QACvB,eAAe,KAAK,IAAe;kBAElC,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;SAAW,WAAU;SAAmB,eAAY;SAAS,CAAA,EAAA,SAE5D,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;SAAc,WAAU;SAAmB,eAAY;SAAS,CAAA,EAAA,UAE/D,EAAA,CAAA;QAEE,CAAA;OACR,KACC,kBAAC,GAAD;QACE,MAAK;QACL,SAAQ;QACR,WAAU;QACV,iBAAA;QACA,iBAAe;QACf,eAAe,EAAY,GAAM;kBANnC,CAQE,kBAAC,IAAD;SAAa,WAAU;SAAmB,eAAY;SAAS,CAAA,EAAA,WAExD;;OAEN;QACH;;IAEL,IACC,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OACE,IAAI,GAAG,EAAM;OACb,WAAU;OACV,WAAU;OACV,OAAO;OACP,UAAU;OACG;OACF;OACI;OACf,CAAA;MACD,MACC,kBAAC,GAAD,EAAW,SAAS,4BAA4B,EAAW,eAAiB,CAAA;MAE9E,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,MAAK;QACL,SAAQ;QACR,eAAe;AAGb,SAFA,EAAW,GAAM,EACjB,EAAQ,EAAQ,KAAK,EACrB,EAAQ,KAAK;;kBAEhB;QAEQ,CAAA,EACT,kBAAC,GAAD;QACE,MAAK;QACL,eAAe,KAAK,IAAM;QAC1B,UAAU,CAAC,EAAK,MAAM,IAAI,MAAe,GAAU;kBAElD,GAAU,UAAU,YAAY;QAC1B,CAAA,CACL;;MACF;SAEN,kBAAC,GAAD;KAAa,MAAM,EAAQ;KAAM,aAAa,EAAQ;KAAqB;KAAU,CAAA;IAGtF,CAAC,KAAW,EAAQ,YAAY,SAAS,KACxC,kBAAC,GAAD;KAAoB,aAAa,EAAQ;KAAqB;KAAU,CAAA;IAGzE,CAAC,KACA,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,WAAU;KACV,eAAY;KACZ,eACE,GACE,IAAe,eAAe,gBAC9B,EAAQ,UACR,IAAe,YAChB;eAVL,CAaE,kBAAC,GAAD;MAAO,WAAU;MAAmB,eAAY;MAAS,CAAA,EAAA,QAElD;;IAGV,EAAQ,QAAQ,SAAS,KACxB,kBAAC,MAAD;KAAI,WAAU;eACX,EAAQ,QAAQ,KAAK,MACpB,kBAAC,GAAD;MAEE,OAAO;MACC;MACO;MACD;MACE;MACC;MACR;MACC;MACG;MACF;MACI;MACf,SAAS;MACT,EAbK,EAAE,GAaP,CACF;KACC,CAAA;IAGN,MACC,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,KACC,kBAAC,KAAD;OAAG,WAAU;iBAAb,CAA6C,gBAAa,EAAmB;;MAE/E,kBAAC,GAAD;OACE,IAAI,GAAG,EAAM;OACb,WAAU;OACV,WAAU;OACV,OAAO;OACP,UAAU,EAAW;OACrB,WAAW,MAAU;AAEnB,QADA,EAAc,EAAM,EACpB,KAAY;;OAEd,WAAA;OACa;OACF;OACI;OACf,CAAA;MACD,MACC,kBAAC,GAAD,EAAW,SAAS,4BAA4B,EAAW,eAAiB,CAAA;MAE9E,kBAAC,IAAD;OAEE,UAAU,GAAG,EAAM;OACnB,UAAU,EAAW;OACrB,WAAW,MAAU;AACnB,QAAI,OAAwB,EAAoB,WAAS,EAAe,EAAM;;OAEhF,gBAAgB,GAAQ,MACtB,GAAe,MAAY,GAAiB,GAAS,GAAQ,EAAS,CAAC;OAEzE,gBAAgB,MACd,GAAe,MAAY,GAAiB,GAAS,EAAO,CAAC;OAE/D,EAZK,GAYL;MACF,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,MAAK;QACL,SAAQ;QACR,UAAU,EAAW;QACrB,eAAe;AAMb,SALA,EAAa,GAAM,EACnB,EAAc,GAAG,EACjB,EAAkB,KAAK,EAGvB,IAAuB;;kBAE1B;QAEQ,CAAA,EACT,kBAAC,GAAD;QACE,MAAK;QACL,eAAe,KAAK,IAAa;QACjC,UACE,CAAC,EAAW,MAAM,IAAI,MAAgB,EAAW,WAAW,EAAY;kBAGzE,EAAW,UACR,aACA,EAAY,UACV,2BACA;QACC,CAAA,CACL;;MACF;;IAEJ;;EAEL,CAAA;;AAOT,SAAS,EAAU,EACjB,UACA,WACA,mBACA,kBACA,oBACA,oBACA,YACA,cACA,gBACA,eACA,mBACA,cAKC;CACD,IAAM,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAM,KAAW,EAAS,EAAM,KAAK,EACtC,IAAU,EAAiB,EAAM,SAAS,EAC1C,CAAC,GAAM,KAAa,EAAY,IAAc,EAAgB,EAC9D,CAAC,GAAQ,KAAe,EAAY,IAAgB,EAAgB,EAEpE,IAAO,EAAM,aAAa,IAC1B,IAAc,EAAK,MAAM,CAAC,SAAS,GAEnC,IAAO,YAAY;AACvB,IAAQ,KAAK;AACb,MAAI;AAEF,GADA,MAAM,EAAa,EAAK,EAAE,WAAW;IAAE,IAAI,EAAM;IAAI,MAAM,EAAK,MAAM;IAAE,EAAE,CAAC,CAAC,EAC5E,EAAW,GAAM;WACV,GAAG;AACV,KAAQ,EAAqB,GAAG,gCAAgC,CAAC;;IAI/D,IAAW,YAAY;AAC3B,IAAQ,KAAK;AACb,MAAI;AACF,SAAM,EAAa,EAAO,EAAE,WAAW,EAAE,IAAI,EAAM,IAAI,EAAE,CAAC,CAAC;WACpD,GAAG;AACV,KAAQ,EAAqB,GAAG,kCAAkC,CAAC;;;AAIvE,QACE,kBAAC,MAAD;EAAI,WAAU;EAAY,eAAY;YAAtC;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,QAAD,EAAA,UAAA;KACE,kBAAC,QAAD;MAAM,WAAU;gBACd,kBAAC,GAAD,EAAY,IAAI,EAAM,UAAY,CAAA;MAC7B,CAAA;KAAC;KAAI;KACT,EAAK,EAAM,UAAU;KACvB,EAAM,YAAY,kBAAC,QAAD;MAAM,OAAO,UAAU,EAAK,EAAM,SAAS;gBAAI;MAAgB,CAAA;KAC7E,EAAA,CAAA,EACN,KAAQ,CAAC,KACR,kBAAC,QAAD;KAAM,WAAU;eAAhB,CACE,kBAAC,GAAD;MACE,MAAK;MACL,SAAQ;MACR,WAAU;MACV,eAAe,EAAW,GAAK;gBAChC;MAEQ,CAAA,EACT,kBAAC,GAAD;MACE,OAAM;MACN,WAAU;MACV,SAAQ;MACR,MAAM,kBAAC,IAAD;OAAQ,WAAU;OAAc,eAAY;OAAS,CAAA;MAC3D,OAAM;MACN,aAAY;MACZ,cAAa;MACb,aAAA;MACA,UAAU,EAAY;MACtB,iBAAiB,KAAK,GAAU;MAChC,CAAA,CACG;OAEL;;GAEL,IACC,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,IAAI,GAAG,GAAS,SAAS,EAAM,GAAG;MAClC,WAAU;MACV,WAAU;MACV,OAAO;MACP,UAAU;MACG;MACF;MACI;MACf,CAAA;KACD,KACC,kBAAC,GAAD,EAAW,SAAS,4BAA4B,EAAW,eAAiB,CAAA;KAE9E,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,MAAK;OACL,SAAQ;OACR,eAAe;AAGb,QAFA,EAAW,GAAM,EACjB,EAAQ,EAAM,KAAK,EACnB,EAAQ,KAAK;;iBAEhB;OAEQ,CAAA,EACT,kBAAC,GAAD;OACE,MAAK;OACL,eAAe,KAAK,GAAM;OAC1B,UAAU,CAAC,EAAK,MAAM,IAAI,KAAe,EAAU;iBAElD,EAAU,UAAU,YAAY;OAC1B,CAAA,CACL;;KACF;QAEN,kBAAC,GAAD;IAAa,MAAM,EAAM;IAAM,aAAa,EAAM;IAAqB;IAAU,CAAA;GAGlF,CAAC,KAAW,EAAM,YAAY,SAAS,KACtC,kBAAC,GAAD;IAAoB,aAAa,EAAM;IAAqB;IAAU,CAAA;GAGvE,CAAC,KACA,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,WAAU;IACV,eAAY;IACZ,eACE,EAAQ,GAAS,eAAe,cAAc,EAAM,UAAU,GAAS,YAAY;cANvF,CASE,kBAAC,GAAD;KAAO,WAAU;KAAmB,eAAY;KAAS,CAAA,EAAA,QAElD;;GAER"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MentionComposer.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/MentionComposer.tsx"],"names":[],"mappings":"AAuDA,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;+GAC+G;AAC/G,wBAAgB,eAAe,CAAC,EAC9B,EAAE,EACF,KAAK,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAgB,EAChB,SAAS,EACT,SAAiB,EACjB,WAAW,EACX,SAAS,EACT,aAAa,GACd,EAAE,oBAAoB,2CAuVtB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MentionComposer.js","names":[],"sources":["../../../src/planmagnet/comments/MentionComposer.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { useWorkspaceDirectory, type WorkspaceDirectoryMember } from '@burdenoff/fe-libs/sharing';\nimport {\n Button,\n Input,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { Bold, Code2, Italic, Link2 } from 'lucide-react';\n\n/**\n * @-mention support (CWF-13) and the CWF-12 formatting toolbar (bold, italic, code, link), shared by every\n * comment composer — the top-level \"Add a comment\" box, a reply box and an edit box, on all three surfaces this\n * MFE has comments on (task, project, doc; see CommentThread.tsx).\n *\n * A mention is stored as the literal token `@[Name](actorId)` inside the comment body — the server parses it out\n * of the raw text (`PlanmagnetComment.mentions` / `PlanmagnetWorkItemComment.mentions` in graphql/wspace.graphql\n * are populated FROM this token, read-only). There is no separate \"mention\" API call: typing \"@\", picking someone\n * and posting the comment is the whole mechanism.\n *\n * Suggestions reuse the same workspace directory the assignee picker already calls\n * (`useWorkspaceDirectory`, see `controls/WorkItemControls.tsx`'s `useAssigneeOptions`): one paged list of\n * members, filtered case-insensitively client-side by `.search(query)`. The dropdown is anchored to the\n * composer box itself, not to the caret's pixel position — a caret-coordinate \"mirror div\" measurement is the\n * textbook way to do that, but it is fragile across zoom levels, font loading and line-wrap, and not worth it for\n * a box this short; anchoring to the field is the same trade-off GitHub's and Linear's own comment composers make.\n *\n * Mention delivery: the server records `mentions` but does NOT notify anyone yet (BOFF-7927, see the schema doc\n * comment on `mentions`) — this component only inserts the token and later renders it highlighted\n * (`CommentBody.tsx`), and never implies a mentioned person was paged, emailed or pushed.\n *\n * The toolbar inserts the same markdown-shaped tokens `CommentBody.tsx` renders and\n * wspace-planmagnet-svc's `rich-text-sanitizer.ts` accepts on write — it does not itself sanitize anything (the\n * server does, on every add/edit mutation); it only spares the author from memorizing the syntax. The Link\n * button refuses anything that isn't an `https://` url client-side too, so a typo never round-trips through the\n * server only to come back degraded to inert \"blocked link\" text.\n */\n\nconst MAX_SUGGESTIONS = 6;\n/** `@name` trigger: an \"@\" that starts a word (line start or preceded by whitespace), followed by up to 40\n * non-space, non-\"@\" characters up to the caret. Requiring a word boundary before \"@\" keeps this from firing\n * mid-token on something like an email address (\"ada@example.com\"). */\nconst TRIGGER_PATTERN = /(?:^|\\s)@([^\\s@]{0,40})$/;\n\nfunction findTrigger(text: string, caret: number): { start: number; query: string } | null {\n const head = text.slice(0, caret);\n const match = TRIGGER_PATTERN.exec(head);\n if (!match) return null;\n const start = match[0].startsWith('@') ? match.index : match.index + 1;\n return { start, query: match[1] };\n}\n\nexport interface MentionComposerProps {\n id: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n ariaLabel?: string;\n disabled?: boolean;\n /** Merged with the Textarea's own base styling (e.g. `\"min-h-[60px]\"` for a reply box). */\n className?: string;\n autoFocus?: boolean;\n workspaceId?: string;\n authToken?: string;\n apiGatewayUrl?: string;\n}\n\n/** A plain multi-line composer with an @-mention autocomplete overlay. Controlled, like every other composer in\n * this MFE (`value`/`onChange`) — the mention token is spliced into that same string, never a side channel. */\nexport function MentionComposer({\n id,\n value,\n onChange,\n placeholder,\n ariaLabel,\n disabled = false,\n className,\n autoFocus = false,\n workspaceId,\n authToken,\n apiGatewayUrl,\n}: MentionComposerProps) {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n // Selection to restore after a mention/toolbar insertion splices the text — `value` is controlled by the\n // parent, so the new selection can only be applied once the DOM has the new text (the effect below, keyed on\n // `value`). A range rather than a bare caret position so a toolbar wrap (e.g. **bold text**) can leave the\n // inserted placeholder word SELECTED — the author can just start typing over it, same as every other editor's\n // toolbar — while a mention insertion (a collapsed `start === end` range) still lands the caret as before.\n const pendingSelectionRef = useRef<{ start: number; end: number } | null>(null);\n const [trigger, setTrigger] = useState<{ start: number; query: string } | null>(null);\n const [highlight, setHighlight] = useState(0);\n const [linkOpen, setLinkOpen] = useState(false);\n const [linkUrl, setLinkUrl] = useState('');\n const [linkLabel, setLinkLabel] = useState('');\n const [linkError, setLinkError] = useState<string | null>(null);\n\n const directory = useWorkspaceDirectory({\n workspaceId: workspaceId ?? '',\n authToken,\n apiGatewayUrl,\n });\n const { search, hasMore, fetchMore } = directory;\n\n useEffect(() => {\n search(trigger?.query ?? '');\n }, [trigger?.query, search]);\n\n useEffect(() => {\n if (pendingSelectionRef.current && textareaRef.current) {\n const { start, end } = pendingSelectionRef.current;\n pendingSelectionRef.current = null;\n textareaRef.current.focus();\n textareaRef.current.setSelectionRange(start, end);\n }\n }, [value]);\n\n const options = useMemo(\n () => (trigger ? directory.members.slice(0, MAX_SUGGESTIONS) : []),\n [trigger, directory.members]\n );\n const open = trigger !== null && !disabled;\n\n // Resets the highlighted option whenever the trigger changes (new \"@query\", or it closed/opened) — done here,\n // synchronously with the same event that changed it, rather than in an effect keyed on `trigger?.query`\n // (react-hooks/set-state-in-effect: a setState called directly in an effect body cascades an extra render).\n const recomputeTrigger = (text: string, caret: number) => {\n setTrigger(findTrigger(text, caret));\n setHighlight(0);\n };\n\n const insertMention = (member: WorkspaceDirectoryMember) => {\n if (!trigger) return;\n const end = trigger.start + 1 + trigger.query.length;\n const token = `@[${member.name}](${member.id})`;\n const next = `${value.slice(0, trigger.start)}${token} ${value.slice(end)}`;\n const caret = trigger.start + token.length + 1;\n pendingSelectionRef.current = { start: caret, end: caret };\n setTrigger(null);\n onChange(next);\n };\n\n /** Current selection in the textarea (or a collapsed caret at the end of the value when the ref isn't mounted\n * yet — defensive only, the textarea is always mounted by the time a toolbar button is clickable). */\n const currentSelection = () => {\n const el = textareaRef.current;\n return { start: el?.selectionStart ?? value.length, end: el?.selectionEnd ?? value.length };\n };\n\n /** Wraps the current selection (or inserts `placeholder`, pre-selected, when nothing is selected) in\n * `prefix`/`suffix` — the shared mechanic behind the Bold/Italic/Code toolbar buttons. Leaves the wrapped\n * text selected afterwards so typing immediately replaces it, same as every other rich-text toolbar. */\n const wrapSelection = (prefix: string, suffix: string, placeholder: string) => {\n const { start, end } = currentSelection();\n const hasSelection = end > start;\n const inner = hasSelection ? value.slice(start, end) : placeholder;\n const next = `${value.slice(0, start)}${prefix}${inner}${suffix}${value.slice(end)}`;\n pendingSelectionRef.current = {\n start: start + prefix.length,\n end: start + prefix.length + inner.length,\n };\n setTrigger(null);\n onChange(next);\n };\n\n const applyCode = () => {\n const { start, end } = currentSelection();\n // A multi-line selection becomes a fenced block (the inline-code shape in the grammar explicitly excludes\n // `\\n` — wspace-planmagnet-svc's INLINE_CODE_RE is `` [^`\\n]{1,500} `` — so wrapping multi-line text in\n // single backticks would post a body the server itself cannot round-trip as one inline-code span).\n if (value.slice(start, end).includes('\\n')) {\n wrapSelection('```\\n', '\\n```', 'code');\n } else {\n wrapSelection('`', '`', 'code');\n }\n };\n\n const openLinkPopover = () => {\n const { start, end } = currentSelection();\n setLinkLabel(value.slice(start, end));\n setLinkUrl('');\n setLinkError(null);\n setLinkOpen(true);\n };\n\n const submitLink = () => {\n const url = linkUrl.trim();\n // Same allow-list wspace-planmagnet-svc's sanitizer enforces (HTTPS_URL_RE) — refusing a non-https link\n // here means the author sees why immediately, instead of posting and getting back inert \"blocked link\" text.\n if (!/^https:\\/\\/[^\\s<>\"'`]+$/i.test(url)) {\n setLinkError('Enter a link starting with https://');\n return;\n }\n const { start, end } = currentSelection();\n const label = linkLabel.trim() || url;\n if (/[[\\]]/.test(label)) {\n setLinkError('Link text cannot contain [ or ].');\n return;\n }\n const token = `[${label}](${url})`;\n const next = `${value.slice(0, start)}${token}${value.slice(end)}`;\n const caret = start + token.length;\n pendingSelectionRef.current = { start: caret, end: caret };\n setTrigger(null);\n onChange(next);\n setLinkOpen(false);\n setLinkUrl('');\n setLinkLabel('');\n setLinkError(null);\n };\n\n const listId = `${id}-mentions`;\n const activeOption = open ? options[highlight] : undefined;\n\n return (\n <div className=\"relative\">\n <div\n role=\"toolbar\"\n aria-label=\"Formatting\"\n aria-controls={id}\n className=\"mb-1 flex items-center gap-0.5\"\n >\n <ToolbarButton\n icon={<Bold className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />}\n label=\"Bold\"\n disabled={disabled}\n onClick={() => wrapSelection('**', '**', 'bold text')}\n />\n <ToolbarButton\n icon={<Italic className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />}\n label=\"Italic\"\n disabled={disabled}\n onClick={() => wrapSelection('_', '_', 'italic text')}\n />\n <ToolbarButton\n icon={<Code2 className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />}\n label=\"Code\"\n disabled={disabled}\n onClick={applyCode}\n />\n <Popover\n open={linkOpen}\n onOpenChange={(isOpen) => {\n setLinkOpen(isOpen);\n if (!isOpen) setLinkError(null);\n }}\n >\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 w-6 p-0\"\n aria-label=\"Link\"\n title=\"Link\"\n disabled={disabled}\n onClick={openLinkPopover}\n >\n <Link2 className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-72 space-y-2\" align=\"start\">\n <div className=\"space-y-1\">\n <Label htmlFor={`${id}-link-url`}>Link URL</Label>\n <Input\n id={`${id}-link-url`}\n placeholder=\"https://example.com\"\n value={linkUrl}\n autoFocus\n onChange={(e) => {\n setLinkUrl(e.target.value);\n setLinkError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submitLink();\n }\n }}\n />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${id}-link-label`}>Link text (optional)</Label>\n <Input\n id={`${id}-link-label`}\n placeholder={linkUrl || 'Link text'}\n value={linkLabel}\n onChange={(e) => setLinkLabel(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submitLink();\n }\n }}\n />\n </div>\n {linkError && <p className=\"text-xs text-destructive\">{linkError}</p>}\n <div className=\"flex justify-end\">\n <Button type=\"button\" size=\"sm\" onClick={submitLink} disabled={!linkUrl.trim()}>\n Insert link\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n <Textarea\n ref={textareaRef}\n id={id}\n aria-label={ariaLabel}\n className={className}\n placeholder={placeholder}\n value={value}\n disabled={disabled}\n autoFocus={autoFocus}\n aria-expanded={open}\n aria-controls={open ? listId : undefined}\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n aria-activedescendant={activeOption ? `${listId}-${activeOption.id}` : undefined}\n onChange={(e) => {\n onChange(e.target.value);\n recomputeTrigger(e.target.value, e.target.selectionStart ?? e.target.value.length);\n }}\n onSelect={(e) => {\n const el = e.currentTarget;\n recomputeTrigger(el.value, el.selectionStart ?? el.value.length);\n }}\n onBlur={() => setTrigger(null)}\n onKeyDown={(e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (!open || options.length === 0) return;\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setHighlight((h) => (h + 1) % options.length);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setHighlight((h) => (h - 1 + options.length) % options.length);\n } else if (e.key === 'Enter' || e.key === 'Tab') {\n // `highlight` can only be stale within the bounds already guarded above (`options.length === 0`\n // returns early); still resolved defensively rather than indexing blind.\n const member = options[highlight] ?? options[0];\n if (!member) return;\n e.preventDefault();\n insertMention(member);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setTrigger(null);\n }\n }}\n />\n {open && (\n <div className=\"absolute z-20 mt-1 w-72 overflow-hidden rounded-md border border-border-default bg-bg-surface text-sm shadow-md\">\n <div\n role=\"listbox\"\n id={listId}\n aria-label=\"Workspace members\"\n data-testid=\"mention-suggestions\"\n className=\"max-h-56 overflow-y-auto p-1\"\n >\n {directory.loading && options.length === 0 && (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">Loading members…</p>\n )}\n {!directory.loading && options.length === 0 && (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">No matching members.</p>\n )}\n {options.map((member, i) => (\n <button\n key={member.id}\n type=\"button\"\n id={`${listId}-${member.id}`}\n role=\"option\"\n aria-selected={i === highlight}\n className={`flex w-full items-center justify-between gap-2 rounded-sm px-2 py-1.5 text-left ${\n i === highlight ? 'bg-primary/10 text-primary' : 'hover:bg-muted'\n }`}\n // mousedown (not click) + preventDefault: keeps focus (and the caret we're about to restore) on\n // the textarea instead of letting the browser blur it into this button first.\n onMouseDown={(e) => {\n e.preventDefault();\n insertMention(member);\n }}\n onMouseEnter={() => setHighlight(i)}\n >\n <span className=\"truncate font-medium\">{member.name}</span>\n {member.email && (\n <span className=\"shrink-0 truncate text-xs text-muted-foreground\">\n {member.email}\n </span>\n )}\n </button>\n ))}\n </div>\n {\n // The directory loads members a page (50) at a time (`useWorkspaceDirectory`, PAGE_SIZE) and\n // `search()` only filters what's already loaded — someone outside the first page is unmentionable\n // until more is fetched. Mirrors the \"Show more members\" affordance the assignee picker and the\n // roadmap reviewer picker already wire onto this same hook (WorkItemControls' AssigneeSelect,\n // RoadmapReviewPanel).\n hasMore && (\n <button\n type=\"button\"\n className=\"w-full border-t border-border-default px-2 py-1.5 text-left text-xs text-primary hover:bg-muted hover:underline\"\n // Same mousedown/preventDefault trick as the option buttons above: fetchMore() must not blur\n // the textarea (which would close the dropdown via onBlur before the click is handled).\n onMouseDown={(e) => {\n e.preventDefault();\n fetchMore();\n }}\n >\n Show more members\n </button>\n )\n }\n </div>\n )}\n <span className=\"sr-only\" aria-live=\"polite\">\n {open\n ? activeOption\n ? `${activeOption.name} highlighted, ${options.length} member${options.length === 1 ? '' : 's'} matching`\n : directory.loading\n ? 'Loading members'\n : 'No matching members'\n : ''}\n </span>\n </div>\n );\n}\n\n/** One formatting-toolbar action: an icon-only ghost button sized to match the rest of this thread's compact\n * controls (the Edit/Reply/Resolve row in CommentThread.tsx is `h-6`). `label` is the only accessible name — the\n * icon is always `aria-hidden`. */\nfunction ToolbarButton({\n icon,\n label,\n onClick,\n disabled,\n}: {\n icon: ReactNode;\n label: string;\n onClick: () => void;\n disabled?: boolean;\n}) {\n return (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 w-6 p-0\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n >\n {icon}\n </Button>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RoadmapComments.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/RoadmapComments.tsx"],"names":[],"mappings":"AAwGA;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,aAAa,EACb,YAAY,GACb,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uGAAuG;IACvG,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,2CAkHA;AAqHD,+GAA+G;AAC/G,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,2CAe1E;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,SAAS,EACT,MAAM,EACN,SAAS,GACV,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,2CAsCA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RoadmapComments.js","names":[],"sources":["../../../src/planmagnet/comments/RoadmapComments.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { MessageSquare, Trash2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { PersonName } from '../people/People';\nimport { ConfirmButton, ErrorLine } from '../controls/ConfirmButton';\nimport { throwOnError } from '../utils/mutationResult';\nimport { isForbidden, mutationErrorMessage } from '../utils/graphqlErrors';\n\n/**\n * Roadmap collaboration: discussion (PRM-11). `PlanmagnetRoadmapComment`'s own doc comment says it is the \"same\n * shape as PlanmagnetWorkItemComment\" — this mirrors `WorkItemComments.tsx`'s list/add/author-only-edit/delete\n * thread, parameterized on `roadmapItemId` so ONE component serves both the roadmap-level Discussion panel\n * (`roadmapItemId` omitted) and a per-item thread opened from an item (`roadmapItemId` set) — the server's own\n * \"filter present = exact match, absent = unplaced/unattached\" convention on that field.\n *\n * Posting needs the roadmap's write tier; a Stakeholder-Viewer role that can read but not comment gets FORBIDDEN,\n * shown here as a fixed, specific message (per BOFF-8168-style precedent elsewhere in this MFE) rather than the\n * server's generic one.\n */\n\nconst MAX_LENGTH = 5_000; // PlanmagnetAddRoadmapCommentInput: \"1 to 5,000 characters after trimming\"\nconst PAGE = 20;\n\nconst ROADMAP_COMMENTS = gql`\n query RoadmapCommentsThread(\n $roadmapId: ID!\n $roadmapItemId: ID\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetRoadmapComments(\n roadmapId: $roadmapId\n roadmapItemId: $roadmapItemId\n pagination: $pagination\n ) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n items {\n id\n authorId\n body\n createdAt\n editedAt\n }\n }\n }\n`;\nconst ADD_ROADMAP_COMMENT = gql`\n mutation RoadmapCommentAdd($input: PlanmagnetAddRoadmapCommentInput!) {\n planmagnetAddRoadmapComment(input: $input) {\n id\n }\n }\n`;\nconst EDIT_ROADMAP_COMMENT = gql`\n mutation RoadmapCommentEdit($id: ID!, $body: String!) {\n planmagnetEditRoadmapComment(id: $id, body: $body) {\n id\n body\n editedAt\n }\n }\n`;\nconst DELETE_ROADMAP_COMMENT = gql`\n mutation RoadmapCommentDelete($id: ID!) {\n planmagnetDeleteRoadmapComment(id: $id)\n }\n`;\n\ninterface RoadmapComment {\n id: string;\n authorId: string;\n body: string;\n createdAt: string;\n editedAt: string | null;\n}\ninterface RoadmapCommentsData {\n planmagnetRoadmapComments: {\n totalCount: number;\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n items: RoadmapComment[];\n };\n}\n\nconst when = (iso: string) => new Date(iso).toLocaleString();\nconst THREAD_REFETCH = { refetchQueries: ['RoadmapCommentsThread'], awaitRefetchQueries: true };\n\n/**\n * The list + composer, with no Card of its own: `RoadmapDiscussionPanel` wraps it in one for the roadmap-level\n * panel, `RoadmapItemCommentsButton` drops it straight into a dialog for an item's thread (a second nested Card\n * there would just be visual noise inside the dialog's own chrome).\n */\nexport function RoadmapCommentThread({\n roadmapId,\n roadmapItemId,\n onTotalCount,\n}: {\n roadmapId: string;\n /** Omitted = the roadmap's own thread; set = one item's thread. */\n roadmapItemId?: string;\n /** Reports the thread's live total up to the caller (e.g. for a \"Discussion (n)\" title) once known. */\n onTotalCount?: (count: number) => void;\n}) {\n const { currentUser } = usePlanMagnet();\n const [draft, setDraft] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [loadingMore, setLoadingMore] = useState(false);\n\n const {\n data,\n loading,\n error: loadError,\n fetchMore,\n } = useQuery<RoadmapCommentsData>(ROADMAP_COMMENTS, {\n variables: { roadmapId, roadmapItemId: roadmapItemId ?? null, pagination: { first: PAGE } },\n skip: !roadmapId,\n });\n const [add, addState] = useMutation(ADD_ROADMAP_COMMENT, THREAD_REFETCH);\n\n const thread = data?.planmagnetRoadmapComments;\n const comments = thread?.items ?? [];\n const trimmed = draft.trim();\n const tooLong = trimmed.length > MAX_LENGTH;\n\n useEffect(() => {\n if (thread) onTotalCount?.(thread.totalCount);\n }, [thread, onTotalCount]);\n\n const post = async () => {\n setError(null);\n try {\n await throwOnError(\n add({\n variables: { input: { roadmapId, roadmapItemId: roadmapItemId ?? null, body: trimmed } },\n })\n );\n setDraft('');\n } catch (e) {\n setError(\n isForbidden(e)\n ? 'Your role can read but not comment.'\n : mutationErrorMessage(e, 'The comment could not be posted.')\n );\n }\n };\n\n const loadMore = async () => {\n const after = thread?.pageInfo.endCursor;\n if (!after) return;\n setLoadingMore(true);\n try {\n await fetchMore({\n variables: { pagination: { first: PAGE, after } },\n updateQuery: (prev, { fetchMoreResult }) => ({\n planmagnetRoadmapComments: {\n ...fetchMoreResult.planmagnetRoadmapComments,\n items: [\n ...prev.planmagnetRoadmapComments.items,\n ...fetchMoreResult.planmagnetRoadmapComments.items,\n ],\n },\n }),\n });\n } finally {\n setLoadingMore(false);\n }\n };\n\n return (\n <div className=\"space-y-4\">\n {error && <ErrorLine message={error} />}\n {loading && !data && <p className=\"text-sm text-muted-foreground\">Loading comments…</p>}\n {loadError && <ErrorLine message={`Comments could not be loaded: ${loadError.message}`} />}\n {thread && comments.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No comments yet.</p>\n )}\n <ol className=\"space-y-3\">\n {comments.map((comment) => (\n <CommentRow\n key={comment.id}\n comment={comment}\n mine={comment.authorId === currentUser?.id}\n onError={setError}\n />\n ))}\n </ol>\n {thread?.pageInfo.hasNextPage && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => void loadMore()} disabled={loadingMore}>\n {loadingMore ? 'Loading…' : `Show more (${comments.length} of ${thread.totalCount})`}\n </Button>\n )}\n <div className=\"space-y-2 border-t pt-4\">\n <label htmlFor={`roadmap-comment-draft-${roadmapItemId ?? roadmapId}`} className=\"sr-only\">\n Add a comment\n </label>\n <textarea\n id={`roadmap-comment-draft-${roadmapItemId ?? roadmapId}`}\n className=\"w-full min-h-[72px] rounded-md border border-input bg-background px-3 py-2 text-sm\"\n placeholder=\"Add a comment…\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n />\n {tooLong && <ErrorLine message={`A comment can be at most ${MAX_LENGTH} characters.`} />}\n <div className=\"flex justify-end\">\n <Button\n size=\"sm\"\n onClick={() => void post()}\n disabled={!trimmed || tooLong || addState.loading}\n data-testid=\"roadmap-comment-add\"\n >\n {addState.loading ? 'Posting…' : 'Comment'}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * Refusals are reported to the PANEL, not kept in the row — same reasoning as `WorkItemComments.tsx`'s\n * `CommentRow`: a refused edit/delete still refetches the thread, and a row that vanished with it (deleted\n * elsewhere) would take a row-level message down with it.\n */\nfunction CommentRow({\n comment,\n mine,\n onError,\n}: {\n comment: RoadmapComment;\n mine: boolean;\n onError: (message: string | null) => void;\n}) {\n const [editing, setEditing] = useState(false);\n const [text, setText] = useState(comment.body);\n // Same limit as the Add composer (the edit mutation takes the same 1..5,000 characters after trimming).\n const editTooLong = text.trim().length > MAX_LENGTH;\n const setError = onError;\n const [edit, editState] = useMutation(EDIT_ROADMAP_COMMENT, THREAD_REFETCH);\n const [remove, removeState] = useMutation(DELETE_ROADMAP_COMMENT, THREAD_REFETCH);\n\n const save = async () => {\n setError(null);\n try {\n await throwOnError(edit({ variables: { id: comment.id, body: text.trim() } }));\n setEditing(false);\n } catch (e) {\n setError(mutationErrorMessage(e, 'The comment could not be saved.'));\n }\n };\n\n const onRemove = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: comment.id } }));\n } catch (e) {\n setError(mutationErrorMessage(e, 'The comment could not be deleted.'));\n }\n };\n\n return (\n <li className=\"rounded-md border p-3 space-y-1\" data-testid=\"roadmap-comment\">\n <div className=\"flex items-center justify-between gap-2 text-xs text-muted-foreground\">\n <span>\n <span className=\"font-medium text-foreground\">\n <PersonName id={comment.authorId} />\n </span>{' '}\n · {when(comment.createdAt)}\n {comment.editedAt && <span title={`Edited ${when(comment.editedAt)}`}> · edited</span>}\n </span>\n {mine && !editing && (\n <span className=\"flex items-center gap-1\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2 text-xs\"\n onClick={() => setEditing(true)}\n >\n Edit\n </Button>\n <ConfirmButton\n label=\"\"\n ariaLabel=\"Delete comment\"\n variant=\"outline\"\n icon={<Trash2 className=\"h-3.5 w-3.5\" />}\n title=\"Delete this comment?\"\n description=\"It is removed from the discussion for everyone. This cannot be undone here.\"\n confirmLabel=\"Delete\"\n destructive\n disabled={removeState.loading}\n onConfirm={() => void onRemove()}\n />\n </span>\n )}\n </div>\n {editing ? (\n <div className=\"space-y-2\">\n <textarea\n aria-label=\"Edit comment\"\n className=\"w-full min-h-[60px] rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n />\n {editTooLong && (\n <ErrorLine message={`A comment can be at most ${MAX_LENGTH} characters.`} />\n )}\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n setEditing(false);\n setText(comment.body);\n setError(null);\n }}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void save()}\n disabled={!text.trim() || editTooLong || editState.loading}\n >\n {editState.loading ? 'Saving…' : 'Save'}\n </Button>\n </div>\n </div>\n ) : (\n <p className=\"text-sm whitespace-pre-wrap break-words\">{comment.body}</p>\n )}\n </li>\n );\n}\n\n/** The roadmap-level Discussion panel (`roadmapItemId` omitted — the roadmap's own thread, not any item's). */\nexport function RoadmapDiscussionPanel({ roadmapId }: { roadmapId: string }) {\n const [totalCount, setTotalCount] = useState<number | null>(null);\n return (\n <Card data-testid=\"roadmap-discussion\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-4 w-4\" aria-hidden=\"true\" />\n Discussion{totalCount !== null ? ` (${totalCount})` : ''}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <RoadmapCommentThread roadmapId={roadmapId} onTotalCount={setTotalCount} />\n </CardContent>\n </Card>\n );\n}\n\n/**\n * The small \"Comments\" affordance opened from a roadmap item, in both the Timeline and Now/Next/Later views. It\n * deliberately does NOT pre-fetch a count for the collapsed label: `RoadmapItem` carries no `commentCount` field\n * of its own (unlike `WorkItem`), and both views already render every item on the roadmap unwindowed (Now/Next/\n * Later loads up to 2,000) — firing one count query per row would turn a single page load into a query-per-item\n * burst. The count instead comes from the thread itself, once it has been opened in this session.\n */\nexport function RoadmapItemCommentsButton({\n roadmapId,\n itemId,\n itemTitle,\n}: {\n roadmapId: string;\n itemId: string;\n itemTitle: string;\n}) {\n const [open, setOpen] = useState(false);\n const [count, setCount] = useState<number | null>(null);\n\n return (\n <ResponsiveDialog open={open} onOpenChange={setOpen}>\n <ResponsiveDialogTrigger asChild>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 px-2 text-xs\"\n data-testid=\"roadmap-item-comments\"\n aria-label={`Comments on ${itemTitle}`}\n >\n <MessageSquare className=\"mr-1 h-3.5 w-3.5\" aria-hidden=\"true\" />\n Comments{count !== null && count > 0 ? ` (${count})` : ''}\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Comments — {itemTitle}</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Visible to everyone who can read this roadmap.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"max-h-[60vh] overflow-y-auto pr-1\">\n {/* Mounted only while open: the thread's own query never fires just because the row rendered. */}\n {open && (\n <RoadmapCommentThread\n roadmapId={roadmapId}\n roadmapItemId={itemId}\n onTotalCount={setCount}\n />\n )}\n </div>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TargetComments.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/TargetComments.tsx"],"names":[],"mappings":"AAkGA,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,kGAAkG;IAClG,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC,2CA2CA;AAmFD,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC,2CA2CA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TargetComments.js","names":[],"sources":["../../../src/planmagnet/comments/TargetComments.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { MessageSquare } from 'lucide-react';\nimport { CommentThread } from './CommentThread';\n\n/**\n * Comments on a project or a doc (CWF-12) — the `PlanmagnetComment` type (`targetType` PROJECT | DOC), which\n * means exactly what `PlanmagnetWorkItemComment` means on a work item (see its schema doc comment): same\n * threading (CWF-02), resolution (CWF-14) and mention (CWF-13) behaviour, via the same `CommentThread` engine\n * `WorkItemComments.tsx` uses — only the GraphQL operation names differ per target.\n *\n * A viewer who can read but not write (e.g. a stakeholder-viewer role) sees the thread and gets the same\n * \"Your role can read but not comment.\" refusal `CommentThread` already shows on a FORBIDDEN post — there is no\n * separate read-only banner here; the refusal only appears once they actually try to post.\n */\n\nconst PROJECT_COMMENTS = gql`\n query ProjectComments($projectId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetProjectComments(projectId: $projectId, pagination: $pagination) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n items {\n id\n authorId\n body\n createdAt\n editedAt\n parentId\n status\n resolvedBy\n resolvedAt\n mentions\n attachments {\n id\n fileId\n name\n mimeType\n size\n }\n replies {\n id\n authorId\n body\n createdAt\n editedAt\n parentId\n status\n resolvedBy\n resolvedAt\n mentions\n attachments {\n id\n fileId\n name\n mimeType\n size\n }\n }\n }\n }\n }\n`;\nconst ADD_PROJECT_COMMENT = gql`\n mutation ProjectCommentAdd($input: PlanmagnetAddProjectCommentInput!) {\n planmagnetAddProjectComment(input: $input) {\n id\n }\n }\n`;\nconst EDIT_PROJECT_COMMENT = gql`\n mutation ProjectCommentEdit($id: ID!, $body: String!) {\n planmagnetEditProjectComment(id: $id, body: $body) {\n id\n body\n editedAt\n }\n }\n`;\nconst DELETE_PROJECT_COMMENT = gql`\n mutation ProjectCommentDelete($id: ID!) {\n planmagnetDeleteProjectComment(id: $id)\n }\n`;\nconst RESOLVE_PROJECT_COMMENT = gql`\n mutation ProjectCommentResolve($id: ID!, $resolved: Boolean!) {\n planmagnetResolveProjectComment(id: $id, resolved: $resolved) {\n id\n status\n resolvedBy\n resolvedAt\n }\n }\n`;\n\nexport interface TargetCommentsPresence {\n typingActorIds: readonly string[];\n notifyTyping: () => void;\n}\n\nexport function ProjectComments({\n projectId,\n presence,\n}: {\n projectId: string;\n /** CWF-24: typing presence from the page's own `usePresence(targetType: 'PROJECT', ...)` call. */\n presence?: TargetCommentsPresence;\n}) {\n const [totalCount, setTotalCount] = useState<number | null>(null);\n return (\n <Card data-testid=\"project-comments\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-4 w-4\" />\n Comments{totalCount !== null ? ` (${totalCount})` : ''}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <CommentThread\n key={projectId}\n target={{ type: 'PROJECT', id: projectId }}\n targetNoun=\"project\"\n idPrefix={`project-comment-${projectId}`}\n query={{\n document: PROJECT_COMMENTS,\n dataKey: 'planmagnetProjectComments',\n variables: { projectId },\n skip: !projectId,\n }}\n add={{\n document: ADD_PROJECT_COMMENT,\n buildVariables: (body, parentId, attachmentFileIds) => ({\n input: {\n projectId,\n body,\n parentId,\n ...(attachmentFileIds.length > 0 ? { attachmentFileIds } : {}),\n },\n }),\n }}\n edit={EDIT_PROJECT_COMMENT}\n remove={DELETE_PROJECT_COMMENT}\n resolve={RESOLVE_PROJECT_COMMENT}\n refetchQueries={['ProjectComments']}\n onTotalCount={setTotalCount}\n presence={presence}\n />\n </CardContent>\n </Card>\n );\n}\n\nconst DOC_COMMENTS = gql`\n query DocComments($docId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetDocComments(docId: $docId, pagination: $pagination) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n items {\n id\n authorId\n body\n createdAt\n editedAt\n parentId\n status\n resolvedBy\n resolvedAt\n mentions\n attachments {\n id\n fileId\n name\n mimeType\n size\n }\n replies {\n id\n authorId\n body\n createdAt\n editedAt\n parentId\n status\n resolvedBy\n resolvedAt\n mentions\n attachments {\n id\n fileId\n name\n mimeType\n size\n }\n }\n }\n }\n }\n`;\nconst ADD_DOC_COMMENT = gql`\n mutation DocCommentAdd($input: PlanmagnetAddDocCommentInput!) {\n planmagnetAddDocComment(input: $input) {\n id\n }\n }\n`;\nconst EDIT_DOC_COMMENT = gql`\n mutation DocCommentEdit($id: ID!, $body: String!) {\n planmagnetEditDocComment(id: $id, body: $body) {\n id\n body\n editedAt\n }\n }\n`;\nconst DELETE_DOC_COMMENT = gql`\n mutation DocCommentDelete($id: ID!) {\n planmagnetDeleteDocComment(id: $id)\n }\n`;\nconst RESOLVE_DOC_COMMENT = gql`\n mutation DocCommentResolve($id: ID!, $resolved: Boolean!) {\n planmagnetResolveDocComment(id: $id, resolved: $resolved) {\n id\n status\n resolvedBy\n resolvedAt\n }\n }\n`;\n\nexport function DocComments({\n docId,\n presence,\n}: {\n docId: string;\n /** CWF-24: typing presence from the page's own `usePresence(targetType: 'DOC', ...)` call. */\n presence?: TargetCommentsPresence;\n}) {\n const [totalCount, setTotalCount] = useState<number | null>(null);\n return (\n <Card data-testid=\"doc-comments\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-4 w-4\" />\n Comments{totalCount !== null ? ` (${totalCount})` : ''}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <CommentThread\n key={docId}\n target={{ type: 'DOC', id: docId }}\n targetNoun=\"doc\"\n idPrefix={`doc-comment-${docId}`}\n query={{\n document: DOC_COMMENTS,\n dataKey: 'planmagnetDocComments',\n variables: { docId },\n skip: !docId,\n }}\n add={{\n document: ADD_DOC_COMMENT,\n buildVariables: (body, parentId, attachmentFileIds) => ({\n input: {\n docId,\n body,\n parentId,\n ...(attachmentFileIds.length > 0 ? { attachmentFileIds } : {}),\n },\n }),\n }}\n edit={EDIT_DOC_COMMENT}\n remove={DELETE_DOC_COMMENT}\n resolve={RESOLVE_DOC_COMMENT}\n refetchQueries={['DocComments']}\n onTotalCount={setTotalCount}\n presence={presence}\n />\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;AAiBA,IAAM,IAAmB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDtB,IAAsB,CAAG;;;;;;GAOzB,IAAuB,CAAG;;;;;;;;GAS1B,IAAyB,CAAG;;;;GAK5B,IAA0B,CAAG;;;;;;;;;;AAgBnC,SAAgB,EAAgB,EAC9B,cACA,eAKC;CACD,IAAM,CAAC,GAAY,KAAiB,EAAwB,KAAK;AACjE,QACE,kBAAC,GAAD;EAAM,eAAY;YAAlB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAW,WAAU;aAArB;IACE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA;;IAC5B,MAAe,OAA4B,KAArB,KAAK,EAAW;IACrC;MACD,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAEE,QAAQ;IAAE,MAAM;IAAW,IAAI;IAAW;GAC1C,YAAW;GACX,UAAU,mBAAmB;GAC7B,OAAO;IACL,UAAU;IACV,SAAS;IACT,WAAW,EAAE,cAAW;IACxB,MAAM,CAAC;IACR;GACD,KAAK;IACH,UAAU;IACV,iBAAiB,GAAM,GAAU,OAAuB,EACtD,OAAO;KACL;KACA;KACA;KACA,GAAI,EAAkB,SAAS,IAAI,EAAE,sBAAmB,GAAG,EAAE;KAC9D,EACF;IACF;GACD,MAAM;GACN,QAAQ;GACR,SAAS;GACT,gBAAgB,CAAC,kBAAkB;GACnC,cAAc;GACJ;GACV,EA3BK,EA2BL,EACU,CAAA,CACT;;;AAIX,IAAM,IAAe,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDlB,IAAkB,CAAG;;;;;;GAOrB,IAAmB,CAAG;;;;;;;;GAStB,IAAqB,CAAG;;;;GAKxB,IAAsB,CAAG;;;;;;;;;;AAW/B,SAAgB,EAAY,EAC1B,UACA,eAKC;CACD,IAAM,CAAC,GAAY,KAAiB,EAAwB,KAAK;AACjE,QACE,kBAAC,GAAD;EAAM,eAAY;YAAlB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAW,WAAU;aAArB;IACE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA;;IAC5B,MAAe,OAA4B,KAArB,KAAK,EAAW;IACrC;MACD,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAEE,QAAQ;IAAE,MAAM;IAAO,IAAI;IAAO;GAClC,YAAW;GACX,UAAU,eAAe;GACzB,OAAO;IACL,UAAU;IACV,SAAS;IACT,WAAW,EAAE,UAAO;IACpB,MAAM,CAAC;IACR;GACD,KAAK;IACH,UAAU;IACV,iBAAiB,GAAM,GAAU,OAAuB,EACtD,OAAO;KACL;KACA;KACA;KACA,GAAI,EAAkB,SAAS,IAAI,EAAE,sBAAmB,GAAG,EAAE;KAC9D,EACF;IACF;GACD,MAAM;GACN,QAAQ;GACR,SAAS;GACT,gBAAgB,CAAC,cAAc;GAC/B,cAAc;GACJ;GACV,EA3BK,EA2BL,EACU,CAAA,CACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkItemActivity.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/WorkItemActivity.tsx"],"names":[],"mappings":"AAqDA,wBAAgB,gBAAgB,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,2CAmDtE"}