@burdenoff/microfe-brainyrich 2026.706.2 → 2026.706.4

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 (543) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +5 -5
  2. package/dist/brainyrich/components/viz.js +155 -156
  3. package/dist/brainyrich/components/viz.js.map +1 -1
  4. package/dist/brainyrich/pages/AccountsPage.js.map +1 -1
  5. package/dist/brainyrich/pages/AiAssistantPage.js.map +1 -1
  6. package/dist/brainyrich/pages/AnalyticsPage.js.map +1 -1
  7. package/dist/brainyrich/pages/DashboardPage.js.map +1 -1
  8. package/dist/brainyrich/pages/FamilyPage.js.map +1 -1
  9. package/dist/brainyrich/pages/GoalsPage.js.map +1 -1
  10. package/dist/brainyrich/pages/InvestmentsPage.js.map +1 -1
  11. package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -1
  12. package/dist/brainyrich/pages/ReportsPage.js +2 -1
  13. package/dist/brainyrich/pages/ReportsPage.js.map +1 -1
  14. package/dist/brainyrich/pages/RiskPage.js.map +1 -1
  15. package/dist/brainyrich/pages/_shared.js +76 -68
  16. package/dist/brainyrich/pages/_shared.js.map +1 -1
  17. package/package.json +3 -4
  18. package/dist/_virtual/__vite-optional-peer-dep_@emotion/is-prop-valid_framer-motion.js +0 -10
  19. package/dist/_virtual/__vite-optional-peer-dep_@emotion/is-prop-valid_framer-motion.js.map +0 -1
  20. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.js +0 -22
  21. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.js.map +0 -1
  22. package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.js +0 -8
  23. package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.js.map +0 -1
  24. package/dist/node_modules/framer-motion/dist/es/context/LazyContext.js +0 -8
  25. package/dist/node_modules/framer-motion/dist/es/context/LazyContext.js.map +0 -1
  26. package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.js +0 -12
  27. package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.js.map +0 -1
  28. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/create.js +0 -19
  29. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/create.js.map +0 -1
  30. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/index.js +0 -8
  31. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/index.js.map +0 -1
  32. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/utils.js +0 -17
  33. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/utils.js.map +0 -1
  34. package/dist/node_modules/framer-motion/dist/es/context/PresenceContext.js +0 -8
  35. package/dist/node_modules/framer-motion/dist/es/context/PresenceContext.js.map +0 -1
  36. package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.js +0 -8
  37. package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.js.map +0 -1
  38. package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.js +0 -10
  39. package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.js.map +0 -1
  40. package/dist/node_modules/framer-motion/dist/es/events/event-info.js +0 -13
  41. package/dist/node_modules/framer-motion/dist/es/events/event-info.js.map +0 -1
  42. package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.js +0 -259
  43. package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.js.map +0 -1
  44. package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.js +0 -24
  45. package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.js.map +0 -1
  46. package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.js +0 -61
  47. package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.js.map +0 -1
  48. package/dist/node_modules/framer-motion/dist/es/gestures/focus.js +0 -29
  49. package/dist/node_modules/framer-motion/dist/es/gestures/focus.js.map +0 -1
  50. package/dist/node_modules/framer-motion/dist/es/gestures/hover.js +0 -22
  51. package/dist/node_modules/framer-motion/dist/es/gestures/hover.js.map +0 -1
  52. package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.js +0 -135
  53. package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.js.map +0 -1
  54. package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.js +0 -44
  55. package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.js.map +0 -1
  56. package/dist/node_modules/framer-motion/dist/es/gestures/press.js +0 -28
  57. package/dist/node_modules/framer-motion/dist/es/gestures/press.js.map +0 -1
  58. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.js +0 -41
  59. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.js.map +0 -1
  60. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.js +0 -27
  61. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.js.map +0 -1
  62. package/dist/node_modules/framer-motion/dist/es/motion/features/animations.js +0 -11
  63. package/dist/node_modules/framer-motion/dist/es/motion/features/animations.js.map +0 -1
  64. package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.js +0 -53
  65. package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.js.map +0 -1
  66. package/dist/node_modules/framer-motion/dist/es/motion/features/drag.js +0 -17
  67. package/dist/node_modules/framer-motion/dist/es/motion/features/drag.js.map +0 -1
  68. package/dist/node_modules/framer-motion/dist/es/motion/features/gestures.js +0 -15
  69. package/dist/node_modules/framer-motion/dist/es/motion/features/gestures.js.map +0 -1
  70. package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.js +0 -63
  71. package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.js.map +0 -1
  72. package/dist/node_modules/framer-motion/dist/es/motion/features/layout.js +0 -11
  73. package/dist/node_modules/framer-motion/dist/es/motion/features/layout.js.map +0 -1
  74. package/dist/node_modules/framer-motion/dist/es/motion/features/load-features.js +0 -15
  75. package/dist/node_modules/framer-motion/dist/es/motion/features/load-features.js.map +0 -1
  76. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/index.js +0 -48
  77. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/index.js.map +0 -1
  78. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/observers.js +0 -26
  79. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/observers.js.map +0 -1
  80. package/dist/node_modules/framer-motion/dist/es/motion/index.js +0 -72
  81. package/dist/node_modules/framer-motion/dist/es/motion/index.js.map +0 -1
  82. package/dist/node_modules/framer-motion/dist/es/motion/utils/symbol.js +0 -6
  83. package/dist/node_modules/framer-motion/dist/es/motion/utils/symbol.js.map +0 -1
  84. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.js +0 -24
  85. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.js.map +0 -1
  86. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.js +0 -60
  87. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.js.map +0 -1
  88. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-state.js +0 -52
  89. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-state.js.map +0 -1
  90. package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.js +0 -9
  91. package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.js.map +0 -1
  92. package/dist/node_modules/framer-motion/dist/es/render/components/create-proxy.js +0 -12
  93. package/dist/node_modules/framer-motion/dist/es/render/components/create-proxy.js.map +0 -1
  94. package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.js +0 -15
  95. package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.js.map +0 -1
  96. package/dist/node_modules/framer-motion/dist/es/render/components/motion/proxy.js +0 -9
  97. package/dist/node_modules/framer-motion/dist/es/render/components/motion/proxy.js.map +0 -1
  98. package/dist/node_modules/framer-motion/dist/es/render/dom/create-visual-element.js +0 -10
  99. package/dist/node_modules/framer-motion/dist/es/render/dom/create-visual-element.js.map +0 -1
  100. package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.js +0 -23
  101. package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.js.map +0 -1
  102. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.js +0 -21
  103. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.js.map +0 -1
  104. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.js +0 -9
  105. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.js.map +0 -1
  106. package/dist/node_modules/framer-motion/dist/es/render/html/use-html-visual-state.js +0 -13
  107. package/dist/node_modules/framer-motion/dist/es/render/html/use-html-visual-state.js.map +0 -1
  108. package/dist/node_modules/framer-motion/dist/es/render/html/use-props.js +0 -28
  109. package/dist/node_modules/framer-motion/dist/es/render/html/use-props.js.map +0 -1
  110. package/dist/node_modules/framer-motion/dist/es/render/html/utils/create-render-state.js +0 -11
  111. package/dist/node_modules/framer-motion/dist/es/render/html/utils/create-render-state.js.map +0 -1
  112. package/dist/node_modules/framer-motion/dist/es/render/svg/lowercase-elements.js +0 -32
  113. package/dist/node_modules/framer-motion/dist/es/render/svg/lowercase-elements.js.map +0 -1
  114. package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.js +0 -28
  115. package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.js.map +0 -1
  116. package/dist/node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.js +0 -13
  117. package/dist/node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.js.map +0 -1
  118. package/dist/node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.js +0 -10
  119. package/dist/node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.js.map +0 -1
  120. package/dist/node_modules/framer-motion/dist/es/utils/distance.js +0 -10
  121. package/dist/node_modules/framer-motion/dist/es/utils/distance.js.map +0 -1
  122. package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.js +0 -6
  123. package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.js.map +0 -1
  124. package/dist/node_modules/framer-motion/dist/es/utils/is-browser.js +0 -6
  125. package/dist/node_modules/framer-motion/dist/es/utils/is-browser.js.map +0 -1
  126. package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.js +0 -8
  127. package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.js.map +0 -1
  128. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +0 -15
  129. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +0 -1
  130. package/dist/node_modules/framer-motion/dist/es/utils/use-constant.js +0 -11
  131. package/dist/node_modules/framer-motion/dist/es/utils/use-constant.js.map +0 -1
  132. package/dist/node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.js +0 -9
  133. package/dist/node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.js.map +0 -1
  134. package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.js +0 -109
  135. package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.js.map +0 -1
  136. package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.js +0 -132
  137. package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.js.map +0 -1
  138. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.js +0 -86
  139. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.js.map +0 -1
  140. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.js +0 -30
  141. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.js.map +0 -1
  142. package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.js +0 -12
  143. package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.js.map +0 -1
  144. package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.js +0 -15
  145. package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.js.map +0 -1
  146. package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.js +0 -34
  147. package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.js.map +0 -1
  148. package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.js +0 -24
  149. package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.js.map +0 -1
  150. package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.js +0 -168
  151. package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.js.map +0 -1
  152. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.js +0 -11
  153. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.js.map +0 -1
  154. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.js +0 -18
  155. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.js.map +0 -1
  156. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.js +0 -8
  157. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.js.map +0 -1
  158. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.js +0 -11
  159. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.js.map +0 -1
  160. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.js +0 -47
  161. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.js.map +0 -1
  162. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.js +0 -56
  163. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.js.map +0 -1
  164. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.js +0 -28
  165. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.js.map +0 -1
  166. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.js +0 -23
  167. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.js.map +0 -1
  168. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.js +0 -63
  169. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.js.map +0 -1
  170. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.js +0 -69
  171. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.js.map +0 -1
  172. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.js +0 -10
  173. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.js.map +0 -1
  174. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.js +0 -10
  175. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.js.map +0 -1
  176. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.js +0 -14
  177. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.js.map +0 -1
  178. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.js +0 -8
  179. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.js.map +0 -1
  180. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.js +0 -8
  181. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.js.map +0 -1
  182. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.js +0 -9
  183. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.js.map +0 -1
  184. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.js +0 -20
  185. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.js.map +0 -1
  186. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.js +0 -38
  187. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.js.map +0 -1
  188. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.js +0 -6
  189. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.js.map +0 -1
  190. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.js +0 -9
  191. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.js.map +0 -1
  192. package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.js +0 -24
  193. package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.js.map +0 -1
  194. package/dist/node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.js +0 -9
  195. package/dist/node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.js.map +0 -1
  196. package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.js +0 -20
  197. package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.js.map +0 -1
  198. package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.js +0 -27
  199. package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.js.map +0 -1
  200. package/dist/node_modules/motion-dom/dist/es/animation/utils/default-transitions.js +0 -29
  201. package/dist/node_modules/motion-dom/dist/es/animation/utils/default-transitions.js.map +0 -1
  202. package/dist/node_modules/motion-dom/dist/es/animation/utils/get-value-transition.js +0 -10
  203. package/dist/node_modules/motion-dom/dist/es/animation/utils/get-value-transition.js.map +0 -1
  204. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-animatable.js +0 -7
  205. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-animatable.js.map +0 -1
  206. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-css-variable.js +0 -9
  207. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-css-variable.js.map +0 -1
  208. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.js +0 -21
  209. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.js.map +0 -1
  210. package/dist/node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.js +0 -8
  211. package/dist/node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.js.map +0 -1
  212. package/dist/node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.js +0 -18
  213. package/dist/node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.js.map +0 -1
  214. package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-transition.js +0 -15
  215. package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-transition.js.map +0 -1
  216. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.js +0 -6
  217. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.js.map +0 -1
  218. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.js +0 -13
  219. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.js.map +0 -1
  220. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/supported.js +0 -37
  221. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/supported.js.map +0 -1
  222. package/dist/node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.js +0 -27
  223. package/dist/node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.js.map +0 -1
  224. package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.js +0 -26
  225. package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.js.map +0 -1
  226. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.js +0 -11
  227. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.js.map +0 -1
  228. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.js +0 -10
  229. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.js.map +0 -1
  230. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.js +0 -10
  231. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.js.map +0 -1
  232. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/linear.js +0 -10
  233. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/linear.js.map +0 -1
  234. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.js +0 -19
  235. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.js.map +0 -1
  236. package/dist/node_modules/motion-dom/dist/es/events/add-dom-event.js +0 -8
  237. package/dist/node_modules/motion-dom/dist/es/events/add-dom-event.js.map +0 -1
  238. package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.js +0 -32
  239. package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.js.map +0 -1
  240. package/dist/node_modules/motion-dom/dist/es/frameloop/frame.js +0 -8
  241. package/dist/node_modules/motion-dom/dist/es/frameloop/frame.js.map +0 -1
  242. package/dist/node_modules/motion-dom/dist/es/frameloop/microtask.js +0 -7
  243. package/dist/node_modules/motion-dom/dist/es/frameloop/microtask.js.map +0 -1
  244. package/dist/node_modules/motion-dom/dist/es/frameloop/order.js +0 -15
  245. package/dist/node_modules/motion-dom/dist/es/frameloop/order.js.map +0 -1
  246. package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.js +0 -35
  247. package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.js.map +0 -1
  248. package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.js +0 -17
  249. package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.js.map +0 -1
  250. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/is-active.js +0 -12
  251. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/is-active.js.map +0 -1
  252. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/set-active.js +0 -13
  253. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/set-active.js.map +0 -1
  254. package/dist/node_modules/motion-dom/dist/es/gestures/hover.js +0 -38
  255. package/dist/node_modules/motion-dom/dist/es/gestures/hover.js.map +0 -1
  256. package/dist/node_modules/motion-dom/dist/es/gestures/press/index.js +0 -35
  257. package/dist/node_modules/motion-dom/dist/es/gestures/press/index.js.map +0 -1
  258. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.js +0 -23
  259. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.js.map +0 -1
  260. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.js +0 -30
  261. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.js.map +0 -1
  262. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/state.js +0 -6
  263. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/state.js.map +0 -1
  264. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.js +0 -6
  265. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.js.map +0 -1
  266. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.js +0 -6
  267. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.js.map +0 -1
  268. package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.js +0 -18
  269. package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.js.map +0 -1
  270. package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.js +0 -31
  271. package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.js.map +0 -1
  272. package/dist/node_modules/motion-dom/dist/es/projection/geometry/conversion.js +0 -41
  273. package/dist/node_modules/motion-dom/dist/es/projection/geometry/conversion.js.map +0 -1
  274. package/dist/node_modules/motion-dom/dist/es/projection/geometry/copy.js +0 -14
  275. package/dist/node_modules/motion-dom/dist/es/projection/geometry/copy.js.map +0 -1
  276. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.js +0 -45
  277. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.js.map +0 -1
  278. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.js +0 -32
  279. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.js.map +0 -1
  280. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.js +0 -31
  281. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.js.map +0 -1
  282. package/dist/node_modules/motion-dom/dist/es/projection/geometry/models.js +0 -20
  283. package/dist/node_modules/motion-dom/dist/es/projection/geometry/models.js.map +0 -1
  284. package/dist/node_modules/motion-dom/dist/es/projection/geometry/utils.js +0 -30
  285. package/dist/node_modules/motion-dom/dist/es/projection/geometry/utils.js.map +0 -1
  286. package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.js +0 -15
  287. package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.js.map +0 -1
  288. package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.js +0 -24
  289. package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.js.map +0 -1
  290. package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.js +0 -590
  291. package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.js.map +0 -1
  292. package/dist/node_modules/motion-dom/dist/es/projection/node/state.js +0 -9
  293. package/dist/node_modules/motion-dom/dist/es/projection/node/state.js.map +0 -1
  294. package/dist/node_modules/motion-dom/dist/es/projection/shared/stack.js +0 -53
  295. package/dist/node_modules/motion-dom/dist/es/projection/shared/stack.js.map +0 -1
  296. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.js +0 -15
  297. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.js.map +0 -1
  298. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.js +0 -15
  299. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.js.map +0 -1
  300. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.js +0 -23
  301. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.js.map +0 -1
  302. package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.js +0 -14
  303. package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.js.map +0 -1
  304. package/dist/node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.js +0 -6
  305. package/dist/node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.js.map +0 -1
  306. package/dist/node_modules/motion-dom/dist/es/projection/utils/each-axis.js +0 -8
  307. package/dist/node_modules/motion-dom/dist/es/projection/utils/each-axis.js.map +0 -1
  308. package/dist/node_modules/motion-dom/dist/es/projection/utils/flat-tree.js +0 -21
  309. package/dist/node_modules/motion-dom/dist/es/projection/utils/flat-tree.js.map +0 -1
  310. package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.js +0 -20
  311. package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.js.map +0 -1
  312. package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.js +0 -14
  313. package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.js.map +0 -1
  314. package/dist/node_modules/motion-dom/dist/es/render/Feature.js +0 -11
  315. package/dist/node_modules/motion-dom/dist/es/render/Feature.js.map +0 -1
  316. package/dist/node_modules/motion-dom/dist/es/render/VisualElement.js +0 -206
  317. package/dist/node_modules/motion-dom/dist/es/render/VisualElement.js.map +0 -1
  318. package/dist/node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.js +0 -30
  319. package/dist/node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.js.map +0 -1
  320. package/dist/node_modules/motion-dom/dist/es/render/dom/is-css-var.js +0 -6
  321. package/dist/node_modules/motion-dom/dist/es/render/dom/is-css-var.js.map +0 -1
  322. package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.js +0 -58
  323. package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.js.map +0 -1
  324. package/dist/node_modules/motion-dom/dist/es/render/dom/style-set.js +0 -9
  325. package/dist/node_modules/motion-dom/dist/es/render/dom/style-set.js.map +0 -1
  326. package/dist/node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.js +0 -8
  327. package/dist/node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.js.map +0 -1
  328. package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.js +0 -37
  329. package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.js.map +0 -1
  330. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-styles.js +0 -30
  331. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-styles.js.map +0 -1
  332. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.js +0 -37
  333. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.js.map +0 -1
  334. package/dist/node_modules/motion-dom/dist/es/render/html/utils/render.js +0 -10
  335. package/dist/node_modules/motion-dom/dist/es/render/html/utils/render.js.map +0 -1
  336. package/dist/node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.js +0 -13
  337. package/dist/node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.js.map +0 -1
  338. package/dist/node_modules/motion-dom/dist/es/render/store.js +0 -6
  339. package/dist/node_modules/motion-dom/dist/es/render/store.js.map +0 -1
  340. package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.js +0 -42
  341. package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.js.map +0 -1
  342. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.js +0 -24
  343. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.js.map +0 -1
  344. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.js +0 -30
  345. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.js.map +0 -1
  346. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.js +0 -6
  347. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.js.map +0 -1
  348. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/path.js +0 -17
  349. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/path.js.map +0 -1
  350. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/render.js +0 -12
  351. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/render.js.map +0 -1
  352. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.js +0 -16
  353. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.js.map +0 -1
  354. package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.js +0 -137
  355. package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.js.map +0 -1
  356. package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.js +0 -21
  357. package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.js.map +0 -1
  358. package/dist/node_modules/motion-dom/dist/es/render/utils/is-animation-controls.js +0 -8
  359. package/dist/node_modules/motion-dom/dist/es/render/utils/is-animation-controls.js.map +0 -1
  360. package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.js +0 -14
  361. package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.js.map +0 -1
  362. package/dist/node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.js +0 -10
  363. package/dist/node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.js.map +0 -1
  364. package/dist/node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.js +0 -6
  365. package/dist/node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.js.map +0 -1
  366. package/dist/node_modules/motion-dom/dist/es/render/utils/is-variant-label.js +0 -8
  367. package/dist/node_modules/motion-dom/dist/es/render/utils/is-variant-label.js.map +0 -1
  368. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-position.js +0 -15
  369. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-position.js.map +0 -1
  370. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.js +0 -24
  371. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.js.map +0 -1
  372. package/dist/node_modules/motion-dom/dist/es/render/utils/motion-values.js +0 -23
  373. package/dist/node_modules/motion-dom/dist/es/render/utils/motion-values.js.map +0 -1
  374. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.js +0 -13
  375. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.js.map +0 -1
  376. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.js +0 -6
  377. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.js.map +0 -1
  378. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.js +0 -10
  379. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.js.map +0 -1
  380. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.js +0 -22
  381. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.js.map +0 -1
  382. package/dist/node_modules/motion-dom/dist/es/render/utils/setters.js +0 -22
  383. package/dist/node_modules/motion-dom/dist/es/render/utils/setters.js.map +0 -1
  384. package/dist/node_modules/motion-dom/dist/es/render/utils/shallow-compare.js +0 -12
  385. package/dist/node_modules/motion-dom/dist/es/render/utils/shallow-compare.js.map +0 -1
  386. package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.js +0 -14
  387. package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.js.map +0 -1
  388. package/dist/node_modules/motion-dom/dist/es/resize/handle-element.js +0 -39
  389. package/dist/node_modules/motion-dom/dist/es/resize/handle-element.js.map +0 -1
  390. package/dist/node_modules/motion-dom/dist/es/resize/handle-window.js +0 -24
  391. package/dist/node_modules/motion-dom/dist/es/resize/handle-window.js.map +0 -1
  392. package/dist/node_modules/motion-dom/dist/es/resize/index.js +0 -10
  393. package/dist/node_modules/motion-dom/dist/es/resize/index.js.map +0 -1
  394. package/dist/node_modules/motion-dom/dist/es/stats/animation-count.js +0 -10
  395. package/dist/node_modules/motion-dom/dist/es/stats/animation-count.js.map +0 -1
  396. package/dist/node_modules/motion-dom/dist/es/stats/buffer.js +0 -9
  397. package/dist/node_modules/motion-dom/dist/es/stats/buffer.js.map +0 -1
  398. package/dist/node_modules/motion-dom/dist/es/utils/delay.js +0 -14
  399. package/dist/node_modules/motion-dom/dist/es/utils/delay.js.map +0 -1
  400. package/dist/node_modules/motion-dom/dist/es/utils/interpolate.js +0 -35
  401. package/dist/node_modules/motion-dom/dist/es/utils/interpolate.js.map +0 -1
  402. package/dist/node_modules/motion-dom/dist/es/utils/is-html-element.js +0 -9
  403. package/dist/node_modules/motion-dom/dist/es/utils/is-html-element.js.map +0 -1
  404. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-element.js +0 -9
  405. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-element.js.map +0 -1
  406. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-svg-element.js +0 -9
  407. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-svg-element.js.map +0 -1
  408. package/dist/node_modules/motion-dom/dist/es/utils/mix/color.js +0 -32
  409. package/dist/node_modules/motion-dom/dist/es/utils/mix/color.js.map +0 -1
  410. package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.js +0 -54
  411. package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.js.map +0 -1
  412. package/dist/node_modules/motion-dom/dist/es/utils/mix/immediate.js +0 -8
  413. package/dist/node_modules/motion-dom/dist/es/utils/mix/immediate.js.map +0 -1
  414. package/dist/node_modules/motion-dom/dist/es/utils/mix/index.js +0 -10
  415. package/dist/node_modules/motion-dom/dist/es/utils/mix/index.js.map +0 -1
  416. package/dist/node_modules/motion-dom/dist/es/utils/mix/number.js +0 -6
  417. package/dist/node_modules/motion-dom/dist/es/utils/mix/number.js.map +0 -1
  418. package/dist/node_modules/motion-dom/dist/es/utils/mix/visibility.js +0 -9
  419. package/dist/node_modules/motion-dom/dist/es/utils/mix/visibility.js.map +0 -1
  420. package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.js +0 -16
  421. package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.js.map +0 -1
  422. package/dist/node_modules/motion-dom/dist/es/utils/supports/flags.js +0 -6
  423. package/dist/node_modules/motion-dom/dist/es/utils/supports/flags.js.map +0 -1
  424. package/dist/node_modules/motion-dom/dist/es/utils/supports/linear-easing.js +0 -14
  425. package/dist/node_modules/motion-dom/dist/es/utils/supports/linear-easing.js.map +0 -1
  426. package/dist/node_modules/motion-dom/dist/es/utils/supports/memo.js +0 -11
  427. package/dist/node_modules/motion-dom/dist/es/utils/supports/memo.js.map +0 -1
  428. package/dist/node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.js +0 -7
  429. package/dist/node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.js.map +0 -1
  430. package/dist/node_modules/motion-dom/dist/es/value/index.js +0 -94
  431. package/dist/node_modules/motion-dom/dist/es/value/index.js.map +0 -1
  432. package/dist/node_modules/motion-dom/dist/es/value/types/auto.js +0 -9
  433. package/dist/node_modules/motion-dom/dist/es/value/types/auto.js.map +0 -1
  434. package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.js +0 -21
  435. package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.js.map +0 -1
  436. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.js +0 -23
  437. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.js.map +0 -1
  438. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla.js +0 -14
  439. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla.js.map +0 -1
  440. package/dist/node_modules/motion-dom/dist/es/value/types/color/index.js +0 -17
  441. package/dist/node_modules/motion-dom/dist/es/value/types/color/index.js.map +0 -1
  442. package/dist/node_modules/motion-dom/dist/es/value/types/color/rgba.js +0 -17
  443. package/dist/node_modules/motion-dom/dist/es/value/types/color/rgba.js.map +0 -1
  444. package/dist/node_modules/motion-dom/dist/es/value/types/color/utils.js +0 -18
  445. package/dist/node_modules/motion-dom/dist/es/value/types/color/utils.js.map +0 -1
  446. package/dist/node_modules/motion-dom/dist/es/value/types/complex/filter.js +0 -28
  447. package/dist/node_modules/motion-dom/dist/es/value/types/complex/filter.js.map +0 -1
  448. package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.js +0 -54
  449. package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.js.map +0 -1
  450. package/dist/node_modules/motion-dom/dist/es/value/types/complex/mask.js +0 -16
  451. package/dist/node_modules/motion-dom/dist/es/value/types/complex/mask.js.map +0 -1
  452. package/dist/node_modules/motion-dom/dist/es/value/types/dimensions.js +0 -18
  453. package/dist/node_modules/motion-dom/dist/es/value/types/dimensions.js.map +0 -1
  454. package/dist/node_modules/motion-dom/dist/es/value/types/int.js +0 -10
  455. package/dist/node_modules/motion-dom/dist/es/value/types/int.js.map +0 -1
  456. package/dist/node_modules/motion-dom/dist/es/value/types/maps/defaults.js +0 -26
  457. package/dist/node_modules/motion-dom/dist/es/value/types/maps/defaults.js.map +0 -1
  458. package/dist/node_modules/motion-dom/dist/es/value/types/maps/number.js +0 -66
  459. package/dist/node_modules/motion-dom/dist/es/value/types/maps/number.js.map +0 -1
  460. package/dist/node_modules/motion-dom/dist/es/value/types/maps/transform.js +0 -33
  461. package/dist/node_modules/motion-dom/dist/es/value/types/maps/transform.js.map +0 -1
  462. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/index.js +0 -17
  463. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/index.js.map +0 -1
  464. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/units.js +0 -14
  465. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/units.js.map +0 -1
  466. package/dist/node_modules/motion-dom/dist/es/value/types/test.js +0 -6
  467. package/dist/node_modules/motion-dom/dist/es/value/types/test.js.map +0 -1
  468. package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.js +0 -14
  469. package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.js.map +0 -1
  470. package/dist/node_modules/motion-dom/dist/es/value/types/utils/color-regex.js +0 -6
  471. package/dist/node_modules/motion-dom/dist/es/value/types/utils/color-regex.js.map +0 -1
  472. package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.js +0 -14
  473. package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.js.map +0 -1
  474. package/dist/node_modules/motion-dom/dist/es/value/types/utils/float-regex.js +0 -6
  475. package/dist/node_modules/motion-dom/dist/es/value/types/utils/float-regex.js.map +0 -1
  476. package/dist/node_modules/motion-dom/dist/es/value/types/utils/get-as-type.js +0 -6
  477. package/dist/node_modules/motion-dom/dist/es/value/types/utils/get-as-type.js.map +0 -1
  478. package/dist/node_modules/motion-dom/dist/es/value/types/utils/is-nullish.js +0 -8
  479. package/dist/node_modules/motion-dom/dist/es/value/types/utils/is-nullish.js.map +0 -1
  480. package/dist/node_modules/motion-dom/dist/es/value/types/utils/sanitize.js +0 -6
  481. package/dist/node_modules/motion-dom/dist/es/value/types/utils/sanitize.js.map +0 -1
  482. package/dist/node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.js +0 -6
  483. package/dist/node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.js.map +0 -1
  484. package/dist/node_modules/motion-dom/dist/es/value/utils/is-motion-value.js +0 -6
  485. package/dist/node_modules/motion-dom/dist/es/value/utils/is-motion-value.js.map +0 -1
  486. package/dist/node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.js +0 -9
  487. package/dist/node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.js.map +0 -1
  488. package/dist/node_modules/motion-dom/dist/es/value/will-change/add-will-change.js +0 -15
  489. package/dist/node_modules/motion-dom/dist/es/value/will-change/add-will-change.js.map +0 -1
  490. package/dist/node_modules/motion-dom/dist/es/value/will-change/is.js +0 -9
  491. package/dist/node_modules/motion-dom/dist/es/value/will-change/is.js.map +0 -1
  492. package/dist/node_modules/motion-utils/dist/es/array.js +0 -12
  493. package/dist/node_modules/motion-utils/dist/es/array.js.map +0 -1
  494. package/dist/node_modules/motion-utils/dist/es/clamp.js +0 -6
  495. package/dist/node_modules/motion-utils/dist/es/clamp.js.map +0 -1
  496. package/dist/node_modules/motion-utils/dist/es/easing/anticipate.js +0 -7
  497. package/dist/node_modules/motion-utils/dist/es/easing/anticipate.js.map +0 -1
  498. package/dist/node_modules/motion-utils/dist/es/easing/back.js +0 -9
  499. package/dist/node_modules/motion-utils/dist/es/easing/back.js.map +0 -1
  500. package/dist/node_modules/motion-utils/dist/es/easing/circ.js +0 -8
  501. package/dist/node_modules/motion-utils/dist/es/easing/circ.js.map +0 -1
  502. package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.js +0 -19
  503. package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.js.map +0 -1
  504. package/dist/node_modules/motion-utils/dist/es/easing/ease.js +0 -7
  505. package/dist/node_modules/motion-utils/dist/es/easing/ease.js.map +0 -1
  506. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/mirror.js +0 -6
  507. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/mirror.js.map +0 -1
  508. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/reverse.js +0 -6
  509. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/reverse.js.map +0 -1
  510. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.js +0 -6
  511. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.js.map +0 -1
  512. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-easing-array.js +0 -6
  513. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-easing-array.js.map +0 -1
  514. package/dist/node_modules/motion-utils/dist/es/easing/utils/map.js +0 -33
  515. package/dist/node_modules/motion-utils/dist/es/easing/utils/map.js.map +0 -1
  516. package/dist/node_modules/motion-utils/dist/es/errors.js +0 -12
  517. package/dist/node_modules/motion-utils/dist/es/errors.js.map +0 -1
  518. package/dist/node_modules/motion-utils/dist/es/format-error-message.js +0 -8
  519. package/dist/node_modules/motion-utils/dist/es/format-error-message.js.map +0 -1
  520. package/dist/node_modules/motion-utils/dist/es/global-config.js +0 -6
  521. package/dist/node_modules/motion-utils/dist/es/global-config.js.map +0 -1
  522. package/dist/node_modules/motion-utils/dist/es/is-numerical-string.js +0 -6
  523. package/dist/node_modules/motion-utils/dist/es/is-numerical-string.js.map +0 -1
  524. package/dist/node_modules/motion-utils/dist/es/is-object.js +0 -8
  525. package/dist/node_modules/motion-utils/dist/es/is-object.js.map +0 -1
  526. package/dist/node_modules/motion-utils/dist/es/is-zero-value-string.js +0 -6
  527. package/dist/node_modules/motion-utils/dist/es/is-zero-value-string.js.map +0 -1
  528. package/dist/node_modules/motion-utils/dist/es/memo.js +0 -10
  529. package/dist/node_modules/motion-utils/dist/es/memo.js.map +0 -1
  530. package/dist/node_modules/motion-utils/dist/es/noop.js +0 -6
  531. package/dist/node_modules/motion-utils/dist/es/noop.js.map +0 -1
  532. package/dist/node_modules/motion-utils/dist/es/pipe.js +0 -6
  533. package/dist/node_modules/motion-utils/dist/es/pipe.js.map +0 -1
  534. package/dist/node_modules/motion-utils/dist/es/progress.js +0 -9
  535. package/dist/node_modules/motion-utils/dist/es/progress.js.map +0 -1
  536. package/dist/node_modules/motion-utils/dist/es/subscription-manager.js +0 -28
  537. package/dist/node_modules/motion-utils/dist/es/subscription-manager.js.map +0 -1
  538. package/dist/node_modules/motion-utils/dist/es/time-conversion.js +0 -6
  539. package/dist/node_modules/motion-utils/dist/es/time-conversion.js.map +0 -1
  540. package/dist/node_modules/motion-utils/dist/es/velocity-per-second.js +0 -8
  541. package/dist/node_modules/motion-utils/dist/es/velocity-per-second.js.map +0 -1
  542. package/dist/node_modules/motion-utils/dist/es/warn-once.js +0 -10
  543. package/dist/node_modules/motion-utils/dist/es/warn-once.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RiskPage.js","names":[],"sources":["../../../src/brainyrich/pages/RiskPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Activity,\n AlertTriangle,\n ArrowRight,\n Check,\n Eye,\n Gauge,\n Layers,\n MoreHorizontal,\n Plus,\n Scale,\n ShieldAlert,\n ShieldCheck,\n TrendingUp,\n X,\n} from 'lucide-react';\nimport {\n useRebalanceProposals,\n usePortfolios,\n usePagedInsights,\n useCreateRebalanceProposal,\n useTransitionRebalanceProposal,\n useAcknowledgeInsight,\n useDismissInsight,\n useResolveInsight,\n} from '../hooks/useBrainyRichApi';\nimport type {\n BraPortfolio,\n BraRebalanceProposal,\n BraRebalanceStatus,\n BraInsight,\n BraInsightSeverity,\n BraInsightType,\n} from '../types/bra';\nimport {\n SectionShell,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatPct,\n formatDate,\n statusBadgeVariant,\n} from './_shared';\nimport {\n ConfirmDialog,\n ActorName,\n LoadMore,\n StatTile,\n GlassCard,\n FadeIn,\n DonutChart,\n LifecycleStepper,\n type VizTone,\n type DonutDatum,\n} from '../components';\nimport { CommentThread } from '../components/reuse/CommentThread';\n\n// ============================================================================\n// Domain rules (derived from the SDL enum, not fabricated data)\n// ============================================================================\n\n/** Valid forward/side transitions per current rebalance status. Terminal states map to []. */\nconst NEXT_STATUSES: Record<BraRebalanceStatus, BraRebalanceStatus[]> = {\n DRAFT: ['PROPOSED', 'CANCELLED'],\n PROPOSED: ['APPROVED', 'REJECTED', 'CANCELLED'],\n APPROVED: ['EXECUTED', 'CANCELLED'],\n REJECTED: [],\n EXECUTED: [],\n CANCELLED: [],\n};\n\n/** Insight types that belong on the risk/rebalancing surface. */\nconst RISK_INSIGHT_TYPES: BraInsightType[] = [\n 'DRIFT',\n 'CONCENTRATION_RISK',\n 'REBALANCE_DUE',\n 'CASH_DRAG',\n 'FEE_ANOMALY',\n];\nconst RISK_INSIGHT_TYPE_SET = new Set<BraInsightType>(RISK_INSIGHT_TYPES);\n\nfunction humanize(value: string): string {\n return value\n .toLowerCase()\n .split('_')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\n/** Lifecycle chart stages (forward path). Side states handled by the stepper. */\nconst LIFECYCLE_STEPS = ['Draft', 'Proposed', 'Approved', 'Executed'];\n\n/** Categorical donut tone per proposal status (distinct emerald-brand-first hues). */\nconst STATUS_TONE: Record<BraRebalanceStatus, VizTone> = {\n DRAFT: 'neutral',\n PROPOSED: 'warning',\n APPROVED: 'blue',\n EXECUTED: 'success',\n REJECTED: 'error',\n CANCELLED: 'neutral',\n};\n\nconst STATUS_ORDER: BraRebalanceStatus[] = [\n 'PROPOSED',\n 'DRAFT',\n 'APPROVED',\n 'EXECUTED',\n 'REJECTED',\n 'CANCELLED',\n];\n\n/** Donut tone per insight severity. */\nconst SEVERITY_TONE: Record<BraInsightSeverity, VizTone> = {\n CRITICAL: 'error',\n HIGH: 'warning',\n MEDIUM: 'info',\n LOW: 'teal',\n INFO: 'neutral',\n};\n\nconst SEVERITY_ORDER: BraInsightSeverity[] = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO'];\n\n/** A best-effort structured trade row parsed from the opaque `trades` JSON. */\ninterface TradeRow {\n action?: string;\n symbol?: string;\n quantity?: number;\n value?: number;\n}\n\n/**\n * Parse the opaque `trades` scalar into structured rows WITHOUT inventing data:\n * only keys actually present on each object are surfaced. Returns null when the\n * value is not an array of plain objects (callers fall back to a text summary).\n */\nfunction parseTrades(trades: unknown): TradeRow[] | null {\n if (!Array.isArray(trades) || trades.length === 0) return null;\n const rows: TradeRow[] = [];\n for (const item of trades) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return null;\n const t = item as Record<string, unknown>;\n const get = (keys: string[]): unknown => {\n for (const k of Object.keys(t)) {\n if (keys.includes(k.toLowerCase())) return t[k];\n }\n return undefined;\n };\n const action = get(['action', 'side', 'type']);\n const symbol = get(['symbol', 'ticker', 'asset', 'instrument']);\n const quantity = get(['quantity', 'qty', 'shares', 'units']);\n const value = get(['value', 'notional', 'amount', 'total', 'marketvalue']);\n rows.push({\n action: typeof action === 'string' ? action : undefined,\n symbol: typeof symbol === 'string' ? symbol : undefined,\n quantity: typeof quantity === 'number' ? quantity : undefined,\n value: typeof value === 'number' ? value : undefined,\n });\n }\n return rows;\n}\n\n/** Semantic tone for a trade action (color is never the only signal). */\nfunction tradeActionTone(action: string | undefined): string {\n const a = (action ?? '').toUpperCase();\n if (a.includes('BUY') || a.includes('ADD')) return 'text-status-success-text';\n if (a.includes('SELL') || a.includes('TRIM') || a.includes('REDUCE')) return 'text-status-error-text';\n return 'text-text-secondary';\n}\n\n/** Summarize the opaque `trades` JSON scalar without inventing data. */\nfunction summarizeTrades(trades: unknown): string {\n if (trades == null) return '—';\n if (Array.isArray(trades)) {\n return `${trades.length} trade${trades.length === 1 ? '' : 's'}`;\n }\n if (typeof trades === 'object') {\n const n = Object.keys(trades as Record<string, unknown>).length;\n return `${n} field${n === 1 ? '' : 's'}`;\n }\n return String(trades);\n}\n\n// ============================================================================\n// Create-proposal form\n// ============================================================================\n\ninterface ProposalFormState {\n portfolioId: string;\n driftPct: string;\n rationale: string;\n trades: string;\n}\n\nconst EMPTY_PROPOSAL_FORM: ProposalFormState = {\n portfolioId: '',\n driftPct: '',\n rationale: '',\n trades: '',\n};\n\nfunction parseNum(value: string): number | undefined {\n if (value.trim() === '') return undefined;\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nexport function RiskPage() {\n const {\n data: proposals,\n isLoading: proposalsLoading,\n isError: proposalsError,\n refetch: refetchProposals,\n } = useRebalanceProposals();\n\n const { data: portfolios } = usePortfolios();\n\n const {\n items: insights,\n hasMore: insightsHasMore,\n loadMore: loadMoreInsights,\n isLoading: insightsLoading,\n isFetchingNextPage: insightsFetchingMore,\n isError: insightsError,\n refetch: refetchInsights,\n } = usePagedInsights();\n\n const createProposal = useCreateRebalanceProposal();\n const transitionProposal = useTransitionRebalanceProposal();\n const acknowledgeInsight = useAcknowledgeInsight();\n const dismissInsight = useDismissInsight();\n const resolveInsight = useResolveInsight();\n\n const [createOpen, setCreateOpen] = useState(false);\n const [form, setForm] = useState<ProposalFormState>(EMPTY_PROPOSAL_FORM);\n const [tradesError, setTradesError] = useState<string | null>(null);\n const [detailProposal, setDetailProposal] = useState<BraRebalanceProposal | null>(null);\n const [confirmTransition, setConfirmTransition] = useState<{\n proposal: BraRebalanceProposal;\n status: BraRebalanceStatus;\n } | null>(null);\n\n // Portfolio lookup for names + drift thresholds (real backend data).\n const portfolioById = useMemo(() => {\n const map = new Map<string, BraPortfolio>();\n for (const p of portfolios) map.set(p.id, p);\n return map;\n }, [portfolios]);\n\n const riskInsights = useMemo(\n () => insights.filter((i) => RISK_INSIGHT_TYPE_SET.has(i.type)),\n [insights]\n );\n\n const activeProposals = proposals.filter(\n (p) => p.status === 'DRAFT' || p.status === 'PROPOSED' || p.status === 'APPROVED'\n );\n const openInsights = riskInsights.filter((i) => i.status === 'OPEN');\n const avgDrift =\n proposals.length > 0\n ? proposals.reduce((sum, p) => sum + (p.driftPct ?? 0), 0) / proposals.length\n : null;\n\n // Breach count drives the drift tile's tone (real: drift ≥ portfolio threshold).\n const breachedCount = useMemo(\n () =>\n proposals.filter((p) => {\n const threshold = portfolioById.get(p.portfolioId)?.driftThresholdPct;\n return threshold != null && Number.isFinite(threshold) && p.driftPct >= threshold;\n }).length,\n [proposals, portfolioById]\n );\n\n // Real drift series (chronological) — decorative sparkline on the drift KPI.\n const driftSeries = useMemo(\n () =>\n [...proposals]\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map((p) => p.driftPct)\n .filter((n) => Number.isFinite(n)),\n [proposals]\n );\n\n // Proposal pipeline distribution (real counts by lifecycle status).\n const statusDonut = useMemo<DonutDatum[]>(() => {\n const counts = new Map<BraRebalanceStatus, number>();\n for (const p of proposals) counts.set(p.status, (counts.get(p.status) ?? 0) + 1);\n return STATUS_ORDER.filter((s) => (counts.get(s) ?? 0) > 0).map((s) => ({\n label: humanize(s),\n value: counts.get(s) ?? 0,\n tone: STATUS_TONE[s],\n }));\n }, [proposals]);\n\n // Open risk-signal distribution (real counts by severity).\n const severityDonut = useMemo<DonutDatum[]>(() => {\n const counts = new Map<BraInsightSeverity, number>();\n for (const i of openInsights) counts.set(i.severity, (counts.get(i.severity) ?? 0) + 1);\n return SEVERITY_ORDER.filter((s) => (counts.get(s) ?? 0) > 0).map((s) => ({\n label: humanize(s),\n value: counts.get(s) ?? 0,\n tone: SEVERITY_TONE[s],\n }));\n }, [openInsights]);\n\n const canCreate = portfolios.length > 0;\n\n function openCreate() {\n setForm(EMPTY_PROPOSAL_FORM);\n setTradesError(null);\n setCreateOpen(true);\n }\n\n function submitCreate() {\n if (!form.portfolioId) return;\n let trades: unknown;\n if (form.trades.trim() !== '') {\n try {\n trades = JSON.parse(form.trades);\n } catch {\n setTradesError('Trades must be valid JSON.');\n return;\n }\n }\n const portfolio = portfolioById.get(form.portfolioId);\n createProposal.mutate(\n {\n portfolioId: form.portfolioId,\n householdId: portfolio?.householdId ?? null,\n driftPct: parseNum(form.driftPct),\n rationale: form.rationale.trim() || null,\n ...(trades !== undefined ? { trades } : {}),\n },\n { onSuccess: () => setCreateOpen(false) }\n );\n }\n\n /** Destructive transitions (reject/cancel) confirm first; forward transitions fire directly. */\n function requestTransition(proposal: BraRebalanceProposal, status: BraRebalanceStatus) {\n if (status === 'REJECTED' || status === 'CANCELLED') {\n setConfirmTransition({ proposal, status });\n return;\n }\n transitionProposal.mutate({ id: proposal.id, status });\n }\n\n /** Drift is a breach when it meets/exceeds the portfolio's configured threshold. */\n function driftBreached(p: BraRebalanceProposal): boolean {\n const threshold = portfolioById.get(p.portfolioId)?.driftThresholdPct;\n return threshold != null && Number.isFinite(threshold) && p.driftPct >= threshold;\n }\n\n return (\n <SectionShell\n title=\"Risk & Rebalancing\"\n description=\"Review drift-driven rebalance proposals and act on portfolio risk insights.\"\n badges={[\n `${activeProposals.length} active`,\n `${openInsights.length} open insight${openInsights.length === 1 ? '' : 's'}`,\n ]}\n actionLabel=\"New proposal\"\n onAction={openCreate}\n >\n {/* Premium KPI row */}\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <FadeIn index={0}>\n <StatTile\n label=\"Average drift\"\n value={avgDrift === null ? '—' : formatPct(avgDrift)}\n spark={driftSeries.length > 1 ? driftSeries : undefined}\n sparkTone={breachedCount > 0 ? 'error' : 'brand'}\n glow\n icon={<Gauge className=\"size-4\" aria-hidden=\"true\" />}\n />\n </FadeIn>\n <FadeIn index={1}>\n <StatTile\n label=\"Active proposals\"\n value={String(activeProposals.length)}\n icon={<Activity className=\"size-4\" aria-hidden=\"true\" />}\n />\n </FadeIn>\n <FadeIn index={2}>\n <StatTile\n label=\"Total proposals\"\n value={String(proposals.length)}\n icon={<Layers className=\"size-4\" aria-hidden=\"true\" />}\n />\n </FadeIn>\n <FadeIn index={3}>\n <StatTile\n label=\"Open risk insights\"\n value={String(openInsights.length)}\n deltaTone={openInsights.length > 0 ? 'negative' : 'neutral'}\n icon={<ShieldAlert className=\"size-4\" aria-hidden=\"true\" />}\n />\n </FadeIn>\n </div>\n\n {/* Hero band — pipeline + risk-signal distribution donuts */}\n {(statusDonut.length > 0 || severityDonut.length > 0) && !proposalsLoading ? (\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <FadeIn index={0}>\n <GlassCard glow className=\"h-full\">\n <div className=\"mb-3 flex items-center gap-2\">\n <TrendingUp className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n <h2 className=\"text-sm font-semibold text-text-primary\">Proposal pipeline</h2>\n </div>\n <DonutChart\n data={statusDonut}\n centerValue={String(proposals.length)}\n centerLabel=\"proposals\"\n height={200}\n />\n </GlassCard>\n </FadeIn>\n <FadeIn index={1}>\n <GlassCard className=\"h-full\">\n <div className=\"mb-3 flex items-center gap-2\">\n <ShieldAlert className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n <h2 className=\"text-sm font-semibold text-text-primary\">Open risk signals</h2>\n </div>\n {severityDonut.length > 0 ? (\n <DonutChart\n data={severityDonut}\n centerValue={String(openInsights.length)}\n centerLabel=\"open\"\n height={200}\n />\n ) : (\n <div className=\"flex h-[200px] flex-col items-center justify-center gap-2 text-center\">\n <ShieldCheck className=\"size-8 text-status-success-text\" aria-hidden=\"true\" />\n <p className=\"text-sm text-text-secondary\">No open risk signals.</p>\n </div>\n )}\n </GlassCard>\n </FadeIn>\n </div>\n ) : null}\n\n {/* Rebalance proposals */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Scale className=\"h-5 w-5\" aria-hidden=\"true\" />\n Rebalance proposals\n </CardTitle>\n <CardDescription>\n Drift against target allocation, with lifecycle actions per proposal.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {proposalsLoading ? (\n <LoadingState />\n ) : proposalsError ? (\n <ErrorState onRetry={() => refetchProposals()} />\n ) : proposals.length === 0 ? (\n <EmptyState\n icon={<Scale className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No rebalance proposals\"\n description={\n canCreate\n ? 'Create a proposal when a portfolio drifts from its target allocation.'\n : 'Create a portfolio first, then propose a rebalance when it drifts.'\n }\n action={\n canCreate ? (\n <Button size=\"sm\" onClick={openCreate}>\n <Plus className=\"size-4\" aria-hidden=\"true\" />\n New proposal\n </Button>\n ) : undefined\n }\n />\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Portfolio</TableHead>\n <TableHead className=\"text-right\">Drift</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Rationale</TableHead>\n <TableHead>Trades</TableHead>\n <TableHead>Created</TableHead>\n <TableHead className=\"w-12 text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {proposals.map((p) => {\n const portfolio = portfolioById.get(p.portfolioId);\n const breached = driftBreached(p);\n const nextStatuses = NEXT_STATUSES[p.status];\n const threshold = portfolio?.driftThresholdPct;\n const meterPct =\n threshold != null && threshold > 0\n ? Math.min(100, (p.driftPct / threshold) * 100)\n : null;\n return (\n <TableRow\n key={p.id}\n onClick={() => setDetailProposal(p)}\n className=\"cursor-pointer transition-colors motion-safe:hover:bg-bg-elevated\"\n >\n <TableCell>\n <p className=\"font-medium text-text-primary\">\n {portfolio?.name ?? 'Unknown portfolio'}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {portfolio?.baseCurrency ?? '—'}\n {threshold != null\n ? ` · threshold ${formatPct(threshold)}`\n : ''}\n </p>\n </TableCell>\n <TableCell className=\"text-right\">\n <span\n className={`inline-flex items-center justify-end gap-1 font-semibold tabular-nums ${\n breached ? 'text-status-error-text' : 'text-text-primary'\n }`}\n >\n {breached ? (\n <AlertTriangle className=\"size-4\" aria-hidden=\"true\" />\n ) : null}\n {formatPct(p.driftPct)}\n </span>\n {meterPct != null ? (\n <div\n className=\"ml-auto mt-1 h-1.5 w-24 overflow-hidden rounded-full bg-bg-sunken\"\n role=\"progressbar\"\n aria-valuenow={Math.round(meterPct)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Drift vs threshold for ${portfolio?.name ?? 'portfolio'}`}\n >\n <div\n className=\"h-full rounded-full\"\n style={{\n width: `${meterPct}%`,\n background: breached\n ? 'var(--color-status-error)'\n : 'var(--color-action-primary-bg)',\n }}\n />\n </div>\n ) : breached ? (\n <p className=\"text-xs text-status-error-text\">Over threshold</p>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant={statusBadgeVariant(p.status)}>{humanize(p.status)}</Badge>\n </TableCell>\n <TableCell className=\"max-w-xs\">\n <p className=\"truncate text-sm text-text-secondary\">\n {p.rationale ?? '—'}\n </p>\n </TableCell>\n <TableCell className=\"text-sm text-text-secondary\">\n {summarizeTrades(p.trades)}\n </TableCell>\n <TableCell className=\"text-sm text-text-secondary\">\n {formatDate(p.createdAt)}\n </TableCell>\n <TableCell\n className=\"text-right\"\n onClick={(e) => e.stopPropagation()}\n >\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Actions for ${portfolio?.name ?? 'proposal'}`}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setDetailProposal(p)}>\n <Eye className=\"size-4\" aria-hidden=\"true\" />\n View details\n </DropdownMenuItem>\n {nextStatuses.length > 0 ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Advance to</DropdownMenuLabel>\n {nextStatuses.map((status) => {\n const destructive =\n status === 'REJECTED' || status === 'CANCELLED';\n return (\n <DropdownMenuItem\n key={status}\n disabled={transitionProposal.isPending}\n className={\n destructive ? 'text-status-error-text' : undefined\n }\n onClick={() => requestTransition(p, status)}\n >\n {destructive ? (\n <X className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <ArrowRight className=\"size-4\" aria-hidden=\"true\" />\n )}\n {humanize(status)}\n </DropdownMenuItem>\n );\n })}\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Risk insights */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <ShieldAlert className=\"h-5 w-5\" aria-hidden=\"true\" />\n Risk insights\n </CardTitle>\n <CardDescription>\n Drift, concentration, cash-drag and fee-anomaly signals detected across your portfolios.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {insightsLoading ? (\n <LoadingState />\n ) : insightsError ? (\n <ErrorState onRetry={() => refetchInsights()} />\n ) : riskInsights.length === 0 ? (\n <EmptyState\n icon={<ShieldCheck className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No risk insights\"\n description=\"No drift, concentration, cash-drag or fee-anomaly signals are open right now.\"\n />\n ) : (\n <div className=\"space-y-3\">\n {riskInsights.map((insight, i) => (\n <FadeIn key={insight.id} index={i}>\n <InsightRow\n insight={insight}\n onAcknowledge={() => acknowledgeInsight.mutate(insight.id)}\n onResolve={() => resolveInsight.mutate(insight.id)}\n onDismiss={() => dismissInsight.mutate(insight.id)}\n actionPending={\n acknowledgeInsight.isPending ||\n resolveInsight.isPending ||\n dismissInsight.isPending\n }\n />\n </FadeIn>\n ))}\n <LoadMore\n hasMore={insightsHasMore}\n onClick={loadMoreInsights}\n loading={insightsFetchingMore}\n label=\"Load more insights\"\n />\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Create proposal dialog */}\n <Dialog open={createOpen} onOpenChange={setCreateOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New rebalance proposal</DialogTitle>\n <DialogDescription>\n Propose a rebalance for a portfolio that has drifted from its target allocation.\n </DialogDescription>\n </DialogHeader>\n {!canCreate ? (\n <EmptyState\n icon={<Scale className=\"size-6\" aria-hidden=\"true\" />}\n title=\"Create a portfolio first\"\n description=\"A rebalance proposal targets a portfolio. Add a portfolio on the Portfolios page, then return here to propose a rebalance.\"\n />\n ) : (\n <div className=\"grid gap-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"prop-portfolio\">\n Portfolio <span className=\"text-status-error-text\">*</span>\n </Label>\n <Select\n value={form.portfolioId}\n onValueChange={(v) => setForm((f) => ({ ...f, portfolioId: v }))}\n >\n <SelectTrigger id=\"prop-portfolio\">\n <SelectValue placeholder=\"Select a portfolio\" />\n </SelectTrigger>\n <SelectContent>\n {portfolios.map((p) => (\n <SelectItem key={p.id} value={p.id}>\n {p.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"prop-drift\">Drift %</Label>\n <Input\n id=\"prop-drift\"\n type=\"number\"\n value={form.driftPct}\n onChange={(e) => setForm((f) => ({ ...f, driftPct: e.target.value }))}\n placeholder=\"e.g. 6.5\"\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"prop-rationale\">Rationale</Label>\n <Textarea\n id=\"prop-rationale\"\n value={form.rationale}\n onChange={(e) => setForm((f) => ({ ...f, rationale: e.target.value }))}\n placeholder=\"Why is this rebalance needed?\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"prop-trades\">Trades (JSON, optional)</Label>\n <Textarea\n id=\"prop-trades\"\n className=\"font-mono text-xs\"\n value={form.trades}\n onChange={(e) => {\n setTradesError(null);\n setForm((f) => ({ ...f, trades: e.target.value }));\n }}\n placeholder='e.g. [{\"symbol\":\"VOO\",\"action\":\"SELL\",\"quantity\":10}]'\n />\n {tradesError ? (\n <p className=\"text-xs text-status-error-text\">{tradesError}</p>\n ) : null}\n </div>\n </div>\n )}\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button onClick={submitCreate} disabled={!form.portfolioId || createProposal.isPending}>\n {createProposal.isPending ? 'Creating…' : 'Create proposal'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Proposal detail — lifecycle, proposed trades, risk insights + discussion */}\n {(() => {\n // Re-read from the live list so the stepper/status reflect transitions.\n const live = detailProposal\n ? (proposals.find((p) => p.id === detailProposal.id) ?? detailProposal)\n : null;\n const related = live\n ? insights.filter((i) => i.subjectId === live.portfolioId)\n : [];\n return (\n <ProposalDetailDialog\n proposal={live}\n portfolio={live ? (portfolioById.get(live.portfolioId) ?? null) : null}\n relatedInsights={related}\n nextStatuses={live ? NEXT_STATUSES[live.status] : []}\n transitionPending={transitionProposal.isPending}\n onTransition={(status) => {\n if (live) requestTransition(live, status);\n }}\n onOpenChange={(open) => {\n if (!open) setDetailProposal(null);\n }}\n />\n );\n })()}\n\n {/* Confirm destructive lifecycle transition (reject / cancel) */}\n <ConfirmDialog\n open={confirmTransition !== null}\n onOpenChange={(open) => {\n if (!open) setConfirmTransition(null);\n }}\n title={\n confirmTransition?.status === 'REJECTED'\n ? 'Reject this proposal?'\n : 'Cancel this proposal?'\n }\n description={\n confirmTransition\n ? `This moves the rebalance proposal for ${\n portfolioById.get(confirmTransition.proposal.portfolioId)?.name ??\n 'this portfolio'\n } to ${humanize(confirmTransition.status)}. This cannot be undone.`\n : undefined\n }\n confirmLabel={confirmTransition?.status === 'REJECTED' ? 'Reject' : 'Cancel proposal'}\n cancelLabel=\"Keep\"\n destructive\n pending={transitionProposal.isPending}\n onConfirm={() => {\n if (!confirmTransition) return;\n transitionProposal.mutate(\n { id: confirmTransition.proposal.id, status: confirmTransition.status },\n { onSuccess: () => setConfirmTransition(null) }\n );\n }}\n />\n </SectionShell>\n );\n}\n\n// ============================================================================\n// Proposal detail dialog — rationale summary, actors, and discussion thread\n// ============================================================================\n\nfunction ProposalDetailDialog({\n proposal,\n portfolio,\n relatedInsights,\n nextStatuses,\n transitionPending,\n onTransition,\n onOpenChange,\n}: {\n proposal: BraRebalanceProposal | null;\n portfolio: BraPortfolio | null;\n relatedInsights: BraInsight[];\n nextStatuses: BraRebalanceStatus[];\n transitionPending: boolean;\n onTransition: (status: BraRebalanceStatus) => void;\n onOpenChange: (open: boolean) => void;\n}) {\n const trades = proposal ? parseTrades(proposal.trades) : null;\n const breached =\n proposal != null &&\n portfolio?.driftThresholdPct != null &&\n Number.isFinite(portfolio.driftThresholdPct) &&\n proposal.driftPct >= portfolio.driftThresholdPct;\n\n return (\n <Dialog open={proposal !== null} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-h-[88vh] max-w-3xl overflow-y-auto\">\n {proposal ? (\n <>\n <DialogHeader>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Detail\n </p>\n <DialogTitle className=\"flex flex-wrap items-center gap-2 text-xl\">\n {portfolio?.name ?? 'Rebalance proposal'}\n <span className=\"text-text-secondary\">— Rebalance proposal</span>\n <Badge variant={statusBadgeVariant(proposal.status)}>\n {humanize(proposal.status)}\n </Badge>\n </DialogTitle>\n <DialogDescription>\n Created {formatDate(proposal.createdAt)}\n {proposal.executedAt ? ` · executed ${formatDate(proposal.executedAt)}` : ''}\n </DialogDescription>\n </DialogHeader>\n\n {/* Lifecycle stepper — DRAFT → PROPOSED → APPROVED → EXECUTED (+ side states). */}\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <LifecycleStepper steps={LIFECYCLE_STEPS} current={humanize(proposal.status)} />\n </div>\n\n {/* Key facts as premium tiles */}\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <StatTile\n label=\"Drift\"\n value={formatPct(proposal.driftPct)}\n deltaTone={breached ? 'negative' : 'neutral'}\n glow={breached}\n icon={<Gauge className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label=\"Threshold\"\n value={\n portfolio?.driftThresholdPct != null\n ? formatPct(portfolio.driftThresholdPct)\n : '—'\n }\n />\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-xs text-text-secondary\">Proposed by</p>\n <p className=\"mt-1 truncate text-sm font-medium text-text-primary\">\n {proposal.proposedById ? <ActorName id={proposal.proposedById} /> : '—'}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-xs text-text-secondary\">Approved by</p>\n <p className=\"mt-1 truncate text-sm font-medium text-text-primary\">\n {proposal.approvedById ? <ActorName id={proposal.approvedById} /> : '—'}\n </p>\n </div>\n </div>\n\n {/* Proposed trades */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Proposed trades</h3>\n {trades && trades.length > 0 ? (\n <div className=\"overflow-x-auto rounded-lg border border-border-subtle\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Action</TableHead>\n <TableHead>Symbol</TableHead>\n <TableHead className=\"text-right\">Quantity</TableHead>\n <TableHead className=\"text-right\">Est. value</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {trades.map((t, i) => (\n <TableRow key={i}>\n <TableCell\n className={`font-semibold ${tradeActionTone(t.action)}`}\n >\n {t.action ? t.action.toUpperCase() : '—'}\n </TableCell>\n <TableCell className=\"font-medium text-text-primary\">\n {t.symbol ?? '—'}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-secondary\">\n {t.quantity != null ? t.quantity.toLocaleString() : '—'}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-secondary\">\n {t.value != null\n ? formatMoney(t.value, portfolio?.baseCurrency ?? 'USD')\n : '—'}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {summarizeTrades(proposal.trades)} — no structured trade breakdown available.\n </p>\n )}\n </div>\n\n {/* Rationale */}\n <div className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Rationale</h3>\n <p className=\"text-sm text-text-secondary\">{proposal.rationale ?? '—'}</p>\n </div>\n\n {/* Lifecycle actions (mirrors the row menu; destructive actions confirm) */}\n {nextStatuses.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {nextStatuses.map((status) => {\n const destructive = status === 'REJECTED' || status === 'CANCELLED';\n return (\n <Button\n key={status}\n variant={destructive ? 'outline' : 'default'}\n size=\"sm\"\n disabled={transitionPending}\n className={destructive ? 'text-status-error-text' : undefined}\n onClick={() => onTransition(status)}\n >\n {destructive ? (\n <X className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <ArrowRight className=\"size-4\" aria-hidden=\"true\" />\n )}\n {humanize(status)}\n </Button>\n );\n })}\n </div>\n ) : null}\n\n {/* Risk insights tied to this portfolio (real, filtered by subjectId) */}\n {relatedInsights.length > 0 ? (\n <div className=\"space-y-2 border-t border-border-subtle pt-4\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <ShieldAlert className=\"size-4\" aria-hidden=\"true\" />\n Risk insights\n </h3>\n <ul className=\"space-y-2\">\n {relatedInsights.map((insight) => (\n <li\n key={insight.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-text-primary\">\n {insight.title}\n </span>\n <Badge variant={statusBadgeVariant(insight.severity)}>\n {humanize(insight.severity)}\n </Badge>\n <Badge variant=\"outline\">{humanize(insight.type)}</Badge>\n <Badge variant={statusBadgeVariant(insight.status)}>\n {humanize(insight.status)}\n </Badge>\n </div>\n {insight.detail ? (\n <p className=\"mt-1 text-xs text-text-secondary\">{insight.detail}</p>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n <div className=\"border-t border-border-subtle pt-4\">\n <CommentThread\n entityType=\"brainyrich-rebalance\"\n entityId={proposal.id}\n heading=\"Discussion\"\n />\n </div>\n </>\n ) : null}\n </DialogContent>\n </Dialog>\n );\n}\n\n// ============================================================================\n// Insight row\n// ============================================================================\n\nfunction InsightRow({\n insight,\n onAcknowledge,\n onResolve,\n onDismiss,\n actionPending,\n}: {\n insight: BraInsight;\n onAcknowledge: () => void;\n onResolve: () => void;\n onDismiss: () => void;\n actionPending: boolean;\n}) {\n const terminal = insight.status === 'RESOLVED' || insight.status === 'DISMISSED';\n return (\n <div className=\"flex items-start justify-between gap-4 rounded-lg border border-border-subtle bg-bg-surface p-4 transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]\">\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"font-medium text-text-primary\">{insight.title}</p>\n <Badge variant={statusBadgeVariant(insight.severity)}>{humanize(insight.severity)}</Badge>\n <Badge variant=\"outline\">{humanize(insight.type)}</Badge>\n <Badge variant={statusBadgeVariant(insight.status)}>{humanize(insight.status)}</Badge>\n </div>\n {insight.detail ? <p className=\"text-sm text-text-secondary\">{insight.detail}</p> : null}\n <p className=\"text-xs text-text-muted\">Detected {formatDate(insight.createdAt)}</p>\n </div>\n {terminal ? (\n <span className=\"mt-1 text-xs text-text-muted\">Closed</span>\n ) : (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Actions for ${insight.title}`}\n disabled={actionPending}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {insight.status === 'OPEN' ? (\n <DropdownMenuItem onClick={onAcknowledge}>\n <Check className=\"size-4\" aria-hidden=\"true\" />\n Acknowledge\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem onClick={onResolve}>\n <ShieldCheck className=\"size-4\" aria-hidden=\"true\" />\n Resolve\n </DropdownMenuItem>\n <DropdownMenuItem className=\"text-status-error-text\" onClick={onDismiss}>\n <X className=\"size-4\" aria-hidden=\"true\" />\n Dismiss\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RiskPage.js","names":[],"sources":["../../../src/brainyrich/pages/RiskPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Activity,\n AlertTriangle,\n ArrowRight,\n Check,\n Eye,\n Gauge,\n Layers,\n MoreHorizontal,\n Plus,\n Scale,\n ShieldAlert,\n ShieldCheck,\n TrendingUp,\n X,\n} from 'lucide-react';\nimport {\n useRebalanceProposals,\n usePortfolios,\n usePagedInsights,\n useCreateRebalanceProposal,\n useTransitionRebalanceProposal,\n useAcknowledgeInsight,\n useDismissInsight,\n useResolveInsight,\n} from '../hooks/useBrainyRichApi';\nimport type {\n BraPortfolio,\n BraRebalanceProposal,\n BraRebalanceStatus,\n BraInsight,\n BraInsightSeverity,\n BraInsightType,\n} from '../types/bra';\nimport {\n SectionShell,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatPct,\n formatDate,\n statusBadgeVariant,\n} from './_shared';\nimport {\n ConfirmDialog,\n ActorName,\n LoadMore,\n StatTile,\n GlassCard,\n FadeIn,\n DonutChart,\n LifecycleStepper,\n type VizTone,\n type DonutDatum,\n} from '../components';\nimport { CommentThread } from '../components/reuse/CommentThread';\n\n// ============================================================================\n// Domain rules (derived from the SDL enum, not fabricated data)\n// ============================================================================\n\n/** Valid forward/side transitions per current rebalance status. Terminal states map to []. */\nconst NEXT_STATUSES: Record<BraRebalanceStatus, BraRebalanceStatus[]> = {\n DRAFT: ['PROPOSED', 'CANCELLED'],\n PROPOSED: ['APPROVED', 'REJECTED', 'CANCELLED'],\n APPROVED: ['EXECUTED', 'CANCELLED'],\n REJECTED: [],\n EXECUTED: [],\n CANCELLED: [],\n};\n\n/** Insight types that belong on the risk/rebalancing surface. */\nconst RISK_INSIGHT_TYPES: BraInsightType[] = [\n 'DRIFT',\n 'CONCENTRATION_RISK',\n 'REBALANCE_DUE',\n 'CASH_DRAG',\n 'FEE_ANOMALY',\n];\nconst RISK_INSIGHT_TYPE_SET = new Set<BraInsightType>(RISK_INSIGHT_TYPES);\n\nfunction humanize(value: string): string {\n return value\n .toLowerCase()\n .split('_')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\n/** Lifecycle chart stages (forward path). Side states handled by the stepper. */\nconst LIFECYCLE_STEPS = ['Draft', 'Proposed', 'Approved', 'Executed'];\n\n/** Categorical donut tone per proposal status (distinct emerald-brand-first hues). */\nconst STATUS_TONE: Record<BraRebalanceStatus, VizTone> = {\n DRAFT: 'neutral',\n PROPOSED: 'warning',\n APPROVED: 'blue',\n EXECUTED: 'success',\n REJECTED: 'error',\n CANCELLED: 'neutral',\n};\n\nconst STATUS_ORDER: BraRebalanceStatus[] = [\n 'PROPOSED',\n 'DRAFT',\n 'APPROVED',\n 'EXECUTED',\n 'REJECTED',\n 'CANCELLED',\n];\n\n/** Donut tone per insight severity. */\nconst SEVERITY_TONE: Record<BraInsightSeverity, VizTone> = {\n CRITICAL: 'error',\n HIGH: 'warning',\n MEDIUM: 'info',\n LOW: 'teal',\n INFO: 'neutral',\n};\n\nconst SEVERITY_ORDER: BraInsightSeverity[] = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO'];\n\n/** A best-effort structured trade row parsed from the opaque `trades` JSON. */\ninterface TradeRow {\n action?: string;\n symbol?: string;\n quantity?: number;\n value?: number;\n}\n\n/**\n * Parse the opaque `trades` scalar into structured rows WITHOUT inventing data:\n * only keys actually present on each object are surfaced. Returns null when the\n * value is not an array of plain objects (callers fall back to a text summary).\n */\nfunction parseTrades(trades: unknown): TradeRow[] | null {\n if (!Array.isArray(trades) || trades.length === 0) return null;\n const rows: TradeRow[] = [];\n for (const item of trades) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return null;\n const t = item as Record<string, unknown>;\n const get = (keys: string[]): unknown => {\n for (const k of Object.keys(t)) {\n if (keys.includes(k.toLowerCase())) return t[k];\n }\n return undefined;\n };\n const action = get(['action', 'side', 'type']);\n const symbol = get(['symbol', 'ticker', 'asset', 'instrument']);\n const quantity = get(['quantity', 'qty', 'shares', 'units']);\n const value = get(['value', 'notional', 'amount', 'total', 'marketvalue']);\n rows.push({\n action: typeof action === 'string' ? action : undefined,\n symbol: typeof symbol === 'string' ? symbol : undefined,\n quantity: typeof quantity === 'number' ? quantity : undefined,\n value: typeof value === 'number' ? value : undefined,\n });\n }\n return rows;\n}\n\n/** Semantic tone for a trade action (color is never the only signal). */\nfunction tradeActionTone(action: string | undefined): string {\n const a = (action ?? '').toUpperCase();\n if (a.includes('BUY') || a.includes('ADD')) return 'text-status-success-text';\n if (a.includes('SELL') || a.includes('TRIM') || a.includes('REDUCE'))\n return 'text-status-error-text';\n return 'text-text-secondary';\n}\n\n/** Summarize the opaque `trades` JSON scalar without inventing data. */\nfunction summarizeTrades(trades: unknown): string {\n if (trades == null) return '—';\n if (Array.isArray(trades)) {\n return `${trades.length} trade${trades.length === 1 ? '' : 's'}`;\n }\n if (typeof trades === 'object') {\n const n = Object.keys(trades as Record<string, unknown>).length;\n return `${n} field${n === 1 ? '' : 's'}`;\n }\n return String(trades);\n}\n\n// ============================================================================\n// Create-proposal form\n// ============================================================================\n\ninterface ProposalFormState {\n portfolioId: string;\n driftPct: string;\n rationale: string;\n trades: string;\n}\n\nconst EMPTY_PROPOSAL_FORM: ProposalFormState = {\n portfolioId: '',\n driftPct: '',\n rationale: '',\n trades: '',\n};\n\nfunction parseNum(value: string): number | undefined {\n if (value.trim() === '') return undefined;\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nexport function RiskPage() {\n const {\n data: proposals,\n isLoading: proposalsLoading,\n isError: proposalsError,\n refetch: refetchProposals,\n } = useRebalanceProposals();\n\n const { data: portfolios } = usePortfolios();\n\n const {\n items: insights,\n hasMore: insightsHasMore,\n loadMore: loadMoreInsights,\n isLoading: insightsLoading,\n isFetchingNextPage: insightsFetchingMore,\n isError: insightsError,\n refetch: refetchInsights,\n } = usePagedInsights();\n\n const createProposal = useCreateRebalanceProposal();\n const transitionProposal = useTransitionRebalanceProposal();\n const acknowledgeInsight = useAcknowledgeInsight();\n const dismissInsight = useDismissInsight();\n const resolveInsight = useResolveInsight();\n\n const [createOpen, setCreateOpen] = useState(false);\n const [form, setForm] = useState<ProposalFormState>(EMPTY_PROPOSAL_FORM);\n const [tradesError, setTradesError] = useState<string | null>(null);\n const [detailProposal, setDetailProposal] = useState<BraRebalanceProposal | null>(null);\n const [confirmTransition, setConfirmTransition] = useState<{\n proposal: BraRebalanceProposal;\n status: BraRebalanceStatus;\n } | null>(null);\n\n // Portfolio lookup for names + drift thresholds (real backend data).\n const portfolioById = useMemo(() => {\n const map = new Map<string, BraPortfolio>();\n for (const p of portfolios) map.set(p.id, p);\n return map;\n }, [portfolios]);\n\n const riskInsights = useMemo(\n () => insights.filter((i) => RISK_INSIGHT_TYPE_SET.has(i.type)),\n [insights]\n );\n\n const activeProposals = proposals.filter(\n (p) => p.status === 'DRAFT' || p.status === 'PROPOSED' || p.status === 'APPROVED'\n );\n const openInsights = riskInsights.filter((i) => i.status === 'OPEN');\n const avgDrift =\n proposals.length > 0\n ? proposals.reduce((sum, p) => sum + (p.driftPct ?? 0), 0) / proposals.length\n : null;\n\n // Breach count drives the drift tile's tone (real: drift ≥ portfolio threshold).\n const breachedCount = useMemo(\n () =>\n proposals.filter((p) => {\n const threshold = portfolioById.get(p.portfolioId)?.driftThresholdPct;\n return threshold != null && Number.isFinite(threshold) && p.driftPct >= threshold;\n }).length,\n [proposals, portfolioById]\n );\n\n // Real drift series (chronological) — decorative sparkline on the drift KPI.\n const driftSeries = useMemo(\n () =>\n [...proposals]\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map((p) => p.driftPct)\n .filter((n) => Number.isFinite(n)),\n [proposals]\n );\n\n // Proposal pipeline distribution (real counts by lifecycle status).\n const statusDonut = useMemo<DonutDatum[]>(() => {\n const counts = new Map<BraRebalanceStatus, number>();\n for (const p of proposals) counts.set(p.status, (counts.get(p.status) ?? 0) + 1);\n return STATUS_ORDER.filter((s) => (counts.get(s) ?? 0) > 0).map((s) => ({\n label: humanize(s),\n value: counts.get(s) ?? 0,\n tone: STATUS_TONE[s],\n }));\n }, [proposals]);\n\n // Open risk-signal distribution (real counts by severity).\n const severityDonut = useMemo<DonutDatum[]>(() => {\n const counts = new Map<BraInsightSeverity, number>();\n for (const i of openInsights) counts.set(i.severity, (counts.get(i.severity) ?? 0) + 1);\n return SEVERITY_ORDER.filter((s) => (counts.get(s) ?? 0) > 0).map((s) => ({\n label: humanize(s),\n value: counts.get(s) ?? 0,\n tone: SEVERITY_TONE[s],\n }));\n }, [openInsights]);\n\n const canCreate = portfolios.length > 0;\n\n function openCreate() {\n setForm(EMPTY_PROPOSAL_FORM);\n setTradesError(null);\n setCreateOpen(true);\n }\n\n function submitCreate() {\n if (!form.portfolioId) return;\n let trades: unknown;\n if (form.trades.trim() !== '') {\n try {\n trades = JSON.parse(form.trades);\n } catch {\n setTradesError('Trades must be valid JSON.');\n return;\n }\n }\n const portfolio = portfolioById.get(form.portfolioId);\n createProposal.mutate(\n {\n portfolioId: form.portfolioId,\n householdId: portfolio?.householdId ?? null,\n driftPct: parseNum(form.driftPct),\n rationale: form.rationale.trim() || null,\n ...(trades !== undefined ? { trades } : {}),\n },\n { onSuccess: () => setCreateOpen(false) }\n );\n }\n\n /** Destructive transitions (reject/cancel) confirm first; forward transitions fire directly. */\n function requestTransition(proposal: BraRebalanceProposal, status: BraRebalanceStatus) {\n if (status === 'REJECTED' || status === 'CANCELLED') {\n setConfirmTransition({ proposal, status });\n return;\n }\n transitionProposal.mutate({ id: proposal.id, status });\n }\n\n /** Drift is a breach when it meets/exceeds the portfolio's configured threshold. */\n function driftBreached(p: BraRebalanceProposal): boolean {\n const threshold = portfolioById.get(p.portfolioId)?.driftThresholdPct;\n return threshold != null && Number.isFinite(threshold) && p.driftPct >= threshold;\n }\n\n return (\n <SectionShell\n title=\"Risk & Rebalancing\"\n description=\"Review drift-driven rebalance proposals and act on portfolio risk insights.\"\n badges={[\n `${activeProposals.length} active`,\n `${openInsights.length} open insight${openInsights.length === 1 ? '' : 's'}`,\n ]}\n actionLabel=\"New proposal\"\n onAction={openCreate}\n >\n {/* Premium KPI row */}\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <FadeIn index={0}>\n <StatTile\n label=\"Average drift\"\n value={avgDrift === null ? '—' : formatPct(avgDrift)}\n spark={driftSeries.length > 1 ? driftSeries : undefined}\n sparkTone={breachedCount > 0 ? 'error' : 'brand'}\n glow\n icon={<Gauge className=\"size-4\" aria-hidden=\"true\" />}\n />\n </FadeIn>\n <FadeIn index={1}>\n <StatTile\n label=\"Active proposals\"\n value={String(activeProposals.length)}\n icon={<Activity className=\"size-4\" aria-hidden=\"true\" />}\n />\n </FadeIn>\n <FadeIn index={2}>\n <StatTile\n label=\"Total proposals\"\n value={String(proposals.length)}\n icon={<Layers className=\"size-4\" aria-hidden=\"true\" />}\n />\n </FadeIn>\n <FadeIn index={3}>\n <StatTile\n label=\"Open risk insights\"\n value={String(openInsights.length)}\n deltaTone={openInsights.length > 0 ? 'negative' : 'neutral'}\n icon={<ShieldAlert className=\"size-4\" aria-hidden=\"true\" />}\n />\n </FadeIn>\n </div>\n\n {/* Hero band — pipeline + risk-signal distribution donuts */}\n {(statusDonut.length > 0 || severityDonut.length > 0) && !proposalsLoading ? (\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <FadeIn index={0}>\n <GlassCard glow className=\"h-full\">\n <div className=\"mb-3 flex items-center gap-2\">\n <TrendingUp className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n <h2 className=\"text-sm font-semibold text-text-primary\">Proposal pipeline</h2>\n </div>\n <DonutChart\n data={statusDonut}\n centerValue={String(proposals.length)}\n centerLabel=\"proposals\"\n height={200}\n />\n </GlassCard>\n </FadeIn>\n <FadeIn index={1}>\n <GlassCard className=\"h-full\">\n <div className=\"mb-3 flex items-center gap-2\">\n <ShieldAlert className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n <h2 className=\"text-sm font-semibold text-text-primary\">Open risk signals</h2>\n </div>\n {severityDonut.length > 0 ? (\n <DonutChart\n data={severityDonut}\n centerValue={String(openInsights.length)}\n centerLabel=\"open\"\n height={200}\n />\n ) : (\n <div className=\"flex h-[200px] flex-col items-center justify-center gap-2 text-center\">\n <ShieldCheck className=\"size-8 text-status-success-text\" aria-hidden=\"true\" />\n <p className=\"text-sm text-text-secondary\">No open risk signals.</p>\n </div>\n )}\n </GlassCard>\n </FadeIn>\n </div>\n ) : null}\n\n {/* Rebalance proposals */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Scale className=\"h-5 w-5\" aria-hidden=\"true\" />\n Rebalance proposals\n </CardTitle>\n <CardDescription>\n Drift against target allocation, with lifecycle actions per proposal.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {proposalsLoading ? (\n <LoadingState />\n ) : proposalsError ? (\n <ErrorState onRetry={() => refetchProposals()} />\n ) : proposals.length === 0 ? (\n <EmptyState\n icon={<Scale className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No rebalance proposals\"\n description={\n canCreate\n ? 'Create a proposal when a portfolio drifts from its target allocation.'\n : 'Create a portfolio first, then propose a rebalance when it drifts.'\n }\n action={\n canCreate ? (\n <Button size=\"sm\" onClick={openCreate}>\n <Plus className=\"size-4\" aria-hidden=\"true\" />\n New proposal\n </Button>\n ) : undefined\n }\n />\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Portfolio</TableHead>\n <TableHead className=\"text-right\">Drift</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Rationale</TableHead>\n <TableHead>Trades</TableHead>\n <TableHead>Created</TableHead>\n <TableHead className=\"w-12 text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {proposals.map((p) => {\n const portfolio = portfolioById.get(p.portfolioId);\n const breached = driftBreached(p);\n const nextStatuses = NEXT_STATUSES[p.status];\n const threshold = portfolio?.driftThresholdPct;\n const meterPct =\n threshold != null && threshold > 0\n ? Math.min(100, (p.driftPct / threshold) * 100)\n : null;\n return (\n <TableRow\n key={p.id}\n onClick={() => setDetailProposal(p)}\n className=\"cursor-pointer transition-colors motion-safe:hover:bg-bg-elevated\"\n >\n <TableCell>\n <p className=\"font-medium text-text-primary\">\n {portfolio?.name ?? 'Unknown portfolio'}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {portfolio?.baseCurrency ?? '—'}\n {threshold != null ? ` · threshold ${formatPct(threshold)}` : ''}\n </p>\n </TableCell>\n <TableCell className=\"text-right\">\n <span\n className={`inline-flex items-center justify-end gap-1 font-semibold tabular-nums ${\n breached ? 'text-status-error-text' : 'text-text-primary'\n }`}\n >\n {breached ? (\n <AlertTriangle className=\"size-4\" aria-hidden=\"true\" />\n ) : null}\n {formatPct(p.driftPct)}\n </span>\n {meterPct != null ? (\n <div\n className=\"ml-auto mt-1 h-1.5 w-24 overflow-hidden rounded-full bg-bg-sunken\"\n role=\"progressbar\"\n aria-valuenow={Math.round(meterPct)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Drift vs threshold for ${portfolio?.name ?? 'portfolio'}`}\n >\n <div\n className=\"h-full rounded-full\"\n style={{\n width: `${meterPct}%`,\n background: breached\n ? 'var(--color-status-error)'\n : 'var(--color-action-primary-bg)',\n }}\n />\n </div>\n ) : breached ? (\n <p className=\"text-xs text-status-error-text\">Over threshold</p>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant={statusBadgeVariant(p.status)}>{humanize(p.status)}</Badge>\n </TableCell>\n <TableCell className=\"max-w-xs\">\n <p className=\"truncate text-sm text-text-secondary\">\n {p.rationale ?? '—'}\n </p>\n </TableCell>\n <TableCell className=\"text-sm text-text-secondary\">\n {summarizeTrades(p.trades)}\n </TableCell>\n <TableCell className=\"text-sm text-text-secondary\">\n {formatDate(p.createdAt)}\n </TableCell>\n <TableCell className=\"text-right\" onClick={(e) => e.stopPropagation()}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Actions for ${portfolio?.name ?? 'proposal'}`}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setDetailProposal(p)}>\n <Eye className=\"size-4\" aria-hidden=\"true\" />\n View details\n </DropdownMenuItem>\n {nextStatuses.length > 0 ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Advance to</DropdownMenuLabel>\n {nextStatuses.map((status) => {\n const destructive =\n status === 'REJECTED' || status === 'CANCELLED';\n return (\n <DropdownMenuItem\n key={status}\n disabled={transitionProposal.isPending}\n className={\n destructive ? 'text-status-error-text' : undefined\n }\n onClick={() => requestTransition(p, status)}\n >\n {destructive ? (\n <X className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <ArrowRight className=\"size-4\" aria-hidden=\"true\" />\n )}\n {humanize(status)}\n </DropdownMenuItem>\n );\n })}\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Risk insights */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <ShieldAlert className=\"h-5 w-5\" aria-hidden=\"true\" />\n Risk insights\n </CardTitle>\n <CardDescription>\n Drift, concentration, cash-drag and fee-anomaly signals detected across your portfolios.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {insightsLoading ? (\n <LoadingState />\n ) : insightsError ? (\n <ErrorState onRetry={() => refetchInsights()} />\n ) : riskInsights.length === 0 ? (\n <EmptyState\n icon={<ShieldCheck className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No risk insights\"\n description=\"No drift, concentration, cash-drag or fee-anomaly signals are open right now.\"\n />\n ) : (\n <div className=\"space-y-3\">\n {riskInsights.map((insight, i) => (\n <FadeIn key={insight.id} index={i}>\n <InsightRow\n insight={insight}\n onAcknowledge={() => acknowledgeInsight.mutate(insight.id)}\n onResolve={() => resolveInsight.mutate(insight.id)}\n onDismiss={() => dismissInsight.mutate(insight.id)}\n actionPending={\n acknowledgeInsight.isPending ||\n resolveInsight.isPending ||\n dismissInsight.isPending\n }\n />\n </FadeIn>\n ))}\n <LoadMore\n hasMore={insightsHasMore}\n onClick={loadMoreInsights}\n loading={insightsFetchingMore}\n label=\"Load more insights\"\n />\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Create proposal dialog */}\n <Dialog open={createOpen} onOpenChange={setCreateOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New rebalance proposal</DialogTitle>\n <DialogDescription>\n Propose a rebalance for a portfolio that has drifted from its target allocation.\n </DialogDescription>\n </DialogHeader>\n {!canCreate ? (\n <EmptyState\n icon={<Scale className=\"size-6\" aria-hidden=\"true\" />}\n title=\"Create a portfolio first\"\n description=\"A rebalance proposal targets a portfolio. Add a portfolio on the Portfolios page, then return here to propose a rebalance.\"\n />\n ) : (\n <div className=\"grid gap-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"prop-portfolio\">\n Portfolio <span className=\"text-status-error-text\">*</span>\n </Label>\n <Select\n value={form.portfolioId}\n onValueChange={(v) => setForm((f) => ({ ...f, portfolioId: v }))}\n >\n <SelectTrigger id=\"prop-portfolio\">\n <SelectValue placeholder=\"Select a portfolio\" />\n </SelectTrigger>\n <SelectContent>\n {portfolios.map((p) => (\n <SelectItem key={p.id} value={p.id}>\n {p.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"prop-drift\">Drift %</Label>\n <Input\n id=\"prop-drift\"\n type=\"number\"\n value={form.driftPct}\n onChange={(e) => setForm((f) => ({ ...f, driftPct: e.target.value }))}\n placeholder=\"e.g. 6.5\"\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"prop-rationale\">Rationale</Label>\n <Textarea\n id=\"prop-rationale\"\n value={form.rationale}\n onChange={(e) => setForm((f) => ({ ...f, rationale: e.target.value }))}\n placeholder=\"Why is this rebalance needed?\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"prop-trades\">Trades (JSON, optional)</Label>\n <Textarea\n id=\"prop-trades\"\n className=\"font-mono text-xs\"\n value={form.trades}\n onChange={(e) => {\n setTradesError(null);\n setForm((f) => ({ ...f, trades: e.target.value }));\n }}\n placeholder='e.g. [{\"symbol\":\"VOO\",\"action\":\"SELL\",\"quantity\":10}]'\n />\n {tradesError ? (\n <p className=\"text-xs text-status-error-text\">{tradesError}</p>\n ) : null}\n </div>\n </div>\n )}\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\">Cancel</Button>\n </DialogClose>\n <Button onClick={submitCreate} disabled={!form.portfolioId || createProposal.isPending}>\n {createProposal.isPending ? 'Creating…' : 'Create proposal'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Proposal detail — lifecycle, proposed trades, risk insights + discussion */}\n {(() => {\n // Re-read from the live list so the stepper/status reflect transitions.\n const live = detailProposal\n ? (proposals.find((p) => p.id === detailProposal.id) ?? detailProposal)\n : null;\n const related = live ? insights.filter((i) => i.subjectId === live.portfolioId) : [];\n return (\n <ProposalDetailDialog\n proposal={live}\n portfolio={live ? (portfolioById.get(live.portfolioId) ?? null) : null}\n relatedInsights={related}\n nextStatuses={live ? NEXT_STATUSES[live.status] : []}\n transitionPending={transitionProposal.isPending}\n onTransition={(status) => {\n if (live) requestTransition(live, status);\n }}\n onOpenChange={(open) => {\n if (!open) setDetailProposal(null);\n }}\n />\n );\n })()}\n\n {/* Confirm destructive lifecycle transition (reject / cancel) */}\n <ConfirmDialog\n open={confirmTransition !== null}\n onOpenChange={(open) => {\n if (!open) setConfirmTransition(null);\n }}\n title={\n confirmTransition?.status === 'REJECTED'\n ? 'Reject this proposal?'\n : 'Cancel this proposal?'\n }\n description={\n confirmTransition\n ? `This moves the rebalance proposal for ${\n portfolioById.get(confirmTransition.proposal.portfolioId)?.name ?? 'this portfolio'\n } to ${humanize(confirmTransition.status)}. This cannot be undone.`\n : undefined\n }\n confirmLabel={confirmTransition?.status === 'REJECTED' ? 'Reject' : 'Cancel proposal'}\n cancelLabel=\"Keep\"\n destructive\n pending={transitionProposal.isPending}\n onConfirm={() => {\n if (!confirmTransition) return;\n transitionProposal.mutate(\n { id: confirmTransition.proposal.id, status: confirmTransition.status },\n { onSuccess: () => setConfirmTransition(null) }\n );\n }}\n />\n </SectionShell>\n );\n}\n\n// ============================================================================\n// Proposal detail dialog — rationale summary, actors, and discussion thread\n// ============================================================================\n\nfunction ProposalDetailDialog({\n proposal,\n portfolio,\n relatedInsights,\n nextStatuses,\n transitionPending,\n onTransition,\n onOpenChange,\n}: {\n proposal: BraRebalanceProposal | null;\n portfolio: BraPortfolio | null;\n relatedInsights: BraInsight[];\n nextStatuses: BraRebalanceStatus[];\n transitionPending: boolean;\n onTransition: (status: BraRebalanceStatus) => void;\n onOpenChange: (open: boolean) => void;\n}) {\n const trades = proposal ? parseTrades(proposal.trades) : null;\n const breached =\n proposal != null &&\n portfolio?.driftThresholdPct != null &&\n Number.isFinite(portfolio.driftThresholdPct) &&\n proposal.driftPct >= portfolio.driftThresholdPct;\n\n return (\n <Dialog open={proposal !== null} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-h-[88vh] max-w-3xl overflow-y-auto\">\n {proposal ? (\n <>\n <DialogHeader>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Detail\n </p>\n <DialogTitle className=\"flex flex-wrap items-center gap-2 text-xl\">\n {portfolio?.name ?? 'Rebalance proposal'}\n <span className=\"text-text-secondary\">— Rebalance proposal</span>\n <Badge variant={statusBadgeVariant(proposal.status)}>\n {humanize(proposal.status)}\n </Badge>\n </DialogTitle>\n <DialogDescription>\n Created {formatDate(proposal.createdAt)}\n {proposal.executedAt ? ` · executed ${formatDate(proposal.executedAt)}` : ''}\n </DialogDescription>\n </DialogHeader>\n\n {/* Lifecycle stepper — DRAFT → PROPOSED → APPROVED → EXECUTED (+ side states). */}\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <LifecycleStepper steps={LIFECYCLE_STEPS} current={humanize(proposal.status)} />\n </div>\n\n {/* Key facts as premium tiles */}\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <StatTile\n label=\"Drift\"\n value={formatPct(proposal.driftPct)}\n deltaTone={breached ? 'negative' : 'neutral'}\n glow={breached}\n icon={<Gauge className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label=\"Threshold\"\n value={\n portfolio?.driftThresholdPct != null\n ? formatPct(portfolio.driftThresholdPct)\n : '—'\n }\n />\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-xs text-text-secondary\">Proposed by</p>\n <p className=\"mt-1 truncate text-sm font-medium text-text-primary\">\n {proposal.proposedById ? <ActorName id={proposal.proposedById} /> : '—'}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-xs text-text-secondary\">Approved by</p>\n <p className=\"mt-1 truncate text-sm font-medium text-text-primary\">\n {proposal.approvedById ? <ActorName id={proposal.approvedById} /> : '—'}\n </p>\n </div>\n </div>\n\n {/* Proposed trades */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Proposed trades</h3>\n {trades && trades.length > 0 ? (\n <div className=\"overflow-x-auto rounded-lg border border-border-subtle\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Action</TableHead>\n <TableHead>Symbol</TableHead>\n <TableHead className=\"text-right\">Quantity</TableHead>\n <TableHead className=\"text-right\">Est. value</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {trades.map((t, i) => (\n <TableRow key={i}>\n <TableCell className={`font-semibold ${tradeActionTone(t.action)}`}>\n {t.action ? t.action.toUpperCase() : '—'}\n </TableCell>\n <TableCell className=\"font-medium text-text-primary\">\n {t.symbol ?? '—'}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-secondary\">\n {t.quantity != null ? t.quantity.toLocaleString() : '—'}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-secondary\">\n {t.value != null\n ? formatMoney(t.value, portfolio?.baseCurrency ?? 'USD')\n : '—'}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {summarizeTrades(proposal.trades)} — no structured trade breakdown available.\n </p>\n )}\n </div>\n\n {/* Rationale */}\n <div className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Rationale</h3>\n <p className=\"text-sm text-text-secondary\">{proposal.rationale ?? '—'}</p>\n </div>\n\n {/* Lifecycle actions (mirrors the row menu; destructive actions confirm) */}\n {nextStatuses.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {nextStatuses.map((status) => {\n const destructive = status === 'REJECTED' || status === 'CANCELLED';\n return (\n <Button\n key={status}\n variant={destructive ? 'outline' : 'default'}\n size=\"sm\"\n disabled={transitionPending}\n className={destructive ? 'text-status-error-text' : undefined}\n onClick={() => onTransition(status)}\n >\n {destructive ? (\n <X className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <ArrowRight className=\"size-4\" aria-hidden=\"true\" />\n )}\n {humanize(status)}\n </Button>\n );\n })}\n </div>\n ) : null}\n\n {/* Risk insights tied to this portfolio (real, filtered by subjectId) */}\n {relatedInsights.length > 0 ? (\n <div className=\"space-y-2 border-t border-border-subtle pt-4\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <ShieldAlert className=\"size-4\" aria-hidden=\"true\" />\n Risk insights\n </h3>\n <ul className=\"space-y-2\">\n {relatedInsights.map((insight) => (\n <li\n key={insight.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-text-primary\">\n {insight.title}\n </span>\n <Badge variant={statusBadgeVariant(insight.severity)}>\n {humanize(insight.severity)}\n </Badge>\n <Badge variant=\"outline\">{humanize(insight.type)}</Badge>\n <Badge variant={statusBadgeVariant(insight.status)}>\n {humanize(insight.status)}\n </Badge>\n </div>\n {insight.detail ? (\n <p className=\"mt-1 text-xs text-text-secondary\">{insight.detail}</p>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n <div className=\"border-t border-border-subtle pt-4\">\n <CommentThread\n entityType=\"brainyrich-rebalance\"\n entityId={proposal.id}\n heading=\"Discussion\"\n />\n </div>\n </>\n ) : null}\n </DialogContent>\n </Dialog>\n );\n}\n\n// ============================================================================\n// Insight row\n// ============================================================================\n\nfunction InsightRow({\n insight,\n onAcknowledge,\n onResolve,\n onDismiss,\n actionPending,\n}: {\n insight: BraInsight;\n onAcknowledge: () => void;\n onResolve: () => void;\n onDismiss: () => void;\n actionPending: boolean;\n}) {\n const terminal = insight.status === 'RESOLVED' || insight.status === 'DISMISSED';\n return (\n <div className=\"flex items-start justify-between gap-4 rounded-lg border border-border-subtle bg-bg-surface p-4 transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]\">\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"font-medium text-text-primary\">{insight.title}</p>\n <Badge variant={statusBadgeVariant(insight.severity)}>{humanize(insight.severity)}</Badge>\n <Badge variant=\"outline\">{humanize(insight.type)}</Badge>\n <Badge variant={statusBadgeVariant(insight.status)}>{humanize(insight.status)}</Badge>\n </div>\n {insight.detail ? <p className=\"text-sm text-text-secondary\">{insight.detail}</p> : null}\n <p className=\"text-xs text-text-muted\">Detected {formatDate(insight.createdAt)}</p>\n </div>\n {terminal ? (\n <span className=\"mt-1 text-xs text-text-muted\">Closed</span>\n ) : (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Actions for ${insight.title}`}\n disabled={actionPending}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {insight.status === 'OPEN' ? (\n <DropdownMenuItem onClick={onAcknowledge}>\n <Check className=\"size-4\" aria-hidden=\"true\" />\n Acknowledge\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem onClick={onResolve}>\n <ShieldCheck className=\"size-4\" aria-hidden=\"true\" />\n Resolve\n </DropdownMenuItem>\n <DropdownMenuItem className=\"text-status-error-text\" onClick={onDismiss}>\n <X className=\"size-4\" aria-hidden=\"true\" />\n Dismiss\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,17 +1,17 @@
