@projectcor/maia-components 2.11.67-2 → 2.11.68-0

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 (75) hide show
  1. package/lib/components/atoms/Chip/Chip.js +15 -50
  2. package/lib/components/atoms/Chip/styles.js +5 -9
  3. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +6 -38
  4. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +13 -21
  5. package/lib/components/atoms/MAIAInput/MAIAInput.js +215 -71
  6. package/lib/components/atoms/MAIAInput/styles.js +64 -24
  7. package/lib/components/atoms/MAIAMessage/MAIAMessage.js +4 -2
  8. package/lib/components/atoms/MAIAViz/MAIAViz.js +97 -0
  9. package/lib/components/atoms/MAIAViz/MAIAViz.parse.js +131 -0
  10. package/lib/components/atoms/MAIAViz/MAIAViz.skeleton.js +40 -0
  11. package/lib/components/atoms/MAIAViz/MAIAViz.styles.js +8 -0
  12. package/lib/components/atoms/MAIAViz/MAIAViz.types.js +49 -0
  13. package/lib/components/atoms/MAIAViz/MAIAVizBar.js +123 -0
  14. package/lib/components/atoms/MAIAViz/MAIAVizDonut.js +111 -0
  15. package/lib/components/atoms/MAIAViz/MAIAVizKpis.js +34 -0
  16. package/lib/components/atoms/MAIAViz/README.md +85 -0
  17. package/lib/components/atoms/MAIAViz/index.js +2 -0
  18. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +46 -297
  19. package/lib/components/molecules/ChatAIHome/styles.js +26 -63
  20. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +159 -84
  21. package/lib/components/molecules/ChatAIMessages/newStyles.js +9 -19
  22. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +47 -223
  23. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +1 -26
  24. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +29 -22
  25. package/lib/components/molecules/ChatFooter/ChatFooter.js +18 -75
  26. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +7 -22
  27. package/lib/components/molecules/ChatFooter/styles.js +2 -11
  28. package/lib/components/molecules/Sidebar/Sidebar.js +10 -12
  29. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +5 -5
  30. package/lib/components/molecules/Sidebar/Sidebar.styles.js +13 -7
  31. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +2 -2
  32. package/lib/constants/maiaTaskPanelAccess.js +5 -7
  33. package/lib/constants/taskUrls.js +1 -3
  34. package/lib/context/global-context.js +1 -8
  35. package/lib/dev/DevContextMentionInput.js +3 -1
  36. package/lib/hooks/index.js +1 -2
  37. package/lib/hooks/useChatManager/useChatManager.js +144 -155
  38. package/lib/hooks/useChatMessages/useChatMessages.js +2 -33
  39. package/lib/hooks/useEntitySearch.js +129 -74
  40. package/lib/hooks/useEvent.js +1 -2
  41. package/lib/hooks/useFrequentlyAskedQuestions.js +10 -12
  42. package/lib/hooks/useFrequentlyUsedActions.js +3 -5
  43. package/lib/hooks/useMentionAllowedTypes.js +1 -11
  44. package/lib/hooks/useMentionPopover.js +2 -3
  45. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  46. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +22 -28
  47. package/lib/hooks/useProjectSearch.js +28 -4
  48. package/lib/hooks/useProjectSummaryConfig.js +33 -88
  49. package/lib/hooks/useRecentClientsSearch.js +34 -4
  50. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +16 -24
  51. package/lib/lang/br/index.js +10 -28
  52. package/lib/lang/en/index.js +10 -28
  53. package/lib/lang/es/index.js +10 -28
  54. package/lib/lang/fr/index.js +10 -28
  55. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +3 -6
  56. package/lib/services/maia/Agents/getAgents.js +175 -225
  57. package/lib/services/maia/Chats/getChatMessages.js +3 -13
  58. package/lib/services/maia/Chats/getChatsByUserId.js +2 -10
  59. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +4 -6
  60. package/lib/services/maia/Orchestrator/orchestrator.js +11 -25
  61. package/lib/services/maia/index.js +2 -4
  62. package/lib/services/utils/validateIsMaia.js +2 -2
  63. package/lib/types/Chat.js +1 -1
  64. package/lib/types/Hitl.js +2 -0
  65. package/lib/types/agent.js +1 -1
  66. package/lib/utils/agentDisplayName.js +1 -9
  67. package/lib/utils/hitlAnalytics.js +3 -3
  68. package/lib/utils/maiaStreamdownRenderers.js +16 -0
  69. package/lib/utils/renderContextMentions.js +1 -3
  70. package/package.json +1 -1
  71. package/lib/hooks/useContextPinPopover.js +0 -235
  72. package/lib/hooks/useRecentContexts.js +0 -86
  73. package/lib/services/maia/RecentContexts/getRecentContexts.js +0 -54
  74. package/lib/services/maia/RecentContexts/index.js +0 -6
  75. package/lib/utils/entityLinkRender.js +0 -132
