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.
- package/.verify-bundle.css +172 -68
- package/.verify-bundle.js +2 -2
- package/AnteriorityUI.md +262 -7
- package/README.md +34 -1
- package/index.js +112 -110
- package/package.json +7 -2
- package/screens/components/CalendarPicker/index.js +19 -7
- 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/index.js +47 -8
- 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: 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 (``) — `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 `` 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
|
|
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
|
|