bianic-ui 1.9.0-beta.1 → 1.9.0-beta.2

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 (56) hide show
  1. package/dist/cjs/index.js +229 -45
  2. package/dist/cjs/lib.css +1 -1
  3. package/dist/cjs/types/components/Forms/Dropdown/DropdownContainer.d.ts +14 -0
  4. package/dist/cjs/types/components/Forms/Dropdown/DropdownItem.d.ts +20 -0
  5. package/dist/cjs/types/components/Forms/Dropdown/Example/BasicExample.d.ts +6 -0
  6. package/dist/cjs/types/components/Forms/Dropdown/Example/CheckMenuExample.d.ts +6 -0
  7. package/dist/cjs/types/components/Forms/Dropdown/Example/CheckboxFilterExample.d.ts +6 -0
  8. package/dist/cjs/types/components/Forms/Dropdown/Example/NestedExample.d.ts +6 -0
  9. package/dist/cjs/types/components/Forms/Dropdown/Example/WithValueExample.d.ts +6 -0
  10. package/dist/cjs/types/components/Forms/Dropdown/config.d.ts +9 -0
  11. package/dist/cjs/types/components/Forms/Dropdown/index.d.ts +3 -0
  12. package/dist/cjs/types/components/Forms/LiveSearch/Example/LiveSearchCustomDropdown.d.ts +3 -0
  13. package/dist/cjs/types/components/Forms/LiveSearch/PropsInterface.d.ts +4 -0
  14. package/dist/cjs/types/components/Forms/LiveSearch/index.d.ts +5 -1
  15. package/dist/cjs/types/components/Forms/index.d.ts +1 -0
  16. package/dist/cjs/types/components/Menu/MenuContainer.d.ts +4 -8
  17. package/dist/cjs/types/components/Menu/MenuItem.d.ts +2 -1
  18. package/dist/cjs/types/components/index.d.ts +1 -1
  19. package/dist/cjs/types/stories/Form/Dropdown/BasicExample.stories.d.ts +13 -0
  20. package/dist/cjs/types/stories/Form/Dropdown/DropdownContainer.stories.d.ts +41 -0
  21. package/dist/cjs/types/stories/Form/Dropdown/DropdownItem.stories.d.ts +26 -0
  22. package/dist/cjs/types/stories/Form/Dropdown/NestedExample.stories.d.ts +13 -0
  23. package/dist/cjs/types/stories/Form/Dropdown/SampleTest/CheckMenuExample.stories.d.ts +12 -0
  24. package/dist/cjs/types/stories/Form/Dropdown/SampleTest/CheckboxExample.stories.d.ts +12 -0
  25. package/dist/cjs/types/stories/Form/Dropdown/WithValueExample.stories.d.ts +13 -0
  26. package/dist/cjs/types/stories/Form/LiveSearch/LivesearchCustomDropdownExample.stories.d.ts +12 -0
  27. package/dist/cjs/types/stories/Form/LiveSearch/LivesearchOld.stories.d.ts +12 -0
  28. package/dist/esm/index.js +229 -47
  29. package/dist/esm/lib.css +1 -1
  30. package/dist/esm/types/components/Forms/Dropdown/DropdownContainer.d.ts +14 -0
  31. package/dist/esm/types/components/Forms/Dropdown/DropdownItem.d.ts +20 -0
  32. package/dist/esm/types/components/Forms/Dropdown/Example/BasicExample.d.ts +6 -0
  33. package/dist/esm/types/components/Forms/Dropdown/Example/CheckMenuExample.d.ts +6 -0
  34. package/dist/esm/types/components/Forms/Dropdown/Example/CheckboxFilterExample.d.ts +6 -0
  35. package/dist/esm/types/components/Forms/Dropdown/Example/NestedExample.d.ts +6 -0
  36. package/dist/esm/types/components/Forms/Dropdown/Example/WithValueExample.d.ts +6 -0
  37. package/dist/esm/types/components/Forms/Dropdown/config.d.ts +9 -0
  38. package/dist/esm/types/components/Forms/Dropdown/index.d.ts +3 -0
  39. package/dist/esm/types/components/Forms/LiveSearch/Example/LiveSearchCustomDropdown.d.ts +3 -0
  40. package/dist/esm/types/components/Forms/LiveSearch/PropsInterface.d.ts +4 -0
  41. package/dist/esm/types/components/Forms/LiveSearch/index.d.ts +5 -1
  42. package/dist/esm/types/components/Forms/index.d.ts +1 -0
  43. package/dist/esm/types/components/Menu/MenuContainer.d.ts +4 -8
  44. package/dist/esm/types/components/Menu/MenuItem.d.ts +2 -1
  45. package/dist/esm/types/components/index.d.ts +1 -1
  46. package/dist/esm/types/stories/Form/Dropdown/BasicExample.stories.d.ts +13 -0
  47. package/dist/esm/types/stories/Form/Dropdown/DropdownContainer.stories.d.ts +41 -0
  48. package/dist/esm/types/stories/Form/Dropdown/DropdownItem.stories.d.ts +26 -0
  49. package/dist/esm/types/stories/Form/Dropdown/NestedExample.stories.d.ts +13 -0
  50. package/dist/esm/types/stories/Form/Dropdown/SampleTest/CheckMenuExample.stories.d.ts +12 -0
  51. package/dist/esm/types/stories/Form/Dropdown/SampleTest/CheckboxExample.stories.d.ts +12 -0
  52. package/dist/esm/types/stories/Form/Dropdown/WithValueExample.stories.d.ts +13 -0
  53. package/dist/esm/types/stories/Form/LiveSearch/LivesearchCustomDropdownExample.stories.d.ts +12 -0
  54. package/dist/esm/types/stories/Form/LiveSearch/LivesearchOld.stories.d.ts +12 -0
  55. package/dist/index.d.ts +43 -11
  56. package/package.json +1 -1
package/dist/cjs/index.js CHANGED
@@ -412,7 +412,7 @@ var radiusConfig$1 = {
412
412
  tn: 'rounded-radius-full focus-visible:rounded-radius-full',
413
413
  },
414
414
  };
