pixelize-design-library 2.4.2-beta.25 → 2.4.2-beta.27

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 (74) hide show
  1. package/dist/Components/Accordion/Accordion.js +3 -1
  2. package/dist/Components/Button/Button.js +2 -1
  3. package/dist/Components/Button/Button.styles.js +7 -7
  4. package/dist/Components/Card/PaymentCard/PaymentCard.js +7 -7
  5. package/dist/Components/Checkbox/Checkbox.styles.js +10 -7
  6. package/dist/Components/CopyButton/CopyButton.js +5 -1
  7. package/dist/Components/Dropdown/DropDown.js +4 -2
  8. package/dist/Components/EmptyState/EmptyState.js +2 -1
  9. package/dist/Components/FileUpload/FileUpload.js +2 -2
  10. package/dist/Components/FilterSidebar/filterHoverStyle.d.ts +0 -9
  11. package/dist/Components/FilterSidebar/filterHoverStyle.js +4 -10
  12. package/dist/Components/Header/components/mobileMenu.js +12 -3
  13. package/dist/Components/Loading/Loading.js +15 -14
  14. package/dist/Components/NoteTextArea/NoteTextArea.js +5 -2
  15. package/dist/Components/PdfViewer/PdfViewer.js +6 -1
  16. package/dist/Components/ProductCard/ProductReview.js +6 -1
  17. package/dist/Components/ProductCard/ProductTags.js +1 -1
  18. package/dist/Components/RadioButton/RadioButton.js +2 -1
  19. package/dist/Components/ScrollToTop/ScrollToTop.js +2 -0
  20. package/dist/Components/SearchSelect/SearchSelect.js +10 -6
  21. package/dist/Components/SegmentedControl/SegmentedControl.d.ts +2 -0
  22. package/dist/Components/SegmentedControl/SegmentedControl.js +58 -0
  23. package/dist/Components/SegmentedControl/SegmentedControlProps.d.ts +16 -0
  24. package/dist/Components/SegmentedControl/SegmentedControlProps.js +2 -0
  25. package/dist/Components/SelectSearch/SelectSearch.js +4 -1
  26. package/dist/Components/SelectV2/SelectV2.js +5 -3
  27. package/dist/Components/SideBar/components/MenuPopoverContent.js +2 -2
  28. package/dist/Components/Slider/Slider.js +8 -1
  29. package/dist/Components/StageProgress/StepperStage.js +2 -2
  30. package/dist/Components/Table/settings/ManageColumns.js +2 -1
  31. package/dist/Components/Tag/Tag.styles.js +3 -4
  32. package/dist/Components/Toggle/TableToggle.js +11 -7
  33. package/dist/Components/ToggleSwitch/ToggleSwitch.d.ts +2 -0
  34. package/dist/Components/ToggleSwitch/ToggleSwitch.js +18 -0
  35. package/dist/Components/ToggleSwitch/ToggleSwitchProps.d.ts +11 -0
  36. package/dist/Components/ToggleSwitch/ToggleSwitchProps.js +2 -0
  37. package/dist/Components/ToolTip/ToolTip.js +6 -6
  38. package/dist/Components/ToolTip/ToolTipProps.d.ts +3 -1
  39. package/dist/esm/Components/Accordion/Accordion.js +3 -1
  40. package/dist/esm/Components/Button/Button.js +2 -1
  41. package/dist/esm/Components/Button/Button.styles.js +7 -7
  42. package/dist/esm/Components/Card/PaymentCard/PaymentCard.js +7 -7
  43. package/dist/esm/Components/Checkbox/Checkbox.styles.js +11 -8
  44. package/dist/esm/Components/CopyButton/CopyButton.js +6 -2
  45. package/dist/esm/Components/Dropdown/DropDown.js +4 -2
  46. package/dist/esm/Components/EmptyState/EmptyState.js +2 -1
  47. package/dist/esm/Components/FileUpload/FileUpload.js +2 -2
  48. package/dist/esm/Components/FilterSidebar/filterHoverStyle.js +4 -10
  49. package/dist/esm/Components/Header/components/mobileMenu.js +12 -3
  50. package/dist/esm/Components/Loading/Loading.js +12 -11
  51. package/dist/esm/Components/NoteTextArea/NoteTextArea.js +5 -2
  52. package/dist/esm/Components/PdfViewer/PdfViewer.js +6 -1
  53. package/dist/esm/Components/ProductCard/ProductReview.js +6 -1
  54. package/dist/esm/Components/ProductCard/ProductTags.js +1 -1
  55. package/dist/esm/Components/RadioButton/RadioButton.js +2 -1
  56. package/dist/esm/Components/ScrollToTop/ScrollToTop.js +2 -0
  57. package/dist/esm/Components/SearchSelect/SearchSelect.js +10 -6
  58. package/dist/esm/Components/SegmentedControl/SegmentedControl.js +55 -0
  59. package/dist/esm/Components/SegmentedControl/SegmentedControlProps.js +1 -0
  60. package/dist/esm/Components/SelectSearch/SelectSearch.js +4 -1
  61. package/dist/esm/Components/SelectV2/SelectV2.js +5 -3
  62. package/dist/esm/Components/SideBar/components/MenuPopoverContent.js +2 -2
  63. package/dist/esm/Components/Slider/Slider.js +8 -1
  64. package/dist/esm/Components/StageProgress/StepperStage.js +2 -2
  65. package/dist/esm/Components/Table/settings/ManageColumns.js +2 -1
  66. package/dist/esm/Components/Tag/Tag.styles.js +3 -4
  67. package/dist/esm/Components/Toggle/TableToggle.js +11 -7
  68. package/dist/esm/Components/ToggleSwitch/ToggleSwitch.js +15 -0
  69. package/dist/esm/Components/ToggleSwitch/ToggleSwitchProps.js +1 -0
  70. package/dist/esm/Components/ToolTip/ToolTip.js +6 -6
  71. package/dist/esm/index.js +3 -1
  72. package/dist/index.d.ts +5 -1
  73. package/dist/index.js +7 -3
  74. package/package.json +1 -1
@@ -44,6 +44,7 @@ const FormLabel_1 = require("../Common/FormLabel");
44
44
  const Tag_1 = __importDefault(require("../Tag/Tag"));
45
45
  const useCustomTheme_1 = require("../../Theme/useCustomTheme");
46
46
  const placeholderInk_1 = require("../../Theme/tokens/builders/placeholderInk");
47
+ const outlineRung_1 = require("../../Theme/tokens/builders/outlineRung");
47
48
  const ErrorMessage_1 = __importDefault(require("../Common/ErrorMessage"));
48
49
  const HelperText_1 = __importDefault(require("../Common/HelperText"));
49
50
  const ToolTip_1 = __importDefault(require("../ToolTip/ToolTip"));
@@ -88,6 +89,9 @@ const SearchSelect = ({ id, label, options, onSelect, onSearch, isOptionLoading
88
89
  width: 0,
89
90
  });
90
91
  const theme = (0, useCustomTheme_1.useCustomTheme)();
92
+ const customSelectActiveTint = (0, react_1.useMemo)(() => (0, outlineRung_1.resolveHoverTint)(theme.colors.primary[500], theme.colors.background[400]), [theme.colors.primary, theme.colors.background]);
93
+ const dropdownActiveTint = (0, react_1.useMemo)(() => (0, outlineRung_1.resolveHoverTint)(theme.colors.primary[500], theme.colors.background[50]), [theme.colors.primary, theme.colors.background]);
94
+ const dropdownHoverTint = (0, react_1.useMemo)(() => (0, outlineRung_1.resolveHoverTint)(theme.colors.gray[50], theme.colors.background[50]), [theme.colors.gray, theme.colors.background]);
91
95
  // `searchselect-dropdown-portal` is also the DOM id an existing outside-click check and
92
96
  // several tests look up directly — kept as a literal constant, not derived from `baseId`,
93
97
  // so those keep working unchanged.
