@beweco/aurora-ui 0.1.59 → 0.1.61

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 +368 -9
  3. package/dist/index.esm.js +359 -10
  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.
@@ -2263,13 +2266,115 @@ var MenuComponent = React.memo(function Menu(_a) {
2263
2266
  (_a = menuItems.onSelect) === null || _a === void 0 ? void 0 : _a.call(menuItems, key, href, "bottomBar");
2264
2267
  }, [onOpenSidebarChange, menuItems.onSelect]);
2265
2268
  var showBottomBar = (mobileBottomBarGroupKey && bottomBarItems.length > 0) || showNativeMenu;
2269
+ // Drag-to-scroll: clic sostenido + arrastre en el área de scroll del menú
2270
+ var scrollContainerRef = React.useRef(null);
2271
+ var dragStateRef = React.useRef({ startY: 0, startScrollTop: 0, isDragging: false, prevClientY: 0 });
2272
+ var _h = React.useState(false), isDraggingScroll = _h[0], setIsDraggingScroll = _h[1];
2273
+ var handleScrollAreaMouseMove = React.useCallback(function (e) {
2274
+ var el = scrollContainerRef.current;
2275
+ if (!el)
2276
+ return;
2277
+ var state = dragStateRef.current;
2278
+ var dy = e.clientY - state.startY;
2279
+ if (!state.isDragging && Math.abs(dy) > 5) {
2280
+ state.isDragging = true;
2281
+ state.prevClientY = e.clientY;
2282
+ setIsDraggingScroll(true);
2283
+ }
2284
+ if (state.isDragging) {
2285
+ el.scrollTop += state.prevClientY - e.clientY;
2286
+ state.prevClientY = e.clientY;
2287
+ }
2288
+ }, []);
2289
+ var handleScrollAreaMouseUp = React.useCallback(function () {
2290
+ var wasDragging = dragStateRef.current.isDragging;
2291
+ document.removeEventListener("mousemove", handleScrollAreaMouseMove);
2292
+ document.removeEventListener("mouseup", handleScrollAreaMouseUp);
2293
+ dragStateRef.current.isDragging = false;
2294
+ setIsDraggingScroll(false);
2295
+ if (wasDragging) {
2296
+ var preventClick_1 = function (e) {
2297
+ e.preventDefault();
2298
+ e.stopPropagation();
2299
+ document.removeEventListener("click", preventClick_1, true);
2300
+ };
2301
+ document.addEventListener("click", preventClick_1, true);
2302
+ setTimeout(function () { return document.removeEventListener("click", preventClick_1, true); }, 50);
2303
+ }
2304
+ }, [handleScrollAreaMouseMove]);
2305
+ var handleScrollAreaMouseDown = React.useCallback(function (e) {
2306
+ if (e.button !== 0)
2307
+ return;
2308
+ var el = scrollContainerRef.current;
2309
+ if (!el)
2310
+ return;
2311
+ dragStateRef.current = {
2312
+ startY: e.clientY,
2313
+ startScrollTop: el.scrollTop,
2314
+ isDragging: false,
2315
+ prevClientY: e.clientY,
2316
+ };
2317
+ document.addEventListener("mousemove", handleScrollAreaMouseMove);
2318
+ document.addEventListener("mouseup", handleScrollAreaMouseUp);
2319
+ }, [handleScrollAreaMouseMove, handleScrollAreaMouseUp]);
2320
+ React.useEffect(function () {
2321
+ return function () {
2322
+ document.removeEventListener("mousemove", handleScrollAreaMouseMove);
2323
+ document.removeEventListener("mouseup", handleScrollAreaMouseUp);
2324
+ };
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;
2266
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
2267
2372
  ? "container__menu--collapsed"
2268
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: {
2269
2374
  flexDirection: isCollapsed ? "column-reverse" : "row",
2270
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
2271
2376
  ? "solar:alt-arrow-right-outline"
2272
- : "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 })) }) })] }) })] }));
2273
2378
  });
2274
2379
 
2275
2380
  var StepIndicator = function (_a) {
@@ -3858,7 +3963,7 @@ var ORB_SIZES = {
3858
3963
  xl: 192,
3859
3964
  };
3860
3965
 
3861
- var isHexColor = function (value) {
3966
+ var isHexColor$1 = function (value) {
3862
3967
  var normalized = value.startsWith("#") ? value.slice(1) : value;
3863
3968
  return /^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/.test(normalized);
3864
3969
  };
@@ -3876,7 +3981,7 @@ var hexToRgba = function (hexColor, alpha) {
3876
3981
  return "rgba(".concat(r, ", ").concat(g, ", ").concat(b, ", ").concat(alpha, ")");
3877
3982
  };
3878
3983
  var colorWithAlpha = function (color, alpha) {
3879
- if (isHexColor(color)) {
3984
+ if (isHexColor$1(color)) {
3880
3985
  var normalized = color.startsWith("#") ? color : "#".concat(color);
3881
3986
  return hexToRgba(normalized, alpha);
3882
3987
  }
@@ -5567,6 +5672,27 @@ var DrawerFilters = function (_a) {
5567
5672
  };
5568
5673
  DrawerFilters.displayName = "DrawerFilters";
5569
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
+
5570
5696
  var DEFAULT_TRANSLATIONS = {
5571
5697
  placeholder: "Nombre de la etiqueta",
5572
5698
  labelSelect: "Selecciona etiqueta",
@@ -5667,6 +5793,195 @@ var Card = function (_a) {
5667
5793
  return (jsxRuntime.jsx(react.Card, __assign({ shadow: shadow, radius: radius, className: combinedClassName }, props, { children: children })));
5668
5794
  };
5669
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
+
5670
5985
  /**
5671
5986
  * @file This file contains the theme configurations for the application.
5672
5987
  */
@@ -5674,10 +5989,12 @@ var ALL_THEMES = __spreadArray(["light", "dark"], Object.keys(themeColors), true
5674
5989
 
5675
5990
  /**
5676
5991
  * Custom hook to manage the theme state and side effects.
5677
- * @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.
5678
5994
  */
5679
5995
  var useThemeManager = function () {
5680
5996
  var _a = useTheme.useTheme(), rawTheme = _a.theme, setRawTheme = _a.setTheme;
5997
+ var _b = React.useState(null), customHex = _b[0], setCustomHex = _b[1];
5681
5998
  var setTheme = React.useCallback(function (theme) {
5682
5999
  var _a;
5683
6000
  var html = document.documentElement;
@@ -5690,7 +6007,7 @@ var useThemeManager = function () {
5690
6007
  (_a = html.classList).remove.apply(_a, ALL_THEMES);
5691
6008
  html.classList.add(rawTheme);
5692
6009
  }, [rawTheme]);
5693
- var _b = React.useMemo(function () {
6010
+ var _c = React.useMemo(function () {
5694
6011
  var parts = rawTheme.split("-");
5695
6012
  var parsedColor = "blue";
5696
6013
  var parsedMode = "light";
@@ -5703,18 +6020,49 @@ var useThemeManager = function () {
5703
6020
  parsedMode = rawTheme;
5704
6021
  }
5705
6022
  return { mode: parsedMode, color: parsedColor };
5706
- }, [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]);
5707
6032
  var setMode = React.useCallback(function (newMode) {
5708
6033
  var newTheme = color === "blue" ? newMode : "".concat(color, "-").concat(newMode);
5709
6034
  setTheme(newTheme);
5710
6035
  }, [color, setTheme]);
5711
6036
  var setColor = React.useCallback(function (newColor) {
5712
- var newTheme = newColor === "blue" ? mode : "".concat(newColor, "-").concat(mode);
5713
- 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
+ }
5714
6061
  }, [mode, setTheme]);
5715
6062
  return {
5716
6063
  mode: mode,
5717
6064
  color: color,
6065
+ customHex: customHex,
5718
6066
  setMode: setMode,
5719
6067
  setColor: setColor,
5720
6068
  };
@@ -5730,10 +6078,11 @@ var useThemeManager = function () {
5730
6078
  */
5731
6079
  var ThemeProvider = function (_a) {
5732
6080
  var children = _a.children;
5733
- 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;
5734
6082
  return (jsxRuntime.jsx(ThemeContext.Provider, { value: {
5735
6083
  mode: mode,
5736
6084
  color: color,
6085
+ customHex: customHex,
5737
6086
  setMode: setMode,
5738
6087
  setColor: setColor,
5739
6088
  }, children: children }));
@@ -5839,6 +6188,7 @@ exports.HeaderComponent = HeaderComponent;
5839
6188
  exports.IconComponent = IconComponent;
5840
6189
  exports.ImagePreview = ImagePreview;
5841
6190
  exports.Input = Input;
6191
+ exports.InputPassword = InputPassword;
5842
6192
  exports.Kanban = Kanban;
5843
6193
  exports.KanbanCard = KanbanCard;
5844
6194
  exports.KanbanColumn = KanbanColumn;
@@ -5866,6 +6216,7 @@ exports.SocialMediaCarousel = SocialMediaCarousel;
5866
6216
  exports.SocialMediaPreview = SocialMediaPreview;
5867
6217
  exports.StepIndicator = StepIndicator;
5868
6218
  exports.SwitchComponent = Switch;
6219
+ exports.THEME_COLOR_HEX_MAP = THEME_COLOR_HEX_MAP;
5869
6220
  exports.TagsFilter = TagsFilter;
5870
6221
  exports.Textarea = Textarea;
5871
6222
  exports.ThemeContext = ThemeContext;
@@ -5880,8 +6231,16 @@ exports.WhatsAppPreview = WhatsAppPreview;
5880
6231
  exports.Wizard = Wizard;
5881
6232
  exports.WizardNavigation = WizardNavigation;
5882
6233
  exports.WizardSidebar = WizardSidebar;
6234
+ exports.applyCustomPrimaryColor = applyCustomPrimaryColor;
5883
6235
  exports.defaultTranslations = defaultTranslations$4;
6236
+ exports.generateThemeColorScale = generateThemeColorScale;
6237
+ exports.getContrastForeground = getContrastForeground;
5884
6238
  exports.getSelectedKeyFromPath = getSelectedKeyFromPath;
6239
+ exports.hexToThemeColor = hexToThemeColor;
6240
+ exports.hslToCssValue = hslToCssValue;
6241
+ exports.isExactThemeColor = isExactThemeColor;
6242
+ exports.isHexColor = isHexColor;
6243
+ exports.removeCustomPrimaryColor = removeCustomPrimaryColor;
5885
6244
  exports.sizeMap = sizeMap;
5886
6245
  exports.themeColors = themeColors;
5887
6246
  exports.useAuraToast = useAuraToast;