415
- var sizeConfig$c = {
415
+ var sizeConfig$d = {
416
416
  lg: 'py-[10.5px] h-[48px] flex items-center justify-center gap-[10px] text-size-md ',
417
417
  md: 'py-[9px] h-[40px] flex items-center justify-center gap-[5px] text-size-base ',
418
418
  sm: 'py-[6px] h-[30px] flex items-center justify-center gap-[5px] text-size-sm ',
@@ -490,10 +490,10 @@ function Button(_a) {
490
490
  }
491
491
  var sizingRules;
492
492
  if (variant.includes('link')) {
493
- sizingRules = "".concat(sizeConfig$c[validatedSize]);
493
+ sizingRules = "".concat(sizeConfig$d[validatedSize]);
494
494
  }
495
495
  else {
496
- sizingRules = "".concat(sizeConfig$c[validatedSize], " ").concat(sidePaddingConfig[validatedSize]);
496
+ sizingRules = "".concat(sizeConfig$d[validatedSize], " ").concat(sidePaddingConfig[validatedSize]);
497
497
  }
498
498
  var sizeClass = label || variant === 'form-group'
499
499
  ? " ".concat(minWidthRules, " ").concat(sizingRules)
@@ -1481,15 +1481,15 @@ var colorConfig$1 = {
1481
1481
  active: 'bg-bia-verdantgreen-dark-40 text-primary-white',
1482
1482
  },
1483
1483
  blue: {
1484
- default: 'bg-bia-olympicblue hover:bg-bia-olympicblue-dark-10 active:bg-bia-olympicblue-dark-40 text-primary-white disabled:bg-bia-olympicblue disabled:text-primary-white/50 disabled:cursor-default',
1485
- active: 'bg-bia-olympicblue-dark-40 text-primary-white',
1484
+ default: 'bg-bia-olympicblue hover:bg-bia-olympicblue-light-10 active:bg-bia-olympicblue-dark-10 text-primary-white disabled:bg-bia-olympicblue-dark-20 disabled:text-primary-white/50 disabled:cursor-default',
1485
+ active: 'bg-bia-olympicblue-dark-10 text-primary-white',
1486
1486
  },
1487
1487
  };
1488
1488
 
1489
1489
  var ButtonApp = function (_a) {
1490
1490
  _a.icon; _a.isNotified; var _c = _a.isActive, isActive = _c === void 0 ? false : _c, disabled = _a.disabled, _d = _a.color, color = _d === void 0 ? 'green' : _d, label = _a.label, extended = _a.extended, rest = __rest(_a, ["icon", "isNotified", "isActive", "disabled", "color", "label", "extended"]);
1491
1491
  var buttonState = isActive ? 'active' : 'default';
1492
- return (React.createElement("button", __assign({ className: "button-app px-[10px] pb-[8.8px] pt-[8px] font-arial text-size-tiny ".concat(colorConfig$1[color][buttonState], " ").concat(extended), type: "button", disabled: disabled }, rest), label));
1492
+ return (React.createElement("button", __assign({ className: "button-app flex items-center justify-center px-[10px] pb-[8.3px] pt-[8.5px] font-arial text-size-tiny ".concat(colorConfig$1[color][buttonState], " ").concat(extended), type: "button", disabled: disabled }, rest), label));
1493
1493
  };
1494
1494
 
1495
1495
  var textColorConfig = {
@@ -1718,46 +1718,72 @@ var TreeItem = function (_a) {
1718
1718
  })))));
1719
1719
  };
1720
1720
 