@@ -489,7 +493,7 @@ const SearchSelect = ({ id, label, options, onSelect, onSearch, isOptionLoading
489
493
  const insideLabel = (_a = insideSelect.value) === null || _a === void 0 ? void 0 : _a.label;
490
494
  const insidePlaceholder = (_b = insideSelect.placeholder) !== null && _b !== void 0 ? _b : "Select";
491
495
  return ((0, jsx_runtime_1.jsxs)(react_2.Box, { position: "relative", ref: customSelectRef, flexShrink: 0, ml: s.insideSelectMarginLeft, h: "-webkit-fill-available", borderRight: "0.063rem solid", borderColor: theme.colors.boxborder[200], bg: customSelectOpen
492
- ? theme.colors.primary.opacity[8]
496
+ ? customSelectActiveTint
493
497
  : theme.colors.background[400], borderLeftRadius: "md", borderRightRadius: 0, transition: "background 0.15s ease, box-shadow 0.15s ease", boxShadow: customSelectOpen
494
498
  ? `inset 0 0 0 0.063rem ${theme.colors.primary[500]}`
495
499
  : "none", onClick: (e) => {
@@ -502,11 +506,11 @@ const SearchSelect = ({ id, label, options, onSelect, onSearch, isOptionLoading
502
506
  return ((0, jsx_runtime_1.jsxs)(react_2.Box, { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 2, minH: s.optionRowMinH, py: s.optionRowPy, px: "0.75rem", fontSize: s.dropdownTextFontSize, fontWeight: selected ? 600 : 500, color: selected
503
507
  ? theme.colors.accentText
504
508
  : theme.colors.text[700], bg: selected
505
- ? theme.colors.primary.opacity[8]
509
+ ? dropdownActiveTint
506
510
  : "transparent", _hover: {
507
511
  bg: selected
508
- ? theme.colors.primary.opacity[8]
509
- : theme.colors.gray[50],
512
+ ? dropdownActiveTint
513
+ : dropdownHoverTint,
510
514
  }, cursor: "pointer", onClick: (e) => {
511
515
  e.stopPropagation();
512
516
  handleCustomSelect(item);
@@ -546,9 +550,9 @@ const SearchSelect = ({ id, label, options, onSelect, onSearch, isOptionLoading
546
550
  return !prev;
547
551
  });
548
552
  }, "aria-label": "toggle-dropdown", display: "flex", alignItems: "center", children: isOpen ? ((0, jsx_runtime_1.jsx)(lucide_react_1.ChevronUp, { size: s.chevronSize })) : ((0, jsx_runtime_1.jsx)(lucide_react_1.ChevronDown, { size: s.chevronSize })) }))] })] }) }), isOpen && ((0, jsx_runtime_1.jsx)(react_2.Portal, { children: (0, jsx_runtime_1.jsxs)(react_2.Box, { ref: setDropdownMenuRef, id: listboxId, role: "listbox", "aria-multiselectable": isMultiple || undefined, position: "fixed", top: `${dropdownPos.top}px`, left: `${dropdownPos.left}px`, width: `${dropdownPos.width}px`, zIndex: 1500, maxH: "20rem", borderWidth: 1, borderColor: theme.colors.boxborder[200], borderRadius: "sm", bg: theme.colors.background[50], boxShadow: "md", display: "flex", flexDirection: "column", children: [isMultiple && isSelectAll && ((0, jsx_runtime_1.jsxs)(react_2.Box, { py: s.optionRowPy, px: 3, cursor: "pointer", onClick: handleSelectAll, display: "flex", alignItems: "center", gap: 2, borderBottom: `0.063rem solid ${theme.colors.boxborder[200]}`, children: [(0, jsx_runtime_1.jsx)(Checkbox_1.default, { isChecked: allFilteredSelected, sx: { pointerEvents: "none" }, size: s.checkboxSize }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: s.dropdownTextFontSize, children: allFilteredSelected ? "Unselect All" : "Select All" })] })), (0, jsx_runtime_1.jsx)(react_2.Box, { flex: "1", overflowY: "auto", onScroll: handleScroll, maxH: "15rem", borderBottom: "0.063rem solid", borderColor: theme.colors.boxborder[200], children: isOptionLoading && filteredOptions.length === 0 ? ((0, jsx_runtime_1.jsxs)(react_2.Box, { py: s.optionRowPy, px: 3, display: "flex", alignItems: "center", gap: 2, minH: s.optionRowMinH, children: [(0, jsx_runtime_1.jsx)(react_2.Spinner, { size: s.spinnerSize }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: s.dropdownTextFontSize, children: loadingText })] })) : !isOptionLoading && filteredOptions.length === 0 ? ((0, jsx_runtime_1.jsx)(react_2.Text, { p: 3, fontSize: s.dropdownTextFontSize, color: theme.colors.textMuted, children: "No results found" })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [filteredOptions.map((option, index) => ((0, jsx_runtime_1.jsxs)(react_2.Box, { id: getOptionId(index), role: "option", "aria-selected": isSelected(option.id), py: s.optionRowPy, px: 3, minH: s.optionRowMinH, cursor: "pointer", bg: index === activeIndex
549
- ? theme.colors.primary.opacity[8]
553
+ ? dropdownActiveTint
550
554
  : isSelected(option.id)
551
555
  ? theme.colors.gray[100]
552
- : "transparent", _hover: { bg: theme.colors.gray[50] }, onClick: () => handleSelect(option), onMouseEnter: () => setActiveIndex(index), display: "flex", alignItems: "center", gap: 2, borderBottom: `0.063rem solid ${theme.colors.boxborder[200]}`, children: [isMultiple && ((0, jsx_runtime_1.jsx)(Checkbox_1.default, { isChecked: isSelected(option.id), sx: { pointerEvents: "none" }, size: s.checkboxSize })), option.view ? ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: option.view })) : ((0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: s.dropdownTextFontSize, children: option.label }))] }, option.id))), ((pagination === null || pagination === void 0 ? void 0 : pagination.scrollLoading) || (isOptionLoading && filteredOptions.length > 0)) && ((0, jsx_runtime_1.jsxs)(react_2.Box, { py: s.optionRowPy, px: 3, display: "flex", alignItems: "center", justifyContent: "center", gap: 2, minH: s.optionRowMinH, children: [(0, jsx_runtime_1.jsx)(react_2.Spinner, { size: s.spinnerSize }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: s.dropdownTextFontSize, children: loadingText })] }))] })) }), (addNew === null || addNew === void 0 ? void 0 : addNew.enabled) && ((0, jsx_runtime_1.jsxs)(react_2.Box, { py: s.optionRowPy, px: 3, borderTop: "0.063rem solid", borderColor: theme.colors.boxborder[200], bg: theme.colors.background[50], display: "flex", alignItems: "center", gap: 2, minH: s.optionRowMinH, cursor: "pointer", onClick: addNew.onClick, _hover: { bg: theme.colors.gray[50] }, children: [addNew.icon || (0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { size: s.addNewIconSize }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: s.dropdownTextFontSize, children: addNew.text || "Add New" })] }))] }) })), helperText && !error && (0, jsx_runtime_1.jsx)(HelperText_1.default, { helperText: helperText }), error && (0, jsx_runtime_1.jsx)(ErrorMessage_1.default, { errorMessage: errorMessage })] }));
556
+ : "transparent", _hover: { bg: dropdownHoverTint }, onClick: () => handleSelect(option), onMouseEnter: () => setActiveIndex(index), display: "flex", alignItems: "center", gap: 2, borderBottom: `0.063rem solid ${theme.colors.boxborder[200]}`, children: [isMultiple && ((0, jsx_runtime_1.jsx)(Checkbox_1.default, { isChecked: isSelected(option.id), sx: { pointerEvents: "none" }, size: s.checkboxSize })), option.view ? ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: option.view })) : ((0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: s.dropdownTextFontSize, children: option.label }))] }, option.id))), ((pagination === null || pagination === void 0 ? void 0 : pagination.scrollLoading) || (isOptionLoading && filteredOptions.length > 0)) && ((0, jsx_runtime_1.jsxs)(react_2.Box, { py: s.optionRowPy, px: 3, display: "flex", alignItems: "center", justifyContent: "center", gap: 2, minH: s.optionRowMinH, children: [(0, jsx_runtime_1.jsx)(react_2.Spinner, { size: s.spinnerSize }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: s.dropdownTextFontSize, children: loadingText })] }))] })) }), (addNew === null || addNew === void 0 ? void 0 : addNew.enabled) && ((0, jsx_runtime_1.jsxs)(react_2.Box, { py: s.optionRowPy, px: 3, borderTop: "0.063rem solid", borderColor: theme.colors.boxborder[200], bg: theme.colors.background[50], display: "flex", alignItems: "center", gap: 2, minH: s.optionRowMinH, cursor: "pointer", onClick: addNew.onClick, _hover: { bg: dropdownHoverTint }, children: [addNew.icon || (0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { size: s.addNewIconSize }), (0, jsx_runtime_1.jsx)(react_2.Text, { fontSize: s.dropdownTextFontSize, children: addNew.text || "Add New" })] }))] }) })), helperText && !error && (0, jsx_runtime_1.jsx)(HelperText_1.default, { helperText: helperText }), error && (0, jsx_runtime_1.jsx)(ErrorMessage_1.default, { errorMessage: errorMessage })] }));
553
557
  };
