@beweco/aurora-ui 1.0.1-beta.161 → 1.0.1-qa.165

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.
@@ -2,7 +2,7 @@
2
2
  * AUTOGENERADO — no editar a mano.
3
3
  * Tokens de tema: SOLO el bloque de tema (static). Export `./theme`; la app lo importa con theme(reference), que anula el static.
4
4
  * Fuente: scripts/generate-theme-tokens.mjs
5
- * ← src/styles/colors.default.ts (14 packs)
5
+ * ← src/styles/colors.default.ts (16 packs)
6
6
  * ← scripts/v2-base-palette.json (paleta base heredada por `extend`)
7
7
  *
8
8
  * Regenerar y verificar contra el oráculo v2:
@@ -105,6 +105,8 @@
105
105
  --color-danger-700: #920b3a;
106
106
  --color-danger-800: #610726;
107
107
  --color-danger-900: #310413;
108
+ /* Texto de marca sobre fondo claro: expone a las apps la utilidad `text-accent-soft-foreground`, que solo trae el tema de @heroui/styles (las apps no lo importan). */
109
+ --color-accent-soft-foreground: var(--accent-soft-foreground);
108
110
  --aurora-shadow-small: 0px 0px 5px 0px rgb(0 0 0 / 0.02), 0px 2px 10px 0px rgb(0 0 0 / 0.06), 0px 0px 1px 0px rgb(0 0 0 / 0.3);
109
111
  --aurora-shadow-medium: 0px 0px 15px 0px rgb(0 0 0 / 0.03), 0px 2px 30px 0px rgb(0 0 0 / 0.08), 0px 0px 1px 0px rgb(0 0 0 / 0.3);
110
112
  --aurora-shadow-large: 0px 0px 30px 0px rgb(0 0 0 / 0.04), 0px 30px 60px 0px rgb(0 0 0 / 0.12), 0px 0px 1px 0px rgb(0 0 0 / 0.3);
package/dist/index.cjs.js CHANGED
@@ -471,7 +471,7 @@ const COLOR_TOKENS$1 = {
471
471
  fg: "var(--color-primary-foreground)",
472
472
  softBg: "var(--accent-soft)",
473
473
  softBgHover: "var(--accent-soft-hover)",
474
- softFg: "var(--color-primary)",
474
+ softFg: "var(--accent-soft-foreground)",
475
475
  },
