@burdenoff/microfe-brainyrich 2026.706.3 → 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 (534) 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/_shared.js +76 -68
  5. package/dist/brainyrich/pages/_shared.js.map +1 -1
  6. package/package.json +1 -3
  7. package/dist/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js +0 -13
  8. package/dist/node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js.map +0 -1
  9. package/dist/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js +0 -14
  10. package/dist/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js.map +0 -1
  11. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.js +0 -22
  12. package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/use-presence.js.map +0 -1
  13. package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.js +0 -8
  14. package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.js.map +0 -1
  15. package/dist/node_modules/framer-motion/dist/es/context/LazyContext.js +0 -8
  16. package/dist/node_modules/framer-motion/dist/es/context/LazyContext.js.map +0 -1
  17. package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.js +0 -12
  18. package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.js.map +0 -1
  19. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/create.js +0 -19
  20. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/create.js.map +0 -1
  21. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/index.js +0 -8
  22. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/index.js.map +0 -1
  23. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/utils.js +0 -17
  24. package/dist/node_modules/framer-motion/dist/es/context/MotionContext/utils.js.map +0 -1
  25. package/dist/node_modules/framer-motion/dist/es/context/PresenceContext.js +0 -8
  26. package/dist/node_modules/framer-motion/dist/es/context/PresenceContext.js.map +0 -1
  27. package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.js +0 -8
  28. package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.js.map +0 -1
  29. package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.js +0 -10
  30. package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.js.map +0 -1
  31. package/dist/node_modules/framer-motion/dist/es/events/event-info.js +0 -13
  32. package/dist/node_modules/framer-motion/dist/es/events/event-info.js.map +0 -1
  33. package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.js +0 -259
  34. package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.js.map +0 -1
  35. package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.js +0 -24
  36. package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.js.map +0 -1
  37. package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.js +0 -61
  38. package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.js.map +0 -1
  39. package/dist/node_modules/framer-motion/dist/es/gestures/focus.js +0 -29
  40. package/dist/node_modules/framer-motion/dist/es/gestures/focus.js.map +0 -1
  41. package/dist/node_modules/framer-motion/dist/es/gestures/hover.js +0 -22
  42. package/dist/node_modules/framer-motion/dist/es/gestures/hover.js.map +0 -1
  43. package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.js +0 -135
  44. package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.js.map +0 -1
  45. package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.js +0 -44
  46. package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.js.map +0 -1
  47. package/dist/node_modules/framer-motion/dist/es/gestures/press.js +0 -28
  48. package/dist/node_modules/framer-motion/dist/es/gestures/press.js.map +0 -1
  49. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.js +0 -41
  50. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.js.map +0 -1
  51. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.js +0 -27
  52. package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.js.map +0 -1
  53. package/dist/node_modules/framer-motion/dist/es/motion/features/animations.js +0 -11
  54. package/dist/node_modules/framer-motion/dist/es/motion/features/animations.js.map +0 -1
  55. package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.js +0 -53
  56. package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.js.map +0 -1
  57. package/dist/node_modules/framer-motion/dist/es/motion/features/drag.js +0 -17
  58. package/dist/node_modules/framer-motion/dist/es/motion/features/drag.js.map +0 -1
  59. package/dist/node_modules/framer-motion/dist/es/motion/features/gestures.js +0 -15
  60. package/dist/node_modules/framer-motion/dist/es/motion/features/gestures.js.map +0 -1
  61. package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.js +0 -63
  62. package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.js.map +0 -1
  63. package/dist/node_modules/framer-motion/dist/es/motion/features/layout.js +0 -11
  64. package/dist/node_modules/framer-motion/dist/es/motion/features/layout.js.map +0 -1
  65. package/dist/node_modules/framer-motion/dist/es/motion/features/load-features.js +0 -15
  66. package/dist/node_modules/framer-motion/dist/es/motion/features/load-features.js.map +0 -1
  67. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/index.js +0 -48
  68. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/index.js.map +0 -1
  69. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/observers.js +0 -26
  70. package/dist/node_modules/framer-motion/dist/es/motion/features/viewport/observers.js.map +0 -1
  71. package/dist/node_modules/framer-motion/dist/es/motion/index.js +0 -72
  72. package/dist/node_modules/framer-motion/dist/es/motion/index.js.map +0 -1
  73. package/dist/node_modules/framer-motion/dist/es/motion/utils/symbol.js +0 -6
  74. package/dist/node_modules/framer-motion/dist/es/motion/utils/symbol.js.map +0 -1
  75. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.js +0 -24
  76. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.js.map +0 -1
  77. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.js +0 -60
  78. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.js.map +0 -1
  79. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-state.js +0 -52
  80. package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-state.js.map +0 -1
  81. package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.js +0 -9
  82. package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.js.map +0 -1
  83. package/dist/node_modules/framer-motion/dist/es/render/components/create-proxy.js +0 -12
  84. package/dist/node_modules/framer-motion/dist/es/render/components/create-proxy.js.map +0 -1
  85. package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.js +0 -15
  86. package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.js.map +0 -1
  87. package/dist/node_modules/framer-motion/dist/es/render/components/motion/proxy.js +0 -9
  88. package/dist/node_modules/framer-motion/dist/es/render/components/motion/proxy.js.map +0 -1
  89. package/dist/node_modules/framer-motion/dist/es/render/dom/create-visual-element.js +0 -10
  90. package/dist/node_modules/framer-motion/dist/es/render/dom/create-visual-element.js.map +0 -1
  91. package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.js +0 -23
  92. package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.js.map +0 -1
  93. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.js +0 -21
  94. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.js.map +0 -1
  95. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.js +0 -9
  96. package/dist/node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.js.map +0 -1
  97. package/dist/node_modules/framer-motion/dist/es/render/html/use-html-visual-state.js +0 -13
  98. package/dist/node_modules/framer-motion/dist/es/render/html/use-html-visual-state.js.map +0 -1
  99. package/dist/node_modules/framer-motion/dist/es/render/html/use-props.js +0 -28
  100. package/dist/node_modules/framer-motion/dist/es/render/html/use-props.js.map +0 -1
  101. package/dist/node_modules/framer-motion/dist/es/render/html/utils/create-render-state.js +0 -11
  102. package/dist/node_modules/framer-motion/dist/es/render/html/utils/create-render-state.js.map +0 -1
  103. package/dist/node_modules/framer-motion/dist/es/render/svg/lowercase-elements.js +0 -32
  104. package/dist/node_modules/framer-motion/dist/es/render/svg/lowercase-elements.js.map +0 -1
  105. package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.js +0 -28
  106. package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.js.map +0 -1
  107. package/dist/node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.js +0 -13
  108. package/dist/node_modules/framer-motion/dist/es/render/svg/use-svg-visual-state.js.map +0 -1
  109. package/dist/node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.js +0 -10
  110. package/dist/node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.js.map +0 -1
  111. package/dist/node_modules/framer-motion/dist/es/utils/distance.js +0 -10
  112. package/dist/node_modules/framer-motion/dist/es/utils/distance.js.map +0 -1
  113. package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.js +0 -6
  114. package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.js.map +0 -1
  115. package/dist/node_modules/framer-motion/dist/es/utils/is-browser.js +0 -6
  116. package/dist/node_modules/framer-motion/dist/es/utils/is-browser.js.map +0 -1
  117. package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.js +0 -8
  118. package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.js.map +0 -1
  119. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +0 -15
  120. package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +0 -1
  121. package/dist/node_modules/framer-motion/dist/es/utils/use-constant.js +0 -11
  122. package/dist/node_modules/framer-motion/dist/es/utils/use-constant.js.map +0 -1
  123. package/dist/node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.js +0 -9
  124. package/dist/node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.js.map +0 -1
  125. package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.js +0 -109
  126. package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.js.map +0 -1
  127. package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.js +0 -132
  128. package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.js.map +0 -1
  129. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.js +0 -86
  130. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.js.map +0 -1
  131. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.js +0 -30
  132. package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.js.map +0 -1
  133. package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.js +0 -12
  134. package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.js.map +0 -1
  135. package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.js +0 -15
  136. package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.js.map +0 -1
  137. package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.js +0 -34
  138. package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.js.map +0 -1
  139. package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.js +0 -24
  140. package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.js.map +0 -1
  141. package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.js +0 -168
  142. package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.js.map +0 -1
  143. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.js +0 -11
  144. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.js.map +0 -1
  145. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.js +0 -18
  146. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.js.map +0 -1
  147. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.js +0 -8
  148. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/is-generator.js.map +0 -1
  149. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.js +0 -11
  150. package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.js.map +0 -1
  151. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.js +0 -47
  152. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.js.map +0 -1
  153. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.js +0 -56
  154. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.js.map +0 -1
  155. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.js +0 -28
  156. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.js.map +0 -1
  157. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.js +0 -23
  158. package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.js.map +0 -1
  159. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.js +0 -63
  160. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.js.map +0 -1
  161. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.js +0 -69
  162. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.js.map +0 -1
  163. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.js +0 -10
  164. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.js.map +0 -1
  165. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.js +0 -10
  166. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/default.js.map +0 -1
  167. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.js +0 -14
  168. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/fill.js.map +0 -1
  169. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.js +0 -8
  170. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/offsets/time.js.map +0 -1
  171. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.js +0 -8
  172. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/fill-wildcards.js.map +0 -1
  173. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.js +0 -9
  174. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/is-none.js.map +0 -1
  175. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.js +0 -20
  176. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.js.map +0 -1
  177. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.js +0 -38
  178. package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.js.map +0 -1
  179. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.js +0 -6
  180. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.js.map +0 -1
  181. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.js +0 -9
  182. package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/get-appear-id.js.map +0 -1
  183. package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.js +0 -24
  184. package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.js.map +0 -1
  185. package/dist/node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.js +0 -9
  186. package/dist/node_modules/motion-dom/dist/es/animation/utils/calc-child-stagger.js.map +0 -1
  187. package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.js +0 -20
  188. package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.js.map +0 -1
  189. package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.js +0 -27
  190. package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.js.map +0 -1
  191. package/dist/node_modules/motion-dom/dist/es/animation/utils/default-transitions.js +0 -29
  192. package/dist/node_modules/motion-dom/dist/es/animation/utils/default-transitions.js.map +0 -1
  193. package/dist/node_modules/motion-dom/dist/es/animation/utils/get-value-transition.js +0 -10
  194. package/dist/node_modules/motion-dom/dist/es/animation/utils/get-value-transition.js.map +0 -1
  195. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-animatable.js +0 -7
  196. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-animatable.js.map +0 -1
  197. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-css-variable.js +0 -9
  198. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-css-variable.js.map +0 -1
  199. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.js +0 -21
  200. package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.js.map +0 -1
  201. package/dist/node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.js +0 -8
  202. package/dist/node_modules/motion-dom/dist/es/animation/utils/make-animation-instant.js.map +0 -1
  203. package/dist/node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.js +0 -18
  204. package/dist/node_modules/motion-dom/dist/es/animation/utils/replace-transition-type.js.map +0 -1
  205. package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-transition.js +0 -15
  206. package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-transition.js.map +0 -1
  207. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.js +0 -6
  208. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/cubic-bezier.js.map +0 -1
  209. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.js +0 -13
  210. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/map-easing.js.map +0 -1
  211. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/supported.js +0 -37
  212. package/dist/node_modules/motion-dom/dist/es/animation/waapi/easing/supported.js.map +0 -1
  213. package/dist/node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.js +0 -27
  214. package/dist/node_modules/motion-dom/dist/es/animation/waapi/start-waapi-animation.js.map +0 -1
  215. package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.js +0 -26
  216. package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.js.map +0 -1
  217. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.js +0 -11
  218. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.js.map +0 -1
  219. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.js +0 -10
  220. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/apply-generator.js.map +0 -1
  221. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.js +0 -10
  222. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/is-browser-color.js.map +0 -1
  223. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/linear.js +0 -10
  224. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/linear.js.map +0 -1
  225. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.js +0 -19
  226. package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/unsupported-easing.js.map +0 -1
  227. package/dist/node_modules/motion-dom/dist/es/events/add-dom-event.js +0 -8
  228. package/dist/node_modules/motion-dom/dist/es/events/add-dom-event.js.map +0 -1
  229. package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.js +0 -32
  230. package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.js.map +0 -1
  231. package/dist/node_modules/motion-dom/dist/es/frameloop/frame.js +0 -8
  232. package/dist/node_modules/motion-dom/dist/es/frameloop/frame.js.map +0 -1
  233. package/dist/node_modules/motion-dom/dist/es/frameloop/microtask.js +0 -7
  234. package/dist/node_modules/motion-dom/dist/es/frameloop/microtask.js.map +0 -1
  235. package/dist/node_modules/motion-dom/dist/es/frameloop/order.js +0 -15
  236. package/dist/node_modules/motion-dom/dist/es/frameloop/order.js.map +0 -1
  237. package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.js +0 -35
  238. package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.js.map +0 -1
  239. package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.js +0 -17
  240. package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.js.map +0 -1
  241. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/is-active.js +0 -12
  242. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/is-active.js.map +0 -1
  243. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/set-active.js +0 -13
  244. package/dist/node_modules/motion-dom/dist/es/gestures/drag/state/set-active.js.map +0 -1
  245. package/dist/node_modules/motion-dom/dist/es/gestures/hover.js +0 -38
  246. package/dist/node_modules/motion-dom/dist/es/gestures/hover.js.map +0 -1
  247. package/dist/node_modules/motion-dom/dist/es/gestures/press/index.js +0 -35
  248. package/dist/node_modules/motion-dom/dist/es/gestures/press/index.js.map +0 -1
  249. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.js +0 -23
  250. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/is-keyboard-accessible.js.map +0 -1
  251. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.js +0 -30
  252. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.js.map +0 -1
  253. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/state.js +0 -6
  254. package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/state.js.map +0 -1
  255. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.js +0 -6
  256. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-node-or-child.js.map +0 -1
  257. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.js +0 -6
  258. package/dist/node_modules/motion-dom/dist/es/gestures/utils/is-primary-pointer.js.map +0 -1
  259. package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.js +0 -18
  260. package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.js.map +0 -1
  261. package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.js +0 -31
  262. package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.js.map +0 -1
  263. package/dist/node_modules/motion-dom/dist/es/projection/geometry/conversion.js +0 -41
  264. package/dist/node_modules/motion-dom/dist/es/projection/geometry/conversion.js.map +0 -1
  265. package/dist/node_modules/motion-dom/dist/es/projection/geometry/copy.js +0 -14
  266. package/dist/node_modules/motion-dom/dist/es/projection/geometry/copy.js.map +0 -1
  267. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.js +0 -45
  268. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.js.map +0 -1
  269. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.js +0 -32
  270. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.js.map +0 -1
  271. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.js +0 -31
  272. package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.js.map +0 -1
  273. package/dist/node_modules/motion-dom/dist/es/projection/geometry/models.js +0 -20
  274. package/dist/node_modules/motion-dom/dist/es/projection/geometry/models.js.map +0 -1
  275. package/dist/node_modules/motion-dom/dist/es/projection/geometry/utils.js +0 -30
  276. package/dist/node_modules/motion-dom/dist/es/projection/geometry/utils.js.map +0 -1
  277. package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.js +0 -15
  278. package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.js.map +0 -1
  279. package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.js +0 -24
  280. package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.js.map +0 -1
  281. package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.js +0 -590
  282. package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.js.map +0 -1
  283. package/dist/node_modules/motion-dom/dist/es/projection/node/state.js +0 -9
  284. package/dist/node_modules/motion-dom/dist/es/projection/node/state.js.map +0 -1
  285. package/dist/node_modules/motion-dom/dist/es/projection/shared/stack.js +0 -53
  286. package/dist/node_modules/motion-dom/dist/es/projection/shared/stack.js.map +0 -1
  287. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.js +0 -15
  288. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-border-radius.js.map +0 -1
  289. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.js +0 -15
  290. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-box-shadow.js.map +0 -1
  291. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.js +0 -23
  292. package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.js.map +0 -1
  293. package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.js +0 -14
  294. package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.js.map +0 -1
  295. package/dist/node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.js +0 -6
  296. package/dist/node_modules/motion-dom/dist/es/projection/utils/compare-by-depth.js.map +0 -1
  297. package/dist/node_modules/motion-dom/dist/es/projection/utils/each-axis.js +0 -8
  298. package/dist/node_modules/motion-dom/dist/es/projection/utils/each-axis.js.map +0 -1
  299. package/dist/node_modules/motion-dom/dist/es/projection/utils/flat-tree.js +0 -21
  300. package/dist/node_modules/motion-dom/dist/es/projection/utils/flat-tree.js.map +0 -1
  301. package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.js +0 -20
  302. package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.js.map +0 -1
  303. package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.js +0 -14
  304. package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.js.map +0 -1
  305. package/dist/node_modules/motion-dom/dist/es/render/Feature.js +0 -11
  306. package/dist/node_modules/motion-dom/dist/es/render/Feature.js.map +0 -1
  307. package/dist/node_modules/motion-dom/dist/es/render/VisualElement.js +0 -206
  308. package/dist/node_modules/motion-dom/dist/es/render/VisualElement.js.map +0 -1
  309. package/dist/node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.js +0 -30
  310. package/dist/node_modules/motion-dom/dist/es/render/dom/DOMVisualElement.js.map +0 -1
  311. package/dist/node_modules/motion-dom/dist/es/render/dom/is-css-var.js +0 -6
  312. package/dist/node_modules/motion-dom/dist/es/render/dom/is-css-var.js.map +0 -1
  313. package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.js +0 -58
  314. package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.js.map +0 -1
  315. package/dist/node_modules/motion-dom/dist/es/render/dom/style-set.js +0 -9
  316. package/dist/node_modules/motion-dom/dist/es/render/dom/style-set.js.map +0 -1
  317. package/dist/node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.js +0 -8
  318. package/dist/node_modules/motion-dom/dist/es/render/dom/utils/camel-to-dash.js.map +0 -1
  319. package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.js +0 -37
  320. package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.js.map +0 -1
  321. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-styles.js +0 -30
  322. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-styles.js.map +0 -1
  323. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.js +0 -37
  324. package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.js.map +0 -1
  325. package/dist/node_modules/motion-dom/dist/es/render/html/utils/render.js +0 -10
  326. package/dist/node_modules/motion-dom/dist/es/render/html/utils/render.js.map +0 -1
  327. package/dist/node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.js +0 -13
  328. package/dist/node_modules/motion-dom/dist/es/render/html/utils/scrape-motion-values.js.map +0 -1
  329. package/dist/node_modules/motion-dom/dist/es/render/store.js +0 -6
  330. package/dist/node_modules/motion-dom/dist/es/render/store.js.map +0 -1
  331. package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.js +0 -42
  332. package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.js.map +0 -1
  333. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.js +0 -24
  334. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.js.map +0 -1
  335. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.js +0 -30
  336. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/camel-case-attrs.js.map +0 -1
  337. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.js +0 -6
  338. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/is-svg-tag.js.map +0 -1
  339. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/path.js +0 -17
  340. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/path.js.map +0 -1
  341. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/render.js +0 -12
  342. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/render.js.map +0 -1
  343. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.js +0 -16
  344. package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.js.map +0 -1
  345. package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.js +0 -137
  346. package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.js.map +0 -1
  347. package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.js +0 -21
  348. package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.js.map +0 -1
  349. package/dist/node_modules/motion-dom/dist/es/render/utils/is-animation-controls.js +0 -8
  350. package/dist/node_modules/motion-dom/dist/es/render/utils/is-animation-controls.js.map +0 -1
  351. package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.js +0 -14
  352. package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.js.map +0 -1
  353. package/dist/node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.js +0 -10
  354. package/dist/node_modules/motion-dom/dist/es/render/utils/is-forced-motion-value.js.map +0 -1
  355. package/dist/node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.js +0 -6
  356. package/dist/node_modules/motion-dom/dist/es/render/utils/is-keyframes-target.js.map +0 -1
  357. package/dist/node_modules/motion-dom/dist/es/render/utils/is-variant-label.js +0 -8
  358. package/dist/node_modules/motion-dom/dist/es/render/utils/is-variant-label.js.map +0 -1
  359. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-position.js +0 -15
  360. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-position.js.map +0 -1
  361. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.js +0 -24
  362. package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.js.map +0 -1
  363. package/dist/node_modules/motion-dom/dist/es/render/utils/motion-values.js +0 -23
  364. package/dist/node_modules/motion-dom/dist/es/render/utils/motion-values.js.map +0 -1
  365. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.js +0 -13
  366. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/index.js.map +0 -1
  367. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.js +0 -6
  368. package/dist/node_modules/motion-dom/dist/es/render/utils/reduced-motion/state.js.map +0 -1
  369. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.js +0 -10
  370. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.js.map +0 -1
  371. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.js +0 -22
  372. package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.js.map +0 -1
  373. package/dist/node_modules/motion-dom/dist/es/render/utils/setters.js +0 -22
  374. package/dist/node_modules/motion-dom/dist/es/render/utils/setters.js.map +0 -1
  375. package/dist/node_modules/motion-dom/dist/es/render/utils/shallow-compare.js +0 -12
  376. package/dist/node_modules/motion-dom/dist/es/render/utils/shallow-compare.js.map +0 -1
  377. package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.js +0 -14
  378. package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.js.map +0 -1
  379. package/dist/node_modules/motion-dom/dist/es/resize/handle-element.js +0 -39
  380. package/dist/node_modules/motion-dom/dist/es/resize/handle-element.js.map +0 -1
  381. package/dist/node_modules/motion-dom/dist/es/resize/handle-window.js +0 -24
  382. package/dist/node_modules/motion-dom/dist/es/resize/handle-window.js.map +0 -1
  383. package/dist/node_modules/motion-dom/dist/es/resize/index.js +0 -10
  384. package/dist/node_modules/motion-dom/dist/es/resize/index.js.map +0 -1
  385. package/dist/node_modules/motion-dom/dist/es/stats/animation-count.js +0 -10
  386. package/dist/node_modules/motion-dom/dist/es/stats/animation-count.js.map +0 -1
  387. package/dist/node_modules/motion-dom/dist/es/stats/buffer.js +0 -9
  388. package/dist/node_modules/motion-dom/dist/es/stats/buffer.js.map +0 -1
  389. package/dist/node_modules/motion-dom/dist/es/utils/delay.js +0 -14
  390. package/dist/node_modules/motion-dom/dist/es/utils/delay.js.map +0 -1
  391. package/dist/node_modules/motion-dom/dist/es/utils/interpolate.js +0 -35
  392. package/dist/node_modules/motion-dom/dist/es/utils/interpolate.js.map +0 -1
  393. package/dist/node_modules/motion-dom/dist/es/utils/is-html-element.js +0 -9
  394. package/dist/node_modules/motion-dom/dist/es/utils/is-html-element.js.map +0 -1
  395. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-element.js +0 -9
  396. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-element.js.map +0 -1
  397. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-svg-element.js +0 -9
  398. package/dist/node_modules/motion-dom/dist/es/utils/is-svg-svg-element.js.map +0 -1
  399. package/dist/node_modules/motion-dom/dist/es/utils/mix/color.js +0 -32
  400. package/dist/node_modules/motion-dom/dist/es/utils/mix/color.js.map +0 -1
  401. package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.js +0 -54
  402. package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.js.map +0 -1
  403. package/dist/node_modules/motion-dom/dist/es/utils/mix/immediate.js +0 -8
  404. package/dist/node_modules/motion-dom/dist/es/utils/mix/immediate.js.map +0 -1
  405. package/dist/node_modules/motion-dom/dist/es/utils/mix/index.js +0 -10
  406. package/dist/node_modules/motion-dom/dist/es/utils/mix/index.js.map +0 -1
  407. package/dist/node_modules/motion-dom/dist/es/utils/mix/number.js +0 -6
  408. package/dist/node_modules/motion-dom/dist/es/utils/mix/number.js.map +0 -1
  409. package/dist/node_modules/motion-dom/dist/es/utils/mix/visibility.js +0 -9
  410. package/dist/node_modules/motion-dom/dist/es/utils/mix/visibility.js.map +0 -1
  411. package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.js +0 -16
  412. package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.js.map +0 -1
  413. package/dist/node_modules/motion-dom/dist/es/utils/supports/flags.js +0 -6
  414. package/dist/node_modules/motion-dom/dist/es/utils/supports/flags.js.map +0 -1
  415. package/dist/node_modules/motion-dom/dist/es/utils/supports/linear-easing.js +0 -14
  416. package/dist/node_modules/motion-dom/dist/es/utils/supports/linear-easing.js.map +0 -1
  417. package/dist/node_modules/motion-dom/dist/es/utils/supports/memo.js +0 -11
  418. package/dist/node_modules/motion-dom/dist/es/utils/supports/memo.js.map +0 -1
  419. package/dist/node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.js +0 -7
  420. package/dist/node_modules/motion-dom/dist/es/utils/supports/scroll-timeline.js.map +0 -1
  421. package/dist/node_modules/motion-dom/dist/es/value/index.js +0 -94
  422. package/dist/node_modules/motion-dom/dist/es/value/index.js.map +0 -1
  423. package/dist/node_modules/motion-dom/dist/es/value/types/auto.js +0 -9
  424. package/dist/node_modules/motion-dom/dist/es/value/types/auto.js.map +0 -1
  425. package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.js +0 -21
  426. package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.js.map +0 -1
  427. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.js +0 -23
  428. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla-to-rgba.js.map +0 -1
  429. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla.js +0 -14
  430. package/dist/node_modules/motion-dom/dist/es/value/types/color/hsla.js.map +0 -1
  431. package/dist/node_modules/motion-dom/dist/es/value/types/color/index.js +0 -17
  432. package/dist/node_modules/motion-dom/dist/es/value/types/color/index.js.map +0 -1
  433. package/dist/node_modules/motion-dom/dist/es/value/types/color/rgba.js +0 -17
  434. package/dist/node_modules/motion-dom/dist/es/value/types/color/rgba.js.map +0 -1
  435. package/dist/node_modules/motion-dom/dist/es/value/types/color/utils.js +0 -18
  436. package/dist/node_modules/motion-dom/dist/es/value/types/color/utils.js.map +0 -1
  437. package/dist/node_modules/motion-dom/dist/es/value/types/complex/filter.js +0 -28
  438. package/dist/node_modules/motion-dom/dist/es/value/types/complex/filter.js.map +0 -1
  439. package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.js +0 -54
  440. package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.js.map +0 -1
  441. package/dist/node_modules/motion-dom/dist/es/value/types/complex/mask.js +0 -16
  442. package/dist/node_modules/motion-dom/dist/es/value/types/complex/mask.js.map +0 -1
  443. package/dist/node_modules/motion-dom/dist/es/value/types/dimensions.js +0 -18
  444. package/dist/node_modules/motion-dom/dist/es/value/types/dimensions.js.map +0 -1
  445. package/dist/node_modules/motion-dom/dist/es/value/types/int.js +0 -10
  446. package/dist/node_modules/motion-dom/dist/es/value/types/int.js.map +0 -1
  447. package/dist/node_modules/motion-dom/dist/es/value/types/maps/defaults.js +0 -26
  448. package/dist/node_modules/motion-dom/dist/es/value/types/maps/defaults.js.map +0 -1
  449. package/dist/node_modules/motion-dom/dist/es/value/types/maps/number.js +0 -66
  450. package/dist/node_modules/motion-dom/dist/es/value/types/maps/number.js.map +0 -1
  451. package/dist/node_modules/motion-dom/dist/es/value/types/maps/transform.js +0 -33
  452. package/dist/node_modules/motion-dom/dist/es/value/types/maps/transform.js.map +0 -1
  453. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/index.js +0 -17
  454. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/index.js.map +0 -1
  455. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/units.js +0 -14
  456. package/dist/node_modules/motion-dom/dist/es/value/types/numbers/units.js.map +0 -1
  457. package/dist/node_modules/motion-dom/dist/es/value/types/test.js +0 -6
  458. package/dist/node_modules/motion-dom/dist/es/value/types/test.js.map +0 -1
  459. package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.js +0 -14
  460. package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.js.map +0 -1
  461. package/dist/node_modules/motion-dom/dist/es/value/types/utils/color-regex.js +0 -6
  462. package/dist/node_modules/motion-dom/dist/es/value/types/utils/color-regex.js.map +0 -1
  463. package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.js +0 -14
  464. package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.js.map +0 -1
  465. package/dist/node_modules/motion-dom/dist/es/value/types/utils/float-regex.js +0 -6
  466. package/dist/node_modules/motion-dom/dist/es/value/types/utils/float-regex.js.map +0 -1
  467. package/dist/node_modules/motion-dom/dist/es/value/types/utils/get-as-type.js +0 -6
  468. package/dist/node_modules/motion-dom/dist/es/value/types/utils/get-as-type.js.map +0 -1
  469. package/dist/node_modules/motion-dom/dist/es/value/types/utils/is-nullish.js +0 -8
  470. package/dist/node_modules/motion-dom/dist/es/value/types/utils/is-nullish.js.map +0 -1
  471. package/dist/node_modules/motion-dom/dist/es/value/types/utils/sanitize.js +0 -6
  472. package/dist/node_modules/motion-dom/dist/es/value/types/utils/sanitize.js.map +0 -1
  473. package/dist/node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.js +0 -6
  474. package/dist/node_modules/motion-dom/dist/es/value/types/utils/single-color-regex.js.map +0 -1
  475. package/dist/node_modules/motion-dom/dist/es/value/utils/is-motion-value.js +0 -6
  476. package/dist/node_modules/motion-dom/dist/es/value/utils/is-motion-value.js.map +0 -1
  477. package/dist/node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.js +0 -9
  478. package/dist/node_modules/motion-dom/dist/es/value/utils/resolve-motion-value.js.map +0 -1
  479. package/dist/node_modules/motion-dom/dist/es/value/will-change/add-will-change.js +0 -15
  480. package/dist/node_modules/motion-dom/dist/es/value/will-change/add-will-change.js.map +0 -1
  481. package/dist/node_modules/motion-dom/dist/es/value/will-change/is.js +0 -9
  482. package/dist/node_modules/motion-dom/dist/es/value/will-change/is.js.map +0 -1
  483. package/dist/node_modules/motion-utils/dist/es/array.js +0 -12
  484. package/dist/node_modules/motion-utils/dist/es/array.js.map +0 -1
  485. package/dist/node_modules/motion-utils/dist/es/clamp.js +0 -6
  486. package/dist/node_modules/motion-utils/dist/es/clamp.js.map +0 -1
  487. package/dist/node_modules/motion-utils/dist/es/easing/anticipate.js +0 -7
  488. package/dist/node_modules/motion-utils/dist/es/easing/anticipate.js.map +0 -1
  489. package/dist/node_modules/motion-utils/dist/es/easing/back.js +0 -9
  490. package/dist/node_modules/motion-utils/dist/es/easing/back.js.map +0 -1
  491. package/dist/node_modules/motion-utils/dist/es/easing/circ.js +0 -8
  492. package/dist/node_modules/motion-utils/dist/es/easing/circ.js.map +0 -1
  493. package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.js +0 -19
  494. package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.js.map +0 -1
  495. package/dist/node_modules/motion-utils/dist/es/easing/ease.js +0 -7
  496. package/dist/node_modules/motion-utils/dist/es/easing/ease.js.map +0 -1
  497. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/mirror.js +0 -6
  498. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/mirror.js.map +0 -1
  499. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/reverse.js +0 -6
  500. package/dist/node_modules/motion-utils/dist/es/easing/modifiers/reverse.js.map +0 -1
  501. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.js +0 -6
  502. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-bezier-definition.js.map +0 -1
  503. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-easing-array.js +0 -6
  504. package/dist/node_modules/motion-utils/dist/es/easing/utils/is-easing-array.js.map +0 -1
  505. package/dist/node_modules/motion-utils/dist/es/easing/utils/map.js +0 -33
  506. package/dist/node_modules/motion-utils/dist/es/easing/utils/map.js.map +0 -1
  507. package/dist/node_modules/motion-utils/dist/es/errors.js +0 -12
  508. package/dist/node_modules/motion-utils/dist/es/errors.js.map +0 -1
  509. package/dist/node_modules/motion-utils/dist/es/format-error-message.js +0 -8
  510. package/dist/node_modules/motion-utils/dist/es/format-error-message.js.map +0 -1
  511. package/dist/node_modules/motion-utils/dist/es/global-config.js +0 -6
  512. package/dist/node_modules/motion-utils/dist/es/global-config.js.map +0 -1
  513. package/dist/node_modules/motion-utils/dist/es/is-numerical-string.js +0 -6
  514. package/dist/node_modules/motion-utils/dist/es/is-numerical-string.js.map +0 -1
  515. package/dist/node_modules/motion-utils/dist/es/is-object.js +0 -8
  516. package/dist/node_modules/motion-utils/dist/es/is-object.js.map +0 -1
  517. package/dist/node_modules/motion-utils/dist/es/is-zero-value-string.js +0 -6
  518. package/dist/node_modules/motion-utils/dist/es/is-zero-value-string.js.map +0 -1
  519. package/dist/node_modules/motion-utils/dist/es/memo.js +0 -10
  520. package/dist/node_modules/motion-utils/dist/es/memo.js.map +0 -1
  521. package/dist/node_modules/motion-utils/dist/es/noop.js +0 -6
  522. package/dist/node_modules/motion-utils/dist/es/noop.js.map +0 -1
  523. package/dist/node_modules/motion-utils/dist/es/pipe.js +0 -6
  524. package/dist/node_modules/motion-utils/dist/es/pipe.js.map +0 -1
  525. package/dist/node_modules/motion-utils/dist/es/progress.js +0 -9
  526. package/dist/node_modules/motion-utils/dist/es/progress.js.map +0 -1
  527. package/dist/node_modules/motion-utils/dist/es/subscription-manager.js +0 -28
  528. package/dist/node_modules/motion-utils/dist/es/subscription-manager.js.map +0 -1
  529. package/dist/node_modules/motion-utils/dist/es/time-conversion.js +0 -6
  530. package/dist/node_modules/motion-utils/dist/es/time-conversion.js.map +0 -1
  531. package/dist/node_modules/motion-utils/dist/es/velocity-per-second.js +0 -8
  532. package/dist/node_modules/motion-utils/dist/es/velocity-per-second.js.map +0 -1
  533. package/dist/node_modules/motion-utils/dist/es/warn-once.js +0 -10
  534. package/dist/node_modules/motion-utils/dist/es/warn-once.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"viz.js","names":[],"sources":["../../../src/brainyrich/components/viz.tsx"],"sourcesContent":["/**\n * BrainyRich data-viz + polish kit.\n * @module brainyrich/components/viz\n *\n * A tokenized, responsive, dark-mode-first visualization + motion kit built on\n * recharts (^2.15) and framer-motion (^12). Every colour is read from the\n * platform's SEMANTIC CSS variables at runtime (see {@link useVizColors}) so\n * charts always track the active theme and the emerald BrainyRich brand\n * (`--color-action-primary-bg`). No raw hex/rgb literals live in this file.\n *\n * All chart components are wrapped in a recharts `<ResponsiveContainer>` so they\n * resize with their parent. Motion is tasteful (<=250ms) and disabled under\n * `prefers-reduced-motion`.\n *\n * Page agents: import from `#brainyrich/components/viz` (or the components\n * barrel). Pass values straight from the real `bra*` hooks — this kit only\n * renders; it never fabricates data.\n */\nimport { useEffect, useId, useMemo, useState, type CSSProperties, type ReactNode } from 'react';\nimport {\n Area,\n AreaChart,\n Bar,\n BarChart,\n Cell,\n Line,\n LineChart,\n Pie,\n PieChart,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { AnimatePresence, motion, useReducedMotion } from 'framer-motion';\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nfunction cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n\n// ============================================================================\n// Token → colour resolution\n// ============================================================================\n//\n// recharts needs concrete colour strings (fills, stroke, gradient stops), so we\n// resolve each semantic CSS variable to its computed value off\n// `document.documentElement` and re-read whenever the theme attribute flips.\n// Consumers NEVER hard-code colours: they name a semantic token here.\n\nconst CORE_TOKENS = {\n brand: '--color-action-primary-bg',\n brandBorder: '--color-action-primary-border',\n grid: '--color-chart-grid',\n axis: '--color-chart-axis',\n positive: '--color-chart-positive',\n negative: '--color-chart-negative',\n success: '--color-status-success',\n error: '--color-status-error',\n warning: '--color-status-warning',\n info: '--color-status-info',\n teal: '--color-accent-teal',\n blue: '--color-accent-blue',\n purple: '--color-accent-purple',\n indigo: '--color-accent-indigo',\n textPrimary: '--color-text-primary',\n textSecondary: '--color-text-secondary',\n surface: '--color-bg-elevated',\n border: '--color-border-subtle',\n} as const;\n\ntype CoreToken = keyof typeof CORE_TOKENS;\n\n/** Ordered categorical palette — emerald brand first, then distinct chart hues. */\nconst PALETTE_VARS = [\n '--color-action-primary-bg',\n '--color-chart-2',\n '--color-chart-3',\n '--color-chart-4',\n '--color-chart-5',\n '--color-chart-6',\n '--color-chart-7',\n '--color-chart-8',\n '--color-chart-9',\n '--color-chart-10',\n '--color-chart-11',\n '--color-chart-12',\n];\n\nexport type VizColors = Record<CoreToken, string> & {\n /** Categorical palette (index 0 = emerald brand). */\n palette: string[];\n /** Resolve any semantic tone name to a concrete colour string. */\n tone: (tone?: VizTone) => string;\n};\n\n/** Named tones a datum may request; falls back to the categorical palette. */\nexport type VizTone =\n | 'brand'\n | 'primary'\n | 'success'\n | 'positive'\n | 'error'\n | 'negative'\n | 'warning'\n | 'info'\n | 'teal'\n | 'blue'\n | 'purple'\n | 'indigo'\n | 'neutral';\n\nfunction readVar(name: string): string {\n if (typeof window === 'undefined') return `var(${name})`;\n const v = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n return v || `var(${name})`;\n}\n\n/**\n * Resolve the semantic viz palette from CSS variables and keep it in sync with\n * the active theme. Returns concrete colour strings for use in recharts props.\n */\nexport function useVizColors(): VizColors {\n const [tick, setTick] = useState(0);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const rerender = () => setTick((t) => t + 1);\n const obs = new MutationObserver(rerender);\n obs.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class', 'style'],\n });\n return () => obs.disconnect();\n }, []);\n\n return useMemo(() => {\n void tick; // re-resolve whenever the theme attribute changes\n const core = Object.fromEntries(\n (Object.keys(CORE_TOKENS) as CoreToken[]).map((k) => [k, readVar(CORE_TOKENS[k])])\n ) as Record<CoreToken, string>;\n const palette = PALETTE_VARS.map(readVar);\n\n const tone = (t?: VizTone): string => {\n switch (t) {\n case 'brand':\n case 'primary':\n return core.brand;\n case 'success':\n case 'positive':\n return core.success;\n case 'error':\n case 'negative':\n return core.error;\n case 'warning':\n return core.warning;\n case 'info':\n return core.info;\n case 'teal':\n return core.teal;\n case 'blue':\n return core.blue;\n case 'purple':\n return core.purple;\n case 'indigo':\n return core.indigo;\n case 'neutral':\n return core.textSecondary;\n default:\n return core.brand;\n }\n };\n\n return { ...core, palette, tone };\n }, [tick]);\n}\n\n// ============================================================================\n// Shared chart tooltip (themed — recharts' default is light-only)\n// ============================================================================\n\ninterface TooltipEntry {\n name?: string | number;\n value?: string | number;\n color?: string;\n payload?: Record<string, unknown>;\n}\n\nfunction useTooltipStyles(): { wrapper: CSSProperties; label: CSSProperties } {\n const c = useVizColors();\n return {\n wrapper: {\n background: c.surface,\n border: `1px solid ${c.border}`,\n borderRadius: 10,\n padding: '8px 12px',\n color: c.textPrimary,\n fontSize: 12,\n boxShadow: 'var(--shadow-pop, 0 8px 24px rgba(0,0,0,0.35))',\n },\n label: { color: c.textSecondary, marginBottom: 4, fontSize: 11 },\n };\n}\n\nfunction ChartTooltip({\n active,\n payload,\n label,\n valueFormatter,\n}: {\n active?: boolean;\n payload?: TooltipEntry[];\n label?: string | number;\n valueFormatter?: (v: number) => string;\n}) {\n const styles = useTooltipStyles();\n if (!active || !payload || payload.length === 0) return null;\n return (\n <div style={styles.wrapper} role=\"tooltip\">\n {label !== undefined && label !== '' ? <div style={styles.label}>{label}</div> : null}\n {payload.map((entry, i) => {\n const raw = typeof entry.value === 'number' ? entry.value : Number(entry.value);\n const shown =\n valueFormatter && Number.isFinite(raw) ? valueFormatter(raw) : String(entry.value ?? '');\n return (\n <div key={i} className=\"flex items-center gap-2\">\n {entry.color ? (\n <span\n aria-hidden=\"true\"\n style={{\n width: 8,\n height: 8,\n borderRadius: 9999,\n background: entry.color,\n display: 'inline-block',\n }}\n />\n ) : null}\n {entry.name ? <span style={{ color: styles.label.color }}>{entry.name}:</span> : null}\n <span style={{ fontWeight: 600 }}>{shown}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ============================================================================\n// Motion helpers\n// ============================================================================\n\n/**\n * Staggered enter animation (translateY + opacity). Fully disabled under\n * `prefers-reduced-motion` (renders a plain element). Use `index` to stagger a\n * list/grid of cards.\n */\nexport function FadeIn({\n children,\n index = 0,\n delay = 0,\n className,\n as = 'div',\n}: {\n children: ReactNode;\n index?: number;\n delay?: number;\n className?: string;\n as?: 'div' | 'li' | 'section';\n}) {\n const reduce = useReducedMotion();\n if (reduce) {\n const Tag = as;\n return <Tag className={className}>{children}</Tag>;\n }\n const MotionTag = motion[as];\n return (\n <MotionTag\n className={className}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.25, ease: 'easeOut', delay: delay + index * 0.04 }}\n >\n {children}\n </MotionTag>\n );\n}\n\n// ============================================================================\n// GlassCard — sanctioned glass/elevation surface with graceful fallback\n// ============================================================================\n\n/**\n * Floating/hero surface using the sanctioned glass tokens. Falls back to the\n * standard elevated surface when a glass token is absent (older brand builds).\n */\nexport function GlassCard({\n children,\n className,\n glow = false,\n}: {\n children: ReactNode;\n className?: string;\n /** Add a subtle emerald glow ring. */\n glow?: boolean;\n}) {\n return (\n <div\n className={cn(\n 'rounded-2xl border p-5',\n // Glass tokens with hard fallbacks to always-present semantic tokens.\n 'border-[var(--color-border-glass,var(--color-border-subtle))]',\n 'bg-[var(--color-surface-glass,var(--color-bg-elevated))]',\n 'shadow-[var(--shadow-float,var(--shadow-elevation-3))]',\n 'backdrop-blur-[var(--blur-glass,12px)]',\n glow && 'ring-1 ring-[var(--color-action-primary-border)]/40',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// DonutChart\n// ============================================================================\n\nexport interface DonutDatum {\n label: string;\n value: number;\n tone?: VizTone;\n}\n\nexport function DonutChart({\n data,\n centerLabel,\n centerValue,\n legend = true,\n height = 220,\n valueFormatter,\n}: {\n data: DonutDatum[];\n centerLabel?: string;\n centerValue?: string;\n legend?: boolean;\n height?: number;\n valueFormatter?: (v: number) => string;\n}) {\n const c = useVizColors();\n const reduce = useReducedMotion();\n const rows = data.filter((d) => Number.isFinite(d.value) && d.value > 0);\n\n if (rows.length === 0) {\n return <p className=\"text-sm text-text-secondary\">No data.</p>;\n }\n\n const colorFor = (d: DonutDatum, i: number) =>\n d.tone ? c.tone(d.tone) : c.palette[i % c.palette.length];\n\n return (\n <div className=\"flex flex-col items-center gap-4 sm:flex-row sm:items-center\">\n <div className=\"relative\" style={{ width: '100%', maxWidth: 260, height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={rows}\n dataKey=\"value\"\n nameKey=\"label\"\n innerRadius=\"62%\"\n outerRadius=\"90%\"\n paddingAngle={2}\n stroke=\"transparent\"\n isAnimationActive={!reduce}\n animationDuration={250}\n >\n {rows.map((d, i) => (\n <Cell key={d.label} fill={colorFor(d, i)} />\n ))}\n </Pie>\n <Tooltip content={<ChartTooltip valueFormatter={valueFormatter} />} />\n </PieChart>\n </ResponsiveContainer>\n {centerValue || centerLabel ? (\n <div className=\"pointer-events-none absolute inset-0 flex flex-col items-center justify-center\">\n {centerValue ? (\n <span className=\"text-xl font-semibold text-text-primary\">{centerValue}</span>\n ) : null}\n {centerLabel ? (\n <span className=\"text-xs text-text-secondary\">{centerLabel}</span>\n ) : null}\n </div>\n ) : null}\n </div>\n {legend ? (\n <ul className=\"grid flex-1 grid-cols-1 gap-2 sm:grid-cols-2\" aria-label=\"Legend\">\n {rows.map((d, i) => (\n <li key={d.label} className=\"flex items-center gap-2 text-xs\">\n <span\n aria-hidden=\"true\"\n className=\"size-2.5 shrink-0 rounded-full\"\n style={{ background: colorFor(d, i) }}\n />\n <span className=\"truncate text-text-secondary\">{d.label}</span>\n <span className=\"ml-auto font-medium text-text-primary\">\n {valueFormatter ? valueFormatter(d.value) : d.value}\n </span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\n// ============================================================================\n// Sparkline\n// ============================================================================\n\nexport function Sparkline({\n data,\n tone = 'brand',\n height = 40,\n className,\n}: {\n data: number[];\n tone?: VizTone;\n height?: number;\n className?: string;\n}) {\n const c = useVizColors();\n const stroke = c.tone(tone);\n const points = data.filter((n) => Number.isFinite(n));\n const gradientId = `spark-${useId().replace(/:/g, '')}`;\n if (points.length < 2) {\n return <div className={className} style={{ height }} aria-hidden=\"true\" />;\n }\n const chartData = points.map((y, x) => ({ x, y }));\n return (\n <div className={className} style={{ width: '100%', height }} aria-hidden=\"true\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={chartData} margin={{ top: 2, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={stroke} stopOpacity={0.28} />\n <stop offset=\"100%\" stopColor={stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n <Area\n type=\"monotone\"\n dataKey=\"y\"\n stroke={stroke}\n strokeWidth={2}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n dot={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n// ============================================================================\n// ProgressRing — clean SVG radial progress\n// ============================================================================\n\nexport function ProgressRing({\n value,\n label,\n tone = 'brand',\n size = 120,\n strokeWidth = 10,\n}: {\n value: number;\n label?: string;\n tone?: VizTone;\n size?: number;\n strokeWidth?: number;\n}) {\n const c = useVizColors();\n const reduce = useReducedMotion();\n const pct = Math.max(0, Math.min(100, Number.isFinite(value) ? value : 0));\n const r = (size - strokeWidth) / 2;\n const circ = 2 * Math.PI * r;\n const dash = (pct / 100) * circ;\n const stroke = c.tone(tone);\n\n return (\n <div\n className=\"relative inline-flex items-center justify-center\"\n style={{ width: size, height: size }}\n role=\"progressbar\"\n aria-valuenow={Math.round(pct)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label ?? 'Progress'}\n >\n <svg width={size} height={size} className=\"-rotate-90\">\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={c.border}\n strokeWidth={strokeWidth}\n />\n <motion.circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circ}\n initial={{ strokeDashoffset: reduce ? circ - dash : circ }}\n animate={{ strokeDashoffset: circ - dash }}\n transition={{ duration: reduce ? 0 : 0.25, ease: 'easeOut' }}\n />\n </svg>\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\n <span className=\"text-lg font-semibold text-text-primary\">{Math.round(pct)}%</span>\n {label ? <span className=\"text-[10px] text-text-secondary\">{label}</span> : null}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// TrendBars — diverging inflow/outflow cashflow bars\n// ============================================================================\n\nexport interface TrendDatum {\n label: string;\n inflow: number;\n outflow: number;\n}\n\nexport function TrendBars({\n data,\n height = 240,\n valueFormatter,\n}: {\n data: TrendDatum[];\n height?: number;\n valueFormatter?: (v: number) => string;\n}) {\n const c = useVizColors();\n const reduce = useReducedMotion();\n const rows = data.filter((d) => Number.isFinite(d.inflow) && Number.isFinite(d.outflow));\n if (rows.length === 0) {\n return <p className=\"text-sm text-text-secondary\">No cashflow data.</p>;\n }\n // Diverging: inflow up (positive), outflow down (negative).\n const chartData = rows.map((d) => ({\n label: d.label,\n inflow: Math.abs(d.inflow),\n outflow: -Math.abs(d.outflow),\n }));\n\n return (\n <div style={{ width: '100%', height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n data={chartData}\n margin={{ top: 8, right: 8, bottom: 0, left: 8 }}\n stackOffset=\"sign\"\n >\n <XAxis\n dataKey=\"label\"\n tick={{ fill: c.textSecondary, fontSize: 11 }}\n axisLine={{ stroke: c.grid }}\n tickLine={false}\n />\n <YAxis\n tick={{ fill: c.textSecondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n width={44}\n tickFormatter={(v: number) =>\n valueFormatter ? valueFormatter(Math.abs(v)) : String(Math.abs(v))\n }\n />\n <ReferenceLine y={0} stroke={c.grid} />\n <Tooltip\n cursor={{ fill: c.border, opacity: 0.25 }}\n content={\n <ChartTooltip\n valueFormatter={(v) =>\n valueFormatter ? valueFormatter(Math.abs(v)) : String(Math.abs(v))\n }\n />\n }\n />\n <Bar\n dataKey=\"inflow\"\n name=\"Inflow\"\n fill={c.positive}\n radius={[4, 4, 0, 0]}\n isAnimationActive={!reduce}\n animationDuration={250}\n />\n <Bar\n dataKey=\"outflow\"\n name=\"Outflow\"\n fill={c.negative}\n radius={[0, 0, 4, 4]}\n isAnimationActive={!reduce}\n animationDuration={250}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n// ============================================================================\n// MiniAreaChart — projection with optional dashed target line\n// ============================================================================\n\nexport interface AreaDatum {\n x: string | number;\n y: number;\n}\n\nexport function MiniAreaChart({\n data,\n target,\n tone = 'brand',\n height = 200,\n valueFormatter,\n}: {\n data: AreaDatum[];\n target?: number;\n tone?: VizTone;\n height?: number;\n valueFormatter?: (v: number) => string;\n}) {\n const c = useVizColors();\n const reduce = useReducedMotion();\n const stroke = c.tone(tone);\n const rows = data.filter((d) => Number.isFinite(d.y));\n const gradientId = `area-${useId().replace(/:/g, '')}`;\n if (rows.length < 2) {\n return <p className=\"text-sm text-text-secondary\">Not enough data to chart.</p>;\n }\n return (\n <div style={{ width: '100%', height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={rows} margin={{ top: 8, right: 8, bottom: 0, left: 8 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={stroke} stopOpacity={0.3} />\n <stop offset=\"100%\" stopColor={stroke} stopOpacity={0.02} />\n </linearGradient>\n </defs>\n <XAxis\n dataKey=\"x\"\n tick={{ fill: c.textSecondary, fontSize: 11 }}\n axisLine={{ stroke: c.grid }}\n tickLine={false}\n />\n <YAxis\n tick={{ fill: c.textSecondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n width={44}\n tickFormatter={(v: number) => (valueFormatter ? valueFormatter(v) : String(v))}\n />\n <Tooltip content={<ChartTooltip valueFormatter={valueFormatter} />} />\n {target !== undefined && Number.isFinite(target) ? (\n <ReferenceLine\n y={target}\n stroke={c.textSecondary}\n strokeDasharray=\"5 4\"\n label={{\n value: valueFormatter ? `Target ${valueFormatter(target)}` : `Target ${target}`,\n position: 'insideTopRight',\n fill: c.textSecondary,\n fontSize: 10,\n }}\n />\n ) : null}\n <Area\n type=\"monotone\"\n dataKey=\"y\"\n stroke={stroke}\n strokeWidth={2}\n fill={`url(#${gradientId})`}\n isAnimationActive={!reduce}\n animationDuration={250}\n dot={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n// ============================================================================\n// LifecycleStepper — horizontal proposal/rebalance lifecycle\n// ============================================================================\n\nconst NEGATIVE_TERMINAL = /reject|cancel|abandon|decline|fail/i;\n\nexport function LifecycleStepper({\n steps,\n current,\n className,\n}: {\n steps: string[];\n current: string;\n className?: string;\n}) {\n const isNegativeTerminal = NEGATIVE_TERMINAL.test(current);\n const currentIndex = steps.findIndex((s) => s.toLowerCase() === current.toLowerCase());\n\n return (\n <ol\n className={cn('flex w-full items-center overflow-x-auto', className)}\n aria-label=\"Lifecycle progress\"\n >\n {steps.map((step, i) => {\n const isLast = i === steps.length - 1;\n const done = currentIndex >= 0 && i < currentIndex;\n const active = currentIndex >= 0 && i === currentIndex && !isNegativeTerminal;\n const state = done ? 'done' : active ? 'active' : 'upcoming';\n return (\n <li\n key={step}\n className=\"flex min-w-fit flex-1 items-center\"\n aria-current={active ? 'step' : undefined}\n >\n <div className=\"flex flex-col items-center gap-1.5 px-1\">\n <span\n className={cn(\n 'flex size-7 items-center justify-center rounded-full border text-xs font-semibold transition-colors',\n state === 'done' &&\n 'border-transparent bg-[var(--color-action-primary-bg)] text-[var(--color-action-primary-text)]',\n state === 'active' &&\n 'border-[var(--color-action-primary-border)] bg-[var(--color-action-primary-bg)]/15 text-[var(--color-action-primary-text)]',\n state === 'upcoming' && 'border-border-subtle bg-bg-sunken text-text-secondary'\n )}\n aria-hidden=\"true\"\n >\n {done ? '✓' : i + 1}\n </span>\n <span\n className={cn(\n 'whitespace-nowrap text-[11px]',\n active ? 'font-medium text-text-primary' : 'text-text-secondary'\n )}\n >\n {step}\n </span>\n </div>\n {!isLast ? (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'mx-1 h-0.5 flex-1 rounded-full',\n done ? 'bg-[var(--color-action-primary-bg)]' : 'bg-border-subtle'\n )}\n />\n ) : null}\n </li>\n );\n })}\n {isNegativeTerminal ? (\n <li className=\"ml-2 flex min-w-fit items-center gap-1.5\" aria-current=\"step\">\n <span className=\"mx-1 h-0.5 w-6 rounded-full bg-status-error-border\" aria-hidden=\"true\" />\n <div className=\"flex flex-col items-center gap-1.5 px-1\">\n <span\n className=\"flex size-7 items-center justify-center rounded-full border border-transparent bg-status-error text-xs font-semibold text-status-error-text\"\n aria-hidden=\"true\"\n >\n ✕\n </span>\n <span className=\"whitespace-nowrap text-[11px] font-medium text-status-error-text\">\n {current}\n </span>\n </div>\n </li>\n ) : null}\n </ol>\n );\n}\n\n// ============================================================================\n// StatTile — premium KPI tile\n// ============================================================================\n\nexport function StatTile({\n label,\n value,\n delta,\n deltaTone,\n deltaSuffix = '%',\n spark,\n sparkTone = 'brand',\n glow = false,\n icon,\n className,\n}: {\n label: string;\n value: string;\n /** Optional signed delta rendered as a chip (icon + sign + status colour). */\n delta?: number;\n /** Override the auto tone derived from the delta sign. */\n deltaTone?: 'positive' | 'negative' | 'neutral';\n deltaSuffix?: string;\n /** Optional inline sparkline series. */\n spark?: number[];\n sparkTone?: VizTone;\n /** Subtle emerald glow ring for hero tiles. */\n glow?: boolean;\n icon?: ReactNode;\n className?: string;\n}) {\n const positive = deltaTone ? deltaTone === 'positive' : (delta ?? 0) > 0;\n const negative = deltaTone ? deltaTone === 'negative' : (delta ?? 0) < 0;\n const deltaClass = positive\n ? 'text-status-success-text bg-status-success-bg'\n : negative\n ? 'text-status-error-text bg-status-error-bg'\n : 'text-text-secondary bg-bg-sunken';\n const sign = delta !== undefined && delta > 0 ? '+' : '';\n\n return (\n <div\n className={cn(\n 'group relative overflow-hidden rounded-xl border border-border-subtle bg-bg-surface p-4 transition-shadow',\n 'motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]',\n glow && 'ring-1 ring-[var(--color-action-primary-border)]/40',\n className\n )}\n >\n {glow ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -right-8 -top-8 size-24 rounded-full bg-[var(--color-action-primary-bg)]/15 blur-2xl\"\n />\n ) : null}\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-xs text-text-secondary\">{label}</p>\n {icon ? <span className=\"text-text-secondary\">{icon}</span> : null}\n </div>\n <p className=\"mt-1 text-2xl font-semibold text-text-primary\">{value}</p>\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n {delta !== undefined && Number.isFinite(delta) ? (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-medium',\n deltaClass\n )}\n >\n <span aria-hidden=\"true\">{positive ? '▲' : negative ? '▼' : '—'}</span>\n {sign}\n {delta.toFixed(1)}\n {deltaSuffix}\n </span>\n ) : (\n <span />\n )}\n {spark && spark.length > 1 ? (\n <div className=\"w-20 shrink-0\">\n <Sparkline data={spark} tone={sparkTone} height={28} />\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport { AnimatePresence };\n"],"mappings":"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"}
