@beweco/aurora-ui 0.1.60 → 0.1.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/assets/css/styles.css +1 -1
  2. package/dist/index.cjs.js +313 -11
  3. package/dist/index.esm.js +304 -12
  4. package/dist/types/components/input-password/InputPassword.d.ts +3 -0
  5. package/dist/types/components/input-password/InputPassword.d.ts.map +1 -0
  6. package/dist/types/components/input-password/InputPassword.types.d.ts +19 -0
  7. package/dist/types/components/input-password/InputPassword.types.d.ts.map +1 -0
  8. package/dist/types/components/input-password/index.d.ts +3 -0
  9. package/dist/types/components/input-password/index.d.ts.map +1 -0
  10. package/dist/types/components/menu/Menu.d.ts.map +1 -1
  11. package/dist/types/components/menu/Menu.types.d.ts +4 -0
  12. package/dist/types/components/menu/Menu.types.d.ts.map +1 -1
  13. package/dist/types/contexts/theme/theme-context.d.ts.map +1 -1
  14. package/dist/types/contexts/theme/theme-context.type.d.ts +2 -1
  15. package/dist/types/contexts/theme/theme-context.type.d.ts.map +1 -1
  16. package/dist/types/index.d.ts +2 -0
  17. package/dist/types/index.d.ts.map +1 -1
  18. package/dist/types/providers/theme/apply-custom-color.d.ts +4 -0
  19. package/dist/types/providers/theme/apply-custom-color.d.ts.map +1 -0
  20. package/dist/types/providers/theme/generate-color-scale.d.ts +10 -0
  21. package/dist/types/providers/theme/generate-color-scale.d.ts.map +1 -0
  22. package/dist/types/providers/theme/hex-to-theme-color.d.ts +6 -0
  23. package/dist/types/providers/theme/hex-to-theme-color.d.ts.map +1 -0
  24. package/dist/types/providers/theme/index.d.ts +3 -0
  25. package/dist/types/providers/theme/index.d.ts.map +1 -1
  26. package/dist/types/providers/theme/theme-provider.d.ts.map +1 -1
  27. package/dist/types/providers/theme/useThemeManager.d.ts +4 -2
  28. package/dist/types/providers/theme/useThemeManager.d.ts.map +1 -1
  29. package/package.json +1 -1
