@projectcor/maia-components 2.11.31 → 2.11.32-1

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 (32) hide show
  1. package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +33 -0
  2. package/lib/components/atoms/icons/index.js +2 -1
  3. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +4 -2
  4. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +6 -2
  5. package/lib/components/molecules/ChatAIHome/styles.js +14 -7
  6. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +178 -165
  7. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +197 -61
  8. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +28 -15
  9. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +91 -18
  10. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +17 -2
  11. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +16 -0
  12. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +12 -0
  13. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +13 -0
  14. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +3 -0
  15. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +57 -0
  16. package/lib/components/molecules/ChatAIModal/layout.js +35 -0
  17. package/lib/hooks/useChatManager/useChatManager.js +97 -23
  18. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +145 -73
  19. package/lib/hooks/useProjectSearch.js +11 -4
  20. package/lib/hooks/useSmoothStreamText/index.js +2 -0
  21. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +189 -0
  22. package/lib/hooks/useStreamingMessage/index.js +3 -0
  23. package/lib/hooks/useStreamingMessage/streamingStore.js +69 -0
  24. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +22 -0
  25. package/lib/lang/br/index.js +5 -1
  26. package/lib/lang/en/index.js +5 -1
  27. package/lib/lang/es/index.js +5 -1
  28. package/lib/lang/fr/index.js +5 -1
  29. package/lib/services/maia/Orchestrator/orchestrator.js +6 -4
  30. package/lib/services/query/projectSearchByValueQuery.js +2 -2
  31. package/lib/types/Project.js +1 -1
  32. package/package.json +1 -1
