@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.
- package/dist/assets/css/styles.css +1 -1
- package/dist/index.cjs.js +368 -9
- package/dist/index.esm.js +359 -10
- package/dist/types/components/input-password/InputPassword.d.ts +3 -0
- package/dist/types/components/input-password/InputPassword.d.ts.map +1 -0
- package/dist/types/components/input-password/InputPassword.types.d.ts +19 -0
- package/dist/types/components/input-password/InputPassword.types.d.ts.map +1 -0
- package/dist/types/components/input-password/index.d.ts +3 -0
- package/dist/types/components/input-password/index.d.ts.map +1 -0
- package/dist/types/components/menu/Menu.d.ts.map +1 -1
- package/dist/types/components/menu/Menu.types.d.ts +4 -0
- package/dist/types/components/menu/Menu.types.d.ts.map +1 -1
- package/dist/types/contexts/theme/theme-context.d.ts.map +1 -1
- package/dist/types/contexts/theme/theme-context.type.d.ts +2 -1
- package/dist/types/contexts/theme/theme-context.type.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/providers/theme/apply-custom-color.d.ts +4 -0
- package/dist/types/providers/theme/apply-custom-color.d.ts.map +1 -0
- package/dist/types/providers/theme/generate-color-scale.d.ts +10 -0
- package/dist/types/providers/theme/generate-color-scale.d.ts.map +1 -0
- package/dist/types/providers/theme/hex-to-theme-color.d.ts +6 -0
- package/dist/types/providers/theme/hex-to-theme-color.d.ts.map +1 -0
- package/dist/types/providers/theme/index.d.ts +3 -0
- package/dist/types/providers/theme/index.d.ts.map +1 -1
- package/dist/types/providers/theme/theme-provider.d.ts.map +1 -1
- package/dist/types/providers/theme/useThemeManager.d.ts +4 -2
- package/dist/types/providers/theme/useThemeManager.d.ts.map +1 -1
- 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.
|
|
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
|
-
*
|
|
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
|
|
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 =
|
|
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
|
-
|
|
5713
|
-
|
|
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;
|