@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.
@@ -26510,9 +26510,10 @@ const setupBrowserIntegrationViaHistory = ({
26510
26510
  const {
26511
26511
  reason,
26512
26512
  navigationType, // "load", "reload", "replace", "push", "traverse"
26513
- state,
26514
26513
  redirected,
26514
+ landOn,
26515
26515
  } = options;
26516
+ let { state } = options;
26516
26517
 
26517
26518
  // Where the entry being reached stands in this document's own stack —
26518
26519
  // decided before the state that carries it is built (see
@@ -26540,7 +26541,22 @@ const setupBrowserIntegrationViaHistory = ({
26540
26541
  } else {
26541
26542
  // traverse / reload: state comes from the history entry, no push/replace needed.
26542
26543
  markUrlAsVisited(url);
26543
- if (redirected) {
26544
+ if (landOn) {
26545
+ // The entry the back landed on, written over where it stands with
26546
+ // what must outlive the popped one (see navBack's `landOn`) — before
26547
+ // the routes read anything, so the only address they ever see is the
26548
+ // one being kept.
26549
+ state = resolveEffectiveDocumentState(landOn.state, {
26550
+ navigationType: "replace",
26551
+ currentState: state,
26552
+ sharedState: {
26553
+ jsenv_visited_urls: Array.from(visitedUrlSet),
26554
+ [NAV_DEPTH_STATE_KEY]: getNavDepth(),
26555
+ },
26556
+ });
26557
+ window.history.replaceState(state, null, url);
26558
+ rememberEntryIsOfThisDocument();
26559
+ } else if (redirected) {
26544
26560
  // The entry the browser is on names an address that only sends
26545
26561
  // elsewhere — a cold load on it, or a back into it. Written over where
26546
26562
  // it stands (the entry keeps its place in the stack, hence its state
@@ -26704,6 +26720,17 @@ const setupBrowserIntegrationViaHistory = ({
26704
26720
  window.addEventListener("popstate", (popstateEvent) => {
26705
26721
  const url = window.location.href;
26706
26722
  const state = popstateEvent.state;
26723
+ const landOn = landOnPending;
26724
+ landOnPending = null;
26725
+ if (landOn) {
26726
+ handleRoutingTask(landOn.url, {
26727
+ reason: `"popstate" event for ${url}, landing on ${landOn.url}`,
26728
+ navigationType: "traverse",
26729
+ state,
26730
+ landOn,
26731
+ });
26732
+ return;
26733
+ }
26707
26734
  handleRoutingTask(url, {
26708
26735
  reason: `"popstate" event for ${url}`,
26709
26736
  navigationType: "traverse",
@@ -26745,7 +26772,11 @@ const setupBrowserIntegrationViaHistory = ({
26745
26772
  });
26746
26773
  };
26747
26774
 
26748
- const navBack = ({ fallback } = {}) => {
26775
+ // What the next "popstate" writes over the entry it lands on, when a back
26776
+ // asked for it (see navBack's `landOn`). Read by the popstate listener,
26777
+ // which is the one place the landing is applied.
26778
+ let landOnPending = null;
26779
+ const navBack = ({ fallback, landOn } = {}) => {
26749
26780
  if (canNavBackSignal.peek()) {
26750
26781
  // Resolved once the back has landed: the "popstate" it is answered with
26751
26782
  // reaches the routing listener first (registered at setup, before this
@@ -26756,6 +26787,7 @@ const setupBrowserIntegrationViaHistory = ({
26756
26787
  once: true,
26757
26788
  });
26758
26789
  });
26790
+ landOnPending = landOn || null;
26759
26791
  window.history.back();
26760
26792
  return landedPromise;
26761
26793
  }
@@ -26958,6 +26990,12 @@ const reload = browserIntegration.reload;
26958
26990
  * Where to land when there is nothing of this document behind. It takes the
26959
26991
  * place of the current entry rather than stacking on it. Without it, a
26960
26992
  * navBack() with nowhere to go does nothing.
26993
+ * @param {{ url: string, state?: object }} [options.landOn]
26994
+ * What the entry the back lands on reads once landed: its url, and its state
26995
+ * (`undefined` keeps the state it has). Written over that entry within the
26996
+ * back's own navigation, so the routes never see the entry as it was — the
26997
+ * way a screen closed over a url keeps what was written to the url while it
26998
+ * was open (see useNavState's leave()).
26961
26999
  * @returns {Promise<boolean>|undefined}
26962
27000
  * When there is something to go back to: a promise resolved once the back
26963
27001
  * has landed and been applied (`true` — the document url and state say
@@ -27086,10 +27124,13 @@ const useNavStateBasic = (
27086
27124
  // Both push-mode closes pop the pushed entry. A keep-close that merely
27087
27125
  // rewrote it in place would leave two entries describing the same closed
27088
27126
  // screen — same url, same state — and the next back press would appear to do
27089
- // nothing. So the keep path goes back like the cancel does, then writes what
27090
- // must be kept onto the entry the back lands on. Only with nothing of this
27091
- // document behind (the state was entered on a cold-loaded url, navBack has
27092
- // nowhere to go) does it rewrite in place.
27127
+ // nothing. So the keep path goes back like the cancel does, with what must
27128
+ // be kept written onto the entry the back lands on, in the same navigation:
27129
+ // a route param written while the state was entered is in the url being
27130
+ // kept, and a routing pass reading the entry behind as it was would take
27131
+ // that param for gone. Only with nothing of this document behind (the state
27132
+ // was entered on a cold-loaded url, navBack has nowhere to go) does it
27133
+ // rewrite in place.
27093
27134
  const leave = ({ isBack } = {}) => {
27094
27135
  enteredRef.current = false;
27095
27136
  const currentStateCopy = browserIntegration.getDocumentState() || {};
@@ -27101,13 +27142,9 @@ const useNavStateBasic = (
27101
27142
  browserIntegration.navBack();
27102
27143
  return;
27103
27144
  }
27104
- const urlToKeep = window.location.href;
27105
27145
  delete currentStateCopy[id];
27106
- browserIntegration.navBack().then((landed) => {
27107
- if (!landed) {
27108
- return;
27109
- }
27110
- navTo(urlToKeep, { replace: true, state: currentStateCopy });
27146
+ browserIntegration.navBack({
27147
+ landOn: { url: window.location.href, state: currentStateCopy },
27111
27148
  });
27112
27149
  return;
27113
27150
  }
@@ -45579,16 +45616,7 @@ const writeOpenedInSignal = (signal, opened, event) => {
45579
45616
  return;
45580
45617
  }
45581
45618
  writeInSignal(signal, false, { history: "replace" });
45582
- const urlToKeep = window.location.href;
45583
- navBack().then((landed) => {
45584
- if (!landed) {
45585
- return;
45586
- }
45587
- // Often nothing at all: with no other write made while the popup was
45588
- // open, the entry landed on already reads urlToKeep and navTo skips
45589
- // the navigation entirely.
45590
- navTo(urlToKeep, { replace: true });
45591
- });
45619
+ navBack({ landOn: { url: window.location.href } });
45592
45620
  return;
45593
45621
  }
45594
45622
  writeInSignal(signal, false, { history: "replace" });
@@ -57163,8 +57191,7 @@ const getAvailableWidth = (layer, element) => {
57163
57191
  * so any consumer can override it per-instance from CSS (or via the
57164
57192
  * `animationDuration` prop, wired to --popup-animation-duration through
57165
57193
  * Box's styleCSSVars) without touching this file: `--popup-animation-duration`,
57166
- * `--popup-scale-from`, `--popup-cover-travel`, `--popup-border-radius`.
57167
- * `slide-from-*`'s own
57194
+ * `--popup-scale-from`, `--popup-border-radius`. `slide-from-*`'s own
57168
57195
  * 100%-of-own-size distance is hardcoded for now rather than exposed as a
57169
57196
  * variable — fine to revisit if a consumer ever needs to override it.
57170
57197
  *
@@ -57202,21 +57229,23 @@ const getAvailableWidth = (layer, element) => {
57202
57229
  * so it slides in instead. The word names *where it comes from*: placed
57203
57230
  * "top" (a point/corner), it slides in from the top.
57204
57231
  *
57205
- * `animation="cover-from-top"`: a slide reads through what it shows first,
57206
- * and a box travelling its own height from above shows its bottom first —
57207
- * the tail of whatever it holds, then, in the last frame, its head. That is
57208
- * the wrong way round for a panel whose head sits at the edge it comes from
57209
- * (a top-docked SidePanel: title and tabs at its top). So here the cut alone
57210
- * does the reveal — the same curtain descending from the container's top
57211
- * edge a full slide draws — while the box travels only `--popup-cover-travel`
57212
- * (default 24px): the head is on screen from the first frame, settling its
57213
- * last few pixels into place. A length, not a share of the panel: the travel
57214
- * is a settle, the curtain is what reveals, and a share would grow with a
57215
- * full-screen panel while its head does not — at 15% of 800px the head spent
57216
- * the first 40% of the entrance above the cut. The exit is the same
57217
- * movement backwards and still reads as a slide, the head leading. One
57218
- * direction only: a bottom sheet leads with its head by itself, and a
57219
- * left/right panel keeps its head on the axis it does not travel.
57232
+ * The cut is a `clip-path`, and a `clip-path` is painted by the main thread
57233
+ * while the `transform` it has to keep pace with runs on the compositor. Two
57234
+ * clocks: a busy frame — the one that mounts a full-screen panel's content is
57235
+ * exactly that — lets the box travel while the cut stands still, and the
57236
+ * popup is then revealed from the WRONG edge once the thread catches up
57237
+ * (measured by wematch, 2026-09-06: no panel at all for 120ms, then a panel
57238
+ * with its head missing, then the head arriving from below). So the cut is
57239
+ * taken only where it hides something the screen would otherwise show — the
57240
+ * band of glass beside an app narrowed with --navi-app-max-width — and is a
57241
+ * constant everywhere else: at layer="top" the viewport's own edge cuts the
57242
+ * travel on the compositor for free, and at layer="local" the clip wrapper
57243
+ * (a static ancestor, overflow: hidden) does. Where a band exists the cut
57244
+ * still animates and still can drift under load; the full answer there is a
57245
+ * static frame clipped at the band with the travel on an inner element, which
57246
+ * is a restructuring of the popup's box (the visual box, the shadow, the
57247
+ * placement translate, the swipe all move to the inner element), not taken.
57248
+ * See .agents/skills/animations/SKILL.md, "One clock per movement".
57220
57249
  *
57221
57250
  * `animation="expand-*"` (a real anchor only, explicit opt-in — "scaling"
57222
57251
  * reads better overall, see popover.jsx's top comment): grows out of the
@@ -57243,7 +57272,6 @@ const popupCss = /* css */ `
57243
57272
  .navi_dialog {
57244
57273
  --popup-animation-duration: 0.18s;
57245
57274
  --popup-scale-from: 0.9;
57246
- --popup-cover-travel: 24px;
57247
57275
 
57248
57276
  --popup-opacity-duration: var(--popup-animation-duration);
57249
57277
  --popup-translate-duration: var(--popup-animation-duration);
@@ -57260,11 +57288,11 @@ const popupCss = /* css */ `
57260
57288
  (no shared transition-property to clobber, no propertyName to filter).
57261
57289
  What moves here is transform, which composes under it. */
57262
57290
  &[navi-animation] {
57263
- /* clip-path takes the translate's own duration: the slide family below
57264
- cuts its own travel with it, and the cut holds a viewport line still
57265
- only for as long as it advances at exactly the pace of the transform.
57266
- An animation kind that sets no clip-path has "none" on both sides of
57267
- the change, which costs nothing. */
57291
+ /* clip-path takes the translate's own duration, for the one cut that
57292
+ still moves (a band of glass beside the app — see this file's top
57293
+ comment for why every other cut is a constant). A constant cut, or a
57294
+ kind that sets none, has the same value on both sides of the change,
57295
+ which costs nothing. */
57268
57296
  transition-property:
57269
57297
  display, overlay, opacity, transform, scale, box-shadow, clip-path;
57270
57298
  transition-duration:
@@ -57274,31 +57302,46 @@ const popupCss = /* css */ `
57274
57302
  var(--popup-translate-duration);
57275
57303
  transition-timing-function: ease;
57276
57304
  transition-behavior: allow-discrete;
57305
+ }
57277
57306
 
57278
- /* Where the area the popup was placed in has its edges, in the popup's
57279
- own coordinates: --container-position-room-* is how far past each of
57280
- its own edges the popup may still paint before reaching that edge
57281
- (applyNewPosition in @jsenv/dom), so the negated value puts a cut ON
57282
- it. Read by the kinds below that cut their travel (slide, cover): each
57283
- takes the side(s) it needs. A popup that was never placed reads
57284
- 100vmax and is not cut at all.
57285
- Outside that area is either the glass beside an app narrowed with
57286
- --navi-app-max-width (layout/safe_area.js) or whatever surrounds a
57287
- container — neither the popup's to paint, and a popup in the top layer
57288
- answers to no overflow of the document. The popup itself is never cut
57289
- either: the rooms floor at 0. */
57290
- --x-popup-cut-top-at-area: calc(
57291
- -1 * var(--container-position-room-top, 100vmax)
57292
- );
57293
- --x-popup-cut-right-at-area: calc(
57294
- -1 * var(--container-position-room-right, 100vmax)
57295
- );
57296
- --x-popup-cut-bottom-at-area: calc(
57297
- -1 * var(--container-position-room-bottom, 100vmax)
57298
- );
57299
- --x-popup-cut-left-at-area: calc(
57300
- -1 * var(--container-position-room-left, 100vmax)
57301
- );
57307
+ /* Where a travel may be cut, per side, in the popup's own coordinates.
57308
+ --container-position-room-* is how far past each of its own edges the
57309
+ popup may still paint before reaching the edge of the area it was placed
57310
+ in (applyNewPosition in @jsenv/dom), so the negated value puts a cut ON
57311
+ that edge; the rooms floor at 0, so the popup itself is never cut. Read
57312
+ by the slide family below and by swipe_to_close.js.
57313
+
57314
+ The cut is taken only where that edge is NOT the window's own: past the
57315
+ area lies a band of glass (an app narrowed with --navi-app-max-width, a
57316
+ keyboard — layout/safe_area.js), and the band is what the cut hides.
57317
+ Where the band is 0 the window's edge already hides the travel, on the
57318
+ compositor, and the cut is pushed 100vmax out instead: the min() term is
57319
+ 0 for a 0 band and 100vmax for any other, a step written without a
57320
+ branch. See this file's top comment for why an animated cut has to be
57321
+ that rare. */
57322
+ --x-popup-cut-top-at-area: calc(
57323
+ -1 * var(--container-position-room-top, 100vmax) - 100vmax +
57324
+ min(100vmax, var(--navi-app-inset-top, 0px) * 1000000)
57325
+ );
57326
+ --x-popup-cut-right-at-area: calc(
57327
+ -1 * var(--container-position-room-right, 100vmax) - 100vmax +
57328
+ min(100vmax, var(--navi-app-inset-right, 0px) * 1000000)
57329
+ );
57330
+ --x-popup-cut-bottom-at-area: calc(
57331
+ -1 * var(--container-position-room-bottom, 100vmax) - 100vmax +
57332
+ min(100vmax, var(--navi-app-inset-bottom, 0px) * 1000000)
57333
+ );
57334
+ --x-popup-cut-left-at-area: calc(
57335
+ -1 * var(--container-position-room-left, 100vmax) - 100vmax +
57336
+ min(100vmax, var(--navi-app-inset-left, 0px) * 1000000)
57337
+ );
57338
+ /* A local popup is clipped by its clip wrapper (a static ancestor sized to
57339
+ the container, overflow: hidden): nothing is left for a cut to hide. */
57340
+ &[data-layer="local"] {
57341
+ --x-popup-cut-top-at-area: -100vmax;
57342
+ --x-popup-cut-right-at-area: -100vmax;
57343
+ --x-popup-cut-bottom-at-area: -100vmax;
57344
+ --x-popup-cut-left-at-area: -100vmax;
57302
57345
  }
57303
57346
 
57304
57347
  /* box-shadow fades in/out alongside any animation kind, instead of
@@ -57422,39 +57465,6 @@ const popupCss = /* css */ `
57422
57465
  }
57423
57466
  }
57424
57467
 
57425
- /* cover — a top-docked popup unrolling from the top edge of its area (see
57426
- this file's top comment): the cut does the reveal, the box travels
57427
- --popup-cover-travel, a length. The far cut sits where the
57428
- popup's shadow ends (--navi-popup-box-shadow reaches about 50px) or
57429
- where the room does, whichever is nearer, so the reveal finishes on
57430
- the box and its shadow at the pace of the box's own settle. On the
57431
- box's own edge it would shave the shadow off for good; on a distant
57432
- container edge it would run far ahead of the box. */
57433
- &[navi-animation="cover-from-top"] {
57434
- opacity: 1;
57435
- --x-popup-cut-top: var(--x-popup-cut-top-at-area);
57436
- --x-popup-cut-bottom: max(var(--x-popup-cut-bottom-at-area), -60px);
57437
- --x-popup-travel-y: calc(-1 * var(--popup-cover-travel));
57438
- clip-path: inset(
57439
- var(--x-popup-cut-top) -100vmax var(--x-popup-cut-bottom) -100vmax
57440
- );
57441
-
57442
- transform: translate(0px, 0px);
57443
-
57444
- &[aria-expanded="false"] {
57445
- /* The near cut follows the travel, so it holds the area's top line at
57446
- every instant (the slide family's arithmetic); the far cut starts on
57447
- that same line and descends to its open place. What is on screen is
57448
- the descending curtain a full slide draws, holding the top of the
57449
- popup instead of its tail. */
57450
- clip-path: inset(
57451
- calc(var(--x-popup-cut-top) - var(--x-popup-travel-y)) -100vmax
57452
- calc(100% + var(--x-popup-travel-y) - var(--x-popup-cut-top))
57453
- -100vmax
57454
- );
57455
- transform: translate(0px, var(--x-popup-travel-y));
57456
- }
57457
- }
57458
57468
  }
57459
57469
 
57460
57470
  .navi_popover {
@@ -57703,13 +57713,6 @@ const createSwipeToClose = (side, { grip } = {}) => {
57703
57713
  travelTo(sizeOf(panelEl, axis) * closeDirection, 0, restore);
57704
57714
  return;
57705
57715
  }
57706
- // The closed style is rendered once while transitions are still off.
57707
- // Where the release travel left the panel and where its closed style
57708
- // puts it are the same point only for a kind that travels the panel's
57709
- // full size (popup_css.js, slide-from-*); a cover kind rests a fraction
57710
- // in, and handing the styles back before this frame would transition
57711
- // the panel from one to the other in plain view.
57712
- panelEl.getBoundingClientRect();
57713
57716
  restore();
57714
57717
  };
57715
57718
 
@@ -57769,16 +57772,19 @@ const translateOf = (axis, distance) =>
57769
57772
  : `translate(0px, ${distance}px)`;
57770
57773
  // The same cut the entry/exit animation makes (popup_css.js), at a distance the
57771
57774
  // finger decides instead of a transition: the edge the popup is pushed back
57772
- // through sits where its own room ran out (--container-position-room-*, written
57773
- // by applyNewPosition), plus what has been pulled, so the cut holds that line
57775
+ // through, as popup_css.js placed it (--x-popup-cut-*-at-area — on the area's
57776
+ // edge where a band of glass lies past it, 100vmax out where the window's own
57777
+ // edge does the cutting), plus what has been pulled, so the cut holds that line
57774
57778
  // while the box travels under it. The three other sides are left far outside
57775
57779
  // the box — the pull never takes the popup past them, and cutting there would
57776
- // only shave what it legitimately paints outside its own box. An unset room —
57777
- // a popup that was never placed — reads 100vmax and cuts nothing.
57780
+ // only shave what it legitimately paints outside its own box. Reading the
57781
+ // policy from popup_css.js rather than the rooms keeps the release travel
57782
+ // (a Web Animation on transform AND clip-path, two clocks) from animating a
57783
+ // cut the entrance would not.
57778
57784
  const UNCUT = "-100vmax";
57779
57785
  const clipOf = (side, distance) => {
57780
57786
  const pulled = distance < 0 ? -distance : distance;
57781
- const cut = `calc(-1 * var(--container-position-room-${side}, 100vmax) + ${pulled}px)`;
57787
+ const cut = `calc(var(--x-popup-cut-${side}-at-area, ${UNCUT}) + ${pulled}px)`;
57782
57788
  if (side === "top") {
57783
57789
  return `inset(${cut} ${UNCUT} ${UNCUT} ${UNCUT})`;
57784
57790
  }
@@ -58529,7 +58535,7 @@ const css$E = /* css */`
58529
58535
  * scroll while open (its backdrop only covers the scrollport, so scrolling
58530
58536
  * there would reveal uncovered content); this prop extends the lock to the
58531
58537
  * whole page. Defaults to `true` for a dialog docked by `dockedOnSmallTouchScreen`.
58532
- * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|"growing"|`slide-from-${string}`|"cover-from-top"} [props.animation]
58538
+ * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|"growing"|`slide-from-${string}`} [props.animation]
58533
58539
  * - `true`/`"auto"` resolves to `"scaling"` for a centered `positionArea`,
58534
58540
  * or a concrete `"slide-from-*"` direction otherwise. Any other explicit
58535
58541
  * value is used as-is. `"growing"` is the odd one out: every other kind
@@ -60137,7 +60143,7 @@ const css$D = /* css */`
60137
60143
  * popover so the page/container behind it can't scroll while it's open.
60138
60144
  * @param {boolean} [props.focusCapture] - Traps Tab navigation inside the
60139
60145
  * popover (see `focus_trap.js`).
60140
- * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|`slide-from-${string}`|"cover-from-top"} [props.animation]
60146
+ * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|`slide-from-${string}`} [props.animation]
60141
60147
  * - `true`/`"auto"` resolves to a concrete `"slide-from-*"` direction
60142
60148
  * based on `positionArea`. Any other explicit value is used as-is.
60143
60149
  * @param {string} [props.animationDuration] - Maps to
@@ -61477,7 +61483,7 @@ const css$C = /* css */`@layer navi {
61477
61483
  * identically): the wash the backdrop paints over what is behind.
61478
61484
  * @param {string} [props.backdropFilter] - Forwarded as-is: what that wash
61479
61485
  * does to the picture underneath, `"blur(4px)"` and the like.
61480
- * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|"expanding"|`slide-from-${string}`|"cover-from-top"|`expand-${string}`} [props.animation]
61486
+ * @param {boolean|"auto"|"fading"|"scaling"|"sliding"|"expanding"|`slide-from-${string}`|`expand-${string}`} [props.animation]
61481
61487
  * - Forwarded as-is.
61482
61488
  * @param {string} [props.animationDuration] - Forwarded as-is.
61483
61489
  * @param {string} [props.maxWidth] - Forwarded as-is to both; also read
@@ -83177,12 +83183,6 @@ const ViewportLayout = props => {
83177
83183
  };
83178
83184
 
83179
83185
  installImportMetaCssBuild(import.meta);
83180
- const ANIMATION_BY_SIDE = {
83181
- left: "slide-from-left",
83182
- right: "slide-from-right",
83183
- top: "cover-from-top",
83184
- bottom: "slide-from-bottom"
83185
- };
83186
83186
  const css = /* css */`.navi_side_panel {
83187
83187
  --popup-border-radius: 0px;
83188
83188
  --popup-animation-duration: .3s;
@@ -83350,11 +83350,9 @@ const css = /* css */`.navi_side_panel {
83350
83350
  * @param {boolean|"fading"} [props.animation] - Off by default (unlike
83351
83351
  * `Dialog`/`Popover` themselves) — SidePanel is commonly toggled instead
83352
83352
  * of opened/closed as a one-off, where a slide transition is more often
83353
- * undesired noise than not. `true` plays the entrance of `side`:
83354
- * `cover-from-top` for a top panel (it unrolls from its edge, head first),
83355
- * `slide-from-<side>` for the three others — see `ANIMATION_BY_SIDE` for
83356
- * why the top differs. `"fading"` is the other common choice. Other values
83357
- * are forwarded as-is but not a documented/encouraged part of this
83353
+ * undesired noise than not. `true` slides in from `side`
83354
+ * (`slide-from-<side>`); `"fading"` is the other common choice. Other
83355
+ * values are forwarded as-is but not a documented/encouraged part of this
83358
83356
  * component's own API.
83359
83357
  * @param {boolean} [props.closeOnClickOutside=false] - `false` (default):
83360
83358
  * maps to `pointerInteractionOutsideEffect="none"` — in popover mode, no
@@ -83425,7 +83423,7 @@ const SidePanel = ({
83425
83423
  // Dialog's own default gap with the container.
83426
83424
  ,
83427
83425
  marginWithContainer: 0,
83428
- animation: animation === true ? ANIMATION_BY_SIDE[side] : animation,
83426
+ animation: animation === true ? `slide-from-${side}` : animation,
83429
83427
  pointerInteractionOutsideEffect: closeOnClickOutside ? "close" : "none",
83430
83428
  focusCapture: closeOnClickOutside,
83431
83429
  minWidth: toCssLength(minWidth),