@beweco/aurora-ui 1.0.0-beta.116 → 1.0.0-beta.118
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/dist/index.cjs.js +104 -5
- package/dist/index.esm.js +104 -5
- package/dist/types/__smoke__/v2-api-surface.d.ts +41 -1
- package/dist/types/__smoke__/v2-api-surface.d.ts.map +1 -1
- package/dist/types/components/menu/_internal/menu-nav-list/MenuNavList.d.ts.map +1 -1
- package/dist/types/components/select/Select.d.ts.map +1 -1
- package/dist/types/components/select/Select.types.d.ts +30 -4
- package/dist/types/components/select/Select.types.d.ts.map +1 -1
- package/dist/types/components/select/index.d.ts +1 -1
- package/dist/types/components/select/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -5469,6 +5469,33 @@ const ITEM_COLLAPSED_CLASS = "w-11 h-11 gap-0 p-0 justify-center";
|
|
|
5469
5469
|
// `wrapper` `w-full` — el título se comía el espacio libre y empujaba el `endContent` al borde.
|
|
5470
5470
|
// El `[data-slot="label"]` de v3 es `w-fit`, que es la otra mitad de P-14.
|
|
5471
5471
|
const ITEM_TITLE_CLASS = "w-full flex-1 text-sm font-medium text-default-500 group-data-[selected=true]:text-default-600";
|
|
5472
|
+
// TECH-2459 · G2 · fix de navegación — resolución de un ítem por su clave.
|
|
5473
|
+
//
|
|
5474
|
+
// `onSelectionChange` del `ListBox` entrega la CLAVE, no el ítem. v2 no necesitaba esto:
|
|
5475
|
+
// cada `ListboxItem` llevaba su propio `onPress={() => handleItemPress(item)}` y el ítem
|
|
5476
|
+
// entero viajaba en el closure. La búsqueda es recursiva para cubrir los tres niveles del
|
|
5477
|
+
// árbol (sección → ítem → sub-ítem). Solo los de primer nivel están en la colección del
|
|
5478
|
+
// `ListBox` —los sub-ítems son markup plano con su propio `onClick`, ver `renderSubItem`—,
|
|
5479
|
+
// pero `defaultSelectedKey` SÍ puede apuntar a un sub-ítem, y esa clave es la que hay que
|
|
5480
|
+
// resolver en la rama del conjunto vacío de `handleSelectionChange`.
|
|
5481
|
+
const findItemByKey = (items, key) => {
|
|
5482
|
+
for (const item of items) {
|
|
5483
|
+
if (item.key === key) {
|
|
5484
|
+
return item;
|
|
5485
|
+
}
|
|
5486
|
+
if (item.items) {
|
|
5487
|
+
const nested = findItemByKey(item.items, key);
|
|
5488
|
+
if (nested) {
|
|
5489
|
+
return nested;
|
|
5490
|
+
}
|
|
5491
|
+
}
|
|
5492
|
+
}
|
|
5493
|
+
return undefined;
|
|
5494
|
+
};
|
|
5495
|
+
// Un ítem de grupo NO navega nunca: su activación abre/cierra el `<details>` (expandido) o
|
|
5496
|
+
// el `Popover` (colapsado). Mismo criterio que v2, donde el `ListboxItem` del grupo era el
|
|
5497
|
+
// único sin `onPress`.
|
|
5498
|
+
const isNestItem = (item) => (item.items?.length ?? 0) > 0 && item.type === exports.EnumMenuNavListItem.Nest;
|
|
5472
5499
|
/**
|
|
5473
5500
|
* @component MenuNavList
|
|
5474
5501
|
* @description A versatile navigation list component that can be displayed in an expanded or collapsed state.
|
|
@@ -5497,6 +5524,64 @@ const MenuNavList = $8WNJc$react.forwardRef(({ items, isCollapsed, defaultSelect
|
|
|
5497
5524
|
document.activeElement.blur();
|
|
5498
5525
|
}
|
|
5499
5526
|
}, [onSelect]);
|
|
5527
|
+
// TECH-2459 · G2 · fix de navegación — QUÉ SE PERDIÓ AL MIGRAR.
|
|
5528
|
+
//
|
|
5529
|
+
// En v2 la navegación de un ítem de PRIMER NIVEL la disparaba su propio
|
|
5530
|
+
// `onPress={() => handleItemPress(item)}`, puesto en cada `ListboxItem` (v2 lo pasaba a
|
|
5531
|
+
// `usePress` sin condiciones). El `ListBoxItem` de v3 declara `PressEvents` en su tipo
|
|
5532
|
+
// pero NO los cablea: solo cablea `useKeyboard`/`useFocus`/`useHover`, y borra `onClick`
|
|
5533
|
+
// a propósito (`react-aria-components/dist/private/ListBox.mjs`, `delete
|
|
5534
|
+
// DOMProps.onClick`). Al traducir el componente ese `onPress` desapareció sin sustituto,
|
|
5535
|
+
// así que los ítems raíz se quedaron sin ninguna vía para llamar a `onSelect` y el menú
|
|
5536
|
+
// dejó de navegar en las 3 apps. Los sub-ítems no se enteraron porque son markup plano
|
|
5537
|
+
// con `onClick` (ver `renderSubItem`).
|
|
5538
|
+
//
|
|
5539
|
+
// POR QUÉ `onSelectionChange` Y NO `onAction` (leído en react-aria, no deducido):
|
|
5540
|
+
// `useSelectableItem` solo ejecuta la acción si `hasPrimaryAction = allowsActions &&
|
|
5541
|
+
// (!allowsSelection || manager.isEmpty)` (`react-aria/dist/private/selection/
|
|
5542
|
+
// useSelectableItem.mjs:116`). Con `selectionMode="single"` los ítems SÍ son
|
|
5543
|
+
// seleccionables y la selección NUNCA está vacía (`selectedKeys` es siempre un `Set` de
|
|
5544
|
+
// un elemento), así que `hasPrimaryAction` es permanentemente `false` y `onAction` no se
|
|
5545
|
+
// invoca jamás — ni el del `ListBox` ni el de cada `ListBoxItem`, porque ambos se
|
|
5546
|
+
// encadenan en el MISMO hueco (`react-aria/dist/private/listbox/useOption.mjs:68`).
|
|
5547
|
+
// `hasSecondaryAction` tampoco sirve: exige `selectionBehavior="replace"` y solo
|
|
5548
|
+
// dispararía con doble clic. Medido en el navegador antes del arreglo: con el `onAction`
|
|
5549
|
+
// que traía `renderItem`, ratón/Enter/Espacio daban 0 invocaciones de `onSelect`.
|
|
5550
|
+
//
|
|
5551
|
+
// Se pone UNO SOLO de los dos handlers a propósito: con `onAction` + `onSelectionChange`
|
|
5552
|
+
// activos a la vez, un clic navegaría dos veces.
|
|
5553
|
+
const handleSelectionChange = $8WNJc$react.useCallback((keys) => {
|
|
5554
|
+
// `selectionMode="single"` entrega 0 o 1 clave. El conjunto VACÍO no significa "nada
|
|
5555
|
+
// seleccionado": es el RECLIC sobre el ítem ya activo, que react-aria deselecciona
|
|
5556
|
+
// (`SelectionManager.toggleSelection` borra la clave y, sin `disallowEmptySelection`,
|
|
5557
|
+
// emite el `Set` vacío). Ese caso es real —el usuario pulsa dos veces su sección
|
|
5558
|
+
// actual— y la clave que hay que reenviar es la controlada. Por eso el `ListBox` lleva
|
|
5559
|
+
// `escapeKeyBehavior="none"`: es la OTRA fuente de conjunto vacío
|
|
5560
|
+
// (`useSelectableCollection.mjs:187`) y sin desactivarla un Escape con el menú
|
|
5561
|
+
// enfocado navegaría a la ruta actual — medido quitando la prop: 1 invocación
|
|
5562
|
+
// fantasma de `onSelect` con solo pulsar Escape.
|
|
5563
|
+
const changedKey = keys === "all"
|
|
5564
|
+
? undefined
|
|
5565
|
+
: Array.from(keys)[0];
|
|
5566
|
+
const key = changedKey ?? selectedKey;
|
|
5567
|
+
if (!key) {
|
|
5568
|
+
return;
|
|
5569
|
+
}
|
|
5570
|
+
const item = findItemByKey(items, key);
|
|
5571
|
+
if (!item) {
|
|
5572
|
+
return;
|
|
5573
|
+
}
|
|
5574
|
+
// El grupo se descarta aquí y no en el `ListBoxItem`, porque su press llega por tres
|
|
5575
|
+
// vías: la cabecera del `<details>`, el disparador del `Popover` colapsado y el
|
|
5576
|
+
// burbujeo desde un sub-ítem del `<details>` (el `<button>` plano es descendiente DOM
|
|
5577
|
+
// del `ListBoxItem` padre). Sin este filtro, un clic en un sub-ítem llamaría a
|
|
5578
|
+
// `onSelect` dos veces —una con la clave del sub-ítem y otra con la del grupo— y
|
|
5579
|
+
// abrir un grupo navegaría, algo que v2 no hacía.
|
|
5580
|
+
if (isNestItem(item)) {
|
|
5581
|
+
return;
|
|
5582
|
+
}
|
|
5583
|
+
handleItemPress(item);
|
|
5584
|
+
}, [handleItemPress, items, selectedKey]);
|
|
5500
5585
|
// Renders a sub-item (text-only, hierarchy line). Estilos de selección vía clase .selected en Menu.scss.
|
|
5501
5586
|
//
|
|
5502
5587
|
// ⚠️ TECH-2459 · G2 — markup PLANO (`<li><button>`), NO `ListBox.Item`. Se usa dentro de
|
|
@@ -5543,11 +5628,16 @@ const MenuNavList = $8WNJc$react.forwardRef(({ items, isCollapsed, defaultSelect
|
|
|
5543
5628
|
return renderNestItem(item);
|
|
5544
5629
|
}
|
|
5545
5630
|
const isItemSelected = selectedKey === item.key;
|
|
5546
|
-
return (jsxRuntime.jsx(react.ListBoxItem, { id: item.key, textValue: item.title, "aria-selected": isItemSelected, "aria-label": item.title || `Menu item ${item.key}`, className: react.cn(ITEM_BASE_CLASS, isCollapsed && ITEM_COLLAPSED_CLASS),
|
|
5547
|
-
}, [isCollapsed, hideEndContent, iconClassName, selectedKey,
|
|
5631
|
+
return (jsxRuntime.jsx(react.ListBoxItem, { id: item.key, textValue: item.title, "aria-selected": isItemSelected, "aria-label": item.title || `Menu item ${item.key}`, className: react.cn(ITEM_BASE_CLASS, isCollapsed && ITEM_COLLAPSED_CLASS), children: isCollapsed ? (jsxRuntime.jsxs(react.Tooltip, { delay: 0, closeDelay: 200, children: [jsxRuntime.jsx(react.Tooltip.Trigger, { children: jsxRuntime.jsx("div", { className: "flex w-full items-center justify-center", "aria-hidden": "true", children: item.icon ? (jsxRuntime.jsx(IconComponent, { className: react.cn("text-default-500", "group-data-[selected=true]:text-default-600", iconClassName), icon: item.icon, size: "lg" })) : ((item.startContent ?? null)) }) }), jsxRuntime.jsx(react.Tooltip.Content, { placement: "right", className: "text-default-500", children: item.title })] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [item.icon ? (jsxRuntime.jsx(IconComponent, { className: react.cn("text-default-500", "group-data-[selected=true]:text-default-600", iconClassName), icon: item.icon, size: "lg" })) : ((item.startContent ?? null)), jsxRuntime.jsx(react.Label, { className: ITEM_TITLE_CLASS, children: item.title }), hideEndContent ? null : (item.endContent ?? null)] })) }, item.key));
|
|
5632
|
+
}, [isCollapsed, hideEndContent, iconClassName, selectedKey, renderNestItem]);
|
|
5548
5633
|
// `ListBox` de v3 ya no es polimórfico via `as` (a diferencia de Breadcrumbs/Pagination) —
|
|
5549
5634
|
// renderiza siempre su propio contenedor; el landmark de navegación se envuelve por fuera.
|
|
5550
|
-
return (jsxRuntime.jsx("nav", { "aria-label": "Menu navigation", ref: ref, children: jsxRuntime.jsx(react.ListBox, { "aria-label": "Menu navigation", className: react.cn("list-none items-center", className), items: items, selectedKeys: selectedKeys, selectionMode: "single",
|
|
5635
|
+
return (jsxRuntime.jsx("nav", { "aria-label": "Menu navigation", ref: ref, children: jsxRuntime.jsx(react.ListBox, { "aria-label": "Menu navigation", className: react.cn("list-none items-center", className), items: items, selectedKeys: selectedKeys, selectionMode: "single", onSelectionChange: handleSelectionChange,
|
|
5636
|
+
// Neutraliza el Escape del `ListBox`: con el valor por defecto
|
|
5637
|
+
// (`clearSelection`) vaciaría la selección y `handleSelectionChange` leería ese
|
|
5638
|
+
// conjunto vacío como un reclic, navegando a la ruta actual sin que nadie haya
|
|
5639
|
+
// pulsado nada. Con `none`, Escape sigue sin hacer nada, igual que en v2.
|
|
5640
|
+
escapeKeyBehavior: "none", ...props, children: (item) => {
|
|
5551
5641
|
return item.items &&
|
|
5552
5642
|
item.items?.length > 0 &&
|
|
5553
5643
|
item?.type === exports.EnumMenuNavListItem.Nest ? (renderNestItem(item)) : item.items && item.items?.length > 0 ? (
|
|
@@ -8416,8 +8506,14 @@ const INVALID_VARIANT_CLASS = {
|
|
|
8416
8506
|
// Lo que v2 teñía de `danger` además del borde (variante base `isInvalid` de su `tv`).
|
|
8417
8507
|
const INVALID_LABEL_CLASS$1 = "text-danger";
|
|
8418
8508
|
const INVALID_TEXT_CLASS$1 = "text-danger";
|
|
8419
|
-
/**
|
|
8420
|
-
*
|
|
8509
|
+
/**
|
|
8510
|
+
* `"all" | Set<Key> | readonly Key[] | undefined` → array de claves (`"all"` no se puede expandir
|
|
8511
|
+
* sin el listado completo de items — se trata como `undefined`, ver README para la limitación).
|
|
8512
|
+
*
|
|
8513
|
+
* El cuerpo ya servía para un array (`Array.from` acepta `Set` e `ArrayLike` por igual): lo único
|
|
8514
|
+
* que había que ampliar era la FIRMA. Ver `SelectSelection` en `Select.types.ts` para el porqué
|
|
8515
|
+
* del tipo de entrada (y por qué NO es `Iterable<Key>`).
|
|
8516
|
+
*/
|
|
8421
8517
|
function toArray(selection) {
|
|
8422
8518
|
if (selection === undefined) {
|
|
8423
8519
|
return undefined;
|
|
@@ -8517,6 +8613,9 @@ fullWidth = true, isOpen, defaultOpen, onOpenChange, className, classNames, }) =
|
|
|
8517
8613
|
if (selectionMode === "multiple") {
|
|
8518
8614
|
return (jsxRuntime.jsx(react.Select, { ...commonProps, selectionMode: "multiple", value: toArray(selectedKeys), defaultValue: toArray(defaultSelectedKeys), onChange: (keys) => onSelectionChange?.(new Set(keys)), children: inner }));
|
|
8519
8615
|
}
|
|
8616
|
+
// `Array.from` cubre las tres formas de `SelectSelection` sin ramas nuevas: `"all"` sigue
|
|
8617
|
+
// cayendo a `null` (v3 no admite "todo" en selección única) y un array se lee igual que un
|
|
8618
|
+
// `Set`. Sin castings: el tipo ya lo permite.
|
|
8520
8619
|
const singleValue = selectedKeys === undefined
|
|
8521
8620
|
? undefined
|
|
8522
8621
|
: selectedKeys === "all"
|
package/dist/index.esm.js
CHANGED
|
@@ -5469,6 +5469,33 @@ const ITEM_COLLAPSED_CLASS = "w-11 h-11 gap-0 p-0 justify-center";
|
|
|
5469
5469
|
// `wrapper` `w-full` — el título se comía el espacio libre y empujaba el `endContent` al borde.
|
|
5470
5470
|
// El `[data-slot="label"]` de v3 es `w-fit`, que es la otra mitad de P-14.
|
|
5471
5471
|
const ITEM_TITLE_CLASS = "w-full flex-1 text-sm font-medium text-default-500 group-data-[selected=true]:text-default-600";
|
|
5472
|
+
// TECH-2459 · G2 · fix de navegación — resolución de un ítem por su clave.
|
|
5473
|
+
//
|
|
5474
|
+
// `onSelectionChange` del `ListBox` entrega la CLAVE, no el ítem. v2 no necesitaba esto:
|
|
5475
|
+
// cada `ListboxItem` llevaba su propio `onPress={() => handleItemPress(item)}` y el ítem
|
|
5476
|
+
// entero viajaba en el closure. La búsqueda es recursiva para cubrir los tres niveles del
|
|
5477
|
+
// árbol (sección → ítem → sub-ítem). Solo los de primer nivel están en la colección del
|
|
5478
|
+
// `ListBox` —los sub-ítems son markup plano con su propio `onClick`, ver `renderSubItem`—,
|
|
5479
|
+
// pero `defaultSelectedKey` SÍ puede apuntar a un sub-ítem, y esa clave es la que hay que
|
|
5480
|
+
// resolver en la rama del conjunto vacío de `handleSelectionChange`.
|
|
5481
|
+
const findItemByKey = (items, key) => {
|
|
5482
|
+
for (const item of items) {
|
|
5483
|
+
if (item.key === key) {
|
|
5484
|
+
return item;
|
|
5485
|
+
}
|
|
5486
|
+
if (item.items) {
|
|
5487
|
+
const nested = findItemByKey(item.items, key);
|
|
5488
|
+
if (nested) {
|
|
5489
|
+
return nested;
|
|
5490
|
+
}
|
|
5491
|
+
}
|
|
5492
|
+
}
|
|
5493
|
+
return undefined;
|
|
5494
|
+
};
|
|
5495
|
+
// Un ítem de grupo NO navega nunca: su activación abre/cierra el `<details>` (expandido) o
|
|
5496
|
+
// el `Popover` (colapsado). Mismo criterio que v2, donde el `ListboxItem` del grupo era el
|
|
5497
|
+
// único sin `onPress`.
|
|
5498
|
+
const isNestItem = (item) => (item.items?.length ?? 0) > 0 && item.type === EnumMenuNavListItem.Nest;
|
|
5472
5499
|
/**
|
|
5473
5500
|
* @component MenuNavList
|
|
5474
5501
|
* @description A versatile navigation list component that can be displayed in an expanded or collapsed state.
|
|
@@ -5497,6 +5524,64 @@ const MenuNavList = $8WNJc$react.forwardRef(({ items, isCollapsed, defaultSelect
|
|
|
5497
5524
|
document.activeElement.blur();
|
|
5498
5525
|
}
|
|
5499
5526
|
}, [onSelect]);
|
|
5527
|
+
// TECH-2459 · G2 · fix de navegación — QUÉ SE PERDIÓ AL MIGRAR.
|
|
5528
|
+
//
|
|
5529
|
+
// En v2 la navegación de un ítem de PRIMER NIVEL la disparaba su propio
|
|
5530
|
+
// `onPress={() => handleItemPress(item)}`, puesto en cada `ListboxItem` (v2 lo pasaba a
|
|
5531
|
+
// `usePress` sin condiciones). El `ListBoxItem` de v3 declara `PressEvents` en su tipo
|
|
5532
|
+
// pero NO los cablea: solo cablea `useKeyboard`/`useFocus`/`useHover`, y borra `onClick`
|
|
5533
|
+
// a propósito (`react-aria-components/dist/private/ListBox.mjs`, `delete
|
|
5534
|
+
// DOMProps.onClick`). Al traducir el componente ese `onPress` desapareció sin sustituto,
|
|
5535
|
+
// así que los ítems raíz se quedaron sin ninguna vía para llamar a `onSelect` y el menú
|
|
5536
|
+
// dejó de navegar en las 3 apps. Los sub-ítems no se enteraron porque son markup plano
|
|
5537
|
+
// con `onClick` (ver `renderSubItem`).
|
|
5538
|
+
//
|
|
5539
|
+
// POR QUÉ `onSelectionChange` Y NO `onAction` (leído en react-aria, no deducido):
|
|
5540
|
+
// `useSelectableItem` solo ejecuta la acción si `hasPrimaryAction = allowsActions &&
|
|
5541
|
+
// (!allowsSelection || manager.isEmpty)` (`react-aria/dist/private/selection/
|
|
5542
|
+
// useSelectableItem.mjs:116`). Con `selectionMode="single"` los ítems SÍ son
|
|
5543
|
+
// seleccionables y la selección NUNCA está vacía (`selectedKeys` es siempre un `Set` de
|
|
5544
|
+
// un elemento), así que `hasPrimaryAction` es permanentemente `false` y `onAction` no se
|
|
5545
|
+
// invoca jamás — ni el del `ListBox` ni el de cada `ListBoxItem`, porque ambos se
|
|
5546
|
+
// encadenan en el MISMO hueco (`react-aria/dist/private/listbox/useOption.mjs:68`).
|
|
5547
|
+
// `hasSecondaryAction` tampoco sirve: exige `selectionBehavior="replace"` y solo
|
|
5548
|
+
// dispararía con doble clic. Medido en el navegador antes del arreglo: con el `onAction`
|
|
5549
|
+
// que traía `renderItem`, ratón/Enter/Espacio daban 0 invocaciones de `onSelect`.
|
|
5550
|
+
//
|
|
5551
|
+
// Se pone UNO SOLO de los dos handlers a propósito: con `onAction` + `onSelectionChange`
|
|
5552
|
+
// activos a la vez, un clic navegaría dos veces.
|
|
5553
|
+
const handleSelectionChange = $8WNJc$react.useCallback((keys) => {
|
|
5554
|
+
// `selectionMode="single"` entrega 0 o 1 clave. El conjunto VACÍO no significa "nada
|
|
5555
|
+
// seleccionado": es el RECLIC sobre el ítem ya activo, que react-aria deselecciona
|
|
5556
|
+
// (`SelectionManager.toggleSelection` borra la clave y, sin `disallowEmptySelection`,
|
|
5557
|
+
// emite el `Set` vacío). Ese caso es real —el usuario pulsa dos veces su sección
|
|
5558
|
+
// actual— y la clave que hay que reenviar es la controlada. Por eso el `ListBox` lleva
|
|
5559
|
+
// `escapeKeyBehavior="none"`: es la OTRA fuente de conjunto vacío
|
|
5560
|
+
// (`useSelectableCollection.mjs:187`) y sin desactivarla un Escape con el menú
|
|
5561
|
+
// enfocado navegaría a la ruta actual — medido quitando la prop: 1 invocación
|
|
5562
|
+
// fantasma de `onSelect` con solo pulsar Escape.
|
|
5563
|
+
const changedKey = keys === "all"
|
|
5564
|
+
? undefined
|
|
5565
|
+
: Array.from(keys)[0];
|
|
5566
|
+
const key = changedKey ?? selectedKey;
|
|
5567
|
+
if (!key) {
|
|
5568
|
+
return;
|
|
5569
|
+
}
|
|
5570
|
+
const item = findItemByKey(items, key);
|
|
5571
|
+
if (!item) {
|
|
5572
|
+
return;
|
|
5573
|
+
}
|
|
5574
|
+
// El grupo se descarta aquí y no en el `ListBoxItem`, porque su press llega por tres
|
|
5575
|
+
// vías: la cabecera del `<details>`, el disparador del `Popover` colapsado y el
|
|
5576
|
+
// burbujeo desde un sub-ítem del `<details>` (el `<button>` plano es descendiente DOM
|
|
5577
|
+
// del `ListBoxItem` padre). Sin este filtro, un clic en un sub-ítem llamaría a
|
|
5578
|
+
// `onSelect` dos veces —una con la clave del sub-ítem y otra con la del grupo— y
|
|
5579
|
+
// abrir un grupo navegaría, algo que v2 no hacía.
|
|
5580
|
+
if (isNestItem(item)) {
|
|
5581
|
+
return;
|
|
5582
|
+
}
|
|
5583
|
+
handleItemPress(item);
|
|
5584
|
+
}, [handleItemPress, items, selectedKey]);
|
|
5500
5585
|
// Renders a sub-item (text-only, hierarchy line). Estilos de selección vía clase .selected en Menu.scss.
|
|
5501
5586
|
//
|
|
5502
5587
|
// ⚠️ TECH-2459 · G2 — markup PLANO (`<li><button>`), NO `ListBox.Item`. Se usa dentro de
|
|
@@ -5543,11 +5628,16 @@ const MenuNavList = $8WNJc$react.forwardRef(({ items, isCollapsed, defaultSelect
|
|
|
5543
5628
|
return renderNestItem(item);
|
|
5544
5629
|
}
|
|
5545
5630
|
const isItemSelected = selectedKey === item.key;
|
|
5546
|
-
return (jsx(ListBoxItem, { id: item.key, textValue: item.title, "aria-selected": isItemSelected, "aria-label": item.title || `Menu item ${item.key}`, className: cn(ITEM_BASE_CLASS, isCollapsed && ITEM_COLLAPSED_CLASS),
|
|
5547
|
-
}, [isCollapsed, hideEndContent, iconClassName, selectedKey,
|
|
5631
|
+
return (jsx(ListBoxItem, { id: item.key, textValue: item.title, "aria-selected": isItemSelected, "aria-label": item.title || `Menu item ${item.key}`, className: cn(ITEM_BASE_CLASS, isCollapsed && ITEM_COLLAPSED_CLASS), children: isCollapsed ? (jsxs(Tooltip$2, { delay: 0, closeDelay: 200, children: [jsx(Tooltip$2.Trigger, { children: jsx("div", { className: "flex w-full items-center justify-center", "aria-hidden": "true", children: item.icon ? (jsx(IconComponent, { className: cn("text-default-500", "group-data-[selected=true]:text-default-600", iconClassName), icon: item.icon, size: "lg" })) : ((item.startContent ?? null)) }) }), jsx(Tooltip$2.Content, { placement: "right", className: "text-default-500", children: item.title })] })) : (jsxs(Fragment, { children: [item.icon ? (jsx(IconComponent, { className: cn("text-default-500", "group-data-[selected=true]:text-default-600", iconClassName), icon: item.icon, size: "lg" })) : ((item.startContent ?? null)), jsx(Label, { className: ITEM_TITLE_CLASS, children: item.title }), hideEndContent ? null : (item.endContent ?? null)] })) }, item.key));
|
|
5632
|
+
}, [isCollapsed, hideEndContent, iconClassName, selectedKey, renderNestItem]);
|
|
5548
5633
|
// `ListBox` de v3 ya no es polimórfico via `as` (a diferencia de Breadcrumbs/Pagination) —
|
|
5549
5634
|
// renderiza siempre su propio contenedor; el landmark de navegación se envuelve por fuera.
|
|
5550
|
-
return (jsx("nav", { "aria-label": "Menu navigation", ref: ref, children: jsx(ListBox, { "aria-label": "Menu navigation", className: cn("list-none items-center", className), items: items, selectedKeys: selectedKeys, selectionMode: "single",
|
|
5635
|
+
return (jsx("nav", { "aria-label": "Menu navigation", ref: ref, children: jsx(ListBox, { "aria-label": "Menu navigation", className: cn("list-none items-center", className), items: items, selectedKeys: selectedKeys, selectionMode: "single", onSelectionChange: handleSelectionChange,
|
|
5636
|
+
// Neutraliza el Escape del `ListBox`: con el valor por defecto
|
|
5637
|
+
// (`clearSelection`) vaciaría la selección y `handleSelectionChange` leería ese
|
|
5638
|
+
// conjunto vacío como un reclic, navegando a la ruta actual sin que nadie haya
|
|
5639
|
+
// pulsado nada. Con `none`, Escape sigue sin hacer nada, igual que en v2.
|
|
5640
|
+
escapeKeyBehavior: "none", ...props, children: (item) => {
|
|
5551
5641
|
return item.items &&
|
|
5552
5642
|
item.items?.length > 0 &&
|
|
5553
5643
|
item?.type === EnumMenuNavListItem.Nest ? (renderNestItem(item)) : item.items && item.items?.length > 0 ? (
|
|
@@ -8416,8 +8506,14 @@ const INVALID_VARIANT_CLASS = {
|
|
|
8416
8506
|
// Lo que v2 teñía de `danger` además del borde (variante base `isInvalid` de su `tv`).
|
|
8417
8507
|
const INVALID_LABEL_CLASS$1 = "text-danger";
|
|
8418
8508
|
const INVALID_TEXT_CLASS$1 = "text-danger";
|
|
8419
|
-
/**
|
|
8420
|
-
*
|
|
8509
|
+
/**
|
|
8510
|
+
* `"all" | Set<Key> | readonly Key[] | undefined` → array de claves (`"all"` no se puede expandir
|
|
8511
|
+
* sin el listado completo de items — se trata como `undefined`, ver README para la limitación).
|
|
8512
|
+
*
|
|
8513
|
+
* El cuerpo ya servía para un array (`Array.from` acepta `Set` e `ArrayLike` por igual): lo único
|
|
8514
|
+
* que había que ampliar era la FIRMA. Ver `SelectSelection` en `Select.types.ts` para el porqué
|
|
8515
|
+
* del tipo de entrada (y por qué NO es `Iterable<Key>`).
|
|
8516
|
+
*/
|
|
8421
8517
|
function toArray(selection) {
|
|
8422
8518
|
if (selection === undefined) {
|
|
8423
8519
|
return undefined;
|
|
@@ -8517,6 +8613,9 @@ fullWidth = true, isOpen, defaultOpen, onOpenChange, className, classNames, }) =
|
|
|
8517
8613
|
if (selectionMode === "multiple") {
|
|
8518
8614
|
return (jsx(Select$1, { ...commonProps, selectionMode: "multiple", value: toArray(selectedKeys), defaultValue: toArray(defaultSelectedKeys), onChange: (keys) => onSelectionChange?.(new Set(keys)), children: inner }));
|
|
8519
8615
|
}
|
|
8616
|
+
// `Array.from` cubre las tres formas de `SelectSelection` sin ramas nuevas: `"all"` sigue
|
|
8617
|
+
// cayendo a `null` (v3 no admite "todo" en selección única) y un array se lee igual que un
|
|
8618
|
+
// `Set`. Sin castings: el tipo ya lo permite.
|
|
8520
8619
|
const singleValue = selectedKeys === undefined
|
|
8521
8620
|
? undefined
|
|
8522
8621
|
: selectedKeys === "all"
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* publica bajo ese nombre (ver el histórico al final de `heroui-v2-shims.tsx`), así que aquí se
|
|
28
28
|
* ejercita con el JSX v2 completo, como Alert y Checkbox.
|
|
29
29
|
*/
|
|
30
|
-
import { type AlertProps, type CheckboxProps, type SortDescriptor, type SwitchProps, type SwitchPropsComponent, type TextAreaProps } from "../index";
|
|
30
|
+
import { type AlertProps, type CheckboxProps, type Selection, type SortDescriptor, type SwitchProps, type SwitchPropsComponent, type TextAreaProps } from "../index";
|
|
31
31
|
/** AuraAutocomplete: API v2 (label, icon, children con AutocompleteItem). */
|
|
32
32
|
declare function smokeAutocomplete(): import("react").JSX.Element;
|
|
33
33
|
/** `Autocomplete` crudo (beweosagency, 1 fichero) sigue resolviendo. */
|
|
@@ -85,6 +85,44 @@ declare function smokeSwitchProps(): SwitchProps;
|
|
|
85
85
|
declare function smokeSwitchLegacyAlias(props: SwitchPropsComponent): import("react").JSX.Element;
|
|
86
86
|
/** Switch con la API compound de v3 a través de la fachada. */
|
|
87
87
|
declare function smokeSwitchV3Compound(): import("react").JSX.Element;
|
|
88
|
+
/**
|
|
89
|
+
* Los patrones REALES de las apps, uno a uno (extraídos del tag, con su `file:line`):
|
|
90
|
+
*
|
|
91
|
+
* 1. **Array literal** sobre el valor de un formulario — beweossmbs
|
|
92
|
+
* `clients/…/general-data/attendance-card.component.tsx:128` y backoffice
|
|
93
|
+
* `whatsapp-templates/ui/components/TemplateForm.tsx:222` (`selectedKeys={[field.value]}`).
|
|
94
|
+
* 2. **Ternario que puede devolver array VACÍO** — backoffice
|
|
95
|
+
* `shared/ui/components/gender-select/gender-select.component.tsx:92` y beweossmbs
|
|
96
|
+
* `settings/location/ui/components/timezone-manager.component.tsx:52`
|
|
97
|
+
* (`selectedKeys={value ? [value] : []}`). Es el patrón mayoritario en backoffice: 52 de sus 78
|
|
98
|
+
* líneas.
|
|
99
|
+
* 3. **`new Set(...)`** — beweossmbs
|
|
100
|
+
* `clients/…/saved-views-dropdown/saved-views-dropdown.component.tsx:208` y backoffice
|
|
101
|
+
* `billing/sell/ui/components/SellPricingStep.tsx:76`. Lo usan 14 ficheros ya migrados: fijarlo
|
|
102
|
+
* aquí es lo que garantiza que ensanchar el tipo no los rompe.
|
|
103
|
+
* 4. **`defaultSelectedKeys` con array** — beweossmbs
|
|
104
|
+
* `settings/users/ui/components/invite-user-modal.component.tsx:162` (`["admin"]`) y
|
|
105
|
+
* beweosagency `settings/profile/ui/Profile.tsx:431` (`[formData.language]`).
|
|
106
|
+
* 5. **`string[]` mutable de React Hook Form en modo múltiple** — beweossmbs
|
|
107
|
+
* `clients/…/custom-fields-card/custom-field-controller.component.tsx:204`. No es un literal:
|
|
108
|
+
* su tipo es `string[]`, y por eso el tipo de la prop lleva `readonly` (acepta ambos) en vez de
|
|
109
|
+
* pedir una copia.
|
|
110
|
+
*
|
|
111
|
+
* La SALIDA no se ensancha: `onSelectionChange` sigue recibiendo `Selection` de v3, que es lo que
|
|
112
|
+
* ya esperan los handlers de las apps (`if (keys === "all")`, `Array.from(keys)`).
|
|
113
|
+
*/
|
|
114
|
+
declare function smokeSelectV2SelectedKeys(value: string, multiValue: string[], onSelectionChange: (keys: Selection) => void): import("react").JSX.Element;
|
|
115
|
+
/**
|
|
116
|
+
* El límite del ensanchado, fijado a propósito: el tipo es `Selection | readonly Key[]`, **NO**
|
|
117
|
+
* `Iterable<Key>`. `Key` es `string | number` y un `string` plano ES un `Iterable<string>`, así que
|
|
118
|
+
* con `Iterable<Key>` este JSX compilaría y el `Array.from` de la fachada expandiría el valor
|
|
119
|
+
* **letra a letra** (`["m","x"]`), en silencio y sin error en consola. Hoy ninguna de las 4 apps
|
|
120
|
+
* pasa un string plano (verificado por grep), así que nadie pierde nada.
|
|
121
|
+
*
|
|
122
|
+
* Si alguien "simplifica" el tipo a `Iterable<Key>`, este `@ts-expect-error` se queda sin error que
|
|
123
|
+
* esperar y `tsc` falla con «Unused '@ts-expect-error' directive» — que es el punto.
|
|
124
|
+
*/
|
|
125
|
+
declare function smokeSelectRejectsBareString(): import("react").JSX.Element;
|
|
88
126
|
/** Selection/SortDescriptor: mismas formas que en v2 (pass-through verificado, no shim real). */
|
|
89
127
|
declare function smokeCollectionTypes(): {
|
|
90
128
|
selection: "all";
|
|
@@ -136,6 +174,8 @@ export declare const v2ApiSurfaceSmokeTest: {
|
|
|
136
174
|
smokeSwitchProps: typeof smokeSwitchProps;
|
|
137
175
|
smokeSwitchLegacyAlias: typeof smokeSwitchLegacyAlias;
|
|
138
176
|
smokeSwitchV3Compound: typeof smokeSwitchV3Compound;
|
|
177
|
+
smokeSelectV2SelectedKeys: typeof smokeSelectV2SelectedKeys;
|
|
178
|
+
smokeSelectRejectsBareString: typeof smokeSelectRejectsBareString;
|
|
139
179
|
smokeCollectionTypes: typeof smokeCollectionTypes;
|
|
140
180
|
smokeAlertProps: typeof smokeAlertProps;
|
|
141
181
|
smokeAlertColorUnion: typeof smokeAlertColorUnion;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v2-api-surface.d.ts","sourceRoot":"","sources":["../../../src/__smoke__/v2-api-surface.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAIN,KAAK,UAAU,EAUf,KAAK,aAAa,EAqBlB,KAAK,cAAc,EAGnB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EASzB,KAAK,aAAa,EAIlB,MAAM,UAAU,CAAC;AAMlB,6EAA6E;AAC7E,iBAAS,iBAAiB,gCAWzB;AAED,wEAAwE;AACxE,iBAAS,oBAAoB,gCAQ5B;AAED,gEAAgE;AAChE,iBAAS,cAAc,gCAEtB;AAED,kFAAkF;AAClF,iBAAS,YAAY,gCAEpB;AAED,+DAA+D;AAC/D,iBAAS,UAAU,gCAElB;AAMD,oGAAoG;AACpG,iBAAS,gBAAgB,gCASxB;AAED,6CAA6C;AAC7C,iBAAS,UAAU,gCAalB;AAED,2DAA2D;AAC3D,iBAAS,SAAS,gCAMjB;AAED,gFAAgF;AAChF,iBAAS,iBAAiB,gCAQzB;AAED,yBAAyB;AACzB,iBAAS,WAAW,gCAUnB;AAED,mEAAmE;AACnE,iBAAS,aAAa,gCAcrB;AAED,+BAA+B;AAC/B,iBAAS,cAAc,gCAMtB;AAED,mGAAmG;AACnG,iBAAS,UAAU,gCAOlB;AAED,gCAAgC;AAChC,iBAAS,gBAAgB,gCAMxB;AAMD,uFAAuF;AACvF,iBAAS,mBAAmB,gCAM3B;AAMD,iBAAS,aAAa,gCAErB;AASD;;;;;;;;;GASG;AACH,iBAAS,uBAAuB,CAC/B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,EAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,+BAgBjB;AAED;;;GAGG;AACH,iBAAS,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,+BAoBxE;AAED,8DAA8D;AAC9D,iBAAS,gBAAgB,IAAI,WAAW,CAEvC;AAED;;;;GAIG;AACH,iBAAS,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,+BAE1D;AAED,+DAA+D;AAC/D,iBAAS,qBAAqB,gCAW7B;AAMD,iGAAiG;AACjG,iBAAS,oBAAoB;;;EAO5B;AAED,qGAAqG;AACrG,iBAAS,eAAe,IAAI,UAAU,CAWrC;AAED,iGAAiG;AACjG,iBAAS,oBAAoB,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAElE;AAOD,0GAA0G;AAC1G,iBAAS,YAAY,gCA+BpB;AAED,wFAAwF;AACxF,iBAAS,oBAAoB,gCAW5B;AAED,yGAAyG;AACzG,iBAAS,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,+BAyBtE;AAED,iEAAiE;AACjE,iBAAS,uBAAuB,gCAS/B;AAED,gEAAgE;AAChE,iBAAS,kBAAkB,IAAI,aAAa,CAE3C;AAED,iGAAiG;AACjG,iBAAS,kBAAkB,IAAI,aAAa,CAU3C;AAMD,iBAAS,kBAAkB;;iBAMP,IAAI;kBACH,IAAI;sBACA,OAAO,KAAK,IAAI;mBACnB,IAAI;EAEzB;AAKD,iBAAS,OAAO,yCAEf;AAKD,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"v2-api-surface.d.ts","sourceRoot":"","sources":["../../../src/__smoke__/v2-api-surface.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAIN,KAAK,UAAU,EAUf,KAAK,aAAa,EAqBlB,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,WAAW,EAChB,KAAK,oBAAoB,EASzB,KAAK,aAAa,EAIlB,MAAM,UAAU,CAAC;AAMlB,6EAA6E;AAC7E,iBAAS,iBAAiB,gCAWzB;AAED,wEAAwE;AACxE,iBAAS,oBAAoB,gCAQ5B;AAED,gEAAgE;AAChE,iBAAS,cAAc,gCAEtB;AAED,kFAAkF;AAClF,iBAAS,YAAY,gCAEpB;AAED,+DAA+D;AAC/D,iBAAS,UAAU,gCAElB;AAMD,oGAAoG;AACpG,iBAAS,gBAAgB,gCASxB;AAED,6CAA6C;AAC7C,iBAAS,UAAU,gCAalB;AAED,2DAA2D;AAC3D,iBAAS,SAAS,gCAMjB;AAED,gFAAgF;AAChF,iBAAS,iBAAiB,gCAQzB;AAED,yBAAyB;AACzB,iBAAS,WAAW,gCAUnB;AAED,mEAAmE;AACnE,iBAAS,aAAa,gCAcrB;AAED,+BAA+B;AAC/B,iBAAS,cAAc,gCAMtB;AAED,mGAAmG;AACnG,iBAAS,UAAU,gCAOlB;AAED,gCAAgC;AAChC,iBAAS,gBAAgB,gCAMxB;AAMD,uFAAuF;AACvF,iBAAS,mBAAmB,gCAM3B;AAMD,iBAAS,aAAa,gCAErB;AASD;;;;;;;;;GASG;AACH,iBAAS,uBAAuB,CAC/B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,EAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,+BAgBjB;AAED;;;GAGG;AACH,iBAAS,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,+BAoBxE;AAED,8DAA8D;AAC9D,iBAAS,gBAAgB,IAAI,WAAW,CAEvC;AAED;;;;GAIG;AACH,iBAAS,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,+BAE1D;AAED,+DAA+D;AAC/D,iBAAS,qBAAqB,gCAW7B;AAaD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,iBAAS,yBAAyB,CACjC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAAE,EACpB,iBAAiB,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,+BAsC5C;AAED;;;;;;;;;GASG;AACH,iBAAS,4BAA4B,gCAUpC;AAMD,iGAAiG;AACjG,iBAAS,oBAAoB;;;EAO5B;AAED,qGAAqG;AACrG,iBAAS,eAAe,IAAI,UAAU,CAWrC;AAED,iGAAiG;AACjG,iBAAS,oBAAoB,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAElE;AAOD,0GAA0G;AAC1G,iBAAS,YAAY,gCA+BpB;AAED,wFAAwF;AACxF,iBAAS,oBAAoB,gCAW5B;AAED,yGAAyG;AACzG,iBAAS,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,+BAyBtE;AAED,iEAAiE;AACjE,iBAAS,uBAAuB,gCAS/B;AAED,gEAAgE;AAChE,iBAAS,kBAAkB,IAAI,aAAa,CAE3C;AAED,iGAAiG;AACjG,iBAAS,kBAAkB,IAAI,aAAa,CAU3C;AAMD,iBAAS,kBAAkB;;iBAMP,IAAI;kBACH,IAAI;sBACA,OAAO,KAAK,IAAI;mBACnB,IAAI;EAEzB;AAKD,iBAAS,OAAO,yCAEf;AAKD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCjC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuNavList.d.ts","sourceRoot":"","sources":["../../../../../../src/components/menu/_internal/menu-nav-list/MenuNavList.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"MenuNavList.d.ts","sourceRoot":"","sources":["../../../../../../src/components/menu/_internal/menu-nav-list/MenuNavList.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAoE5D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,sFAohBvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../../../src/components/select/Select.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../../../src/components/select/Select.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EACX,WAAW,EAIX,MAAM,gBAAgB,CAAC;AAySxB;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAuLxC,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -9,6 +9,28 @@ export interface SelectClassNames {
|
|
|
9
9
|
trigger?: string;
|
|
10
10
|
popoverContent?: string;
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Entrada de selección de la fachada: el vocabulario v2 (`Selection` = `"all" | Set<Key>`) **más
|
|
14
|
+
* arrays**, que es la forma en la que realmente escriben las apps (medido 08-sep-2026 por grep de
|
|
15
|
+
* `selectedKeys=`/`defaultSelectedKeys=` en los `.tsx` de los 4 repos: 116 usos en beweossmbs, 78
|
|
16
|
+
* en backoffice-beweos, 25 en beweosagency, 0 en loginos; la mayoría arrays, literales o por
|
|
17
|
+
* ternario).
|
|
18
|
+
*
|
|
19
|
+
* Por qué existe: en v2 el `Select` de HeroUI heredaba `MultipleSelection` de React Aria, cuyo
|
|
20
|
+
* `selectedKeys` es **`"all" | Iterable<Key>`** (`@react-types/shared/src/selection.d.ts:35`), no
|
|
21
|
+
* `Selection` — o sea, en v2 un array compilaba. Esta fachada lo declaró como `Selection` al
|
|
22
|
+
* migrar y estrechó la API sin cambiar el nombre de la prop, así que el fallo se cuela en
|
|
23
|
+
* cualquier auditoría de nombres: 71 errores de tipos en 30 ficheros solo en backoffice.
|
|
24
|
+
*
|
|
25
|
+
* ⚠️ Es `Selection | readonly Key[]`, **NO `Iterable<Key>`**, y no es simplificable: `Key` es
|
|
26
|
+
* `string | number`, y un `string` plano ES un `Iterable<string>`. Con `Iterable<Key>` un
|
|
27
|
+
* `selectedKeys="abc"` compilaría y el `Array.from` de la fachada lo expandiría **letra a letra**
|
|
28
|
+
* (`["a","b","c"]`), en silencio y sin error en consola. Con `readonly Key[]` ese JSX no compila,
|
|
29
|
+
* y los usos reales quedan cubiertos igual porque todos son arrays (verificado: ninguna de las 4
|
|
30
|
+
* apps pasa hoy un string plano). El `readonly` está para aceptar tanto `string[]` mutable —el
|
|
31
|
+
* caso de `f.value` de React Hook Form— como una tupla congelada, sin obligar a nadie a copiar.
|
|
32
|
+
*/
|
|
33
|
+
export type SelectSelection = Selection | readonly Key[];
|
|
12
34
|
export interface SelectProps {
|
|
13
35
|
children?: ReactNode;
|
|
14
36
|
label?: ReactNode;
|
|
@@ -25,10 +47,14 @@ export interface SelectProps {
|
|
|
25
47
|
radius?: SelectRadius;
|
|
26
48
|
/** @default "single" */
|
|
27
49
|
selectionMode?: "single" | "multiple";
|
|
28
|
-
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Claves seleccionadas (controlado). Vocabulario v2: `"all"`, un `Set` o un **array** de claves
|
|
52
|
+
* (ver `SelectSelection` para por qué es `readonly Key[]` y no `Iterable<Key>`).
|
|
53
|
+
*/
|
|
54
|
+
selectedKeys?: SelectSelection;
|
|
55
|
+
/** Claves seleccionadas por defecto (no controlado). Mismas formas que `selectedKeys`. */
|
|
56
|
+
defaultSelectedKeys?: SelectSelection;
|
|
57
|
+
/** La SALIDA no cambia: v3 manda, y sigue siendo `Selection` (`"all" | Set<Key>`). */
|
|
32
58
|
onSelectionChange?: (keys: Selection) => void;
|
|
33
59
|
disabledKeys?: Iterable<Key>;
|
|
34
60
|
isInvalid?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.types.d.ts","sourceRoot":"","sources":["../../../../src/components/select/Select.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,mEAAmE;AACnE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"Select.types.d.ts","sourceRoot":"","sources":["../../../../src/components/select/Select.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,mEAAmE;AACnE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,EAAE,CAAC;AASzD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,wBAAwB;IACxB,aAAa,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACtC;;;OAGG;IACH,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,0FAA0F;IAC1F,mBAAmB,CAAC,EAAE,eAAe,CAAC;IACtC,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/select/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/select/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAG3C,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|