@jsenv/navi 0.29.76 → 0.29.78

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.
@@ -30255,6 +30255,11 @@ const css$X = /* css */`
30255
30255
  outline-offset: 0;
30256
30256
  box-shadow: var(--dialog-box-shadow);
30257
30257
 
30258
+ /* A gesture landing on the dialog belongs to the dialog: what it cannot
30259
+ scroll (a short body, an axis with nowhere to go) must not travel to
30260
+ whatever is behind. */
30261
+ overscroll-behavior: none;
30262
+
30258
30263
  /* Docking answers a different question than --dialog-max-width: a sheet
30259
30264
  spans its container's full width, flush against the two side edges —
30260
30265
  that shape IS the mode — while the caller's ceiling was an answer about
@@ -31125,7 +31130,11 @@ const useDialogProps = props => {
31125
31130
  }));
31126
31131
  }
31127
31132
  if (scrollCapture) {
31128
- addCleanup(trapScrollInside(dialogEl));
31133
+ // A modal dialog always has its own ::backdrop; the custom renderer has
31134
+ // the backdrop element when it renders one.
31135
+ addCleanup(trapScrollInside(dialogEl, {
31136
+ backdrop: isModal || backdropEl
31137
+ }));
31129
31138
  } else if (!isModal) {
31130
31139
  // A local dialog is confined to its positioned ancestor, and so is its
31131
31140
  // backdrop (inset: 0 covers the scrollport, not the scrolled content):
@@ -32662,7 +32671,9 @@ const usePopoverProps = props => {
32662
32671
  // here.
32663
32672
  };
32664
32673
  if (scrollCapture) {
32665
- addCleanup(trapScrollInside(popoverEl));
32674
+ addCleanup(trapScrollInside(popoverEl, {
32675
+ backdrop: backdropEl
32676
+ }));
32666
32677
  }
32667
32678
  if (focusCapture) {
32668
32679
  addCleanup(trapFocusInside(popoverEl, {
@@ -57384,6 +57395,28 @@ const css$w = /* css */`
57384
57395
  the corners would visually overflow the rounded corners during scroll. */
57385
57396
  overflow: hidden;
57386
57397
 
57398
+ /* overflow="visible" asks for the exact opposite of the clipping above: the
57399
+ content must be free to paint outside the list's box and to overflow into
57400
+ whatever scroll container is around it. Setting it on the inner scroll
57401
+ element alone changes nothing visible — this frame would clip it right
57402
+ back — so the frame has to let go of it too, and with it of the rounded
57403
+ corners it was clipping to. The two cannot both be true.
57404
+ An axis asked to be visible pairs with "clip" on the other one rather
57405
+ than "hidden": mixing visible with a scrollport value makes the browser
57406
+ compute the visible one to "auto" (a scrollport again), while
57407
+ visible/clip is the one pairing it keeps as written. */
57408
+ &[data-overflow-visible="both"] {
57409
+ overflow: visible;
57410
+ }
57411
+ &[data-overflow-visible="x"] {
57412
+ overflow-x: visible;
57413
+ overflow-y: clip;
57414
+ }
57415
+ &[data-overflow-visible="y"] {
57416
+ overflow-x: clip;
57417
+ overflow-y: visible;
57418
+ }
57419
+
57387
57420
  .navi_list_scroll_container {
57388
57421
  /* The ask stops here: this element is inside the list's frame, so a row
57389
57422
  or a control it holds is not at the surface's corner. */
@@ -58124,6 +58157,7 @@ const ListUI = props => {
58124
58157
  popover: popover,
58125
58158
  "data-horizontal": horizontal ? "" : undefined,
58126
58159
  "data-scroller": getScrollerAttribute(scroller),
58160
+ "data-overflow-visible": getOverflowVisibleAttribute(overflow, overflowX, overflowY),
58127
58161
  "navi-hover-while-scrolling": hoverWhileScrolling ? "" : undefined,
58128
58162
  "data-expand-x": expandX || expand ? "" : undefined,
58129
58163
  "data-expand-y": expandY || expand ? "" : undefined,
@@ -59402,6 +59436,27 @@ const getScrollerAttribute = scroller => {
59402
59436
  return "parent";
59403
59437
  };
59404
59438
 
59439
+ // overflow lands as an inline style on the inner scroll element, which is
59440
+ // enough for every value but "visible": that one only means anything once the
59441
+ // frame around it stops clipping too. Reading the per-axis props over the
59442
+ // shorthand mirrors how CSS itself resolves them.
59443
+ const getOverflowVisibleAttribute = (overflow, overflowX, overflowY) => {
59444
+ const x = overflowX === undefined ? overflow : overflowX;
59445
+ const y = overflowY === undefined ? overflow : overflowY;
59446
+ const xVisible = x === "visible";
59447
+ const yVisible = y === "visible";
59448
+ if (xVisible && yVisible) {
59449
+ return "both";
59450
+ }
59451
+ if (xVisible) {
59452
+ return "x";
59453
+ }
59454
+ if (yVisible) {
59455
+ return "y";
59456
+ }
59457
+ return undefined;
59458
+ };
59459
+
59405
59460
  // scroller="parent": the list virtualizes against the scroll box it lives in
59406
59461
  // instead of one of its own. Which box that is can only be measured, and a
59407
59462
  // measurement holds for the geometry it was taken on — see resolveScroller in