@@ -0,0 +1,57 @@
1
+ import { useSpring } from 'framer-motion';
2
+ import { useCallback, useEffect, useRef } from 'react';
3
+ import { FLOATING_DRAG_TILT_DX, FLOATING_DRAG_TILT_DY, FLOATING_DRAG_TILT_IDLE_MS, FLOATING_DRAG_TILT_SPRING, clampFloatingDragTilt } from './constants';
4
+ export function useFloatingPanelDragTilt(isFloating) {
5
+ var tilt = useSpring(0, FLOATING_DRAG_TILT_SPRING);
6
+ var lastPointerDragRef = useRef(null);
7
+ var idleTimerRef = useRef(null);
8
+ var clearIdleTimer = useCallback(function () {
9
+ if (idleTimerRef.current) {
10
+ clearTimeout(idleTimerRef.current);
11
+ idleTimerRef.current = null;
12
+ }
13
+ }, []);
14
+ useEffect(function () {
15
+ if (!isFloating) {
16
+ clearIdleTimer();
17
+ tilt.set(0);
18
+ lastPointerDragRef.current = null;
19
+ }
20
+ }, [isFloating, tilt, clearIdleTimer]);
21
+ var startPointerTracking = useCallback(function (clientX, clientY) {
22
+ lastPointerDragRef.current = {
23
+ x: clientX,
24
+ y: clientY
25
+ };
26
+ tilt.set(0);
27
+ }, [tilt]);
28
+ var samplePointerMove = useCallback(function (clientX, clientY) {
29
+ var lastPtr = lastPointerDragRef.current;
30
+ if (lastPtr) {
31
+ var dx = clientX - lastPtr.x;
32
+ var dy = clientY - lastPtr.y;
33
+ tilt.set(clampFloatingDragTilt(dx * FLOATING_DRAG_TILT_DX - dy * FLOATING_DRAG_TILT_DY));
34
+ }
35
+ lastPointerDragRef.current = {
36
+ x: clientX,
37
+ y: clientY
38
+ };
39
+ clearIdleTimer();
40
+ idleTimerRef.current = setTimeout(function () {
41
+ tilt.set(0);
42
+ idleTimerRef.current = null;
43
+ }, FLOATING_DRAG_TILT_IDLE_MS);
44
+ }, [tilt, clearIdleTimer]);
45
+ var endPointerTracking = useCallback(function () {
46
+ clearIdleTimer();
47
+ lastPointerDragRef.current = null;
48
+ tilt.set(0);
49
+ }, [tilt, clearIdleTimer]);
50
+ return {
51
+ tiltMotion: tilt,
52
+ startPointerTracking: startPointerTracking,
53
+ samplePointerMove: samplePointerMove,
54
+ endPointerTracking: endPointerTracking
55
+ };
56
+ }
57
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTcHJpbmciLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZVJlZiIsIkZMT0FUSU5HX0RSQUdfVElMVF9EWCIsIkZMT0FUSU5HX0RSQUdfVElMVF9EWSIsIkZMT0FUSU5HX0RSQUdfVElMVF9JRExFX01TIiwiRkxPQVRJTkdfRFJBR19USUxUX1NQUklORyIsImNsYW1wRmxvYXRpbmdEcmFnVGlsdCIsInVzZUZsb2F0aW5nUGFuZWxEcmFnVGlsdCIsImlzRmxvYXRpbmciLCJ0aWx0IiwibGFzdFBvaW50ZXJEcmFnUmVmIiwiaWRsZVRpbWVyUmVmIiwiY2xlYXJJZGxlVGltZXIiLCJjdXJyZW50IiwiY2xlYXJUaW1lb3V0Iiwic2V0Iiwic3RhcnRQb2ludGVyVHJhY2tpbmciLCJjbGllbnRYIiwiY2xpZW50WSIsIngiLCJ5Iiwic2FtcGxlUG9pbnRlck1vdmUiLCJsYXN0UHRyIiwiZHgiLCJkeSIsInNldFRpbWVvdXQiLCJlbmRQb2ludGVyVHJhY2tpbmciLCJ0aWx0TW90aW9uIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRBSU1vZGFsL2Zsb2F0aW5nUGFuZWxNb3Rpb24vdXNlRmxvYXRpbmdQYW5lbERyYWdUaWx0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVNwcmluZyB9IGZyb20gJ2ZyYW1lci1tb3Rpb24nXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHtcbiAgRkxPQVRJTkdfRFJBR19USUxUX0RYLFxuICBGTE9BVElOR19EUkFHX1RJTFRfRFksXG4gIEZMT0FUSU5HX0RSQUdfVElMVF9JRExFX01TLFxuICBGTE9BVElOR19EUkFHX1RJTFRfU1BSSU5HLFxuICBjbGFtcEZsb2F0aW5nRHJhZ1RpbHQsXG59IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlRmxvYXRpbmdQYW5lbERyYWdUaWx0KGlzRmxvYXRpbmc6IGJvb2xlYW4pIHtcbiAgY29uc3QgdGlsdCA9IHVzZVNwcmluZygwLCBGTE9BVElOR19EUkFHX1RJTFRfU1BSSU5HKVxuICBjb25zdCBsYXN0UG9pbnRlckRyYWdSZWYgPSB1c2VSZWY8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbD4obnVsbClcbiAgY29uc3QgaWRsZVRpbWVyUmVmID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBjbGVhcklkbGVUaW1lciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoaWRsZVRpbWVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpZGxlVGltZXJSZWYuY3VycmVudClcbiAgICAgIGlkbGVUaW1lclJlZi5jdXJyZW50ID0gbnVsbFxuICAgIH1cbiAgfSwgW10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzRmxvYXRpbmcpIHtcbiAgICAgIGNsZWFySWRsZVRpbWVyKClcbiAgICAgIHRpbHQuc2V0KDApXG4gICAgICBsYXN0UG9pbnRlckRyYWdSZWYuY3VycmVudCA9IG51bGxcbiAgICB9XG4gIH0sIFtpc0Zsb2F0aW5nLCB0aWx0LCBjbGVhcklkbGVUaW1lcl0pXG5cbiAgY29uc3Qgc3RhcnRQb2ludGVyVHJhY2tpbmcgPSB1c2VDYWxsYmFjayhcbiAgICAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpID0+IHtcbiAgICAgIGxhc3RQb2ludGVyRHJhZ1JlZi5jdXJyZW50ID0geyB4OiBjbGllbnRYLCB5OiBjbGllbnRZIH1cbiAgICAgIHRpbHQuc2V0KDApXG4gICAgfSxcbiAgICBbdGlsdF1cbiAgKVxuXG4gIGNvbnN0IHNhbXBsZVBvaW50ZXJNb3ZlID0gdXNlQ2FsbGJhY2soXG4gICAgKGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBsYXN0UHRyID0gbGFzdFBvaW50ZXJEcmFnUmVmLmN1cnJlbnRcbiAgICAgIGlmIChsYXN0UHRyKSB7XG4gICAgICAgIGNvbnN0IGR4ID0gY2xpZW50WCAtIGxhc3RQdHIueFxuICAgICAgICBjb25zdCBkeSA9IGNsaWVudFkgLSBsYXN0UHRyLnlcbiAgICAgICAgdGlsdC5zZXQoY2xhbXBGbG9hdGluZ0RyYWdUaWx0KGR4ICogRkxPQVRJTkdfRFJBR19USUxUX0RYIC0gZHkgKiBGTE9BVElOR19EUkFHX1RJTFRfRFkpKVxuICAgICAgfVxuICAgICAgbGFzdFBvaW50ZXJEcmFnUmVmLmN1cnJlbnQgPSB7IHg6IGNsaWVudFgsIHk6IGNsaWVudFkgfVxuXG4gICAgICBjbGVhcklkbGVUaW1lcigpXG4gICAgICBpZGxlVGltZXJSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aWx0LnNldCgwKVxuICAgICAgICBpZGxlVGltZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH0sIEZMT0FUSU5HX0RSQUdfVElMVF9JRExFX01TKVxuICAgIH0sXG4gICAgW3RpbHQsIGNsZWFySWRsZVRpbWVyXVxuICApXG5cbiAgY29uc3QgZW5kUG9pbnRlclRyYWNraW5nID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNsZWFySWRsZVRpbWVyKClcbiAgICBsYXN0UG9pbnRlckRyYWdSZWYuY3VycmVudCA9IG51bGxcbiAgICB0aWx0LnNldCgwKVxuICB9LCBbdGlsdCwgY2xlYXJJZGxlVGltZXJdKVxuXG4gIHJldHVybiB7XG4gICAgdGlsdE1vdGlvbjogdGlsdCxcbiAgICBzdGFydFBvaW50ZXJUcmFja2luZyxcbiAgICBzYW1wbGVQb2ludGVyTW92ZSxcbiAgICBlbmRQb2ludGVyVHJhY2tpbmcsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsU0FBUyxRQUFRLGVBQWU7QUFDekMsU0FBU0MsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLE1BQU0sUUFBUSxPQUFPO0FBRXRE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
@@ -0,0 +1,35 @@
1
+ /** Ancho del panel flotante en px: base y escalado en pantallas muy anchas */
2
+ export var MAIA_FLOATING_PANEL_WIDTH_PX = {
3
+ "default": 480,
4
+ large: 600,
5
+ xxl: 720
6
+ };
7
+
8
+ /** Alto del panel flotante en px: base y escalado en pantallas muy anchas (el CSS aplica max-height: 85vh) */
9
+ export var MAIA_FLOATING_PANEL_HEIGHT_PX = {
10
+ "default": 620,
11
+ large: 720,
12
+ xxl: 960
13
+ };
14
+
15
+ /** Viewport mínimo (ancho) para usar medidas `large` */
16
+ export var MAIA_FLOATING_BREAKPOINT_LARGE = 1920;
17
+
18
+ /** Viewport mínimo (ancho) para usar medidas `xxl` */
19
+ export var MAIA_FLOATING_BREAKPOINT_XXL = 2560;
20
+
21
+ /** Ancho efectivo del panel (misma lógica que los @media del CSS) */
22
+ export function getMaiaFloatingPanelWidthPx() {
23
+ if (typeof window === 'undefined') {
24
+ return MAIA_FLOATING_PANEL_WIDTH_PX["default"];
25
+ }
26
+ var vw = window.innerWidth;
27
+ if (vw >= MAIA_FLOATING_BREAKPOINT_XXL) {
28
+ return MAIA_FLOATING_PANEL_WIDTH_PX.xxl;
29
+ }
30
+ if (vw >= MAIA_FLOATING_BREAKPOINT_LARGE) {
31
+ return MAIA_FLOATING_PANEL_WIDTH_PX.large;
32
+ }
33
+ return MAIA_FLOATING_PANEL_WIDTH_PX["default"];
34
+ }
35
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQUlBX0ZMT0FUSU5HX1BBTkVMX1dJRFRIX1BYIiwibGFyZ2UiLCJ4eGwiLCJNQUlBX0ZMT0FUSU5HX1BBTkVMX0hFSUdIVF9QWCIsIk1BSUFfRkxPQVRJTkdfQlJFQUtQT0lOVF9MQVJHRSIsIk1BSUFfRkxPQVRJTkdfQlJFQUtQT0lOVF9YWEwiLCJnZXRNYWlhRmxvYXRpbmdQYW5lbFdpZHRoUHgiLCJ3aW5kb3ciLCJ2dyIsImlubmVyV2lkdGgiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvbGF5b3V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIE1haWFDaGF0TW9kYWxMYXlvdXRNb2RlID0gJ3NpZGViYXInIHwgJ2Z1bGxzY3JlZW4nIHwgJ2Zsb2F0aW5nJ1xuXG4vKiogQW5jaG8gZGVsIHBhbmVsIGZsb3RhbnRlIGVuIHB4OiBiYXNlIHkgZXNjYWxhZG8gZW4gcGFudGFsbGFzIG11eSBhbmNoYXMgKi9cbmV4cG9ydCBjb25zdCBNQUlBX0ZMT0FUSU5HX1BBTkVMX1dJRFRIX1BYID0ge1xuICBkZWZhdWx0OiA0ODAsXG4gIGxhcmdlOiA2MDAsXG4gIHh4bDogNzIwLFxufSBhcyBjb25zdFxuXG4vKiogQWx0byBkZWwgcGFuZWwgZmxvdGFudGUgZW4gcHg6IGJhc2UgeSBlc2NhbGFkbyBlbiBwYW50YWxsYXMgbXV5IGFuY2hhcyAoZWwgQ1NTIGFwbGljYSBtYXgtaGVpZ2h0OiA4NXZoKSAqL1xuZXhwb3J0IGNvbnN0IE1BSUFfRkxPQVRJTkdfUEFORUxfSEVJR0hUX1BYID0ge1xuICBkZWZhdWx0OiA2MjAsXG4gIGxhcmdlOiA3MjAsXG4gIHh4bDogOTYwLFxufSBhcyBjb25zdFxuXG4vKiogVmlld3BvcnQgbcOtbmltbyAoYW5jaG8pIHBhcmEgdXNhciBtZWRpZGFzIGBsYXJnZWAgKi9cbmV4cG9ydCBjb25zdCBNQUlBX0ZMT0FUSU5HX0JSRUFLUE9JTlRfTEFSR0UgPSAxOTIwXG5cbi8qKiBWaWV3cG9ydCBtw61uaW1vIChhbmNobykgcGFyYSB1c2FyIG1lZGlkYXMgYHh4bGAgKi9cbmV4cG9ydCBjb25zdCBNQUlBX0ZMT0FUSU5HX0JSRUFLUE9JTlRfWFhMID0gMjU2MFxuXG4vKiogQW5jaG8gZWZlY3Rpdm8gZGVsIHBhbmVsIChtaXNtYSBsw7NnaWNhIHF1ZSBsb3MgQG1lZGlhIGRlbCBDU1MpICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpYUZsb2F0aW5nUGFuZWxXaWR0aFB4KCk6IG51bWJlciB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBNQUlBX0ZMT0FUSU5HX1BBTkVMX1dJRFRIX1BYLmRlZmF1bHRcbiAgfVxuICBjb25zdCB2dyA9IHdpbmRvdy5pbm5lcldpZHRoXG4gIGlmICh2dyA+PSBNQUlBX0ZMT0FUSU5HX0JSRUFLUE9JTlRfWFhMKSB7XG4gICAgcmV0dXJuIE1BSUFfRkxPQVRJTkdfUEFORUxfV0lEVEhfUFgueHhsXG4gIH1cbiAgaWYgKHZ3ID49IE1BSUFfRkxPQVRJTkdfQlJFQUtQT0lOVF9MQVJHRSkge1xuICAgIHJldHVybiBNQUlBX0ZMT0FUSU5HX1BBTkVMX1dJRFRIX1BYLmxhcmdlXG4gIH1cbiAgcmV0dXJuIE1BSUFfRkxPQVRJTkdfUEFORUxfV0lEVEhfUFguZGVmYXVsdFxufVxuIl0sIm1hcHBpbmdzIjoiQUFFQTtBQUNBLE9BQU8sSUFBTUEsNEJBQTRCLEdBQUc7RUFDMUMsV0FBUyxHQUFHO0VBQ1pDLEtBQUssRUFBRSxHQUFHO0VBQ1ZDLEdBQUcsRUFBRTtBQUNQLENBQVU7O0FBRVY7QUFDQSxPQUFPLElBQU1DLDZCQUE2QixHQUFHO0VBQzNDLFdBQVMsR0FBRztFQUNaRixLQUFLLEVBQUUsR0FBRztFQUNWQyxHQUFHLEVBQUU7QUFDUCxDQUFVOztBQUVWO0FBQ0EsT0FBTyxJQUFNRSw4QkFBOEIsR0FBRyxJQUFJOztBQUVsRDtBQUNBLE9BQU8sSUFBTUMsNEJBQTRCLEdBQUcsSUFBSTs7QUFFaEQ7QUFDQSxPQUFPLFNBQVNDLDJCQUEyQkEsQ0FBQSxFQUFXO0VBQ3BELElBQUksT0FBT0MsTUFBTSxLQUFLLFdBQVcsRUFBRTtJQUNqQyxPQUFPUCw0QkFBNEIsV0FBUTtFQUM3QztFQUNBLElBQU1RLEVBQUUsR0FBR0QsTUFBTSxDQUFDRSxVQUFVO0VBQzVCLElBQUlELEVBQUUsSUFBSUgsNEJBQTRCLEVBQUU7SUFDdEMsT0FBT0wsNEJBQTRCLENBQUNFLEdBQUc7RUFDekM7RUFDQSxJQUFJTSxFQUFFLElBQUlKLDhCQUE4QixFQUFFO0lBQ3hDLE9BQU9KLDRCQUE0QixDQUFDQyxLQUFLO0VBQzNDO0VBQ0EsT0FBT0QsNEJBQTRCLFdBQVE7QUFDN0MiLCJpZ25vcmVMaXN0IjpbXX0=