476
476
  success: {
477
477
  bg: "var(--success)",
@@ -1014,8 +1014,8 @@ const COLOR_TOKENS = {
1014
1014
  bg: "var(--accent)",
1015
1015
  fg: "var(--color-primary-foreground)",
1016
1016
  flatBg: "color-mix(in srgb, var(--color-primary) 20%, transparent)",
1017
- flatFg: "var(--color-primary-600)",
1018
- tintFg: "var(--color-primary)",
1017
+ flatFg: "var(--accent-soft-foreground)",
1018
+ tintFg: "var(--accent-soft-foreground)",
1019
1019
  },
1020
1020
  success: {
1021
1021
  bg: "var(--success)",
@@ -2896,7 +2896,7 @@ const AnalyticsCard = ({ data, showTimePeriods = true, showDropdownMenu = true,
2896
2896
  return (jsxRuntime.jsx(Card, { className: "dark:border-default-100 border border-transparent", ...props, children: jsxRuntime.jsxs("section", { className: "flex flex-col flex-nowrap", children: [jsxRuntime.jsx("div", { className: "flex flex-col justify-between gap-y-2", children: jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-2", children: [jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-0", children: [jsxRuntime.jsx(H2, { children: t.title }), jsxRuntime.jsx(P, { children: t.description })] }), jsxRuntime.jsx("div", { className: "h-2", "aria-hidden": "true" }), showTimePeriods && (jsxRuntime.jsx(react.Tabs, { className: "self-end", onSelectionChange: (key) => handleTimePeriodChange(String(key)), children: jsxRuntime.jsx(react.Tabs.ListContainer, { className: "bg-default-100", children: jsxRuntime.jsxs(react.Tabs.List, { "aria-label": t.title, children: [jsxRuntime.jsxs(react.Tabs.Tab, { id: "6-months", className: "whitespace-nowrap", children: [t.months6, jsxRuntime.jsx(react.Tabs.Indicator, {})] }), jsxRuntime.jsxs(react.Tabs.Tab, { id: "3-months", className: "whitespace-nowrap", children: [t.months3, jsxRuntime.jsx(react.Tabs.Indicator, {})] }), jsxRuntime.jsxs(react.Tabs.Tab, { id: "30-days", className: "whitespace-nowrap", children: [t.days30, jsxRuntime.jsx(react.Tabs.Indicator, {})] }), jsxRuntime.jsxs(react.Tabs.Tab, { id: "7-days", className: "whitespace-nowrap", children: [t.days7, jsxRuntime.jsx(react.Tabs.Indicator, {})] }), jsxRuntime.jsxs(react.Tabs.Tab, { id: "24-hours", className: "whitespace-nowrap", children: [t.hours24, jsxRuntime.jsx(react.Tabs.Indicator, {})] })] }) }) })), showMetricCards && (jsxRuntime.jsx("div", { className: "mt-2 flex w-full items-center", children: jsxRuntime.jsx("div", { className: "-my-3 flex w-full max-w-[800px] items-center gap-x-3 overflow-x-auto py-3", children: data.map(({ key, change, changeType, type, value, title }) => (jsxRuntime.jsxs("button", { type: "button", className: cn("rounded-[12px] flex w-full flex-col gap-2 p-3 transition-colors", {
2897
2897
  "bg-default-100": activeChart === key,
2898
2898
  }), onClick: () => handleChartChange(key), children: [jsxRuntime.jsx("span", { className: cn("text-sm text-default-500 font-medium transition-colors", {
2899
- "text-primary": activeChart === key,
2899
+ "text-accent-soft-foreground": activeChart === key,
2900
2900
  }), children: title }), jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [jsxRuntime.jsx("span", { className: "text-foreground text-2xl font-bold", children: formatValue(value, type) }), jsxRuntime.jsx(Chip, { color: changeType === "positive"
2901
2901
  ? "success"
2902
2902
  : changeType === "negative"
@@ -4044,6 +4044,76 @@ const themeColors = {
4044
4044
  overlay: "#ffffff",
4045
4045
  },
4046
4046
  },
4047
+ "amberYellow-light": {
4048
+ extend: "light",
4049
+ colors: {
4050
+ primary: {
4051
+ "50": "#FFFBE3",
4052
+ "100": "#FFF4BD",
4053
+ "200": "#FFEB92",
4054
+ "300": "#FFDC5E",
4055
+ "400": "#FFCF34",
4056
+ "500": "#FFBF00",
4057
+ "600": "#D8A200",
4058
+ "700": "#AC7E00",
4059
+ "800": "#805900",
4060
+ "900": "#533600",
4061
+ foreground: "#000",
4062
+ DEFAULT: "#FFBF00",
4063
+ },
4064
+ secondary: {
4065
+ "50": "#F3F7FD",
4066
+ "100": "#D1DFFB",
4067
+ "200": "#A5BEF7",
4068
+ "300": "#7494E7",
4069
+ "400": "#4E6FCF",
4070
+ "500": "#1E40AF",
4071
+ "600": "#153096",
4072
+ "700": "#0F237D",
4073
+ "800": "#091865",
4074
+ "900": "#051053",
4075
+ foreground: "#fff",
4076
+ DEFAULT: "#1E40AF",
4077
+ },
4078
+ focus: "#FFBF00",
4079
+ overlay: "#000000",
4080
+ },
4081
+ },
4082
+ "amberYellow-dark": {
4083
+ extend: "dark",
4084
+ colors: {
4085
+ primary: {
4086
+ "50": "#533600",
4087
+ "100": "#805900",
4088
+ "200": "#AC7E00",
4089
+ "300": "#D8A200",
4090
+ "400": "#FFBF00",
4091
+ "500": "#FFCF34",
4092
+ "600": "#FFDC5E",
4093
+ "700": "#FFEB92",
4094
+ "800": "#FFF4BD",
4095
+ "900": "#FFFBE3",
4096
+ foreground: "#000",
4097
+ DEFAULT: "#FFBF00",
4098
+ },
4099
+ secondary: {
4100
+ "50": "#002147",
4101
+ "100": "#003571",
4102
+ "200": "#00489b",
4103
+ "300": "#005cc4",
4104
+ "400": "#006fee",
4105
+ "500": "#2d88f1",
4106
+ "600": "#59a1f4",
4107
+ "700": "#86bbf7",
4108
+ "800": "#b3d4fa",
4109
+ "900": "#dfedfd",
4110
+ foreground: "#fff",
4111
+ DEFAULT: "#006fee",
4112
+ },
4113
+ focus: "#FFBF00",
4114
+ overlay: "#ffffff",
4115
+ },
4116
+ },
4047
4117
  "coral-light": {
4048
4118
  extend: "light",
4049
4119
  colors: {
@@ -4552,7 +4622,7 @@ const themeColors = {
4552
4622
  * Los mismos nombres de tema que resuelve HeroUI v3 (`@heroui/styles`):
4553
4623
  * `:root, .light, .default, [data-theme=light], [data-theme=default]` para el claro y
4554
4624
  * `.dark, [data-theme=dark]` para el oscuro. `default` es un alias del claro en v3; en v2 no
4555
- * existía. Más los 14 packs de aurora, cada uno en el lado de su `extend`, que son las clases
4625
+ * existía. Más los 16 packs de aurora, cada uno en el lado de su `extend`, que son las clases
4556
4626
  * que `theme-packs.generated.css` declara y `applyThemeClass` pone en `<html>`.
4557
4627
  */
4558
4628
  const V3_ALIASES = {
@@ -6839,7 +6909,7 @@ const KanbanColumnComponent = ({ column, renderItem, onCardClick, cardClassName,
6839
6909
  // siempre visible pero la story lo tapaba, y ahora queda apagado por defecto.
6840
6910
  className: "static text-xs font-medium transform-none", style: column.countBadgeColor === "secondary"
6841
6911
  ? SECONDARY_BADGE_STYLE
6842
- : undefined, "aria-label": `${itemCount} ${t.itemsLabel}`, children: itemCount }))] })), jsxRuntime.jsx("div", { ref: scrollContainerRef, className: cn("flex-1 overflow-y-auto p-3 space-y-3", isDragOver && isEmpty && "min-h-24"), style: { maxHeight }, children: isEmpty ? (isDragOver && isDragging ? (jsxRuntime.jsx("div", { className: "h-24 border-2 border-dashed border-primary-300 rounded-lg bg-primary-50/50 flex items-center justify-center", children: jsxRuntime.jsx("span", { className: "text-primary-500 text-sm", children: t.dropHere }) })) : renderEmptyState ? (renderEmptyState(column)) : (jsxRuntime.jsx("div", { className: "flex items-center justify-center h-24 text-default-400 text-sm", children: column.emptyMessage || t.emptyMessage }))) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [column.items.map((item, index) => (jsxRuntime.jsxs("div", { onDragOver: (e) => handleDragOverItem(e, index), children: [isDragOver && dropIndex === index && (jsxRuntime.jsx("div", { className: "h-1 bg-primary-400 rounded-full mb-3 animate-pulse" })), jsxRuntime.jsx(KanbanCard, { item: item, columnId: column.id, index: index, renderContent: renderItem, onCardClick: onCardClick, className: cardClassName, isClickable: isCardClickable, isDraggable: isDraggable, onDragStart: onDragStart, onDragEnd: onDragEnd })] }, item.id))), isDragOver && dropIndex === column.items.length && (jsxRuntime.jsx("div", { className: "h-1 bg-primary-400 rounded-full mt-3 animate-pulse" })), column.isLoading && (jsxRuntime.jsx("div", { className: "flex items-center justify-center py-4", children: jsxRuntime.jsx(react.Spinner, { size: "sm", color: "accent" }) }))] })) })] }));
6912
+ : undefined, "aria-label": `${itemCount} ${t.itemsLabel}`, children: itemCount }))] })), jsxRuntime.jsx("div", { ref: scrollContainerRef, className: cn("flex-1 overflow-y-auto p-3 space-y-3", isDragOver && isEmpty && "min-h-24"), style: { maxHeight }, children: isEmpty ? (isDragOver && isDragging ? (jsxRuntime.jsx("div", { className: "h-24 border-2 border-dashed border-primary-300 rounded-lg bg-primary-50/50 flex items-center justify-center", children: jsxRuntime.jsx("span", { className: "text-accent-soft-foreground text-sm", children: t.dropHere }) })) : renderEmptyState ? (renderEmptyState(column)) : (jsxRuntime.jsx("div", { className: "flex items-center justify-center h-24 text-default-400 text-sm", children: column.emptyMessage || t.emptyMessage }))) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [column.items.map((item, index) => (jsxRuntime.jsxs("div", { onDragOver: (e) => handleDragOverItem(e, index), children: [isDragOver && dropIndex === index && (jsxRuntime.jsx("div", { className: "h-1 bg-primary-400 rounded-full mb-3 animate-pulse" })), jsxRuntime.jsx(KanbanCard, { item: item, columnId: column.id, index: index, renderContent: renderItem, onCardClick: onCardClick, className: cardClassName, isClickable: isCardClickable, isDraggable: isDraggable, onDragStart: onDragStart, onDragEnd: onDragEnd })] }, item.id))), isDragOver && dropIndex === column.items.length && (jsxRuntime.jsx("div", { className: "h-1 bg-primary-400 rounded-full mt-3 animate-pulse" })), column.isLoading && (jsxRuntime.jsx("div", { className: "flex items-center justify-center py-4", children: jsxRuntime.jsx(react.Spinner, { size: "sm", color: "accent" }) }))] })) })] }));
6843
6913
  };
