@jsenv/navi 0.29.146 → 0.29.147

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.
@@ -17086,7 +17086,7 @@ const useActionAsyncData = (action, {
17086
17086
  }) => {
17087
17087
  const loadingRef = useContext(LoadingContext);
17088
17088
  if (!loadingRef) {
17089
- throw new Error("Missing <Loading>");
17089
+ throw new Error(`Missing <Loading>: useAsyncData delegates the wait, so it needs a <Loading> boundary above it — or "loading: true" to draw that wait here.`);
17090
17090
  }
17091
17091
  useOnLoad(action, onLoad);
17092
17092
 
@@ -31606,8 +31606,44 @@ const retryWhenPlaceable = (
31606
31606
  };
31607
31607
  };
31608
31608
 
31609
+ /**
31610
+ * Focuses `element` the way navi focuses anything: without the browser's
31611
+ * scroll-into-view, and showing a ring only when the user is on the keyboard.
31612
+ *
31613
+ * Both are decisions, not details. The scroll reads geometry a layout effect
31614
+ * may still be deciding. And whether a ring shows belongs to the modality of
31615
+ * what asked for this — a press with a finger or a mouse must not leave an
31616
+ * outline nobody asked for, a movement asked for with a key must — never to
31617
+ * the fact that the call came from code, which is all the browser can see. An
31618
+ * editable target outranks the modality: someone about to type has to see
31619
+ * where.
31620
+ *
31621
+ * So a bare `element.focus()` is the thing to avoid, in navi and in an app
31622
+ * using it: it answers "who" and leaves "is this visible" to the browser.
31623
+ *
31624
+ * @param {HTMLElement} element
31625
+ * @param {object} [options]
31626
+ * @param {boolean} [options.focusVisible] Decides the ring instead of the
31627
+ * modality — for a caller that knows better than the last interaction does
31628
+ * (a transfer speaking for the gesture that opened a container, say).
31629
+ * @param {boolean} [options.preventScroll=true] Pass false to let the browser
31630
+ * scroll the element into view.
31631
+ */
31632
+ const moveFocusTo = (
31633
+ element,
31634
+ { focusVisible, preventScroll = true } = {},
31635
+ ) => {
31636
+ element.focus({
31637
+ preventScroll,
31638
+ focusVisible:
31639
+ focusVisible === undefined
31640
+ ? isKeyboardModality() || isEditableTarget(element)
31641
+ : focusVisible,
31642
+ });
31643
+ };
31644
+
31609
31645
  const focusTransferTarget = (target, focusVisible) => {
31610
- target.focus({ preventScroll: true, focusVisible });
31646
+ moveFocusTo(target, { focusVisible });
31611
31647
  if (target.hasAttribute("navi-autofocus-select")) {
31612
31648
  target.select();
31613
31649
  // Keep the beginning of the text visible instead of scrolling to the end
@@ -44562,40 +44598,41 @@ installImportMetaCssBuild(import.meta);/**
44562
44598
  * a switch that moves when you flip it: the finger that opened the search has
44563
44599
  * to travel to close it again. Out here, the same pixel does both.
44564
44600
  *
44565
- * Nothing is unmounted. Two elements that never coexist have nothing to
44566
- * interpolate between, so both sides stay mounted at all times and only their
44567
- * share of the middle moves: the collapsed slot falls to zero width and turns
44568
- * inert — unreachable by finger and by keyboard — while what was typed in it
44569
- * survives the round trip.
44570
- *
44571
- * Neither control ever reflows during the movement. Each one is laid out at
44572
- * the full width of the middle (`100cqw` of the stage, which is a query
44573
- * container) whatever its slot currently measures, so the slot uncovers a
44574
- * finished control instead of squeezing a live one — text never rewraps
44575
- * mid-swap, and a collapsed control is not a zero-width column of stacked
44576
- * words silently setting the row's height.
44577
- *
44578
- * The row has ONE height, and everything in it is that tall: the caps because
44579
- * they are squares of it, the two controls because they are stretched to it.
44580
- * Nothing is measured — a height read off the controls could only come back
44581
- * through a resize observer, and a cap made square with `aspect-ratio` never
44582
- * reads it anyway (on a flex item stretched to its line, the main size is
44583
- * resolved from content first). It is a length, `--navi-control-swap-size`,
44584
- * defaulting to the height of a navi control at its default padding; a row of
44585
- * roomier controls says so once, there.
44601
+ * Nothing is unmounted, and nothing is resized. Two elements that never
44602
+ * coexist have nothing to interpolate between, so both controls stay mounted
44603
+ * and laid out at all times, side by side on a track twice the width of the
44604
+ * middle; the track slides, and one control pushes the other out under the cap
44605
+ * it belongs to. A share of the middle traded between two shrinking boxes
44606
+ * gives a wipe instead — each control squeezed live, text rewrapping under the
44607
+ * movement, and nothing that reads as one thing arriving over another.
44608
+ *
44609
+ * The control without the floor is off the middle rather than gone: `inert`,
44610
+ * so no finger and no Tab reaches it, and holding what was typed in it for the
44611
+ * round trip back.
44612
+ *
44613
+ * The row has ONE height, and everything in it is that tall: the caps are
44614
+ * squares of it, the controls are given it. Nothing is measured — a height
44615
+ * read off the controls could only come back through a resize observer, and a
44616
+ * cap made square with `aspect-ratio` never reads it anyway (on a flex item
44617
+ * stretched to its line, the main size is resolved from content first). It is
44618
+ * a length, `--navi-control-swap-size`, and it is the only thing to say to
44619
+ * make the row thinner or thicker.
44586
44620
  */
44587
44621
  const css$O = /* css */`.navi_control_swap {
44588
- --x-control-swap-size: var(--navi-control-swap-size, calc(var(--navi-control-line-height) + 2 *
44589
- var(--navi-control-padding-y-default) + 2 *
44622
+ --x-control-swap-size: var(--navi-control-swap-size, calc(var(--navi-control-line-height) + 2 * var(--navi-s) + 2 *
44590
44623
  var(--navi-control-border-width)));
44624
+ --x-control-swap-gap: var(--navi-control-swap-gap, var(--navi-xs));
44591
44625
  height: var(--x-control-swap-size);
44592
44626
  align-items: stretch;
44627
+ gap: var(--x-control-swap-gap);
44593
44628
 
44594
44629
  & > .navi_control_swap_cap {
44595
- flex: 0 0 var(--x-control-swap-size);
44630
+ aspect-ratio: 1;
44631
+ flex: none;
44596
44632
  justify-content: center;
44597
- align-self: stretch;
44598
44633
  align-items: center;
44634
+ min-width: 0;
44635
+ height: 100%;
44599
44636
  position: relative;
44600
44637
 
44601
44638
  & .navi_control_swap_badge {
@@ -44612,51 +44649,43 @@ const css$O = /* css */`.navi_control_swap {
44612
44649
  }
44613
44650
 
44614
44651
  & > .navi_control_swap_stage {
44615
- flex-direction: row;
44652
+ overflow-clip-margin: var(--navi-focus-outline-width);
44616
44653
  flex: 1 1 0;
44617
44654
  min-width: 0;
44618
44655
  display: flex;
44656
+ overflow: clip;
44619
44657
  container-type: inline-size;
44658
+ }
44659
+
44660
+ & > .navi_control_swap_stage > .navi_control_swap_track {
44661
+ gap: var(--x-control-swap-gap);
44662
+ flex-direction: row;
44663
+ flex: none;
44664
+ height: 100%;
44665
+ display: flex;
44620
44666
 
44621
44667
  & > .navi_control_swap_slot {
44622
- flex: 1 1 0;
44623
- min-width: 0;
44668
+ flex: 0 0 100cqw;
44624
44669
  display: flex;
44625
- overflow: hidden;
44626
-
44627
- & > .navi_control_swap_control {
44628
- flex-direction: column;
44629
- flex: none;
44630
- justify-content: center;
44631
- width: 100cqw;
44632
- display: flex;
44633
44670
 
44634
- & > * {
44635
- width: 100%;
44636
- }
44637
- }
44638
-
44639
- &[data-collapsed] {
44640
- flex-grow: 0;
44641
- }
44642
-
44643
- &[data-pinned="end"] {
44644
- justify-content: flex-end;
44671
+ & > * {
44672
+ width: 100%;
44673
+ height: 100%;
44645
44674
  }
44646
44675
  }
44647
44676
  }
44648
44677
 
44649
- &[data-settled] > .navi_control_swap_stage > .navi_control_swap_slot:not([data-collapsed]) {
44650
- overflow: visible;
44678
+ &[data-active-index="1"] > .navi_control_swap_stage > .navi_control_swap_track {
44679
+ transform: translateX(calc(-100cqw - var(--x-control-swap-gap)));
44651
44680
  }
44652
44681
 
44653
- &[data-animation] > .navi_control_swap_stage > .navi_control_swap_slot {
44654
- transition: flex-grow var(--navi-control-swap-animation-duration, .22s)
44682
+ &[data-animation] > .navi_control_swap_stage > .navi_control_swap_track {
44683
+ transition: transform var(--navi-control-swap-animation-duration, .22s)
44655
44684
  ease;
44656
44685
  }
44657
44686
 
44658
44687
  @media (prefers-reduced-motion: reduce) {
44659
- &[data-animation] > .navi_control_swap_stage > .navi_control_swap_slot {
44688
+ &[data-animation] > .navi_control_swap_stage > .navi_control_swap_track {
44660
44689
  transition: none;
44661
44690
  }
44662
44691
  }
@@ -44681,13 +44710,14 @@ const css$O = /* css */`.navi_control_swap {
44681
44710
  * side's name back into it whenever a press swaps it. Excludes `value`.
44682
44711
  * @param onChange - Called with the name of the side taking the floor, and the
44683
44712
  * press that gave it.
44684
- * @param animation - On by default: the two slots trade their share of the
44685
- * middle over `--navi-control-swap-animation-duration` (0.22s). `false`
44686
- * swaps them in one frame; `prefers-reduced-motion` does too.
44687
- *
44688
- * The row is one length tall — `--navi-control-swap-size`, the height of a navi
44689
- * control at its default padding — and the caps are squares of it. Controls
44690
- * with a padding of their own need that length said once, here.
44713
+ * @param animation - On by default: the track slides from one control to the
44714
+ * other over `--navi-control-swap-animation-duration` (0.22s). `false` puts
44715
+ * it there in one frame; `prefers-reduced-motion` does too.
44716
+ *
44717
+ * The row is one length tall — `--navi-control-swap-size`, a line of text
44718
+ * between two `s` paddings — and everything in it is that tall: the caps are
44719
+ * squares of it, the control holding the floor fills it. `--navi-control-swap-gap`
44720
+ * is the space between the boxes.
44691
44721
  */
44692
44722
  const ControlSwap = props => {
44693
44723
  import.meta.css = [css$O, "@jsenv/navi/src/control/control_swap/control_swap.jsx"];
@@ -44718,16 +44748,12 @@ const ControlSwap = props => {
44718
44748
  const slotIdPrefix = useId();
44719
44749
  const activeNameRef = useRef(activeName);
44720
44750
  activeNameRef.current = activeSide.name;
44721
-
44722
- // The movement is over and the slots are where they belong (see the CSS).
44723
- const [settled, setSettled] = useState(true);
44724
44751
  const swapTo = (name, event) => {
44725
44752
  if (name === activeNameRef.current) {
44726
44753
  return;
44727
44754
  }
44728
44755
  activeNameRef.current = name;
44729
44756
  setActiveName(name);
44730
- setSettled(!animation);
44731
44757
  if (signal) {
44732
44758
  signal.value = name;
44733
44759
  }
@@ -44758,16 +44784,9 @@ const ControlSwap = props => {
44758
44784
  useLayoutEffect(() => {
44759
44785
  if (isFirstActiveRunRef.current) {
44760
44786
  isFirstActiveRunRef.current = false;
44761
- return undefined;
44762
- }
44763
- const activeSlot = slotRefs[activeIndex].current;
44764
- focusWithTheFloor(activeSlot, activeSide, capRefs[activeIndex].current);
44765
- if (!animation) {
44766
- return undefined;
44787
+ return;
44767
44788
  }
44768
- return whenTransitionSettles(activeSlot, () => {
44769
- setSettled(true);
44770
- });
44789
+ focusWithTheFloor(slotRefs[activeIndex].current, activeSide, capRefs[activeIndex].current);
44771
44790
  }, [activeSide.name]);
44772
44791
 
44773
44792
  // Both caps do the same thing, and it is the reason they sit outside the
@@ -44781,7 +44800,7 @@ const ControlSwap = props => {
44781
44800
  baseClassName: "navi_control_swap",
44782
44801
  role: "group",
44783
44802
  "data-animation": animation ? "" : undefined,
44784
- "data-settled": settled ? "" : undefined,
44803
+ "data-active-index": activeIndex,
44785
44804
  ...rest,
44786
44805
  children: [jsx(ControlSwapCap, {
44787
44806
  ref: capRefs[0],
@@ -44791,18 +44810,16 @@ const ControlSwap = props => {
44791
44810
  onPress: swapOnPress
44792
44811
  }), jsx("div", {
44793
44812
  className: "navi_control_swap_stage",
44794
- children: sides.map((side, index) => jsx("div", {
44795
- ref: slotRefs[index],
44796
- id: `${slotIdPrefix}_${index}`,
44797
- className: "navi_control_swap_slot",
44798
- "data-pinned": index === 0 ? "start" : "end",
44799
- "data-collapsed": side === activeSide ? undefined : "",
44800
- inert: side === activeSide ? undefined : true,
44801
- children: jsx("div", {
44802
- className: "navi_control_swap_control",
44813
+ children: jsx("div", {
44814
+ className: "navi_control_swap_track",
44815
+ children: sides.map((side, index) => jsx("div", {
44816
+ ref: slotRefs[index],
44817
+ id: `${slotIdPrefix}_${index}`,
44818
+ className: "navi_control_swap_slot",
44819
+ inert: index === activeIndex ? undefined : true,
44803
44820
  children: side.children
44804
- })
44805
- }, side.name))
44821
+ }, side.name))
44822
+ })
44806
44823
  }), jsx(ControlSwapCap, {
44807
44824
  ref: capRefs[1],
44808
44825
  side: sides[1],
@@ -44835,10 +44852,11 @@ const ControlSwap = props => {
44835
44852
  * doing something (a filter set, a search typed). `true` draws a dot;
44836
44853
  * anything else is drawn as given (a `<BadgeCount>`, say).
44837
44854
  * @param autoFocus - On by default: the focus goes into this control when it
44838
- * takes the floor (its `[autofocus]` element, or the first focusable one).
44839
- * `false` leaves it on the cap that was pressed — for a control one reads
44840
- * before writing in, or a phone where the keyboard must not rise yet. Never
44841
- * on mount, whatever the setting.
44855
+ * takes the floor, where navi's ladder puts it — an `autoFocus` inside the
44856
+ * control first, its first focusable otherwise. `false` leaves it on the cap
44857
+ * that was pressed, for a control one reads before writing in (and, on a
44858
+ * phone, for a keyboard that must not rise). Never on mount, whatever the
44859
+ * setting.
44842
44860
  */
44843
44861
  const ControlSwapSide = () => null;
44844
44862
  const ControlSwapCap = ({
@@ -44856,14 +44874,14 @@ const ControlSwapCap = ({
44856
44874
  return jsxs(Button, {
44857
44875
  ref: ref,
44858
44876
  className: "navi_control_swap_cap",
44859
- variant: "discrete",
44860
44877
  icon: true,
44878
+ pressEffect: "none",
44861
44879
  "aria-label": label,
44862
44880
  "aria-expanded": active,
44863
44881
  "aria-controls": slotId,
44864
44882
  onClick: onPress,
44865
44883
  children: [jsx(Icon, {
44866
- width: "60%",
44884
+ width: "50%",
44867
44885
  square: true,
44868
44886
  children: icon
44869
44887
  }), badge ? jsx("span", {
@@ -44894,34 +44912,33 @@ const readSides = children => {
44894
44912
 
44895
44913
  // The floor moved: the press that gave it landed on a cap, and what one wants
44896
44914
  // next is the control that just arrived — typing into the search field one just
44897
- // opened, not pressing its icon again. So the focus follows the floor into the
44898
- // control, unless the side refused it, and lands on the cap otherwise: whatever
44899
- // the newly collapsed slot held is inert now and was dropped to the document
44900
- // body by the browser, so it must go somewhere.
44901
- const focusWithTheFloor = (activeSlot, activeSide, activeCap) => {
44902
- if (activeSide.autoFocus !== false) {
44903
- const elementToFocus = findElementToFocus(activeSlot);
44904
- if (elementToFocus) {
44905
- elementToFocus.focus();
44915
+ // opened, not pressing its icon again.
44916
+ //
44917
+ // WHERE inside is navi's own ladder (findFocusTarget): an `autoFocus` in the
44918
+ // control's own content first, the first focusable otherwise, a last resort
44919
+ // after that. Unlike an arriving popup it keeps the first focusable even where
44920
+ // the pointer is coarse (see docs/autofocus.md): a cap is pressed to reach the
44921
+ // control it names, so a keyboard rising is the answer to that gesture rather
44922
+ // than a cost imposed on a screen that merely appeared. A side one reads before
44923
+ // writing in says `autoFocus={false}`.
44924
+ const focusWithTheFloor = (arrivingSlot, arrivingSide, arrivingCap) => {
44925
+ if (arrivingSide.autoFocus !== false) {
44926
+ const found = findFocusTarget(arrivingSlot);
44927
+ if (found) {
44928
+ moveFocusTo(found.target);
44906
44929
  return;
44907
44930
  }
44908
44931
  }
44932
+ // Whatever the leaving slot held is inert and off the window now, so the
44933
+ // browser dropped its focus to the document body: it has to land somewhere,
44934
+ // and the cap of the side taking over is where the gesture was.
44909
44935
  const {
44910
44936
  activeElement
44911
44937
  } = document;
44912
44938
  if (!activeElement || activeElement === document.body) {
44913
- activeCap.focus();
44939
+ moveFocusTo(arrivingCap);
44914
44940
  }
44915
44941
  };
44916
- const findElementToFocus = slot => {
44917
- const autofocusElement = slot.querySelector("[autofocus]");
44918
- if (autofocusElement) {
44919
- return autofocusElement;
44920
- }
44921
- return findAfter(slot, elementIsFocusable, {
44922
- root: slot
44923
- });
44924
- };
44925
44942
 
44926
44943
  const DEFAULT_VALIDITY_STATE = { valid: true, reported: null };
44927
44944
 
@@ -79532,5 +79549,5 @@ const UserSvg = () => jsx("svg", {
79532
79549
  })
79533
79550
  });
79534
79551
 
79535
- export { ActionRenderer, ActiveKeyboardShortcuts, Address, Badge, BadgeCount, BadgeList, Binder, Box, Button, ButtonCopyToClipboard, CalloutStatusIcon, Caption, CardLayout, CheckSvg, CheckboxGroup, CloseSvg, Code, Col, Colgroup, Color, ConstructionSvg, ControlGroup, ControlSwap, DaySpin, Details, Dialog, Editable, ErrorBoundary, ErrorBoundaryContext, ExclamationSvg, Expandable, EyeClosedSvg, EyeSvg, Field, FixedBar, Form, Group, Head, HeartSvg, HomeSvg, Icon, Image, InfoSvg, Input, InputDuration, Interpolate, Label, Link, LinkAnchorSvg, LinkBlankTargetSvg, LinkCurrentSvg, List, ListItem, ListItemGroup, ListItems, Loading, LoadingDotsSvg, LoadingIndicator, LoadingIndicatorFluid, LoadingOutline, MessageBox, Meter, Nav, NaviDebug, NumberSpin, OfflineError, Paragraph, Picker, Popover, Popup, Quantity, RadioGroup, Route, RouteTransitionArea, RouteTravel, RowNumberCol, RowNumberTableCell, SVGMaskOverlay, SearchSvg, Select, SelectableInput, SelectionContext, Separator, SettingsSvg, SidePanel, Slide, SlideContainer, Spin, SpinGroup, SplitButton, StarSvg, Step, StepList, SummaryMarker, Svg, Table, TableCell, Tbody, Text, TextBox, Textarea, TextareaCharCount, Thead, Time, TimeRange, TimeRangeSpin, TimeRangeWheel, TimeSpin, TimeWheel, Title, Tr, UITransition, Unit, UserSvg, ViewportLayout, Wheel, WheelGroup, WheelItem, actionRunEffect, anyMatchingRouteSignal, applySearch, arraySignalMembership, canNavBackSignal, canNavForwardSignal, coarsePointerSignal, compareTwoJsValues, constraintFromValidityRule, createAction, createAvailableConstraint, createI18n, createRequestCanceller, createSearch, createSelectionKeyboardShortcuts, createSlot, defineInteractionDetector, defineRouteDefaultTransition, defineRouteTransition, detectHorizontalOverflow, enableDebugActions, enableDebugOnDocumentLoading, ensureDocumentStartViewTransition, errorIsDisplayed, filterTableSelection, formatDatetime, formatDay, formatDayRelative, formatMonth, formatNumber, formatTime, formatTimeRelative, getNowHours, getNowHoursRoundedToStep, interpolateText, isCellSelected, isColumnSelected, isOfflineError, isRowSelected, isScrolling, isToday, languagesSignal, localStorageSignal, markErrorAsDisplayedBy, moveArrayItemByIndex, navBack, navForward, navIntegratedVia, navTo, naviI18n, openCallout, rawUrlPart, registerGlobalConstraint, reload, rerunActions, resource, route, routeAction, scrollActivitySignal, setBaseUrl, setNetworkPolicy, setPreferredLanguage, setSupportedLanguages, setUrlTargetOptions, setupRoutes, smallTouchScreenSignal, stateSignal, stopLoad, stringifyTableSelectionValue, swapArrayItemByIndex, syncOwnedResourceToSignals, syncResourceToSignals, triggerNaviCommand, updateActions, useActionStatus, useArraySignalMembership, useAsyncData, useCalloutElement, useCalloutRequestClose, useCanNavBack, useCanNavForward, useCancelPrevious, useCellGridFromRows, useConstraintValidityState, useDependenciesDiff, useDisplayedLayoutEffect, useDocumentResource, useDocumentState, useDocumentUrl, useEditionController, useFocusGroup, useInputGroup, useKeyboardShortcuts, useNavState, useNetworkPolicyReason, useOrderedColumns, usePopupMode, useRouteStatus, useSearchText, useSelectableElement, useSelectionController, useSignalSync, useSlideContainer, useSlideValue, useStateArray, useTitleLevel, useUrlSearchParam, useUrlTargetId, valueInLocalStorage, windowWidthSignal };
79552
+ export { ActionRenderer, ActiveKeyboardShortcuts, Address, Badge, BadgeCount, BadgeList, Binder, Box, Button, ButtonCopyToClipboard, CalloutStatusIcon, Caption, CardLayout, CheckSvg, CheckboxGroup, CloseSvg, Code, Col, Colgroup, Color, ConstructionSvg, ControlGroup, ControlSwap, DaySpin, Details, Dialog, Editable, ErrorBoundary, ErrorBoundaryContext, ExclamationSvg, Expandable, EyeClosedSvg, EyeSvg, Field, FixedBar, Form, Group, Head, HeartSvg, HomeSvg, Icon, Image, InfoSvg, Input, InputDuration, Interpolate, Label, Link, LinkAnchorSvg, LinkBlankTargetSvg, LinkCurrentSvg, List, ListItem, ListItemGroup, ListItems, Loading, LoadingDotsSvg, LoadingIndicator, LoadingIndicatorFluid, LoadingOutline, MessageBox, Meter, Nav, NaviDebug, NumberSpin, OfflineError, Paragraph, Picker, Popover, Popup, Quantity, RadioGroup, Route, RouteTransitionArea, RouteTravel, RowNumberCol, RowNumberTableCell, SVGMaskOverlay, SearchSvg, Select, SelectableInput, SelectionContext, Separator, SettingsSvg, SidePanel, Slide, SlideContainer, Spin, SpinGroup, SplitButton, StarSvg, Step, StepList, SummaryMarker, Svg, Table, TableCell, Tbody, Text, TextBox, Textarea, TextareaCharCount, Thead, Time, TimeRange, TimeRangeSpin, TimeRangeWheel, TimeSpin, TimeWheel, Title, Tr, UITransition, Unit, UserSvg, ViewportLayout, Wheel, WheelGroup, WheelItem, actionRunEffect, anyMatchingRouteSignal, applySearch, arraySignalMembership, canNavBackSignal, canNavForwardSignal, coarsePointerSignal, compareTwoJsValues, constraintFromValidityRule, createAction, createAvailableConstraint, createI18n, createRequestCanceller, createSearch, createSelectionKeyboardShortcuts, createSlot, defineInteractionDetector, defineRouteDefaultTransition, defineRouteTransition, detectHorizontalOverflow, enableDebugActions, enableDebugOnDocumentLoading, ensureDocumentStartViewTransition, errorIsDisplayed, filterTableSelection, formatDatetime, formatDay, formatDayRelative, formatMonth, formatNumber, formatTime, formatTimeRelative, getNowHours, getNowHoursRoundedToStep, interpolateText, isCellSelected, isColumnSelected, isOfflineError, isRowSelected, isScrolling, isToday, languagesSignal, localStorageSignal, markErrorAsDisplayedBy, moveArrayItemByIndex, moveFocusTo, navBack, navForward, navIntegratedVia, navTo, naviI18n, openCallout, rawUrlPart, registerGlobalConstraint, reload, rerunActions, resource, route, routeAction, scrollActivitySignal, setBaseUrl, setNetworkPolicy, setPreferredLanguage, setSupportedLanguages, setUrlTargetOptions, setupRoutes, smallTouchScreenSignal, stateSignal, stopLoad, stringifyTableSelectionValue, swapArrayItemByIndex, syncOwnedResourceToSignals, syncResourceToSignals, triggerNaviCommand, updateActions, useActionStatus, useArraySignalMembership, useAsyncData, useCalloutElement, useCalloutRequestClose, useCanNavBack, useCanNavForward, useCancelPrevious, useCellGridFromRows, useConstraintValidityState, useDependenciesDiff, useDisplayedLayoutEffect, useDocumentResource, useDocumentState, useDocumentUrl, useEditionController, useFocusGroup, useInputGroup, useKeyboardShortcuts, useNavState, useNetworkPolicyReason, useOrderedColumns, usePopupMode, useRouteStatus, useSearchText, useSelectableElement, useSelectionController, useSignalSync, useSlideContainer, useSlideValue, useStateArray, useTitleLevel, useUrlSearchParam, useUrlTargetId, valueInLocalStorage, windowWidthSignal };
79536
79553
  //# sourceMappingURL=jsenv_navi.js.map