1
- import { motion as e } from "../../node_modules/framer-motion/dist/es/render/components/motion/proxy.js";
2
- import { useReducedMotion as t } from "../../node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js";
3
- import { Inbox as n, RefreshCw as r, TriangleAlert as i } from "lucide-react";
4
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
- import { Badge as s, Button as c, Skeleton as l } from "@burdenoff/fe-libs/ui";
1
+ import { useReducedMotion as e } from "../components/viz.js";
2
+ import { useEffect as t, useState as n } from "react";
3
+ import { Inbox as r, RefreshCw as i, TriangleAlert as a } from "lucide-react";
4
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
+ import { Badge as c, Button as l, Skeleton as u } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/brainyrich/pages/_shared.tsx
7
- function u(e, t = "USD") {
7
+ function d(e, t = "USD") {
8
8
  return Number.isFinite(e) ? new Intl.NumberFormat("en-US", {
9
9
  style: "currency",
10
10
  currency: t,
11
11
  maximumFractionDigits: 0
12
12
  }).format(e) : "—";
13
13
  }
14
- function d(e, t) {
14
+ function f(e, t) {
15
15
  return Number.isFinite(e) ? new Intl.NumberFormat("en-US", {
16
16
  notation: "compact",
17
17
  maximumFractionDigits: 1,
@@ -21,10 +21,10 @@ function d(e, t) {
21
21
  } : {}
22
22
  }).format(e) : "—";
23
23
  }
24
- function f(e, t = 1) {
24
+ function p(e, t = 1) {
25
25
  return e == null || !Number.isFinite(e) ? "—" : `${e.toFixed(t)}%`;
26
26
  }
27
- function p(e) {
27
+ function m(e) {
28
28
  if (!e) return "—";
29
29
  let t = new Date(e);
30
30
  return Number.isNaN(t.getTime()) ? "—" : new Intl.DateTimeFormat("en-US", {
@@ -33,7 +33,7 @@ function p(e) {
33
33
  day: "numeric"
34
34
  }).format(t);
35
35
  }
36
- function m(e) {
36
+ function h(e) {
37
37
  let t = e.toUpperCase();
38
38
  return [
39
39
  "ACTIVE",
@@ -62,29 +62,29 @@ function m(e) {
62
62
  "LOW"
63
63
  ].includes(t) ? "secondary" : "outline";
64
64
  }
65
- function h(e) {
65
+ function g(e) {
66
66
  return e > 0 ? "text-status-success-text" : e < 0 ? "text-status-error-text" : "text-text-secondary";
67
67
  }
68
- function g({ title: e, description: t, actionLabel: n, onAction: r, actions: i, badges: l = [], children: u }) {
69
- return /* @__PURE__ */ o("div", {
68
+ function _({ title: e, description: t, actionLabel: n, onAction: r, actions: i, badges: a = [], children: u }) {
69
+ return /* @__PURE__ */ s("div", {
70
70
  className: "space-y-6 p-6",
71
- children: [/* @__PURE__ */ o("div", {
71
+ children: [/* @__PURE__ */ s("div", {
72
72
  className: "flex flex-col gap-4 md:flex-row md:items-start md:justify-between",
73
- children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
73
+ children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
74
74
  className: "text-2xl font-semibold text-text-primary",
75
75
  children: e
76
- }), /* @__PURE__ */ a("p", {
76
+ }), /* @__PURE__ */ o("p", {
77
77
  className: "text-sm text-text-secondary",
78
78
  children: t
79
- })] }), /* @__PURE__ */ o("div", {
79
+ })] }), /* @__PURE__ */ s("div", {
80
80
  className: "flex items-center gap-2",
81
81
  children: [
82
- l.map((e) => /* @__PURE__ */ a(s, {
82
+ a.map((e) => /* @__PURE__ */ o(c, {
83
83
  variant: "secondary",
84
84
  children: e
85
85
  }, e)),
86
86
  i,
87
- n ? /* @__PURE__ */ a(c, {
87
+ n ? /* @__PURE__ */ o(l, {
88
88
  size: "sm",
89
89
  onClick: r,
90
90
  children: n
@@ -94,123 +94,131 @@ function g({ title: e, description: t, actionLabel: n, onAction: r, actions: i,
94
94
  }), u]
95
95
  });
96
96
  }
97
- var _ = {
97
+ var v = {
98
98
  default: "bg-primary",
99
99
  positive: "bg-status-success-bg",
100
100
  negative: "bg-status-error-bg",
101
101
  warning: "bg-status-warning-bg",
102
102
  accent: "bg-accent-teal"
103
103
  };
104
- function v({ data: n }) {
105
- let r = t(), i = n.filter((e) => Number.isFinite(e.value));
106
- return i.length === 0 ? /* @__PURE__ */ a("p", {
104
+ function y({ width: r, className: i }) {
105
+ let a = e(), [s, c] = n(a ? r : 0);
106
+ return t(() => {
107
+ let e = requestAnimationFrame(() => c(r));
108
+ return () => cancelAnimationFrame(e);
109
+ }, [r]), /* @__PURE__ */ o("div", {
110
+ className: i,
111
+ style: {
112
+ width: `${s}%`,
113
+ transition: a ? "none" : "width 500ms ease"
114
+ }
115
+ });
116
+ }
117
+ function b({ data: e }) {
118
+ let t = e.filter((e) => Number.isFinite(e.value));
119
+ return t.length === 0 ? /* @__PURE__ */ o("p", {
107
120
  className: "text-sm text-text-secondary",
108
121
  children: "No allocation data."
109
- }) : /* @__PURE__ */ a("div", {
122
+ }) : /* @__PURE__ */ o("div", {
110
123
  className: "space-y-3.5",
111
- children: i.map((t) => {
112
- let n = Math.max(0, Math.min(100, t.value));
113
- return /* @__PURE__ */ o("div", {
124
+ children: t.map((e) => {
125
+ let t = Math.max(0, Math.min(100, e.value));
126
+ return /* @__PURE__ */ s("div", {
114
127
  className: "space-y-1.5",
115
- children: [/* @__PURE__ */ o("div", {
128
+ children: [/* @__PURE__ */ s("div", {
116
129
  className: "flex items-center justify-between text-xs",
117
- children: [/* @__PURE__ */ a("span", {
130
+ children: [/* @__PURE__ */ o("span", {
118
131
  className: "font-medium text-text-primary",
119
- children: t.label
120
- }), /* @__PURE__ */ a("span", {
132
+ children: e.label
133
+ }), /* @__PURE__ */ o("span", {
121
134
  className: "tabular-nums text-text-secondary",
122
- children: t.caption ?? f(t.value)
135
+ children: e.caption ?? p(e.value)
123
136
  })]
124
- }), /* @__PURE__ */ a("div", {
137
+ }), /* @__PURE__ */ o("div", {
125
138
  className: "h-2.5 w-full overflow-hidden rounded-full bg-bg-sunken",
126
139
  role: "progressbar",
127
- "aria-valuenow": Math.round(n),
140
+ "aria-valuenow": Math.round(t),
128
141
  "aria-valuemin": 0,
129
142
  "aria-valuemax": 100,
130
- "aria-label": t.label,
131
- children: /* @__PURE__ */ a(e.div, {
132
- className: `h-full rounded-full ${_[t.tone ?? "default"]}`,
133
- initial: r ? !1 : { width: 0 },
134
- animate: { width: `${n}%` },
135
- transition: {
136
- duration: .4,
137
- ease: "easeOut"
138
- }
143
+ "aria-label": e.label,
144
+ children: /* @__PURE__ */ o(y, {
145
+ width: t,
146
+ className: `h-full rounded-full ${v[e.tone ?? "default"]}`
139
147
  })
140
148
  })]
141
- }, t.label);
149
+ }, e.label);
142
150
  })
143
151
  });
144
152
  }
145
- function y({ icon: e, title: t, description: r, action: i }) {
146
- return /* @__PURE__ */ o("div", {
153
+ function x({ icon: e, title: t, description: n, action: i }) {
154
+ return /* @__PURE__ */ s("div", {
147
155
  className: "flex flex-col items-center justify-center rounded-lg border border-dashed border-border-subtle bg-bg-surface px-6 py-12 text-center",
148
156
  children: [
149
- /* @__PURE__ */ a("div", {
157
+ /* @__PURE__ */ o("div", {
150
158
  className: "mb-4 flex size-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary",
151
- children: e ?? /* @__PURE__ */ a(n, {
159
+ children: e ?? /* @__PURE__ */ o(r, {
152
160
  className: "size-6",
153
161
  "aria-hidden": "true"
154
162
  })
155
163
  }),
156
- /* @__PURE__ */ a("h3", {
164
+ /* @__PURE__ */ o("h3", {
157
165
  className: "text-base font-semibold text-text-primary",
158
166
  children: t
159
167
  }),
160
- r ? /* @__PURE__ */ a("p", {
168
+ n ? /* @__PURE__ */ o("p", {
161
169
  className: "mt-1 max-w-md text-sm text-text-secondary",
162
- children: r
170
+ children: n
163
171
  }) : null,
164
- i ? /* @__PURE__ */ a("div", {
172
+ i ? /* @__PURE__ */ o("div", {
165
173
  className: "mt-4",
166
174
  children: i
167
175
  }) : null
168
176
  ]
169
177
  });
170
178
  }
171
- function b({ rows: e = 4 }) {
172
- return /* @__PURE__ */ a("div", {
179
+ function S({ rows: e = 4 }) {
180
+ return /* @__PURE__ */ o("div", {
173
181
  className: "space-y-3",
174
182
  "aria-busy": "true",
175
183
  "aria-live": "polite",
176
- children: Array.from({ length: e }).map((e, t) => /* @__PURE__ */ o("div", {
184
+ children: Array.from({ length: e }).map((e, t) => /* @__PURE__ */ s("div", {
177
185
  className: "flex items-center gap-4 rounded-lg border border-border-subtle bg-bg-surface p-4",
178
186
  children: [
179
- /* @__PURE__ */ a(l, { className: "size-10 rounded-full" }),
180
- /* @__PURE__ */ o("div", {
187
+ /* @__PURE__ */ o(u, { className: "size-10 rounded-full" }),
188
+ /* @__PURE__ */ s("div", {
181
189
  className: "flex-1 space-y-2",
182
- children: [/* @__PURE__ */ a(l, { className: "h-4 w-1/3" }), /* @__PURE__ */ a(l, { className: "h-3 w-1/2" })]
190
+ children: [/* @__PURE__ */ o(u, { className: "h-4 w-1/3" }), /* @__PURE__ */ o(u, { className: "h-3 w-1/2" })]
183
191
  }),
184
- /* @__PURE__ */ a(l, { className: "h-4 w-16" })
192
+ /* @__PURE__ */ o(u, { className: "h-4 w-16" })
185
193
  ]
186
194
  }, t))
187
195
  });
188
196
  }
189
- function x({ title: e = "Something went wrong", description: t = "We could not load this data. Please try again.", onRetry: n }) {
190
- return /* @__PURE__ */ o("div", {
197
+ function C({ title: e = "Something went wrong", description: t = "We could not load this data. Please try again.", onRetry: n }) {
198
+ return /* @__PURE__ */ s("div", {
191
199
  className: "flex flex-col items-center justify-center rounded-lg border border-status-error-text/40 bg-status-error-bg px-6 py-12 text-center",
192
200
  children: [
193
- /* @__PURE__ */ a("div", {
201
+ /* @__PURE__ */ o("div", {
194
202
  className: "mb-4 flex size-12 items-center justify-center rounded-full bg-bg-surface text-status-error-text",
195
- children: /* @__PURE__ */ a(i, {
203
+ children: /* @__PURE__ */ o(a, {
196
204
  className: "size-6",
197
205
  "aria-hidden": "true"
198
206
  })
199
207
  }),
200
- /* @__PURE__ */ a("h3", {
208
+ /* @__PURE__ */ o("h3", {
201
209
  className: "text-base font-semibold text-text-primary",
202
210
  children: e
203
211
  }),
204
- /* @__PURE__ */ a("p", {
212
+ /* @__PURE__ */ o("p", {
205
213
  className: "mt-1 max-w-md text-sm text-text-secondary",
206
214
  children: t
207
215
  }),
208
- n ? /* @__PURE__ */ o(c, {
216
+ n ? /* @__PURE__ */ s(l, {
209
217
  variant: "outline",
210
218
  size: "sm",
211
219
  className: "mt-4",
212
220
  onClick: n,
213
- children: [/* @__PURE__ */ a(r, {
221
+ children: [/* @__PURE__ */ o(i, {
214
222
  className: "size-4",
215
223
  "aria-hidden": "true"
216
224
  }), "Retry"]
@@ -219,6 +227,6 @@ function x({ title: e = "Something went wrong", description: t = "We could not l
219
227
  });
220
228
  }
221
229
  //#endregion
222
- export { v as AllocationBars, y as EmptyState, x as ErrorState, b as LoadingState, g as SectionShell, h as deltaToneClass, d as formatCompact, p as formatDate, u as formatMoney, f as formatPct, m as statusBadgeVariant };
230
+ export { b as AllocationBars, x as EmptyState, C as ErrorState, S as LoadingState, _ as SectionShell, g as deltaToneClass, f as formatCompact, m as formatDate, d as formatMoney, p as formatPct, h as statusBadgeVariant };
223
231
 
224
232
  //# sourceMappingURL=_shared.js.map