anteriority-ui 1.12.0 → 1.14.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.
- package/.verify-bundle.css +172 -68
- package/.verify-bundle.js +2 -2
- package/AnteriorityUI.md +265 -7
- package/README.md +34 -1
- package/index.js +112 -110
- package/package.json +7 -2
- package/screens/components/CalendarPicker/components/CalendarGrid/index.js +5 -2
- package/screens/components/CalendarPicker/index.js +22 -8
- package/screens/components/Chart/components/BarChart/index.js +92 -0
- package/screens/components/Chart/components/LineChart/index.js +144 -0
- package/screens/components/Chart/components/NivoCalendarChart/index.js +56 -0
- package/screens/components/Chart/components/PieChart/index.js +127 -0
- package/screens/components/Chart/components/index.js +10 -0
- package/screens/components/Chart/constants.js +43 -0
- package/screens/components/Chart/index.js +55 -0
- package/screens/components/Chart/index.module.css +30 -0
- package/screens/components/MarkdownContent/copyBlocks.js +73 -0
- package/screens/components/MarkdownContent/index.js +53 -7
- package/screens/components/MarkdownContent/index.module.css +48 -0
- package/screens/components/MarkdownEditor/components/EditorContent/index.module.css +20 -0
- package/screens/components/MarkdownEditor/components/Toolbar/index.js +5 -1
- package/screens/components/MarkdownEditor/constants.js +2 -0
- package/screens/components/MarkdownEditor/index.js +12 -3
- package/screens/components/Material-UI/Components/Search/constants.js +4 -0
- package/screens/components/Material-UI/Components/Search/index.js +42 -2
- package/screens/components/Material-UI/Components/Selector/constants.js +4 -0
- package/screens/components/Material-UI/Components/Selector/index.js +50 -9
- package/screens/components/Material-UI/Components/Selector/index.module.css +22 -0
package/.verify-bundle.css
CHANGED
|
@@ -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/
|
|
5024
|
-
.
|
|
5025
|
-
|
|
5026
|
-
|
|
5027
|
-
|
|
5028
|
-
|
|
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
|
-
.
|
|
5065
|
-
|
|
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
|
-
.
|
|
5068
|
-
|
|
5069
|
-
|
|
5171
|
+
.Chart_title {
|
|
5172
|
+
margin-bottom: 0;
|
|
5173
|
+
min-width: 0;
|
|
5070
5174
|
}
|
|
5071
|
-
|
|
5072
|
-
|
|
5073
|
-
|
|
5074
|
-
|
|
5075
|
-
|
|
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
|
-
|
|
5083
|
-
|
|
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:
|
|
4
|
-
sha256:
|
|
3
|
+
size: 59204256 bytes
|
|
4
|
+
sha256: 576e135ced8df47f9bb7c7db632d718d659e668e6ee7a70f7402f8098c3d6ddc
|
package/AnteriorityUI.md
CHANGED
|
@@ -626,6 +626,7 @@ import CalendarPicker from '../CalendarPicker/index'; // export default
|
|
|
626
626
|
| `borderColor` | string | — | Solo `variant="inline"`. Color de las líneas divisorias del grid (`--cp-agenda-border`). |
|
|
627
627
|
| `hoverColor` | string | — | Solo `variant="inline"`. Fondo al pasar el mouse sobre una celda (`--cp-agenda-hover`). |
|
|
628
628
|
| `holidayColor` | string | — | Solo `variant="inline"`. Color del nombre del feriado/efeméride en la celda (`--cp-agenda-holiday`) — el popover no tiene este, el nombre nunca se muestra como texto ahí (ver nota). |
|
|
629
|
+
| `selectorsPopperZIndex` | number | `100000` (default interno de `Selector`) | Solo `variant="popover"`. `z-index` del `Popper` de los `Selector` (Material-UI) de "Mes"/"Año" que se abren al clickear el título del calendario — ese `Popper` se renderiza vía portal al final de `<body>`, fuera del popover del calendario (`z-index: 20`). Ajustar si un modal/drawer propio del proyecto consumidor tiene un `z-index` mayor y "tapa" los clics del listado de años (ver nota). |
|
|
629
630
|
|
|
630
631
|
**Ejemplos:**
|
|
631
632
|
```jsx
|
|
@@ -694,6 +695,8 @@ import CalendarPicker from '../CalendarPicker/index'; // export default
|
|
|
694
695
|
- `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
696
|
- `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
697
|
- 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.
|
|
698
|
+
- 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.
|
|
699
|
+
- Si al abrir el selector de "Año"/"Mes" dentro de un modal/drawer propio (ej. un panel lateral) la lista se ve pero los clics no registran, es un conflicto de capas: el `Popper` de MUI vive en un portal a `<body>`, fuera de ese modal, y si el modal tiene su propio overlay con `z-index` mayor al default del `Popper` (`100000`), ese overlay intercepta los clics aunque visualmente el listado quede encima. Subir `selectorsPopperZIndex` por encima del `z-index` de ese overlay soluciona el bloqueo.
|
|
697
700
|
|
|
698
701
|
---
|
|
699
702
|
|
|
@@ -831,6 +834,195 @@ import CardV1 from '../CardV1'; // export default (index.jsx)
|
|
|
831
834
|
|
|
832
835
|
---
|
|
833
836
|
|
|
837
|
+
### Chart
|
|
838
|
+
|
|
839
|
+
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.
|
|
840
|
+
|
|
841
|
+
**Import:**
|
|
842
|
+
```jsx
|
|
843
|
+
import Chart from '../Chart/index'; // export default
|
|
844
|
+
```
|
|
845
|
+
|
|
846
|
+
**Uso básico:**
|
|
847
|
+
```jsx
|
|
848
|
+
<Chart
|
|
849
|
+
type="line"
|
|
850
|
+
data={[{ month: 'Jan', revenue: 4200 }, { month: 'Feb', revenue: 5800 }]}
|
|
851
|
+
xKey="month"
|
|
852
|
+
lines={[{ dataKey: 'revenue' }]}
|
|
853
|
+
/>
|
|
854
|
+
```
|
|
855
|
+
|
|
856
|
+
**Props comunes (`Chart`, el wrapper — aplican sin importar el `type`):**
|
|
857
|
+
|
|
858
|
+
| Prop | Tipo | Default | Descripción |
|
|
859
|
+
|---|---|---|---|
|
|
860
|
+
| `type` | `'line'` \| `'pie'` \| `'bar'` \| `'nivo-calendar'` | `'line'` | Motor de gráfico a renderizar. También expuesto como `Chart.TYPE`. |
|
|
861
|
+
| `title` | string (Markdown) | — | Título renderizado arriba del gráfico con `MarkdownContent` (soporta headings, negrita, links, etc.). |
|
|
862
|
+
| `description` | string (Markdown) | — | Texto renderizado debajo del gráfico con `MarkdownContent`. |
|
|
863
|
+
| `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`. |
|
|
864
|
+
| `bgColor` | string | `#ffffff` | Fondo de la card contenedora. |
|
|
865
|
+
| `borderColor` | string | `#e5e7eb` | Color del borde (2px) de la card. El radio es fijo en 6px. |
|
|
866
|
+
| `titleColor` | string | — | Color de texto del `title`. |
|
|
867
|
+
| `descriptionColor` | string | — | Color de texto del `description`. |
|
|
868
|
+
| `className` | string | `''` | Clase adicional en la card. |
|
|
869
|
+
| `style` | object | — | Estilos inline adicionales en la card. |
|
|
870
|
+
|
|
871
|
+
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.
|
|
872
|
+
|
|
873
|
+
---
|
|
874
|
+
|
|
875
|
+
#### Chart (`type="line"`)
|
|
876
|
+
|
|
877
|
+
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.
|
|
878
|
+
|
|
879
|
+
| Prop | Tipo | Default | Descripción |
|
|
880
|
+
|---|---|---|---|
|
|
881
|
+
| `data` | array | — | `[{ [xKey]: valor, [lines[i].dataKey]: number }]`. |
|
|
882
|
+
| `lines` | array | — | `[{ dataKey, name?, color?, strokeWidth?, strokeDasharray? }]`. Color por default según `DEFAULT_LINE_COLORS` (ciclo de 5 colores) si no se pasa `color`. |
|
|
883
|
+
| `xKey` | string | `'name'` | Key de `data` usada en el eje X. |
|
|
884
|
+
| `xType` | `'category'` \| `'number'` | `'category'` | Tipo de eje X (default real de Recharts). |
|
|
885
|
+
| `xTicks` | array de number | — | Valores fijos de los ticks del eje X. |
|
|
886
|
+
| `xScale` | string | `'auto'` | Escala del eje X (`'auto'`, `'linear'`, `'symlog'`, etc. — cualquier escala válida de Recharts). |
|
|
887
|
+
| `xTickIcon` | `function(value) => pathString` | — | Si se pasa, reemplaza el tick de texto del eje X por un ícono SVG (path `d`, viewBox 1024×1024). |
|
|
888
|
+
| `xTickIconColor` | string | hereda `axisColor` | Color del ícono del tick. |
|
|
889
|
+
| `xTickIconSize` | number | `24` | Tamaño (px) del ícono del tick. |
|
|
890
|
+
| `xAxisHeight` | number | — | Alto del eje X (útil para dar espacio a `xTickIcon`). |
|
|
891
|
+
| `yTicks` | array de number | — | Valores fijos de los ticks del eje Y. |
|
|
892
|
+
| `yScale` | string | `'auto'` | Escala del eje Y. |
|
|
893
|
+
| `showGrid` | bool | `true` | Muestra el `CartesianGrid`. |
|
|
894
|
+
| `showTooltip` | bool | `true` | Muestra el tooltip al hover. |
|
|
895
|
+
| `showLegend` | bool | `true` | Muestra la leyenda. |
|
|
896
|
+
| `referenceLines` | array | `[]` | `[{ y, label?, labelPosition?, color?, strokeDasharray? }]` — línea horizontal en un valor de dato. |
|
|
897
|
+
| `referenceDots` | array | `[]` | `[{ x, y, label?, labelPosition?, color?, radius? }]` — punto destacado en coordenadas de dato. |
|
|
898
|
+
| `gridColor` | string | `#c7d2fe` | Color del grid. |
|
|
899
|
+
| `axisColor` | string | `#4338ca` | Color de los ejes. |
|
|
900
|
+
| `textColor` | string | `#1e1b4b` | Color del texto de ticks y del label del tooltip. |
|
|
901
|
+
| `tooltipBgColor` | string | `#eef2ff` | Fondo del tooltip. |
|
|
902
|
+
| `tooltipBorderColor` | string | `#4338ca` | Borde del tooltip. |
|
|
903
|
+
| `tooltipTextColor` | string | — | Color de cada fila del tooltip (por default toma el color de su línea). |
|
|
904
|
+
| `legendTextColor` | string | — | Color del texto de la leyenda (por default toma el color de su línea). |
|
|
905
|
+
| `height` | number | `300` | Alto en px del gráfico. |
|
|
906
|
+
|
|
907
|
+
---
|
|
908
|
+
|
|
909
|
+
#### Chart (`type="bar"`)
|
|
910
|
+
|
|
911
|
+
Basado en Recharts `BarChart`. Soporta múltiples series, color por serie o por item individual, labels encima de cada barra y ejes formateados.
|
|
912
|
+
|
|
913
|
+
| Prop | Tipo | Default | Descripción |
|
|
914
|
+
|---|---|---|---|
|
|
915
|
+
| `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). |
|
|
916
|
+
| `bars` | array | — | `[{ dataKey, name?, color?, unit?, showValueLabel?, labelFormatter? }]`. |
|
|
917
|
+
| `xKey` | string | `'name'` | Key de `data` usada en el eje X. |
|
|
918
|
+
| `xTickFormatter` | `function(value)` | — | Formatea el texto de cada tick del eje X. |
|
|
919
|
+
| `yTickFormatter` | `function(value)` | — | Formatea el texto de cada tick del eje Y. |
|
|
920
|
+
| `xAxisLabel` | string | — | Título del eje X (posición `insideBottomRight`). |
|
|
921
|
+
| `yLabel` | string | — | Título del eje Y, rotado (posición `insideLeft`). |
|
|
922
|
+
| `yDomain` | `[min, max]` | — | Dominio fijo del eje Y (activa `allowDataOverflow`). |
|
|
923
|
+
| `yAxisWidth` | number | — | Ancho del eje Y (útil cuando `yLabel`/los ticks son largos). |
|
|
924
|
+
| `showGrid` | bool | `true` | Muestra el `CartesianGrid`. |
|
|
925
|
+
| `showTooltip` | bool | `true` | Muestra el tooltip al hover. |
|
|
926
|
+
| `showLegend` | bool | `true` | Muestra la leyenda. |
|
|
927
|
+
| `gridColor` | string | `#c7d2fe` | Color del grid. |
|
|
928
|
+
| `axisColor` | string | `#4338ca` | Color de los ejes. |
|
|
929
|
+
| `textColor` | string | `#1e1b4b` | Color del texto de ticks y del label del tooltip. |
|
|
930
|
+
| `tooltipBgColor` | string | `#eef2ff` | Fondo del tooltip. |
|
|
931
|
+
| `tooltipBorderColor` | string | `#4338ca` | Borde del tooltip. |
|
|
932
|
+
| `tooltipTextColor` | string | — | Color de cada fila del tooltip. |
|
|
933
|
+
| `legendTextColor` | string | — | Color del texto de la leyenda. |
|
|
934
|
+
| `labelColor` | string | hereda `textColor` | Color del texto de `showValueLabel` encima de cada barra. |
|
|
935
|
+
| `height` | number | `300` | Alto en px del gráfico. |
|
|
936
|
+
|
|
937
|
+
---
|
|
938
|
+
|
|
939
|
+
#### Chart (`type="pie"`)
|
|
940
|
+
|
|
941
|
+
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.
|
|
942
|
+
|
|
943
|
+
| Prop | Tipo | Default | Descripción |
|
|
944
|
+
|---|---|---|---|
|
|
945
|
+
| `data` | array | — | `[{ name, value, color? }]`. `color` por item pisa el color de paleta para esa porción. |
|
|
946
|
+
| `colors` | array de string | paleta de 12 colores | Paleta cíclica usada cuando el item no trae `color` propio. |
|
|
947
|
+
| `innerRadius` | number (0–1) | `0.5` | Proporción del hueco central (`0` = torta llena, `~1` = anillo muy fino). |
|
|
948
|
+
| `padAngle` | number | `0.6` | Separación angular entre porciones. |
|
|
949
|
+
| `cornerRadius` | number | `2` | Redondeo de las esquinas de cada porción. |
|
|
950
|
+
| `onSliceClick` | `function({ name, value, color }, index, event)` | — | Si se define, cada porción se vuelve clickeable (cursor pointer). |
|
|
951
|
+
| `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. |
|
|
952
|
+
| `centerIconColor` | string | `#1e1b4b` | Color del ícono central default. |
|
|
953
|
+
| `showTooltip` | bool | `true` | Muestra el tooltip al hover. |
|
|
954
|
+
| `showLegend` | bool | `true` | Muestra la leyenda (abajo, símbolo circular). |
|
|
955
|
+
| `sliceStrokeColor` | string | `#fff` | Color del borde entre porciones. |
|
|
956
|
+
| `textColor` | string | `#1e1b4b` | Color del label del tooltip y de los links de las etiquetas externas (`arcLinkLabelsTextColor`). |
|
|
957
|
+
| `arcLabelColor` | string/objeto | arco oscurecido (`darker`, 2) | Color del número dentro de cada porción. |
|
|
958
|
+
| `tooltipBgColor` | string | `#eef2ff` | Fondo del tooltip. |
|
|
959
|
+
| `tooltipBorderColor` | string | `#4338ca` | Borde del tooltip. |
|
|
960
|
+
| `tooltipTextColor` | string | hereda `textColor` | Color del valor dentro del tooltip. |
|
|
961
|
+
| `legendTextColor` | string | `#1e1b4b` | Color del texto de la leyenda. |
|
|
962
|
+
| `height` | number | `400` | Alto en px del gráfico. |
|
|
963
|
+
|
|
964
|
+
---
|
|
965
|
+
|
|
966
|
+
#### Chart (`type="nivo-calendar"`)
|
|
967
|
+
|
|
968
|
+
Basado en [@nivo/calendar](https://nivo.rocks/calendar/) — calendario de actividad por día (estilo GitHub contributions), con celdas clickeables.
|
|
969
|
+
|
|
970
|
+
| Prop | Tipo | Default | Descripción |
|
|
971
|
+
|---|---|---|---|
|
|
972
|
+
| `data` | array | — | `[{ day: 'YYYY-MM-DD', value: number }]`. |
|
|
973
|
+
| `from` | string/Date | — | Fecha de inicio del rango mostrado. |
|
|
974
|
+
| `to` | string/Date | — | Fecha de fin del rango mostrado. |
|
|
975
|
+
| `colors` | array de string | `['#61cdbb', '#97e3d5', '#e8c1a0', '#f47560']` | Escala de color según `value` (días sin dato usan `emptyColor`). |
|
|
976
|
+
| `emptyColor` | string | `#eeeeee` | Color de los días sin dato en `data`. |
|
|
977
|
+
| `monthBorderColor` | string | `#ffffff` | Color del borde entre meses. |
|
|
978
|
+
| `dayBorderColor` | string | `#ffffff` | Color del borde entre días. |
|
|
979
|
+
| `dayBorderWidth` | number | `2` | Grosor del borde entre días. |
|
|
980
|
+
| `yearSpacing` | number | `40` | Espacio (px) entre filas de años, si el rango cruza más de un año. |
|
|
981
|
+
| `margin` | object | `{ top: 40, right: 40, bottom: 40, left: 40 }` | Márgenes del gráfico. |
|
|
982
|
+
| `showLegend` | bool | `true` | Muestra la leyenda de intensidad (abajo a la derecha). |
|
|
983
|
+
| `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). |
|
|
984
|
+
| `height` | number | `300` | Alto en px del gráfico. |
|
|
985
|
+
|
|
986
|
+
**Ejemplos:**
|
|
987
|
+
```jsx
|
|
988
|
+
// Barra con color por item individual y eje Y con dominio fijo
|
|
989
|
+
<Chart
|
|
990
|
+
type="bar"
|
|
991
|
+
data={[
|
|
992
|
+
{ name: 'Sun', massKg: 1.989e30, color: '#ffa700' },
|
|
993
|
+
{ name: 'Mercury', massKg: 3.3e23, color: '#1a1a1a' },
|
|
994
|
+
]}
|
|
995
|
+
xKey="name"
|
|
996
|
+
bars={[{ dataKey: 'massKg', unit: 'kg' }]}
|
|
997
|
+
yDomain={[1e23, 2e27]}
|
|
998
|
+
yLabel="Mass [kg]"
|
|
999
|
+
/>
|
|
1000
|
+
|
|
1001
|
+
// Torta clickeable con título/descripción en Markdown
|
|
1002
|
+
<Chart
|
|
1003
|
+
type="pie"
|
|
1004
|
+
title="## Distribución por categoría"
|
|
1005
|
+
description="Hacé click en una porción para ver el detalle."
|
|
1006
|
+
data={[{ name: 'A', value: 30 }, { name: 'B', value: 70 }]}
|
|
1007
|
+
onSliceClick={(entry) => console.log(entry.name, entry.value)}
|
|
1008
|
+
/>
|
|
1009
|
+
|
|
1010
|
+
// Calendario de actividad con acciones en el header (Search + botón)
|
|
1011
|
+
<Chart
|
|
1012
|
+
type="nivo-calendar"
|
|
1013
|
+
data={[{ day: '2024-03-01', value: 12 }]}
|
|
1014
|
+
from="2024-03-01"
|
|
1015
|
+
to="2024-07-12"
|
|
1016
|
+
title="## Actividad del usuario"
|
|
1017
|
+
actions={<button onClick={refresh}>Refrescar</button>}
|
|
1018
|
+
onDayClick={(day) => openDrawPanel(day)}
|
|
1019
|
+
/>
|
|
1020
|
+
```
|
|
1021
|
+
|
|
1022
|
+
**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).
|
|
1023
|
+
|
|
1024
|
+
---
|
|
1025
|
+
|
|
834
1026
|
### ChatWindow
|
|
835
1027
|
|
|
836
1028
|
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 +2207,10 @@ Las imágenes usan la sintaxis estándar de markdown (``) — `react-
|
|
|
2015
2207
|
|
|
2016
2208
|
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
2209
|
|
|
2210
|
+
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:
|
|
2211
|
+
- **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.
|
|
2212
|
+
- **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).
|
|
2213
|
+
|
|
2018
2214
|
**Import:**
|
|
2019
2215
|
```jsx
|
|
2020
2216
|
import { MarkdownContent } from '../MarkdownContent/index'; // named export (también default export)
|
|
@@ -2038,6 +2234,9 @@ import { MarkdownContent } from '../MarkdownContent/index'; // named export (tam
|
|
|
2038
2234
|
| copiedCodeLabel | string | `'Código copiado'` | Tooltip/aria-label del botón tras copiar un bloque de código. |
|
|
2039
2235
|
| copyTitleLabel | string | `'Copiar título'` | Tooltip/aria-label del botón de copiar sobre encabezados (`h1`-`h6`). |
|
|
2040
2236
|
| copiedTitleLabel | string | `'Título copiado'` | Tooltip/aria-label del botón tras copiar un encabezado. |
|
|
2237
|
+
| copyTextLabel | string | `'Copiar'` | Tooltip/aria-label del botón de copiar sobre texto marcado con `{copy}...{/copy}` (inline o bloque). |
|
|
2238
|
+
| copiedTextLabel | string | `'Copiado'` | Tooltip/aria-label del botón tras copiar ese texto. |
|
|
2239
|
+
| images | object | — | Mapa `id -> url/base64` para resolver tokens `[imagen:id]` (los inserta `MarkdownEditor` al pegar una captura del portapapeles). |
|
|
2041
2240
|
|
|
2042
2241
|
**Ejemplos:**
|
|
2043
2242
|
```jsx
|
|
@@ -2063,6 +2262,18 @@ import { MarkdownContent } from '../MarkdownContent/index'; // named export (tam
|
|
|
2063
2262
|
{'Este texto tiene {color:#ef4444}una palabra en rojo{/color} en el medio.'}
|
|
2064
2263
|
</MarkdownContent>
|
|
2065
2264
|
```
|
|
2265
|
+
```jsx
|
|
2266
|
+
{/* {copy} inline: un valor puntual (email, ID, IP) */}
|
|
2267
|
+
<MarkdownContent>
|
|
2268
|
+
{'El correo de soporte es {copy}soporte@ejemplo.com{/copy}.'}
|
|
2269
|
+
</MarkdownContent>
|
|
2270
|
+
```
|
|
2271
|
+
```jsx
|
|
2272
|
+
{/* {copy} como bloque: envuelve headings + código + texto, un solo botón copia todo el markdown fuente */}
|
|
2273
|
+
<MarkdownContent>
|
|
2274
|
+
{'{copy}# Guía\n\n## Paso 1\n\n```js\nconst x = 1;\n```\n{/copy}\n\nEsto queda afuera del bloque.'}
|
|
2275
|
+
</MarkdownContent>
|
|
2276
|
+
```
|
|
2066
2277
|
|
|
2067
2278
|
**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
2279
|
|
|
@@ -2072,7 +2283,9 @@ import { MarkdownContent } from '../MarkdownContent/index'; // named export (tam
|
|
|
2072
2283
|
|
|
2073
2284
|
### MarkdownEditor
|
|
2074
2285
|
|
|
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)).
|
|
2286
|
+
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)).
|
|
2287
|
+
|
|
2288
|
+
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
2289
|
|
|
2077
2290
|
El botón de imagen (ícono de imagen) inserta `` 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
2291
|
|
|
@@ -2100,8 +2313,9 @@ const [value, setValue] = useState('# Hello world');
|
|
|
2100
2313
|
| onChange | function | — | Se llama con un evento simulado `{ target: { value } }`. |
|
|
2101
2314
|
| placeholder | string | `''` | Placeholder del textarea. |
|
|
2102
2315
|
| 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. |
|
|
2316
|
+
| 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
2317
|
| activeColor | string | — | Color de acento del modo/pestaña activa (`--markdown-editor-active`). |
|
|
2318
|
+
| scrollbarColor | string | — | Color del thumb del scrollbar del textarea (mismo estilo delgado que usa `Selector`). |
|
|
2105
2319
|
|
|
2106
2320
|
**Ejemplos:**
|
|
2107
2321
|
```jsx
|
|
@@ -2443,7 +2657,7 @@ import Paginador from '../Material-UI/Components/Paginador/index'; // export def
|
|
|
2443
2657
|
|
|
2444
2658
|
### Search
|
|
2445
2659
|
|
|
2446
|
-
Campo de búsqueda basado en `Autocomplete` de Material-UI, con estado de carga
|
|
2660
|
+
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
2661
|
|
|
2448
2662
|
**Import:**
|
|
2449
2663
|
```jsx
|
|
@@ -2480,6 +2694,13 @@ import Search from '../Material-UI/Components/Search/index'; // export default,
|
|
|
2480
2694
|
| label | string | `'Buscar'` | Etiqueta del `TextField` interno. |
|
|
2481
2695
|
| placeholder | string | `'Buscar...'` | Placeholder del `TextField` interno. |
|
|
2482
2696
|
| freeSolo | boolean | `false` | Si es `true` y `options` está vacío, renderiza un `TextField` simple (texto libre) en vez de `Autocomplete`. |
|
|
2697
|
+
| size | `'small'` \| `'medium'` | `'small'` | Tamaño del input. |
|
|
2698
|
+
| error | boolean | `false` | Estado de error del `TextField`. |
|
|
2699
|
+
| helperText | string | — | Texto de ayuda/error debajo del input. |
|
|
2700
|
+
| bgColor | string | — | Fondo del input. |
|
|
2701
|
+
| textColor | string | — | Color del texto del input. |
|
|
2702
|
+
| borderColor | string | — | Color del borde (variant outlined). |
|
|
2703
|
+
| 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
2704
|
| ...props | any | — | Cualquier otra prop de `Autocomplete` de Material-UI. |
|
|
2484
2705
|
|
|
2485
2706
|
**Ejemplos:**
|
|
@@ -2489,14 +2710,30 @@ import Search from '../Material-UI/Components/Search/index'; // export default,
|
|
|
2489
2710
|
```jsx
|
|
2490
2711
|
<Search freeSolo options={[]} label="Buscar" placeholder="Escribe texto libre..." value={value} onChange={setValue} />
|
|
2491
2712
|
```
|
|
2713
|
+
```jsx
|
|
2714
|
+
// Colores custom + error
|
|
2715
|
+
<Search
|
|
2716
|
+
freeSolo
|
|
2717
|
+
options={[]}
|
|
2718
|
+
label="Buscar"
|
|
2719
|
+
error
|
|
2720
|
+
helperText="Ingresa al menos 3 caracteres"
|
|
2721
|
+
bgColor="#0f172a"
|
|
2722
|
+
textColor="#e2e8f0"
|
|
2723
|
+
borderColor="#38bdf8"
|
|
2724
|
+
iconColor="#38bdf8"
|
|
2725
|
+
value={value}
|
|
2726
|
+
onChange={setValue}
|
|
2727
|
+
/>
|
|
2728
|
+
```
|
|
2492
2729
|
|
|
2493
|
-
**Notas:** A diferencia del `Autocomplete` nativo de MUI, `onChange` y `onInputChange` reciben directamente el valor (no `(event, value)`).
|
|
2730
|
+
**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
2731
|
|
|
2495
2732
|
---
|
|
2496
2733
|
|
|
2497
2734
|
### Selector
|
|
2498
2735
|
|
|
2499
|
-
`Autocomplete` de Material-UI configurado como un select de opciones fijas, con matching flexible de valores (por `value` exacto o normalizado).
|
|
2736
|
+
`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
2737
|
|
|
2501
2738
|
**Import:**
|
|
2502
2739
|
```jsx
|
|
@@ -2529,7 +2766,15 @@ import Selector from '../Material-UI/Components/Selector/index'; // export defau
|
|
|
2529
2766
|
| required | boolean | — | Muestra un indicador `**` junto a la etiqueta. |
|
|
2530
2767
|
| requiredColor | string | `'red'` | Color del indicador de requerido. |
|
|
2531
2768
|
| 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). |
|
|
2769
|
+
| 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. |
|
|
2770
|
+
| 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. |
|
|
2771
|
+
| checkedBgColor | string | — | Color de fondo del checkbox marcado (propaga a `Checks`, solo aplica con `multiSelect`). |
|
|
2772
|
+
| checkedLabelColor | string | — | Color del label del checkbox marcado (propaga a `Checks`). |
|
|
2773
|
+
| scrollbarColor | string | — | Color del thumb del scrollbar cuando `hideScrollbar={false}`. |
|
|
2774
|
+
| chipBgColor | string | — | Fondo de los chips de selección (modo `multiSelect`). |
|
|
2775
|
+
| chipTextColor | string | — | Color de texto de los chips. |
|
|
2776
|
+
| chipIconColor | string | — | Color del ícono "X" de cada chip. |
|
|
2777
|
+
| popperZIndex | number | `100000` | `z-index` del `Popper` del listado desplegable (se renderiza en un portal al final de `<body>`, fuera del árbol del componente). Ajustar si un overlay/modal propio del proyecto consumidor tiene un `z-index` mayor y tapa los clics del listado. |
|
|
2533
2778
|
|
|
2534
2779
|
**Ejemplos:**
|
|
2535
2780
|
```jsx
|
|
@@ -2541,8 +2786,21 @@ import Selector from '../Material-UI/Components/Selector/index'; // export defau
|
|
|
2541
2786
|
```jsx
|
|
2542
2787
|
<Selector label="Especie" options={options} value={value} onChange={onChange} fullWidth={false} style={{ width: 180 }} />
|
|
2543
2788
|
```
|
|
2789
|
+
```jsx
|
|
2790
|
+
// Selección múltiple con chips y checkbox personalizados
|
|
2791
|
+
<Selector
|
|
2792
|
+
label="Especies"
|
|
2793
|
+
options={options}
|
|
2794
|
+
multiSelect
|
|
2795
|
+
value={values}
|
|
2796
|
+
onChange={(e) => setValues(e.target.value)}
|
|
2797
|
+
checkedBgColor="#0369a1"
|
|
2798
|
+
chipBgColor="#0369a1"
|
|
2799
|
+
chipTextColor="#ffffff"
|
|
2800
|
+
/>
|
|
2801
|
+
```
|
|
2544
2802
|
|
|
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 }}`.
|
|
2803
|
+
**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). `popperZIndex`: el `Popper` de MUI se monta vía portal al final de `<body>`, fuera de cualquier contenedor con overflow/scroll o `z-index` local del componente padre (ej. el popover de `CalendarPicker`, con `z-index: 20`) — si el proyecto consumidor tiene un modal/drawer propio con `z-index` superior al default (`100000`), esa capa puede interceptar los clics sobre el listado aunque se vea visualmente encima; subir `popperZIndex` por encima de esa capa resuelve el bloqueo de clics.
|
|
2546
2804
|
|
|
2547
2805
|
---
|
|
2548
2806
|
|