554
558
  exports.default = SearchSelect;
@@ -0,0 +1,2 @@
1
+ import { SegmentedControlProps } from "./SegmentedControlProps";
2
+ export default function SegmentedControl<T extends string = string>({ options, value, onChange, size, isFullWidth, "aria-label": ariaLabel, }: SegmentedControlProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = SegmentedControl;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const react_2 = require("@chakra-ui/react");
7
+ const useCustomTheme_1 = require("../../Theme/useCustomTheme");
8
+ const SIZES = {
9
+ sm: { h: "1.625rem", px: "0.625rem", fontSize: "0.75rem" },
10
+ md: { h: "2rem", px: "0.875rem", fontSize: "0.8125rem" },
11
+ };
12
+ function SegmentedControl({ options, value, onChange, size = "md", isFullWidth = false, "aria-label": ariaLabel, }) {
13
+ const { colors } = (0, useCustomTheme_1.useCustomTheme)();
14
+ const dims = SIZES[size];
15
+ const refs = (0, react_1.useRef)([]);
16
+ const selectedIndex = options.findIndex((o) => o.value === value);
17
+ const enabled = options.reduce((acc, o, i) => (o.isDisabled ? acc : [...acc, i]), []);
18
+ // WAI-APG: with nothing selected, the first enabled segment owns the tab stop.
19
+ const tabIndex = selectedIndex >= 0 ? selectedIndex : enabled[0];
20
+ const selectAt = (index) => {
21
+ var _a;
22
+ (_a = refs.current[index]) === null || _a === void 0 ? void 0 : _a.focus();
23
+ onChange(options[index].value);
24
+ };
25
+ const handleKeyDown = (event) => {
26
+ if (enabled.length === 0)
27
+ return;
28
+ const step = (delta) => {
29
+ const position = enabled.indexOf(tabIndex);
30
+ selectAt(enabled[(position + delta + enabled.length) % enabled.length]);
31
+ };
32
+ if (event.key === "ArrowRight" || event.key === "ArrowDown") {
33
+ event.preventDefault();
34
+ step(1);
35
+ }
36
+ else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
37
+ event.preventDefault();
38
+ step(-1);
39
+ }
40
+ else if (event.key === "Home") {
41
+ event.preventDefault();
42
+ selectAt(enabled[0]);
43
+ }
44
+ else if (event.key === "End") {
45
+ event.preventDefault();
46
+ selectAt(enabled[enabled.length - 1]);
47
+ }
48
+ };
49
+ return ((0, jsx_runtime_1.jsx)(react_2.Flex, { role: "radiogroup", "aria-label": ariaLabel, onKeyDown: handleKeyDown, display: "inline-flex", align: "center", gap: "0.125rem", p: "0.125rem", borderRadius: "md", bg: colors.background[600], w: isFullWidth ? "100%" : "fit-content", children: options.map((option, index) => {
50
+ const isSelected = option.value === value;
51
+ return ((0, jsx_runtime_1.jsxs)(react_2.Box, { as: "button", type: "button", ref: (node) => {
52
+ refs.current[index] = node;
53
+ }, role: "radio", "aria-checked": isSelected, disabled: option.isDisabled, tabIndex: index === tabIndex ? 0 : -1, onClick: () => onChange(option.value), display: "inline-flex", alignItems: "center", justifyContent: "center", gap: "0.375rem", flex: isFullWidth ? "1" : undefined, h: dims.h, px: dims.px, borderRadius: "base", borderWidth: "1px", borderStyle: "solid", borderColor: isSelected ? colors.background[400] : "transparent", bg: isSelected ? colors.background[50] : "transparent", boxShadow: isSelected ? "sm" : "none", color: isSelected ? colors.text[900] : colors.text[600], fontSize: dims.fontSize, fontWeight: isSelected ? 600 : 500, whiteSpace: "nowrap", opacity: option.isDisabled ? 0.5 : 1, cursor: option.isDisabled ? "not-allowed" : "pointer", transition: "background-color 0.2s ease, color 0.2s ease", _hover: option.isDisabled || isSelected ? undefined : { color: colors.text[900] }, _focusVisible: {
54
+ outline: "none",
55
+ boxShadow: `0 0 0 2px ${colors.primary[300]}`,
56
+ }, children: [option.icon, option.label] }, option.value));
57
+ }) }));
58
+ }
@@ -0,0 +1,16 @@
1
+ export type SegmentedControlSize = "sm" | "md";
2
+ export type SegmentedControlOption<T extends string = string> = {
3
+ value: T;
4
+ label: string;
5
+ icon?: JSX.Element;
6
+ isDisabled?: boolean;
7
+ };
8
+ export type SegmentedControlProps<T extends string = string> = {
9
+ /** Two to five mutually exclusive options. Beyond five, use a Select. */
10
+ options: SegmentedControlOption<T>[];
11
+ value: T;
12
+ onChange: (value: T) => void;
13
+ size?: SegmentedControlSize;
14
+ isFullWidth?: boolean;
15
+ "aria-label": string;
16
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -10,6 +10,7 @@ const react_2 = require("@chakra-ui/react");
10
10
  const FormLabel_1 = require("../Common/FormLabel");
11
11
  const fieldStyles_1 = require("../Common/fieldStyles");
12
12
  const useCustomTheme_1 = require("../../Theme/useCustomTheme");
13
+ const outlineRung_1 = require("../../Theme/tokens/builders/outlineRung");
13
14
  const lucide_react_1 = require("lucide-react");
14
15
  const ErrorMessage_1 = __importDefault(require("../Common/ErrorMessage"));
15
16
  const RenderOptions = ({ isOptionLoading, filteredOptions, loadingText, handleOptionClick, isProfile, isColorOptions, isOptionSelected, activeIndex, optionRefs, }) => {
@@ -20,7 +21,9 @@ const RenderOptions = ({ isOptionLoading, filteredOptions, loadingText, handleOp
20
21
  if (filteredOptions === null || filteredOptions === void 0 ? void 0 : filteredOptions.length) {
21
22
  return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: filteredOptions.map((option, index) => ((0, jsx_runtime_1.jsxs)(react_2.Box, { as: "button", type: "button", ref: (el) => {
22
23
  optionRefs.current[index] = el;
23
- }, role: "option", "aria-selected": isOptionSelected(option), tabIndex: index === activeIndex ? 0 : -1, w: "100%", textAlign: "left", border: "none", fontFamily: "inherit", bg: "transparent", px: 4, py: 2, cursor: "pointer", _hover: { backgroundColor: theme.colors.primary[50] }, onClick: () => handleOptionClick(option), onKeyDown: (e) => {
24
+ }, role: "option", "aria-selected": isOptionSelected(option), tabIndex: index === activeIndex ? 0 : -1, w: "100%", textAlign: "left", border: "none", fontFamily: "inherit", bg: "transparent", px: 4, py: 2, cursor: "pointer", _hover: {
25
+ backgroundColor: (0, outlineRung_1.resolveHoverTint)(theme.colors.primary[500], theme.colors.background[50]),
26
+ }, onClick: () => handleOptionClick(option), onKeyDown: (e) => {
24
27
  if (e.key === "Enter" || e.key === " ") {
25
28
  e.preventDefault();
26
29
  handleOptionClick(option);
@@ -43,6 +43,7 @@ const react_2 = require("@chakra-ui/react");
43
43
  const lucide_react_1 = require("lucide-react");
44
44
  const useCustomTheme_1 = require("../../Theme/useCustomTheme");
45
45
  const placeholderInk_1 = require("../../Theme/tokens/builders/placeholderInk");
46
+ const outlineRung_1 = require("../../Theme/tokens/builders/outlineRung");
46
47
  const scrollbar_1 = require("../../Theme/tokens/builders/scrollbar");
47
48
  const fieldStyles_1 = require("../Common/fieldStyles");
48
49
  const FormLabel_1 = require("../Common/FormLabel");
@@ -57,10 +58,10 @@ const SIZE_MAP = {
57
58
  const asIdSet = (values) => new Set((values !== null && values !== void 0 ? values : []).map((v) => v.toString()));
58
59
  // Derived from the option's own id (not its index) so it stays stable across filtering/reordering.
59
60
  const optionDomId = (listboxId, id) => `${listboxId}-option-${id.toString().replace(/[^a-zA-Z0-9_-]/g, "-")}`;
60
- const OptionRow = react_1.default.memo(function OptionRow({ option, index, listboxId, isSelected, isActive, isMulti, theme, renderOption, onSelect, onActivate, }) {
61
+ const OptionRow = react_1.default.memo(function OptionRow({ option, index, listboxId, isSelected, isActive, isMulti, theme, activeBg, renderOption, onSelect, onActivate, }) {
61
62
  return ((0, jsx_runtime_1.jsxs)(react_2.Box, { id: optionDomId(listboxId, option.id), "data-index": index, role: "option", "aria-selected": isSelected, "aria-disabled": option.isDisabled, onMouseEnter: () => onActivate(index), onClick: () => onSelect(option), mx: 1.5, px: 2.5, py: 1.5, borderRadius: "md", cursor: option.isDisabled ? "not-allowed" : "pointer", opacity: option.isDisabled ? 0.4 : 1, display: "flex", alignItems: "center", gap: 2, fontSize: "0.8125rem", fontWeight: isSelected && !isMulti ? 600 : 500, color: isSelected && !isMulti
62
63
  ? theme.colors.accentText
63
- : theme.colors.text[700], bg: isActive ? theme.colors.primary.opacity[8] : "transparent", transition: "background 0.12s ease, color 0.12s ease", children: [isMulti ? ((0, jsx_runtime_1.jsx)(react_2.Checkbox, { isChecked: isSelected, isDisabled: option.isDisabled, pointerEvents: "none", tabIndex: -1 })) : null, renderOption ? ((0, jsx_runtime_1.jsx)(react_2.Box, { flex: 1, minW: 0, children: renderOption(option, { isSelected, isActive }) })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [option.icon ? ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "span", display: "inline-flex", flexShrink: 0, children: option.icon })) : null, (0, jsx_runtime_1.jsxs)(react_2.Box, { flex: 1, minW: 0, isTruncated: true, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { as: "span", isTruncated: true, children: option.label }), option.description ? ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "span", display: "block", fontSize: "0.75rem", fontWeight: 400, color: theme.colors.textMuted, isTruncated: true, children: option.description })) : null] })] }))] }));
64
+ : theme.colors.text[700], bg: isActive ? activeBg : "transparent", transition: "background 0.12s ease, color 0.12s ease", children: [isMulti ? ((0, jsx_runtime_1.jsx)(react_2.Checkbox, { isChecked: isSelected, isDisabled: option.isDisabled, pointerEvents: "none", tabIndex: -1 })) : null, renderOption ? ((0, jsx_runtime_1.jsx)(react_2.Box, { flex: 1, minW: 0, children: renderOption(option, { isSelected, isActive }) })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [option.icon ? ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "span", display: "inline-flex", flexShrink: 0, children: option.icon })) : null, (0, jsx_runtime_1.jsxs)(react_2.Box, { flex: 1, minW: 0, isTruncated: true, children: [(0, jsx_runtime_1.jsx)(react_2.Box, { as: "span", isTruncated: true, children: option.label }), option.description ? ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "span", display: "block", fontSize: "0.75rem", fontWeight: 400, color: theme.colors.textMuted, isTruncated: true, children: option.description })) : null] })] }))] }));
64
65
  });
