anteriority-ui 1.12.0 → 1.13.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 (26) hide show
  1. package/.verify-bundle.css +172 -68
  2. package/.verify-bundle.js +2 -2
  3. package/AnteriorityUI.md +262 -7
  4. package/README.md +34 -1
  5. package/index.js +112 -110
  6. package/package.json +7 -2
  7. package/screens/components/CalendarPicker/index.js +19 -7
  8. package/screens/components/Chart/components/BarChart/index.js +92 -0
  9. package/screens/components/Chart/components/LineChart/index.js +144 -0
  10. package/screens/components/Chart/components/NivoCalendarChart/index.js +56 -0
  11. package/screens/components/Chart/components/PieChart/index.js +127 -0
  12. package/screens/components/Chart/components/index.js +10 -0
  13. package/screens/components/Chart/constants.js +43 -0
  14. package/screens/components/Chart/index.js +55 -0
  15. package/screens/components/Chart/index.module.css +30 -0
  16. package/screens/components/MarkdownContent/copyBlocks.js +73 -0
  17. package/screens/components/MarkdownContent/index.js +53 -7
  18. package/screens/components/MarkdownContent/index.module.css +48 -0
  19. package/screens/components/MarkdownEditor/components/EditorContent/index.module.css +20 -0
  20. package/screens/components/MarkdownEditor/components/Toolbar/index.js +5 -1
  21. package/screens/components/MarkdownEditor/constants.js +2 -0
  22. package/screens/components/MarkdownEditor/index.js +12 -3
  23. package/screens/components/Material-UI/Components/Search/constants.js +4 -0
  24. package/screens/components/Material-UI/Components/Search/index.js +42 -2
  25. package/screens/components/Material-UI/Components/Selector/index.js +47 -8
  26. package/screens/components/Material-UI/Components/Selector/index.module.css +22 -0
@@ -441,6 +441,100 @@
441
441
  }
442
442
  }
443
443
 