6844
6914
  const KanbanColumn = $8WNJc$react.memo(KanbanColumnComponent);
6845
6915
  KanbanColumn.displayName = "KanbanColumn";
@@ -8166,12 +8236,6 @@ const MenuClawHistoryPanel = $8WNJc$react.memo(function MenuClawHistoryPanel({ i
8166
8236
  // que no quede a la vista solo en el agregado del lateral comprimido.
8167
8237
  const hasHiddenNews = $8WNJc$react.useMemo(() => !isExpanded &&
8168
8238
  items.slice(initialVisibleCount).some((item) => item.hasNews === true), [isExpanded, items, initialVisibleCount]);
8169
- // Plegado el botón es solo un icono y su nombre accesible es `aria-label` (que tapa
8170
- // cualquier `sr-only` hijo): con novedades lleva primero la acción y luego el aviso,
8171
- // para que el lector no anuncie solo «hay novedades» y pierda «Nueva conversación».
8172
- const collapsedAriaLabel = hasAnyNews
8173
- ? `${newLabel}, ${collapsedNewsLabel}`
8174
- : newLabel;
8175
8239
  const handleToggleExpand = $8WNJc$react.useCallback(() => {
8176
8240
  setIsExpanded((prev) => !prev);
8177
8241
  }, []);
@@ -8189,9 +8253,9 @@ const MenuClawHistoryPanel = $8WNJc$react.memo(function MenuClawHistoryPanel({ i
8189
8253
  if (isCollapsed && !onNewConversation) {
8190
8254
  return null;
8191
8255
  }
8192
- return (jsxRuntime.jsxs("div", { className: "flex max-h-[40%] min-h-0 flex-col gap-2 pb-3", children: [onNewConversation ? (jsxRuntime.jsxs(Button, { title: newLabel, "aria-label": isCollapsed ? collapsedAriaLabel : undefined, isIconOnly: isCollapsed, fullWidth: !isCollapsed, onPress: () => onNewConversation(), className: cn("h-9 shrink-0 bg-foreground text-sm font-medium text-background", isCollapsed
8256
+ return (jsxRuntime.jsxs("div", { className: "flex max-h-[40%] min-h-0 flex-col gap-2 pb-3", children: [onNewConversation ? (jsxRuntime.jsxs(Button, { title: newLabel, "aria-label": isCollapsed ? newLabel : undefined, isIconOnly: isCollapsed, fullWidth: !isCollapsed, onPress: () => onNewConversation(), className: cn("h-9 shrink-0 bg-foreground text-sm font-medium text-background", isCollapsed
8193
8257
  ? "w-9 min-w-9 self-center"
8194
- : "justify-start gap-3 px-2"), children: [jsxRuntime.jsxs("span", { className: "relative flex h-5 w-5 shrink-0 items-center justify-center", children: [jsxRuntime.jsx(IconComponent, { icon: "solar:pen-new-square-linear", size: "md", "aria-hidden": true }), isCollapsed && hasAnyNews ? (jsxRuntime.jsx("span", { "data-history-news-aggregate": "", "aria-hidden": "true", className: "absolute -right-1 -top-1 h-2.5 w-2.5 rounded-full bg-primary ring-2 ring-background" })) : null] }), !isCollapsed ? (jsxRuntime.jsx("span", { className: "menu-claw-collapsible truncate", children: newLabel })) : null] })) : null, !isCollapsed && items.length > 0 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("p", { className: "shrink-0 px-2 pb-1 pt-2 text-xs font-medium uppercase tracking-wide text-default-400", children: title }), jsxRuntime.jsx("ul", { "aria-label": title, className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: visibleItems.map((item) => (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("button", { type: "button", disabled: item.disabled, "aria-disabled": item.disabled, title: item.title, onClick: () => handleItemPress(item), className: cn("flex min-h-9 w-full items-center gap-3 rounded-lg px-2 py-1.5 text-left text-sm text-default-600 transition-colors", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", item.disabled
8258
+ : "justify-start gap-3 px-2"), children: [jsxRuntime.jsxs("span", { className: "relative flex h-5 w-5 shrink-0 items-center justify-center", children: [jsxRuntime.jsx(IconComponent, { icon: "solar:pen-new-square-linear", size: "md", "aria-hidden": true }), isCollapsed && hasAnyNews ? (jsxRuntime.jsx("span", { "data-history-news-aggregate": "", "aria-hidden": "true", className: "absolute -right-1 -top-1 h-2.5 w-2.5 rounded-full bg-primary ring-2 ring-background" })) : null] }), isCollapsed && hasAnyNews ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: "sr-only", children: newLabel }), jsxRuntime.jsx("span", { className: "sr-only", children: collapsedNewsLabel })] })) : null, !isCollapsed ? (jsxRuntime.jsx("span", { className: "menu-claw-collapsible truncate", children: newLabel })) : null] })) : null, !isCollapsed && items.length > 0 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("p", { className: "shrink-0 px-2 pb-1 pt-2 text-xs font-medium uppercase tracking-wide text-default-400", children: title }), jsxRuntime.jsx("ul", { "aria-label": title, className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: visibleItems.map((item) => (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("button", { type: "button", disabled: item.disabled, "aria-disabled": item.disabled, title: item.title, onClick: () => handleItemPress(item), className: cn("flex min-h-9 w-full items-center gap-3 rounded-lg px-2 py-1.5 text-left text-sm text-default-600 transition-colors", "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", item.disabled
8195
8259
  ? "cursor-not-allowed opacity-50"
8196
8260
  : "hover:bg-default-100"), children: [jsxRuntime.jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center text-default-400", children: jsxRuntime.jsx(IconComponent, { icon: "solar:chat-round-dots-linear", size: "md", "aria-hidden": true }) }), jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-1 flex-col", children: [jsxRuntime.jsx("span", { className: "truncate", children: item.title }), item.meta ? (jsxRuntime.jsx("span", { className: "truncate text-xs text-default-400", children: item.meta })) : null] }), item.hasNews === true ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { "data-history-news-dot": "", "aria-hidden": "true", className: "h-2 w-2 shrink-0 rounded-full bg-primary" }), jsxRuntime.jsx("span", { className: "sr-only", children: newsLabel })] })) : null] }) }, item.id))) }), hasHiddenItems ? (jsxRuntime.jsxs("button", { type: "button", onClick: handleToggleExpand, "aria-expanded": isExpanded, className: "flex w-full shrink-0 items-center gap-1.5 rounded-lg px-2 py-2 text-xs font-medium text-default-500 transition-colors hover:bg-default-100 hover:text-default-700 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", children: [jsxRuntime.jsx(IconComponent, { icon: isExpanded
8197
8261
  ? "solar:alt-arrow-up-linear"
@@ -13854,7 +13918,7 @@ size, width = "100%", height = "auto", multiple = false, maxFiles = 1, maxFileSi
13854
13918
  ? "opacity-0"
13855
13919
  : "opacity-100 transition-opacity", children: jsxRuntime.jsxs("div", { className: `flex flex-col items-center ${size === "micro" ? "gap-0" : size === "small" ? "gap-0.5" : "gap-1"}`, children: [jsxRuntime.jsx(IconComponent, { icon: icon, size: size === "micro" ? "sm" : size === "small" ? "md" : "lg", className: `${size === "micro" ? "text-sm"
13856
13920
  : size === "small" ? "text-base sm:text-lg"
13857
- : "text-xl sm:text-2xl"} ${disabled ? "text-default-400" : iconColor || "text-primary"}` }), shouldShowText && (jsxRuntime.jsxs("div", { className: `text-center ${size === "micro" ? "px-0"
13921
+ : "text-xl sm:text-2xl"} ${disabled ? "text-default-400" : iconColor || "text-accent-soft-foreground"}` }), shouldShowText && (jsxRuntime.jsxs("div", { className: `text-center ${size === "micro" ? "px-0"
13858
13922
  : size === "small" ? "px-0.5"
13859
13923
  : "px-1"} ${size === "micro" || size === "small"
13860
13924
  ? "upload-file-dropzone-text"
@@ -14529,7 +14593,7 @@ const NavigationLoadingOverlay = ({ isVisible, }) => {
14529
14593
  */
14530
14594
  const DrawerFiltersFooter = ({ onClearFilters, onCancel, onApplyFilters, translations = {}, }) => {
14531
14595
  const { clearFilters = "Limpiar filtro", cancel = "Cancelar", applyFilters = "Aplicar filtro", } = translations;
14532
- return (jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-10 bg-content1", children: [jsxRuntime.jsx(Button, { variant: "light", color: "primary", onPress: onClearFilters, className: "text-primary", children: clearFilters }), jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [jsxRuntime.jsx(Button, { variant: "bordered", color: "primary", onPress: onCancel, children: cancel }), jsxRuntime.jsx(Button, { variant: "solid", color: "primary", onPress: onApplyFilters, children: applyFilters })] })] }));
14596
+ return (jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-10 bg-content1", children: [jsxRuntime.jsx(Button, { variant: "light", color: "primary", onPress: onClearFilters, className: "text-accent-soft-foreground", children: clearFilters }), jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [jsxRuntime.jsx(Button, { variant: "bordered", color: "primary", onPress: onCancel, children: cancel }), jsxRuntime.jsx(Button, { variant: "solid", color: "primary", onPress: onApplyFilters, children: applyFilters })] })] }));
14533
14597
  };
14534
14598
 
14535
14599
  /**
@@ -15074,7 +15138,7 @@ const MultiSelectFilter = ({ filter, value, onChange, translations, titleId }) =
15074
15138
  classNames: {
15075
15139
  inputWrapper: "bg-default-100 shadow-none border-0 min-h-9 h-9",
15076
15140
  input: "text-sm",
15077
- }, endContent: jsxRuntime.jsx(IconComponent, { icon: "solar:magnifer-outline", className: "pointer-events-none shrink-0 text-default-400", size: "sm", "aria-hidden": true }), "aria-label": searchPlaceholder }) })), jsxRuntime.jsx("div", { className: "max-h-60 overflow-y-auto px-1 py-1", children: filteredData.length === 0 ? (jsxRuntime.jsx("p", { className: "px-2 py-3 text-center text-xs text-default-400", children: noResultsText })) : (jsxRuntime.jsx(react.ListBox, { "aria-label": filter.title, selectionMode: "multiple", selectionBehavior: "toggle", selectedKeys: selectedKeys, onSelectionChange: handleListboxSelectionChange, disallowEmptySelection: false, className: "w-full gap-0.5 p-0", children: filteredData.map((item) => (jsxRuntime.jsx(react.ListBoxItem, { id: item.value, textValue: item.label, className: "rounded-[12px] px-2 py-2.5 text-sm font-normal text-default-600 data-[hovered=true]:bg-default-100 data-[selectable=true]:focus:bg-default-100 data-[selected=true]:bg-primary-50/80 data-[selected=true]:font-medium data-[selected=true]:text-primary", children: item.label }, item.value))) })) })] }) })] }));
15141
+ }, endContent: jsxRuntime.jsx(IconComponent, { icon: "solar:magnifer-outline", className: "pointer-events-none shrink-0 text-default-400", size: "sm", "aria-hidden": true }), "aria-label": searchPlaceholder }) })), jsxRuntime.jsx("div", { className: "max-h-60 overflow-y-auto px-1 py-1", children: filteredData.length === 0 ? (jsxRuntime.jsx("p", { className: "px-2 py-3 text-center text-xs text-default-400", children: noResultsText })) : (jsxRuntime.jsx(react.ListBox, { "aria-label": filter.title, selectionMode: "multiple", selectionBehavior: "toggle", selectedKeys: selectedKeys, onSelectionChange: handleListboxSelectionChange, disallowEmptySelection: false, className: "w-full gap-0.5 p-0", children: filteredData.map((item) => (jsxRuntime.jsx(react.ListBoxItem, { id: item.value, textValue: item.label, className: "rounded-[12px] px-2 py-2.5 text-sm font-normal text-default-600 data-[hovered=true]:bg-default-100 data-[selectable=true]:focus:bg-default-100 data-[selected=true]:bg-primary-50/80 data-[selected=true]:font-medium data-[selected=true]:text-accent-soft-foreground", children: item.label }, item.value))) })) })] }) })] }));
15078
15142
  };
15079
15143
  // =========================================================================
15080
15144
  // RANGE FILTER
@@ -17778,7 +17842,7 @@ const RADIUS_CLASS = {
17778
17842
  */
17779
17843
  const FLAT_BASE = {
17780
17844
  default: "bg-default-100 text-default-foreground dark:bg-default-50/50",
17781
- primary: "bg-primary-50 text-primary-600 dark:bg-primary-50/50",
17845
+ primary: "bg-primary-50 text-accent-soft-foreground dark:bg-primary-50/50",
17782
17846
  secondary: "bg-secondary-50 text-secondary-600 dark:bg-secondary-50/50",
17783
17847
  success: "bg-success-50 text-success-700 dark:bg-success-50/50 dark:text-success",
17784
17848
  warning: "bg-warning-50 text-warning-700 dark:bg-warning-50/50 dark:text-warning",
@@ -17796,7 +17860,7 @@ const FADED_BORDER = {
17796
17860
  /** `bordered`: `colorVariants.bordered.<color>` (+ `border-small`, sin fondo). */
17797
17861
  const BORDERED_BASE = {
17798
17862
  default: "bg-transparent border-default text-foreground",
17799
- primary: "bg-transparent border-primary text-primary",
17863
+ primary: "bg-transparent border-primary text-accent-soft-foreground",
17800
17864
  secondary: "bg-transparent border-secondary text-secondary",
17801
17865
  success: "bg-transparent border-success text-success",
17802
17866
  warning: "bg-transparent border-warning text-warning",
@@ -19132,6 +19196,7 @@ const THEME_COLOR_HEX_MAP = {
19132
19196
  blue: "#006fee",
19133
19197
  purple: "#7828c8",
19134
19198
  yellow: "#ffd505",
19199
+ amberYellow: "#ffbf00",
19135
19200
  green: "#16c964",
19136
19201
  coral: "#ff4f4f",
19137
19202
  skyBlue: "#60A5FA",
@@ -19155,6 +19220,15 @@ function colorDistance(a, b) {
19155
19220
  return (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2;
19156
19221
  }
19157
19222
  const THEME_COLORS = Object.keys(THEME_COLOR_HEX_MAP);
19223
+ /**
19224
+ * Packs que solo se resuelven por coincidencia exacta de su hex, nunca como «el más
19225
+ * cercano». `amberYellow` es una variante oscura de `yellow` pensada para una marca
19226
+ * concreta: si entrara en la búsqueda por cercanía, los hex de marca ámbar/oliva de
19227
+ * cualquier negocio cambiarían de pack (y con él su secundario y sus estados) sin
19228
+ * haberlo elegido nadie.
19229
+ */
19230
+ const EXACT_MATCH_ONLY = new Set(["amberYellow"]);
19231
+ const NEAREST_CANDIDATES = THEME_COLORS.filter((themeColor) => !EXACT_MATCH_ONLY.has(themeColor));
19158
19232
  function isHexColor(value) {
19159
19233
  return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(value);
19160
19234
  }
@@ -19171,7 +19245,7 @@ function hexToThemeColor(hex) {
19171
19245
  const targetRgb = hexToRgb$1(hex);
19172
19246
  let closest = "blue";
19173
19247
  let minDistance = Number.POSITIVE_INFINITY;
19174
- for (const themeColor of THEME_COLORS) {
19248
+ for (const themeColor of NEAREST_CANDIDATES) {
19175
19249
  const themeRgb = hexToRgb$1(THEME_COLOR_HEX_MAP[themeColor]);
19176
19250
  const dist = colorDistance(targetRgb, themeRgb);
19177
19251
  if (dist < minDistance) {
@@ -19229,7 +19303,7 @@ function hslToCssValue(h, s, l) {
19229
19303
  * Pasa un hex (`#rgb` o `#rrggbb`, en cualquier caja) a canales HSL.
19230
19304
  *
19231
19305
  * Se expone porque el hex es una de las dos formas en las que llega el `primary` del
19232
- * tema —los 14 packs lo emiten así en `theme-tokens.generated.css`— y `linda-tones.ts`
19306
+ * tema —los 16 packs lo emiten así en `theme-tokens.generated.css`— y `linda-tones.ts`
19233
19307
  * necesita esa misma conversión para derivar los tonos del aura. Antes de exportarla ya
19234
19308
  * había dos copias privadas de `hexToRgb` en esta carpeta; no hacía falta una tercera.
19235
19309
  */
@@ -19242,6 +19316,93 @@ function getContrastForeground(hex) {
19242
19316
  const luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;
19243
19317
  return luminance > 0.5 ? "0 0% 0%" : "0 0% 100%";
19244
19318
  }
19319
+ /** Contraste mínimo (WCAG) del texto de marca sobre el fondo suave de la propia marca. */
19320
+ const ACCENT_SOFT_FOREGROUND_MIN_CONTRAST = 3;
19321
+ /**
19322
+ * Opacidad del fondo tintado más oscuro sobre el que se pinta el token en modo claro: el
19323
+ * `flatBg` del Chip (accent al 20 % sobre blanco). El `--accent-soft` de HeroUI v3 en claro es
19324
+ * más claro (15 %), así que lo que llega aquí llega también en el Button soft.
19325
+ */
19326
+ const SOFT_TINT_ALPHA = 0.2;
19327
+ /**
19328
+ * Proporción de `--accent` en la mezcla que trae HeroUI v3 en modo claro para
19329
+ * `--accent-soft-foreground`: `color-mix(in oklab, var(--accent) 70%, var(--foreground) 30%)`
19330
+ * (bloque `:root, .light, .default` de `@heroui/styles/dist/themes/default/variables.css`).
19331
+ */
19332
+ const V3_LIGHT_ACCENT_SOFT_FOREGROUND_SHARE = 70;
19333
+ /** `--foreground` de HeroUI v3 en modo claro (`--eclipse`, oklch(0.2103 0.0059 285.89)). */
19334
+ const LIGHT_FOREGROUND_HEX = "#18181b";
19335
+ const toLinear = (c) => {
19336
+ const v = c / 255;
19337
+ return v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4;
19338
+ };
19339
+ const fromLinear = (c) => {
19340
+ const v = c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055;
19341
+ return Math.round(Math.min(Math.max(v, 0), 1) * 255);
19342
+ };
19343
+ function relativeLuminance([r, g, b]) {
19344
+ return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);
19345
+ }
19346
+ function contrastRatio(a, b) {
19347
+ const la = relativeLuminance(a);
19348
+ const lb = relativeLuminance(b);
19349
+ return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);
19350
+ }
19351
+ function rgbToOklab([r, g, b]) {
19352
+ const [lr, lg, lb] = [toLinear(r), toLinear(g), toLinear(b)];
19353
+ const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);
19354
+ const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);
19355
+ const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);
19356
+ return [
19357
+ 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,
19358
+ 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,
19359
+ 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,
19360
+ ];
19361
+ }
19362
+ function oklabToRgb([L, a, b]) {
19363
+ const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;
19364
+ const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;
19365
+ const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;
19366
+ return [
19367
+ fromLinear(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),
19368
+ fromLinear(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),
19369
+ fromLinear(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),
19370
+ ];
19371
+ }
19372
+ /** `color-mix(in oklab, accent share, foreground resto)` calculado en sRGB. */
19373
+ function mixOklab(accent, foreground, share) {
19374
+ const A = rgbToOklab(accent);
19375
+ const F = rgbToOklab(foreground);
19376
+ return oklabToRgb([0, 1, 2].map((i) => A[i] * share + F[i] * (1 - share)));
19377
+ }
19378
+ /**
19379
+ * Proporción de `--accent` (0–100) con la que `--accent-soft-foreground` alcanza
19380
+ * `minContrast` sobre su fondo tintado (el accent al 20 % sobre blanco), en modo claro.
19381
+ *
19382
+ * Devuelve `null` cuando la mezcla 70/30 que ya trae HeroUI v3 llega al mínimo: en esos
19383
+ * temas no se pisa nada. Si no llega, la primera proporción que sí lo hace, bajando de 1 en 1
19384
+ * (cuanto menos accent, más se acerca al color de texto). En el límite, 0: el propio
19385
+ * `--foreground`.
19386
+ */
19387
+ function getAccentSoftForegroundShare(accentHex, minContrast = ACCENT_SOFT_FOREGROUND_MIN_CONTRAST) {
19388
+ const accent = hexToRgb(accentHex);
19389
+ const foreground = hexToRgb(LIGHT_FOREGROUND_HEX);
19390
+ const tint = accent.map((c) => c * SOFT_TINT_ALPHA + 255 * (1 - SOFT_TINT_ALPHA));
19391
+ const reaches = (share) => contrastRatio(mixOklab(accent, foreground, share), tint) >= minContrast;
19392
+ if (reaches(V3_LIGHT_ACCENT_SOFT_FOREGROUND_SHARE / 100)) {
19393
+ return null;
19394
+ }
19395
+ for (let share = V3_LIGHT_ACCENT_SOFT_FOREGROUND_SHARE - 1; share > 0; share--) {
19396
+ if (reaches(share / 100)) {
19397
+ return share;
19398
+ }
19399
+ }
19400
+ return 0;
19401
+ }
19402
+ /** Valor CSS de `--accent-soft-foreground` para una proporción de accent dada. */
19403
+ function accentSoftForegroundMix(share) {
19404
+ return `color-mix(in oklab, var(--accent) ${share}%, var(--foreground))`;
19405
+ }
19245
19406
  const LIGHT_SHADE_LIGHTNESS = {
19246
19407
  "50": 95,
19247
19408
  "100": 90,
@@ -19290,6 +19451,8 @@ function generateThemeColorScale(hex, mode) {
19290
19451
  return { shades, foreground, defaultValue };
19291
19452
  }
19292
19453
 
19454
+ /** La mezcla que trae HeroUI v3 para `--accent-soft-foreground` en modo claro. */
19455
+ const V3_ACCENT_SOFT_FOREGROUND = "color-mix(in oklab, var(--accent) 70%, var(--foreground) 30%)";
19293
19456
  const PRIMARY_SHADES = [
19294
19457
  "50",
19295
19458
  "100",
@@ -19309,6 +19472,7 @@ const CUSTOM_PROPERTIES = [
19309
19472
  "--color-focus",
19310
19473
  "--accent",
19311
19474
  "--accent-foreground",
19475
+ "--accent-soft-foreground",
19312
19476
  ];
19313
19477
  /**
19314
19478
  * `generateThemeColorScale` devuelve canales HSL sueltos (`"212 100% 46.67%"`), que es lo que
@@ -19338,6 +19502,16 @@ function applyCustomPrimaryColor(hex, mode) {
19338
19502
  style.setProperty("--color-focus", primary);
19339
19503
  style.setProperty("--accent", primary);
19340
19504
  style.setProperty("--accent-foreground", primaryForeground);
19505
+ // Mismo cálculo que los packs (generate-theme-tokens.mjs). Se escribe SIEMPRE en línea,
19506
+ // también cuando basta la mezcla de v3: la clase del pack más cercano puede traer su propia
19507
+ // proporción, calculada para SU color, y aquí manda el de la marca.
19508
+ // En oscuro no se pisa: vale la mezcla propia del tema oscuro de v3.
19509
+ if (mode === "dark") {
19510
+ style.removeProperty("--accent-soft-foreground");
19511
+ return;
19512
+ }
19513
+ const share = getAccentSoftForegroundShare(hex);
19514
+ style.setProperty("--accent-soft-foreground", share === null ? V3_ACCENT_SOFT_FOREGROUND : accentSoftForegroundMix(share));
19341
19515
  }
19342
19516
  function removeCustomPrimaryColor() {
19343
19517
  const style = document.documentElement.style;
@@ -19843,6 +20017,7 @@ Object.defineProperty(exports, "loadIcons", {
19843
20017
  enumerable: true,
19844
20018
  get: function () { return react$1.loadIcons; }
19845
20019
  });
20020
+ exports.ACCENT_SOFT_FOREGROUND_MIN_CONTRAST = ACCENT_SOFT_FOREGROUND_MIN_CONTRAST;
19846
20021
  exports.ALL_THEMES = ALL_THEMES;
19847
20022
  exports.AURORA_THEME_FAMILIES = AURORA_THEME_FAMILIES;
19848
20023
  exports.AURORA_THEME_REGISTRY = AURORA_THEME_REGISTRY;
@@ -19959,12 +20134,14 @@ exports.ToastContext = ToastContext;
19959
20134
  exports.Tooltip = Tooltip;
19960
20135
  exports.TwoColumnLayoutAgent = TwoColumnLayoutAgent;
19961
20136
  exports.UploadFile = UploadFile;
20137
+ exports.V3_LIGHT_ACCENT_SOFT_FOREGROUND_SHARE = V3_LIGHT_ACCENT_SOFT_FOREGROUND_SHARE;
19962
20138
  exports.VerticalSteps = VerticalSteps;
19963
20139
  exports.ViolinPlot = ViolinPlot;
19964
20140
  exports.WhatsAppPreview = WhatsAppPreview;
19965
20141
  exports.Wizard = Wizard;
19966
20142
  exports.WizardNavigation = WizardNavigation;
19967
20143
  exports.WizardSidebar = WizardSidebar;
20144
+ exports.accentSoftForegroundMix = accentSoftForegroundMix;
19968
20145
  exports.applyCustomPrimaryColor = applyCustomPrimaryColor;
19969
20146
  exports.applyLindaTones = applyLindaTones;
19970
20147
  exports.cn = cn;
@@ -19983,6 +20160,7 @@ exports.forceLightOnlyThemeBeforeReact = forceLightOnlyThemeBeforeReact;
19983
20160
  exports.formatAuroraThemeTooltip = formatAuroraThemeTooltip;
19984
20161
  exports.formatDonutPercent = formatDonutPercent;
19985
20162
  exports.generateThemeColorScale = generateThemeColorScale;
20163
+ exports.getAccentSoftForegroundShare = getAccentSoftForegroundShare;
19986
20164
  exports.getContrastForeground = getContrastForeground;
19987
20165
  exports.getRegisteredThemeColorBases = getRegisteredThemeColorBases;
19988
20166
  exports.getSelectedKeyFromPath = getSelectedKeyFromPath;