package/dist/index.cjs.js CHANGED
@@ -785,6 +785,7 @@ ColorPicker.displayName = "ColorPicker";
785
785
  var ThemeContext = React.createContext({
786
786
  mode: "light",
787
787
  color: "blue",
788
+ customHex: null,
788
789
  // biome-ignore lint/suspicious/noEmptyBlockStatements: <explanation>
789
790
  setMode: function () { },
790
791
  // biome-ignore lint/suspicious/noEmptyBlockStatements: <explanation>
@@ -2190,6 +2191,8 @@ var DEFAULT_TRANSLATIONS$3 = {
2190
2191
  mobileNavAriaLabel: "Navegación móvil",
2191
2192
  logoAlt: "Logo de",
2192
2193
  notDefinedLabel: "no definido",
2194
+ scrollUpAriaLabel: "Subir menú",
2195
+ scrollDownAriaLabel: "Bajar menú",
2193
2196
  };
2194
2197
  /**
2195
2198
  * Sidebar menu component for navigation and user actions.
@@ -2266,7 +2269,7 @@ var MenuComponent = React.memo(function Menu(_a) {
2266
2269
  // Drag-to-scroll: clic sostenido + arrastre en el área de scroll del menú
2267
2270
  var scrollContainerRef = React.useRef(null);
2268
2271
  var dragStateRef = React.useRef({ startY: 0, startScrollTop: 0, isDragging: false, prevClientY: 0 });
2269
- var _h = React.useState(false); _h[0]; var setIsDraggingScroll = _h[1];
2272
+ var _h = React.useState(false), isDraggingScroll = _h[0], setIsDraggingScroll = _h[1];
2270
2273
  var handleScrollAreaMouseMove = React.useCallback(function (e) {
2271
2274
  var el = scrollContainerRef.current;
2272
2275
  if (!el)
@@ -2299,7 +2302,7 @@ var MenuComponent = React.memo(function Menu(_a) {
2299
2302
  setTimeout(function () { return document.removeEventListener("click", preventClick_1, true); }, 50);
2300
2303
  }
2301
2304
  }, [handleScrollAreaMouseMove]);
2302
- React.useCallback(function (e) {
2305
+ var handleScrollAreaMouseDown = React.useCallback(function (e) {
2303
2306
  if (e.button !== 0)
2304
2307
  return;
2305
2308
  var el = scrollContainerRef.current;
@@ -2320,13 +2323,58 @@ var MenuComponent = React.memo(function Menu(_a) {
2320
2323
  document.removeEventListener("mouseup", handleScrollAreaMouseUp);
2321
2324
  };
2322
2325
  }, [handleScrollAreaMouseMove, handleScrollAreaMouseUp]);
2326
+ // Indicadores de scroll: flechas arriba/abajo cuando el contenido requiere scroll
2327
+ var _j = React.useState({
2328
+ canScrollUp: false,
2329
+ canScrollDown: false,
2330
+ }), scrollState = _j[0], setScrollState = _j[1];
2331
+ var SCROLL_STEP_PX = 120;
2332
+ var updateScrollIndicators = React.useCallback(function () {
2333
+ var el = scrollContainerRef.current;
2334
+ if (!el)
2335
+ return;
2336
+ var scrollTop = el.scrollTop, scrollHeight = el.scrollHeight, clientHeight = el.clientHeight;
2337
+ var canScrollUp = scrollTop > 2;
2338
+ var canScrollDown = scrollTop < scrollHeight - clientHeight - 2;
2339
+ setScrollState(function (prev) {
2340
+ return prev.canScrollUp !== canScrollUp || prev.canScrollDown !== canScrollDown
2341
+ ? { canScrollUp: canScrollUp, canScrollDown: canScrollDown }
2342
+ : prev;
2343
+ });
2344
+ }, []);
2345
+ React.useEffect(function () {
2346
+ var el = scrollContainerRef.current;
2347
+ if (!el)
2348
+ return;
2349
+ updateScrollIndicators();
2350
+ var ro = new ResizeObserver(updateScrollIndicators);
2351
+ ro.observe(el);
2352
+ el.addEventListener("scroll", updateScrollIndicators);
2353
+ return function () {
2354
+ ro.disconnect();
2355
+ el.removeEventListener("scroll", updateScrollIndicators);
2356
+ };
2357
+ }, [updateScrollIndicators, menuItems.items, isCollapsed]);
2358
+ var handleScrollUp = React.useCallback(function () {
2359
+ var el = scrollContainerRef.current;
2360
+ if (!el)
2361
+ return;
2362
+ el.scrollBy({ top: -SCROLL_STEP_PX, behavior: "smooth" });
2363
+ }, []);
2364
+ var handleScrollDown = React.useCallback(function () {
2365
+ var el = scrollContainerRef.current;
2366
+ if (!el)
2367
+ return;
2368
+ el.scrollBy({ top: SCROLL_STEP_PX, behavior: "smooth" });
2369
+ }, []);
2370
+ var showScrollArrows = scrollState.canScrollUp || scrollState.canScrollDown;
2323
2371
  return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [showBottomBar && (jsxRuntime.jsx(MenuMobileBottomBar, { items: bottomBarItems, selectedKey: selectedKey, onSelect: handleBottomBarSelect, onMenuPress: handleSidebarOpen, menuLabel: t.menuLabel, navAriaLabel: t.mobileNavAriaLabel, forceVisible: showNativeMenu && bottomBarItems.length === 0 })), jsxRuntime.jsx("button", { type: "button", "aria-label": t.closeSidebarAriaLabel, className: "menu-overlay ".concat(isOpenSidebar ? "menu-overlay--open" : ""), onClick: handleSidebarClose, tabIndex: isOpenSidebar ? 0 : -1 }), jsxRuntime.jsx("div", { className: "container__menu ".concat(isCollapsed
2324
2372
  ? "container__menu--collapsed"
2325
2373
  : "container__menu--expanded", " ").concat(isOpenSidebar ? "container__menu--mobile-open" : ""), "aria-hidden": !isOpenSidebar, children: jsxRuntime.jsxs("div", { className: "content__menu", children: [jsxRuntime.jsxs("div", { className: "content__menu--header", style: {
2326
2374
  flexDirection: isCollapsed ? "column-reverse" : "row",
2327
2375
  }, children: [jsxRuntime.jsxs("div", { className: "flex flex-row items-center justify-center ".concat(isCollapsed ? "gap-0" : "gap-2"), children: [jsxRuntime.jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full bg-foreground text-background", children: hasValidLogo ? (jsxRuntime.jsx("img", { src: commerceInfo.logo, alt: "".concat(t.logoAlt, " ").concat(commerceName), className: "h-full w-full object-cover", onError: function () { return setLogoError(true); } })) : (jsxRuntime.jsx(IconComponent, { icon: "solar:buildings-2-outline", size: "sm", className: "shrink-0", "aria-hidden": true })) }), jsxRuntime.jsx("span", { className: "collapsible-item text-small font-bold truncate min-w-0", children: commerceName })] }), jsxRuntime.jsxs("div", { className: "flex items-center", children: [jsxRuntime.jsx(IconComponent, { icon: "material-symbols-light:close", size: "lg", className: "cursor-pointer block sm:hidden", onClick: handleSidebarClose }), jsxRuntime.jsx(IconComponent, { icon: isCollapsed
2328
2376
  ? "solar:alt-arrow-right-outline"
2329
- : "solar:alt-arrow-left-outline", size: "lg", className: "hidden sm:block cursor-pointer", onClick: handleCollapseToggle })] })] }), jsxRuntime.jsx(react.Spacer, { y: 6 }), jsxRuntime.jsxs("div", { className: "content__menu--user ".concat(isCollapsed ? "gap-0" : "gap-3"), children: [jsxRuntime.jsx(react.Avatar, { size: "md", src: ((_b = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _b === void 0 ? void 0 : _b.trim()) || undefined, color: !((_c = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _c === void 0 ? void 0 : _c.trim()) ? "warning" : "default", name: userName, className: "shrink-0" }), jsxRuntime.jsxs("div", { className: "collapsible-item flex min-w-0 flex-col overflow-hidden", children: [jsxRuntime.jsx("p", { className: "text-small font-medium text-default-900 truncate", children: userName }), jsxRuntime.jsx("p", { className: "text-tiny text-default-400 truncate", children: userRole })] })] }), jsxRuntime.jsx("div", { className: "".concat(!isCollapsed ? "flex-1" : "h-full", " min-h-0 py-6"), children: jsxRuntime.jsx("div", { className: "h-full overflow-y-auto pr-6 -mr-6 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", children: jsxRuntime.jsx(MenuNavList, { defaultSelectedKey: selectedKey, items: menuItems.items, isCollapsed: isCollapsed, onSelect: handleMenuSelect }, selectedKey) }) }), jsxRuntime.jsx("div", { className: "mt-auto flex flex-col justify-center items-center", children: jsxRuntime.jsx(react.Button, { fullWidth: true, className: " text-default-500 data-[hover=true]:text-default-600", startContent: jsxRuntime.jsx(IconComponent, { className: "text-default-500", icon: "solar:info-circle-line-duotone", size: "md" }), variant: "light", onPress: handleHelpClick, isIconOnly: isCollapsed, children: !isCollapsed && (jsxRuntime.jsx("span", { className: "collapsible-item truncate", children: helpTitle })) }) })] }) })] }));
2377
+ : "solar:alt-arrow-left-outline", size: "lg", className: "hidden sm:block cursor-pointer", onClick: handleCollapseToggle })] })] }), jsxRuntime.jsx(react.Spacer, { y: 6 }), jsxRuntime.jsxs("div", { className: "content__menu--user ".concat(isCollapsed ? "gap-0" : "gap-3"), children: [jsxRuntime.jsx(react.Avatar, { size: "md", src: ((_b = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _b === void 0 ? void 0 : _b.trim()) || undefined, color: !((_c = userInfo === null || userInfo === void 0 ? void 0 : userInfo.avatar) === null || _c === void 0 ? void 0 : _c.trim()) ? "warning" : "default", name: userName, className: "shrink-0" }), jsxRuntime.jsxs("div", { className: "collapsible-item flex min-w-0 flex-col overflow-hidden", children: [jsxRuntime.jsx("p", { className: "text-small font-medium text-default-900 truncate", children: userName }), jsxRuntime.jsx("p", { className: "text-tiny text-default-400 truncate", children: userRole })] })] }), jsxRuntime.jsxs("div", { className: "".concat(!isCollapsed ? "flex-1" : "h-full", " min-h-0 py-6 relative"), children: [!isCollapsed && showScrollArrows && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [scrollState.canScrollUp && (jsxRuntime.jsx("button", { type: "button", "aria-label": t.scrollUpAriaLabel, className: "menu-scroll-arrow menu-scroll-arrow--up", onClick: handleScrollUp, children: jsxRuntime.jsx(IconComponent, { icon: "solar:alt-arrow-up-outline", size: "lg", "aria-hidden": true }) })), scrollState.canScrollDown && (jsxRuntime.jsx("button", { type: "button", "aria-label": t.scrollDownAriaLabel, className: "menu-scroll-arrow menu-scroll-arrow--down", onClick: handleScrollDown, children: jsxRuntime.jsx(IconComponent, { icon: "solar:alt-arrow-down-outline", size: "lg", "aria-hidden": true }) }))] })), jsxRuntime.jsx("div", { ref: scrollContainerRef, className: "h-full overflow-y-auto pr-6 -mr-6 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none] select-none ".concat(isDraggingScroll ? "cursor-grabbing" : ""), onMouseDown: handleScrollAreaMouseDown, children: jsxRuntime.jsx(MenuNavList, { defaultSelectedKey: selectedKey, items: menuItems.items, isCollapsed: isCollapsed, onSelect: handleMenuSelect }, selectedKey) })] }), jsxRuntime.jsx("div", { className: "mt-auto flex flex-col justify-center items-center", children: jsxRuntime.jsx(react.Button, { fullWidth: true, className: " text-default-500 data-[hover=true]:text-default-600", startContent: jsxRuntime.jsx(IconComponent, { className: "text-default-500", icon: "solar:info-circle-line-duotone", size: "md" }), variant: "light", onPress: handleHelpClick, isIconOnly: isCollapsed, children: !isCollapsed && (jsxRuntime.jsx("span", { className: "collapsible-item truncate", children: helpTitle })) }) })] }) })] }));
2330
2378
  });
2331
2379
 
2332
2380
  var StepIndicator = function (_a) {
@@ -3915,7 +3963,7 @@ var ORB_SIZES = {
3915
3963
  xl: 192,
3916
3964
  };
3917
3965
 
3918
- var isHexColor = function (value) {
3966
+ var isHexColor$1 = function (value) {
3919
3967
  var normalized = value.startsWith("#") ? value.slice(1) : value;
3920
3968
  return /^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/.test(normalized);
3921
3969
  };
@@ -3933,7 +3981,7 @@ var hexToRgba = function (hexColor, alpha) {
3933
3981
  return "rgba(".concat(r, ", ").concat(g, ", ").concat(b, ", ").concat(alpha, ")");
3934
3982
  };
3935
3983
  var colorWithAlpha = function (color, alpha) {
3936
- if (isHexColor(color)) {
3984
+ if (isHexColor$1(color)) {
3937
3985
  var normalized = color.startsWith("#") ? color : "#".concat(color);
3938
3986
  return hexToRgba(normalized, alpha);
3939
3987
  }
@@ -5624,6 +5672,27 @@ var DrawerFilters = function (_a) {
5624
5672
  };
5625
5673
  DrawerFilters.displayName = "DrawerFilters";
5626
5674
 
5675
+ var InputPassword = function (_a) {
5676
+ var _b, _c;
5677
+ var translations = _a.translations, _d = _a.showCriteria, showCriteria = _d === void 0 ? false : _d, criteria = _a.criteria, _e = _a.isPristine, isPristine = _e === void 0 ? true : _e, renderCriterionLabel = _a.renderCriterionLabel, _f = _a.criteriaId, criteriaId = _f === void 0 ? "password-criteria" : _f, inputProps = __rest(_a, ["translations", "showCriteria", "criteria", "isPristine", "renderCriterionLabel", "criteriaId"]);
5678
+ var _g = React.useState(false), showPassword = _g[0], setShowPassword = _g[1];
5679
+ var togglePasswordVisibility = function () {
5680
+ setShowPassword(function (prev) { return !prev; });
5681
+ };
5682
+ var showLabel = (_b = translations === null || translations === void 0 ? void 0 : translations.showPassword) !== null && _b !== void 0 ? _b : "Show password";
5683
+ var hideLabel = (_c = translations === null || translations === void 0 ? void 0 : translations.hidePassword) !== null && _c !== void 0 ? _c : "Hide password";
5684
+ return (jsxRuntime.jsxs("div", { className: "flex flex-col w-full", children: [jsxRuntime.jsx(Input, __assign({}, inputProps, { type: showPassword ? "text" : "password", "aria-describedby": showCriteria ? criteriaId : inputProps["aria-describedby"], endContent: jsxRuntime.jsx("button", { type: "button", tabIndex: -1, onClick: togglePasswordVisibility, className: "focus:outline-none", "aria-label": showPassword ? hideLabel : showLabel, children: showPassword ? (jsxRuntime.jsx(IconComponent, { icon: "lucide:eye-off", color: "gray" })) : (jsxRuntime.jsx(IconComponent, { icon: "lucide:eye", color: "gray" })) }) })), showCriteria && criteria && criteria.length > 0 && (jsxRuntime.jsx("fieldset", { id: criteriaId, className: "mt-2", children: jsxRuntime.jsx("ul", { className: "flex flex-col gap-2 list-none", children: criteria.map(function (criterion, idx) {
5685
+ var colorClass = criterion.passed
5686
+ ? "text-success"
5687
+ : isPristine
5688
+ ? "text-default-500"
5689
+ : "text-danger-500";
5690
+ return (jsxRuntime.jsxs("li", { className: "flex items-center gap-2 text-tiny w-full text-left ".concat(colorClass), "aria-label": "".concat(criterion.label, ": ").concat(criterion.passed ? "met" : "not met"), children: [criterion.passed ? (jsxRuntime.jsx(IconComponent, { icon: "ic:round-check", className: "text-success", "aria-hidden": "true" })) : (jsxRuntime.jsx(IconComponent, { icon: "solar:close-circle-linear", className: colorClass, "aria-hidden": "true" })), renderCriterionLabel
5691
+ ? renderCriterionLabel(criterion.label)
5692
+ : criterion.label] }, "".concat(criteriaId, "-").concat(idx)));
5693
+ }) }) }))] }));
5694
+ };
5695
+
5627
5696
  var DEFAULT_TRANSLATIONS = {
5628
5697
  placeholder: "Nombre de la etiqueta",
5629
5698
  labelSelect: "Selecciona etiqueta",
@@ -5724,6 +5793,195 @@ var Card = function (_a) {
5724
5793
  return (jsxRuntime.jsx(react.Card, __assign({ shadow: shadow, radius: radius, className: combinedClassName }, props, { children: children })));
5725
5794
  };
5726
5795
 
5796
+ var THEME_COLOR_HEX_MAP = {
5797
+ blue: "#006fee",
5798
+ purple: "#7828c8",
5799
+ yellow: "#ffd505",
5800
+ green: "#16c964",
5801
+ coral: "#ff4f4f",
5802
+ };
5803
+ function hexToRgb$1(hex) {
5804
+ var clean = hex.replace("#", "");
5805
+ var normalized = clean.length === 3
5806
+ ? clean
5807
+ .split("")
5808
+ .map(function (c) { return c + c; })
5809
+ .join("")
5810
+ : clean;
5811
+ return [
5812
+ Number.parseInt(normalized.slice(0, 2), 16),
5813
+ Number.parseInt(normalized.slice(2, 4), 16),
5814
+ Number.parseInt(normalized.slice(4, 6), 16),
5815
+ ];
5816
+ }
5817
+ function colorDistance(a, b) {
5818
+ return Math.pow((a[0] - b[0]), 2) + Math.pow((a[1] - b[1]), 2) + Math.pow((a[2] - b[2]), 2);
5819
+ }
5820
+ var THEME_COLORS = Object.keys(THEME_COLOR_HEX_MAP);
5821
+ function isHexColor(value) {
5822
+ return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(value);
5823
+ }
5824
+ function isExactThemeColor(hex) {
5825
+ var normalized = hex.toLowerCase();
5826
+ for (var _i = 0, THEME_COLORS_1 = THEME_COLORS; _i < THEME_COLORS_1.length; _i++) {
5827
+ var themeColor = THEME_COLORS_1[_i];
5828
+ if (THEME_COLOR_HEX_MAP[themeColor].toLowerCase() === normalized) {
5829
+ return themeColor;
5830
+ }
5831
+ }
5832
+ return null;
5833
+ }
5834
+ function hexToThemeColor(hex) {
5835
+ var targetRgb = hexToRgb$1(hex);
5836
+ var closest = "blue";
5837
+ var minDistance = Number.POSITIVE_INFINITY;
5838
+ for (var _i = 0, THEME_COLORS_2 = THEME_COLORS; _i < THEME_COLORS_2.length; _i++) {
5839
+ var themeColor = THEME_COLORS_2[_i];
5840
+ var themeRgb = hexToRgb$1(THEME_COLOR_HEX_MAP[themeColor]);
5841
+ var dist = colorDistance(targetRgb, themeRgb);
5842
+ if (dist < minDistance) {
5843
+ minDistance = dist;
5844
+ closest = themeColor;
5845
+ }
5846
+ }
5847
+ return closest;
5848
+ }
5849
+
5850
+ function hexToRgb(hex) {
5851
+ var clean = hex.replace("#", "");
5852
+ var normalized = clean.length === 3
5853
+ ? clean
5854
+ .split("")
5855
+ .map(function (c) { return c + c; })
5856
+ .join("")
5857
+ : clean;
5858
+ return [
5859
+ Number.parseInt(normalized.slice(0, 2), 16),
5860
+ Number.parseInt(normalized.slice(2, 4), 16),
5861
+ Number.parseInt(normalized.slice(4, 6), 16),
5862
+ ];
5863
+ }
5864
+ function rgbToHsl(r, g, b) {
5865
+ r /= 255;
5866
+ g /= 255;
5867
+ b /= 255;
5868
+ var max = Math.max(r, g, b);
5869
+ var min = Math.min(r, g, b);
5870
+ var l = (max + min) / 2;
5871
+ var h = 0;
5872
+ var s = 0;
5873
+ if (max !== min) {
5874
+ var d = max - min;
5875
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
5876
+ switch (max) {
5877
+ case r:
5878
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
5879
+ break;
5880
+ case g:
5881
+ h = ((b - r) / d + 2) / 6;
5882
+ break;
5883
+ case b:
5884
+ h = ((r - g) / d + 4) / 6;
5885
+ break;
5886
+ }
5887
+ }
5888
+ return { h: h * 360, s: s * 100, l: l * 100 };
5889
+ }
5890
+ function hslToCssValue(h, s, l) {
5891
+ return "".concat(h, " ").concat(s, "% ").concat(l, "%");
5892
+ }
5893
+ function getContrastForeground(hex) {
5894
+ var _a = hexToRgb(hex), r = _a[0], g = _a[1], b = _a[2];
5895
+ var luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;
5896
+ return luminance > 0.5 ? "0 0% 0%" : "0 0% 100%";
5897
+ }
5898
+ var LIGHT_SHADE_LIGHTNESS = {
5899
+ "50": 95,
5900
+ "100": 90,
5901
+ "200": 82,
5902
+ "300": 72,
5903
+ "400": 60,
5904
+ };
5905
+ var DARK_SHADE_FACTORS = {
5906
+ "600": 0.83,
5907
+ "700": 0.67,
5908
+ "800": 0.50,
5909
+ "900": 0.33,
5910
+ };
5911
+ function generateLightScale(h, s, l) {
5912
+ var scale = {};
5913
+ for (var _i = 0, _a = Object.entries(LIGHT_SHADE_LIGHTNESS); _i < _a.length; _i++) {
5914
+ var _b = _a[_i], shade = _b[0], targetL = _b[1];
5915
+ var shadeL = l + (targetL - l) * ((targetL - l) / (95 - l));
5916
+ var clampedL = Math.min(Math.max(shadeL, 0), 100);
5917
+ var shadedS = Number(shade) <= 100 ? s * 0.92 : s;
5918
+ scale[shade] = hslToCssValue(h, Math.min(shadedS, 100), clampedL);
5919
+ }
5920
+ scale["500"] = hslToCssValue(h, s, l);
5921
+ for (var _c = 0, _d = Object.entries(DARK_SHADE_FACTORS); _c < _d.length; _c++) {
5922
+ var _e = _d[_c], shade = _e[0], factor = _e[1];
5923
+ var shadeL = l * factor;
5924
+ var shadedS = Number(shade) >= 800 ? s * 0.92 : s;
5925
+ scale[shade] = hslToCssValue(h, Math.min(shadedS, 100), Math.max(shadeL, 0));
5926
+ }
5927
+ return scale;
5928
+ }
5929
+ function reversScale(scale) {
5930
+ var shades = ["50", "100", "200", "300", "400", "500", "600", "700", "800", "900"];
5931
+ var values = shades.map(function (s) { return scale[s]; });
5932
+ var reversed = {};
5933
+ for (var i = 0; i < shades.length; i++) {
5934
+ reversed[shades[i]] = values[shades.length - 1 - i];
5935
+ }
5936
+ return reversed;
5937
+ }
5938
+ function generateThemeColorScale(hex, mode) {
5939
+ var _a = hexToRgb(hex), r = _a[0], g = _a[1], b = _a[2];
5940
+ var _b = rgbToHsl(r, g, b), h = _b.h, s = _b.s, l = _b.l;
5941
+ var lightScale = generateLightScale(h, s, l);
5942
+ var shades = mode === "dark" ? reversScale(lightScale) : lightScale;
5943
+ var foreground = getContrastForeground(hex);
5944
+ var defaultValue = hslToCssValue(h, s, l);
5945
+ return { shades: shades, foreground: foreground, defaultValue: defaultValue };
5946
+ }
5947
+
5948
+ var PRIMARY_SHADES = [
5949
+ "50",
5950
+ "100",
5951
+ "200",
5952
+ "300",
5953
+ "400",
5954
+ "500",
5955
+ "600",
5956
+ "700",
5957
+ "800",
5958
+ "900",
5959
+ ];
5960
+ var CUSTOM_PROPERTIES = __spreadArray(__spreadArray([
5961
+ "--heroui-primary"
5962
+ ], PRIMARY_SHADES.map(function (s) { return "--heroui-primary-".concat(s); }), true), [
5963
+ "--heroui-primary-foreground",
5964
+ "--heroui-focus",
5965
+ ], false);
5966
+ function applyCustomPrimaryColor(hex, mode) {
5967
+ var _a = generateThemeColorScale(hex, mode), shades = _a.shades, foreground = _a.foreground, defaultValue = _a.defaultValue;
5968
+ var style = document.documentElement.style;
5969
+ style.setProperty("--heroui-primary", defaultValue);
5970
+ for (var _i = 0, PRIMARY_SHADES_1 = PRIMARY_SHADES; _i < PRIMARY_SHADES_1.length; _i++) {
5971
+ var shade = PRIMARY_SHADES_1[_i];
5972
+ style.setProperty("--heroui-primary-".concat(shade), shades[shade]);
5973
+ }
5974
+ style.setProperty("--heroui-primary-foreground", foreground);
5975
+ style.setProperty("--heroui-focus", defaultValue);
5976
+ }
5977
+ function removeCustomPrimaryColor() {
5978
+ var style = document.documentElement.style;
5979
+ for (var _i = 0, CUSTOM_PROPERTIES_1 = CUSTOM_PROPERTIES; _i < CUSTOM_PROPERTIES_1.length; _i++) {
5980
+ var prop = CUSTOM_PROPERTIES_1[_i];
5981
+ style.removeProperty(prop);
5982
+ }
5983
+ }
5984
+
5727
5985
  /**
5728
5986
  * @file This file contains the theme configurations for the application.
5729
5987
  */
@@ -5731,10 +5989,12 @@ var ALL_THEMES = __spreadArray(["light", "dark"], Object.keys(themeColors), true
5731
5989
 
5732
5990
  /**
5733
5991
  * Custom hook to manage the theme state and side effects.
5734
- * @returns An object with the current mode, color, and functions to set them.
5992
+ * Supports both named ThemeColor values and arbitrary hex colors.
5993
+ * @returns An object with the current mode, color, customHex, and functions to set them.
5735
5994
  */
5736
5995
  var useThemeManager = function () {
5737
5996
  var _a = useTheme.useTheme(), rawTheme = _a.theme, setRawTheme = _a.setTheme;
5997
+ var _b = React.useState(null), customHex = _b[0], setCustomHex = _b[1];
5738
5998
  var setTheme = React.useCallback(function (theme) {
5739
5999
  var _a;
5740
6000
  var html = document.documentElement;
@@ -5747,7 +6007,7 @@ var useThemeManager = function () {
5747
6007
  (_a = html.classList).remove.apply(_a, ALL_THEMES);
5748
6008
  html.classList.add(rawTheme);
5749
6009
  }, [rawTheme]);
5750
- var _b = React.useMemo(function () {
6010
+ var _c = React.useMemo(function () {
5751
6011
  var parts = rawTheme.split("-");
5752
6012
  var parsedColor = "blue";
5753
6013
  var parsedMode = "light";
@@ -5760,18 +6020,49 @@ var useThemeManager = function () {
5760
6020
  parsedMode = rawTheme;
5761
6021
  }
5762
6022
  return { mode: parsedMode, color: parsedColor };
5763
- }, [rawTheme]), mode = _b.mode, color = _b.color;
6023
+ }, [rawTheme]), mode = _c.mode, color = _c.color;
6024
+ React.useEffect(function () {
6025
+ if (customHex) {
6026
+ applyCustomPrimaryColor(customHex, mode);
6027
+ }
6028
+ else {
6029
+ removeCustomPrimaryColor();
6030
+ }
6031
+ }, [customHex, mode]);
5764
6032
  var setMode = React.useCallback(function (newMode) {
5765
6033
  var newTheme = color === "blue" ? newMode : "".concat(color, "-").concat(newMode);
5766
6034
  setTheme(newTheme);
5767
6035
  }, [color, setTheme]);
5768
6036
  var setColor = React.useCallback(function (newColor) {
5769
- var newTheme = newColor === "blue" ? mode : "".concat(newColor, "-").concat(mode);
5770
- setTheme(newTheme);
6037
+ if (isHexColor(newColor)) {
6038
+ var exactMatch = isExactThemeColor(newColor);
6039
+ if (exactMatch) {
6040
+ setCustomHex(null);
6041
+ var newTheme = exactMatch === "blue" ? mode : "".concat(exactMatch, "-").concat(mode);
6042
+ setTheme(newTheme);
6043
+ }
6044
+ else {
6045
+ var closestColor = hexToThemeColor(newColor);
6046
+ setCustomHex(newColor);
6047
+ var newTheme = closestColor === "blue"
6048
+ ? mode
6049
+ : "".concat(closestColor, "-").concat(mode);
6050
+ setTheme(newTheme);
6051
+ }
6052
+ }
6053
+ else {
6054
+ setCustomHex(null);
6055
+ var resolvedColor = newColor;
6056
+ var newTheme = resolvedColor === "blue"
6057
+ ? mode
6058
+ : "".concat(resolvedColor, "-").concat(mode);
6059
+ setTheme(newTheme);
6060
+ }
5771
6061
  }, [mode, setTheme]);
5772
6062
  return {
5773
6063
  mode: mode,
5774
6064
  color: color,
6065
+ customHex: customHex,
5775
6066
  setMode: setMode,
5776
6067
  setColor: setColor,
5777
6068
  };
@@ -5787,10 +6078,11 @@ var useThemeManager = function () {
5787
6078
  */
5788
6079
  var ThemeProvider = function (_a) {
5789
6080
  var children = _a.children;
5790
- var _b = useThemeManager(), mode = _b.mode, color = _b.color, setMode = _b.setMode, setColor = _b.setColor;
6081
+ var _b = useThemeManager(), mode = _b.mode, color = _b.color, customHex = _b.customHex, setMode = _b.setMode, setColor = _b.setColor;
5791
6082
  return (jsxRuntime.jsx(ThemeContext.Provider, { value: {
5792
6083
  mode: mode,
5793
6084
  color: color,
6085
+ customHex: customHex,
5794
6086
  setMode: setMode,
5795
6087
  setColor: setColor,
5796
6088
  }, children: children }));
@@ -5896,6 +6188,7 @@ exports.HeaderComponent = HeaderComponent;
5896
6188
  exports.IconComponent = IconComponent;
5897
6189
  exports.ImagePreview = ImagePreview;
5898
6190
  exports.Input = Input;
6191
+ exports.InputPassword = InputPassword;
5899
6192
  exports.Kanban = Kanban;
5900
6193
  exports.KanbanCard = KanbanCard;
5901
6194
  exports.KanbanColumn = KanbanColumn;
@@ -5923,6 +6216,7 @@ exports.SocialMediaCarousel = SocialMediaCarousel;
5923
6216
  exports.SocialMediaPreview = SocialMediaPreview;
5924
6217
  exports.StepIndicator = StepIndicator;
5925
6218
  exports.SwitchComponent = Switch;
6219
+ exports.THEME_COLOR_HEX_MAP = THEME_COLOR_HEX_MAP;
5926
6220
  exports.TagsFilter = TagsFilter;
5927
6221
  exports.Textarea = Textarea;
5928
6222
  exports.ThemeContext = ThemeContext;
@@ -5937,8 +6231,16 @@ exports.WhatsAppPreview = WhatsAppPreview;
5937
6231
  exports.Wizard = Wizard;
5938
6232
  exports.WizardNavigation = WizardNavigation;
5939
6233
  exports.WizardSidebar = WizardSidebar;
6234
+ exports.applyCustomPrimaryColor = applyCustomPrimaryColor;
5940
6235
  exports.defaultTranslations = defaultTranslations$4;
6236
+ exports.generateThemeColorScale = generateThemeColorScale;
6237
+ exports.getContrastForeground = getContrastForeground;
5941
6238
  exports.getSelectedKeyFromPath = getSelectedKeyFromPath;
6239
+ exports.hexToThemeColor = hexToThemeColor;
6240
+ exports.hslToCssValue = hslToCssValue;
6241
+ exports.isExactThemeColor = isExactThemeColor;
6242
+ exports.isHexColor = isHexColor;
6243
+ exports.removeCustomPrimaryColor = removeCustomPrimaryColor;
5942
6244
  exports.sizeMap = sizeMap;
5943
6245
  exports.themeColors = themeColors;
5944
6246
  exports.useAuraToast = useAuraToast;