@jsenv/navi 0.29.83 → 0.29.84

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.
@@ -22656,6 +22656,69 @@ const scrollTo = ({ x, y }) => {
22656
22656
  const [publishBeforeRouting, observeBeforeRouting] = createPubSub();
22657
22657
  const [publishAfterRouting, observeAfterRouting] = createPubSub();
22658
22658
 
22659
+ /**
22660
+ * Is there an entry of THIS document behind the current one? And ahead of it?
22661
+ *
22662
+ * A back arrow drawn inside an app promises to give back the screen it came
22663
+ * from — never the page the reader was on before the app. A url opened cold
22664
+ * (a shared link, a bookmark, a notification) has someone else's page under
22665
+ * it, and `window.history.length` cannot tell the two apart: it counts the
22666
+ * whole tab.
22667
+ *
22668
+ * So the count is kept here, and written into the state of each entry as it is
22669
+ * created, so it survives a reload in the middle of the stack. It cannot be
22670
+ * read back from an entry alone: a replaced entry inherits the state of the
22671
+ * one it takes the place of, so an entry's state does not say how it arrived.
22672
+ * Only the navigation being applied says that, which is why the integrations
22673
+ * (via_history.js, via_navigation.js) hand each navigation over here as they
22674
+ * apply it — the one place no push and no replace can escape.
22675
+ */
22676
+
22677
+
22678
+ const NAV_DEPTH_STATE_KEY = "jsenv_nav_depth";
22679
+
22680
+ const canNavBackSignal = signal(false);
22681
+ const useCanNavBack = () => {
22682
+ return canNavBackSignal.value;
22683
+ };
22684
+
22685
+ const canNavForwardSignal = signal(false);
22686
+ const useCanNavForward = () => {
22687
+ return canNavForwardSignal.value;
22688
+ };
22689
+
22690
+ // How many entries of this document stand under the current one, and how high
22691
+ // the stack goes above it. Both are unknown for entries this document never
22692
+ // created (a fragment navigation makes its own, and the browser stores no
22693
+ // state on it): those leave the count as it is, which under-reports rather
22694
+ // than promising a screen that is not there.
22695
+ let navDepth = 0;
22696
+ let navDepthMax = 0;
22697
+
22698
+ const getNavDepth = () => navDepth;
22699
+
22700
+ const applyNavigationToNavDepth = (navigationType, state) => {
22701
+ if (navigationType === "push") {
22702
+ navDepth++;
22703
+ // A push cuts whatever stood ahead.
22704
+ navDepthMax = navDepth;
22705
+ } else if (navigationType === "replace") ; else {
22706
+ // load, reload, traverse: the entry itself says where it stands.
22707
+ const depthInState =
22708
+ state && typeof state[NAV_DEPTH_STATE_KEY] === "number"
22709
+ ? state[NAV_DEPTH_STATE_KEY]
22710
+ : undefined;
22711
+ if (depthInState !== undefined) {
22712
+ navDepth = depthInState;
22713
+ if (navDepth > navDepthMax) {
22714
+ navDepthMax = navDepth;
22715
+ }
22716
+ }
22717
+ }
22718
+ canNavBackSignal.value = navDepth > 0;
22719
+ canNavForwardSignal.value = navDepth < navDepthMax;
22720
+ };
22721
+
22659
22722
  /*
22660
22723
  * A press aims at a place; it does not always go one step deeper. A row of tabs
22661
22724
  * is a lateral move — the neighbour is one finger away — so the whole row should
@@ -22815,6 +22878,11 @@ const setupBrowserIntegrationViaHistory = ({
22815
22878
  state,
22816
22879
  } = options;
22817
22880
 
22881
+ // Where the entry being reached stands in this document's own stack —
22882
+ // decided before the state that carries it is built (see
22883
+ // document_back_and_forward.js).
22884
+ applyNavigationToNavDepth(navigationType, state);
22885
+
22818
22886
  if (navigationType === "push" || navigationType === "replace") {
22819
22887
  markUrlAsVisited(url);
22820
22888
  // undefined → inherit current state (link click, neutral navigation)
@@ -22824,6 +22892,7 @@ const setupBrowserIntegrationViaHistory = ({
22824
22892
  let effectiveState;
22825
22893
  const sharedState = {
22826
22894
  jsenv_visited_urls: Array.from(visitedUrlSet),
22895
+ [NAV_DEPTH_STATE_KEY]: getNavDepth(),
22827
22896
  };
22828
22897
  if (state === undefined) {
22829
22898
  effectiveState = {
@@ -23026,8 +23095,18 @@ const setupBrowserIntegrationViaHistory = ({
23026
23095
  });
23027
23096
  };
23028
23097
 
23029
- const navBack = () => {
23030
- window.history.back();
23098
+ const navBack = ({ fallback } = {}) => {
23099
+ if (canNavBackSignal.peek()) {
23100
+ window.history.back();
23101
+ return;
23102
+ }
23103
+ if (fallback === undefined) {
23104
+ return;
23105
+ }
23106
+ // Replace, not push: pushing the fallback would put the screen just left
23107
+ // one press ahead, and the device's own back button would walk straight
23108
+ // back into it — a loop with no way out of the app.
23109
+ navTo(fallback, { replace: true });
23031
23110
  };
23032
23111
 
23033
23112
  const navForward = () => {
@@ -23238,6 +23317,21 @@ const stopLoad = (reason = "stopLoad() called") => {
23238
23317
  }
23239
23318
  };
23240
23319
  const reload = browserIntegration.reload;
23320
+ /**
23321
+ * Go back to the screen this document came from.
23322
+ *
23323
+ * Only ever within this document: at the bottom of the stack (a url opened
23324
+ * cold — a shared link, a bookmark, a notification), the entry underneath
23325
+ * belongs to whoever sent the reader here, and going back there would take
23326
+ * them out of the app. Ask `canNavBackSignal`/`useCanNavBack()` to know which
23327
+ * of the two cases the arrow is in.
23328
+ *
23329
+ * @param {object} [options]
23330
+ * @param {string} [options.fallback]
23331
+ * Where to land when there is nothing of this document behind. It takes the
23332
+ * place of the current entry rather than stacking on it. Without it, a
23333
+ * navBack() with nowhere to go does nothing.
23334
+ */
23241
23335
  const navBack = browserIntegration.navBack;
23242
23336
  const navForward = browserIntegration.navForward;
23243
23337
  const isVisited = browserIntegration.isVisited;
@@ -24928,6 +25022,20 @@ const useUIStateController = (
24928
25022
  })