1721
- function MenuContainer(_a) {
1722
- var _b = _a.isTopFlat, isTopFlat = _b === void 0 ? false : _b, children = _a.children, _c = _a.open, open = _c === void 0 ? true : _c, _d = _a.onClose, onClose = _d === void 0 ? function () { } : _d, _e = _a.className, className = _e === void 0 ? '' : _e, _f = _a.isWithOverlay, isWithOverlay = _f === void 0 ? true : _f;
1721
+ var MenuContainer = React.forwardRef(function MenuContainer(propsComp, ref) {
1722
+ var _a = propsComp.isTopFlat, isTopFlat = _a === void 0 ? false : _a, children = propsComp.children, _b = propsComp.open, open = _b === void 0 ? true : _b, _c = propsComp.onClose, onClose = _c === void 0 ? function () { } : _c, _d = propsComp.className, className = _d === void 0 ? '' : _d, _e = propsComp.isWithOverlay, isWithOverlay = _e === void 0 ? true : _e, _f = propsComp.zIndex, zIndex = _f === void 0 ? 0 : _f, restProps = __rest(propsComp, ["isTopFlat", "children", "open", "onClose", "className", "isWithOverlay", "zIndex"]);
1723
1723
  var radiusClass = "rounded-b-radius-sm ".concat(!isTopFlat && 'rounded-t-radius-sm');
1724
1724
  return (open && (React.createElement(React.Fragment, null,
1725
1725
  isWithOverlay && (React.createElement("div", { className: "bianic-menu-overlay fixed left-0 top-0 z-0 h-screen w-screen", onClick: function () { return onClose(); } })),
1726
- React.createElement("div", { className: "w-fit bg-bia-white shadow-[0px_3px_20px_0px_rgba(0,0,0,0.20)] ".concat(radiusClass, " ").concat(className) }, React.Children.map(children, function (child) {
1726
+ React.createElement("div", __assign({ className: "w-fit bg-bia-white shadow-[0px_3px_20px_0px_rgba(0,0,0,0.20)] ".concat(radiusClass, " ").concat(className), ref: ref, style: {
1727
+ zIndex: zIndex,
1728
+ } }, restProps), React.Children.map(children, function (child) {
1727
1729
  return React.isValidElement(child)
1728
1730
  ? // Kirimkan handleItemClick sebagai props onClick ke setiap MenuItem
1729
- React.cloneElement(child, { onClose: function () { return onClose(); } })
1731
+ React.cloneElement(child, {
1732
+ onClose: function () { return onClose(); },
1733
+ zIndex: zIndex,
1734
+ })
1730
1735
  : child;
1731
1736
  })))));
1732
- }
1737
+ });
1733
1738
  MenuContainer.defaultProps = {
1734
1739
  isTopFlat: false,
1735
1740
  };
1736
1741
 
1737
1742
  function MenuItem(_a) {
1738
- var _b = _a.className, className = _b === void 0 ? '' : _b, label = _a.label, _c = _a.onClick, onClick = _c === void 0 ? function () { } : _c, _d = _a.caption, caption = _d === void 0 ? undefined : _d, _e = _a.isChecked, isChecked = _e === void 0 ? undefined : _e, _f = _a.onClose, onClose = _f === void 0 ? function () { } : _f, children = _a.children, props = __rest(_a, ["className", "label", "onClick", "caption", "isChecked", "onClose", "children"]);
1739
- var _g = React.useState(false), isHovered = _g[0], setIsHovered = _g[1];
1743
+ var _b = _a.className, className = _b === void 0 ? '' : _b, label = _a.label, _c = _a.onClick, onClick = _c === void 0 ? function () { } : _c, _d = _a.caption, caption = _d === void 0 ? undefined : _d, _e = _a.isChecked, isChecked = _e === void 0 ? undefined : _e, _f = _a.onClose, onClose = _f === void 0 ? function () { } : _f, children = _a.children, _g = _a.zIndex, zIndex = _g === void 0 ? 0 : _g, props = __rest(_a, ["className", "label", "onClick", "caption", "isChecked", "onClose", "children", "zIndex"]);
1744
+ var _h = React.useState(false), isHovered = _h[0], setIsHovered = _h[1];
1745
+ var _j = React.useState(false), isLeft = _j[0], setIsLeft = _j[1];
1740
1746
  var isWithChecked = isChecked !== undefined;
1741
1747
  var leftPadding = isWithChecked ? 'pl-[5px]' : 'pl-[10px]';
1742
1748
  var rightPadding = caption || children ? 'pr-[5px]' : 'pr-[10px]';
1743
1749
  var itemClass = "".concat(leftPadding, " ").concat(rightPadding, " ").concat(className);
1744
- return (React.createElement("div", { className: "group/main relative cursor-pointer first:rounded-t-radius-sm first:pt-[6px] last:rounded-b-radius-sm last:pb-[6px] ".concat(!isHovered && 'z-10'), onMouseEnter: function () { return setIsHovered(true); }, onMouseLeave: function () { return setIsHovered(false); } },
1745
- React.createElement("div", __assign({ className: "relative z-10 flex items-center py-[5px] hover:bg-bia-blue-pastel ".concat(itemClass), role: "button", tabIndex: 0, onClick: function (e) {
1750
+ var MenuContRef = React.useRef(null);
1751
+ React.useEffect(function () {
1752
+ var _a;
1753
+ if (MenuContRef.current) {
1754
+ // Adjust dropdown position to prevent overflow on the right.
1755
+ var MenuContRect = (_a = MenuContRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
1756
+ var RectRight = MenuContRect === null || MenuContRect === void 0 ? void 0 : MenuContRect.right;
1757
+ var innerWindow = window.innerWidth;
1758
+ if (RectRight > innerWindow)
1759
+ setIsLeft(true);
1760
+ else
1761
+ setIsLeft(false);
1762
+ }
1763
+ }, [isHovered]);
1764
+ var translateClass = isLeft
1765
+ ? 'left-0 -translate-x-full'
1766
+ : 'right-0 translate-x-full';
1767
+ var currentZIndex = zIndex + 10;
1768
+ return (React.createElement("div", { className: "group/main relative cursor-pointer first:rounded-t-radius-sm first:pt-[6px] last:rounded-b-radius-sm last:pb-[6px]", onMouseEnter: function () { return setIsHovered(true); }, onMouseLeave: function () { return setIsHovered(false); } },
1769
+ React.createElement("div", __assign({ className: "relative flex items-center py-[5px] hover:bg-bia-blue-pastel ".concat(itemClass), role: "button", tabIndex: 0, onClick: function (e) {
1746
1770
  onClick(e);
1747
- }, onKeyDown: function () { } }, props),
1771
+ }, onKeyDown: function () { }, style: {
1772
+ zIndex: isHovered ? currentZIndex : 0,
1773
+ } }, props),
1748
1774
  isWithChecked && (React.createElement("div", { className: "mr-[5px] aspect-square w-[14px]" }, isChecked && React.createElement(TbCheck, { className: "text-primary-black", size: 14 }))),
1749
1775
  React.createElement("span", { className: "whitespace-nowrap font-arial text-[11px] text-bia-black" }, label),
1750
1776
  React.createElement("div", { className: "ml-auto flex items-center" },
1751
1777
  children && (React.createElement(TbChevronRight, { className: "ml-[10px] text-bia-coolgrey" })),
1752
1778
  children === undefined && caption && (React.createElement("span", { className: "ml-[30px] whitespace-nowrap text-[11px] text-bia-coolgrey" }, caption)))),
1753
- children && (React.createElement(MenuContainer, { open: isHovered, onClose: onClose, className: "absolute right-0 top-0 translate-x-full bg-primary-white shadow-[0px_3px_20px_0px_rgba(0,0,0,0.20)] group-first/main:top-[6px]" }, children))));
1779
+ children && (React.createElement(MenuContainer, { open: isHovered, onClose: onClose, className: "absolute top-0 bg-primary-white shadow-[0px_3px_20px_0px_rgba(0,0,0,0.20)] group-first/main:top-[6px] ".concat(translateClass), ref: MenuContRef, zIndex: currentZIndex }, children))));
1754
1780
  }
1755
1781
  MenuItem.defaultProps = {
1756
1782
  className: '',
1757
1783
  onClick: function () { },
1758
1784
  };
1759
1785
 
1760
- var sizeConfig$b = {
1786
+ var sizeConfig$c = {
1761
1787
  md: {
1762
1788
  fieldSize: 'text-size-base p-2.5 font-[350] h-10',
1763
1789
  iconPosition: 'right-[10px]',
@@ -1818,8 +1844,8 @@ function TextInput(_a) {
1818
1844
  var _r = React.useState(false), isShow = _r[0], setIsShow = _r[1];
1819
1845
  var _s = styleConfig[variant], fieldStyle = _s.fieldStyle, iconStyle = _s.iconStyle;
1820
1846
  var _t = isTransparent
1821
- ? __assign(__assign({}, sizeConfig$b[size]), { iconPosition: "right-0 ", fieldSize: sizeConfig$b[size].fieldSize +
1822
- " pe-[".concat(9 + sizeConfig$b[size].iconSize, "px]") }) : sizeConfig$b[size], iconSize = _t.iconSize, fieldSize = _t.fieldSize, iconPosition = _t.iconPosition;
1847
+ ? __assign(__assign({}, sizeConfig$c[size]), { iconPosition: "right-0 ", fieldSize: sizeConfig$c[size].fieldSize +
1848
+ " pe-[".concat(9 + sizeConfig$c[size].iconSize, "px]") }) : sizeConfig$c[size], iconSize = _t.iconSize, fieldSize = _t.fieldSize, iconPosition = _t.iconPosition;
1823
1849
  var borderStyle = isTransparent
1824
1850
  ? 'border-transparent bg-transparent' // customize border rule for transparent variant
1825
1851
  : 'border border-bia-grey-dark-10 bg-primary-white';
@@ -1883,7 +1909,7 @@ TextInput.defaultProps = {
1883
1909
  };
1884
1910
 
1885
1911
  // Desc: Radio button size configuration
1886
- var sizeConfig$a = {
1912
+ var sizeConfig$b = {
1887
1913
  md: {
1888
1914
  checkSize: 'w-[22px] h-[22px]',
1889
1915
  labelSize: 'text-size-base',
@@ -1898,7 +1924,7 @@ var sizeUnion$4 = ['md', 'sm'];
1898
1924
  function Radio(_a) {
1899
1925
  var label = _a.label, _b = _a.size, size = _b === void 0 ? 'md' : _b, id = _a.id, _c = _a.onClick, onClick = _c === void 0 ? function () { } : _c, _d = _a.disabled, disabled = _d === void 0 ? false : _d, _e = _a.checked, checked = _e === void 0 ? false : _e;
1900
1926
  var validatedSize = validUnion(size, sizeUnion$4);
1901
- var _f = sizeConfig$a[validatedSize], checkSize = _f.checkSize, labelSize = _f.labelSize;
1927
+ var _f = sizeConfig$b[validatedSize], checkSize = _f.checkSize, labelSize = _f.labelSize;
1902
1928
  return (React.createElement("div", { className: "flex items-center" },
1903
1929
  React.createElement("div", { className: "bg-white rounded-full flex flex-shrink-0 justify-center items-center relative ".concat(checkSize) },
1904
1930
  React.createElement("input", { id: id, "aria-labelledby": "label1", type: "radio", className: "peer checkbox box-content appearance-none focus:opacity-100 focus:ring-1 focus:ring-offset-2 checked:disabled:border-bia-blue-disabled focus:ring-bia-blue focus:outline-none rounded-full border-bia-coolgrey-light-50 checked:border-bia-blue hover:border-bia-blue-hover disabled:border-bia-grey-dark-10 border-2 absolute cursor-pointer w-full h-full", onClick: function (e) { return onClick(e); }, checked: checked, disabled: disabled }),
@@ -1914,7 +1940,7 @@ Radio.defaultProps = {
1914
1940
  checked: false,
1915
1941
  };
1916
1942
 
1917
- var sizeConfig$9 = {
1943
+ var sizeConfig$a = {
1918
1944
  md: {
1919
1945
  inputClass: 'text-size-base font-[350] min-h-10',
1920
1946
  },
@@ -1937,7 +1963,7 @@ var ResizeIcon = function (_a) {
1937
1963
  function TextArea(_a) {
1938
1964
  var descText = _a.descText, _b = _a.disabled, disabled = _b === void 0 ? false : _b, id = _a.id, _c = _a.size, size = _c === void 0 ? 'md' : _c, label = _a.label, _d = _a.placeholder, placeholder = _d === void 0 ? '' : _d, required = _a.required, rows = _a.rows, _e = _a.maxLength, maxLength = _e === void 0 ? undefined : _e, value = _a.value, _f = _a.readOnly, readOnly = _f === void 0 ? false : _f, _g = _a.autoComplete, autoComplete = _g === void 0 ? 'off' : _g, props = __rest(_a, ["descText", "disabled", "id", "size", "label", "placeholder", "required", "rows", "maxLength", "value", "readOnly", "autoComplete"]);
1939
1965
  var inputRow = rows !== null && rows !== void 0 ? rows : 4;
1940
- var inputClass = sizeConfig$9[size].inputClass;
1966
+ var inputClass = sizeConfig$a[size].inputClass;
1941
1967
  var remainWords = maxLength ? maxLength - (value ? value.length : 0) : 0;
1942
1968
  return (React.createElement("div", { className: "field-group flex w-full flex-col" },
1943
1969
  React.createElement("label", { htmlFor: id, className: "label pb-2 text-xs font-semibold read-only:pointer-events-none" },
@@ -1967,7 +1993,7 @@ TextArea.defaultProps = {
1967
1993
  value: '',
1968
1994
  };
1969
1995
 
1970
- var sizeConfig$8 = {
1996
+ var sizeConfig$9 = {
1971
1997
  md: {
1972
1998
  checkClass: 'w-[22px] h-[22px]',
1973
1999
  labelClass: 'text-size-base font-[350]',
@@ -1981,7 +2007,7 @@ var sizeConfig$8 = {
1981
2007
  var sizeUnion$3 = ['md', 'sm'];
1982
2008
  function Checkbox(_a) {
1983
2009
  var _b = _a.disabled, disabled = _b === void 0 ? false : _b, id = _a.id, _c = _a.size, size = _c === void 0 ? 'md' : _c, label = _a.label, _d = _a.onChange, onChange = _d === void 0 ? function () { } : _d, props = __rest(_a, ["disabled", "id", "size", "label", "onChange"]);
1984
- var _e = sizeConfig$8[validUnion(size, sizeUnion$3)], checkClass = _e.checkClass, labelClass = _e.labelClass;
2010
+ var _e = sizeConfig$9[validUnion(size, sizeUnion$3)], checkClass = _e.checkClass, labelClass = _e.labelClass;
1985
2011
  return (React.createElement("div", { className: "flex items-center" },
1986
2012
  React.createElement("div", { className: "relative flex flex-shrink-0 items-center justify-center rounded-full bg-white ".concat(checkClass) },
1987
2013
  React.createElement("input", __assign({ id: id, type: "checkbox", className: "checkbox peer absolute box-content h-full w-full cursor-pointer appearance-none rounded-full border-2 border-bia-coolgrey-light-50 checked:border-bia-blue hover:border-bia-blue-hover focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-bia-blue focus-visible:ring-offset-2 disabled:border-bia-coolgrey-light-50 disabled:checked:border-bia-blue-light-50", onChange: function (e) { return onChange(e); }, disabled: disabled }, props)),
@@ -1999,7 +2025,7 @@ Checkbox.defaultProps = {
1999
2025
  onChange: function () { },
2000
2026
  };
2001
2027
 
2002
- var sizeConfig$7 = {
2028
+ var sizeConfig$8 = {
2003
2029
  md: {
2004
2030
  searchSize: 'text-size-base p-2.5 font-[350] h-10',
2005
2031
  iconSize: 'right-[10px] text-[18px]',
@@ -2010,7 +2036,7 @@ var sizeConfig$7 = {
2010
2036
  },
2011
2037
  };
2012
2038
 
2013
- var sizeConfig$6 = {
2039
+ var sizeConfig$7 = {
2014
2040
  md: {
2015
2041
  container: 'text-size-base font-[350] py-[3px] first:pt-[8px] last:pb-[8px]',
2016
2042
  item: 'min-h-[34px] p-2.5',
@@ -2028,7 +2054,7 @@ function CustomDropdownItem(_a) {
2028
2054
  var _f = React.useState(false), isHoveredSubMenu = _f[0], setIsHoveredSubMenu = _f[1];
2029
2055
  var isOpenDropdown = isHovered || isHoveredSubMenu;
2030
2056
  var selectedClass = isSelected ? 'font-semibold' : 'font-normal';
2031
- var _g = sizeConfig$6[size], containerClass = _g.container, item = _g.item;
2057
+ var _g = sizeConfig$7[size], containerClass = _g.container, item = _g.item;
2032
2058
  var itemClass = "".concat(item, " ").concat(selectedClass, " ").concat(className);
2033
2059
  var isExistSubDropdown = options.length !== 0;
2034
2060
  return (React.createElement("div", { className: "relative w-full focus-visible:outline-bia-blue-light-50 ".concat(containerClass), tabIndex: 0, role: "button", onClick: function (e) { return onClick(e); }, onMouseEnter: function () { return setisHovered(true); }, onMouseLeave: function () { return setisHovered(false); }, onKeyDown: function () { } },
@@ -2055,7 +2081,7 @@ function DefaultDropdownItem(_a) {
2055
2081
  var _g = React.useState(false), isHoveredSubMenu = _g[0], setIsHoveredSubMenu = _g[1];
2056
2082
  var isOpenDropdown = isHovered || isHoveredSubMenu;
2057
2083
  var selectedClass = isSelected ? 'font-semibold' : 'font-normal';
2058
- var _h = sizeConfig$6[size], containerClass = _h.container, item = _h.item;
2084
+ var _h = sizeConfig$7[size], containerClass = _h.container, item = _h.item;
2059
2085
  var itemClass = "".concat(item, " ").concat(selectedClass, " ").concat(className);
2060
2086
  var isExistSubDropdown = options.length !== 0;
2061
2087
  return (React.createElement("div", { className: "relative w-full focus-visible:outline-bia-blue-light-50 ".concat(containerClass), tabIndex: 0, role: "button", onClick: function (e) { return onClick(e); }, onMouseEnter: function () { return setisHovered(true); }, onMouseLeave: function () { return setisHovered(false); }, onKeyDown: function () { } },
@@ -2082,7 +2108,7 @@ function SelectInput(_a) {
2082
2108
  var descText = _a.descText, _b = _a.disabled, disabled = _b === void 0 ? false : _b, _c = _a.size, size = _c === void 0 ? 'md' : _c, id = _a.id, label = _a.label, options = _a.options, _d = _a.required, required = _d === void 0 ? false : _d, selected = _a.selected, setSelected = _a.setSelected, _e = _a.onClickDropdown, onClickDropdown = _e === void 0 ? function () { } : _e, props = __rest(_a, ["descText", "disabled", "size", "id", "label", "options", "required", "selected", "setSelected", "onClickDropdown"]);
2083
2109
  var _f = React.useState(false), isOpen = _f[0], setIsOpen = _f[1];
2084
2110
  var validatedSize = validUnion(size, sizeUnion$2);
2085
- var _g = sizeConfig$7[validatedSize], searchSize = _g.searchSize, iconSize = _g.iconSize;
2111
+ var _g = sizeConfig$8[validatedSize], searchSize = _g.searchSize, iconSize = _g.iconSize;
2086
2112
  var inputRef = React.useRef(null);
2087
2113
  var handleOutsideClick = function (e) {
2088
2114
  if (inputRef.current && !inputRef.current.contains(e.target)) {
@@ -2146,7 +2172,7 @@ SelectInput.defaultProps = {
2146
2172
  setSelected: function () { },
2147
2173
  };
2148
2174
 
2149
- var sizeConfig$5 = {
2175
+ var sizeConfig$6 = {
2150
2176
  md: {
2151
2177
  iconClass: 'right-[10px]',
2152
2178
  iconSize: '18',
@@ -2161,11 +2187,89 @@ var sizeConfig$5 = {
2161
2187
  },
2162
2188
  };
2163
2189
 
2164
- /* eslint-disable @typescript-eslint/no-explicit-any */
2190
+ var sizeConfig$5 = {
2191
+ sm: 'min-w-[72px]',
2192
+ md: 'min-w-[96px]',
2193
+ };
2194
+ var fontConfig = {
2195
+ sm: 'text-[12px] font-[400]',
2196
+ md: 'text-[14px] font-[350]',
2197
+ };
2198
+
2199
+ var DropdownContainer = React.forwardRef(function DropdownContainer(propsComp, ref) {
2200
+ var _a = propsComp.isTopFlat, isTopFlat = _a === void 0 ? false : _a, children = propsComp.children, _b = propsComp.open, open = _b === void 0 ? true : _b, _c = propsComp.onClose, onClose = _c === void 0 ? function () { } : _c, _d = propsComp.className, className = _d === void 0 ? '' : _d, _e = propsComp.isWithOverlay, isWithOverlay = _e === void 0 ? true : _e, _f = propsComp.size, size = _f === void 0 ? 'md' : _f, _g = propsComp.onClickItem, onClickItem = _g === void 0 ? function () { } : _g, _h = propsComp.zIndex, zIndex = _h === void 0 ? 0 : _h, restProps = __rest(propsComp, ["isTopFlat", "children", "open", "onClose", "className", "isWithOverlay", "size", "onClickItem", "zIndex"]);
2201
+ var radiusClass = "rounded-b-radius-sm ".concat(!isTopFlat && 'rounded-t-radius-sm');
2202
+ var sizeClass = sizeConfig$5[size] || sizeConfig$5['md'];
2203
+ var containerClass = "".concat(sizeClass, " ").concat(radiusClass, " ").concat(className);
2204
+ var handleClickDrpdownItem = function (e, val) {
2205
+ onClickItem(e, val);
2206
+ onClose();
2207
+ };
2208
+ return (open && (React.createElement(React.Fragment, null,
2209
+ isWithOverlay && (React.createElement("div", { className: "bianic-dropdown-overlay fixed left-0 top-0 z-0 h-screen w-screen", onClick: function () { return onClose(); } })),
2210
+ React.createElement("div", __assign({ style: {
2211
+ zIndex: zIndex,
2212
+ }, ref: ref, className: "bianic-dropdown-container bg-bia-white shadow-[0px_3px_20px_0px_rgba(0,0,0,0.20)] ".concat(containerClass) }, restProps), React.Children.map(children, function (child) {
2213
+ return React.isValidElement(child)
2214
+ ? // Kirimkan handleItemClick sebagai props onClick ke setiap DropdownItem
2215
+ React.cloneElement(child, {
2216
+ onClose: function () { return onClose(); },
2217
+ size: size,
2218
+ onClickItem: function (e, val) { return handleClickDrpdownItem(e, val); },
2219
+ zIndex: zIndex,
2220
+ })
2221
+ : child;
2222
+ })))));
2223
+ });
2224
+ DropdownContainer.defaultProps = {
2225
+ isTopFlat: false,
2226
+ };
2227
+
2228
+ function DropdownItem(_a) {
2229
+ var children = _a.children, _b = _a.className, className = _b === void 0 ? '' : _b, _c = _a.onClickItem, onClickItem = _c === void 0 ? function () { } : _c, _d = _a.onClose, onClose = _d === void 0 ? function () { } : _d, _e = _a.size, size = _e === void 0 ? 'md' : _e, _f = _a.value, value = _f === void 0 ? '' : _f, content = _a.content, _g = _a.disabled, disabled = _g === void 0 ? false : _g, _h = _a.zIndex, zIndex = _h === void 0 ? 0 : _h, props = __rest(_a, ["children", "className", "onClickItem", "onClose", "size", "value", "content", "disabled", "zIndex"]);
2230
+ var _j = React.useState(false), isHovered = _j[0], setIsHovered = _j[1];
2231
+ var _k = React.useState(false), isLeft = _k[0], setIsLeft = _k[1];
2232
+ var fontClass = fontConfig[size] || fontConfig['md'];
2233
+ var itemClass = "".concat(fontClass, " ").concat(className);
2234
+ var chevronSize = size === 'sm' ? 14 : 18;
2235
+ var DropdownContRef = React.useRef(null);
2236
+ React.useEffect(function () {
2237
+ var _a;
2238
+ if (DropdownContRef.current) {
2239
+ // Adjust dropdown position to prevent overflow on the right.
2240
+ var MenuContRect = (_a = DropdownContRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
2241
+ var RectRight = MenuContRect === null || MenuContRect === void 0 ? void 0 : MenuContRect.right;
2242
+ var innerWindow = window.innerWidth;
2243
+ if (RectRight > innerWindow)
2244
+ setIsLeft(true);
2245
+ else
2246
+ setIsLeft(false);
2247
+ }
2248
+ }, [isHovered]);
2249
+ var translateClass = isLeft
2250
+ ? 'left-0 -translate-x-full'
2251
+ : 'right-0 translate-x-full';
2252
+ var currentZIndex = zIndex + 10;
2253
+ return (React.createElement("div", { className: "bianic-dropdown-item group/main relative cursor-pointer first:rounded-t-radius-sm first:pt-[6px] last:rounded-b-radius-sm last:pb-[6px]", onMouseEnter: function () { return setIsHovered(true); }, onMouseLeave: function () { return setIsHovered(false); } },
2254
+ React.createElement("button", __assign({ className: "relative flex h-full w-full !min-w-fit items-center justify-start whitespace-nowrap px-[15px] py-[5px] text-left text-bia-black disabled:cursor-not-allowed disabled:text-bia-coolgrey-light-50 hover:[&:not(:disabled)]:bg-bia-blue-pastel ".concat(itemClass), style: {
2255
+ zIndex: isHovered ? currentZIndex : 0,
2256
+ }, onClick: function (e) {
2257
+ onClickItem(e, value);
2258
+ }, onKeyDown: function () { }, disabled: disabled, type: "button" }, props),
2259
+ content,
2260
+ React.createElement("div", { className: "ml-auto flex items-center" }, children && (React.createElement(TbChevronRight, { className: "ml-[10px] text-bia-coolgrey", size: chevronSize })))),
2261
+ children && (React.createElement(DropdownContainer, { className: "absolute top-0 bg-primary-white shadow-[0px_3px_20px_0px_rgba(0,0,0,0.20)] group-first/main:top-[6px] ".concat(translateClass), onClose: onClose, open: isHovered, onClickItem: function (e, value) { return onClickItem(e, value); }, size: size, ref: DropdownContRef, zIndex: currentZIndex }, children))));
2262
+ }
2263
+ DropdownItem.defaultProps = {
2264
+ className: '',
2265
+ onClickItem: function () { },
2266
+ };
2267
+
2165
2268
  function LiveSearch(_a) {
2166
- var descText = _a.descText, _b = _a.disabled, disabled = _b === void 0 ? false : _b, id = _a.id, _c = _a.size, size = _c === void 0 ? 'md' : _c, label = _a.label, placeholder = _a.placeholder, _d = _a.required, required = _d === void 0 ? false : _d, options = _a.options, setValue = _a.setValue, value = _a.value, _e = _a.readOnly, readOnly = _e === void 0 ? false : _e, _f = _a.onChangeText, onChangeText = _f === void 0 ? function () { } : _f, _g = _a.onClickDropdown, onClickDropdown = _g === void 0 ? function () { } : _g, _h = _a.autoComplete, autoComplete = _h === void 0 ? 'off' : _h;
2167
- var _j = React.useState(false), isOpen = _j[0], setIsOpen = _j[1];
2168
- var _k = sizeConfig$5[size], iconClass = _k.iconClass, iconSize = _k.iconSize, inputClass = _k.inputClass;
2269
+ var descText = _a.descText, _b = _a.disabled, disabled = _b === void 0 ? false : _b, id = _a.id, _c = _a.size, size = _c === void 0 ? 'md' : _c, label = _a.label, placeholder = _a.placeholder, _d = _a.required, required = _d === void 0 ? false : _d, options = _a.options, setValue = _a.setValue, value = _a.value, _e = _a.readOnly, readOnly = _e === void 0 ? false : _e, _f = _a.onChangeText, onChangeText = _f === void 0 ? function () { } : _f, _g = _a.onClickDropdown, onClickDropdown = _g === void 0 ? function () { } : _g, _h = _a.autoComplete, autoComplete = _h === void 0 ? 'off' : _h, _j = _a.children, children = _j === void 0 ? undefined : _j, _k = _a.dropdownClassName, dropdownClassName = _k === void 0 ? '' : _k, _l = _a.dropContProps, dropContProps = _l === void 0 ? undefined : _l;
2270
+ var _m = React.useState(false), isOpen = _m[0], setIsOpen = _m[1];
2271
+ var _o = React.useState(value.label || ''), searchTerm = _o[0], setSearchTerm = _o[1];
2272
+ var _p = sizeConfig$6[size], iconClass = _p.iconClass, iconSize = _p.iconSize, inputClass = _p.inputClass;
2169
2273
  var inputRef = React.useRef(null);
2170
2274
  var handleOutsideClick = function (e) {
2171
2275
  if (inputRef.current && !inputRef.current.contains(e.target)) {
@@ -2178,30 +2282,108 @@ function LiveSearch(_a) {
2178
2282
  document.removeEventListener('mousedown', handleOutsideClick);
2179
2283
  };
2180
2284
  });
2285
+ // Synchronize internal searchTerm with external value prop
2286
+ React.useEffect(function () {
2287
+ // Only update searchTerm if the label from the value prop differs from the current searchTerm
2288
+ // This prevents infinite loops if searchTerm is already the same as value.label
2289
+ if (value.label !== searchTerm) {
2290
+ setSearchTerm(value.label || '');
2291
+ }
2292
+ }, [value.label, searchTerm]);
2181
2293
  var filteredOptions = options.filter(function (item) {
2182
2294
  return item.label.toLowerCase().includes(value.label.toLowerCase());
2183
2295
  });
2184
- return (React.createElement("div", { className: "field-group flex w-full flex-col gap-y-2", ref: inputRef },
2185
- React.createElement("label", { htmlFor: id, className: "label text-xs font-semibold read-only:pointer-events-none" },
2296
+ var handleInputChange = function (e) {
2297
+ var newSearchTerm = e.target.value;
2298
+ setSearchTerm(newSearchTerm);
2299
+ setIsOpen(true); // Ensure dropdown opens when typing
2300
+ };
2301
+ var handleDropdownItemClick = React.useCallback(function (clickedValue) {
2302
+ setSearchTerm(clickedValue.label); // Set input text to the selected label
2303
+ setValue(clickedValue); // Update the value in the parent
2304
+ setIsOpen(false);
2305
+ }, [setValue]);
2306
+ // Recursive function to filter and clone DropdownItems, including nested items
2307
+ var processDropdownChildren = function (nodes, currentSearchTerm, includeAllIfNoSearch) {
2308
+ return React.Children.map(nodes, function (child) {
2309
+ if (!React.isValidElement(child) || child.type !== DropdownItem) {
2310
+ return child; // Render non-DropdownItem or other elements as is
2311
+ }
2312
+ var itemProps = child.props; // Cast to any to access props
2313
+ var itemValue = itemProps.value;
2314
+ var isDisabled = itemProps.disabled;
2315
+ // Filter based on searchTerm only if searchTerm is present
2316
+ if (currentSearchTerm &&
2317
+ !itemValue.toLowerCase().includes(currentSearchTerm.toLowerCase())) {
2318
+ return null; // Do not render if it doesn't match
2319
+ }
2320
+ // If includeAllIfNoSearch is true (when searchTerm is empty), do not filter.
2321
+ // If includeAllIfNoSearch is false (when searchTerm is present), filtering has been done above.
2322
+ // Clone its children recursively if any
2323
+ var clonedChildren = itemProps.children
2324
+ ? processDropdownChildren(itemProps.children, currentSearchTerm)
2325
+ : null;
2326
+ // Clone the DropdownItem to inject the onClick prop
2327
+ return React.cloneElement(child, {
2328
+ onClick: function (e) {
2329
+ if (!isDisabled) {
2330
+ handleDropdownItemClick({
2331
+ id: itemValue,
2332
+ label: itemValue,
2333
+ });
2334
+ }
2335
+ if (dropContProps === null || dropContProps === void 0 ? void 0 : dropContProps.onClickItem) {
2336
+ dropContProps.onClickItem(e, itemValue);
2337
+ }
2338
+ },
2339
+ children: clonedChildren, // Ensure processed children are also cloned
2340
+ });
2341
+ });
2342
+ };
2343
+ // Determine which children to display
2344
+ var renderedChildren = null;
2345
+ var hasFilteredResults = false;
2346
+ if (searchTerm) {
2347
+ // If there's a searchTerm, filter children
2348
+ renderedChildren = processDropdownChildren(children, searchTerm);
2349
+ hasFilteredResults =
2350
+ React.Children.toArray(renderedChildren).filter(Boolean).length > 0;
2351
+ }
2352
+ else {
2353
+ // If searchTerm is empty, display all children without filtering (but with onClick injected)
2354
+ renderedChildren = processDropdownChildren(children, '');
2355
+ hasFilteredResults =
2356
+ React.Children.toArray(renderedChildren).filter(Boolean).length > 0; // Should always be true if there are initial children
2357
+ }
2358
+ return (React.createElement("div", { className: "bianic-livesearch field-group flex w-full flex-col gap-y-2", ref: inputRef },
2359
+ React.createElement("label", { htmlFor: id, className: "bianic-livesearch-label text-xs font-semibold read-only:pointer-events-none" },
2186
2360
  label,
2187
2361
  required && React.createElement("span", { className: "p-1 text-bia-red" }, "*")),
2188
2362
  React.createElement("div", { className: "group relative w-full" },
2189
- React.createElement("input", { className: "field peer w-full rounded border border-bia-grey-dark-10 bg-primary-white read-only:pointer-events-none read-only:border-bia-grey-disabled focus-visible:outline-none enabled:hover:rounded-b-none enabled:hover:border-b-bia-blue enabled:focus:rounded-b-none enabled:focus:border-b-bia-blue disabled:border-bia-grey-dark-10 disabled:bg-bia-grey-light-10 disabled:text-bia-coolgrey ".concat(inputClass), onClick: function () { return setIsOpen(!isOpen); }, value: value.label, required: required, disabled: disabled, id: id, placeholder: placeholder, onChange: function (e) {
2363
+ React.createElement("input", { className: "bianic-livesearch-input field peer w-full rounded border border-bia-grey-dark-10 bg-primary-white read-only:pointer-events-none read-only:border-bia-grey-disabled focus-visible:outline-none enabled:hover:rounded-b-none enabled:hover:border-b-bia-blue enabled:focus:rounded-b-none enabled:focus:border-b-bia-blue disabled:border-bia-grey-dark-10 disabled:bg-bia-grey-light-10 disabled:text-bia-coolgrey ".concat(inputClass), onClick: function () { return setIsOpen(!isOpen); }, value: searchTerm, required: required, disabled: disabled, id: id, placeholder: placeholder, onChange: function (e) {
2190
2364
  onChangeText(e);
2191
2365
  setValue({ id: null, label: e.target.value });
2192
- }, type: "search", readOnly: readOnly, autoComplete: autoComplete }),
2193
- React.createElement("div", { className: "absolute inset-y-0 flex items-center pl-3 peer-hover:hidden peer-focus:hidden ".concat(iconClass) },
2366
+ handleInputChange(e);
2367
+ }, type: "text", readOnly: readOnly, autoComplete: autoComplete }),
2368
+ React.createElement("div", { className: "absolute inset-y-0 flex items-center pl-3 group-hover:hidden ".concat(iconClass) },
2194
2369
  React.createElement(TbZoom, { className: "text-primary-black", style: { fontSize: iconSize } })),
2195
- isOpen && (React.createElement("div", { className: "border-grey-100 absolute z-10 max-h-60 w-full overflow-y-auto rounded-b-md border bg-primary-white shadow-lg", onClick: onClickDropdown }, filteredOptions.map(function (option) {
2370
+ React.createElement("div", { className: "absolute inset-y-0 z-20 hidden pl-3 group-hover:block ".concat(iconClass) },
2371
+ React.createElement("button", { onClick: function () { return setValue({ id: null, label: '' }); }, className: "flex h-full w-full items-center" },
2372
+ React.createElement(TbX, { className: "text-primary-black", style: { fontSize: iconSize } }))),
2373
+ children !== undefined && isOpen && (React.createElement("div", { className: "border-grey-100 absolute z-10 max-h-60 w-full overflow-y-auto rounded-b-md border bg-primary-white shadow-lg", onClick: onClickDropdown }, filteredOptions.map(function (option) {
2196
2374
  var isSelected = value && value.id && option.id === value.id;
2197
- return option.custom ? (React.createElement(CustomDropdownItem, { size: size, isSelected: isSelected, onClick: function () {
2375
+ return option.custom ? (React.createElement(CustomDropdownItem, { size: size, isSelected: isSelected, className: dropdownClassName, onClick: function () {
2198
2376
  setValue(option);
2199
2377
  setIsOpen(false);
2200
- } }, option.custom)) : (React.createElement(DefaultDropdownItem, { label: option.label, size: size, isSelected: isSelected, onClick: function () {
2378
+ } }, option.custom)) : (React.createElement(DefaultDropdownItem, { label: option.label, size: size, isSelected: isSelected, className: dropdownClassName, onClick: function () {
2201
2379
  setValue(option);
2202
2380
  setIsOpen(false);
2203
2381
  } }));
2204
- })))),
2382
+ }))),
2383
+ children && isOpen && (React.createElement(DropdownContainer, __assign({ open: isOpen, onClose: function () { return setIsOpen(false); }, size: size, isTopFlat: true, className: "bianic-livesearch-dropdown absolute z-10 mt-1 w-full overflow-hidden rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none ".concat(dropdownClassName) }, dropContProps), hasFilteredResults
2384
+ ? renderedChildren
2385
+ : // If no results and searchTerm is present
2386
+ searchTerm.length > 0 && (React.createElement(DropdownItem, { content: React.createElement("div", { className: "px-4 py-2 text-gray-500" }, "Tidak ada hasil ditemukan.") }))))),
2205
2387
  React.createElement("span", { className: "desc text-xs text-primary-cool" }, descText)));
2206
2388
  }
2207
2389
  LiveSearch.defaultProps = {
@@ -3297,6 +3479,8 @@ exports.Color = Color;
3297
3479
  exports.ContextualButton = ContextualButton;
3298
3480
  exports.Display = Display;
3299
3481
  exports.Divider = Divider;
3482
+ exports.DropdownContainer = DropdownContainer;
3483
+ exports.DropdownItem = DropdownItem;
3300
3484
  exports.FileTree = FileTree;
3301
3485
  exports.FormGroup = FormGroup;
3302
3486
  exports.FormGroupButton = FormGroupButton;