444
+ /* dist/screens/components/Checks/index.module.css */
445
+ .Checks_itemContainer {
446
+ display: flex !important;
447
+ align-items: center !important;
448
+ justify-content: flex-start !important;
449
+ width: 100%;
450
+ padding: 8px 12px;
451
+ border-radius: 8px;
452
+ cursor: pointer;
453
+ transition: background-color 0.2s ease;
454
+ text-align: left !important;
455
+ user-select: none;
456
+ box-sizing: border-box;
457
+ }
458
+ .Checks_itemContainer:hover {
459
+ background-color: rgba(0, 0, 0, 0.04);
460
+ }
461
+ .Checks_checked {
462
+ background-color: var(--checks-checked-bg, rgba(25, 118, 210, 0.08));
463
+ }
464
+ .Checks_label {
465
+ font-size: 0.95rem;
466
+ color: var(--checks-label, #1e293b);
467
+ margin-left: 8px;
468
+ transition: color 0.2s ease;
469
+ }
470
+ .Checks_checked .Checks_label {
471
+ color: var(--checks-checked-label, #64748b);
472
+ text-decoration: line-through;
473
+ }
474
+ .Checks_iconOnly {
475
+ width: auto !important;
476
+ padding: 0 !important;
477
+ margin: 0 !important;
478
+ background-color: transparent !important;
479
+ border-radius: 0 !important;
480
+ display: inline-flex !important;
481
+ }
482
+ .Checks_iconOnly:hover {
483
+ background-color: transparent !important;
484
+ }
485
+ .Checks_animatedCheck {
486
+ animation: Checks_boxBounce 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
487
+ }
488
+ .Checks_animatedCheck svg path {
489
+ transform-origin: center;
490
+ animation: Checks_checkmarkDraw 0.28s cubic-bezier(0.16, 1, 0.3, 1) forwards;
491
+ }
492
+ @keyframes Checks_boxBounce {
493
+ 0% {
494
+ transform: scale(0.7);
495
+ }
496
+ 50% {
497
+ transform: scale(1.18);
498
+ }
499
+ 100% {
500
+ transform: scale(1);
501
+ }
502
+ }
503
+ @keyframes Checks_checkmarkDraw {
504
+ 0% {
505
+ opacity: 0;
506
+ transform: scale(0) rotate(-10deg);
507
+ }
508
+ 60% {
509
+ opacity: 1;
510
+ transform: scale(1.2) rotate(3deg);
511
+ }
512
+ 100% {
513
+ opacity: 1;
514
+ transform: scale(1) rotate(0deg);
515
+ }
516
+ }
517
+
518
+ /* dist/screens/components/Material-UI/Components/Selector/index.module.css */
519
+ .Selector_listbox {
520
+ scrollbar-width: thin;
521
+ scrollbar-color: var(--selector-scrollbar-thumb, rgba(100, 116, 139, 0.45)) transparent;
522
+ }
523
+ .Selector_listbox::-webkit-scrollbar {
524
+ width: 6px;
525
+ }
526
+ .Selector_listbox::-webkit-scrollbar-track {
527
+ background-color: transparent;
528
+ }
529
+ .Selector_listbox::-webkit-scrollbar-thumb {
530
+ background-color: var(--selector-scrollbar-thumb, rgba(100, 116, 139, 0.45));
531
+ border-radius: 999px;
532
+ }
533
+ .Selector_listbox::-webkit-scrollbar-thumb:hover,
534
+ .Selector_listbox::-webkit-scrollbar-thumb:active {
535
+ background-color: var(--selector-scrollbar-thumb-hover, rgba(71, 85, 105, 0.75));
536
+ }
537
+
444
538
  /* dist/screens/components/Sidebar/components/SidebarItem/index.module.css */
445
539
  .SidebarItem_sidebarItemBtn {
446
540
  position: relative !important;
@@ -4405,6 +4499,46 @@ button.TopBar_searchWrapper {
4405
4499
  border-radius: 0;
4406
4500
  color: inherit;
4407
4501
  }
4502
+ .MarkdownContent_copyableText {
4503
+ display: inline-flex;
4504
+ align-items: center;
4505
+ gap: 0.3rem;
4506
+ }
4507
+ .MarkdownContent_copyableTextButton {
4508
+ flex-shrink: 0;
4509
+ opacity: 0;
4510
+ transition: opacity 0.15s ease;
4511
+ }
4512
+ .MarkdownContent_copyableText:hover .MarkdownContent_copyableTextButton,
4513
+ .MarkdownContent_copyableText:focus-within .MarkdownContent_copyableTextButton,
4514
+ .MarkdownContent_copyableTextButton:focus-visible {
4515
+ opacity: 1;
4516
+ }
4517
+ .MarkdownContent_copyBlockWrapper {
4518
+ position: relative;
4519
+ padding: 0.75rem 1rem;
4520
+ border: 1px solid rgba(128, 128, 128, 0.2);
4521
+ border-radius: 8px;
4522
+ margin: 0 0 0.75em 0;
4523
+ }
4524
+ .MarkdownContent_copyBlockWrapper > *:first-child {
4525
+ margin-top: 0;
4526
+ }
4527
+ .MarkdownContent_copyBlockWrapper > *:last-child {
4528
+ margin-bottom: 0;
4529
+ }
4530
+ .MarkdownContent_copyBlockButton {
4531
+ position: absolute;
4532
+ top: 0.6rem;
4533
+ right: 0.6rem;
4534
+ opacity: 0;
4535
+ transition: opacity 0.15s ease;
4536
+ }
4537
+ .MarkdownContent_copyBlockWrapper:hover .MarkdownContent_copyBlockButton,
4538
+ .MarkdownContent_copyBlockWrapper:focus-within .MarkdownContent_copyBlockButton,
4539
+ .MarkdownContent_copyBlockButton:focus-visible {
4540
+ opacity: 1;
4541
+ }
4408
4542
  .MarkdownContent_codeBlockWrapper {
4409
4543
  position: relative;
4410
4544
  }
@@ -5020,78 +5154,32 @@ button.TopBar_searchWrapper {
5020
5154
  }
5021
5155
  }
5022
5156
 
5023
- /* dist/screens/components/Checks/index.module.css */
5024
- .Checks_itemContainer {
5025
- display: flex !important;
5026
- align-items: center !important;
5027
- justify-content: flex-start !important;
5028
- width: 100%;
5029
- padding: 8px 12px;
5030
- border-radius: 8px;
5031
- cursor: pointer;
5032
- transition: background-color 0.2s ease;
5033
- text-align: left !important;
5034
- user-select: none;
5035
- box-sizing: border-box;
5036
- }
5037
- .Checks_itemContainer:hover {
5038
- background-color: rgba(0, 0, 0, 0.04);
5039
- }
5040
- .Checks_checked {
5041
- background-color: var(--checks-checked-bg, rgba(25, 118, 210, 0.08));
5042
- }
5043
- .Checks_label {
5044
- font-size: 0.95rem;
5045
- color: var(--checks-label, #1e293b);
5046
- margin-left: 8px;
5047
- transition: color 0.2s ease;
5048
- }
5049
- .Checks_checked .Checks_label {
5050
- color: var(--checks-checked-label, #64748b);
5051
- text-decoration: line-through;
5052
- }
5053
- .Checks_iconOnly {
5054
- width: auto !important;
5055
- padding: 0 !important;
5056
- margin: 0 !important;
5057
- background-color: transparent !important;
5058
- border-radius: 0 !important;
5059
- display: inline-flex !important;
5060
- }
5061
- .Checks_iconOnly:hover {
5062
- background-color: transparent !important;
5157
+ /* dist/screens/components/Chart/index.module.css */
5158
+ .Chart_wrapper {
5159
+ background-color: var(--chart-bg, #ffffff);
5160
+ border: 2px solid var(--chart-border, #e5e7eb);
5161
+ border-radius: 6px;
5162
+ padding: 12px;
5063
5163
  }
5064
- .Checks_animatedCheck {
5065
- animation: Checks_boxBounce 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
5164
+ .Chart_header {
5165
+ display: flex;
5166
+ align-items: center;
5167
+ justify-content: space-between;
5168
+ gap: 12px;
5169
+ margin-bottom: 8px;
5066
5170
  }
5067
- .Checks_animatedCheck svg path {
5068
- transform-origin: center;
5069
- animation: Checks_checkmarkDraw 0.28s cubic-bezier(0.16, 1, 0.3, 1) forwards;
5171
+ .Chart_title {
5172
+ margin-bottom: 0;
5173
+ min-width: 0;
5070
5174
  }
5071
- @keyframes Checks_boxBounce {
5072
- 0% {
5073
- transform: scale(0.7);
5074
- }
5075
- 50% {
5076
- transform: scale(1.18);
5077
- }
5078
- 100% {
5079
- transform: scale(1);
5080
- }
5175
+ .Chart_actions {
5176
+ display: flex;
5177
+ align-items: center;
5178
+ gap: 8px;
5179
+ flex-shrink: 0;
5081
5180
  }
5082
- @keyframes Checks_checkmarkDraw {
5083
- 0% {
5084
- opacity: 0;
5085
- transform: scale(0) rotate(-10deg);
5086
- }
5087
- 60% {
5088
- opacity: 1;
5089
- transform: scale(1.2) rotate(3deg);
5090
- }
5091
- 100% {
5092
- opacity: 1;
5093
- transform: scale(1) rotate(0deg);
5094
- }
5181
+ .Chart_description {
5182
+ margin-top: 8px;
5095
5183
  }
5096
5184
 
5097
5185
  /* dist/screens/components/Input/index.module.css */
@@ -6381,6 +6469,22 @@ button.TopBar_searchWrapper {
6381
6469
  resize: none;
6382
6470
  outline: none;
6383
6471
  overflow-y: auto;
6472
+ scrollbar-width: thin;
6473
+ scrollbar-color: var(--markdown-editor-scrollbar-thumb, rgba(100, 116, 139, 0.45)) transparent;
6474
+ }
6475
+ .EditorContent_textarea::-webkit-scrollbar {
6476
+ width: 6px;
6477
+ }
6478
+ .EditorContent_textarea::-webkit-scrollbar-track {
6479
+ background-color: transparent;
6480
+ }
6481
+ .EditorContent_textarea::-webkit-scrollbar-thumb {
6482
+ background-color: var(--markdown-editor-scrollbar-thumb, rgba(100, 116, 139, 0.45));
6483
+ border-radius: 999px;
6484
+ }
6485
+ .EditorContent_textarea::-webkit-scrollbar-thumb:hover,
6486
+ .EditorContent_textarea::-webkit-scrollbar-thumb:active {
6487
+ background-color: var(--markdown-editor-scrollbar-thumb-hover, rgba(71, 85, 105, 0.75));
6384
6488
  }
6385
6489
  .EditorContent_textarea::placeholder {
6386
6490
  color: #6b7280;
package/.verify-bundle.js CHANGED
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/.verify-bundle.js
3
- size: 57852198 bytes
4
- sha256: 774b560092dcd68bdc092daeeb17edee0b73907c57b8d75e8611d52d1d4fcd1b
3
+ size: 59203832 bytes
4
+ sha256: 093b38d58005defe6b5be7a4b3a7f2351cbbafd7650e46728f51ef53d0b626cb
package/AnteriorityUI.md CHANGED
@@ -694,6 +694,7 @@ import CalendarPicker from '../CalendarPicker/index'; // export default
694
694
  - `holidayColor` (color del *texto* del nombre del feriado) solo existe en `variant="inline"`, porque el popover nunca muestra ese texto. `holidayBorderColor`/`moonPhaseColor`/`tooltipBgColor`/`tooltipTextColor` sí aplican a ambas variantes.
695
695
  - `bgColor`/`textColor`/`mutedColor`/`mutedBgColor`/`borderColor`/`hoverColor` (paleta general del calendario grande) solo existen en `variant="inline"` — el popover usa su propia paleta fija (ver `selectedColor`/`accentColor`).
696
696
  - El cálculo de feriados usa `date-holidays` (datos reales por país, no hardcodeados en la librería); el de fase lunar es un cálculo astronómico aproximado por ciclo sinódico (sin dependencia de red), con ±1 día de margen de error — no reemplaza una efeméride astronómica oficial.
697
+ - El popover (`variant="popover"`) se reposiciona automáticamente para no desbordar el viewport: si el input está cerca del borde derecho (o dentro de un contenedor angosto), se desplaza hacia la izquierda lo necesario para quedar completo en pantalla, clampeando también por la izquierda si el contenedor es más angosto que el popover (320px). Se recalcula al abrir y en cada `resize` de la ventana — no requiere ninguna prop.
697
698
 
698
699
  ---
699
700
 
@@ -831,6 +832,195 @@ import CardV1 from '../CardV1'; // export default (index.jsx)
831
832
 
832
833
  ---
833
834
 
835
+ ### Chart
836
+
837
+ Gráficos con un componente único que delega a un motor distinto según `type`: `"line"` y `"bar"` usan [Recharts](https://recharts.org/), `"pie"` usa [@nivo/pie](https://nivo.rocks/pie/) y `"nivo-calendar"` (calendario de actividad estilo GitHub contributions) usa [@nivo/calendar](https://nivo.rocks/calendar/). La card exterior soporta `title`/`description` en Markdown (vía `MarkdownContent`) y un slot `actions` libre (cualquier `ReactNode`: `Search`, `Selector`, `Swich`, botones, etc.) en el header, al lado del título.
838
+
839
+ **Import:**
840
+ ```jsx
841
+ import Chart from '../Chart/index'; // export default
842
+ ```
843
+
844
+ **Uso básico:**
845
+ ```jsx
846
+ <Chart
847
+ type="line"
848
+ data={[{ month: 'Jan', revenue: 4200 }, { month: 'Feb', revenue: 5800 }]}
849
+ xKey="month"
850
+ lines={[{ dataKey: 'revenue' }]}
851
+ />
852
+ ```
853
+
854
+ **Props comunes (`Chart`, el wrapper — aplican sin importar el `type`):**
855
+
856
+ | Prop | Tipo | Default | Descripción |
857
+ |---|---|---|---|
858
+ | `type` | `'line'` \| `'pie'` \| `'bar'` \| `'nivo-calendar'` | `'line'` | Motor de gráfico a renderizar. También expuesto como `Chart.TYPE`. |
859
+ | `title` | string (Markdown) | — | Título renderizado arriba del gráfico con `MarkdownContent` (soporta headings, negrita, links, etc.). |
860
+ | `description` | string (Markdown) | — | Texto renderizado debajo del gráfico con `MarkdownContent`. |
861
+ | `actions` | node | — | Contenido libre en el header, a la derecha del `title` (ej. `Search`, `Selector`, `Swich`, botones de ícono, filtros de fecha). El header solo se renderiza si hay `title` y/o `actions`. |
862
+ | `bgColor` | string | `#ffffff` | Fondo de la card contenedora. |
863
+ | `borderColor` | string | `#e5e7eb` | Color del borde (2px) de la card. El radio es fijo en 6px. |
864
+ | `titleColor` | string | — | Color de texto del `title`. |
865
+ | `descriptionColor` | string | — | Color de texto del `description`. |
866
+ | `className` | string | `''` | Clase adicional en la card. |
867
+ | `style` | object | — | Estilos inline adicionales en la card. |
868
+
869
+ El resto de las props (`data`, colores específicos del motor, etc.) depende del `type` y se pasa directo al mini-componente correspondiente — ver cada uno abajo.
870
+
871
+ ---
872
+
873
+ #### Chart (`type="line"`)
874
+
875
+ Basado en Recharts `LineChart`. Soporta eje X categórico o numérico, múltiples líneas, referencias (línea/punto) y tick icons custom en el eje X.
876
+
877
+ | Prop | Tipo | Default | Descripción |
878
+ |---|---|---|---|
879
+ | `data` | array | — | `[{ [xKey]: valor, [lines[i].dataKey]: number }]`. |
880
+ | `lines` | array | — | `[{ dataKey, name?, color?, strokeWidth?, strokeDasharray? }]`. Color por default según `DEFAULT_LINE_COLORS` (ciclo de 5 colores) si no se pasa `color`. |
881
+ | `xKey` | string | `'name'` | Key de `data` usada en el eje X. |
882
+ | `xType` | `'category'` \| `'number'` | `'category'` | Tipo de eje X (default real de Recharts). |
883
+ | `xTicks` | array de number | — | Valores fijos de los ticks del eje X. |
884
+ | `xScale` | string | `'auto'` | Escala del eje X (`'auto'`, `'linear'`, `'symlog'`, etc. — cualquier escala válida de Recharts). |
885
+ | `xTickIcon` | `function(value) => pathString` | — | Si se pasa, reemplaza el tick de texto del eje X por un ícono SVG (path `d`, viewBox 1024×1024). |
886
+ | `xTickIconColor` | string | hereda `axisColor` | Color del ícono del tick. |
887
+ | `xTickIconSize` | number | `24` | Tamaño (px) del ícono del tick. |
888
+ | `xAxisHeight` | number | — | Alto del eje X (útil para dar espacio a `xTickIcon`). |
889
+ | `yTicks` | array de number | — | Valores fijos de los ticks del eje Y. |
890
+ | `yScale` | string | `'auto'` | Escala del eje Y. |
891
+ | `showGrid` | bool | `true` | Muestra el `CartesianGrid`. |
892
+ | `showTooltip` | bool | `true` | Muestra el tooltip al hover. |
893
+ | `showLegend` | bool | `true` | Muestra la leyenda. |
894
+ | `referenceLines` | array | `[]` | `[{ y, label?, labelPosition?, color?, strokeDasharray? }]` — línea horizontal en un valor de dato. |
895
+ | `referenceDots` | array | `[]` | `[{ x, y, label?, labelPosition?, color?, radius? }]` — punto destacado en coordenadas de dato. |
896
+ | `gridColor` | string | `#c7d2fe` | Color del grid. |
897
+ | `axisColor` | string | `#4338ca` | Color de los ejes. |
898
+ | `textColor` | string | `#1e1b4b` | Color del texto de ticks y del label del tooltip. |
899
+ | `tooltipBgColor` | string | `#eef2ff` | Fondo del tooltip. |
900
+ | `tooltipBorderColor` | string | `#4338ca` | Borde del tooltip. |
901
+ | `tooltipTextColor` | string | — | Color de cada fila del tooltip (por default toma el color de su línea). |
902
+ | `legendTextColor` | string | — | Color del texto de la leyenda (por default toma el color de su línea). |
903
+ | `height` | number | `300` | Alto en px del gráfico. |
904
+
905
+ ---
906
+
907
+ #### Chart (`type="bar"`)
908
+
909
+ Basado en Recharts `BarChart`. Soporta múltiples series, color por serie o por item individual, labels encima de cada barra y ejes formateados.
910
+
911
+ | Prop | Tipo | Default | Descripción |
912
+ |---|---|---|---|
913
+ | `data` | array | — | `[{ [xKey]: valor, [bars[i].dataKey]: number, color? }]`. `color` por item pisa el color de la serie en esa barra puntual (ej. un color distinto por categoría dentro de una única serie). |
914
+ | `bars` | array | — | `[{ dataKey, name?, color?, unit?, showValueLabel?, labelFormatter? }]`. |
915
+ | `xKey` | string | `'name'` | Key de `data` usada en el eje X. |
916
+ | `xTickFormatter` | `function(value)` | — | Formatea el texto de cada tick del eje X. |
917
+ | `yTickFormatter` | `function(value)` | — | Formatea el texto de cada tick del eje Y. |
918
+ | `xAxisLabel` | string | — | Título del eje X (posición `insideBottomRight`). |
919
+ | `yLabel` | string | — | Título del eje Y, rotado (posición `insideLeft`). |
920
+ | `yDomain` | `[min, max]` | — | Dominio fijo del eje Y (activa `allowDataOverflow`). |
921
+ | `yAxisWidth` | number | — | Ancho del eje Y (útil cuando `yLabel`/los ticks son largos). |
922
+ | `showGrid` | bool | `true` | Muestra el `CartesianGrid`. |
923
+ | `showTooltip` | bool | `true` | Muestra el tooltip al hover. |
924
+ | `showLegend` | bool | `true` | Muestra la leyenda. |
925
+ | `gridColor` | string | `#c7d2fe` | Color del grid. |
926
+ | `axisColor` | string | `#4338ca` | Color de los ejes. |
927
+ | `textColor` | string | `#1e1b4b` | Color del texto de ticks y del label del tooltip. |
928
+ | `tooltipBgColor` | string | `#eef2ff` | Fondo del tooltip. |
929
+ | `tooltipBorderColor` | string | `#4338ca` | Borde del tooltip. |
930
+ | `tooltipTextColor` | string | — | Color de cada fila del tooltip. |
931
+ | `legendTextColor` | string | — | Color del texto de la leyenda. |
932
+ | `labelColor` | string | hereda `textColor` | Color del texto de `showValueLabel` encima de cada barra. |
933
+ | `height` | number | `300` | Alto en px del gráfico. |
934
+
935
+ ---
936
+
937
+ #### Chart (`type="pie"`)
938
+
939
+ Basado en [@nivo/pie](https://nivo.rocks/pie/) — dona o torta llena con labels externos conectados por línea, color-matched al segmento, ícono configurable en el centro (si hay hueco) y porciones clickeables.
940
+
941
+ | Prop | Tipo | Default | Descripción |
942
+ |---|---|---|---|
943
+ | `data` | array | — | `[{ name, value, color? }]`. `color` por item pisa el color de paleta para esa porción. |
944
+ | `colors` | array de string | paleta de 12 colores | Paleta cíclica usada cuando el item no trae `color` propio. |
945
+ | `innerRadius` | number (0–1) | `0.5` | Proporción del hueco central (`0` = torta llena, `~1` = anillo muy fino). |
946
+ | `padAngle` | number | `0.6` | Separación angular entre porciones. |
947
+ | `cornerRadius` | number | `2` | Redondeo de las esquinas de cada porción. |
948
+ | `onSliceClick` | `function({ name, value, color }, index, event)` | — | Si se define, cada porción se vuelve clickeable (cursor pointer). |
949
+ | `centerIcon` | node | `<FiPieChart />` (solo si `innerRadius > 0`) | Ícono/elemento en el centro de la dona. `null`/`false` lo oculta explícitamente; en torta llena (`innerRadius={0}`) no se muestra por default porque se superpondría con las porciones. |
950
+ | `centerIconColor` | string | `#1e1b4b` | Color del ícono central default. |
951
+ | `showTooltip` | bool | `true` | Muestra el tooltip al hover. |
952
+ | `showLegend` | bool | `true` | Muestra la leyenda (abajo, símbolo circular). |
953
+ | `sliceStrokeColor` | string | `#fff` | Color del borde entre porciones. |
954
+ | `textColor` | string | `#1e1b4b` | Color del label del tooltip y de los links de las etiquetas externas (`arcLinkLabelsTextColor`). |
955
+ | `arcLabelColor` | string/objeto | arco oscurecido (`darker`, 2) | Color del número dentro de cada porción. |
956
+ | `tooltipBgColor` | string | `#eef2ff` | Fondo del tooltip. |
957
+ | `tooltipBorderColor` | string | `#4338ca` | Borde del tooltip. |
958
+ | `tooltipTextColor` | string | hereda `textColor` | Color del valor dentro del tooltip. |
959
+ | `legendTextColor` | string | `#1e1b4b` | Color del texto de la leyenda. |
960
+ | `height` | number | `400` | Alto en px del gráfico. |
961
+
962
+ ---
963
+
964
+ #### Chart (`type="nivo-calendar"`)
965
+
966
+ Basado en [@nivo/calendar](https://nivo.rocks/calendar/) — calendario de actividad por día (estilo GitHub contributions), con celdas clickeables.
967
+
968
+ | Prop | Tipo | Default | Descripción |
969
+ |---|---|---|---|
970
+ | `data` | array | — | `[{ day: 'YYYY-MM-DD', value: number }]`. |
971
+ | `from` | string/Date | — | Fecha de inicio del rango mostrado. |
972
+ | `to` | string/Date | — | Fecha de fin del rango mostrado. |
973
+ | `colors` | array de string | `['#61cdbb', '#97e3d5', '#e8c1a0', '#f47560']` | Escala de color según `value` (días sin dato usan `emptyColor`). |
974
+ | `emptyColor` | string | `#eeeeee` | Color de los días sin dato en `data`. |
975
+ | `monthBorderColor` | string | `#ffffff` | Color del borde entre meses. |
976
+ | `dayBorderColor` | string | `#ffffff` | Color del borde entre días. |
977
+ | `dayBorderWidth` | number | `2` | Grosor del borde entre días. |
978
+ | `yearSpacing` | number | `40` | Espacio (px) entre filas de años, si el rango cruza más de un año. |
979
+ | `margin` | object | `{ top: 40, right: 40, bottom: 40, left: 40 }` | Márgenes del gráfico. |
980
+ | `showLegend` | bool | `true` | Muestra la leyenda de intensidad (abajo a la derecha). |
981
+ | `onDayClick` | `function(day, event)` | — | Si se define, cada celda se vuelve clickeable (cursor pointer); `day` trae `day`/`value`/`date`/`color` del día (o solo `day`/`date` si no tiene dato). |
982
+ | `height` | number | `300` | Alto en px del gráfico. |
983
+
984
+ **Ejemplos:**
985
+ ```jsx
986
+ // Barra con color por item individual y eje Y con dominio fijo
987
+ <Chart
988
+ type="bar"
989
+ data={[
990
+ { name: 'Sun', massKg: 1.989e30, color: '#ffa700' },
991
+ { name: 'Mercury', massKg: 3.3e23, color: '#1a1a1a' },
992
+ ]}
993
+ xKey="name"
994
+ bars={[{ dataKey: 'massKg', unit: 'kg' }]}
995
+ yDomain={[1e23, 2e27]}
996
+ yLabel="Mass [kg]"
997
+ />
998
+
999
+ // Torta clickeable con título/descripción en Markdown
1000
+ <Chart
1001
+ type="pie"
1002
+ title="## Distribución por categoría"
1003
+ description="Hacé click en una porción para ver el detalle."
1004
+ data={[{ name: 'A', value: 30 }, { name: 'B', value: 70 }]}
1005
+ onSliceClick={(entry) => console.log(entry.name, entry.value)}
1006
+ />
1007
+
1008
+ // Calendario de actividad con acciones en el header (Search + botón)
1009
+ <Chart
1010
+ type="nivo-calendar"
1011
+ data={[{ day: '2024-03-01', value: 12 }]}
1012
+ from="2024-03-01"
1013
+ to="2024-07-12"
1014
+ title="## Actividad del usuario"
1015
+ actions={<button onClick={refresh}>Refrescar</button>}
1016
+ onDayClick={(day) => openDrawPanel(day)}
1017
+ />
1018
+ ```
1019
+
1020
+ **Notas:** `recharts`, `@nivo/core`, `@nivo/pie` y `@nivo/calendar` vienen empaquetados como `dependencies` de la librería — no hace falta instalarlos en el proyecto consumidor. `type="pie"` usa Nivo (reemplazó una implementación previa en Recharts); `type="line"`/`"bar"` siguen en Recharts. Choropleth (`@nivo/geo`) se evaluó pero no se implementó: requiere un GeoJSON de `features` que la librería no embebe (queda a criterio del consumidor agregarlo si lo necesita).
1021
+
1022
+ ---
1023
+
834
1024
  ### ChatWindow
835
1025
 
836
1026
  Ventana de chat completa (header de contacto, lista de mensajes con auto-scroll, indicador de "escribiendo" y composer) con un mini-lenguaje de formato propio que se traduce a Markdown.
@@ -2015,6 +2205,10 @@ Las imágenes usan la sintaxis estándar de markdown (`![alt](url)`) — `react-
2015
2205
 
2016
2206
  Para colorear texto puntual (markdown no tiene sintaxis nativa para esto) se soporta una convención propia del repo: `{color:X}texto{/color}`, donde `X` es cualquier color CSS válido (hex, `rgb()`, nombre). Internamente se reescribe a un link markdown con protocolo custom (`[texto](color:X)`) antes de pasarlo a `react-markdown`; como `react-markdown` sanea por default los `href` con protocolos no estándar (para prevenir XSS, ej. `javascript:`), se pasa un `urlTransform` propio que deja pasar `color:` intacto y delega el resto al saneo default. El renderer de `a` intercepta ese protocolo devolviendo un `<span style="color: X">` en vez de un `<a>` — por eso el contenido de bloques/inline code (` ``` ` o `` ` ``) queda exento tanto de este reemplazo como del de imágenes (un snippet que contenga ese texto literal no se toca). `MarkdownEditor` ya trae un botón de toolbar con selector de color que inserta esta sintaxis (ver [MarkdownEditor](#markdowneditor)).
2017
2207
 
2208
+ Para marcar texto como copiable (con un botón de copiar al lado) se soporta `{copy}contenido{/copy}`, con dos formas según el contenido:
2209
+ - **Inline** (una línea, sin salto de línea ni ` ``` `): se resuelve con el mismo truco de link markdown que `{color:X}` (protocolo `copy:`), renderizando un `<span>` con el texto seguido de un botón de copiar.
2210
+ - **Bloque** (contiene saltos de línea y/o ` ``` `fences` ``` `, ej. una sección completa con headings + código + texto): se resuelve con un plugin remark propio (`remarkCopyBlocks`, en `copyBlocks.js`) que agrupa los nodos del AST entre marcadores en un `<div>` contenedor con un botón de copiar flotante — el markdown interno se sigue renderizando normal (headings, code fences, listas, etc.), y el botón copia el **markdown fuente** tal cual se escribió (no el HTML renderizado).
2211
+
2018
2212
  **Import:**
2019
2213
  ```jsx
2020
2214
  import { MarkdownContent } from '../MarkdownContent/index'; // named export (también default export)
@@ -2038,6 +2232,9 @@ import { MarkdownContent } from '../MarkdownContent/index'; // named export (tam
2038
2232
  | copiedCodeLabel | string | `'Código copiado'` | Tooltip/aria-label del botón tras copiar un bloque de código. |
2039
2233
  | copyTitleLabel | string | `'Copiar título'` | Tooltip/aria-label del botón de copiar sobre encabezados (`h1`-`h6`). |
2040
2234
  | copiedTitleLabel | string | `'Título copiado'` | Tooltip/aria-label del botón tras copiar un encabezado. |
2235
+ | copyTextLabel | string | `'Copiar'` | Tooltip/aria-label del botón de copiar sobre texto marcado con `{copy}...{/copy}` (inline o bloque). |
2236
+ | copiedTextLabel | string | `'Copiado'` | Tooltip/aria-label del botón tras copiar ese texto. |
2237
+ | images | object | — | Mapa `id -> url/base64` para resolver tokens `[imagen:id]` (los inserta `MarkdownEditor` al pegar una captura del portapapeles). |
2041
2238
 
2042
2239
  **Ejemplos:**
2043
2240
  ```jsx
@@ -2063,6 +2260,18 @@ import { MarkdownContent } from '../MarkdownContent/index'; // named export (tam
2063
2260
  {'Este texto tiene {color:#ef4444}una palabra en rojo{/color} en el medio.'}
2064
2261
  </MarkdownContent>
2065
2262
  ```
2263
+ ```jsx
2264
+ {/* {copy} inline: un valor puntual (email, ID, IP) */}
2265
+ <MarkdownContent>
2266
+ {'El correo de soporte es {copy}soporte@ejemplo.com{/copy}.'}
2267
+ </MarkdownContent>
2268
+ ```
2269
+ ```jsx
2270
+ {/* {copy} como bloque: envuelve headings + código + texto, un solo botón copia todo el markdown fuente */}
2271
+ <MarkdownContent>
2272
+ {'{copy}# Guía\n\n## Paso 1\n\n```js\nconst x = 1;\n```\n{/copy}\n\nEsto queda afuera del bloque.'}
2273
+ </MarkdownContent>
2274
+ ```
2066
2275
 
2067
2276
  **Notas sobre imágenes pegadas (URL sola en su línea):** el criterio es deliberadamente amplio (cualquier línea que sea únicamente una URL `http(s)://`, sin exigir extensión de archivo) porque las URLs de imagen de Google Images y otros servicios casi nunca terminan en `.png`/`.jpg`. Esto significa que una URL que el usuario pegó pensando en un link normal (no una imagen) también se intentará mostrar como `<img>`; si la carga falla, el fallback a `<a target="_blank">` cubre ese caso sin dejar un ícono de imagen rota. El bloque de código (` ``` ` o `` ` ``) también queda exento de esta detección.
2068
2277
 
@@ -2072,7 +2281,9 @@ import { MarkdownContent } from '../MarkdownContent/index'; // named export (tam
2072
2281
 
2073
2282
  ### MarkdownEditor
2074
2283
 
2075
- Editor de texto markdown con barra de herramientas (negrita, cursiva, título, encabezados, listas, cita, código, enlace, imagen, tabla, color de texto), atajos de teclado, modos Editor/Dividido/Vista previa y altura ajustable con arrastre. El botón de título inserta un encabezado `# ` y el de código un bloque ` ``` `; ambos, al previsualizarse (con `MarkdownContent`), muestran un botón de copiar rápido (ver [MarkdownContent](#markdowncontent)).
2284
+ Editor de texto markdown con barra de herramientas (negrita, cursiva, título, encabezados, listas, cita, código, enlace, imagen, tabla, texto copiable, color de texto), atajos de teclado, modos Editor/Dividido/Vista previa y altura ajustable con arrastre. El botón de título inserta un encabezado `# ` y el de código un bloque ` ``` `; ambos, al previsualizarse (con `MarkdownContent`), muestran un botón de copiar rápido (ver [MarkdownContent](#markdowncontent)).
2285
+
2286
+ El botón de texto copiable (ícono `Copy`) envuelve la selección actual en `{copy}...{/copy}` — en la vista previa aparece con su propio botón de copiar al lado, sin afectar los copiables de título/código (ver la sintaxis en [MarkdownContent](#markdowncontent)).
2076
2287
 
2077
2288
  El botón de imagen (ícono de imagen) inserta `![descripción](url-de-la-imagen)` alrededor de la selección (o del texto placeholder si no hay selección) — mismo mecanismo que el botón de enlace. El botón de color (ícono de paleta) abre un popover con el panel de [ColorPicker](#colorpicker) (saturación/matiz + HEX/RGB/HSL); mientras se arrastra el selector solo cambia el color de preview del ícono de la paleta, y recién al tocar el botón "Aplicar" del popover se envuelve el texto seleccionado (o el texto placeholder) en `{color:HEX}...{/color}` y se cierra el popover — así evita insertar texto en cada frame del arrastre. Ver la sintaxis `{color:X}...{/color}` en [MarkdownContent](#markdowncontent).
2078
2289
 
@@ -2100,8 +2311,9 @@ const [value, setValue] = useState('# Hello world');
2100
2311
  | onChange | function | — | Se llama con un evento simulado `{ target: { value } }`. |
2101
2312
  | placeholder | string | `''` | Placeholder del textarea. |
2102
2313
  | defaultHeight | number | `320` | Alto inicial (px) del área de contenido; ajustable arrastrando el handle inferior (entre 180 y 1200px). |
2103
- | labels | object | `{}` | Textos personalizables: `editorTab`, `splitTab`, `previewTab`, tooltips de cada botón (incluye `titleTooltip`, `imageTooltip`, `colorTooltip`), textos por defecto al insertar formato (incluye `imageAltDefaultText`, `imageUrlPlaceholder`, `colorDefaultText`), `applyColorLabel` (texto del botón "Aplicar" del popover de color), encabezados de la tabla de ejemplo. |
2314
+ | labels | object | `{}` | Textos personalizables: `editorTab`, `splitTab`, `previewTab`, tooltips de cada botón (incluye `titleTooltip`, `imageTooltip`, `colorTooltip`, `copyableTooltip`), textos por defecto al insertar formato (incluye `imageAltDefaultText`, `imageUrlPlaceholder`, `colorDefaultText`, `copyableDefaultText`), `applyColorLabel` (texto del botón "Aplicar" del popover de color), encabezados de la tabla de ejemplo. |
2104
2315
  | activeColor | string | — | Color de acento del modo/pestaña activa (`--markdown-editor-active`). |
2316
+ | scrollbarColor | string | — | Color del thumb del scrollbar del textarea (mismo estilo delgado que usa `Selector`). |
2105
2317
 
2106
2318
  **Ejemplos:**
2107
2319
  ```jsx
@@ -2443,7 +2655,7 @@ import Paginador from '../Material-UI/Components/Paginador/index'; // export def
2443
2655
 
2444
2656
  ### Search
2445
2657
 
2446
- Campo de búsqueda basado en `Autocomplete` de Material-UI, con estado de carga y modo `freeSolo` (texto libre sin opciones).
2658
+ Campo de búsqueda basado en `Autocomplete` de Material-UI, con estado de carga, modo `freeSolo` (texto libre sin opciones) y un botón de limpiar (ícono `X` de lucide-react) activo por default en ambos modos — aparece automáticamente cuando hay texto/valor cargado, sin necesitar ninguna prop.
2447
2659
 
2448
2660
  **Import:**
2449
2661
  ```jsx
@@ -2480,6 +2692,13 @@ import Search from '../Material-UI/Components/Search/index'; // export default,
2480
2692
  | label | string | `'Buscar'` | Etiqueta del `TextField` interno. |
2481
2693
  | placeholder | string | `'Buscar...'` | Placeholder del `TextField` interno. |
2482
2694
  | freeSolo | boolean | `false` | Si es `true` y `options` está vacío, renderiza un `TextField` simple (texto libre) en vez de `Autocomplete`. |
2695
+ | size | `'small'` \| `'medium'` | `'small'` | Tamaño del input. |
2696
+ | error | boolean | `false` | Estado de error del `TextField`. |
2697
+ | helperText | string | — | Texto de ayuda/error debajo del input. |
2698
+ | bgColor | string | — | Fondo del input. |
2699
+ | textColor | string | — | Color del texto del input. |
2700
+ | borderColor | string | — | Color del borde (variant outlined). |
2701
+ | iconColor | string | `rgba(0, 0, 0, 0.54)` | Color del ícono de limpiar (mismo gris que usa MUI por default para íconos de acción). |
2483
2702
  | ...props | any | — | Cualquier otra prop de `Autocomplete` de Material-UI. |
2484
2703
 
2485
2704
  **Ejemplos:**
@@ -2489,14 +2708,30 @@ import Search from '../Material-UI/Components/Search/index'; // export default,
2489
2708
  ```jsx
2490
2709
  <Search freeSolo options={[]} label="Buscar" placeholder="Escribe texto libre..." value={value} onChange={setValue} />
2491
2710
  ```
2711
+ ```jsx
2712
+ // Colores custom + error
2713
+ <Search
2714
+ freeSolo
2715
+ options={[]}
2716
+ label="Buscar"
2717
+ error
2718
+ helperText="Ingresa al menos 3 caracteres"
2719
+ bgColor="#0f172a"
2720
+ textColor="#e2e8f0"
2721
+ borderColor="#38bdf8"
2722
+ iconColor="#38bdf8"
2723
+ value={value}
2724
+ onChange={setValue}
2725
+ />
2726
+ ```
2492
2727
 
2493
- **Notas:** A diferencia del `Autocomplete` nativo de MUI, `onChange` y `onInputChange` reciben directamente el valor (no `(event, value)`).
2728
+ **Notas:** A diferencia del `Autocomplete` nativo de MUI, `onChange` y `onInputChange` reciben directamente el valor (no `(event, value)`). El botón de limpiar no requiere ninguna prop para activarse: en modo `freeSolo` aparece apenas hay texto escrito; en modo `Autocomplete` ya viene habilitado salvo que se pase `disableClearable`.
2494
2729
 
2495
2730
  ---
2496
2731
 
2497
2732
  ### Selector
2498
2733
 
2499
- `Autocomplete` de Material-UI configurado como un select de opciones fijas, con matching flexible de valores (por `value` exacto o normalizado).
2734
+ `Autocomplete` de Material-UI configurado como un select de opciones fijas, con matching flexible de valores (por `value` exacto o normalizado). Soporta selección múltiple con checkbox (`multiSelect`), usando el componente `Checks` de la librería para el indicador visual de cada opción.
2500
2735
 
2501
2736
  **Import:**
2502
2737
  ```jsx
@@ -2529,7 +2764,14 @@ import Selector from '../Material-UI/Components/Selector/index'; // export defau
2529
2764
  | required | boolean | — | Muestra un indicador `**` junto a la etiqueta. |
2530
2765
  | requiredColor | string | `'red'` | Color del indicador de requerido. |
2531
2766
  | disableClearable | boolean | `false` | Si es `true`, oculta el botón de limpiar selección. |
2532
- | hideScrollbar | boolean | `true` | Oculta la barra de scroll de la lista desplegable (el scroll con rueda/teclado/touch sigue funcionando). |
2767
+ | hideScrollbar | boolean | `true` | Oculta la barra de scroll de la lista desplegable (el scroll con rueda/teclado/touch sigue funcionando). Con `false`, la barra se muestra con una estética delgada propia (mismo grosor/color que `ScrollBar`) en vez del scrollbar crudo del navegador. |
2768
+ | multiSelect | boolean | `false` | Activa selección múltiple (`Autocomplete multiple`). En este modo `value` es un array de `value`s y `onChange` recibe `{ target: { value: nuevoArray } }`. Cada opción muestra un checkbox (`Checks`, modo `iconOnly`) como indicador de selección. |
2769
+ | checkedBgColor | string | — | Color de fondo del checkbox marcado (propaga a `Checks`, solo aplica con `multiSelect`). |
2770
+ | checkedLabelColor | string | — | Color del label del checkbox marcado (propaga a `Checks`). |
2771
+ | scrollbarColor | string | — | Color del thumb del scrollbar cuando `hideScrollbar={false}`. |
2772
+ | chipBgColor | string | — | Fondo de los chips de selección (modo `multiSelect`). |
2773
+ | chipTextColor | string | — | Color de texto de los chips. |
2774
+ | chipIconColor | string | — | Color del ícono "X" de cada chip. |
2533
2775
 
2534
2776
  **Ejemplos:**
2535
2777
  ```jsx
@@ -2541,8 +2783,21 @@ import Selector from '../Material-UI/Components/Selector/index'; // export defau
2541
2783
  ```jsx
2542
2784
  <Selector label="Especie" options={options} value={value} onChange={onChange} fullWidth={false} style={{ width: 180 }} />
2543
2785
  ```
2786
+ ```jsx
2787
+ // Selección múltiple con chips y checkbox personalizados
2788
+ <Selector
2789
+ label="Especies"
2790
+ options={options}
2791
+ multiSelect
2792
+ value={values}
2793
+ onChange={(e) => setValues(e.target.value)}
2794
+ checkedBgColor="#0369a1"
2795
+ chipBgColor="#0369a1"
2796
+ chipTextColor="#ffffff"
2797
+ />
2798
+ ```
2544
2799
 
2545
- **Notas:** El matching de `value` contra `options` ignora mayúsculas, espacios, guiones y guiones bajos si no hay coincidencia exacta por `value`. `fullWidth` default es `true` — si solo se pasa `className` para controlar el ancho sin `fullWidth={false}`, el `sx.width: '100%'` default sigue ganando; para un ancho custom, combinar `fullWidth={false}` con `style={{ width }}`.
2800
+ **Notas:** El matching de `value` contra `options` ignora mayúsculas, espacios, guiones y guiones bajos si no hay coincidencia exacta por `value`. `fullWidth` default es `true` — si solo se pasa `className` para controlar el ancho sin `fullWidth={false}`, el `sx.width: '100%'` default sigue ganando; para un ancho custom, combinar `fullWidth={false}` con `style={{ width }}`. En `multiSelect`, `disableCloseOnSelect` se activa automáticamente (el dropdown no se cierra después de cada click).
2546
2801
 
2547
2802
  ---
2548
2803