@diwauhris/ui 1.7.35 → 1.7.37

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
@@ -4290,6 +4290,10 @@
4290
4290
  background-size: 20px 20px;
4291
4291
  }
4292
4292
 
4293
+ .\[overflow\:clip\] {
4294
+ overflow: clip;
4295
+ }
4296
+
4293
4297
  /* ── Scrollbar utility ───────────────────────────────────────────────────── */
4294
4298
  .hide-scrollbar { scrollbar-width: none; -ms-overflow-style: none; }
4295
4299
  .hide-scrollbar::-webkit-scrollbar { display: none; }
package/lib/index.cjs CHANGED
@@ -1233,40 +1233,40 @@ function Combobox({ value: controlledValue, defaultValue = "", onChange, options
1233
1233
  (0, react.useEffect)(() => {
1234
1234
  isOpenRef.current = isOpen;
1235
1235
  });
1236
- const doUpdatePosition = (0, react.useCallback)(() => {
1237
- if (!wrapperRef.current) return;
1238
- const rect = wrapperRef.current.getBoundingClientRect();
1239
- const dropUp = window.innerHeight - rect.bottom < 240 && rect.top > 240;
1240
- setPanelStyle({
1241
- position: "fixed",
1242
- top: dropUp ? void 0 : rect.bottom + 4,
1243
- bottom: dropUp ? window.innerHeight - rect.top + 4 : void 0,
1244
- left: rect.left,
1245
- zIndex: 9999,
1246
- width: rect.width,
1247
- pointerEvents: "auto",
1248
- overscrollBehavior: "contain"
1249
- });
1250
- }, []);
1251
- (0, react.useEffect)(() => {
1252
- if (!isOpen) return;
1253
- const raf = requestAnimationFrame(doUpdatePosition);
1254
- return () => cancelAnimationFrame(raf);
1255
- }, [isOpen, doUpdatePosition]);
1256
1236
  (0, react.useEffect)(() => {
1257
- const onScrollOrResize = () => {
1258
- if (isOpenRef.current) doUpdatePosition();
1259
- };
1260
- window.addEventListener("scroll", onScrollOrResize, {
1261
- capture: true,
1262
- passive: true
1263
- });
1264
- window.addEventListener("resize", onScrollOrResize);
1265
- return () => {
1266
- window.removeEventListener("scroll", onScrollOrResize, { capture: true });
1267
- window.removeEventListener("resize", onScrollOrResize);
1237
+ let prevTop;
1238
+ let prevBottom;
1239
+ let prevLeft = 0;
1240
+ let prevWidth = 0;
1241
+ let rafId;
1242
+ const loop = () => {
1243
+ if (isOpenRef.current && wrapperRef.current) {
1244
+ const rect = wrapperRef.current.getBoundingClientRect();
1245
+ const dropUp = window.innerHeight - rect.bottom < 240 && rect.top > 240;
1246
+ const nextTop = dropUp ? void 0 : rect.bottom + 4;
1247
+ const nextBottom = dropUp ? window.innerHeight - rect.top + 4 : void 0;
1248
+ if (nextTop !== prevTop || nextBottom !== prevBottom || rect.left !== prevLeft || rect.width !== prevWidth) {
1249
+ prevTop = nextTop;
1250
+ prevBottom = nextBottom;
1251
+ prevLeft = rect.left;
1252
+ prevWidth = rect.width;
1253
+ setPanelStyle({
1254
+ position: "fixed",
1255
+ top: nextTop,
1256
+ bottom: nextBottom,
1257
+ left: rect.left,
1258
+ zIndex: 9999,
1259
+ width: rect.width,
1260
+ pointerEvents: "auto",
1261
+ overscrollBehavior: "contain"
1262
+ });
1263
+ }
1264
+ }
1265
+ rafId = requestAnimationFrame(loop);
1268
1266
  };
1269
- }, [doUpdatePosition]);
1267
+ rafId = requestAnimationFrame(loop);
1268
+ return () => cancelAnimationFrame(rafId);
1269
+ }, []);
1270
1270
  (0, react.useEffect)(() => {
1271
1271
  if (!isOpen) setHighlightIndex(-1);
1272
1272
  }, [isOpen]);
@@ -4418,7 +4418,7 @@ function AccordionContent({ children, className = "" }) {
4418
4418
  "aria-labelledby": triggerId,
4419
4419
  "aria-hidden": !isOpen || void 0,
4420
4420
  "data-state": isOpen ? "open" : "closed",
4421
- className: cn("grid overflow-hidden transition-[grid-template-rows] duration-200 ease-out", isOpen ? "grid-rows-[1fr]" : "grid-rows-[0fr]"),
4421
+ className: cn("grid [overflow:clip] transition-[grid-template-rows] duration-200 ease-out", isOpen ? "grid-rows-[1fr]" : "grid-rows-[0fr]"),
4422
4422
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4423
4423
  className: "min-h-0",
4424
4424
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
package/lib/index.mjs CHANGED
@@ -1209,40 +1209,40 @@ function Combobox({ value: controlledValue, defaultValue = "", onChange, options
1209
1209
  useEffect(() => {
1210
1210
  isOpenRef.current = isOpen;
1211
1211
  });
1212
- const doUpdatePosition = useCallback(() => {
1213
- if (!wrapperRef.current) return;
1214
- const rect = wrapperRef.current.getBoundingClientRect();
1215
- const dropUp = window.innerHeight - rect.bottom < 240 && rect.top > 240;
1216
- setPanelStyle({
1217
- position: "fixed",
1218
- top: dropUp ? void 0 : rect.bottom + 4,
1219
- bottom: dropUp ? window.innerHeight - rect.top + 4 : void 0,
1220
- left: rect.left,
1221
- zIndex: 9999,
1222
- width: rect.width,
1223
- pointerEvents: "auto",
1224
- overscrollBehavior: "contain"
1225
- });
1226
- }, []);
1227
- useEffect(() => {
1228
- if (!isOpen) return;
1229
- const raf = requestAnimationFrame(doUpdatePosition);
1230
- return () => cancelAnimationFrame(raf);
1231
- }, [isOpen, doUpdatePosition]);
1232
1212
  useEffect(() => {
1233
- const onScrollOrResize = () => {
1234
- if (isOpenRef.current) doUpdatePosition();
1235
- };
1236
- window.addEventListener("scroll", onScrollOrResize, {
1237
- capture: true,
1238
- passive: true
1239
- });
1240
- window.addEventListener("resize", onScrollOrResize);
1241
- return () => {
1242
- window.removeEventListener("scroll", onScrollOrResize, { capture: true });
1243
- window.removeEventListener("resize", onScrollOrResize);
1213
+ let prevTop;
1214
+ let prevBottom;
1215
+ let prevLeft = 0;
1216
+ let prevWidth = 0;
1217
+ let rafId;
1218
+ const loop = () => {
1219
+ if (isOpenRef.current && wrapperRef.current) {
1220
+ const rect = wrapperRef.current.getBoundingClientRect();
1221
+ const dropUp = window.innerHeight - rect.bottom < 240 && rect.top > 240;
1222
+ const nextTop = dropUp ? void 0 : rect.bottom + 4;
1223
+ const nextBottom = dropUp ? window.innerHeight - rect.top + 4 : void 0;
1224
+ if (nextTop !== prevTop || nextBottom !== prevBottom || rect.left !== prevLeft || rect.width !== prevWidth) {
1225
+ prevTop = nextTop;
1226
+ prevBottom = nextBottom;
1227
+ prevLeft = rect.left;
1228
+ prevWidth = rect.width;
1229
+ setPanelStyle({
1230
+ position: "fixed",
1231
+ top: nextTop,
1232
+ bottom: nextBottom,
1233
+ left: rect.left,
1234
+ zIndex: 9999,
1235
+ width: rect.width,
1236
+ pointerEvents: "auto",
1237
+ overscrollBehavior: "contain"
1238
+ });
1239
+ }
1240
+ }
1241
+ rafId = requestAnimationFrame(loop);
1244
1242
  };
1245
- }, [doUpdatePosition]);
1243
+ rafId = requestAnimationFrame(loop);
1244
+ return () => cancelAnimationFrame(rafId);
1245
+ }, []);
1246
1246
  useEffect(() => {
1247
1247
  if (!isOpen) setHighlightIndex(-1);
1248
1248
  }, [isOpen]);
@@ -4394,7 +4394,7 @@ function AccordionContent({ children, className = "" }) {
4394
4394
  "aria-labelledby": triggerId,
4395
4395
  "aria-hidden": !isOpen || void 0,
4396
4396
  "data-state": isOpen ? "open" : "closed",
4397
- className: cn("grid overflow-hidden transition-[grid-template-rows] duration-200 ease-out", isOpen ? "grid-rows-[1fr]" : "grid-rows-[0fr]"),
4397
+ className: cn("grid [overflow:clip] transition-[grid-template-rows] duration-200 ease-out", isOpen ? "grid-rows-[1fr]" : "grid-rows-[0fr]"),
4398
4398
  children: /* @__PURE__ */ jsx("div", {
4399
4399
  className: "min-h-0",
4400
4400
  children: /* @__PURE__ */ jsx("div", {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@diwauhris/ui",
3
3
  "private": false,
4
- "version": "1.7.35",
4
+ "version": "1.7.37",
5
5
  "type": "module",
6
6
  "description": "DIWA UHRIS UI component library — React + Tailwind CSS",
7
7
  "keywords": [