65
66
  function SelectV2(props) {
66
67
  var _a, _b;
@@ -234,6 +235,7 @@ function SelectV2(props) {
234
235
  const activeOption = filteredOptions[activeIndex];
235
236
  const activeDescendantId = activeOption ? optionDomId(listboxId, activeOption.id) : undefined;
236
237
  const listScrollStyles = (0, react_1.useMemo)(() => (0, scrollbar_1.scrollbarStyles)(theme.colors, "overlay"), [theme]);
238
+ const activeOptionBg = (0, react_1.useMemo)(() => (0, outlineRung_1.resolveHoverTint)(theme.colors.primary[500], theme.colors.backgroundColor.light), [theme]);
237
239
  const defaultTriggerContent = () => {
238
240
  var _a;
239
241
  if (props.isMulti) {
@@ -253,6 +255,6 @@ function SelectV2(props) {
253
255
  setActiveIndex(0);
254
256
  }, "aria-activedescendant": activeDescendantId, "aria-label": "Filter options" }) })), (0, jsx_runtime_1.jsxs)(react_2.Box, { id: listboxId, ref: listRef, role: "listbox", "aria-multiselectable": props.isMulti || undefined, maxH: maxMenuHeight, overflowY: "auto", py: 1, sx: listScrollStyles, children: [filteredOptions.length === 0 && ((0, jsx_runtime_1.jsx)(react_2.Box, { px: 3, py: 2, fontSize: "0.8125rem", color: theme.colors.textMuted, children: "No Options" })), filteredOptions.map((option, index) => {
255
257
  var _a;
256
- return ((0, jsx_runtime_1.jsx)(OptionRow, { option: option, index: index, listboxId: listboxId, isSelected: selectedIds.has(option.id.toString()), isActive: index === activeIndex, isMulti: (_a = props.isMulti) !== null && _a !== void 0 ? _a : false, theme: theme, renderOption: renderOption, onSelect: handleSelect, onActivate: setActiveIndex }, option.id));
258
+ return ((0, jsx_runtime_1.jsx)(OptionRow, { option: option, index: index, listboxId: listboxId, isSelected: selectedIds.has(option.id.toString()), isActive: index === activeIndex, isMulti: (_a = props.isMulti) !== null && _a !== void 0 ? _a : false, theme: theme, activeBg: activeOptionBg, renderOption: renderOption, onSelect: handleSelect, onActivate: setActiveIndex }, option.id));
257
259
  })] })] }) })] }), error && (0, jsx_runtime_1.jsx)(ErrorMessage_1.default, { errorMessage: errorMessage }), helperText && !error && (0, jsx_runtime_1.jsx)(HelperText_1.default, { helperText: helperText })] }));
258
260
  }
