@jsenv/navi 0.29.216 → 0.29.218

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.
@@ -26152,9 +26152,10 @@ const setupBrowserIntegrationViaHistory = ({
26152
26152
  const {
26153
26153
  reason,
26154
26154
  navigationType, // "load", "reload", "replace", "push", "traverse"
26155
- state,
26156
26155
  redirected,
26156
+ landOn,
26157
26157
  } = options;
26158
+ let { state } = options;
26158
26159
 
26159
26160
  // Where the entry being reached stands in this document's own stack —
26160
26161
  // decided before the state that carries it is built (see
@@ -26182,7 +26183,22 @@ const setupBrowserIntegrationViaHistory = ({
26182
26183
  } else {
26183
26184
  // traverse / reload: state comes from the history entry, no push/replace needed.
26184
26185
  markUrlAsVisited(url);
26185
- if (redirected) {
26186
+ if (landOn) {
26187
+ // The entry the back landed on, written over where it stands with
26188
+ // what must outlive the popped one (see navBack's `landOn`) — before
26189
+ // the routes read anything, so the only address they ever see is the
26190
+ // one being kept.
26191
+ state = resolveEffectiveDocumentState(landOn.state, {
26192
+ navigationType: "replace",
26193
+ currentState: state,
26194
+ sharedState: {
26195
+ jsenv_visited_urls: Array.from(visitedUrlSet),
26196
+ [NAV_DEPTH_STATE_KEY]: getNavDepth(),
26197
+ },
26198
+ });
26199
+ window.history.replaceState(state, null, url);
26200
+ rememberEntryIsOfThisDocument();
26201
+ } else if (redirected) {
26186
26202
  // The entry the browser is on names an address that only sends
26187
26203
  // elsewhere — a cold load on it, or a back into it. Written over where
26188
26204
  // it stands (the entry keeps its place in the stack, hence its state
@@ -26346,6 +26362,17 @@ const setupBrowserIntegrationViaHistory = ({
26346
26362
  window.addEventListener("popstate", (popstateEvent) => {
26347
26363
  const url = window.location.href;
26348
26364
  const state = popstateEvent.state;
26365
+ const landOn = landOnPending;
26366
+ landOnPending = null;
26367
+ if (landOn) {
26368
+ handleRoutingTask(landOn.url, {
26369
+ reason: `"popstate" event for ${url}, landing on ${landOn.url}`,
26370
+ navigationType: "traverse",
26371
+ state,
26372
+ landOn,
26373
+ });
26374
+ return;
26375
+ }
26349
26376
  handleRoutingTask(url, {
26350
26377
  reason: `"popstate" event for ${url}`,
26351
26378
  navigationType: "traverse",
@@ -26387,7 +26414,11 @@ const setupBrowserIntegrationViaHistory = ({
26387
26414
  });
26388
26415
  };
26389
26416
 
26390
- const navBack = ({ fallback } = {}) => {
26417
+ // What the next "popstate" writes over the entry it lands on, when a back
26418
+ // asked for it (see navBack's `landOn`). Read by the popstate listener,
26419
+ // which is the one place the landing is applied.
26420
+ let landOnPending = null;
26421
+ const navBack = ({ fallback, landOn } = {}) => {
26391
26422
  if (canNavBackSignal.peek()) {
26392
26423
  // Resolved once the back has landed: the "popstate" it is answered with
26393
26424
  // reaches the routing listener first (registered at setup, before this
@@ -26398,6 +26429,7 @@ const setupBrowserIntegrationViaHistory = ({
26398
26429
  once: true,
26399
26430
  });
26400
26431
  });
26432
+ landOnPending = landOn || null;
26401
26433
  window.history.back();
26402
26434
  return landedPromise;
26403
26435
  }
@@ -26600,6 +26632,12 @@ const reload = browserIntegration.reload;
26600
26632
  * Where to land when there is nothing of this document behind. It takes the
26601
26633
  * place of the current entry rather than stacking on it. Without it, a
26602
26634
  * navBack() with nowhere to go does nothing.
26635
+ * @param {{ url: string, state?: object }} [options.landOn]
26636
+ * What the entry the back lands on reads once landed: its url, and its state
26637
+ * (`undefined` keeps the state it has). Written over that entry within the
26638
+ * back's own navigation, so the routes never see the entry as it was — the
26639
+ * way a screen closed over a url keeps what was written to the url while it
26640
+ * was open (see useNavState's leave()).
26603
26641
  * @returns {Promise<boolean>|undefined}
26604
26642
  * When there is something to go back to: a promise resolved once the back
26605
26643
  * has landed and been applied (`true` — the document url and state say
@@ -26691,10 +26729,13 @@ const useNavStateBasic = (
26691
26729
  // Both push-mode closes pop the pushed entry. A keep-close that merely
26692
26730
  // rewrote it in place would leave two entries describing the same closed
26693
26731
  // screen — same url, same state — and the next back press would appear to do
26694
- // nothing. So the keep path goes back like the cancel does, then writes what
26695
- // must be kept onto the entry the back lands on. Only with nothing of this
26696
- // document behind (the state was entered on a cold-loaded url, navBack has
26697
- // nowhere to go) does it rewrite in place.
26732
+ // nothing. So the keep path goes back like the cancel does, with what must
26733
+ // be kept written onto the entry the back lands on, in the same navigation:
26734
+ // a route param written while the state was entered is in the url being
26735
+ // kept, and a routing pass reading the entry behind as it was would take
26736
+ // that param for gone. Only with nothing of this document behind (the state
26737
+ // was entered on a cold-loaded url, navBack has nowhere to go) does it
26738
+ // rewrite in place.
26698
26739
  const leave = ({ isBack } = {}) => {
26699
26740
  enteredRef.current = false;
26700
26741
  const currentStateCopy = browserIntegration.getDocumentState() || {};
@@ -26706,13 +26747,9 @@ const useNavStateBasic = (
26706
26747
  browserIntegration.navBack();
26707
26748
  return;
26708
26749
  }
26709
- const urlToKeep = window.location.href;
26710
26750
  delete currentStateCopy[id];
26711
- browserIntegration.navBack().then((landed) => {
26712
- if (!landed) {
26713
- return;
26714
- }
26715
- navTo(urlToKeep, { replace: true, state: currentStateCopy });
26751
+ browserIntegration.navBack({
26752
+ landOn: { url: window.location.href, state: currentStateCopy },
26716
26753
  });
26717
26754
  return;
26718
26755
  }
@@ -45007,16 +45044,7 @@ const writeOpenedInSignal = (signal, opened, event) => {
45007
45044
  return;
45008
45045
  }
45009
45046
  writeInSignal(signal, false, { history: "replace" });
45010
- const urlToKeep = window.location.href;
45011
- navBack().then((landed) => {
45012
- if (!landed) {
45013
- return;
45014
- }
45015
- // Often nothing at all: with no other write made while the popup was
45016
- // open, the entry landed on already reads urlToKeep and navTo skips
45017
- // the navigation entirely.
45018
- navTo(urlToKeep, { replace: true });
45019
- });
45047
+ navBack({ landOn: { url: window.location.href } });
45020
45048
  return;
45021
45049
  }
45022
45050
  writeInSignal(signal, false, { history: "replace" });
@@ -56485,8 +56513,7 @@ const getAvailableWidth = (layer, element) => {
56485
56513
  * so any consumer can override it per-instance from CSS (or via the
56486
56514
  * `animationDuration` prop, wired to --popup-animation-duration through
56487
56515
  * Box's styleCSSVars) without touching this file: `--popup-animation-duration`,
56488
- * `--popup-scale-from`, `--popup-cover-travel`, `--popup-border-radius`.
56489
- * `slide-from-*`'s own
56516
+ * `--popup-scale-from`, `--popup-border-radius`. `slide-from-*`'s own
56490
56517
  * 100%-of-own-size distance is hardcoded for now rather than exposed as a
56491
56518
  * variable — fine to revisit if a consumer ever needs to override it.
56492
56519
  *
@@ -56524,21 +56551,23 @@ const getAvailableWidth = (layer, element) => {
56524
56551
  * so it slides in instead. The word names *where it comes from*: placed
56525
56552
  * "top" (a point/corner), it slides in from the top.
56526
56553
  *
56527
- * `animation="cover-from-top"`: a slide reads through what it shows first,
56528
- * and a box travelling its own height from above shows its bottom first —
56529
- * the tail of whatever it holds, then, in the last frame, its head. That is
56530
- * the wrong way round for a panel whose head sits at the edge it comes from
56531
- * (a top-docked SidePanel: title and tabs at its top). So here the cut alone
56532
- * does the reveal — the same curtain descending from the container's top
56533
- * edge a full slide draws — while the box travels only `--popup-cover-travel`
56534
- * (default 24px): the head is on screen from the first frame, settling its
56535
- * last few pixels into place. A length, not a share of the panel: the travel
56536
- * is a settle, the curtain is what reveals, and a share would grow with a
56537
- * full-screen panel while its head does not — at 15% of 800px the head spent
56538
- * the first 40% of the entrance above the cut. The exit is the same
56539
- * movement backwards and still reads as a slide, the head leading. One
56540
- * direction only: a bottom sheet leads with its head by itself, and a
56541
- * left/right panel keeps its head on the axis it does not travel.
56554
+ * The cut is a `clip-path`, and a `clip-path` is painted by the main thread
56555
+ * while the `transform` it has to keep pace with runs on the compositor. Two
56556
+ * clocks: a busy frame — the one that mounts a full-screen panel's content is
56557
+ * exactly that — lets the box travel while the cut stands still, and the
56558
+ * popup is then revealed from the WRONG edge once the thread catches up
56559
+ * (measured by wematch, 2026-09-06: no panel at all for 120ms, then a panel
56560
+ * with its head missing, then the head arriving from below). So the cut is
56561
+ * taken only where it hides something the screen would otherwise show — the
56562
+ * band of glass beside an app narrowed with --navi-app-max-width — and is a
56563
+ * constant everywhere else: at layer="top" the viewport's own edge cuts the
56564
+ * travel on the compositor for free, and at layer="local" the clip wrapper
56565
+ * (a static ancestor, overflow: hidden) does. Where a band exists the cut
56566
+ * still animates and still can drift under load; the full answer there is a
56567
+ * static frame clipped at the band with the travel on an inner element, which
56568
+ * is a restructuring of the popup's box (the visual box, the shadow, the
56569
+ * placement translate, the swipe all move to the inner element), not taken.
56570
+ * See .agents/skills/animations/SKILL.md, "One clock per movement".
56542
56571
  *
56543
56572
  * `animation="expand-*"` (a real anchor only, explicit opt-in — "scaling"
56544
56573
  * reads better overall, see popover.jsx's top comment): grows out of the
@@ -56565,7 +56594,6 @@ const popupCss = /* css */ `
56565
56594
  .navi_dialog {
56566
56595
  --popup-animation-duration: 0.18s;
56567
56596
  --popup-scale-from: 0.9;
56568
- --popup-cover-travel: 24px;
56569
56597
 
56570
56598
  --popup-opacity-duration: var(--popup-animation-duration);
56571
56599
  --popup-translate-duration: var(--popup-animation-duration);
@@ -56582,11 +56610,11 @@ const popupCss = /* css */ `
56582
56610
  (no shared transition-property to clobber, no propertyName to filter).
56583
56611
  What moves here is transform, which composes under it. */
56584
56612
  &[navi-animation] {
56585
- /* clip-path takes the translate's own duration: the slide family below
56586
- cuts its own travel with it, and the cut holds a viewport line still
56587
- only for as long as it advances at exactly the pace of the transform.
56588
- An animation kind that sets no clip-path has "none" on both sides of
56589
- the change, which costs nothing. */
56613
+ /* clip-path takes the translate's own duration, for the one cut that
56614
+ still moves (a band of glass beside the app — see this file's top
56615
+ comment for why every other cut is a constant). A constant cut, or a
56616
+ kind that sets none, has the same value on both sides of the change,
56617
+ which costs nothing. */
56590
56618
  transition-property:
56591
56619
  display, overlay, opacity, transform, scale, box-shadow, clip-path;
56592
56620
  transition-duration:
@@ -56596,31 +56624,46 @@ const popupCss = /* css */ `
56596
56624
  var(--popup-translate-duration);
56597
56625
  transition-timing-function: ease;
56598
56626
  transition-behavior: allow-discrete;
56627
+ }
56599
56628
 
56600
- /* Where the area the popup was placed in has its edges, in the popup's
56601
- own coordinates: --container-position-room-* is how far past each of
56602
- its own edges the popup may still paint before reaching that edge
56603
- (applyNewPosition in @jsenv/dom), so the negated value puts a cut ON
56604
- it. Read by the kinds below that cut their travel (slide, cover): each
56605
- takes the side(s) it needs. A popup that was never placed reads
56606
- 100vmax and is not cut at all.
56607
- Outside that area is either the glass beside an app narrowed with
56608
- --navi-app-max-width (layout/safe_area.js) or whatever surrounds a
56609
- container — neither the popup's to paint, and a popup in the top layer
56610
- answers to no overflow of the document. The popup itself is never cut
56611
- either: the rooms floor at 0. */
56612
- --x-popup-cut-top-at-area: calc(
56613
- -1 * var(--container-position-room-top, 100vmax)
56614
- );
56615
- --x-popup-cut-right-at-area: calc(
56616
- -1 * var(--container-position-room-right, 100vmax)
56617
- );
56618
- --x-popup-cut-bottom-at-area: calc(
56619
- -1 * var(--container-position-room-bottom, 100vmax)
56620
- );
56621
- --x-popup-cut-left-at-area: calc(
56622
- -1 * var(--container-position-room-left, 100vmax)
56623
- );
56629
+ /* Where a travel may be cut, per side, in the popup's own coordinates.
56630
+ --container-position-room-* is how far past each of its own edges the
56631
+ popup may still paint before reaching the edge of the area it was placed
56632
+ in (applyNewPosition in @jsenv/dom), so the negated value puts a cut ON
56633
+ that edge; the rooms floor at 0, so the popup itself is never cut. Read
56634
+ by the slide family below and by swipe_to_close.js.
56635
+
56636
+ The cut is taken only where that edge is NOT the window's own: past the
56637
+ area lies a band of glass (an app narrowed with --navi-app-max-width, a
56638
+ keyboard — layout/safe_area.js), and the band is what the cut hides.
56639
+ Where the band is 0 the window's edge already hides the travel, on the
56640
+ compositor, and the cut is pushed 100vmax out instead: the min() term is
56641
+ 0 for a 0 band and 100vmax for any other, a step written without a
56642
+ branch. See this file's top comment for why an animated cut has to be
56643
+ that rare. */
56644
+ --x-popup-cut-top-at-area: calc(
56645
+ -1 * var(--container-position-room-top, 100vmax) - 100vmax +
56646
+ min(100vmax, var(--navi-app-inset-top, 0px) * 1000000)
56647
+ );
56648
+ --x-popup-cut-right-at-area: calc(
56649
+ -1 * var(--container-position-room-right, 100vmax) - 100vmax +
56650
+ min(100vmax, var(--navi-app-inset-right, 0px) * 1000000)
56651
+ );
56652
+ --x-popup-cut-bottom-at-area: calc(
56653
+ -1 * var(--container-position-room-bottom, 100vmax) - 100vmax +
56654
+ min(100vmax, var(--navi-app-inset-bottom, 0px) * 1000000)
56655
+ );
56656
+ --x-popup-cut-left-at-area: calc(
56657
+ -1 * var(--container-position-room-left, 100vmax) - 100vmax +
56658
+ min(100vmax, var(--navi-app-inset-left, 0px) * 1000000)
56659
+ );
56660
+ /* A local popup is clipped by its clip wrapper (a static ancestor sized to
56661
+ the container, overflow: hidden): nothing is left for a cut to hide. */
56662
+ &[data-layer="local"] {
56663
+ --x-popup-cut-top-at-area: -100vmax;
56664
+ --x-popup-cut-right-at-area: -100vmax;
56665
+ --x-popup-cut-bottom-at-area: -100vmax;
56666
+ --x-popup-cut-left-at-area: -100vmax;
56624
56667
  }
56625
56668
 
56626
56669
  /* box-shadow fades in/out alongside any animation kind, instead of
@@ -56744,39 +56787,6 @@ const popupCss = /* css */ `
56744
56787
  }
56745
56788
  }
56746
56789
 
56747
- /* cover — a top-docked popup unrolling from the top edge of its area (see
56748
- this file's top comment): the cut does the reveal, the box travels
56749
- --popup-cover-travel, a length. The far cut sits where the
56750
- popup's shadow ends (--navi-popup-box-shadow reaches about 50px) or
56751
- where the room does, whichever is nearer, so the reveal finishes on
56752
- the box and its shadow at the pace of the box's own settle. On the
56753
- box's own edge it would shave the shadow off for good; on a distant
56754
- container edge it would run far ahead of the box. */
56755
- &[navi-animation="cover-from-top"] {
56756
- opacity: 1;
56757
- --x-popup-cut-top: var(--x-popup-cut-top-at-area);
56758
- --x-popup-cut-bottom: max(var(--x-popup-cut-bottom-at-area), -60px);
56759
- --x-popup-travel-y: calc(-1 * var(--popup-cover-travel));
56760
- clip-path: inset(
56761
- var(--x-popup-cut-top) -100vmax var(--x-popup-cut-bottom) -100vmax
56762
- );
56763
-
56764
- transform: translate(0px, 0px);
56765
-
56766
- &[aria-expanded="false"] {
56767
- /* The near cut follows the travel, so it holds the area's top line at
56768
- every instant (the slide family's arithmetic); the far cut starts on
56769
- that same line and descends to its open place. What is on screen is
56770
- the descending curtain a full slide draws, holding the top of the
56771
- popup instead of its tail. */
56772
- clip-path: inset(
56773
- calc(var(--x-popup-cut-top) - var(--x-popup-travel-y)) -100vmax
56774
- calc(100% + var(--x-popup-travel-y) - var(--x-popup-cut-top))
56775
- -100vmax
56776
- );
56777
- transform: translate(0px, var(--x-popup-travel-y));
56778
- }
56779
- }
56780
56790
  }
56781
56791
 
56782
56792
  .navi_popover {
@@ -57025,13 +57035,6 @@ const createSwipeToClose = (side, { grip } = {}) => {
57025
57035
  travelTo(sizeOf(panelEl, axis) * closeDirection, 0, restore);
57026
57036
  return;
57027
57037
  }
57028
- // The closed style is rendered once while transitions are still off.
57029
- // Where the release travel left the panel and where its closed style
57030
- // puts it are the same point only for a kind that travels the panel's
57031
- // full size (popup_css.js, slide-from-*); a cover kind rests a fraction
57032
- // in, and handing the styles back before this frame would transition
57033
- // the panel from one to the other in plain view.
57034
- panelEl.getBoundingClientRect();
57035
57038
  restore();
57036
57039
  };
57037
57040
 
@@ -57091,16 +57094,19 @@ const translateOf = (axis, distance) =>
57091
57094
  : `translate(0px, ${distance}px)`;
57092
57095
  // The same cut the entry/exit animation makes (popup_css.js), at a distance the
57093
57096
  // finger decides instead of a transition: the edge the popup is pushed back
57094
- // through sits where its own room ran out (--container-position-room-*, written
57095
- // by applyNewPosition), plus what has been pulled, so the cut holds that line
57097
+ // through, as popup_css.js placed it (--x-popup-cut-*-at-area — on the area's
57098
+ // edge where a band of glass lies past it, 100vmax out where the window's own
57099
+ // edge does the cutting), plus what has been pulled, so the cut holds that line
57096
57100
  // while the box travels under it. The three other sides are left far outside
57097
57101
  // the box — the pull never takes the popup past them, and cutting there would
57098
- // only shave what it legitimately paints outside its own box. An unset room —
57099
- // a popup that was never placed — reads 100vmax and cuts nothing.
57102
+ // only shave what it legitimately paints outside its own box. Reading the
57103
+ // policy from popup_css.js rather than the rooms keeps the release travel
57104
+ // (a Web Animation on transform AND clip-path, two clocks) from animating a
57105
+ // cut the entrance would not.
57100
57106
  const UNCUT = "-100vmax";
57101
57107
  const clipOf = (side, distance) => {
57102
57108
  const pulled = distance < 0 ? -distance : distance;
57103
- const cut = `calc(-1 * var(--container-position-room-${side}, 100vmax) + ${pulled}px)`;
57109
+ const cut = `calc(var(--x-popup-cut-${side}-at-area, ${UNCUT}) + ${pulled}px)`;
57104
57110
  if (side === "top") {
57105
57111
  return `inset(${cut} ${UNCUT} ${UNCUT} ${UNCUT})`;
57106
57112
  }
@@ -57851,7 +57857,7 @@ const css$E = /* css */`
57851
57857
  * scroll while open (its backdrop only covers the scrollport, so scrolling
57852
57858
  * there would reveal uncovered content); this prop extends the lock to the
57853
57859
  * whole page. Defaults to `true` for a dialog docked by `dockedOnSmallTouchScreen`.
57854
- * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|"growing"|`slide-from-${string}`|"cover-from-top"} [props.animation]
57860
+ * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|"growing"|`slide-from-${string}`} [props.animation]
57855
57861
  * - `true`/`"auto"` resolves to `"scaling"` for a centered `positionArea`,
57856
57862
  * or a concrete `"slide-from-*"` direction otherwise. Any other explicit
57857
57863
  * value is used as-is. `"growing"` is the odd one out: every other kind
@@ -59450,7 +59456,7 @@ const css$D = /* css */`
59450
59456
  * popover so the page/container behind it can't scroll while it's open.
59451
59457
  * @param {boolean} [props.focusCapture] - Traps Tab navigation inside the
59452
59458
  * popover (see `focus_trap.js`).
59453
- * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|`slide-from-${string}`|"cover-from-top"} [props.animation]
59459
+ * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|`slide-from-${string}`} [props.animation]
59454
59460
  * - `true`/`"auto"` resolves to a concrete `"slide-from-*"` direction
59455
59461
  * based on `positionArea`. Any other explicit value is used as-is.
59456
59462
  * @param {string} [props.animationDuration] - Maps to
@@ -60784,7 +60790,7 @@ const css$C = /* css */`@layer navi {
60784
60790
  * identically): the wash the backdrop paints over what is behind.
60785
60791
  * @param {string} [props.backdropFilter] - Forwarded as-is: what that wash
60786
60792
  * does to the picture underneath, `"blur(4px)"` and the like.
60787
- * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|"expanding"|`slide-from-${string}`|"cover-from-top"|`expand-${string}`} [props.animation]
60793
+ * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|"expanding"|`slide-from-${string}`|`expand-${string}`} [props.animation]
60788
60794
  * - Forwarded as-is.
60789
60795
  * @param {string} [props.animationDuration] - Forwarded as-is.
60790
60796
  * @param {string} [props.maxWidth] - Forwarded as-is to both; also read
@@ -81959,12 +81965,6 @@ const ViewportLayout = props => {
81959
81965
  };
81960
81966
 
81961
81967
  installImportMetaCssBuild(import.meta);
81962
- const ANIMATION_BY_SIDE = {
81963
- left: "slide-from-left",
81964
- right: "slide-from-right",
81965
- top: "cover-from-top",
81966
- bottom: "slide-from-bottom"
81967
- };
81968
81968
  const css = /* css */`.navi_side_panel {
81969
81969
  --popup-border-radius: 0px;
81970
81970
  --popup-animation-duration: .3s;
@@ -82132,11 +82132,9 @@ const css = /* css */`.navi_side_panel {
82132
82132
  * @param {boolean|"fading"} [props.animation] - Off by default (unlike
82133
82133
  * `Dialog`/`Popover` themselves) — SidePanel is commonly toggled instead
82134
82134
  * of opened/closed as a one-off, where a slide transition is more often
82135
- * undesired noise than not. `true` plays the entrance of `side`:
82136
- * `cover-from-top` for a top panel (it unrolls from its edge, head first),
82137
- * `slide-from-<side>` for the three others — see `ANIMATION_BY_SIDE` for
82138
- * why the top differs. `"fading"` is the other common choice. Other values
82139
- * are forwarded as-is but not a documented/encouraged part of this
82135
+ * undesired noise than not. `true` slides in from `side`
82136
+ * (`slide-from-<side>`); `"fading"` is the other common choice. Other
82137
+ * values are forwarded as-is but not a documented/encouraged part of this
82140
82138
  * component's own API.
82141
82139
  * @param {boolean} [props.closeOnClickOutside=false] - `false` (default):
82142
82140
  * maps to `pointerInteractionOutsideEffect="none"` — in popover mode, no
@@ -82207,7 +82205,7 @@ const SidePanel = ({
82207
82205
  // Dialog's own default gap with the container.
82208
82206
  ,
82209
82207
  marginWithContainer: 0,
82210
- animation: animation === true ? ANIMATION_BY_SIDE[side] : animation,
82208
+ animation: animation === true ? `slide-from-${side}` : animation,
82211
82209
  pointerInteractionOutsideEffect: closeOnClickOutside ? "close" : "none",
82212
82210
  focusCapture: closeOnClickOutside,
82213
82211
  minWidth: toCssLength(minWidth),