1
+ {"version":3,"file":"viz.js","names":[],"sources":["../../../src/brainyrich/components/viz.tsx"],"sourcesContent":["/**\n * BrainyRich data-viz + polish kit.\n * @module brainyrich/components/viz\n *\n * A tokenized, responsive, dark-mode-first visualization + motion kit built on\n * recharts (^2.15) with lightweight, dependency-free CSS motion. Every colour is read from the\n * platform's SEMANTIC CSS variables at runtime (see {@link useVizColors}) so\n * charts always track the active theme and the emerald BrainyRich brand\n * (`--color-action-primary-bg`). No raw hex/rgb literals live in this file.\n *\n * All chart components are wrapped in a recharts `<ResponsiveContainer>` so they\n * resize with their parent. Motion is tasteful (<=250ms) and disabled under\n * `prefers-reduced-motion`.\n *\n * Page agents: import from `#brainyrich/components/viz` (or the components\n * barrel). Pass values straight from the real `bra*` hooks — this kit only\n * renders; it never fabricates data.\n */\nimport { useEffect, useId, useMemo, useState, type CSSProperties, type ReactNode } from 'react';\nimport {\n Area,\n AreaChart,\n Bar,\n BarChart,\n Cell,\n Line,\n LineChart,\n Pie,\n PieChart,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nfunction cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n\n// ============================================================================\n// Motion primitives (dependency-free, pure CSS — no animation library)\n// ============================================================================\n\n/**\n * SSR-safe `prefers-reduced-motion` hook. Returns `false` on the server and on\n * the first client render, then subscribes to the media query so all motion in\n * this kit is disabled the moment the user asks for reduced motion.\n */\nfunction prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\nexport function useReducedMotion(): boolean {\n // Read the current preference lazily at mount (SSR-safe: `false` on the\n // server), then only update via the media-query change listener.\n const [reduced, setReduced] = useState<boolean>(prefersReducedMotion);\n\n useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n const onChange = (e: MediaQueryListEvent) => setReduced(e.matches);\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, []);\n\n return reduced;\n}\n\n// Enter animation (translateY + opacity) injected once as a real stylesheet so\n// the keyframes + `.br-fade-in` class exist before the first animated paint.\nconst FADE_IN_STYLE_ID = 'brainyrich-viz-motion';\nconst FADE_IN_CSS = `\n@keyframes br-fade-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: none; }\n}\n.br-fade-in {\n animation: br-fade-in 240ms var(--motion-easing-standard, ease-out) both;\n}\n`;\n\nif (typeof document !== 'undefined' && !document.getElementById(FADE_IN_STYLE_ID)) {\n const el = document.createElement('style');\n el.id = FADE_IN_STYLE_ID;\n el.textContent = FADE_IN_CSS;\n document.head.appendChild(el);\n}\n\n// ============================================================================\n// Token → colour resolution\n// ============================================================================\n//\n// recharts needs concrete colour strings (fills, stroke, gradient stops), so we\n// resolve each semantic CSS variable to its computed value off\n// `document.documentElement` and re-read whenever the theme attribute flips.\n// Consumers NEVER hard-code colours: they name a semantic token here.\n\nconst CORE_TOKENS = {\n brand: '--color-action-primary-bg',\n brandBorder: '--color-action-primary-border',\n grid: '--color-chart-grid',\n axis: '--color-chart-axis',\n positive: '--color-chart-positive',\n negative: '--color-chart-negative',\n success: '--color-status-success',\n error: '--color-status-error',\n warning: '--color-status-warning',\n info: '--color-status-info',\n teal: '--color-accent-teal',\n blue: '--color-accent-blue',\n purple: '--color-accent-purple',\n indigo: '--color-accent-indigo',\n textPrimary: '--color-text-primary',\n textSecondary: '--color-text-secondary',\n surface: '--color-bg-elevated',\n border: '--color-border-subtle',\n} as const;\n\ntype CoreToken = keyof typeof CORE_TOKENS;\n\n/** Ordered categorical palette — emerald brand first, then distinct chart hues. */\nconst PALETTE_VARS = [\n '--color-action-primary-bg',\n '--color-chart-2',\n '--color-chart-3',\n '--color-chart-4',\n '--color-chart-5',\n '--color-chart-6',\n '--color-chart-7',\n '--color-chart-8',\n '--color-chart-9',\n '--color-chart-10',\n '--color-chart-11',\n '--color-chart-12',\n];\n\nexport type VizColors = Record<CoreToken, string> & {\n /** Categorical palette (index 0 = emerald brand). */\n palette: string[];\n /** Resolve any semantic tone name to a concrete colour string. */\n tone: (tone?: VizTone) => string;\n};\n\n/** Named tones a datum may request; falls back to the categorical palette. */\nexport type VizTone =\n | 'brand'\n | 'primary'\n | 'success'\n | 'positive'\n | 'error'\n | 'negative'\n | 'warning'\n | 'info'\n | 'teal'\n | 'blue'\n | 'purple'\n | 'indigo'\n | 'neutral';\n\nfunction readVar(name: string): string {\n if (typeof window === 'undefined') return `var(${name})`;\n const v = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n return v || `var(${name})`;\n}\n\n/**\n * Resolve the semantic viz palette from CSS variables and keep it in sync with\n * the active theme. Returns concrete colour strings for use in recharts props.\n */\nexport function useVizColors(): VizColors {\n const [tick, setTick] = useState(0);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const rerender = () => setTick((t) => t + 1);\n const obs = new MutationObserver(rerender);\n obs.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class', 'style'],\n });\n return () => obs.disconnect();\n }, []);\n\n return useMemo(() => {\n void tick; // re-resolve whenever the theme attribute changes\n const core = Object.fromEntries(\n (Object.keys(CORE_TOKENS) as CoreToken[]).map((k) => [k, readVar(CORE_TOKENS[k])])\n ) as Record<CoreToken, string>;\n const palette = PALETTE_VARS.map(readVar);\n\n const tone = (t?: VizTone): string => {\n switch (t) {\n case 'brand':\n case 'primary':\n return core.brand;\n case 'success':\n case 'positive':\n return core.success;\n case 'error':\n case 'negative':\n return core.error;\n case 'warning':\n return core.warning;\n case 'info':\n return core.info;\n case 'teal':\n return core.teal;\n case 'blue':\n return core.blue;\n case 'purple':\n return core.purple;\n case 'indigo':\n return core.indigo;\n case 'neutral':\n return core.textSecondary;\n default:\n return core.brand;\n }\n };\n\n return { ...core, palette, tone };\n }, [tick]);\n}\n\n// ============================================================================\n// Shared chart tooltip (themed — recharts' default is light-only)\n// ============================================================================\n\ninterface TooltipEntry {\n name?: string | number;\n value?: string | number;\n color?: string;\n payload?: Record<string, unknown>;\n}\n\nfunction useTooltipStyles(): { wrapper: CSSProperties; label: CSSProperties } {\n const c = useVizColors();\n return {\n wrapper: {\n background: c.surface,\n border: `1px solid ${c.border}`,\n borderRadius: 10,\n padding: '8px 12px',\n color: c.textPrimary,\n fontSize: 12,\n boxShadow: 'var(--shadow-pop, 0 8px 24px rgba(0,0,0,0.35))',\n },\n label: { color: c.textSecondary, marginBottom: 4, fontSize: 11 },\n };\n}\n\nfunction ChartTooltip({\n active,\n payload,\n label,\n valueFormatter,\n}: {\n active?: boolean;\n payload?: TooltipEntry[];\n label?: string | number;\n valueFormatter?: (v: number) => string;\n}) {\n const styles = useTooltipStyles();\n if (!active || !payload || payload.length === 0) return null;\n return (\n <div style={styles.wrapper} role=\"tooltip\">\n {label !== undefined && label !== '' ? <div style={styles.label}>{label}</div> : null}\n {payload.map((entry, i) => {\n const raw = typeof entry.value === 'number' ? entry.value : Number(entry.value);\n const shown =\n valueFormatter && Number.isFinite(raw) ? valueFormatter(raw) : String(entry.value ?? '');\n return (\n <div key={i} className=\"flex items-center gap-2\">\n {entry.color ? (\n <span\n aria-hidden=\"true\"\n style={{\n width: 8,\n height: 8,\n borderRadius: 9999,\n background: entry.color,\n display: 'inline-block',\n }}\n />\n ) : null}\n {entry.name ? <span style={{ color: styles.label.color }}>{entry.name}:</span> : null}\n <span style={{ fontWeight: 600 }}>{shown}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ============================================================================\n// Motion helpers\n// ============================================================================\n\n/**\n * Staggered enter animation (translateY + opacity). Fully disabled under\n * `prefers-reduced-motion` (renders a plain element). Use `index` to stagger a\n * list/grid of cards.\n */\nexport function FadeIn({\n children,\n index = 0,\n delay = 0,\n className,\n as: Tag = 'div',\n}: {\n children: ReactNode;\n index?: number;\n delay?: number;\n className?: string;\n as?: 'div' | 'li' | 'section';\n}) {\n const reduce = useReducedMotion();\n if (reduce) {\n return <Tag className={className}>{children}</Tag>;\n }\n return (\n <Tag className={cn('br-fade-in', className)} style={{ animationDelay: `${delay + index * 0.04}s` }}>\n {children}\n </Tag>\n );\n}\n\n// ============================================================================\n// GlassCard — sanctioned glass/elevation surface with graceful fallback\n// ============================================================================\n\n/**\n * Floating/hero surface using the sanctioned glass tokens. Falls back to the\n * standard elevated surface when a glass token is absent (older brand builds).\n */\nexport function GlassCard({\n children,\n className,\n glow = false,\n}: {\n children: ReactNode;\n className?: string;\n /** Add a subtle emerald glow ring. */\n glow?: boolean;\n}) {\n return (\n <div\n className={cn(\n 'rounded-2xl border p-5',\n // Glass tokens with hard fallbacks to always-present semantic tokens.\n 'border-[var(--color-border-glass,var(--color-border-subtle))]',\n 'bg-[var(--color-surface-glass,var(--color-bg-elevated))]',\n 'shadow-[var(--shadow-float,var(--shadow-elevation-3))]',\n 'backdrop-blur-[var(--blur-glass,12px)]',\n glow && 'ring-1 ring-[var(--color-action-primary-border)]/40',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// DonutChart\n// ============================================================================\n\nexport interface DonutDatum {\n label: string;\n value: number;\n tone?: VizTone;\n}\n\nexport function DonutChart({\n data,\n centerLabel,\n centerValue,\n legend = true,\n height = 220,\n valueFormatter,\n}: {\n data: DonutDatum[];\n centerLabel?: string;\n centerValue?: string;\n legend?: boolean;\n height?: number;\n valueFormatter?: (v: number) => string;\n}) {\n const c = useVizColors();\n const reduce = useReducedMotion();\n const rows = data.filter((d) => Number.isFinite(d.value) && d.value > 0);\n\n if (rows.length === 0) {\n return <p className=\"text-sm text-text-secondary\">No data.</p>;\n }\n\n const colorFor = (d: DonutDatum, i: number) =>\n d.tone ? c.tone(d.tone) : c.palette[i % c.palette.length];\n\n return (\n <div className=\"flex flex-col items-center gap-4 sm:flex-row sm:items-center\">\n <div className=\"relative\" style={{ width: '100%', maxWidth: 260, height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={rows}\n dataKey=\"value\"\n nameKey=\"label\"\n innerRadius=\"62%\"\n outerRadius=\"90%\"\n paddingAngle={2}\n stroke=\"transparent\"\n isAnimationActive={!reduce}\n animationDuration={250}\n >\n {rows.map((d, i) => (\n <Cell key={d.label} fill={colorFor(d, i)} />\n ))}\n </Pie>\n <Tooltip content={<ChartTooltip valueFormatter={valueFormatter} />} />\n </PieChart>\n </ResponsiveContainer>\n {centerValue || centerLabel ? (\n <div className=\"pointer-events-none absolute inset-0 flex flex-col items-center justify-center\">\n {centerValue ? (\n <span className=\"text-xl font-semibold text-text-primary\">{centerValue}</span>\n ) : null}\n {centerLabel ? (\n <span className=\"text-xs text-text-secondary\">{centerLabel}</span>\n ) : null}\n </div>\n ) : null}\n </div>\n {legend ? (\n <ul className=\"grid flex-1 grid-cols-1 gap-2 sm:grid-cols-2\" aria-label=\"Legend\">\n {rows.map((d, i) => (\n <li key={d.label} className=\"flex items-center gap-2 text-xs\">\n <span\n aria-hidden=\"true\"\n className=\"size-2.5 shrink-0 rounded-full\"\n style={{ background: colorFor(d, i) }}\n />\n <span className=\"truncate text-text-secondary\">{d.label}</span>\n <span className=\"ml-auto font-medium text-text-primary\">\n {valueFormatter ? valueFormatter(d.value) : d.value}\n </span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\n// ============================================================================\n// Sparkline\n// ============================================================================\n\nexport function Sparkline({\n data,\n tone = 'brand',\n height = 40,\n className,\n}: {\n data: number[];\n tone?: VizTone;\n height?: number;\n className?: string;\n}) {\n const c = useVizColors();\n const stroke = c.tone(tone);\n const points = data.filter((n) => Number.isFinite(n));\n const gradientId = `spark-${useId().replace(/:/g, '')}`;\n if (points.length < 2) {\n return <div className={className} style={{ height }} aria-hidden=\"true\" />;\n }\n const chartData = points.map((y, x) => ({ x, y }));\n return (\n <div className={className} style={{ width: '100%', height }} aria-hidden=\"true\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={chartData} margin={{ top: 2, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={stroke} stopOpacity={0.28} />\n <stop offset=\"100%\" stopColor={stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n <Area\n type=\"monotone\"\n dataKey=\"y\"\n stroke={stroke}\n strokeWidth={2}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n dot={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n// ============================================================================\n// ProgressRing — clean SVG radial progress\n// ============================================================================\n\nexport function ProgressRing({\n value,\n label,\n tone = 'brand',\n size = 120,\n strokeWidth = 10,\n}: {\n value: number;\n label?: string;\n tone?: VizTone;\n size?: number;\n strokeWidth?: number;\n}) {\n const c = useVizColors();\n const reduce = useReducedMotion();\n const pct = Math.max(0, Math.min(100, Number.isFinite(value) ? value : 0));\n const r = (size - strokeWidth) / 2;\n const circ = 2 * Math.PI * r;\n const dash = (pct / 100) * circ;\n const stroke = c.tone(tone);\n const targetOffset = circ - dash;\n // Reduced motion renders filled immediately; otherwise start empty and fill\n // on the next frame so the ring animates from 0 → value via CSS.\n const [dashOffset, setDashOffset] = useState(reduce ? targetOffset : circ);\n\n useEffect(() => {\n const id = requestAnimationFrame(() => setDashOffset(targetOffset));\n return () => cancelAnimationFrame(id);\n }, [targetOffset]);\n\n return (\n <div\n className=\"relative inline-flex items-center justify-center\"\n style={{ width: size, height: size }}\n role=\"progressbar\"\n aria-valuenow={Math.round(pct)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label ?? 'Progress'}\n >\n <svg width={size} height={size} className=\"-rotate-90\">\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={c.border}\n strokeWidth={strokeWidth}\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circ}\n strokeDashoffset={dashOffset}\n style={{ transition: reduce ? 'none' : 'stroke-dashoffset 600ms ease' }}\n />\n </svg>\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\n <span className=\"text-lg font-semibold text-text-primary\">{Math.round(pct)}%</span>\n {label ? <span className=\"text-[10px] text-text-secondary\">{label}</span> : null}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// TrendBars — diverging inflow/outflow cashflow bars\n// ============================================================================\n\nexport interface TrendDatum {\n label: string;\n inflow: number;\n outflow: number;\n}\n\nexport function TrendBars({\n data,\n height = 240,\n valueFormatter,\n}: {\n data: TrendDatum[];\n height?: number;\n valueFormatter?: (v: number) => string;\n}) {\n const c = useVizColors();\n const reduce = useReducedMotion();\n const rows = data.filter((d) => Number.isFinite(d.inflow) && Number.isFinite(d.outflow));\n if (rows.length === 0) {\n return <p className=\"text-sm text-text-secondary\">No cashflow data.</p>;\n }\n // Diverging: inflow up (positive), outflow down (negative).\n const chartData = rows.map((d) => ({\n label: d.label,\n inflow: Math.abs(d.inflow),\n outflow: -Math.abs(d.outflow),\n }));\n\n return (\n <div style={{ width: '100%', height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n data={chartData}\n margin={{ top: 8, right: 8, bottom: 0, left: 8 }}\n stackOffset=\"sign\"\n >\n <XAxis\n dataKey=\"label\"\n tick={{ fill: c.textSecondary, fontSize: 11 }}\n axisLine={{ stroke: c.grid }}\n tickLine={false}\n />\n <YAxis\n tick={{ fill: c.textSecondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n width={44}\n tickFormatter={(v: number) =>\n valueFormatter ? valueFormatter(Math.abs(v)) : String(Math.abs(v))\n }\n />\n <ReferenceLine y={0} stroke={c.grid} />\n <Tooltip\n cursor={{ fill: c.border, opacity: 0.25 }}\n content={\n <ChartTooltip\n valueFormatter={(v) =>\n valueFormatter ? valueFormatter(Math.abs(v)) : String(Math.abs(v))\n }\n />\n }\n />\n <Bar\n dataKey=\"inflow\"\n name=\"Inflow\"\n fill={c.positive}\n radius={[4, 4, 0, 0]}\n isAnimationActive={!reduce}\n animationDuration={250}\n />\n <Bar\n dataKey=\"outflow\"\n name=\"Outflow\"\n fill={c.negative}\n radius={[0, 0, 4, 4]}\n isAnimationActive={!reduce}\n animationDuration={250}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n// ============================================================================\n// MiniAreaChart — projection with optional dashed target line\n// ============================================================================\n\nexport interface AreaDatum {\n x: string | number;\n y: number;\n}\n\nexport function MiniAreaChart({\n data,\n target,\n tone = 'brand',\n height = 200,\n valueFormatter,\n}: {\n data: AreaDatum[];\n target?: number;\n tone?: VizTone;\n height?: number;\n valueFormatter?: (v: number) => string;\n}) {\n const c = useVizColors();\n const reduce = useReducedMotion();\n const stroke = c.tone(tone);\n const rows = data.filter((d) => Number.isFinite(d.y));\n const gradientId = `area-${useId().replace(/:/g, '')}`;\n if (rows.length < 2) {\n return <p className=\"text-sm text-text-secondary\">Not enough data to chart.</p>;\n }\n return (\n <div style={{ width: '100%', height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={rows} margin={{ top: 8, right: 8, bottom: 0, left: 8 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={stroke} stopOpacity={0.3} />\n <stop offset=\"100%\" stopColor={stroke} stopOpacity={0.02} />\n </linearGradient>\n </defs>\n <XAxis\n dataKey=\"x\"\n tick={{ fill: c.textSecondary, fontSize: 11 }}\n axisLine={{ stroke: c.grid }}\n tickLine={false}\n />\n <YAxis\n tick={{ fill: c.textSecondary, fontSize: 11 }}\n axisLine={false}\n tickLine={false}\n width={44}\n tickFormatter={(v: number) => (valueFormatter ? valueFormatter(v) : String(v))}\n />\n <Tooltip content={<ChartTooltip valueFormatter={valueFormatter} />} />\n {target !== undefined && Number.isFinite(target) ? (\n <ReferenceLine\n y={target}\n stroke={c.textSecondary}\n strokeDasharray=\"5 4\"\n label={{\n value: valueFormatter ? `Target ${valueFormatter(target)}` : `Target ${target}`,\n position: 'insideTopRight',\n fill: c.textSecondary,\n fontSize: 10,\n }}\n />\n ) : null}\n <Area\n type=\"monotone\"\n dataKey=\"y\"\n stroke={stroke}\n strokeWidth={2}\n fill={`url(#${gradientId})`}\n isAnimationActive={!reduce}\n animationDuration={250}\n dot={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n// ============================================================================\n// LifecycleStepper — horizontal proposal/rebalance lifecycle\n// ============================================================================\n\nconst NEGATIVE_TERMINAL = /reject|cancel|abandon|decline|fail/i;\n\nexport function LifecycleStepper({\n steps,\n current,\n className,\n}: {\n steps: string[];\n current: string;\n className?: string;\n}) {\n const isNegativeTerminal = NEGATIVE_TERMINAL.test(current);\n const currentIndex = steps.findIndex((s) => s.toLowerCase() === current.toLowerCase());\n\n return (\n <ol\n className={cn('flex w-full items-center overflow-x-auto', className)}\n aria-label=\"Lifecycle progress\"\n >\n {steps.map((step, i) => {\n const isLast = i === steps.length - 1;\n const done = currentIndex >= 0 && i < currentIndex;\n const active = currentIndex >= 0 && i === currentIndex && !isNegativeTerminal;\n const state = done ? 'done' : active ? 'active' : 'upcoming';\n return (\n <li\n key={step}\n className=\"flex min-w-fit flex-1 items-center\"\n aria-current={active ? 'step' : undefined}\n >\n <div className=\"flex flex-col items-center gap-1.5 px-1\">\n <span\n className={cn(\n 'flex size-7 items-center justify-center rounded-full border text-xs font-semibold transition-colors',\n state === 'done' &&\n 'border-transparent bg-[var(--color-action-primary-bg)] text-[var(--color-action-primary-text)]',\n state === 'active' &&\n 'border-[var(--color-action-primary-border)] bg-[var(--color-action-primary-bg)]/15 text-[var(--color-action-primary-text)]',\n state === 'upcoming' && 'border-border-subtle bg-bg-sunken text-text-secondary'\n )}\n aria-hidden=\"true\"\n >\n {done ? '✓' : i + 1}\n </span>\n <span\n className={cn(\n 'whitespace-nowrap text-[11px]',\n active ? 'font-medium text-text-primary' : 'text-text-secondary'\n )}\n >\n {step}\n </span>\n </div>\n {!isLast ? (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'mx-1 h-0.5 flex-1 rounded-full',\n done ? 'bg-[var(--color-action-primary-bg)]' : 'bg-border-subtle'\n )}\n />\n ) : null}\n </li>\n );\n })}\n {isNegativeTerminal ? (\n <li className=\"ml-2 flex min-w-fit items-center gap-1.5\" aria-current=\"step\">\n <span className=\"mx-1 h-0.5 w-6 rounded-full bg-status-error-border\" aria-hidden=\"true\" />\n <div className=\"flex flex-col items-center gap-1.5 px-1\">\n <span\n className=\"flex size-7 items-center justify-center rounded-full border border-transparent bg-status-error text-xs font-semibold text-status-error-text\"\n aria-hidden=\"true\"\n >\n ✕\n </span>\n <span className=\"whitespace-nowrap text-[11px] font-medium text-status-error-text\">\n {current}\n </span>\n </div>\n </li>\n ) : null}\n </ol>\n );\n}\n\n// ============================================================================\n// StatTile — premium KPI tile\n// ============================================================================\n\nexport function StatTile({\n label,\n value,\n delta,\n deltaTone,\n deltaSuffix = '%',\n spark,\n sparkTone = 'brand',\n glow = false,\n icon,\n className,\n}: {\n label: string;\n value: string;\n /** Optional signed delta rendered as a chip (icon + sign + status colour). */\n delta?: number;\n /** Override the auto tone derived from the delta sign. */\n deltaTone?: 'positive' | 'negative' | 'neutral';\n deltaSuffix?: string;\n /** Optional inline sparkline series. */\n spark?: number[];\n sparkTone?: VizTone;\n /** Subtle emerald glow ring for hero tiles. */\n glow?: boolean;\n icon?: ReactNode;\n className?: string;\n}) {\n const positive = deltaTone ? deltaTone === 'positive' : (delta ?? 0) > 0;\n const negative = deltaTone ? deltaTone === 'negative' : (delta ?? 0) < 0;\n const deltaClass = positive\n ? 'text-status-success-text bg-status-success-bg'\n : negative\n ? 'text-status-error-text bg-status-error-bg'\n : 'text-text-secondary bg-bg-sunken';\n const sign = delta !== undefined && delta > 0 ? '+' : '';\n\n return (\n <div\n className={cn(\n 'group relative overflow-hidden rounded-xl border border-border-subtle bg-bg-surface p-4 transition-shadow',\n 'motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]',\n glow && 'ring-1 ring-[var(--color-action-primary-border)]/40',\n className\n )}\n >\n {glow ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -right-8 -top-8 size-24 rounded-full bg-[var(--color-action-primary-bg)]/15 blur-2xl\"\n />\n ) : null}\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-xs text-text-secondary\">{label}</p>\n {icon ? <span className=\"text-text-secondary\">{icon}</span> : null}\n </div>\n <p className=\"mt-1 text-2xl font-semibold text-text-primary\">{value}</p>\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n {delta !== undefined && Number.isFinite(delta) ? (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-medium',\n deltaClass\n )}\n >\n <span aria-hidden=\"true\">{positive ? '▲' : negative ? '▼' : '—'}</span>\n {sign}\n {delta.toFixed(1)}\n {deltaSuffix}\n </span>\n ) : (\n <span />\n )}\n {spark && spark.length > 1 ? (\n <div className=\"w-20 shrink-0\">\n <Sparkline data={spark} tone={sparkTone} height={28} />\n </div>\n ) : null}\n </div>\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
@@ -1 +1 @@
1
- {"version":3,"file":"_shared.js","names":[],"sources":["../../../src/brainyrich/pages/_shared.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { ArrowDownRight, ArrowUpRight, Inbox, Minus, RefreshCw, TriangleAlert } from 'lucide-react';\nimport { motion, useReducedMotion } from 'framer-motion';\nimport { Badge, Button, Card, CardContent, Skeleton } from '@burdenoff/fe-libs/ui';\n\n// ============================================================================\n// Formatters\n// ============================================================================\n\n/** USD currency, no cents. Pass a currency code to override. */\nexport function formatMoney(value: number, currency = 'USD'): string {\n if (!Number.isFinite(value)) return '—';\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n }).format(value);\n}\n\n/** Compact money/number, e.g. 1.2M, 950K. */\nexport function formatCompact(value: number, currency?: string): string {\n if (!Number.isFinite(value)) return '—';\n return new Intl.NumberFormat('en-US', {\n notation: 'compact',\n maximumFractionDigits: 1,\n ...(currency ? { style: 'currency', currency } : {}),\n }).format(value);\n}\n\n/** Percentage from a whole-number percent (e.g. 12.5 → \"12.5%\"). */\nexport function formatPct(value: number | null | undefined, fractionDigits = 1): string {\n if (value === null || value === undefined || !Number.isFinite(value)) return '—';\n return `${value.toFixed(fractionDigits)}%`;\n}\n\n/**\n * Guarded date formatter. Only wraps a present ISO string in `new Date()` at\n * render time — never calls `.getTime()` on a raw scalar and never `new Date(0)`.\n * Returns an em-dash for absent/invalid values.\n */\nexport function formatDate(iso?: string | null): string {\n if (!iso) return '—';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '—';\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }).format(d);\n}\n\n// ============================================================================\n// Status → badge variant (semantic, no raw colors)\n// ============================================================================\n\n/**\n * Map a domain status/severity string to a shadcn Badge variant. Accepts the\n * Bra* enum members (ACTIVE, AT_RISK, HIGH, …) case-insensitively so pages can\n * pass raw enum values.\n */\nexport function statusBadgeVariant(\n status: string\n): 'default' | 'secondary' | 'destructive' | 'outline' {\n const s = status.toUpperCase();\n if (['ACTIVE', 'ACHIEVED', 'ON_TRACK', 'AHEAD', 'RESOLVED', 'EXECUTED', 'APPROVED'].includes(s))\n return 'default';\n if (['AT_RISK', 'HIGH', 'CRITICAL', 'ABANDONED', 'REJECTED', 'CANCELLED', 'CLOSED'].includes(s))\n return 'destructive';\n if (\n ['ONBOARDING', 'PROSPECT', 'ON_HOLD', 'BEHIND', 'DRAFT', 'PROPOSED', 'MEDIUM', 'LOW'].includes(\n s\n )\n )\n return 'secondary';\n return 'outline';\n}\n\n/** Semantic text-color token for a signed delta (color is never the only signal). */\nexport function deltaToneClass(value: number): string {\n if (value > 0) return 'text-status-success-text';\n if (value < 0) return 'text-status-error-text';\n return 'text-text-secondary';\n}\n\n// ============================================================================\n// Section shell + KPIs\n// ============================================================================\n\ninterface SectionShellProps {\n title: string;\n description: string;\n actionLabel?: string;\n onAction?: () => void;\n actions?: ReactNode;\n badges?: string[];\n children: ReactNode;\n}\n\nexport function SectionShell({\n title,\n description,\n actionLabel,\n onAction,\n actions,\n badges = [],\n children,\n}: SectionShellProps) {\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold text-text-primary\">{title}</h1>\n <p className=\"text-sm text-text-secondary\">{description}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n {badges.map((badge) => (\n <Badge key={badge} variant=\"secondary\">\n {badge}\n </Badge>\n ))}\n {actions}\n {actionLabel ? (\n <Button size=\"sm\" onClick={onAction}>\n {actionLabel}\n </Button>\n ) : null}\n </div>\n </div>\n {children}\n </div>\n );\n}\n\nexport interface KpiItem {\n label: string;\n value: string;\n /** Optional signed delta rendered as a DeltaBadge (icon + sign + color). */\n delta?: number;\n /** Optional free-text trend line (neutral tone unless deltaTone provided). */\n trend?: string;\n deltaTone?: 'positive' | 'negative' | 'neutral';\n}\n\nexport function KpiGrid({ items }: { items: KpiItem[] }) {\n const reduce = useReducedMotion();\n return (\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n {items.map((item, i) => (\n <motion.div\n key={item.label}\n initial={reduce ? false : { opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.25, ease: 'easeOut', delay: i * 0.04 }}\n >\n <Card className=\"h-full transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]\">\n <CardContent className=\"space-y-1.5 p-4\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {item.label}\n </p>\n <p className=\"text-2xl font-semibold tracking-tight text-text-primary\">\n {item.value}\n </p>\n {item.delta !== undefined ? (\n <DeltaBadge value={item.delta} />\n ) : item.trend ? (\n <p\n className={\n item.deltaTone === 'positive'\n ? 'text-xs text-status-success-text'\n : item.deltaTone === 'negative'\n ? 'text-xs text-status-error-text'\n : 'text-xs text-text-secondary'\n }\n >\n {item.trend}\n </p>\n ) : null}\n </CardContent>\n </Card>\n </motion.div>\n ))}\n </div>\n );\n}\n\n// ============================================================================\n// Delta badge — icon + sign + semantic color (color never the only signal)\n// ============================================================================\n\nexport function DeltaBadge({\n value,\n suffix = '%',\n className = '',\n}: {\n value: number;\n suffix?: string;\n className?: string;\n}) {\n const positive = value > 0;\n const negative = value < 0;\n const Icon = positive ? ArrowUpRight : negative ? ArrowDownRight : Minus;\n const tone = positive\n ? 'text-status-success-text bg-status-success-bg'\n : negative\n ? 'text-status-error-text bg-status-error-bg'\n : 'text-text-secondary bg-bg-sunken';\n const sign = positive ? '+' : '';\n return (\n <span\n className={`inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-medium ${tone} ${className}`}\n >\n <Icon className=\"size-3\" aria-hidden=\"true\" />\n {sign}\n {Number.isFinite(value) ? value.toFixed(1) : '—'}\n {suffix}\n </span>\n );\n}\n\n// ============================================================================\n// Allocation bars — tokenized horizontal bar primitive\n// ============================================================================\n\nexport type AllocationTone = 'default' | 'positive' | 'negative' | 'warning' | 'accent';\n\nconst TONE_FILL: Record<AllocationTone, string> = {\n default: 'bg-primary',\n positive: 'bg-status-success-bg',\n negative: 'bg-status-error-bg',\n warning: 'bg-status-warning-bg',\n accent: 'bg-accent-teal',\n};\n\nexport interface AllocationDatum {\n label: string;\n /** Percentage 0–100 for the bar width. */\n value: number;\n tone?: AllocationTone;\n /** Optional right-aligned caption (e.g. formatted money). Defaults to the %. */\n caption?: string;\n}\n\nexport function AllocationBars({ data }: { data: AllocationDatum[] }) {\n const reduce = useReducedMotion();\n const rows = data.filter((d) => Number.isFinite(d.value));\n if (rows.length === 0) {\n return <p className=\"text-sm text-text-secondary\">No allocation data.</p>;\n }\n return (\n <div className=\"space-y-3.5\">\n {rows.map((d) => {\n const width = Math.max(0, Math.min(100, d.value));\n return (\n <div key={d.label} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"font-medium text-text-primary\">{d.label}</span>\n <span className=\"tabular-nums text-text-secondary\">\n {d.caption ?? formatPct(d.value)}\n </span>\n </div>\n <div\n className=\"h-2.5 w-full overflow-hidden rounded-full bg-bg-sunken\"\n role=\"progressbar\"\n aria-valuenow={Math.round(width)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={d.label}\n >\n <motion.div\n className={`h-full rounded-full ${TONE_FILL[d.tone ?? 'default']}`}\n initial={reduce ? false : { width: 0 }}\n animate={{ width: `${width}%` }}\n transition={{ duration: 0.4, ease: 'easeOut' }}\n />\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ============================================================================\n// Empty / Loading / Error states (designed, shared)\n// ============================================================================\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n}: {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n}) {\n return (\n <div 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\">\n <div className=\"mb-4 flex size-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n {icon ?? <Inbox className=\"size-6\" aria-hidden=\"true\" />}\n </div>\n <h3 className=\"text-base font-semibold text-text-primary\">{title}</h3>\n {description ? (\n <p className=\"mt-1 max-w-md text-sm text-text-secondary\">{description}</p>\n ) : null}\n {action ? <div className=\"mt-4\">{action}</div> : null}\n </div>\n );\n}\n\nexport function LoadingState({ rows = 4 }: { rows?: number }) {\n return (\n <div className=\"space-y-3\" aria-busy=\"true\" aria-live=\"polite\">\n {Array.from({ length: rows }).map((_, i) => (\n <div\n key={i}\n className=\"flex items-center gap-4 rounded-lg border border-border-subtle bg-bg-surface p-4\"\n >\n <Skeleton className=\"size-10 rounded-full\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n <Skeleton className=\"h-4 w-16\" />\n </div>\n ))}\n </div>\n );\n}\n\nexport function ErrorState({\n title = 'Something went wrong',\n description = 'We could not load this data. Please try again.',\n onRetry,\n}: {\n title?: string;\n description?: string;\n onRetry?: () => void;\n}) {\n return (\n <div 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\">\n <div className=\"mb-4 flex size-12 items-center justify-center rounded-full bg-bg-surface text-status-error-text\">\n <TriangleAlert className=\"size-6\" aria-hidden=\"true\" />\n </div>\n <h3 className=\"text-base font-semibold text-text-primary\">{title}</h3>\n <p className=\"mt-1 max-w-md text-sm text-text-secondary\">{description}</p>\n {onRetry ? (\n <Button variant=\"outline\" size=\"sm\" className=\"mt-4\" onClick={onRetry}>\n <RefreshCw className=\"size-4\" aria-hidden=\"true\" />\n Retry\n </Button>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_shared.js","names":[],"sources":["../../../src/brainyrich/pages/_shared.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from 'react';\nimport { ArrowDownRight, ArrowUpRight, Inbox, Minus, RefreshCw, TriangleAlert } from 'lucide-react';\nimport { Badge, Button, Card, CardContent, Skeleton } from '@burdenoff/fe-libs/ui';\nimport { FadeIn, useReducedMotion } from '../components/viz';\n\n// ============================================================================\n// Formatters\n// ============================================================================\n\n/** USD currency, no cents. Pass a currency code to override. */\nexport function formatMoney(value: number, currency = 'USD'): string {\n if (!Number.isFinite(value)) return '—';\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n }).format(value);\n}\n\n/** Compact money/number, e.g. 1.2M, 950K. */\nexport function formatCompact(value: number, currency?: string): string {\n if (!Number.isFinite(value)) return '—';\n return new Intl.NumberFormat('en-US', {\n notation: 'compact',\n maximumFractionDigits: 1,\n ...(currency ? { style: 'currency', currency } : {}),\n }).format(value);\n}\n\n/** Percentage from a whole-number percent (e.g. 12.5 → \"12.5%\"). */\nexport function formatPct(value: number | null | undefined, fractionDigits = 1): string {\n if (value === null || value === undefined || !Number.isFinite(value)) return '—';\n return `${value.toFixed(fractionDigits)}%`;\n}\n\n/**\n * Guarded date formatter. Only wraps a present ISO string in `new Date()` at\n * render time — never calls `.getTime()` on a raw scalar and never `new Date(0)`.\n * Returns an em-dash for absent/invalid values.\n */\nexport function formatDate(iso?: string | null): string {\n if (!iso) return '—';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '—';\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n }).format(d);\n}\n\n// ============================================================================\n// Status → badge variant (semantic, no raw colors)\n// ============================================================================\n\n/**\n * Map a domain status/severity string to a shadcn Badge variant. Accepts the\n * Bra* enum members (ACTIVE, AT_RISK, HIGH, …) case-insensitively so pages can\n * pass raw enum values.\n */\nexport function statusBadgeVariant(\n status: string\n): 'default' | 'secondary' | 'destructive' | 'outline' {\n const s = status.toUpperCase();\n if (['ACTIVE', 'ACHIEVED', 'ON_TRACK', 'AHEAD', 'RESOLVED', 'EXECUTED', 'APPROVED'].includes(s))\n return 'default';\n if (['AT_RISK', 'HIGH', 'CRITICAL', 'ABANDONED', 'REJECTED', 'CANCELLED', 'CLOSED'].includes(s))\n return 'destructive';\n if (\n ['ONBOARDING', 'PROSPECT', 'ON_HOLD', 'BEHIND', 'DRAFT', 'PROPOSED', 'MEDIUM', 'LOW'].includes(\n s\n )\n )\n return 'secondary';\n return 'outline';\n}\n\n/** Semantic text-color token for a signed delta (color is never the only signal). */\nexport function deltaToneClass(value: number): string {\n if (value > 0) return 'text-status-success-text';\n if (value < 0) return 'text-status-error-text';\n return 'text-text-secondary';\n}\n\n// ============================================================================\n// Section shell + KPIs\n// ============================================================================\n\ninterface SectionShellProps {\n title: string;\n description: string;\n actionLabel?: string;\n onAction?: () => void;\n actions?: ReactNode;\n badges?: string[];\n children: ReactNode;\n}\n\nexport function SectionShell({\n title,\n description,\n actionLabel,\n onAction,\n actions,\n badges = [],\n children,\n}: SectionShellProps) {\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold text-text-primary\">{title}</h1>\n <p className=\"text-sm text-text-secondary\">{description}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n {badges.map((badge) => (\n <Badge key={badge} variant=\"secondary\">\n {badge}\n </Badge>\n ))}\n {actions}\n {actionLabel ? (\n <Button size=\"sm\" onClick={onAction}>\n {actionLabel}\n </Button>\n ) : null}\n </div>\n </div>\n {children}\n </div>\n );\n}\n\nexport interface KpiItem {\n label: string;\n value: string;\n /** Optional signed delta rendered as a DeltaBadge (icon + sign + color). */\n delta?: number;\n /** Optional free-text trend line (neutral tone unless deltaTone provided). */\n trend?: string;\n deltaTone?: 'positive' | 'negative' | 'neutral';\n}\n\nexport function KpiGrid({ items }: { items: KpiItem[] }) {\n return (\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n {items.map((item, i) => (\n <FadeIn key={item.label} index={i}>\n <Card className=\"h-full transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]\">\n <CardContent className=\"space-y-1.5 p-4\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {item.label}\n </p>\n <p className=\"text-2xl font-semibold tracking-tight text-text-primary\">\n {item.value}\n </p>\n {item.delta !== undefined ? (\n <DeltaBadge value={item.delta} />\n ) : item.trend ? (\n <p\n className={\n item.deltaTone === 'positive'\n ? 'text-xs text-status-success-text'\n : item.deltaTone === 'negative'\n ? 'text-xs text-status-error-text'\n : 'text-xs text-text-secondary'\n }\n >\n {item.trend}\n </p>\n ) : null}\n </CardContent>\n </Card>\n </FadeIn>\n ))}\n </div>\n );\n}\n\n// ============================================================================\n// Delta badge — icon + sign + semantic color (color never the only signal)\n// ============================================================================\n\nexport function DeltaBadge({\n value,\n suffix = '%',\n className = '',\n}: {\n value: number;\n suffix?: string;\n className?: string;\n}) {\n const positive = value > 0;\n const negative = value < 0;\n const Icon = positive ? ArrowUpRight : negative ? ArrowDownRight : Minus;\n const tone = positive\n ? 'text-status-success-text bg-status-success-bg'\n : negative\n ? 'text-status-error-text bg-status-error-bg'\n : 'text-text-secondary bg-bg-sunken';\n const sign = positive ? '+' : '';\n return (\n <span\n className={`inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-medium ${tone} ${className}`}\n >\n <Icon className=\"size-3\" aria-hidden=\"true\" />\n {sign}\n {Number.isFinite(value) ? value.toFixed(1) : '—'}\n {suffix}\n </span>\n );\n}\n\n// ============================================================================\n// Allocation bars — tokenized horizontal bar primitive\n// ============================================================================\n\nexport type AllocationTone = 'default' | 'positive' | 'negative' | 'warning' | 'accent';\n\nconst TONE_FILL: Record<AllocationTone, string> = {\n default: 'bg-primary',\n positive: 'bg-status-success-bg',\n negative: 'bg-status-error-bg',\n warning: 'bg-status-warning-bg',\n accent: 'bg-accent-teal',\n};\n\nexport interface AllocationDatum {\n label: string;\n /** Percentage 0–100 for the bar width. */\n value: number;\n tone?: AllocationTone;\n /** Optional right-aligned caption (e.g. formatted money). Defaults to the %. */\n caption?: string;\n}\n\n/**\n * Single allocation bar fill. Starts at 0 width and grows to `width`% after\n * mount via a CSS transition; instant (no transition) under reduced motion.\n */\nfunction AllocationFill({ width, className }: { width: number; className: string }) {\n const reduce = useReducedMotion();\n // Reduced motion starts at the final width (instant); otherwise start at 0 and\n // grow on the next frame via the CSS width transition.\n const [w, setW] = useState(reduce ? width : 0);\n\n useEffect(() => {\n const id = requestAnimationFrame(() => setW(width));\n return () => cancelAnimationFrame(id);\n }, [width]);\n\n return (\n <div\n className={className}\n style={{ width: `${w}%`, transition: reduce ? 'none' : 'width 500ms ease' }}\n />\n );\n}\n\nexport function AllocationBars({ data }: { data: AllocationDatum[] }) {\n const rows = data.filter((d) => Number.isFinite(d.value));\n if (rows.length === 0) {\n return <p className=\"text-sm text-text-secondary\">No allocation data.</p>;\n }\n return (\n <div className=\"space-y-3.5\">\n {rows.map((d) => {\n const width = Math.max(0, Math.min(100, d.value));\n return (\n <div key={d.label} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"font-medium text-text-primary\">{d.label}</span>\n <span className=\"tabular-nums text-text-secondary\">\n {d.caption ?? formatPct(d.value)}\n </span>\n </div>\n <div\n className=\"h-2.5 w-full overflow-hidden rounded-full bg-bg-sunken\"\n role=\"progressbar\"\n aria-valuenow={Math.round(width)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={d.label}\n >\n <AllocationFill\n width={width}\n className={`h-full rounded-full ${TONE_FILL[d.tone ?? 'default']}`}\n />\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ============================================================================\n// Empty / Loading / Error states (designed, shared)\n// ============================================================================\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n}: {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n}) {\n return (\n <div 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\">\n <div className=\"mb-4 flex size-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n {icon ?? <Inbox className=\"size-6\" aria-hidden=\"true\" />}\n </div>\n <h3 className=\"text-base font-semibold text-text-primary\">{title}</h3>\n {description ? (\n <p className=\"mt-1 max-w-md text-sm text-text-secondary\">{description}</p>\n ) : null}\n {action ? <div className=\"mt-4\">{action}</div> : null}\n </div>\n );\n}\n\nexport function LoadingState({ rows = 4 }: { rows?: number }) {\n return (\n <div className=\"space-y-3\" aria-busy=\"true\" aria-live=\"polite\">\n {Array.from({ length: rows }).map((_, i) => (\n <div\n key={i}\n className=\"flex items-center gap-4 rounded-lg border border-border-subtle bg-bg-surface p-4\"\n >\n <Skeleton className=\"size-10 rounded-full\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n <Skeleton className=\"h-4 w-16\" />\n </div>\n ))}\n </div>\n );\n}\n\nexport function ErrorState({\n title = 'Something went wrong',\n description = 'We could not load this data. Please try again.',\n onRetry,\n}: {\n title?: string;\n description?: string;\n onRetry?: () => void;\n}) {\n return (\n <div 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\">\n <div className=\"mb-4 flex size-12 items-center justify-center rounded-full bg-bg-surface text-status-error-text\">\n <TriangleAlert className=\"size-6\" aria-hidden=\"true\" />\n </div>\n <h3 className=\"text-base font-semibold text-text-primary\">{title}</h3>\n <p className=\"mt-1 max-w-md text-sm text-text-secondary\">{description}</p>\n {onRetry ? (\n <Button variant=\"outline\" size=\"sm\" className=\"mt-4\" onClick={onRetry}>\n <RefreshCw className=\"size-4\" aria-hidden=\"true\" />\n Retry\n </Button>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-brainyrich",
3
- "version": "2026.706.3",
3
+ "version": "2026.706.4",
4
4
  "description": "Burdenoff BrainyRich Microfrontend",
5
5
  "type": "module",
6
6
  "files": [
@@ -40,10 +40,8 @@
40
40
  "dependencies": {
41
41
  "@apollo/client": "^4.0.11",
42
42
  "@burdenoff/fe-libs": "2026.704.3",
43
- "@emotion/is-prop-valid": "^1.3.1",
44
43
  "@tanstack/react-query": "^5.90.16",
45
44
  "clsx": "^2.1.1",
46
- "framer-motion": "^12.0.0",
47
45
  "graphql": "^16.10.0",
48
46
  "lucide-react": "^0.468.0",
49
47
  "react": "^19.0.0",
@@ -1,13 +0,0 @@
1
- import { __esmMin as e, __exportAll as t } from "../../../../_virtual/_rolldown/runtime.js";
2
- import { init_emotion_memoize_esm as n, memoize as r } from "../../memoize/dist/emotion-memoize.esm.js";
3
- //#region node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js
4
- var i = /* @__PURE__ */ t({ default: () => o }), a, o, s = e((() => {
5
- n(), a = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|popover|popoverTarget|popoverTargetAction|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/, o = /* @__PURE__ */ r(function(e) {
6
- return a.test(e) || e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && e.charCodeAt(2) < 91;
7
- });
8
- }));
9
- //#endregion
10
- s();
11
- export { i as emotion_is_prop_valid_esm_exports, s as init_emotion_is_prop_valid_esm };
12
-
13
- //# sourceMappingURL=emotion-is-prop-valid.esm.js.map