@@ -16,7 +16,7 @@ const MenuPopoverContent = ({ menu, handleMenuClick, activeMenu, }) => {
16
16
  const { title, icon, subMenu, badge, locked } = menu;
17
17
  const hasSubMenu = !!(subMenu === null || subMenu === void 0 ? void 0 : subMenu.length);
18
18
  const isParentActive = activeMenu === menu.id;
19
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(react_1.Flex, { as: (hasSubMenu ? "div" : "a"), href: hasSubMenu ? undefined : (_a = menu.url) !== null && _a !== void 0 ? _a : "#", "aria-current": !hasSubMenu && isParentActive ? "page" : undefined, textDecoration: "none", align: "center", gap: "8px", px: "8px", py: hasSubMenu ? "6px" : "8px", mb: hasSubMenu ? "4px" : 0, borderBottom: hasSubMenu ? "1px solid" : undefined, borderColor: hasSubMenu ? "whiteAlpha.100" : undefined, borderRadius: hasSubMenu ? "none" : "md", bg: !hasSubMenu && isParentActive ? theme.colors.primary.opacity[16] : "transparent", _hover: !hasSubMenu ? { bg: "whiteAlpha.100" } : undefined, onClick: (e) => {
19
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(react_1.Flex, { as: (hasSubMenu ? "div" : "a"), href: hasSubMenu ? undefined : (_a = menu.url) !== null && _a !== void 0 ? _a : "#", "aria-current": !hasSubMenu && isParentActive ? "page" : undefined, textDecoration: "none", align: "center", gap: "8px", px: "8px", py: hasSubMenu ? "6px" : "8px", mb: hasSubMenu ? "4px" : 0, borderBottom: hasSubMenu ? "1px solid" : undefined, borderColor: hasSubMenu ? "whiteAlpha.100" : undefined, borderRadius: hasSubMenu ? "none" : "md", bg: !hasSubMenu && isParentActive ? "whiteAlpha.300" : "transparent", _hover: !hasSubMenu ? { bg: "whiteAlpha.100" } : undefined, onClick: (e) => {
20
20
  if (!hasSubMenu) {
21
21
  e.preventDefault();
22
22
  handleMenuClick === null || handleMenuClick === void 0 ? void 0 : handleMenuClick(menu);
@@ -38,7 +38,7 @@ const MenuPopoverContent = ({ menu, handleMenuClick, activeMenu, }) => {
38
38
  e.preventDefault();
39
39
  if (!sub.disabled)
40
40
  handleMenuClick === null || handleMenuClick === void 0 ? void 0 : handleMenuClick(sub);
41
- }, px: "8px", py: "7px", mb: "2px", borderRadius: "md", align: "center", justify: "space-between", gap: "8px", borderLeft: "2px solid", borderLeftColor: isSubActive ? theme.colors.sidebar.activeIcon : "transparent", bg: isSubActive ? theme.colors.primary.opacity[16] : "transparent", _hover: {
41
+ }, px: "8px", py: "7px", mb: "2px", borderRadius: "md", align: "center", justify: "space-between", gap: "8px", borderLeft: "2px solid", borderLeftColor: isSubActive ? theme.colors.sidebar.activeIcon : "transparent", bg: isSubActive ? "whiteAlpha.300" : "transparent", _hover: {
42
42
  bg: !sub.disabled ? "whiteAlpha.100" : "transparent",
43
43
  cursor: !sub.disabled ? "pointer" : "not-allowed",
44
44
  }, opacity: sub.disabled ? 0.5 : 1, pointerEvents: sub.disabled ? "none" : "auto", transition: "background 0.12s", children: [(0, jsx_runtime_1.jsxs)(react_1.Flex, { align: "center", gap: "9px", overflow: "hidden", flex: "1", children: [(0, jsx_runtime_1.jsx)(react_1.Icon, { as: sub.icon, fontSize: "0.95rem", flexShrink: 0, color: isSubActive ? activeAccent.icon : "whiteAlpha.800", _groupHover: isSubActive ? undefined : { color: "white" }, transition: "color 0.12s" }), (0, jsx_runtime_1.jsx)(TextTruncation_1.default, { fontSize: "12.5px", fontWeight: isSubActive ? 600 : 500, flex: 1, color: isSubActive ? activeAccent.label : theme.colors.white, _groupHover: isSubActive ? undefined : { color: "white" }, children: sub.title })] }), sub.locked ? ((0, jsx_runtime_1.jsx)(react_1.Icon, { as: lucide_react_1.LockKeyhole, fontSize: "1rem", color: theme.colors.sidebar.mutedIcon })) : (() => {
@@ -5,6 +5,8 @@ const react_1 = require("react");
5
5
  const react_2 = require("@chakra-ui/react");
6
6
  const lucide_react_1 = require("lucide-react");
7
7
  const useCustomTheme_1 = require("../../Theme/useCustomTheme");
8
+ const accentText_1 = require("../../Theme/tokens/builders/accentText");
9
+ const outlineRung_1 = require("../../Theme/tokens/builders/outlineRung");
8
10
  const Slider = ({ images, interval = 5000, isArrow = false, mobileImages, }) => {
9
11
  var _a, _b;
10
12
  const { colors } = (0, useCustomTheme_1.useCustomTheme)();
@@ -34,10 +36,15 @@ const Slider = ({ images, interval = 5000, isArrow = false, mobileImages, }) =>
34
36
  // eslint-disable-next-line
35
37
  }, [slides.length]);
36
38
  const ratio = (_b = (0, react_2.useBreakpointValue)({ base: 16 / 9, md: 21 / 9, lg: 21 / 9 })) !== null && _b !== void 0 ? _b : 16 / 9;
39
+ const chipBg = colors.background[50];
40
+ const chipInk = (0, accentText_1.onFilled)(chipBg, colors.white, colors.black);
41
+ const chipHoverBg = (0, outlineRung_1.resolveHoverTint)(colors.gray[200], chipBg);
42
+ const chipHoverInk = (0, accentText_1.onFilled)(chipHoverBg, colors.white, colors.black);
43
+ const dotInactiveInk = (0, outlineRung_1.liftToContrast)(colors.gray[400], chipBg, outlineRung_1.AA_NON_TEXT);
37
44
  return ((0, jsx_runtime_1.jsxs)(react_2.Box, { position: "relative", w: "100%", h: "auto", overflow: "hidden", children: [(0, jsx_runtime_1.jsx)(react_2.Flex, { w: `${slides.length * 100}%`, transform: `translateX(-${(currentIndex * 100) / slides.length}%)`, transition: "transform 0.5s ease", children: [...slides]
38
45
  .sort((a, b) => a.order - b.order)
39
46
  .map((image, idx) => ((0, jsx_runtime_1.jsx)(react_2.Box, { w: `${100 / slides.length}%`, h: "auto", flexShrink: 0, display: "flex", justifyContent: "center", alignItems: "center", children: (0, jsx_runtime_1.jsx)(react_2.AspectRatio, { ratio: ratio, w: "100%", children: (0, jsx_runtime_1.jsx)(react_2.Image, { src: isMobile && image.mobilePreviewUrl
40
47
  ? image.mobilePreviewUrl
41
- : image.previewUrl, alt: `Slide ${idx + 1}`, objectFit: "cover", w: "100%", h: "100%", loading: "lazy" }) }) }, image.id))) }), isArrow && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_2.IconButton, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronLeft, { color: colors.gray[800] }), "aria-label": "Previous Slide", onClick: prevSlide, position: "absolute", top: "50%", left: "1rem", transform: "translateY(-50%)", zIndex: 2, variant: "ghost", _hover: { bg: colors.gray[200] } }), (0, jsx_runtime_1.jsx)(react_2.IconButton, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { color: colors.gray[800] }), "aria-label": "Next Slide", onClick: nextSlide, position: "absolute", top: "50%", right: "1rem", transform: "translateY(-50%)", zIndex: 2, variant: "ghost", _hover: { bg: colors.gray[200] } })] })), slides.length > 1 && ((0, jsx_runtime_1.jsx)(react_2.Flex, { position: "absolute", bottom: "1rem", left: "50%", transform: "translateX(-50%)", gap: "0.5rem", zIndex: 2, children: slides.map((_, idx) => ((0, jsx_runtime_1.jsx)(react_2.Box, { w: { base: "0.5rem", md: "0.8rem" }, h: { base: "0.5rem", md: "0.8rem" }, bg: idx === currentIndex ? "white" : "whiteAlpha.600", borderRadius: "full", cursor: "pointer", onClick: () => setCurrentIndex(idx), transition: "all 0.3s" }, idx))) }))] }));
48
+ : image.previewUrl, alt: `Slide ${idx + 1}`, objectFit: "cover", w: "100%", h: "100%", loading: "lazy" }) }) }, image.id))) }), isArrow && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_2.IconButton, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronLeft, {}), "aria-label": "Previous Slide", onClick: prevSlide, position: "absolute", top: "50%", left: "1rem", transform: "translateY(-50%)", zIndex: 2, variant: "ghost", borderRadius: "full", bg: chipBg, color: chipInk, _hover: { bg: chipHoverBg, color: chipHoverInk } }), (0, jsx_runtime_1.jsx)(react_2.IconButton, { icon: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, {}), "aria-label": "Next Slide", onClick: nextSlide, position: "absolute", top: "50%", right: "1rem", transform: "translateY(-50%)", zIndex: 2, variant: "ghost", borderRadius: "full", bg: chipBg, color: chipInk, _hover: { bg: chipHoverBg, color: chipHoverInk } })] })), slides.length > 1 && ((0, jsx_runtime_1.jsx)(react_2.Flex, { position: "absolute", bottom: "1rem", left: "50%", transform: "translateX(-50%)", gap: "0.5rem", zIndex: 2, bg: chipBg, px: "0.6rem", py: "0.4rem", borderRadius: "full", children: slides.map((_, idx) => ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "button", type: "button", w: { base: "0.5rem", md: "0.8rem" }, h: { base: "0.5rem", md: "0.8rem" }, border: "none", p: 0, bg: idx === currentIndex ? chipInk : dotInactiveInk, borderRadius: "full", cursor: "pointer", onClick: () => setCurrentIndex(idx), "aria-label": `Go to slide ${idx + 1}`, "aria-current": idx === currentIndex, transition: "all 0.3s", _focusVisible: { outline: `2px solid ${chipInk}`, outlineOffset: "2px" } }, idx))) }))] }));
42
49
  };
