@diwauhris/ui 1.7.26 → 1.7.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.
package/lib/assets/ui.css CHANGED
@@ -4442,6 +4442,12 @@ body {
4442
4442
  animation: datepickerIn 0.2s cubic-bezier(0.16, 1, 0.3, 1);
4443
4443
  overflow: hidden;
4444
4444
  }
4445
+ /* Hidden during initial measurement — no animation until final position is set */
4446
+ .pis-datepicker-popover--measuring {
4447
+ opacity: 0;
4448
+ pointer-events: none;
4449
+ animation: none;
4450
+ }
4445
4451
  @keyframes datepickerIn {
4446
4452
  from { opacity: 0; transform: translateY(6px) scale(0.97); }
4447
4453
  to { opacity: 1; transform: translateY(0) scale(1); }
package/lib/index.cjs CHANGED
@@ -1485,23 +1485,35 @@ function DatePicker({ value, onChange, placeholder, className, disabled, error,
1485
1485
  }
1486
1486
  document.addEventListener("mousedown", handleClickOutside);
1487
1487
  return () => document.removeEventListener("mousedown", handleClickOutside);
1488
- }, []);
1488
+ }, [setIsOpen]);
1489
1489
  (0, react.useEffect)(() => {
1490
- if (!isOpen) return;
1490
+ if (!isOpen || !positioned) return;
1491
+ let armed = false;
1492
+ const armTimer = window.setTimeout(() => {
1493
+ armed = true;
1494
+ }, 150);
1491
1495
  const close = () => setIsOpen(false);
1496
+ const onScroll = () => {
1497
+ if (armed) setIsOpen(false);
1498
+ };
1492
1499
  const scrollParent = getScrollParent(wrapperRef.current?.parentElement ?? null);
1493
- if (scrollParent) scrollParent.addEventListener("scroll", close, { passive: true });
1494
- window.addEventListener("scroll", close, {
1500
+ if (scrollParent) scrollParent.addEventListener("scroll", onScroll, { passive: true });
1501
+ window.addEventListener("scroll", onScroll, {
1495
1502
  capture: true,
1496
1503
  passive: true
1497
1504
  });
1498
1505
  window.addEventListener("resize", close);
1499
1506
  return () => {
1500
- if (scrollParent) scrollParent.removeEventListener("scroll", close);
1501
- window.removeEventListener("scroll", close, { capture: true });
1507
+ window.clearTimeout(armTimer);
1508
+ if (scrollParent) scrollParent.removeEventListener("scroll", onScroll);
1509
+ window.removeEventListener("scroll", onScroll, { capture: true });
1502
1510
  window.removeEventListener("resize", close);
1503
1511
  };
1504
- }, [isOpen]);
1512
+ }, [
1513
+ isOpen,
1514
+ positioned,
1515
+ setIsOpen
1516
+ ]);
1505
1517
  (0, react.useEffect)(() => {
1506
1518
  if (!isOpen) return;
1507
1519
  function handleFocusOut(e) {
@@ -1512,7 +1524,7 @@ function DatePicker({ value, onChange, placeholder, className, disabled, error,
1512
1524
  const wrapper = wrapperRef.current;
1513
1525
  wrapper?.addEventListener("focusout", handleFocusOut);
1514
1526
  return () => wrapper?.removeEventListener("focusout", handleFocusOut);
1515
- }, [isOpen]);
1527
+ }, [isOpen, setIsOpen]);
1516
1528
  function handleKeyDown(e) {
1517
1529
  if (e.key === "Escape") {
1518
1530
  e.preventDefault();
@@ -1575,11 +1587,8 @@ function DatePicker({ value, onChange, placeholder, className, disabled, error,
1575
1587
  })]
1576
1588
  }), isOpen && !disabled && !readOnly && (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1577
1589
  ref: popoverRef,
1578
- className: "pis-datepicker-popover",
1579
- style: {
1580
- ...popupStyle,
1581
- visibility: positioned ? void 0 : "hidden"
1582
- },
1590
+ className: cn("pis-datepicker-popover", !positioned && "pis-datepicker-popover--measuring"),
1591
+ style: popupStyle,
1583
1592
  role: "dialog",
1584
1593
  "aria-label": ariaLabel ? `${ariaLabel} calendar` : "Date picker",
1585
1594
  "aria-modal": "false",
package/lib/index.mjs CHANGED
@@ -1461,23 +1461,35 @@ function DatePicker({ value, onChange, placeholder, className, disabled, error,
1461
1461
  }
1462
1462
  document.addEventListener("mousedown", handleClickOutside);
1463
1463
  return () => document.removeEventListener("mousedown", handleClickOutside);
1464
- }, []);
1464
+ }, [setIsOpen]);
1465
1465
  useEffect(() => {
1466
- if (!isOpen) return;
1466
+ if (!isOpen || !positioned) return;
1467
+ let armed = false;
1468
+ const armTimer = window.setTimeout(() => {
1469
+ armed = true;
1470
+ }, 150);
1467
1471
  const close = () => setIsOpen(false);
1472
+ const onScroll = () => {
1473
+ if (armed) setIsOpen(false);
1474
+ };
1468
1475
  const scrollParent = getScrollParent(wrapperRef.current?.parentElement ?? null);
1469
- if (scrollParent) scrollParent.addEventListener("scroll", close, { passive: true });
1470
- window.addEventListener("scroll", close, {
1476
+ if (scrollParent) scrollParent.addEventListener("scroll", onScroll, { passive: true });
1477
+ window.addEventListener("scroll", onScroll, {
1471
1478
  capture: true,
1472
1479
  passive: true
1473
1480
  });
1474
1481
  window.addEventListener("resize", close);
1475
1482
  return () => {
1476
- if (scrollParent) scrollParent.removeEventListener("scroll", close);
1477
- window.removeEventListener("scroll", close, { capture: true });
1483
+ window.clearTimeout(armTimer);
1484
+ if (scrollParent) scrollParent.removeEventListener("scroll", onScroll);
1485
+ window.removeEventListener("scroll", onScroll, { capture: true });
1478
1486
  window.removeEventListener("resize", close);
1479
1487
  };
1480
- }, [isOpen]);
1488
+ }, [
1489
+ isOpen,
1490
+ positioned,
1491
+ setIsOpen
1492
+ ]);
1481
1493
  useEffect(() => {
1482
1494
  if (!isOpen) return;
1483
1495
  function handleFocusOut(e) {
@@ -1488,7 +1500,7 @@ function DatePicker({ value, onChange, placeholder, className, disabled, error,
1488
1500
  const wrapper = wrapperRef.current;
1489
1501
  wrapper?.addEventListener("focusout", handleFocusOut);
1490
1502
  return () => wrapper?.removeEventListener("focusout", handleFocusOut);
1491
- }, [isOpen]);
1503
+ }, [isOpen, setIsOpen]);
1492
1504
  function handleKeyDown(e) {
1493
1505
  if (e.key === "Escape") {
1494
1506
  e.preventDefault();
@@ -1551,11 +1563,8 @@ function DatePicker({ value, onChange, placeholder, className, disabled, error,
1551
1563
  })]
1552
1564
  }), isOpen && !disabled && !readOnly && createPortal(/* @__PURE__ */ jsx("div", {
1553
1565
  ref: popoverRef,
1554
- className: "pis-datepicker-popover",
1555
- style: {
1556
- ...popupStyle,
1557
- visibility: positioned ? void 0 : "hidden"
1558
- },
1566
+ className: cn("pis-datepicker-popover", !positioned && "pis-datepicker-popover--measuring"),
1567
+ style: popupStyle,
1559
1568
  role: "dialog",
1560
1569
  "aria-label": ariaLabel ? `${ariaLabel} calendar` : "Date picker",
1561
1570
  "aria-modal": "false",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@diwauhris/ui",
3
3
  "private": false,
4
- "version": "1.7.26",
4
+ "version": "1.7.27",
5
5
  "type": "module",
6
6
  "description": "DIWA UHRIS UI component library — React + Tailwind CSS",
7
7
  "keywords": [