24929
25023
  : ownUIStateSignal;
24930
25024
 
25025
+ // The two-way half of a bound `signal` prop: setting it re-renders and
25026
+ // re-syncs via state_prop_change, but with the same value → guarded as a
25027
+ // no-op, so no loop. For a checkbox/radio the signal holds the boolean
25028
+ // checked state.
25029
+ const writeBoundSignal = (uiState) => {
25030
+ const boundSignal = s.controlInfo?.signal;
25031
+ if (!boundSignal) {
25032
+ return;
25033
+ }
25034
+ boundSignal.value = s.controlInfo.signalHoldsChecked
25035
+ ? uiState !== undefined
25036
+ : uiState;
25037
+ };
25038
+
24931
25039
  const controller = {
24932
25040
  controlType,
24933
25041
  parentUIStateController,
@@ -24998,16 +25106,7 @@ const useUIStateController = (
24998
25106
  }
24999
25107
  // Trigger uiAction/command side effects without changing UI state.
25000
25108
  const currentUIState = controller.uiState;
25001
- // Write the new state back into a bound signal (the two-way `signal`
25002
- // prop). Setting it re-renders and re-syncs via state_prop_change, but
25003
- // with the same value → guarded as a no-op, so no loop. For a
25004
- // checkbox/radio the signal holds the boolean checked state.
25005
- const boundSignal = s.controlInfo?.signal;
25006
- if (boundSignal) {
25007
- boundSignal.value = s.controlInfo.signalHoldsChecked
25008
- ? currentUIState !== undefined
25009
- : currentUIState;
25010
- }
25109
+ writeBoundSignal(currentUIState);
25011
25110
  s.uiActionInternal?.(currentUIState, e);
25012
25111
  if (s.uiAction) {
25013
25112
  debugUIState(`calling uiAction for ${controlType}`, currentUIState);
@@ -25167,6 +25266,11 @@ const useUIStateController = (
25167
25266
  }
25168
25267
  }
25169
25268
  if (isInternalEvent(e)) {
25269
+ if (isPropagateDownEvent(e)) {
25270
+ // A bound signal mirrors what the control holds, and what it
25271
+ // holds just changed — see isPropagateDownEvent.
25272
+ writeBoundSignal(newUIState);
25273
+ }
25170
25274
  if (e.type === "facade_child_mount_sync") {
25171
25275
  const wasEmptyString =
25172
25276
  currentUIState === "" && newUIState === undefined;
@@ -25827,12 +25931,12 @@ const useUIGroupStateController = (
25827
25931
  // makes from its own setUIState (see useUIStateController's boundSignal),
25828
25932
  // for a group whose value is its children's put together.
25829
25933
  //
25830
- // Called from both paths a user-driven change can take applyState when
25831
- // the change is notified outward, syncInternalState when the group only
25832
- // brings itself up to date because either one can be the user
25833
- // answering. The paths that are NOT the user (a value prop pushed down,
25834
- // the initial push, mount/unmount) are excluded at each call site rather
25835
- // than guessed at here.
25934
+ // Called from every path where what the group holds really moves:
25935
+ // applyState when the change is notified outward, syncInternalState when
25936
+ // the group only brings itself up to date, and the value arriving from
25937
+ // above (see isPropagateDownEvent). Which one it is gets decided at each
25938
+ // call site rather than guessed at here the initial push and the
25939
+ // mount/unmount syncs leave the signal alone.
25836
25940
  const writeBoundSignal = (newUIState) => {
25837
25941
  const boundSignal = s.props?.signal;
25838
25942
  if (boundSignal) {
@@ -25935,6 +26039,9 @@ const useUIGroupStateController = (
25935
26039
  return;
25936
26040
  }
25937
26041
  applyState(groupUIState, e, { internalBehavior: true });
26042
+ if (isPropagateDownEvent(e)) {
26043
+ writeBoundSignal(groupUIState);
26044
+ }
25938
26045
  },
25939
26046
  syncInternalState: (newUIState) => {
25940
26047
  const currentUIState = controller.uiState;
@@ -26537,6 +26644,27 @@ const isInternalEvent = (e) => {
26537
26644
  return INTERNAL_EVENT_SET.has(e.type);
26538
26645
  };
26539
26646
 
26647
+ /**
26648
+ * A value handed DOWN to a control by whoever owns it: a picker filling its
26649
+ * popup (on open, and again when Escape puts back what it held), a group
26650
+ * placing its children, a reset cascading through them.
26651
+ *
26652
+ * Internal, so no reaction fires — nobody acted. But the control's state really
26653
+ * did move, and a bound `signal` is that state's mirror rather than a reaction
26654
+ * to it: leaving it behind makes the app and the control disagree about what is
26655
+ * on screen, which is how a popup reopens on the tab the user cancelled out of.
26656
+ * The way UP is deliberately not part of this: a picker's own signal is written
26657
+ * when the picker commits, not while its popup is being played with.
26658
+ */
26659
+ const PROPAGATE_DOWN_EVENT_SET = new Set([
26660
+ "propagate_down_set_ui_state",
26661
+ "propagate_down_reset_ui_state",
26662
+ "propagate_down_clear_ui_state",
26663
+ ]);
26664
+ const isPropagateDownEvent = (e) => {
26665
+ return PROPAGATE_DOWN_EVENT_SET.has(e.type);
26666
+ };
26667
+
26540
26668
  /**
26541
26669
  * The synthetic "input" event is how the new state reaches the outside world
26542
26670
  * (`uiAction` is called from the input handler it triggers). It carries what
@@ -52100,8 +52228,8 @@ const causeOfEvent = event => {
52100
52228
  const readArea = slideElement => slideElement.getAttribute("data-slide-area") || slideElement.id || "";
52101
52229
 
52102
52230
  /**
52103
- * The slide shown can be driven from outside (`current` + `onCurrentChange`) or
52104
- * left to the container, which then answers the
52231
+ * The slide shown can be driven from outside (a `signal`, or `current` +
52232
+ * `onCurrentChange`) or left to the container, which then answers the
52105
52233
  * --navi-left/--navi-right/--navi-up/--navi-down commands sent from anything
52106
52234
  * inside it.
52107
52235
  *
@@ -52134,6 +52262,15 @@ const readArea = slideElement => slideElement.getAttribute("data-slide-area") ||
52134
52262
  * written is simply not there.
52135
52263
  * @param {string} [props.current] - area (or id) of the slide being shown; omit
52136
52264
  * to keep it here and drive it by command.
52265
+ * @param {import("@preact/signals").Signal<string>} [props.signal] - the same
52266
+ * thing said the way every navi control says it: the container shows the area
52267
+ * the signal holds, and writes into it the area it travels to. One binding
52268
+ * instead of `current` + `onCurrentChange`, and the state stays where the app
52269
+ * put it — which is what lets something else read where the slides are (a
52270
+ * field carrying the current tab into a form, see
52271
+ * docs/control_object.md#a-settings-sheet) or move them by writing it.
52272
+ * Excludes `current`; `onCurrentChange` still fires, for the `cause` and for
52273
+ * the right to refuse.
52137
52274
  * @param {string} [props.defaultCurrent] - which slide to open on, when the
52138
52275
  * travel is left to the container. Mount-only, like every other `default*`:
52139
52276
  * it says where one starts, not where one is — say `current` for that.
@@ -52205,6 +52342,7 @@ const readArea = slideElement => slideElement.getAttribute("data-slide-area") ||
52205
52342
  const SlideContainer = ({
52206
52343
  layout = "row",
52207
52344
  current: currentProp,
52345
+ signal: currentSignal,
52208
52346
  defaultCurrent,
52209
52347
  onCurrentChange,
52210
52348
  commit = "now",
@@ -52303,7 +52441,8 @@ const SlideContainer = ({
52303
52441
  // draw in CSS alone, at the pace of the travel and under the finger, with
52304
52442
  // nothing measured per frame.
52305
52443
  const followerElementsRef = useRef([]);
52306
- const current = rollingArea ?? provisionalArea ?? currentProp ?? currentAreaState;
52444
+ const currentFromCaller = currentSignal ? currentSignal.value : currentProp;
52445
+ const current = rollingArea ?? provisionalArea ?? currentFromCaller ?? currentAreaState;
52307
52446
  const vertical = layout === "column";
52308
52447
  // What the map has, and what each way of asking is allowed to use of it.
52309
52448
  const mapAxes = travelAxesOf(layout);
@@ -52338,11 +52477,11 @@ const SlideContainer = ({
52338
52477
  if (provisionalArea === null) {
52339
52478
  return;
52340
52479
  }
52341
- const heldOutside = currentProp ?? currentAreaState;
52480
+ const heldOutside = currentFromCaller ?? currentAreaState;
52342
52481
  if (heldOutside === provisionalArea) {
52343
52482
  setProvisionalArea(null);
52344
52483
  }
52345
- }, [provisionalArea, currentProp, currentAreaState]);
52484
+ }, [provisionalArea, currentFromCaller, currentAreaState]);
52346
52485
 
52347
52486
  // The travel is given back as soon as the picture it must not animate has
52348
52487
  // been painted: one frame with it off is all it takes.
@@ -52519,10 +52658,10 @@ const SlideContainer = ({
52519
52658
  const commitAtRest = commitAtRestRef.current;
52520
52659
  if (commitAtRest && commitAtRest.area === currentArea) {
52521
52660
  commitAtRestRef.current = null;
52522
- answerCurrentChange(onCurrentChange(commitAtRest.area, {
52661
+ tellCurrentChange(commitAtRest.area, {
52523
52662
  cause: commitAtRest.cause,
52524
52663
  event: commitAtRest.event
52525
- }), commitAtRest.leftArea);
52664
+ }, commitAtRest.leftArea);
52526
52665
  }
52527
52666
  };
52528
52667
 
@@ -52896,7 +53035,7 @@ const SlideContainer = ({
52896
53035
  }
52897
53036
  const leftArea = readArea(currentElement);
52898
53037
  setCurrentAreaState(area);
52899
- if (!onCurrentChange) {
53038
+ if (!onCurrentChange && !currentSignal) {
52900
53039
  return true;
52901
53040
  }
52902
53041
  // What asked for this, read off the interaction rather than carried down
@@ -52920,13 +53059,26 @@ const SlideContainer = ({
52920
53059
  };
52921
53060
  return true;
52922
53061
  }
52923
- answerCurrentChange(onCurrentChange(area, {
53062
+ tellCurrentChange(area, {
52924
53063
  cause,
52925
53064
  event
52926
- }), leftArea);
53065
+ }, leftArea);
52927
53066
  return true;
52928
53067
  };
52929
53068
 
53069
+ // The caller learns where the container went: the bound signal is written and
53070
+ // `onCurrentChange` is called, in that order, so a caller reading the signal
53071
+ // from inside its own handler reads where it now is.
53072
+ const tellCurrentChange = (area, detail, leftArea) => {
53073
+ if (currentSignal) {
53074
+ currentSignal.value = area;
53075
+ }
53076
+ if (!onCurrentChange) {
53077
+ return;
53078
+ }
53079
+ answerCurrentChange(onCurrentChange(area, detail), leftArea);
53080
+ };
53081
+
52930
53082
  // What a caller says back about a change it was told about: nothing, or a
52931
53083
  // refusal. `false` refuses it — a guard that says no, a session that is gone —
52932
53084
  // and a promise refuses it late, once whatever it had to ask has answered. A
@@ -52948,6 +53100,9 @@ const SlideContainer = ({
52948
53100
  const goBackToRefusedArea = leftArea => {
52949
53101
  setProvisionalArea(null);
52950
53102
  setCurrentAreaState(leftArea);
53103
+ if (currentSignal) {
53104
+ currentSignal.value = leftArea;
53105
+ }
52951
53106
  };
52952
53107
 
52953
53108
  // The press kept during a roll, taken once the window rests and the travel is
@@ -75208,5 +75363,5 @@ const UserSvg = () => jsx("svg", {
75208
75363
  })
75209
75364
  });
75210
75365
 
75211
- export { ActionRenderer, ActiveKeyboardShortcuts, Address, Badge, BadgeCount, BadgeList, Binder, Box, Button, ButtonCopyToClipboard, Caption, CardLayout, CheckSvg, CheckboxGroup, CloseSvg, Code, Col, Colgroup, Color, ConstructionSvg, ControlGroup, DaySpin, Details, Dialog, Editable, ErrorBoundary, ErrorBoundaryContext, ExclamationSvg, EyeClosedSvg, EyeSvg, Field, FixedBar, Form, Group, Head, HeartSvg, HomeSvg, Icon, Image, Input, InputDuration, Interpolate, Label, Link, LinkAnchorSvg, LinkBlankTargetSvg, LinkCurrentSvg, List, ListItem, ListItemGroup, ListItems, Loading, LoadingDotsSvg, LoadingIndicator, LoadingIndicatorFluid, LoadingOutline, MessageBox, Meter, Nav, NaviDebug, NumberSpin, 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, SummaryMarker, Svg, Table, TableCell, Tbody, Text, TextBox, Textarea, TextareaCharCount, Thead, Time, TimeRangeSpin, TimeSpin, Title, Tr, UITransition, Unit, UserSvg, ViewportLayout, Wheel, WheelGroup, WheelItem, actionRunEffect, anyMatchingRouteSignal, applySearch, arraySignalMembership, coarsePointerSignal, compareTwoJsValues, createAction, createAvailableConstraint, createI18n, createRequestCanceller, createSearch, createSelectionKeyboardShortcuts, createSlot, defineInteractionDetector, defineNaviConfirmPopupOptions, defineRouteDefaultTransition, defineRouteTransition, detectHorizontalOverflow, enableDebugActions, enableDebugOnDocumentLoading, ensureDocumentStartViewTransition, errorIsDisplayed, filterTableSelection, formatDatetime, formatDay, formatDayRelative, formatMonth, formatNumber, formatTime, formatTimeRelative, getNowHours, getNowHoursRoundedToStep, interpolateText, isCellSelected, isColumnSelected, isRowSelected, isScrolling, isToday, languagesSignal, localStorageSignal, markErrorAsDisplayedBy, moveArrayItemByIndex, navBack, navForward, navIntegratedVia, navTo, naviI18n, openCallout, rawUrlPart, registerGlobalConstraint, reload, rerunActions, resource, route, routeAction, scrollActivitySignal, setBaseUrl, setPreferredLanguage, setSupportedLanguages, setUrlTargetOptions, setupRoutes, smallTouchScreenSignal, stateSignal, stopLoad, stringifyTableSelectionValue, swapArrayItemByIndex, syncOwnedResourceToSignals, syncResourceToSignals, triggerNaviCommand, updateActions, useActionStatus, useArraySignalMembership, useAsyncData, useCalloutRequestClose, useCancelPrevious, useCellGridFromRows, useConstraintValidityState, useDependenciesDiff, useDisplayedLayoutEffect, useDocumentResource, useDocumentState, useDocumentUrl, useEditionController, useFocusGroup, useInputGroup, useKeyboardShortcuts, useNavState, useOrderedColumns, usePopupMode, useRouteStatus, useRunOnMount, useSearchText, useSelectableElement, useSelectionController, useSignalSync, useSlideValue, useStateArray, useTitleLevel, useUrlSearchParam, useUrlTargetId, valueInLocalStorage, windowWidthSignal };
75366
+ export { ActionRenderer, ActiveKeyboardShortcuts, Address, Badge, BadgeCount, BadgeList, Binder, Box, Button, ButtonCopyToClipboard, Caption, CardLayout, CheckSvg, CheckboxGroup, CloseSvg, Code, Col, Colgroup, Color, ConstructionSvg, ControlGroup, DaySpin, Details, Dialog, Editable, ErrorBoundary, ErrorBoundaryContext, ExclamationSvg, EyeClosedSvg, EyeSvg, Field, FixedBar, Form, Group, Head, HeartSvg, HomeSvg, Icon, Image, Input, InputDuration, Interpolate, Label, Link, LinkAnchorSvg, LinkBlankTargetSvg, LinkCurrentSvg, List, ListItem, ListItemGroup, ListItems, Loading, LoadingDotsSvg, LoadingIndicator, LoadingIndicatorFluid, LoadingOutline, MessageBox, Meter, Nav, NaviDebug, NumberSpin, 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, SummaryMarker, Svg, Table, TableCell, Tbody, Text, TextBox, Textarea, TextareaCharCount, Thead, Time, TimeRangeSpin, TimeSpin, Title, Tr, UITransition, Unit, UserSvg, ViewportLayout, Wheel, WheelGroup, WheelItem, actionRunEffect, anyMatchingRouteSignal, applySearch, arraySignalMembership, canNavBackSignal, canNavForwardSignal, coarsePointerSignal, compareTwoJsValues, createAction, createAvailableConstraint, createI18n, createRequestCanceller, createSearch, createSelectionKeyboardShortcuts, createSlot, defineInteractionDetector, defineNaviConfirmPopupOptions, defineRouteDefaultTransition, defineRouteTransition, detectHorizontalOverflow, enableDebugActions, enableDebugOnDocumentLoading, ensureDocumentStartViewTransition, errorIsDisplayed, filterTableSelection, formatDatetime, formatDay, formatDayRelative, formatMonth, formatNumber, formatTime, formatTimeRelative, getNowHours, getNowHoursRoundedToStep, interpolateText, isCellSelected, isColumnSelected, isRowSelected, isScrolling, isToday, languagesSignal, localStorageSignal, markErrorAsDisplayedBy, moveArrayItemByIndex, navBack, navForward, navIntegratedVia, navTo, naviI18n, openCallout, rawUrlPart, registerGlobalConstraint, reload, rerunActions, resource, route, routeAction, scrollActivitySignal, setBaseUrl, setPreferredLanguage, setSupportedLanguages, setUrlTargetOptions, setupRoutes, smallTouchScreenSignal, stateSignal, stopLoad, stringifyTableSelectionValue, swapArrayItemByIndex, syncOwnedResourceToSignals, syncResourceToSignals, triggerNaviCommand, updateActions, useActionStatus, useArraySignalMembership, useAsyncData, useCalloutRequestClose, useCanNavBack, useCanNavForward, useCancelPrevious, useCellGridFromRows, useConstraintValidityState, useDependenciesDiff, useDisplayedLayoutEffect, useDocumentResource, useDocumentState, useDocumentUrl, useEditionController, useFocusGroup, useInputGroup, useKeyboardShortcuts, useNavState, useOrderedColumns, usePopupMode, useRouteStatus, useRunOnMount, useSearchText, useSelectableElement, useSelectionController, useSignalSync, useSlideValue, useStateArray, useTitleLevel, useUrlSearchParam, useUrlTargetId, valueInLocalStorage, windowWidthSignal };
75212
75367
  //# sourceMappingURL=jsenv_navi.js.map