43
50
  exports.default = Slider;
@@ -34,7 +34,7 @@ const StepperStage = ({ label, number, state, size = "md", colorScheme = "primar
34
34
  return ((0, jsx_runtime_1.jsxs)(react_2.Flex, { ref: ref, direction: "column", align: "center", flex: "1", minWidth: s.minW, flexShrink: 0, as: (interactive ? "button" : "div"), type: interactive ? "button" : undefined, "data-group": "", border: "none", bg: "transparent", cursor: interactive ? "pointer" : "default", opacity: disabled ? 0.55 : 1, onClick: interactive ? onClick : undefined, children: [(0, jsx_runtime_1.jsxs)(react_2.Flex, { align: "center", width: "100%", children: [line(leftDone, isFirst), (0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", justify: "center", boxSize: s.circle, borderRadius: "full", flexShrink: 0, bg: circleBg, color: circleColor, border: "2px solid", borderColor: circleBorder, fontSize: s.font, fontWeight: 600, transition: "all 0.18s ease", "aria-current": state === "active" ? "step" : undefined, sx: state === "active"
35
35
  ? { boxShadow: `0 0 0 4px ${palette.soft}` }
36
36
  : undefined, _groupHover: interactive
37
- ? { borderColor: palette.strong, color: filled ? palette.onStrong : palette.strong }
38
- : undefined, children: showCheck && state === "completed" ? (0, jsx_runtime_1.jsx)(lucide_react_1.Check, { size: s.icon }) : number }), line(rightDone, isLast)] }), (0, jsx_runtime_1.jsx)(react_2.Text, { mt: 2, px: 1, fontSize: s.label, fontWeight: state === "active" ? 600 : 500, color: state === "upcoming" ? palette.mutedText : palette.softText, textAlign: "center", noOfLines: 2, _groupHover: interactive ? { color: palette.strong } : undefined, children: label })] }));
37
+ ? { borderColor: palette.strong, bg: palette.strong, color: palette.onStrong }
38
+ : undefined, children: showCheck && state === "completed" ? (0, jsx_runtime_1.jsx)(lucide_react_1.Check, { size: s.icon }) : number }), line(rightDone, isLast)] }), (0, jsx_runtime_1.jsx)(react_2.Text, { mt: 2, px: 1, borderRadius: "sm", fontSize: s.label, fontWeight: state === "active" ? 600 : 500, color: state === "upcoming" ? palette.mutedText : palette.softText, textAlign: "center", noOfLines: 2, transition: "background 0.18s ease, color 0.18s ease", _groupHover: interactive ? { bg: palette.strong, color: palette.onStrong } : undefined, children: label })] }));
39
39
  };
40
40
  exports.default = StepperStage;
@@ -9,6 +9,7 @@ const react_2 = require("@chakra-ui/react");
9
9
  const Checkbox_1 = __importDefault(require("../../Checkbox/Checkbox"));
10
10
  const useCustomTheme_1 = require("../../../Theme/useCustomTheme");
11
11
  const scrollbar_1 = require("../../../Theme/tokens/builders/scrollbar");
12
+ const accentText_1 = require("../../../Theme/tokens/builders/accentText");
12
13
  const lucide_react_1 = require("lucide-react");
13
14
  const ManageColumns = ({ columns, items, setItems, childInputMethodsRef, }) => {
14
15
  const theme = (0, useCustomTheme_1.useCustomTheme)();
@@ -75,7 +76,7 @@ const ManageColumns = ({ columns, items, setItems, childInputMethodsRef, }) => {
75
76
  setError(null);
76
77
  }
77
78
  };