@@ -0,0 +1,8 @@
1
+ import styled, { keyframes } from 'styled-components';
2
+ import { COR_COLORS } from './MAIAViz.types';
3
+ var blockIn = keyframes(["from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:none;}"]);
4
+ export var StyledMAIAViz = styled.div.withConfig({
5
+ displayName: "MAIAVizstyles__StyledMAIAViz",
6
+ componentId: "sc-7b9qoj-0"
7
+ })(["display:flex;flex-direction:column;gap:20px;width:100%;font-family:'Work Sans',sans-serif;color:", ";.MAIAViz-block{animation:", " 0.35s ease-out both;}@media (prefers-reduced-motion:reduce){.MAIAViz-block{animation:none;}}.MAIAViz-header{display:flex;flex-direction:column;gap:2px;}.MAIAViz-title{&&{font-size:18px;font-weight:600;line-height:1.2;color:", ";}}.MAIAViz-subtitle{&&{display:block;font-size:13px;color:", ";}}.MAIAViz-kpis{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;}.MAIAViz-kpi-card{display:flex;flex-direction:column;gap:6px;padding:16px;background:", ";border:1px solid ", ";border-radius:12px;}.MAIAViz-kpi-label{font-size:13px;color:", ";}.MAIAViz-kpi-value{font-size:26px;font-weight:600;line-height:1.1;color:", ";}.MAIAViz-kpi-delta{font-size:12px;font-weight:500;}.MAIAViz-figure{&&{display:flex;flex-direction:column;gap:10px;margin:0;}}.MAIAViz-caption{font-size:14px;font-weight:500;color:", ";}.MAIAViz-donut{display:flex;flex-wrap:wrap;align-items:center;gap:24px;}.MAIAViz-legend{&&{display:flex;flex-direction:column;gap:8px;padding:0;margin:0;list-style:none;}li{display:flex;align-items:center;gap:8px;margin:0;font-size:13px;}}.MAIAViz-legend-dot{width:10px;height:10px;border-radius:3px;flex-shrink:0;}.MAIAViz-legend-label{color:", ";}.MAIAViz-legend-value{font-weight:600;color:", ";}.MAIAViz-error{&&{font-size:13px;color:", ";font-style:italic;}}"], COR_COLORS.text, blockIn, COR_COLORS.navy, COR_COLORS.textMuted, COR_COLORS.surfaceMuted, COR_COLORS.border, COR_COLORS.textMuted, COR_COLORS.navy, COR_COLORS.navy, COR_COLORS.text, COR_COLORS.navy, COR_COLORS.textMuted);
8
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzdHlsZWQiLCJrZXlmcmFtZXMiLCJDT1JfQ09MT1JTIiwiYmxvY2tJbiIsIlN0eWxlZE1BSUFWaXoiLCJkaXYiLCJ3aXRoQ29uZmlnIiwiZGlzcGxheU5hbWUiLCJjb21wb25lbnRJZCIsInRleHQiLCJuYXZ5IiwidGV4dE11dGVkIiwic3VyZmFjZU11dGVkIiwiYm9yZGVyIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvTUFJQVZpei9NQUlBVml6LnN0eWxlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc3R5bGVkLCB7IGtleWZyYW1lcyB9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJ1xuXG5pbXBvcnQgeyBDT1JfQ09MT1JTIH0gZnJvbSAnLi9NQUlBVml6LnR5cGVzJ1xuXG5jb25zdCBibG9ja0luID0ga2V5ZnJhbWVzYFxuICBmcm9tIHtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg2cHgpO1xuICB9XG4gIHRvIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogbm9uZTtcbiAgfVxuYFxuXG5leHBvcnQgY29uc3QgU3R5bGVkTUFJQVZpeiA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMjBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGZvbnQtZmFtaWx5OiAnV29yayBTYW5zJywgc2Fucy1zZXJpZjtcbiAgY29sb3I6ICR7Q09SX0NPTE9SUy50ZXh0fTtcblxuICAvKiBDYWRhIHdpZGdldCBhcGFyZWNlIGNvbiB1biBmYWRlIGFsIGNlcnJhciBzdSB74oCmfSBtaWVudHJhcyBzdHJlbWVhLiAqL1xuICAuTUFJQVZpei1ibG9jayB7XG4gICAgYW5pbWF0aW9uOiAke2Jsb2NrSW59IDAuMzVzIGVhc2Utb3V0IGJvdGg7XG4gIH1cblxuICBAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkge1xuICAgIC5NQUlBVml6LWJsb2NrIHtcbiAgICAgIGFuaW1hdGlvbjogbm9uZTtcbiAgICB9XG4gIH1cblxuICAuTUFJQVZpei1oZWFkZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDJweDtcbiAgfVxuXG4gIC5NQUlBVml6LXRpdGxlIHtcbiAgICAmJiB7XG4gICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMjtcbiAgICAgIGNvbG9yOiAke0NPUl9DT0xPUlMubmF2eX07XG4gICAgfVxuICB9XG5cbiAgLk1BSUFWaXotc3VidGl0bGUge1xuICAgICYmIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgY29sb3I6ICR7Q09SX0NPTE9SUy50ZXh0TXV0ZWR9O1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tLSBLUEkgY2FyZHMgLS0tICovXG4gIC5NQUlBVml6LWtwaXMge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTUwcHgsIDFmcikpO1xuICAgIGdhcDogMTJweDtcbiAgfVxuXG4gIC5NQUlBVml6LWtwaS1jYXJkIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiA2cHg7XG4gICAgcGFkZGluZzogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiAke0NPUl9DT0xPUlMuc3VyZmFjZU11dGVkfTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAke0NPUl9DT0xPUlMuYm9yZGVyfTtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICB9XG5cbiAgLk1BSUFWaXota3BpLWxhYmVsIHtcbiAgICBmb250LXNpemU6IDEzcHg7XG4gICAgY29sb3I6ICR7Q09SX0NPTE9SUy50ZXh0TXV0ZWR9O1xuICB9XG5cbiAgLk1BSUFWaXota3BpLXZhbHVlIHtcbiAgICBmb250LXNpemU6IDI2cHg7XG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICBsaW5lLWhlaWdodDogMS4xO1xuICAgIGNvbG9yOiAke0NPUl9DT0xPUlMubmF2eX07XG4gIH1cblxuICAuTUFJQVZpei1rcGktZGVsdGEge1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICB9XG5cbiAgLyogLS0tIEZpZ3VyZXMgKGNoYXJ0cykgLS0tICovXG4gIC5NQUlBVml6LWZpZ3VyZSB7XG4gICAgJiYge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDEwcHg7XG4gICAgICBtYXJnaW46IDA7XG4gICAgfVxuICB9XG5cbiAgLk1BSUFWaXotY2FwdGlvbiB7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgY29sb3I6ICR7Q09SX0NPTE9SUy5uYXZ5fTtcbiAgfVxuXG4gIC8qIC0tLSBEb251dCAtLS0gKi9cbiAgLk1BSUFWaXotZG9udXQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiAyNHB4O1xuICB9XG5cbiAgLk1BSUFWaXotbGVnZW5kIHtcbiAgICAmJiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgfVxuXG4gICAgbGkge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICB9XG4gIH1cblxuICAuTUFJQVZpei1sZWdlbmQtZG90IHtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICB9XG5cbiAgLk1BSUFWaXotbGVnZW5kLWxhYmVsIHtcbiAgICBjb2xvcjogJHtDT1JfQ09MT1JTLnRleHR9O1xuICB9XG5cbiAgLk1BSUFWaXotbGVnZW5kLXZhbHVlIHtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIGNvbG9yOiAke0NPUl9DT0xPUlMubmF2eX07XG4gIH1cblxuICAuTUFJQVZpei1lcnJvciB7XG4gICAgJiYge1xuICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgY29sb3I6ICR7Q09SX0NPTE9SUy50ZXh0TXV0ZWR9O1xuICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgIH1cbiAgfVxuYFxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFNLElBQUlDLFNBQVMsUUFBUSxtQkFBbUI7QUFFckQsU0FBU0MsVUFBVSxRQUFRLGlCQUFpQjtBQUU1QyxJQUFNQyxPQUFPLEdBQUdGLFNBQVMsNkVBU3hCO0FBRUQsT0FBTyxJQUFNRyxhQUFhLEdBQUdKLE1BQU0sQ0FBQ0ssR0FBRyxDQUFBQyxVQUFBO0VBQUFDLFdBQUE7RUFBQUMsV0FBQTtBQUFBLHc1Q0FNNUJOLFVBQVUsQ0FBQ08sSUFBSSxFQUlUTixPQUFPLEVBb0JURCxVQUFVLENBQUNRLElBQUksRUFRZlIsVUFBVSxDQUFDUyxTQUFTLEVBZ0JqQlQsVUFBVSxDQUFDVSxZQUFZLEVBQ2pCVixVQUFVLENBQUNXLE1BQU0sRUFNNUJYLFVBQVUsQ0FBQ1MsU0FBUyxFQU9wQlQsVUFBVSxDQUFDUSxJQUFJLEVBcUJmUixVQUFVLENBQUNRLElBQUksRUFzQ2ZSLFVBQVUsQ0FBQ08sSUFBSSxFQUtmUCxVQUFVLENBQUNRLElBQUksRUFNYlIsVUFBVSxDQUFDUyxTQUFTLENBSWxDIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Contrato de datos que el modelo emite dentro de un bloque ```maia-viz.
3
+ * El modelo NO genera HTML ni SVG: solo describe los datos. El render lo hace
4
+ * el cliente con estos tipos, por eso es seguro (no pasa por la sanitización
5
+ * de HTML de Streamdown).
6
+ */
7
+
8
+ /** Una tarjeta de KPI (los recuadros grandes con número + variación). */
9
+
10
+ /** Un punto de una serie (barra, donut, etc.). */
11
+
12
+ /** Bloques que pueden ir dentro de un reporte compuesto. */
13
+
14
+ /** Cualquier spec válido dentro de un bloque ```maia-viz. */
15
+
16
+ /**
17
+ * Orden de colores de serie según el design system de COR.
18
+ * Paleta de estados de tareas de COR — los gráficos viz SOLO pueden usar estos colores.
19
+ */
20
+ export var COR_CHART_COLORS = ['#0094CA',
21
+ // azul (Nueva)
22
+ '#FFAC2C',
23
+ // naranja (En proceso)
24
+ '#9B68BB',
25
+ // morado (En revisión)
26
+ '#ED2C50',
27
+ // rojo (Ajustes)
28
+ '#00C972',
29
+ // verde (Finalizada)
30
+ '#5A5A5A' // gris (neutral)
31
+ ];
32
+ export var COR_COLORS = {
33
+ blue: '#0094CA',
34
+ orange: '#FFAC2C',
35
+ purple: '#9B68BB',
36
+ red: '#ED2C50',
37
+ green: '#00C972',
38
+ gray: '#5A5A5A',
39
+ positive: '#00C972',
40
+ negative: '#ED2C50',
41
+ neutral: '#5A5A5A',
42
+ surface: '#FFFFFF',
43
+ surfaceMuted: '#F7F8FA',
44
+ border: 'rgba(0, 0, 0, 0.08)',
45
+ text: '#5A5A5A',
46
+ textMuted: 'rgba(90, 90, 90, 0.6)',
47
+ navy: '#5A5A5A'
48
+ };
49
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT1JfQ0hBUlRfQ09MT1JTIiwiQ09SX0NPTE9SUyIsImJsdWUiLCJvcmFuZ2UiLCJwdXJwbGUiLCJyZWQiLCJncmVlbiIsImdyYXkiLCJwb3NpdGl2ZSIsIm5lZ2F0aXZlIiwibmV1dHJhbCIsInN1cmZhY2UiLCJzdXJmYWNlTXV0ZWQiLCJib3JkZXIiLCJ0ZXh0IiwidGV4dE11dGVkIiwibmF2eSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2F0b21zL01BSUFWaXovTUFJQVZpei50eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRyYXRvIGRlIGRhdG9zIHF1ZSBlbCBtb2RlbG8gZW1pdGUgZGVudHJvIGRlIHVuIGJsb3F1ZSBgYGBtYWlhLXZpei5cbiAqIEVsIG1vZGVsbyBOTyBnZW5lcmEgSFRNTCBuaSBTVkc6IHNvbG8gZGVzY3JpYmUgbG9zIGRhdG9zLiBFbCByZW5kZXIgbG8gaGFjZVxuICogZWwgY2xpZW50ZSBjb24gZXN0b3MgdGlwb3MsIHBvciBlc28gZXMgc2VndXJvIChubyBwYXNhIHBvciBsYSBzYW5pdGl6YWNpw7NuXG4gKiBkZSBIVE1MIGRlIFN0cmVhbWRvd24pLlxuICovXG5cbmV4cG9ydCB0eXBlIFRyZW5kID0gJ3VwJyB8ICdkb3duJyB8ICdmbGF0J1xuXG4vKiogVW5hIHRhcmpldGEgZGUgS1BJIChsb3MgcmVjdWFkcm9zIGdyYW5kZXMgY29uIG7Dum1lcm8gKyB2YXJpYWNpw7NuKS4gKi9cbmV4cG9ydCB0eXBlIEtwaUl0ZW0gPSB7XG4gIGxhYmVsOiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICAvKiogVGV4dG8gZGUgdmFyaWFjacOzbiwgcC4gZWouIFwiKzE4LjMlIHZzIDIwMjRcIi4gT3BjaW9uYWwuICovXG4gIGRlbHRhPzogc3RyaW5nXG4gIC8qKiBEaXJlY2Npw7NuIGRlIGxhIHZhcmlhY2nDs246IHBpbnRhIGVsIGRlbHRhIGVuIHZlcmRlL3Jvam8vZ3Jpcy4gKi9cbiAgdHJlbmQ/OiBUcmVuZFxufVxuXG4vKiogVW4gcHVudG8gZGUgdW5hIHNlcmllIChiYXJyYSwgZG9udXQsIGV0Yy4pLiAqL1xuZXhwb3J0IHR5cGUgU2VyaWVzUG9pbnQgPSB7XG4gIGxhYmVsOiBzdHJpbmdcbiAgdmFsdWU6IG51bWJlclxuICAvKiogQ29sb3Igb3ZlcnJpZGUgZW4gSEVYLiBTaSBubyBzZSBwYXNhLCBzZSB1c2EgbGEgcGFsZXRhIENPUiBwb3Igw61uZGljZS4gKi9cbiAgY29sb3I/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgS3Bpc1NwZWMgPSB7XG4gIHR5cGU6ICdrcGlzJ1xuICB0aXRsZT86IHN0cmluZ1xuICBzdWJ0aXRsZT86IHN0cmluZ1xuICBpdGVtczogS3BpSXRlbVtdXG59XG5cbmV4cG9ydCB0eXBlIEJhclNwZWMgPSB7XG4gIHR5cGU6ICdiYXInXG4gIHRpdGxlPzogc3RyaW5nXG4gIC8qKiBTdWZpam8gZGUgdW5pZGFkIHBhcmEgZWwgZWplL3Rvb2x0aXAsIHAuIGVqLiBcIk0gVVNEXCIuICovXG4gIHVuaXQ/OiBzdHJpbmdcbiAgZGF0YTogU2VyaWVzUG9pbnRbXVxufVxuXG5leHBvcnQgdHlwZSBEb251dFNwZWMgPSB7XG4gIHR5cGU6ICdkb251dCdcbiAgdGl0bGU/OiBzdHJpbmdcbiAgZGF0YTogU2VyaWVzUG9pbnRbXVxufVxuXG4vKiogQmxvcXVlcyBxdWUgcHVlZGVuIGlyIGRlbnRybyBkZSB1biByZXBvcnRlIGNvbXB1ZXN0by4gKi9cbmV4cG9ydCB0eXBlIFJlcG9ydEJsb2NrID0gS3Bpc1NwZWMgfCBCYXJTcGVjIHwgRG9udXRTcGVjXG5cbmV4cG9ydCB0eXBlIFJlcG9ydFNwZWMgPSB7XG4gIHR5cGU6ICdyZXBvcnQnXG4gIHRpdGxlPzogc3RyaW5nXG4gIHN1YnRpdGxlPzogc3RyaW5nXG4gIGJsb2NrczogUmVwb3J0QmxvY2tbXVxufVxuXG4vKiogQ3VhbHF1aWVyIHNwZWMgdsOhbGlkbyBkZW50cm8gZGUgdW4gYmxvcXVlIGBgYG1haWEtdml6LiAqL1xuZXhwb3J0IHR5cGUgTWFpYVZpelNwZWMgPSBLcGlzU3BlYyB8IEJhclNwZWMgfCBEb251dFNwZWMgfCBSZXBvcnRTcGVjXG5cbi8qKlxuICogT3JkZW4gZGUgY29sb3JlcyBkZSBzZXJpZSBzZWfDum4gZWwgZGVzaWduIHN5c3RlbSBkZSBDT1IuXG4gKiBQYWxldGEgZGUgZXN0YWRvcyBkZSB0YXJlYXMgZGUgQ09SIOKAlCBsb3MgZ3LDoWZpY29zIHZpeiBTT0xPIHB1ZWRlbiB1c2FyIGVzdG9zIGNvbG9yZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBDT1JfQ0hBUlRfQ09MT1JTID0gW1xuICAnIzAwOTRDQScsIC8vIGF6dWwgKE51ZXZhKVxuICAnI0ZGQUMyQycsIC8vIG5hcmFuamEgKEVuIHByb2Nlc28pXG4gICcjOUI2OEJCJywgLy8gbW9yYWRvIChFbiByZXZpc2nDs24pXG4gICcjRUQyQzUwJywgLy8gcm9qbyAoQWp1c3RlcylcbiAgJyMwMEM5NzInLCAvLyB2ZXJkZSAoRmluYWxpemFkYSlcbiAgJyM1QTVBNUEnLCAvLyBncmlzIChuZXV0cmFsKVxuXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgQ09SX0NPTE9SUyA9IHtcbiAgYmx1ZTogJyMwMDk0Q0EnLFxuICBvcmFuZ2U6ICcjRkZBQzJDJyxcbiAgcHVycGxlOiAnIzlCNjhCQicsXG4gIHJlZDogJyNFRDJDNTAnLFxuICBncmVlbjogJyMwMEM5NzInLFxuICBncmF5OiAnIzVBNUE1QScsXG4gIHBvc2l0aXZlOiAnIzAwQzk3MicsXG4gIG5lZ2F0aXZlOiAnI0VEMkM1MCcsXG4gIG5ldXRyYWw6ICcjNUE1QTVBJyxcbiAgc3VyZmFjZTogJyNGRkZGRkYnLFxuICBzdXJmYWNlTXV0ZWQ6ICcjRjdGOEZBJyxcbiAgYm9yZGVyOiAncmdiYSgwLCAwLCAwLCAwLjA4KScsXG4gIHRleHQ6ICcjNUE1QTVBJyxcbiAgdGV4dE11dGVkOiAncmdiYSg5MCwgOTAsIDkwLCAwLjYpJyxcbiAgbmF2eTogJyM1QTVBNUEnLFxufSBhcyBjb25zdFxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7O0FBVUE7O0FBNkJBOztBQVVBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxJQUFNQSxnQkFBZ0IsR0FBRyxDQUM5QixTQUFTO0FBQUU7QUFDWCxTQUFTO0FBQUU7QUFDWCxTQUFTO0FBQUU7QUFDWCxTQUFTO0FBQUU7QUFDWCxTQUFTO0FBQUU7QUFDWCxTQUFTLENBQUU7QUFBQSxDQUNIO0FBRVYsT0FBTyxJQUFNQyxVQUFVLEdBQUc7RUFDeEJDLElBQUksRUFBRSxTQUFTO0VBQ2ZDLE1BQU0sRUFBRSxTQUFTO0VBQ2pCQyxNQUFNLEVBQUUsU0FBUztFQUNqQkMsR0FBRyxFQUFFLFNBQVM7RUFDZEMsS0FBSyxFQUFFLFNBQVM7RUFDaEJDLElBQUksRUFBRSxTQUFTO0VBQ2ZDLFFBQVEsRUFBRSxTQUFTO0VBQ25CQyxRQUFRLEVBQUUsU0FBUztFQUNuQkMsT0FBTyxFQUFFLFNBQVM7RUFDbEJDLE9BQU8sRUFBRSxTQUFTO0VBQ2xCQyxZQUFZLEVBQUUsU0FBUztFQUN2QkMsTUFBTSxFQUFFLHFCQUFxQjtFQUM3QkMsSUFBSSxFQUFFLFNBQVM7RUFDZkMsU0FBUyxFQUFFLHVCQUF1QjtFQUNsQ0MsSUFBSSxFQUFFO0FBQ1IsQ0FBVSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,123 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import { COR_COLORS, COR_CHART_COLORS } from './MAIAViz.types';
3
+ import { normalizeSeries } from './MAIAViz.parse';
4
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
+ var WIDTH = 640;
6
+ var PAD_LEFT = 48;
7
+ var PAD_RIGHT = 16;
8
+ var PAD_TOP = 16;
9
+ var PLOT_H = 210;
10
+ var TICKS = 4;
11
+ var NICE_STEPS = [1, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10];
12
+ var niceCeil = function niceCeil(value) {
13
+ var _NICE_STEPS$find;
14
+ if (value <= 0) return 1;
15
+ var pow = Math.pow(10, Math.floor(Math.log10(value)));
16
+ var norm = value / pow;
17
+ var step = (_NICE_STEPS$find = NICE_STEPS.find(function (s) {
18
+ return s >= norm;
19
+ })) !== null && _NICE_STEPS$find !== void 0 ? _NICE_STEPS$find : 10;
20
+ return step * pow;
21
+ };
22
+ var truncate = function truncate(label, maxChars) {
23
+ return label.length > maxChars ? "".concat(label.slice(0, maxChars - 1), "\u2026") : label;
24
+ };
25
+ export var MAIAVizBar = function MAIAVizBar(_ref) {
26
+ var _spec$title;
27
+ var spec = _ref.spec;
28
+ var data = normalizeSeries(spec.data);
29
+ if (!data.length) return null;
30
+ var max = niceCeil(Math.max.apply(Math, _toConsumableArray(data.map(function (d) {
31
+ return d.value;
32
+ }))));
33
+ var plotW = WIDTH - PAD_LEFT - PAD_RIGHT;
34
+ var slot = plotW / data.length;
35
+ var barW = Math.min(slot * 0.55, 64);
36
+ var unit = spec.unit ? " ".concat(spec.unit) : '';
37
+
38
+ // Con nombres largos o muchas barras, las etiquetas horizontales se pisan:
39
+ // las rotamos y reservamos más alto abajo. Con pocas y cortas (Q1, Q2…) no.
40
+ var maxLabelLen = Math.max.apply(Math, _toConsumableArray(data.map(function (d) {
41
+ return d.label.length;
42
+ })));
43
+ var rotate = data.length > 4 || maxLabelLen > 9;
44
+ var labelCap = rotate ? 20 : Math.max(5, Math.floor(slot / 7));
45
+ var padBottom = rotate ? 92 : 40;
46
+ var height = PAD_TOP + PLOT_H + padBottom;
47
+ var yFor = function yFor(value) {
48
+ return PAD_TOP + PLOT_H - value / max * PLOT_H;
49
+ };
50
+ var baseline = PAD_TOP + PLOT_H;
51
+ return /*#__PURE__*/_jsxs("figure", {
52
+ className: "MAIAViz-figure",
53
+ children: [spec.title && /*#__PURE__*/_jsx("figcaption", {
54
+ className: "MAIAViz-caption",
55
+ children: spec.title
56
+ }), /*#__PURE__*/_jsxs("svg", {
57
+ viewBox: "0 0 ".concat(WIDTH, " ").concat(height),
58
+ role: "img",
59
+ "aria-label": (_spec$title = spec.title) !== null && _spec$title !== void 0 ? _spec$title : 'Gráfico de barras',
60
+ preserveAspectRatio: "xMidYMid meet",
61
+ style: {
62
+ width: '100%',
63
+ height: 'auto',
64
+ display: 'block'
65
+ },
66
+ children: [Array.from({
67
+ length: TICKS + 1
68
+ }, function (_, i) {
69
+ var value = max / TICKS * i;
70
+ var y = yFor(value);
71
+ return /*#__PURE__*/_jsxs("g", {
72
+ children: [/*#__PURE__*/_jsx("line", {
73
+ x1: PAD_LEFT,
74
+ y1: y,
75
+ x2: WIDTH - PAD_RIGHT,
76
+ y2: y,
77
+ stroke: COR_COLORS.border,
78
+ strokeWidth: 1
79
+ }), /*#__PURE__*/_jsx("text", {
80
+ x: PAD_LEFT - 8,
81
+ y: y + 4,
82
+ textAnchor: "end",
83
+ fontSize: 11,
84
+ fill: COR_COLORS.textMuted,
85
+ children: Math.round(value)
86
+ })]
87
+ }, "tick-".concat(value));
88
+ }), data.map(function (d, i) {
89
+ var _d$color;
90
+ var x = PAD_LEFT + slot * i + (slot - barW) / 2;
91
+ var y = yFor(d.value);
92
+ var h = baseline - y;
93
+ var fill = (_d$color = d.color) !== null && _d$color !== void 0 ? _d$color : COR_CHART_COLORS[i % COR_CHART_COLORS.length];
94
+ var cx = x + barW / 2;
95
+ var ly = baseline + (rotate ? 14 : 18);
96
+ return /*#__PURE__*/_jsxs("g", {
97
+ children: [/*#__PURE__*/_jsx("rect", {
98
+ x: x,
99
+ y: y,
100
+ width: barW,
101
+ height: Math.max(h, 0),
102
+ rx: 4,
103
+ fill: fill,
104
+ children: /*#__PURE__*/_jsx("title", {
105
+ children: "".concat(d.label, ": ").concat(d.value).concat(unit)
106
+ })
107
+ }), /*#__PURE__*/_jsxs("text", {
108
+ x: cx,
109
+ y: ly,
110
+ textAnchor: rotate ? 'end' : 'middle',
111
+ transform: rotate ? "rotate(-32 ".concat(cx, " ").concat(ly, ")") : undefined,
112
+ fontSize: 11,
113
+ fill: COR_COLORS.text,
114
+ children: [truncate(d.label, labelCap), /*#__PURE__*/_jsx("title", {
115
+ children: d.label
116
+ })]
117
+ })]
118
+ }, d.label);
119
+ })]
120
+ })]
121
+ });
122
+ };
123
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT1JfQ09MT1JTIiwiQ09SX0NIQVJUX0NPTE9SUyIsIm5vcm1hbGl6ZVNlcmllcyIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJXSURUSCIsIlBBRF9MRUZUIiwiUEFEX1JJR0hUIiwiUEFEX1RPUCIsIlBMT1RfSCIsIlRJQ0tTIiwiTklDRV9TVEVQUyIsIm5pY2VDZWlsIiwidmFsdWUiLCJfTklDRV9TVEVQUyRmaW5kIiwicG93IiwiTWF0aCIsImZsb29yIiwibG9nMTAiLCJub3JtIiwic3RlcCIsImZpbmQiLCJzIiwidHJ1bmNhdGUiLCJsYWJlbCIsIm1heENoYXJzIiwibGVuZ3RoIiwiY29uY2F0Iiwic2xpY2UiLCJNQUlBVml6QmFyIiwiX3JlZiIsIl9zcGVjJHRpdGxlIiwic3BlYyIsImRhdGEiLCJtYXgiLCJhcHBseSIsIl90b0NvbnN1bWFibGVBcnJheSIsIm1hcCIsImQiLCJwbG90VyIsInNsb3QiLCJiYXJXIiwibWluIiwidW5pdCIsIm1heExhYmVsTGVuIiwicm90YXRlIiwibGFiZWxDYXAiLCJwYWRCb3R0b20iLCJoZWlnaHQiLCJ5Rm9yIiwiYmFzZWxpbmUiLCJjbGFzc05hbWUiLCJjaGlsZHJlbiIsInRpdGxlIiwidmlld0JveCIsInJvbGUiLCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwic3R5bGUiLCJ3aWR0aCIsImRpc3BsYXkiLCJBcnJheSIsImZyb20iLCJfIiwiaSIsInkiLCJ4MSIsInkxIiwieDIiLCJ5MiIsInN0cm9rZSIsImJvcmRlciIsInN0cm9rZVdpZHRoIiwieCIsInRleHRBbmNob3IiLCJmb250U2l6ZSIsImZpbGwiLCJ0ZXh0TXV0ZWQiLCJyb3VuZCIsIl9kJGNvbG9yIiwiaCIsImNvbG9yIiwiY3giLCJseSIsInJ4IiwidHJhbnNmb3JtIiwidW5kZWZpbmVkIiwidGV4dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2F0b21zL01BSUFWaXovTUFJQVZpekJhci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFyU3BlYywgQ09SX0NPTE9SUywgQ09SX0NIQVJUX0NPTE9SUyB9IGZyb20gJy4vTUFJQVZpei50eXBlcydcbmltcG9ydCB7IG5vcm1hbGl6ZVNlcmllcyB9IGZyb20gJy4vTUFJQVZpei5wYXJzZSdcblxudHlwZSBNQUlBVml6QmFyUHJvcHMgPSB7XG4gIHNwZWM6IEJhclNwZWNcbn1cblxuY29uc3QgV0lEVEggPSA2NDBcbmNvbnN0IFBBRF9MRUZUID0gNDhcbmNvbnN0IFBBRF9SSUdIVCA9IDE2XG5jb25zdCBQQURfVE9QID0gMTZcbmNvbnN0IFBMT1RfSCA9IDIxMFxuY29uc3QgVElDS1MgPSA0XG5cbmNvbnN0IE5JQ0VfU1RFUFMgPSBbMSwgMS41LCAyLCAyLjUsIDMsIDQsIDUsIDYsIDgsIDEwXVxuXG5jb25zdCBuaWNlQ2VpbCA9ICh2YWx1ZTogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgaWYgKHZhbHVlIDw9IDApIHJldHVybiAxXG4gIGNvbnN0IHBvdyA9IDEwICoqIE1hdGguZmxvb3IoTWF0aC5sb2cxMCh2YWx1ZSkpXG4gIGNvbnN0IG5vcm0gPSB2YWx1ZSAvIHBvd1xuICBjb25zdCBzdGVwID0gTklDRV9TVEVQUy5maW5kKHMgPT4gcyA+PSBub3JtKSA/PyAxMFxuICByZXR1cm4gc3RlcCAqIHBvd1xufVxuXG5jb25zdCB0cnVuY2F0ZSA9IChsYWJlbDogc3RyaW5nLCBtYXhDaGFyczogbnVtYmVyKTogc3RyaW5nID0+XG4gIGxhYmVsLmxlbmd0aCA+IG1heENoYXJzID8gYCR7bGFiZWwuc2xpY2UoMCwgbWF4Q2hhcnMgLSAxKX3igKZgIDogbGFiZWxcblxuZXhwb3J0IGNvbnN0IE1BSUFWaXpCYXIgPSAoeyBzcGVjIH06IE1BSUFWaXpCYXJQcm9wcykgPT4ge1xuICBjb25zdCBkYXRhID0gbm9ybWFsaXplU2VyaWVzKHNwZWMuZGF0YSlcbiAgaWYgKCFkYXRhLmxlbmd0aCkgcmV0dXJuIG51bGxcblxuICBjb25zdCBtYXggPSBuaWNlQ2VpbChNYXRoLm1heCguLi5kYXRhLm1hcChkID0+IGQudmFsdWUpKSlcbiAgY29uc3QgcGxvdFcgPSBXSURUSCAtIFBBRF9MRUZUIC0gUEFEX1JJR0hUXG4gIGNvbnN0IHNsb3QgPSBwbG90VyAvIGRhdGEubGVuZ3RoXG4gIGNvbnN0IGJhclcgPSBNYXRoLm1pbihzbG90ICogMC41NSwgNjQpXG4gIGNvbnN0IHVuaXQgPSBzcGVjLnVuaXQgPyBgICR7c3BlYy51bml0fWAgOiAnJ1xuXG4gIC8vIENvbiBub21icmVzIGxhcmdvcyBvIG11Y2hhcyBiYXJyYXMsIGxhcyBldGlxdWV0YXMgaG9yaXpvbnRhbGVzIHNlIHBpc2FuOlxuICAvLyBsYXMgcm90YW1vcyB5IHJlc2VydmFtb3MgbcOhcyBhbHRvIGFiYWpvLiBDb24gcG9jYXMgeSBjb3J0YXMgKFExLCBRMuKApikgbm8uXG4gIGNvbnN0IG1heExhYmVsTGVuID0gTWF0aC5tYXgoLi4uZGF0YS5tYXAoZCA9PiBkLmxhYmVsLmxlbmd0aCkpXG4gIGNvbnN0IHJvdGF0ZSA9IGRhdGEubGVuZ3RoID4gNCB8fCBtYXhMYWJlbExlbiA+IDlcbiAgY29uc3QgbGFiZWxDYXAgPSByb3RhdGUgPyAyMCA6IE1hdGgubWF4KDUsIE1hdGguZmxvb3Ioc2xvdCAvIDcpKVxuICBjb25zdCBwYWRCb3R0b20gPSByb3RhdGUgPyA5MiA6IDQwXG4gIGNvbnN0IGhlaWdodCA9IFBBRF9UT1AgKyBQTE9UX0ggKyBwYWRCb3R0b21cblxuICBjb25zdCB5Rm9yID0gKHZhbHVlOiBudW1iZXIpID0+IFBBRF9UT1AgKyBQTE9UX0ggLSAodmFsdWUgLyBtYXgpICogUExPVF9IXG4gIGNvbnN0IGJhc2VsaW5lID0gUEFEX1RPUCArIFBMT1RfSFxuXG4gIHJldHVybiAoXG4gICAgPGZpZ3VyZSBjbGFzc05hbWU9XCJNQUlBVml6LWZpZ3VyZVwiPlxuICAgICAge3NwZWMudGl0bGUgJiYgPGZpZ2NhcHRpb24gY2xhc3NOYW1lPVwiTUFJQVZpei1jYXB0aW9uXCI+e3NwZWMudGl0bGV9PC9maWdjYXB0aW9uPn1cbiAgICAgIDxzdmdcbiAgICAgICAgdmlld0JveD17YDAgMCAke1dJRFRIfSAke2hlaWdodH1gfVxuICAgICAgICByb2xlPVwiaW1nXCJcbiAgICAgICAgYXJpYS1sYWJlbD17c3BlYy50aXRsZSA/PyAnR3LDoWZpY28gZGUgYmFycmFzJ31cbiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz1cInhNaWRZTWlkIG1lZXRcIlxuICAgICAgICBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICdhdXRvJywgZGlzcGxheTogJ2Jsb2NrJyB9fVxuICAgICAgPlxuICAgICAgICB7QXJyYXkuZnJvbSh7IGxlbmd0aDogVElDS1MgKyAxIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSAobWF4IC8gVElDS1MpICogaVxuICAgICAgICAgIGNvbnN0IHkgPSB5Rm9yKHZhbHVlKVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZyBrZXk9e2B0aWNrLSR7dmFsdWV9YH0+XG4gICAgICAgICAgICAgIDxsaW5lIHgxPXtQQURfTEVGVH0geTE9e3l9IHgyPXtXSURUSCAtIFBBRF9SSUdIVH0geTI9e3l9IHN0cm9rZT17Q09SX0NPTE9SUy5ib3JkZXJ9IHN0cm9rZVdpZHRoPXsxfSAvPlxuICAgICAgICAgICAgICA8dGV4dCB4PXtQQURfTEVGVCAtIDh9IHk9e3kgKyA0fSB0ZXh0QW5jaG9yPVwiZW5kXCIgZm9udFNpemU9ezExfSBmaWxsPXtDT1JfQ09MT1JTLnRleHRNdXRlZH0+XG4gICAgICAgICAgICAgICAge01hdGgucm91bmQodmFsdWUpfVxuICAgICAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgKVxuICAgICAgICB9KX1cblxuICAgICAgICB7ZGF0YS5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgICBjb25zdCB4ID0gUEFEX0xFRlQgKyBzbG90ICogaSArIChzbG90IC0gYmFyVykgLyAyXG4gICAgICAgICAgY29uc3QgeSA9IHlGb3IoZC52YWx1ZSlcbiAgICAgICAgICBjb25zdCBoID0gYmFzZWxpbmUgLSB5XG4gICAgICAgICAgY29uc3QgZmlsbCA9IGQuY29sb3IgPz8gQ09SX0NIQVJUX0NPTE9SU1tpICUgQ09SX0NIQVJUX0NPTE9SUy5sZW5ndGhdXG4gICAgICAgICAgY29uc3QgY3ggPSB4ICsgYmFyVyAvIDJcbiAgICAgICAgICBjb25zdCBseSA9IGJhc2VsaW5lICsgKHJvdGF0ZSA/IDE0IDogMTgpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxnIGtleT17ZC5sYWJlbH0+XG4gICAgICAgICAgICAgIDxyZWN0IHg9e3h9IHk9e3l9IHdpZHRoPXtiYXJXfSBoZWlnaHQ9e01hdGgubWF4KGgsIDApfSByeD17NH0gZmlsbD17ZmlsbH0+XG4gICAgICAgICAgICAgICAgPHRpdGxlPntgJHtkLmxhYmVsfTogJHtkLnZhbHVlfSR7dW5pdH1gfTwvdGl0bGU+XG4gICAgICAgICAgICAgIDwvcmVjdD5cbiAgICAgICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICAgICB4PXtjeH1cbiAgICAgICAgICAgICAgICB5PXtseX1cbiAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yPXtyb3RhdGUgPyAnZW5kJyA6ICdtaWRkbGUnfVxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybT17cm90YXRlID8gYHJvdGF0ZSgtMzIgJHtjeH0gJHtseX0pYCA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICBmb250U2l6ZT17MTF9XG4gICAgICAgICAgICAgICAgZmlsbD17Q09SX0NPTE9SUy50ZXh0fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3RydW5jYXRlKGQubGFiZWwsIGxhYmVsQ2FwKX1cbiAgICAgICAgICAgICAgICA8dGl0bGU+e2QubGFiZWx9PC90aXRsZT5cbiAgICAgICAgICAgICAgPC90ZXh0PlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAg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
@@ -0,0 +1,111 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
+ import { COR_COLORS, COR_CHART_COLORS } from './MAIAViz.types';
6
+ import { normalizeSeries } from './MAIAViz.parse';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ var SIZE = 200;
9
+ var STROKE = 34;
10
+ var R = (SIZE - STROKE) / 2;
11
+ var CENTER = SIZE / 2;
12
+ var polar = function polar(angleDeg) {
13
+ var rad = (angleDeg - 90) * Math.PI / 180;
14
+ return [CENTER + R * Math.cos(rad), CENTER + R * Math.sin(rad)];
15
+ };
16
+ var arcPath = function arcPath(startAngle, endAngle) {
17
+ var _polar = polar(startAngle),
18
+ _polar2 = _slicedToArray(_polar, 2),
19
+ x1 = _polar2[0],
20
+ y1 = _polar2[1];
21
+ var _polar3 = polar(endAngle),
22
+ _polar4 = _slicedToArray(_polar3, 2),
23
+ x2 = _polar4[0],
24
+ y2 = _polar4[1];
25
+ var largeArc = endAngle - startAngle > 180 ? 1 : 0;
26
+ return "M ".concat(x1, " ").concat(y1, " A ").concat(R, " ").concat(R, " 0 ").concat(largeArc, " 1 ").concat(x2, " ").concat(y2);
27
+ };
28
+ export var MAIAVizDonut = function MAIAVizDonut(_ref) {
29
+ var _spec$title;
30
+ var spec = _ref.spec;
31
+ var data = normalizeSeries(spec.data);
32
+ var total = data.reduce(function (sum, d) {
33
+ return sum + d.value;
34
+ }, 0);
35
+ if (!data.length || total <= 0) return null;
36
+ var cursor = 0;
37
+ var segments = data.map(function (d, i) {
38
+ var _d$color;
39
+ var start = cursor / total * 360;
40
+ cursor += d.value;
41
+ var end = cursor / total * 360;
42
+ return _objectSpread(_objectSpread({}, d), {}, {
43
+ color: (_d$color = d.color) !== null && _d$color !== void 0 ? _d$color : COR_CHART_COLORS[i % COR_CHART_COLORS.length],
44
+ pct: Math.round(d.value / total * 100),
45
+ // Evita el arco completo de 360° (no se dibuja); lo recortamos apenas.
46
+ path: arcPath(start, end >= 360 ? 359.99 : end)
47
+ });
48
+ });
49
+ return /*#__PURE__*/_jsxs("figure", {
50
+ className: "MAIAViz-figure",
51
+ children: [spec.title && /*#__PURE__*/_jsx("figcaption", {
52
+ className: "MAIAViz-caption",
53
+ children: spec.title
54
+ }), /*#__PURE__*/_jsxs("div", {
55
+ className: "MAIAViz-donut",
56
+ children: [/*#__PURE__*/_jsxs("svg", {
57
+ viewBox: "0 0 ".concat(SIZE, " ").concat(SIZE),
58
+ width: SIZE,
59
+ height: SIZE,
60
+ role: "img",
61
+ "aria-label": (_spec$title = spec.title) !== null && _spec$title !== void 0 ? _spec$title : 'Gráfico de dona',
62
+ children: [segments.map(function (s) {
63
+ return /*#__PURE__*/_jsx("path", {
64
+ d: s.path,
65
+ fill: "none",
66
+ stroke: s.color,
67
+ strokeWidth: STROKE,
68
+ strokeLinecap: "butt",
69
+ children: /*#__PURE__*/_jsx("title", {
70
+ children: "".concat(s.label, ": ").concat(s.pct, "%")
71
+ })
72
+ }, s.label);
73
+ }), /*#__PURE__*/_jsx("text", {
74
+ x: CENTER,
75
+ y: CENTER - 4,
76
+ textAnchor: "middle",
77
+ fontSize: 22,
78
+ fontWeight: 600,
79
+ fill: COR_COLORS.text,
80
+ children: total
81
+ }), /*#__PURE__*/_jsx("text", {
82
+ x: CENTER,
83
+ y: CENTER + 16,
84
+ textAnchor: "middle",
85
+ fontSize: 11,
86
+ fill: COR_COLORS.textMuted,
87
+ children: "Total"
88
+ })]
89
+ }), /*#__PURE__*/_jsx("ul", {
90
+ className: "MAIAViz-legend",
91
+ children: segments.map(function (s) {
92
+ return /*#__PURE__*/_jsxs("li", {
93
+ children: [/*#__PURE__*/_jsx("span", {
94
+ className: "MAIAViz-legend-dot",
95
+ style: {
96
+ backgroundColor: s.color
97
+ }
98
+ }), /*#__PURE__*/_jsx("span", {
99
+ className: "MAIAViz-legend-label",
100
+ children: s.label
101
+ }), /*#__PURE__*/_jsxs("span", {
102
+ className: "MAIAViz-legend-value",
103
+ children: [s.pct, "%"]
104
+ })]
105
+ }, s.label);
106
+ })
107
+ })]
108
+ })]
109
+ });
110
+ };
111
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT1JfQ09MT1JTIiwiQ09SX0NIQVJUX0NPTE9SUyIsIm5vcm1hbGl6ZVNlcmllcyIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJTSVpFIiwiU1RST0tFIiwiUiIsIkNFTlRFUiIsInBvbGFyIiwiYW5nbGVEZWciLCJyYWQiLCJNYXRoIiwiUEkiLCJjb3MiLCJzaW4iLCJhcmNQYXRoIiwic3RhcnRBbmdsZSIsImVuZEFuZ2xlIiwiX3BvbGFyIiwiX3BvbGFyMiIsIl9zbGljZWRUb0FycmF5IiwieDEiLCJ5MSIsIl9wb2xhcjMiLCJfcG9sYXI0IiwieDIiLCJ5MiIsImxhcmdlQXJjIiwiY29uY2F0IiwiTUFJQVZpekRvbnV0IiwiX3JlZiIsIl9zcGVjJHRpdGxlIiwic3BlYyIsImRhdGEiLCJ0b3RhbCIsInJlZHVjZSIsInN1bSIsImQiLCJ2YWx1ZSIsImxlbmd0aCIsImN1cnNvciIsInNlZ21lbnRzIiwibWFwIiwiaSIsIl9kJGNvbG9yIiwic3RhcnQiLCJlbmQiLCJfb2JqZWN0U3ByZWFkIiwiY29sb3IiLCJwY3QiLCJyb3VuZCIsInBhdGgiLCJjbGFzc05hbWUiLCJjaGlsZHJlbiIsInRpdGxlIiwidmlld0JveCIsIndpZHRoIiwiaGVpZ2h0Iiwicm9sZSIsInMiLCJmaWxsIiwic3Ryb2tlIiwic3Ryb2tlV2lkdGgiLCJzdHJva2VMaW5lY2FwIiwibGFiZWwiLCJ4IiwieSIsInRleHRBbmNob3IiLCJmb250U2l6ZSIsImZvbnRXZWlnaHQiLCJ0ZXh0IiwidGV4dE11dGVkIiwic3R5bGUiLCJiYWNrZ3JvdW5kQ29sb3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9hdG9tcy9NQUlBVml6L01BSUFWaXpEb251dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRG9udXRTcGVjLCBDT1JfQ09MT1JTLCBDT1JfQ0hBUlRfQ09MT1JTIH0gZnJvbSAnLi9NQUlBVml6LnR5cGVzJ1xuaW1wb3J0IHsgbm9ybWFsaXplU2VyaWVzIH0gZnJvbSAnLi9NQUlBVml6LnBhcnNlJ1xuXG50eXBlIE1BSUFWaXpEb251dFByb3BzID0ge1xuICBzcGVjOiBEb251dFNwZWNcbn1cblxuY29uc3QgU0laRSA9IDIwMFxuY29uc3QgU1RST0tFID0gMzRcbmNvbnN0IFIgPSAoU0laRSAtIFNUUk9LRSkgLyAyXG5jb25zdCBDRU5URVIgPSBTSVpFIC8gMlxuXG5jb25zdCBwb2xhciA9IChhbmdsZURlZzogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IHJhZCA9ICgoYW5nbGVEZWcgLSA5MCkgKiBNYXRoLlBJKSAvIDE4MFxuICByZXR1cm4gW0NFTlRFUiArIFIgKiBNYXRoLmNvcyhyYWQpLCBDRU5URVIgKyBSICogTWF0aC5zaW4ocmFkKV1cbn1cblxuY29uc3QgYXJjUGF0aCA9IChzdGFydEFuZ2xlOiBudW1iZXIsIGVuZEFuZ2xlOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBbeDEsIHkxXSA9IHBvbGFyKHN0YXJ0QW5nbGUpXG4gIGNvbnN0IFt4MiwgeTJdID0gcG9sYXIoZW5kQW5nbGUpXG4gIGNvbnN0IGxhcmdlQXJjID0gZW5kQW5nbGUgLSBzdGFydEFuZ2xlID4gMTgwID8gMSA6IDBcbiAgcmV0dXJuIGBNICR7eDF9ICR7eTF9IEEgJHtSfSAke1J9IDAgJHtsYXJnZUFyY30gMSAke3gyfSAke3kyfWBcbn1cblxuZXhwb3J0IGNvbnN0IE1BSUFWaXpEb251dCA9ICh7IHNwZWMgfTogTUFJQVZpekRvbnV0UHJvcHMpID0+IHtcbiAgY29uc3QgZGF0YSA9IG5vcm1hbGl6ZVNlcmllcyhzcGVjLmRhdGEpXG4gIGNvbnN0IHRvdGFsID0gZGF0YS5yZWR1Y2UoKHN1bSwgZCkgPT4gc3VtICsgZC52YWx1ZSwgMClcbiAgaWYgKCFkYXRhLmxlbmd0aCB8fCB0b3RhbCA8PSAwKSByZXR1cm4gbnVsbFxuXG4gIGxldCBjdXJzb3IgPSAwXG4gIGNvbnN0IHNlZ21lbnRzID0gZGF0YS5tYXAoKGQsIGkpID0+IHtcbiAgICBjb25zdCBzdGFydCA9IChjdXJzb3IgLyB0b3RhbCkgKiAzNjBcbiAgICBjdXJzb3IgKz0gZC52YWx1ZVxuICAgIGNvbnN0IGVuZCA9IChjdXJzb3IgLyB0b3RhbCkgKiAzNjBcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZCxcbiAgICAgIGNvbG9yOiBkLmNvbG9yID8/IENPUl9DSEFSVF9DT0xPUlNbaSAlIENPUl9DSEFSVF9DT0xPUlMubGVuZ3RoXSxcbiAgICAgIHBjdDogTWF0aC5yb3VuZCgoZC52YWx1ZSAvIHRvdGFsKSAqIDEwMCksXG4gICAgICAvLyBFdml0YSBlbCBhcmNvIGNvbXBsZXRvIGRlIDM2MMKwIChubyBzZSBkaWJ1amEpOyBsbyByZWNvcnRhbW9zIGFwZW5hcy5cbiAgICAgIHBhdGg6IGFyY1BhdGgoc3RhcnQsIGVuZCA+PSAzNjAgPyAzNTkuOTkgOiBlbmQpLFxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gKFxuICAgIDxmaWd1cmUgY2xhc3NOYW1lPVwiTUFJQVZpei1maWd1cmVcIj5cbiAgICAgIHtzcGVjLnRpdGxlICYmIDxmaWdjYXB0aW9uIGNsYXNzTmFtZT1cIk1BSUFWaXotY2FwdGlvblwiPntzcGVjLnRpdGxlfTwvZmlnY2FwdGlvbj59XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIk1BSUFWaXotZG9udXRcIj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHZpZXdCb3g9e2AwIDAgJHtTSVpFfSAke1NJWkV9YH1cbiAgICAgICAgICB3aWR0aD17U0laRX1cbiAgICAgICAgICBoZWlnaHQ9e1NJWkV9XG4gICAgICAgICAgcm9sZT1cImltZ1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD17c3BlYy50aXRsZSA/PyAnR3LDoWZpY28gZGUgZG9uYSd9XG4gICAgICAgID5cbiAgICAgICAgICB7c2VnbWVudHMubWFwKHMgPT4gKFxuICAgICAgICAgICAgPHBhdGgga2V5PXtzLmxhYmVsfSBkPXtzLnBhdGh9IGZpbGw9XCJub25lXCIgc3Ryb2tlPXtzLmNvbG9yfSBzdHJva2VXaWR0aD17U1RST0tFfSBzdHJva2VMaW5lY2FwPVwiYnV0dFwiPlxuICAgICAgICAgICAgICA8dGl0bGU+e2Ake3MubGFiZWx9OiAke3MucGN0fSVgfTwvdGl0bGU+XG4gICAgICAgICAgICA8L3BhdGg+XG4gICAgICAgICAgKSl9XG4gICAgICAgICAgPHRleHQgeD17Q0VOVEVSfSB5PXtDRU5URVIgLSA0fSB0ZXh0QW5jaG9yPVwibWlkZGxlXCIgZm9udFNpemU9ezIyfSBmb250V2VpZ2h0PXs2MDB9IGZpbGw9e0NPUl9DT0xPUlMudGV4dH0+XG4gICAgICAgICAgICB7dG90YWx9XG4gICAgICAgICAgPC90ZXh0PlxuICAgICAgICAgIDx0ZXh0IHg9e0NFTlRFUn0geT17Q0VOVEVSICsgMTZ9IHRleHRBbmNob3I9XCJtaWRkbGVcIiBmb250U2l6ZT17MTF9IGZpbGw9e0NPUl9DT0xPUlMudGV4dE11dGVkfT5cbiAgICAgICAgICAgIFRvdGFsXG4gICAgICAgICAgPC90ZXh0PlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHVsIGNsYXNzTmFtZT1cIk1BSUFWaXotbGVnZW5kXCI+XG4gICAgICAgICAge3NlZ21lbnRzLm1hcChzID0+IChcbiAgICAgICAgICAgIDxsaSBrZXk9e3MubGFiZWx9PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJNQUlBVml6LWxlZ2VuZC1kb3RcIiBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6IHMuY29sb3IgfX0gLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiTUFJQVZpei1sZWdlbmQtbGFiZWxcIj57cy5sYWJlbH08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIk1BSUFWaXotbGVnZW5kLXZhbHVlXCI+e3MucGN0fSU8L3NwYW4+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgPC9maWd1cmU+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLFNBQW9CQSxVQUFVLEVBQUVDLGdCQUFnQixRQUFRLGlCQUFpQjtBQUN6RSxTQUFTQyxlQUFlLFFBQVEsaUJBQWlCO0FBQUEsU0FBQUMsR0FBQSxJQUFBQyxJQUFBLEVBQUFDLElBQUEsSUFBQUMsS0FBQTtBQU1qRCxJQUFNQyxJQUFJLEdBQUcsR0FBRztBQUNoQixJQUFNQyxNQUFNLEdBQUcsRUFBRTtBQUNqQixJQUFNQyxDQUFDLEdBQUcsQ0FBQ0YsSUFBSSxHQUFHQyxNQUFNLElBQUksQ0FBQztBQUM3QixJQUFNRSxNQUFNLEdBQUdILElBQUksR0FBRyxDQUFDO0FBRXZCLElBQU1JLEtBQUssR0FBRyxTQUFSQSxLQUFLQSxDQUFJQyxRQUFnQixFQUF1QjtFQUNwRCxJQUFNQyxHQUFHLEdBQUksQ0FBQ0QsUUFBUSxHQUFHLEVBQUUsSUFBSUUsSUFBSSxDQUFDQyxFQUFFLEdBQUksR0FBRztFQUM3QyxPQUFPLENBQUNMLE1BQU0sR0FBR0QsQ0FBQyxHQUFHSyxJQUFJLENBQUNFLEdBQUcsQ0FBQ0gsR0FBRyxDQUFDLEVBQUVILE1BQU0sR0FBR0QsQ0FBQyxHQUFHSyxJQUFJLENBQUNHLEdBQUcsQ0FBQ0osR0FBRyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELElBQU1LLE9BQU8sR0FBRyxTQUFWQSxPQUFPQSxDQUFJQyxVQUFrQixFQUFFQyxRQUFnQixFQUFhO0VBQ2hFLElBQUFDLE1BQUEsR0FBaUJWLEtBQUssQ0FBQ1EsVUFBVSxDQUFDO0lBQUFHLE9BQUEsR0FBQUMsY0FBQSxDQUFBRixNQUFBO0lBQTNCRyxFQUFFLEdBQUFGLE9BQUE7SUFBRUcsRUFBRSxHQUFBSCxPQUFBO0VBQ2IsSUFBQUksT0FBQSxHQUFpQmYsS0FBSyxDQUFDUyxRQUFRLENBQUM7SUFBQU8sT0FBQSxHQUFBSixjQUFBLENBQUFHLE9BQUE7SUFBekJFLEVBQUUsR0FBQUQsT0FBQTtJQUFFRSxFQUFFLEdBQUFGLE9BQUE7RUFDYixJQUFNRyxRQUFRLEdBQUdWLFFBQVEsR0FBR0QsVUFBVSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUNwRCxZQUFBWSxNQUFBLENBQVlQLEVBQUUsT0FBQU8sTUFBQSxDQUFJTixFQUFFLFNBQUFNLE1BQUEsQ0FBTXRCLENBQUMsT0FBQXNCLE1BQUEsQ0FBSXRCLENBQUMsU0FBQXNCLE1BQUEsQ0FBTUQsUUFBUSxTQUFBQyxNQUFBLENBQU1ILEVBQUUsT0FBQUcsTUFBQSxDQUFJRixFQUFFO0FBQzlELENBQUM7QUFFRCxPQUFPLElBQU1HLFlBQVksR0FBRyxTQUFmQSxZQUFZQSxDQUFBQyxJQUFBLEVBQW9DO0VBQUEsSUFBQUMsV0FBQTtFQUFBLElBQTlCQyxJQUFJLEdBQUFGLElBQUEsQ0FBSkUsSUFBSTtFQUNqQyxJQUFNQyxJQUFJLEdBQUdsQyxlQUFlLENBQUNpQyxJQUFJLENBQUNDLElBQUksQ0FBQztFQUN2QyxJQUFNQyxLQUFLLEdBQUdELElBQUksQ0FBQ0UsTUFBTSxDQUFDLFVBQUNDLEdBQUcsRUFBRUMsQ0FBQztJQUFBLE9BQUtELEdBQUcsR0FBR0MsQ0FBQyxDQUFDQyxLQUFLO0VBQUEsR0FBRSxDQUFDLENBQUM7RUFDdkQsSUFBSSxDQUFDTCxJQUFJLENBQUNNLE1BQU0sSUFBSUwsS0FBSyxJQUFJLENBQUMsRUFBRSxPQUFPLElBQUk7RUFFM0MsSUFBSU0sTUFBTSxHQUFHLENBQUM7RUFDZCxJQUFNQyxRQUFRLEdBQUdSLElBQUksQ0FBQ1MsR0FBRyxDQUFDLFVBQUNMLENBQUMsRUFBRU0sQ0FBQyxFQUFLO0lBQUEsSUFBQUMsUUFBQTtJQUNsQyxJQUFNQyxLQUFLLEdBQUlMLE1BQU0sR0FBR04sS0FBSyxHQUFJLEdBQUc7SUFDcENNLE1BQU0sSUFBSUgsQ0FBQyxDQUFDQyxLQUFLO0lBQ2pCLElBQU1RLEdBQUcsR0FBSU4sTUFBTSxHQUFHTixLQUFLLEdBQUksR0FBRztJQUNsQyxPQUFBYSxhQUFBLENBQUFBLGFBQUEsS0FDS1YsQ0FBQztNQUNKVyxLQUFLLEdBQUFKLFFBQUEsR0FBRVAsQ0FBQyxDQUFDVyxLQUFLLGNBQUFKLFFBQUEsY0FBQUEsUUFBQSxHQUFJOUMsZ0JBQWdCLENBQUM2QyxDQUFDLEdBQUc3QyxnQkFBZ0IsQ0FBQ3lDLE1BQU0sQ0FBQztNQUMvRFUsR0FBRyxFQUFFdEMsSUFBSSxDQUFDdUMsS0FBSyxDQUFFYixDQUFDLENBQUNDLEtBQUssR0FBR0osS0FBSyxHQUFJLEdBQUcsQ0FBQztNQUN4QztNQUNBaUIsSUFBSSxFQUFFcEMsT0FBTyxDQUFDOEIsS0FBSyxFQUFFQyxHQUFHLElBQUksR0FBRyxHQUFHLE1BQU0sR0FBR0EsR0FBRztJQUFDO0VBRW5ELENBQUMsQ0FBQztFQUVGLG9CQUNFM0MsS0FBQTtJQUFRaUQsU0FBUyxFQUFDLGdCQUFnQjtJQUFBQyxRQUFBLEdBQy9CckIsSUFBSSxDQUFDc0IsS0FBSyxpQkFBSXJELElBQUE7TUFBWW1ELFNBQVMsRUFBQyxpQkFBaUI7TUFBQUMsUUFBQSxFQUFFckIsSUFBSSxDQUFDc0I7SUFBSyxDQUFhLENBQUMsZUFDaEZuRCxLQUFBO01BQUtpRCxTQUFTLEVBQUMsZUFBZTtNQUFBQyxRQUFBLGdCQUM1QmxELEtBQUE7UUFDRW9ELE9BQU8sU0FBQTNCLE1BQUEsQ0FBU3hCLElBQUksT0FBQXdCLE1BQUEsQ0FBSXhCLElBQUksQ0FBRztRQUMvQm9ELEtBQUssRUFBRXBELElBQUs7UUFDWnFELE1BQU0sRUFBRXJELElBQUs7UUFDYnNELElBQUksRUFBQyxLQUFLO1FBQ1YsZUFBQTNCLFdBQUEsR0FBWUMsSUFBSSxDQUFDc0IsS0FBSyxjQUFBdkIsV0FBQSxjQUFBQSxXQUFBLEdBQUksaUJBQWtCO1FBQUFzQixRQUFBLEdBRTNDWixRQUFRLENBQUNDLEdBQUcsQ0FBQyxVQUFBaUIsQ0FBQztVQUFBLG9CQUNiMUQsSUFBQTtZQUFvQm9DLENBQUMsRUFBRXNCLENBQUMsQ0FBQ1IsSUFBSztZQUFDUyxJQUFJLEVBQUMsTUFBTTtZQUFDQyxNQUFNLEVBQUVGLENBQUMsQ0FBQ1gsS0FBTTtZQUFDYyxXQUFXLEVBQUV6RCxNQUFPO1lBQUMwRCxhQUFhLEVBQUMsTUFBTTtZQUFBVixRQUFBLGVBQ25HcEQsSUFBQTtjQUFBb0QsUUFBQSxLQUFBekIsTUFBQSxDQUFXK0IsQ0FBQyxDQUFDSyxLQUFLLFFBQUFwQyxNQUFBLENBQUsrQixDQUFDLENBQUNWLEdBQUc7WUFBQSxDQUFXO1VBQUMsR0FEL0JVLENBQUMsQ0FBQ0ssS0FFUCxDQUFDO1FBQUEsQ0FDUixDQUFDLGVBQ0YvRCxJQUFBO1VBQU1nRSxDQUFDLEVBQUUxRCxNQUFPO1VBQUMyRCxDQUFDLEVBQUUzRCxNQUFNLEdBQUcsQ0FBRTtVQUFDNEQsVUFBVSxFQUFDLFFBQVE7VUFBQ0MsUUFBUSxFQUFFLEVBQUc7VUFBQ0MsVUFBVSxFQUFFLEdBQUk7VUFBQ1QsSUFBSSxFQUFFL0QsVUFBVSxDQUFDeUUsSUFBSztVQUFBakIsUUFBQSxFQUN0R25CO1FBQUssQ0FDRixDQUFDLGVBQ1BqQyxJQUFBO1VBQU1nRSxDQUFDLEVBQUUxRCxNQUFPO1VBQUMyRCxDQUFDLEVBQUUzRCxNQUFNLEdBQUcsRUFBRztVQUFDNEQsVUFBVSxFQUFDLFFBQVE7VUFBQ0MsUUFBUSxFQUFFLEVBQUc7VUFBQ1IsSUFBSSxFQUFFL0QsVUFBVSxDQUFDMEUsU0FBVTtVQUFBbEIsUUFBQSxFQUFDO1FBRS9GLENBQU0sQ0FBQztNQUFBLENBQ0osQ0FBQyxlQUNOcEQsSUFBQTtRQUFJbUQsU0FBUyxFQUFDLGdCQUFnQjtRQUFBQyxRQUFBLEVBQzNCWixRQUFRLENBQUNDLEdBQUcsQ0FBQyxVQUFBaUIsQ0FBQztVQUFBLG9CQUNieEQsS0FBQTtZQUFBa0QsUUFBQSxnQkFDRXBELElBQUE7Y0FBTW1ELFNBQVMsRUFBQyxvQkFBb0I7Y0FBQ29CLEtBQUssRUFBRTtnQkFBRUMsZUFBZSxFQUFFZCxDQUFDLENBQUNYO2NBQU07WUFBRSxDQUFFLENBQUMsZUFDNUUvQyxJQUFBO2NBQU1tRCxTQUFTLEVBQUMsc0JBQXNCO2NBQUFDLFFBQUEsRUFBRU0sQ0FBQyxDQUFDSztZQUFLLENBQU8sQ0FBQyxlQUN2RDdELEtBQUE7Y0FBTWlELFNBQVMsRUFBQyxzQkFBc0I7Y0FBQUMsUUFBQSxHQUFFTSxDQUFDLENBQUNWLEdBQUcsRUFBQyxHQUFDO1lBQUEsQ0FBTSxDQUFDO1VBQUEsR0FIL0NVLENBQUMsQ0FBQ0ssS0FJUCxDQUFDO1FBQUEsQ0FDTjtNQUFDLENBQ0EsQ0FBQztJQUFBLENBQ0YsQ0FBQztFQUFBLENBQ0EsQ0FBQztBQUViLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,34 @@
1
+ import { COR_COLORS } from './MAIAViz.types';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ var deltaColor = function deltaColor(trend) {
4
+ if (trend === 'up') return COR_COLORS.positive;
5
+ if (trend === 'down') return COR_COLORS.negative;
6
+ return COR_COLORS.neutral;
7
+ };
8
+ export var MAIAVizKpis = function MAIAVizKpis(_ref) {
9
+ var spec = _ref.spec;
10
+ var items = Array.isArray(spec.items) ? spec.items : [];
11
+ if (!items.length) return null;
12
+ return /*#__PURE__*/_jsx("div", {
13
+ className: "MAIAViz-kpis",
14
+ children: items.map(function (item) {
15
+ return /*#__PURE__*/_jsxs("div", {
16
+ className: "MAIAViz-kpi-card",
17
+ children: [/*#__PURE__*/_jsx("span", {
18
+ className: "MAIAViz-kpi-label",
19
+ children: item.label
20
+ }), /*#__PURE__*/_jsx("span", {
21
+ className: "MAIAViz-kpi-value",
22
+ children: item.value
23
+ }), item.delta && /*#__PURE__*/_jsx("span", {
24
+ className: "MAIAViz-kpi-delta",
25
+ style: {
26
+ color: deltaColor(item.trend)
27
+ },
28
+ children: item.delta
29
+ })]
30
+ }, item.label);
31
+ })
32
+ });
33
+ };
34
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT1JfQ09MT1JTIiwianN4IiwiX2pzeCIsImpzeHMiLCJfanN4cyIsImRlbHRhQ29sb3IiLCJ0cmVuZCIsInBvc2l0aXZlIiwibmVnYXRpdmUiLCJuZXV0cmFsIiwiTUFJQVZpektwaXMiLCJfcmVmIiwic3BlYyIsIml0ZW1zIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiY2xhc3NOYW1lIiwiY2hpbGRyZW4iLCJtYXAiLCJpdGVtIiwibGFiZWwiLCJ2YWx1ZSIsImRlbHRhIiwic3R5bGUiLCJjb2xvciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2F0b21zL01BSUFWaXovTUFJQVZpektwaXMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEtwaXNTcGVjLCBDT1JfQ09MT1JTLCBUcmVuZCB9IGZyb20gJy4vTUFJQVZpei50eXBlcydcblxudHlwZSBNQUlBVml6S3Bpc1Byb3BzID0ge1xuICBzcGVjOiBLcGlzU3BlY1xufVxuXG5jb25zdCBkZWx0YUNvbG9yID0gKHRyZW5kPzogVHJlbmQpOiBzdHJpbmcgPT4ge1xuICBpZiAodHJlbmQgPT09ICd1cCcpIHJldHVybiBDT1JfQ09MT1JTLnBvc2l0aXZlXG4gIGlmICh0cmVuZCA9PT0gJ2Rvd24nKSByZXR1cm4gQ09SX0NPTE9SUy5uZWdhdGl2ZVxuICByZXR1cm4gQ09SX0NPTE9SUy5uZXV0cmFsXG59XG5cbmV4cG9ydCBjb25zdCBNQUlBVml6S3BpcyA9ICh7IHNwZWMgfTogTUFJQVZpektwaXNQcm9wcykgPT4ge1xuICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkoc3BlYy5pdGVtcykgPyBzcGVjLml0ZW1zIDogW11cbiAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIk1BSUFWaXota3Bpc1wiPlxuICAgICAge2l0ZW1zLm1hcChpdGVtID0+IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJNQUlBVml6LWtwaS1jYXJkXCIga2V5PXtpdGVtLmxhYmVsfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJNQUlBVml6LWtwaS1sYWJlbFwiPntpdGVtLmxhYmVsfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJNQUlBVml6LWtwaS12YWx1ZVwiPntpdGVtLnZhbHVlfTwvc3Bhbj5cbiAgICAgICAgICB7aXRlbS5kZWx0YSAmJiAoXG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJNQUlBVml6LWtwaS1kZWx0YVwiIHN0eWxlPXt7IGNvbG9yOiBkZWx0YUNvbG9yKGl0ZW0udHJlbmQpIH19PlxuICAgICAgICAgICAgICB7aXRlbS5kZWx0YX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICkpfVxuICAgIDwvZGl2PlxuICApXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQW1CQSxVQUFVLFFBQWUsaUJBQWlCO0FBQUEsU0FBQUMsR0FBQSxJQUFBQyxJQUFBLEVBQUFDLElBQUEsSUFBQUMsS0FBQTtBQU03RCxJQUFNQyxVQUFVLEdBQUcsU0FBYkEsVUFBVUEsQ0FBSUMsS0FBYSxFQUFhO0VBQzVDLElBQUlBLEtBQUssS0FBSyxJQUFJLEVBQUUsT0FBT04sVUFBVSxDQUFDTyxRQUFRO0VBQzlDLElBQUlELEtBQUssS0FBSyxNQUFNLEVBQUUsT0FBT04sVUFBVSxDQUFDUSxRQUFRO0VBQ2hELE9BQU9SLFVBQVUsQ0FBQ1MsT0FBTztBQUMzQixDQUFDO0FBRUQsT0FBTyxJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBQUMsSUFBQSxFQUFtQztFQUFBLElBQTdCQyxJQUFJLEdBQUFELElBQUEsQ0FBSkMsSUFBSTtFQUNoQyxJQUFNQyxLQUFLLEdBQUdDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDSCxJQUFJLENBQUNDLEtBQUssQ0FBQyxHQUFHRCxJQUFJLENBQUNDLEtBQUssR0FBRyxFQUFFO0VBQ3pELElBQUksQ0FBQ0EsS0FBSyxDQUFDRyxNQUFNLEVBQUUsT0FBTyxJQUFJO0VBRTlCLG9CQUNFZCxJQUFBO0lBQUtlLFNBQVMsRUFBQyxjQUFjO0lBQUFDLFFBQUEsRUFDMUJMLEtBQUssQ0FBQ00sR0FBRyxDQUFDLFVBQUFDLElBQUk7TUFBQSxvQkFDYmhCLEtBQUE7UUFBS2EsU0FBUyxFQUFDLGtCQUFrQjtRQUFBQyxRQUFBLGdCQUMvQmhCLElBQUE7VUFBTWUsU0FBUyxFQUFDLG1CQUFtQjtVQUFBQyxRQUFBLEVBQUVFLElBQUksQ0FBQ0M7UUFBSyxDQUFPLENBQUMsZUFDdkRuQixJQUFBO1VBQU1lLFNBQVMsRUFBQyxtQkFBbUI7VUFBQUMsUUFBQSxFQUFFRSxJQUFJLENBQUNFO1FBQUssQ0FBTyxDQUFDLEVBQ3RERixJQUFJLENBQUNHLEtBQUssaUJBQ1RyQixJQUFBO1VBQU1lLFNBQVMsRUFBQyxtQkFBbUI7VUFBQ08sS0FBSyxFQUFFO1lBQUVDLEtBQUssRUFBRXBCLFVBQVUsQ0FBQ2UsSUFBSSxDQUFDZCxLQUFLO1VBQUUsQ0FBRTtVQUFBWSxRQUFBLEVBQzFFRSxJQUFJLENBQUNHO1FBQUssQ0FDUCxDQUNQO01BQUEsR0FQb0NILElBQUksQ0FBQ0MsS0FRdkMsQ0FBQztJQUFBLENBQ1A7RUFBQyxDQUNDLENBQUM7QUFFVixDQUFDIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,85 @@
1
+ # MAIAViz — PoC de visualizaciones inline en el chat
2
+
3
+ Renderiza KPIs, gráficos de barras y donas dentro de los mensajes de MAIA, igual
4
+ que Claude renderiza cuadros y gráficos. **El modelo no genera HTML ni SVG**: solo
5
+ emite datos en JSON dentro de un bloque de código ` ```maia-viz `. El render lo hace
6
+ el cliente (estos componentes), por lo que es seguro y no pasa por la sanitización
7
+ de HTML de Streamdown.
8
+
9
+ ## Cómo funciona
10
+
11
+ Streamdown expone `plugins.renderers` (el mismo mecanismo con el que integra Mermaid).
12
+ Registramos un `CustomRenderer` para el lenguaje `maia-viz`:
13
+
14
+ ```tsx
15
+ // maiaStreamdownRenderers.tsx
16
+ export const MAIA_STREAMDOWN_RENDERERS = [{ language: 'maia-viz', component: MAIAViz }]
17
+
18
+ // MAIAMessage.tsx
19
+ <Streamdown plugins={{ code, renderers: MAIA_STREAMDOWN_RENDERERS }}>{message}</Streamdown>
20
+ ```
21
+
22
+ Cuando el stream contiene un fence ` ```maia-viz `, Streamdown llama a `MAIAViz`
23
+ con `{ code, isIncomplete, language, meta }`. Mientras `isIncomplete` es `true`
24
+ (JSON parcial durante el streaming) mostramos un skeleton; al cerrarse el fence,
25
+ parseamos el JSON y dibujamos la visualización.
26
+
27
+ ## Contrato de datos
28
+
29
+ Un bloque `maia-viz` contiene **un** objeto JSON. Tipos soportados:
30
+
31
+ ### `kpis` — tarjetas de indicadores
32
+ ```maia-viz
33
+ { "type": "kpis", "items": [
34
+ { "label": "Ingresos", "value": "$184.6M", "delta": "+18.3% vs 2024", "trend": "up" },
35
+ { "label": "Margen EBITDA", "value": "21.4%", "delta": "+2.1 pts", "trend": "up" }
36
+ ] }
37
+ ```
38
+
39
+ ### `bar` — gráfico de barras
40
+ ```maia-viz
41
+ { "type": "bar", "title": "Ingresos por trimestre", "unit": "M USD", "data": [
42
+ { "label": "Q1", "value": 40 }, { "label": "Q2", "value": 44 },
43
+ { "label": "Q3", "value": 47 }, { "label": "Q4", "value": 52 }
44
+ ] }
45
+ ```
46
+
47
+ ### `donut` — distribución porcentual
48
+ ```maia-viz
49
+ { "type": "donut", "title": "Mix de ingresos", "data": [
50
+ { "label": "Last-mile", "value": 52 }, { "label": "Freight", "value": 28 },
51
+ { "label": "Warehousing", "value": 13 }, { "label": "Otros", "value": 7 }
52
+ ] }
53
+ ```
54
+
55
+ ### `report` — reporte compuesto (varios bloques)
56
+ ```maia-viz
57
+ { "type": "report", "title": "Nordvik Logistics — KPIs anuales",
58
+ "subtitle": "Año fiscal 2025 · Logística",
59
+ "blocks": [
60
+ { "type": "kpis", "items": [ ... ] },
61
+ { "type": "bar", "title": "Ingresos por trimestre", "unit": "M USD", "data": [ ... ] },
62
+ { "type": "donut", "title": "Mix de ingresos", "data": [ ... ] }
63
+ ] }
64
+ ```
65
+
66
+ Campos: `delta` y `trend` (`up`/`down`/`flat`) son opcionales; `trend` colorea el
67
+ delta (verde/rojo/gris). `color` (HEX) es opcional por punto; si no, se usa la
68
+ paleta de COR por índice (navy → blue → teal → green → purple → ...).
69
+
70
+ ## Snippet para el system prompt del agente
71
+
72
+ > Cuando presentes métricas, KPIs, distribuciones o series numéricas, podés
73
+ > renderizar una visualización emitiendo un bloque de código con el lenguaje
74
+ > `maia-viz` que contenga **un único objeto JSON válido** con el contrato
75
+ > documentado (tipos: `kpis`, `bar`, `donut`, `report`). No incluyas texto
76
+ > dentro del bloque, solo JSON. Usá una visualización solo cuando aporte valor
77
+ > sobre el texto; el resto del mensaje sigue siendo Markdown normal. Si no estás
78
+ > seguro de los datos, no inventes un gráfico.
79
+
80
+ ## Extensión
81
+
82
+ Agregar un tipo nuevo (p. ej. `line`): crear `MAIAVizLine.tsx`, sumarlo al
83
+ discriminador en `MAIAViz.tsx` (`renderBlock`) y al contrato en `MAIAViz.types.ts`.
84
+ Para charts más complejos/interactivos se puede reemplazar el SVG por Recharts sin
85
+ cambiar el contrato ni el cableado de Streamdown.
@@ -0,0 +1,2 @@
1
+ export { MAIAViz } from './MAIAViz';
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQUlBVml6Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvTUFJQVZpei9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBNQUlBVml6IH0gZnJvbSAnLi9NQUlBVml6J1xuZXhwb3J0IHR5cGUge1xuICBNYWlhVml6U3BlYyxcbiAgS3Bpc1NwZWMsXG4gIEJhclNwZWMsXG4gIERvbnV0U3BlYyxcbiAgUmVwb3J0U3BlYyxcbiAgUmVwb3J0QmxvY2ssXG4gIEtwaUl0ZW0sXG4gIFNlcmllc1BvaW50LFxufSBmcm9tICcuL01BSUFWaXoudHlwZXMnXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQU8sUUFBUSxXQUFXIiwiaWdub3JlTGlzdCI6W119