@jsenv/navi 0.29.224 → 0.29.226

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.
package/README.md CHANGED
@@ -14,6 +14,8 @@ How to declare routes, render them, and turn them into tabs — including `Route
14
14
 
15
15
  Actions are async operations with lifecycle management — pending, success, error. You can declare actions that run when navigating to a route, and any component can subscribe to them via `useAsyncData` to reflect what is happening: loading states, results, errors. No manual wiring.
16
16
 
17
+ Code loaded on demand is the same thing: a page's `import()` is a route action, started with the page's data on the url change and prefetched when a link to it is hovered or focused; a component inside a page that stays reads its own with `useAsyncData(() => import(…))`. One wait, one failure, no lazy-shaped API. See [docs/dynamic_import.md](./docs/dynamic_import.md).
18
+
17
19
  ## REST state
18
20
 
19
21
  `resource()` turns a REST endpoint into a reactive store: one action per verb, a
@@ -17336,6 +17336,17 @@ const useAsyncData = (promiseOrAction, {
17336
17336
  run,
17337
17337
  onLoad
17338
17338
  } = {}) => {
17339
+ // The request this component owns, as a function: one action per instance,
17340
+ // made on the first render and kept — the function's identity changes on
17341
+ // every render when it is written inline, the action's does not.
17342
+ const ownActionRef = useRef(null);
17343
+ if (typeof promiseOrAction === "function" && !promiseOrAction.isAction) {
17344
+ if (!ownActionRef.current) {
17345
+ ownActionRef.current = createAction(promiseOrAction);
17346
+ }
17347
+ promiseOrAction = ownActionRef.current;
17348
+ run = true;
17349
+ }
17339
17350
  const isAction = Boolean(promiseOrAction && promiseOrAction.isAction);
17340
17351
  if (loading === true) {
17341
17352
  loading = "use";
@@ -17659,9 +17670,9 @@ const LoadingFallback = ({
17659
17670
  // A suspension nobody here wrote — preact/compat's lazy(), a promise thrown
17660
17671
  // by hand: the boundary holds the subtree and has nothing to say about it,
17661
17672
  // so the fallback is not drawn. Said out loud in dev rather than found by
17662
- // reading this file; navi's own lazy() is an action and never lands here.
17673
+ // reading this file; an import read through an action never lands here.
17663
17674
  if (!action) {
17664
- console.warn(`<Loading> caught a suspension it cannot attribute to an action, so its fallback is not drawn. For code loaded on demand use lazy() from @jsenv/navi (see docs/dynamic_import.md).`);
17675
+ console.warn(`<Loading> caught a suspension it cannot attribute to an action, so its fallback is not drawn. Read code loaded on demand through an action — a routeAction or useAsyncData(() => import(...)) — see docs/dynamic_import.md.`);
17665
17676
  }
17666
17677
  if (loadingRef.current.reason !== "loading") {
17667
17678
  return null;
@@ -17779,86 +17790,6 @@ const ErrorBoundary = ({
17779
17790
  return children;
17780
17791
  };
17781
17792
 
17782
- /**
17783
- * A component whose code is fetched on demand, the way its data is.
17784
- *
17785
- * The import is an action: it starts from the first render that needs it (or
17786
- * from `preload()`), waits in the nearest `<Loading>`, fails in the nearest
17787
- * `<ErrorBoundary>` with a `rerun` as the way back, and is counted by the
17788
- * document busy signal like any other run. A page under `<Route>` therefore
17789
- * fetches its code and its route action's data side by side, and shows one
17790
- * wait for the two. See docs/dynamic_import.md.
17791
- */
17792
-
17793
-
17794
- /**
17795
- * @param {() => Promise<Function | object>} load - what fetches the code,
17796
- * typically `() => import("./page.jsx")`. May resolve to the component
17797
- * itself or to the module: its `default` export, or its only exported
17798
- * function.
17799
- * @returns {Function & { preload: () => void, action: object }} the component,
17800
- * rendering the loaded one with its props. `preload()` starts the fetch ahead
17801
- * of the render — on a link hovered, on an idle moment; a prefetch that fails
17802
- * is forgotten, the visit asks again.
17803
- */
17804
- const lazy = load => {
17805
- const loadAction = createAction(async () => {
17806
- const loaded = await load();
17807
- return resolveComponent(loaded);
17808
- }, {
17809
- name: nameFromLoader(load)
17810
- });
17811
- const Lazy = props => {
17812
- const [Component] = useAsyncData(loadAction, {
17813
- run: true
17814
- });
17815
- return h(Component, props);
17816
- };
17817
- Lazy.displayName = `Lazy(${loadAction.name})`;
17818
- Lazy.action = loadAction;
17819
- // A prefetch is a prerun: nothing on screen asked for it. One that fails is
17820
- // forgotten rather than reported — the visit that needs the code asks again
17821
- // and shows its own failure; a boundary already showing this one keeps it
17822
- // until the retry runs.
17823
- Lazy.preload = () => {
17824
- const prerunResult = loadAction.prerun({
17825
- reason: "preload"
17826
- });
17827
- // A run already in flight or done answers with nothing to wait for.
17828
- if (prerunResult && typeof prerunResult.catch === "function") {
17829
- prerunResult.catch(() => {
17830
- loadAction.reset({
17831
- reason: "preload failed"
17832
- });
17833
- });
17834
- }
17835
- };
17836
- return Lazy;
17837
- };
17838
- const resolveComponent = loaded => {
17839
- if (typeof loaded === "function") {
17840
- return loaded;
17841
- }
17842
- if (loaded && typeof loaded === "object") {
17843
- if (typeof loaded.default === "function") {
17844
- return loaded.default;
17845
- }
17846
- const functionExportNames = Object.keys(loaded).filter(key => typeof loaded[key] === "function");
17847
- if (functionExportNames.length === 1) {
17848
- return loaded[functionExportNames[0]];
17849
- }
17850
- throw new Error(`lazy(): the module must export one component, found ${functionExportNames.length} (${functionExportNames.join(", ") || "none"}). Return the component from the loader to say which.`);
17851
- }
17852
- throw new Error(`lazy(): expected a component or a module, got ${loaded}`);
17853
- };
17854
-
17855
- // The specifier read off the loader's source, so the action (and the busy
17856
- // signal, and the debug output) says which page is being fetched.
17857
- const nameFromLoader = load => {
17858
- const match = /import\(\s*["']([^"']+)["']/.exec(String(load));
17859
- return match ? `import ${match[1]}` : "lazy";
17860
- };
17861
-
17862
17793
  /**
17863
17794
  * Creates a function that generates abort signals, automatically cancelling previous requests.
17864
17795
  *
@@ -25073,11 +25004,9 @@ const route = (
25073
25004
  return `route "${cleanPattern}"`;
25074
25005
  },
25075
25006
  };
25076
- // What fetches the code of this route ahead of the render — the lazy
25077
- // elements the routers on screen have registered for it (see
25078
- // registerRoutePreload). Code only: the data is the route action's, asked
25079
- // for on arrival with the params the address holds, and a prefetch has no
25080
- // address yet.
25007
+ // Asks ahead of the arrival for what this route's actions ask without the
25008
+ // address — a page's code, a read without params (see routeAction). An
25009
+ // action keyed by a param waits for the arrival: a prefetch has no address.
25081
25010
  route.preload = () => {
25082
25011
  const preloadSet = routePreloadMap.get(route);
25083
25012
  if (!preloadSet) {
@@ -25570,10 +25499,10 @@ const registerRoutePreload = (route, preload) => {
25570
25499
  preloadSet.add(preload);
25571
25500
  };
25572
25501
  /**
25573
- * Fetches the code of every route the url leads to, a section and the page
25574
- * inside it alike. What a link does when the pointer or the focus reaches it
25575
- * (see use_preload_on_intent.js), available to anything else that knows where
25576
- * it is about to go.
25502
+ * Preloads every route the url leads to, a section and the page inside it
25503
+ * alike. What a link does when the pointer or the focus reaches it (see
25504
+ * use_preload_on_intent.js), available to anything else that knows where it
25505
+ * is about to go.
25577
25506
  */
25578
25507
  const preloadUrl = (url) => {
25579
25508
  if (!activeRouteSet) {
@@ -27612,12 +27541,8 @@ const collectBranches = children => {
27612
27541
  children: nodeChildren,
27613
27542
  fallback,
27614
27543
  route,
27615
- routeParams,
27616
- element
27544
+ routeParams
27617
27545
  } = child.props;
27618
- if (route) {
27619
- registerElementPreload(route, element);
27620
- }
27621
27546
  if (nodeChildren) {
27622
27547
  const {
27623
27548
  matchingBranch: matchingChild
@@ -27667,17 +27592,6 @@ const collectBranches = children => {
27667
27592
  activeBranch
27668
27593
  };
27669
27594
  };
27670
- // A branch whose element fetches its code on demand (see lazy.jsx) tells its
27671
- // route, so that intent on a link to that route — or `route.preload()` — can
27672
- // fetch it ahead of the render. Read off the vnode the container walks, which
27673
- // is why a router on screen is what knows: a section's sub-pages register when
27674
- // the section renders its own router.
27675
- const registerElementPreload = (route, element) => {
27676
- const type = element && element.type ? element.type : element;
27677
- if (type && typeof type.preload === "function") {
27678
- registerRoutePreload(route, type.preload);
27679
- }
27680
- };
27681
27595
  const wrapBranch = (branch, wrapper) => {
27682
27596
  return {
27683
27597
  ...branch,
@@ -31302,20 +31216,55 @@ const writeCover = (edge, element, size) => {
31302
31216
  style.setProperty(property, value);
31303
31217
  };
31304
31218
 
31219
+ /**
31220
+ * Binds an action to a route: it runs when the route matches, with the params
31221
+ * the effect reads off the address, and is aborted when the route is left.
31222
+ * Its data, its wait and its failure are read by the page through
31223
+ * `useAsyncData`.
31224
+ *
31225
+ * A page's CODE is declared the same way — the import is one more thing the
31226
+ * address asks for, started with the data rather than after it:
31227
+ *
31228
+ * ```js
31229
+ * const GAME_PAGE_CODE = routeAction(GAME_ROUTE, () =>
31230
+ * import("./game_page.jsx").then((m) => m.GamePage),
31231
+ * );
31232
+ * ```
31233
+ *
31234
+ * @param {object | object[]} routeOrRoutes - the route, or the routes, this
31235
+ * action belongs to.
31236
+ * @param {object | Function} action - an action, or a function made into one.
31237
+ * @param {() => any} [paramsEffect] - what the action runs with, read off
31238
+ * signals (the route's params, a search param): re-read when they change.
31239
+ * Return a falsy value to run nothing. Without it the action asks nothing of
31240
+ * the address, which is also what makes it worth fetching AHEAD of the
31241
+ * arrival: a link to the route preruns it when the pointer or the focus
31242
+ * reaches the link (see docs/dynamic_import.md). An action whose params
31243
+ * come from the address is never prefetched — a prefetch has no address.
31244
+ * @param {object} [options]
31245
+ * @param {boolean} [options.prefetch=true] - `false` keeps a param-less action
31246
+ * from being prerun on intent, when the read is not worth a hover.
31247
+ */
31305
31248
  const routeAction = (
31306
31249
  routeOrRoutes,
31307
31250
  action,
31308
- paramsEffect = () => true,
31309
- options = {},
31251
+ paramsEffect,
31252
+ { prefetch = true, ...options } = {},
31310
31253
  ) => {
31311
- const routeMatchingSignal = Array.isArray(routeOrRoutes)
31312
- ? anyMatchingRouteSignal(routeOrRoutes)
31313
- : routeOrRoutes.matchingSignal;
31254
+ if (typeof action === "function") {
31255
+ action = createAction(action);
31256
+ }
31257
+ const routes = Array.isArray(routeOrRoutes) ? routeOrRoutes : [routeOrRoutes];
31258
+ const routeMatchingSignal =
31259
+ routes.length === 1
31260
+ ? routes[0].matchingSignal
31261
+ : anyMatchingRouteSignal(routes);
31262
+ const readParams = paramsEffect || (() => true);
31314
31263
  const actionBoundToRoute = actionRunEffect(
31315
31264
  action,
31316
31265
  () => {
31317
31266
  const matching = routeMatchingSignal.value;
31318
- const params = paramsEffect();
31267
+ const params = readParams();
31319
31268
  if (!matching) {
31320
31269
  return null;
31321
31270
  }
@@ -31323,10 +31272,38 @@ const routeAction = (
31323
31272
  },
31324
31273
  options,
31325
31274
  );
31326
-
31275
+ if (!paramsEffect && prefetch) {
31276
+ for (const route of routes) {
31277
+ registerRoutePreload(route, () => {
31278
+ prefetchParamless(action);
31279
+ });
31280
+ }
31281
+ }
31327
31282
  return actionBoundToRoute;
31328
31283
  };
31329
31284
 
31285
+ // The instance the effect above runs on the match is the one bound to `true`
31286
+ // (the default params), so a prerun here is what the arrival promotes to a
31287
+ // run. A prefetch that fails is not reported: nothing on screen asked for it,
31288
+ // and the failure stays on the instance, where a run asks again — a FAILED
31289
+ // action is run, only RUNNING and COMPLETED are left alone — and the arrival
31290
+ // shows its own. It is left FAILED on purpose, not reset: the press that
31291
+ // brings the arrival also focuses the link, so a prerun can be in flight when
31292
+ // the arrival promotes it, and a reset landing after that would pull the
31293
+ // answer from under the page that is reading it.
31294
+ const prefetchParamless = (action) => {
31295
+ const instance = action.bindParams(true);
31296
+ let result;
31297
+ try {
31298
+ result = instance.prerun({ reason: "intent" });
31299
+ } catch {
31300
+ return;
31301
+ }
31302
+ if (result && typeof result.catch === "function") {
31303
+ result.catch(() => {});
31304
+ }
31305
+ };
31306
+
31330
31307
  // I delibrately prefer the term "any" and avoid "some" so dev are not tempted to think
31331
31308
  // "well I could just use array.some" and bypass this helper entirely, which would be incorrect:
31332
31309
  // This helper does return if some/any route is matching but ensure all route matching signals are read (subscribed to)
@@ -41313,10 +41290,11 @@ const Icon = ({
41313
41290
  };
41314
41291
 
41315
41292
  /**
41316
- * The code of where a link leads, fetched when the pointer or the focus
41317
- * arrives on it: the moment the user signals a destination, before the press.
41318
- * Only code is fetched (see route.preload), so a link whose address is not the
41319
- * final one — an id still to be chosen — loses nothing by asking.
41293
+ * Where a link leads, asked for when the pointer or the focus arrives on it:
41294
+ * the moment the user signals a destination, before the press. Only what the
41295
+ * route's actions ask without the address is fetched (see route.preload), so
41296
+ * a link whose address is not the final one — an id still to be chosen —
41297
+ * loses nothing by asking.
41320
41298
  */
41321
41299
  const usePreloadOnIntent = (ref, href, prefetch = true) => {
41322
41300
  useEffect(() => {
@@ -41850,8 +41828,10 @@ Object.assign(PSEUDO_CLASSES, {
41850
41828
  * button leaves by where the reader came in.
41851
41829
  * @param {boolean} [props.prefetch=true] Fetch the code of where this leads when the
41852
41830
  * pointer or the focus arrives, ahead of the press (see
41853
- * docs/dynamic_import.md). Code only: the data stays the route action's.
41854
- * `false` for a destination not worth fetching on a hover.
41831
+ * docs/dynamic_import.md): the route actions that ask nothing of the
41832
+ * address — a page's code, a read without params — are prerun; one keyed by
41833
+ * a param waits for the arrival. `false` for a destination not worth
41834
+ * fetching on a hover.
41855
41835
  * @param {string} [props.command] - What the press asks of a control around
41856
41836
  * the link — `"--navi-close"` on a link that leaves the sheet it is in.
41857
41837
  * Triggered on the press, before the navigation.
@@ -48380,8 +48360,10 @@ const COMMAND_DEFAULT_PROPS_FACTORIES = {
48380
48360
  * as a button.
48381
48361
  * @param {boolean} [prefetch=true] Fetch the code of where this leads when the
48382
48362
  * pointer or the focus arrives, ahead of the press (see
48383
- * docs/dynamic_import.md). Code only: the data stays the route action's.
48384
- * `false` for a destination not worth fetching on a hover.
48363
+ * docs/dynamic_import.md): the route actions that ask nothing of the
48364
+ * address — a page's code, a read without params — are prerun; one keyed by
48365
+ * a param waits for the arrival. `false` for a destination not worth
48366
+ * fetching on a hover.
48385
48367
  * @param {boolean} [pressableDuringRouteTransition] Keep answering presses
48386
48368
  * while a route transition plays: what a movement photographs goes deaf to
48387
48369
  * the pointer for its whole length, and the door that opened the page — a
@@ -83898,5 +83880,5 @@ const UserSvg = () => jsx("svg", {
83898
83880
  })
83899
83881
  });
83900
83882
 
83901
- 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, createRequestCanceller, createSearch, createSelectionKeyboardShortcuts, createSlot, defineInteractionDetector, defineRouteDefaultTransition, defineRouteTransition, detectHorizontalOverflow, dispatchRequestSetUIState, enableDebugActions, enableDebugOnDocumentLoading, ensureDocumentStartViewTransition, errorIsDisplayed, filterTableSelection, getNowHours, getNowHoursRoundedToStep, isCellSelected, isColumnSelected, isOfflineError, isRowSelected, isScrolling, isToday, languagesSignal, lazy, localStorageSignal, markAsOutsideTextFlow, markErrorAsDisplayedBy, moveArrayItemByIndex, moveFocusTo, navBack, navForward, navIntegratedVia, navTo, naviI18n, openCallout, preloadUrl, 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, useTransitionCover, useUrlSearchParam, useUrlTargetId, valueInLocalStorage, windowWidthSignal };
83883
+ 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, createRequestCanceller, createSearch, createSelectionKeyboardShortcuts, createSlot, defineInteractionDetector, defineRouteDefaultTransition, defineRouteTransition, detectHorizontalOverflow, dispatchRequestSetUIState, enableDebugActions, enableDebugOnDocumentLoading, ensureDocumentStartViewTransition, errorIsDisplayed, filterTableSelection, getNowHours, getNowHoursRoundedToStep, isCellSelected, isColumnSelected, isOfflineError, isRowSelected, isScrolling, isToday, languagesSignal, localStorageSignal, markAsOutsideTextFlow, markErrorAsDisplayedBy, moveArrayItemByIndex, moveFocusTo, navBack, navForward, navIntegratedVia, navTo, naviI18n, openCallout, preloadUrl, 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, useTransitionCover, useUrlSearchParam, useUrlTargetId, valueInLocalStorage, windowWidthSignal };
83902
83884
  //# sourceMappingURL=jsenv_navi.js.map