78
- return ((0, jsx_runtime_1.jsxs)(react_2.Box, { mt: 2, children: [error && ((0, jsx_runtime_1.jsx)(react_2.Box, { mb: 2, px: 3, py: 2, bg: theme.colors.red[50], borderRadius: "md", border: "1px solid", borderColor: theme.colors.red[200], children: (0, jsx_runtime_1.jsx)(react_2.Text, { color: theme.colors.red[600], fontSize: "xs", fontWeight: 500, children: error }) })), (0, jsx_runtime_1.jsx)(react_2.Input, { placeholder: "Search columns...", mb: 2, value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), size: "sm", borderRadius: "md" }), !searchTerm.length && ((0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", mb: 1, bg: theme.colors.gray[100], px: 2, py: 1, borderRadius: "md", children: (0, jsx_runtime_1.jsx)(Checkbox_1.default, { label: "Show all columns", isChecked: allChecked, isIndeterminate: someChecked, onChange: handleSelectAll }) })), (0, jsx_runtime_1.jsx)(react_2.List, { spacing: 0, maxH: "300px", overflowY: "auto", sx: (0, scrollbar_1.scrollbarStyles)(theme.colors), children: filteredItems.length > 0 ? (filteredItems.map((item, index) => {
79
+ return ((0, jsx_runtime_1.jsxs)(react_2.Box, { mt: 2, children: [error && ((0, jsx_runtime_1.jsx)(react_2.Box, { mb: 2, px: 3, py: 2, bg: theme.colors.red[50], borderRadius: "md", border: "1px solid", borderColor: theme.colors.red[200], children: (0, jsx_runtime_1.jsx)(react_2.Text, { color: (0, accentText_1.accentTextOnCanvas)(theme.colors.red, theme.colors.red[50]), fontSize: "xs", fontWeight: 500, children: error }) })), (0, jsx_runtime_1.jsx)(react_2.Input, { placeholder: "Search columns...", mb: 2, value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), size: "sm", borderRadius: "md" }), !searchTerm.length && ((0, jsx_runtime_1.jsx)(react_2.Flex, { align: "center", mb: 1, bg: theme.colors.gray[100], px: 2, py: 1, borderRadius: "md", children: (0, jsx_runtime_1.jsx)(Checkbox_1.default, { label: "Show all columns", isChecked: allChecked, isIndeterminate: someChecked, onChange: handleSelectAll }) })), (0, jsx_runtime_1.jsx)(react_2.List, { spacing: 0, maxH: "300px", overflowY: "auto", sx: (0, scrollbar_1.scrollbarStyles)(theme.colors), children: filteredItems.length > 0 ? (filteredItems.map((item, index) => {
79
80
  const isDraggingThisItem = draggedItemIndex === index;
80
81
  const isDropZone = draggedItemIndex !== null && draggedItemIndex !== index;
81
82
  const realIndex = items.findIndex((i) => i.id === item.id);
@@ -74,13 +74,12 @@ exports.Tag = {
74
74
  outline: ({ theme, colorScheme = "primary" }) => {
75
75
  const c = swatch(theme, colorScheme);
76
76
  const canvas = theme.colors.backgroundColor.main;
77
+ const ink = (0, accentText_1.accentTextOnCanvas)(c, canvas);
77
78
  return {
78
79
  container: {
79
80
  border: "0.094rem solid",
80
- borderColor: c[500],
81
- // Text sits directly on the page canvas here — a fixed [600] failed AA for several
82
- // hues (orange 2.51, green 2.94, red 4.09); use the canvas-text helper instead.
83
- color: (0, accentText_1.accentTextOnCanvas)(c, canvas),
81
+ borderColor: ink,
82
+ color: ink,
84
83
  bg: "transparent",
85
84
  _hover: { bg: c[50] },
86
85
  _active: { bg: c[100] },
@@ -7,14 +7,18 @@ const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const react_1 = require("@chakra-ui/react");
8
8
  const lucide_react_1 = require("lucide-react");
9
9
  const useCustomTheme_1 = require("../../Theme/useCustomTheme");
10
+ const outlineRung_1 = require("../../Theme/tokens/builders/outlineRung");
10
11
  const ToolTip_1 = __importDefault(require("../ToolTip/ToolTip"));
11
12
  const TableToggle = ({ value, onChange }) => {
12
13
  const theme = (0, useCustomTheme_1.useCustomTheme)();
14
+ const { colors } = theme;
15
+ const restInk = (0, outlineRung_1.liftToContrast)(colors.background[800], colors.background[600], outlineRung_1.AA_NON_TEXT);
16
+ const hoverInk = (0, outlineRung_1.liftToContrast)(colors.background[900], colors.background[400], outlineRung_1.AA_NON_TEXT);
13
17
  const styles = {
14
18
  container: {
15
19
  display: "flex",
16
20
  alignItems: "center",
17
- bg: theme.colors.background[600],
21
+ bg: colors.background[600],
18
22
  p: "0.125rem",
19
23
  borderRadius: "md",
20
24
  height: "2rem",
@@ -22,19 +26,19 @@ const TableToggle = ({ value, onChange }) => {
22
26
  width: "6.3rem",
23
27
  },
24
28
  button: (mode) => ({
25
- bg: value === mode ? theme.colors.background[50] : "transparent",
29
+ bg: value === mode ? colors.background[50] : "transparent",
26
30
  boxShadow: value === mode ? "md" : "none",
27
- color: value === mode ? theme.colors.text[900] : theme.colors.background[800],
31
+ color: value === mode ? colors.text[900] : restInk,
28
32
  borderRadius: "base",
29
33
  height: "1.75rem",
30
34
  border: "0.031rem solid",
31
- borderColor: value === mode ? theme.colors.background[400] : "transparent",
35
+ borderColor: value === mode ? colors.background[400] : "transparent",
32
36
  padding: "0.313rem 0.813rem",
33
37
  _hover: {
34
38
  bg: value === mode
35
- ? theme.colors.background[50]
36
- : theme.colors.background[400],
37
- color: value === mode ? theme.colors.text[900] : theme.colors.background[900],
39
+ ? colors.background[50]
40
+ : colors.background[400],
41
+ color: value === mode ? colors.text[900] : hoverInk,
38
42
  },
39
43
  transition: "all 0.3s ease-in-out",
40
44
  }),
@@ -0,0 +1,2 @@
1
+ import { ToggleSwitchProps } from "./ToggleSwitchProps";
2
+ export default function ToggleSwitch({ isChecked, onChange, isDisabled, size, id, "aria-label": ariaLabel, "aria-describedby": ariaDescribedBy, }: ToggleSwitchProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = ToggleSwitch;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("@chakra-ui/react");
6
+ const useCustomTheme_1 = require("../../Theme/useCustomTheme");
7
+ const SIZES = {
8
+ sm: { w: "2rem", h: "1.125rem", knob: "0.875rem", travel: "0.75rem" },
9
+ md: { w: "2.375rem", h: "1.375rem", knob: "1.125rem", travel: "0.875rem" },
10
+ };
11
+ function ToggleSwitch({ isChecked, onChange, isDisabled = false, size = "md", id, "aria-label": ariaLabel, "aria-describedby": ariaDescribedBy, }) {
12
+ const { colors } = (0, useCustomTheme_1.useCustomTheme)();
13
+ const dims = SIZES[size];
14
+ return ((0, jsx_runtime_1.jsx)(react_1.Box, { as: "button", type: "button", id: id, role: "switch", "aria-checked": isChecked, "aria-label": ariaLabel, "aria-describedby": ariaDescribedBy, disabled: isDisabled, onClick: () => onChange(!isChecked), position: "relative", display: "inline-flex", alignItems: "center", flexShrink: 0, w: dims.w, h: dims.h, p: 0, borderRadius: "full", borderWidth: "1px", borderStyle: "solid", borderColor: isChecked ? colors.primary[500] : colors.boxborder[500], bg: isChecked ? colors.primary[500] : colors.background[600], opacity: isDisabled ? 0.5 : 1, cursor: isDisabled ? "not-allowed" : "pointer", transition: "background-color 0.2s ease, border-color 0.2s ease", _focusVisible: {
15
+ outline: "none",
16
+ boxShadow: `0 0 0 2px ${colors.primary[300]}`,
17
+ }, children: (0, jsx_runtime_1.jsx)(react_1.Box, { "aria-hidden": "true", position: "absolute", left: "0.125rem", w: dims.knob, h: dims.knob, borderRadius: "full", bg: colors.background[50], boxShadow: "sm", transition: "transform 0.2s ease", transform: isChecked ? `translateX(${dims.travel})` : "translateX(0)" }) }));
18
+ }
@@ -0,0 +1,11 @@
1
+ export type ToggleSwitchSize = "sm" | "md";
2
+ export type ToggleSwitchProps = {
3
+ isChecked: boolean;
4
+ onChange: (checked: boolean) => void;
5
+ isDisabled?: boolean;
6
+ size?: ToggleSwitchSize;
7
+ id?: string;
8
+ /** The control carries no visible text, so it has no other way to be named. */
9
+ "aria-label": string;
10
+ "aria-describedby"?: string;
11
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -7,18 +7,18 @@ const react_2 = require("@chakra-ui/react");
7
7
  const useIsTruncated_1 = require("../../Hooks/useIsTruncated");
8
8
  const mergeRefs_1 = require("../../Utils/mergeRefs");
9
9
  const useCustomTheme_1 = require("../../Theme/useCustomTheme");
10
- function ToolTip({ placement = "top", label, children, hasArrow = true, fontSize = "14px", bg, color = "white", isDisabled, overflowOnly = false, isOpen, defaultIsOpen, openDelay = 0, closeDelay = 0, arrowSize = 10, closeOnClick = false, size, width, height, arrowPadding, arrowShadowColor, direction, gutter = 8, onClose, modifiers, closeOnPointerDown, styles, }) {
10
+ const accentText_1 = require("../../Theme/tokens/builders/accentText");
11
+ function ToolTip({ placement = "top", label, children, hasArrow = true, fontSize = "14px", bg, color, isDisabled, overflowOnly = false, isOpen, defaultIsOpen, openDelay = 0, closeDelay = 0, arrowSize = 10, closeOnClick = false, size, width, height, arrowPadding, arrowShadowColor, direction, gutter = 8, onClose, modifiers, closeOnPointerDown, styles, }) {
11
12
  // Measure the child for `overflowOnly`. The hook is always called (Rules of
12
13
  // Hooks) but is fully inert unless `overflowOnly` is set — no layout reads,
13
14
  // no ResizeObserver, no re-renders for ordinary tooltips. Measurement never
14
15
  // runs on hover/scroll, so showing the tooltip stays as cheap as before.
15
16
  const { ref, isTruncated } = (0, useIsTruncated_1.useIsTruncated)(label, overflowOnly && (0, react_1.isValidElement)(children));
16
- // A tooltip is an INVERTED surface: near-black under a light canvas, carrying a white
17
- // label. `sidebar.background` is the only ramp `buildDarkPalette` deliberately leaves
18
- // un-inverted, so it stays near-black in dark mode and the white label stays legible —
19
- // every other surface ramp flips light and would render the label invisible.
17
+ // `sidebar.background` stays near-black in both modes; ink is computed via `onFilled`.
20
18
  const theme = (0, useCustomTheme_1.useCustomTheme)();
21
19
  const surface = theme.colors.sidebar.background[500];
20
+ const resolvedBg = bg !== null && bg !== void 0 ? bg : surface;
21
+ const resolvedColor = color !== null && color !== void 0 ? color : (0, accentText_1.onFilled)(resolvedBg, theme.colors.white, theme.colors.black);
22
22
  let content = children;
23
23
  let effectiveDisabled = isDisabled;
24
24
  if (overflowOnly && (0, react_1.isValidElement)(children)) {
@@ -29,5 +29,5 @@ function ToolTip({ placement = "top", label, children, hasArrow = true, fontSize
29
29
  });
30
30
  effectiveDisabled = Boolean(isDisabled) || !isTruncated;
31
31
  }
32
- return ((0, jsx_runtime_1.jsx)(react_2.Tooltip, { label: label, placement: placement, hasArrow: hasArrow, fontSize: fontSize, bg: bg !== null && bg !== void 0 ? bg : surface, color: color, isDisabled: effectiveDisabled, isOpen: isOpen, defaultIsOpen: defaultIsOpen, openDelay: openDelay, closeDelay: closeDelay, arrowSize: arrowSize, closeOnClick: closeOnClick, size: size, width: width, height: height, arrowPadding: arrowPadding, arrowShadowColor: arrowShadowColor, direction: direction, gutter: gutter, onClose: onClose, modifiers: modifiers, closeOnPointerDown: closeOnPointerDown, style: styles, px: 3, py: 2, borderRadius: "lg", fontWeight: "400", lineHeight: "1.5", maxW: "300px", children: content }));
32
+ return ((0, jsx_runtime_1.jsx)(react_2.Tooltip, { label: label, placement: placement, hasArrow: hasArrow, fontSize: fontSize, bg: resolvedBg, color: resolvedColor, isDisabled: effectiveDisabled, isOpen: isOpen, defaultIsOpen: defaultIsOpen, openDelay: openDelay, closeDelay: closeDelay, arrowSize: arrowSize, closeOnClick: closeOnClick, size: size, width: width, height: height, arrowPadding: arrowPadding, arrowShadowColor: arrowShadowColor, direction: direction, gutter: gutter, onClose: onClose, modifiers: modifiers, closeOnPointerDown: closeOnPointerDown, style: styles, px: 3, py: 2, borderRadius: "lg", fontWeight: "400", lineHeight: "1.5", maxW: "300px", children: content }));
33
33
  }
@@ -1,5 +1,7 @@
1
1
  import { TooltipProps as ChakraTooltip } from "@chakra-ui/react";
2
- export type ToolTipProps = Pick<ChakraTooltip, "placement" | "label" | "hasArrow" | "fontSize" | "bg" | "color" | "isDisabled" | "isOpen" | "defaultIsOpen" | "openDelay" | "closeDelay" | "arrowSize" | "closeOnClick" | "size" | "width" | "height" | "arrowPadding" | "arrowShadowColor" | "direction" | "gutter" | "onClose" | "modifiers" | "closeOnPointerDown"> & {
2
+ export type ToolTipProps = Pick<ChakraTooltip, "placement" | "label" | "hasArrow" | "fontSize" | "isDisabled" | "isOpen" | "defaultIsOpen" | "openDelay" | "closeDelay" | "arrowSize" | "closeOnClick" | "size" | "width" | "height" | "arrowPadding" | "arrowShadowColor" | "direction" | "gutter" | "onClose" | "modifiers" | "closeOnPointerDown"> & {
3
+ bg?: string;
4
+ color?: string;
3
5
  children: React.ReactNode;
4
6
  styles?: React.CSSProperties;
5
7
  /**
@@ -4,6 +4,7 @@ import { Accordion as ChakraAccordian, AccordionItem, AccordionButton, Accordion
4
4
  import { ChevronDown } from "lucide-react";
5
5
  import { useCustomTheme } from "../../Theme/useCustomTheme.js";
6
6
  import { isDarkCanvas } from "../../Theme/tokens/builders/accentText.js";
7
+ import { liftToContrast, AA_NON_TEXT } from "../../Theme/tokens/builders/outlineRung.js";
7
8
  import { getAccordionHoverColors } from "./accordionColors.js";
8
9
  const Accordion = ({ allowMultiple, allowToggle, index, onChange, reduceMotion, items, ...rest }) => {
9
10
  const { colors } = useCustomTheme();
@@ -12,13 +13,14 @@ const Accordion = ({ allowMultiple, allowToggle, index, onChange, reduceMotion,
12
13
  const headingColor = colors.text[800];
13
14
  const bodyColor = colors.text[600];
14
15
  const { expandedBg, softHover } = useMemo(() => getAccordionHoverColors(colors, isDark), [colors, isDark]);
16
+ const focusRing = useMemo(() => liftToContrast(colors.primary[300], colors.background[50], AA_NON_TEXT), [colors]);
15
17
  return (_jsx(ChakraAccordian, { allowMultiple: allowMultiple, allowToggle: allowToggle, index: index, onChange: onChange, reduceMotion: reduceMotion, ...rest, children: items.map((item, idx) => {
16
18
  var _a;
17
19
  return (_jsx(AccordionItem, { border: `0.063rem solid ${border}`, borderRadius: "xl", bg: colors.background[50], mb: 3, overflow: "hidden", transition: "border-color 0.15s ease, box-shadow 0.15s ease", _last: { mb: 0 }, _hover: { borderColor: colors.boxborder[200] }, ...item.itemProps, sx: (_a = item.customStyles) === null || _a === void 0 ? void 0 : _a.itemStyle, children: ({ isExpanded }) => {
18
20
  var _a, _b, _c;
19
21
  return (_jsxs(_Fragment, { children: [_jsx("h2", { children: _jsxs(AccordionButton, { px: 4, py: 3, gap: 3, fontSize: "0.875rem", fontWeight: 600, color: headingColor, bg: isExpanded ? expandedBg : "transparent", transition: "background 0.15s ease", _hover: { bg: isExpanded ? expandedBg : softHover }, _focusVisible: {
20
22
  boxShadow: "none",
21
- outline: `0.125rem solid ${colors.primary[300]}`,
23
+ outline: `0.125rem solid ${focusRing}`,
22
24
  outlineOffset: "-0.125rem",
23
25
  }, ...item.buttonProps, sx: {
24
26
  ...(_a = item.customStyles) === null || _a === void 0 ? void 0 : _a.buttonStyle,
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { forwardRef, memo } from "react";
3
3
  import { Button as ChakraButton } from "@chakra-ui/react";
4
4
  const Button = forwardRef(function Button({ label, children, onClick, opacity, variant = "solid", leftIcon, rightIcon, size, isDisabled = false, isLoading = false, loadingText = "Loading", type, width, w, sx, colorScheme, border, borderRadius, onMouseEnter, onMouseLeave, ...aria }, ref) {
5
- return (_jsx(ChakraButton, { ...aria, type: type, onClick: onClick, width: width || w || "fit-content", variant: variant, size: size, isLoading: isLoading, isDisabled: isDisabled, loadingText: loadingText, leftIcon: leftIcon, rightIcon: rightIcon, ref: ref, colorScheme: colorScheme, sx: sx, opacity: opacity, border: border, borderRadius: borderRadius, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, children: children !== null && children !== void 0 ? children : label }));
5
+ const isIconOnly = !children && !label && !!(leftIcon || rightIcon);
6
+ return (_jsx(ChakraButton, { ...aria, type: type, onClick: onClick, width: width || w || "fit-content", variant: variant, size: size, isLoading: isLoading, isDisabled: isDisabled, loadingText: loadingText, leftIcon: leftIcon, rightIcon: rightIcon, iconSpacing: isIconOnly ? 0 : undefined, ref: ref, colorScheme: colorScheme, sx: sx, opacity: opacity, border: border, borderRadius: borderRadius, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, children: children !== null && children !== void 0 ? children : label }));
6
7
  });
7
8
  export default memo(Button);
@@ -104,22 +104,22 @@ export const Button = {
104
104
  };
105
105
  },
106
106
  outline: ({ theme, colorScheme = "primary" }) => {
107
- const hoverFill = theme.colors[colorScheme][500];
107
+ // Same rung as `solid`'s fill, not raw [500] — keeps hover bg AA-safe for white text.
108
+ const hoverFill = theme.colors[colorScheme][solidRung(theme, colorScheme)];
108
109
  const activeFill = darkerFill(theme, colorScheme, 0);
110
+ const ink = onCanvasText(theme, colorScheme);
109
111
  return {
110
112
  border: "0.1rem solid",
111
- borderColor: theme.colors[colorScheme][500],
112
- color: onCanvasText(theme, colorScheme),
113
+ borderColor: ink,
114
+ color: ink,
113
115
  bg: "transparent",
114
116
  _hover: {
115
117
  bg: hoverFill,
116
118
  borderColor: activeFill,
117
- // Was a hardcoded `theme.colors.white` — fails AA for any colorScheme whose [500]
118
- // doesn't clear white contrast (e.g. emerald/rosewood primary in dark, 3.38/3.46).
119
119
  color: labelFor(theme, hoverFill),
120
120
  _disabled: {
121
121
  // bg: theme.colors[colorScheme][500],
122
- color: onCanvasText(theme, colorScheme),
122
+ color: ink,
123
123
  },
124
124
  },
125
125
  _active: {
@@ -128,7 +128,7 @@ export const Button = {
128
128
  },
129
129
  _loading: {
130
130
  // bg: theme.colors[colorScheme][500],
131
- color: onCanvasText(theme, colorScheme),
131
+ color: ink,
132
132
  },
133
133
  };
134
134
  },