@jsenv/navi 0.30.21 → 0.30.23

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.
@@ -29228,7 +29228,7 @@ const createResourceLifecycleManager = () => {
29228
29228
 
29229
29229
  for (const restAction of config.restActionSet) {
29230
29230
  const actionCandidateArray = restAction.matchAllSelfOrDescendant(
29231
- (action) => isAnsweredOrAsking(action, triggeringAction),
29231
+ (action) => shouldAskAgain(action, triggeringAction),
29232
29232
  );
29233
29233
 
29234
29234
  for (const actionCandidate of actionCandidateArray) {
@@ -29268,7 +29268,7 @@ const createResourceLifecycleManager = () => {
29268
29268
  break delete_effect;
29269
29269
  }
29270
29270
  if (candidateIsPlural) {
29271
- if (!shouldRerunGetMany) {
29271
+ if (candidateVerb !== "GET" || !shouldRerunGetMany) {
29272
29272
  break delete_effect;
29273
29273
  }
29274
29274
  actionsToRerun.add(actionCandidate);
@@ -29410,7 +29410,7 @@ const createResourceLifecycleManager = () => {
29410
29410
  continue;
29411
29411
  }
29412
29412
  const instanceArray = dependentAction.matchAllSelfOrDescendant(
29413
- (action) => isAnsweredOrAsking(action, triggeringAction),
29413
+ (action) => shouldAskAgain(action, triggeringAction),
29414
29414
  );
29415
29415
  for (const instance of instanceArray) {
29416
29416
  actionsToRerun.add(instance);
@@ -29513,12 +29513,16 @@ const createResourceLifecycleManager = () => {
29513
29513
  };
29514
29514
  };
29515
29515
 
29516
- // A read to ask again after a write: answered before it landed, or still out —
29517
- // an answer that left before the write is as stale as a completed one, and
29518
- // would replace what the write put in the store (a rerun aborts it and asks
29519
- // again). A head start is its owner's to ask (findEffectOnActions resets it).
29520
- const isAnsweredOrAsking = (action, triggeringAction) =>
29521
- (action.completed || action.runningState === RUNNING) &&
29516
+ // A read to ask again after a write: answered before it landed, still out, or
29517
+ // failed. An answer that left before the write is as stale as a completed one,
29518
+ // and would replace what the write put in the store (a rerun aborts it and asks
29519
+ // again). A failed read has no other way back: only a write asks it again.
29520
+ // A head start is its owner's to ask: findEffectOnActions resets one holding an
29521
+ // answer, and one that failed stays FAILED (see prerunAhead in route_action.js).
29522
+ const shouldAskAgain = (action, triggeringAction) =>
29523
+ (action.completed ||
29524
+ action.runningState === RUNNING ||
29525
+ (action.runningState === FAILED && !action.isPrerunSignal.peek())) &&
29522
29526
  action !== triggeringAction;
29523
29527
  // A write named in `writes` says for itself which reads of its own resource it
29524
29528
  // reruns (`rerunOn: { GET_RANGE: true }`); a read it leaves out, and every read
@@ -64626,6 +64630,7 @@ const css$R = /* css */`.navi_control_swap {
64626
64630
  --x-control-swap-size: var(--navi-control-swap-size, calc(var(--navi-control-line-height) + 2 * var(--navi-s) + 2 *
64627
64631
  var(--navi-control-border-width)));
64628
64632
  --x-control-swap-gap: var(--navi-control-swap-gap, var(--navi-xs));
64633
+ --x-control-swap-seam-travel: calc(var(--x-control-swap-gap) + var(--navi-control-border-width));
64629
64634
  height: var(--x-control-swap-size);
64630
64635
  align-items: stretch;
64631
64636
  gap: var(--x-control-swap-gap);
@@ -64639,15 +64644,45 @@ const css$R = /* css */`.navi_control_swap {
64639
64644
  min-width: 0;
64640
64645
  height: 100%;
64641
64646
  position: relative;
64647
+
64648
+ &:has( ~ .navi_control_swap_stage)[aria-expanded="true"] {
64649
+ --x-corner-top-right-radius: 0;
64650
+ --x-corner-bottom-right-radius: 0;
64651
+ }
64652
+
64653
+ .navi_control_swap_stage ~ &[aria-expanded="true"] {
64654
+ --x-corner-top-left-radius: 0;
64655
+ --x-corner-bottom-left-radius: 0;
64656
+ }
64657
+
64658
+ &:focus-visible, &[data-focus-visible] {
64659
+ z-index: var(--navi-z-index-control-focused);
64660
+ }
64642
64661
  }
64643
64662
 
64644
64663
  & > .navi_control_swap_stage {
64664
+ min-width: 0;
64665
+ margin-left: calc(-1 * var(--x-control-swap-seam-travel));
64645
64666
  overflow-clip-margin: var(--navi-focus-outline-width);
64646
64667
  flex: 1 1 0;
64647
- min-width: 0;
64648
64668
  display: flex;
64649
64669
  overflow: clip;
64650
64670
  container-type: inline-size;
64671
+
64672
+ &:hover {
64673
+ z-index: var(--navi-z-index-control-hovered);
64674
+ position: relative;
64675
+ }
64676
+
64677
+ &:has(:focus-visible, [data-focus-visible]) {
64678
+ z-index: var(--navi-z-index-control-focused);
64679
+ position: relative;
64680
+ }
64681
+
64682
+ &:has([aria-expanded="true"]) {
64683
+ z-index: var(--navi-z-index-control-expanded);
64684
+ position: relative;
64685
+ }
64651
64686
  }
64652
64687
 
64653
64688
  & > .navi_control_swap_stage > .navi_control_swap_track {
@@ -64666,20 +64701,43 @@ const css$R = /* css */`.navi_control_swap {
64666
64701
  width: 100%;
64667
64702
  height: 100%;
64668
64703
  }
64704
+
64705
+ &:first-child > :not([navi-out-of-flow]) {
64706
+ --x-corner-top-left-radius: 0;
64707
+ --x-corner-bottom-left-radius: 0;
64708
+ border-top-left-radius: 0 !important;
64709
+ border-bottom-left-radius: 0 !important;
64710
+ }
64711
+
64712
+ &:last-child > :not([navi-out-of-flow]) {
64713
+ --x-corner-top-right-radius: 0;
64714
+ --x-corner-bottom-right-radius: 0;
64715
+ border-top-right-radius: 0 !important;
64716
+ border-bottom-right-radius: 0 !important;
64717
+ }
64669
64718
  }
64670
64719
  }
64671
64720
 
64721
+ &[data-active-index="1"] > .navi_control_swap_stage {
64722
+ transform: translateX(var(--x-control-swap-seam-travel));
64723
+ }
64724
+
64672
64725
  &[data-active-index="1"] > .navi_control_swap_stage > .navi_control_swap_track {
64673
64726
  transform: translateX(calc(-100cqw - var(--x-control-swap-gap)));
64674
64727
  }
64675
64728
 
64676
- &[data-animation] > .navi_control_swap_stage > .navi_control_swap_track {
64729
+ &[data-animation] > .navi_control_swap_stage, &[data-animation] > .navi_control_swap_stage > .navi_control_swap_track {
64677
64730
  transition: transform var(--navi-control-swap-animation-duration, .22s)
64678
64731
  ease;
64679
64732
  }
64680
64733
 
64734
+ &[data-animation] > .navi_control_swap_cap {
64735
+ transition: border-radius
64736
+ var(--navi-control-swap-animation-duration, .22s) ease;
64737
+ }
64738
+
64681
64739
  @media (prefers-reduced-motion: reduce) {
64682
- &[data-animation] > .navi_control_swap_stage > .navi_control_swap_track {
64740
+ &[data-animation] > .navi_control_swap_stage, &[data-animation] > .navi_control_swap_stage > .navi_control_swap_track, &[data-animation] > .navi_control_swap_cap {
64683
64741
  transition: none;
64684
64742
  }
64685
64743
  }
@@ -64710,8 +64768,9 @@ const css$R = /* css */`.navi_control_swap {
64710
64768
  *
64711
64769
  * The row is one length tall — `--navi-control-swap-size`, a line of text
64712
64770
  * between two `s` paddings — and everything in it is that tall: the caps are
64713
- * squares of it, the control holding the floor fills it. `--navi-control-swap-gap`
64714
- * is the space between the boxes.
64771
+ * squares of it, the control holding the floor fills it. The control is joined
64772
+ * to its cap by a shared border; `--navi-control-swap-gap` is the space between
64773
+ * it and the other cap.
64715
64774
  */
64716
64775
  const ControlSwap = props => {
64717
64776
  import.meta.css = [css$R, "@jsenv/navi/src/control/control_swap/control_swap.jsx"];
@@ -71852,6 +71911,12 @@ const SlideContainer = ({
71852
71911
  // names a slide, and the container standing on its first one is a fact only
71853
71912
  // the map knows (see the layout effect that paints it).
71854
71913
  const areaOnScreen = containerRef.current.getAttribute(SLIDE_CURRENT_ATTRIBUTE);
71914
+ // Standing on the first slide by default holds a rank, and the slide at
71915
+ // that rank changes with their order. Someone outside is naming slides, so
71916
+ // the one on screen is held by its name from this answer on.
71917
+ if (current !== areaOnScreen) {
71918
+ setCurrentAreaState(areaOnScreen);
71919
+ }
71855
71920
  if (areaAsked === areaOnScreen) {
71856
71921
  return;
71857
71922
  }