@jsenv/navi 0.29.80 → 0.29.81

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
@@ -27,7 +27,7 @@ between related actions. Parent/child relations are first-class — `.one`,
27
27
 
28
28
  **`Box`** is the main layout primitive. It wraps CSS Flexbox with a friendlier API: `flex` for horizontal layout, `flex="y"` for vertical (no more guessing what `flex-direction: column` does visually). Supports `grid`, `inline`, alignment via `alignX`/`alignY`, and spacing props.
29
29
 
30
- **`Text`** and related components (`Title`, `Paragraph`, `Code`, `Caption`) handle typography consistently across the app.
30
+ **`Text`** and related components (`Title`, `Paragraph`, `Code`, `Caption`) handle typography consistently across the app — including the parts of a line that are not text: icons, counts, truncation (`maxLines`), skeletons, and where a line may break. See [docs/typography.md](./docs/typography.md).
31
31
 
32
32
  ## Texts & i18n
33
33
 
@@ -2,8 +2,8 @@
2
2
  * AI reading this file: read ../docs/AI_INSTRUCTIONS.md for context on
3
3
  * using @jsenv/navi as intended.
4
4
  */
5
- import { installImportMetaCssBuild, windowHeightSignal, windowWidthSignal, visualViewportHeightSignal, visualViewportWidthSignal, getAppHeight, getAppWidth, smallTouchScreenSignal } from "./jsenv_navi_side_effects.js";
6
- export { coarsePointerSignal, disableVirtualKeyboardOverlay } from "./jsenv_navi_side_effects.js";
5
+ import { installImportMetaCssBuild, windowHeightSignal, windowWidthSignal, visualViewportHeightSignal, visualViewportWidthSignal, getAppHeight, getAppWidth, coarsePointerSignal, smallTouchScreenSignal } from "./jsenv_navi_side_effects.js";
6
+ export { disableVirtualKeyboardOverlay } from "./jsenv_navi_side_effects.js";
7
7
  import { elementIsFocusable, createPubSub, dispatchInternalCustomEvent, dispatchCustomEvent, getVisuallyVisibleInfo, getFirstVisuallyVisibleAncestor, getElementSignature, findEvent, createValueEffect, findFocusDelegateTarget, findFocusable, allowWheelThrough, dispatchPublicCustomEvent, resolveCSSColor, ELEMENT_SIZE_CHANGE, findSelfOrAncestorFixedPosition, visibleRectEffect, pickPositionRelativeTo, getBorderSizes, getPaddingSizes, applyNewPosition, measureLongestVisualLineWidth, chainEvent, waitForPressHeld, suppressClickAfterGesture, startDragToTravel, markDragSource, startDragTo, createIterableWeakSet, createEventGroupLogger, getKeyboardEventDefaultAction, activeElementSignal, normalizeStyle, mergeOneStyle, getPositionedParent, mergeTwoStyles, normalizeStyles, resolveCSSSize, hasCSSSizeUnit, resolveOklchLightness, contrastColor, closestOpenableAncestor, isAncestorOpen, observeAncestorOpenState, getAncestorOpenType, clickIsSuppressed, isTouchDrivenEvent, scrollIntoViewScoped, scrollRoomTowards, parsePositionArea, snapToPixel, trapFocusInside, trapScrollInside, onAncestorReopen, createGroupTransitionController, getBorderRadius, preventIntermediateScrollbar, createOpacityTransition, watchWheelTravel, findBefore, findAfter, initFocusGroup, getScrollContainer, canScroll, measureWidestChildRow, performTabNavigation, wheelGestureIsTakenFrom, releaseWheelGesture, claimWheelGesture, dragAfterIntent, stickyAsRelativeCoords, createDragToMoveGestureController, getDropTargetInfo, setStyles, useActiveElement, stringifyStyle as stringifyStyle$1 } from "@jsenv/dom";
8
8
  export { clickIsSuppressed, contrastColor, findEvent, startDragTo } from "@jsenv/dom";
9
9
  import { signal, computed, effect, batch, untracked, useSignal } from "@preact/signals";
@@ -17134,6 +17134,12 @@ const TYPO_PROPS = {
17134
17134
  uppercase: applyToCssPropWhenTruthy("textTransform", "uppercase", "none"),
17135
17135
  lowercase: applyToCssPropWhenTruthy("textTransform", "lowercase", "none"),
17136
17136
  letterSpacing: PASS_THROUGH,
17137
+ // How many lines before truncation, for anything that is not a `Text`.
17138
+ // On a `Text`, `maxLines` is the prop to use and it does more than this
17139
+ // mapping (block display, min-width, white-space per tag) — see
17140
+ // docs/typography.md. `lineClamp` and `overflowEllipsis` below are the raw
17141
+ // one-to-one CSS mappings, kept for an element that opts out of `Text` and
17142
+ // still wants that exact CSS; `lineClamp: 1` is NOT single-line truncation.
17137
17143
  maxLines: (value) => {
17138
17144
  if (!value) {
17139
17145
  return null;
@@ -21128,6 +21134,12 @@ const shouldInjectSpacingBetween = (left, right) => {
21128
21134
  };
21129
21135
 
21130
21136
  /**
21137
+ * The typography primitive: every string an app displays goes through it, or
21138
+ * through something built on it (`Title`, `Paragraph`, `Caption`, `Link`, a
21139
+ * control's label). It accepts every `Box` prop on top of the ones below.
21140
+ * See `docs/typography.md` for the decisions behind it — truncating, rows made
21141
+ * of an icon, a text and an icon, and where a line may break.
21142
+ *
21131
21143
  * @type {import("ignore:preact").FunctionComponent<{
21132
21144
  * children?: import("ignore:preact").ComponentChildren,
21133
21145
  * as?: string,
@@ -21139,6 +21151,7 @@ const shouldInjectSpacingBetween = (left, right) => {
21139
21151
  * spacing?: string | number | import("ignore:preact").ComponentChildren,
21140
21152
  * loading?: boolean,
21141
21153
  * skeleton?: boolean,
21154
+ * attachLastChild?: boolean,
21142
21155
  * preventSpaceUnderlines?: boolean,
21143
21156
  * holdSpaceForStyle?: import("ignore:preact").JSX.CSSProperties,
21144
21157
  * boldStable?: boolean,
@@ -21150,9 +21163,14 @@ const shouldInjectSpacingBetween = (left, right) => {
21150
21163
  * }>}
21151
21164
  *
21152
21165
  * @param {number} [maxLines]
21153
- * Truncates overflowing text with an ellipsis. `maxLines={1}` produces a
21154
- * single-line truncation; `maxLines={n}` (n > 1) uses `-webkit-line-clamp`
21155
- * to allow up to n lines before clipping.
21166
+ * How many lines the text may take before it is truncated with an ellipsis.
21167
+ * `maxLines={1}` truncates on a single line; `maxLines={n}` (n > 1) clamps to
21168
+ * n lines. This is the only prop to use for that — `Box`'s `lineClamp` /
21169
+ * `overflowEllipsis` are raw CSS mappings meant for elements that are not a
21170
+ * `Text`, and `lineClamp={1}` is never the single-line truncation you want.
21171
+ * Truncation only happens if the element may become narrower than its
21172
+ * content: `maxLines` sets `min-width: 0` here, but each `Box` between this
21173
+ * one and the element that carries the width must set it too.
21156
21174
  *
21157
21175
  * @param {string|number} [spacing]
21158
21176
  * Separator injected between child nodes. Accepts a size token (`"s"`, `"m"`, …),
@@ -21168,7 +21186,10 @@ const shouldInjectSpacingBetween = (left, right) => {
21168
21186
  * @param {boolean} [attachLastChild]
21169
21187
  * Keeps the last child on the same line as the word before it — a trailing
21170
21188
  * icon, a unit, an arrow. Without it the browser may break the line right
21171
- * before that child and leave it alone underneath.
21189
+ * before that child and leave it alone underneath, and no character can
21190
+ * prevent that break. For wrapping text; a child that must survive
21191
+ * truncation belongs outside the `Text` instead (see `docs/typography.md`).
21192
+ * `Link` sets it on its own whenever it renders an end icon.
21172
21193
  *
21173
21194
  * @param {boolean} [preventSpaceUnderlines]
21174
21195
  * Replaces real space characters between children with padding-based spaces.
@@ -21832,14 +21853,16 @@ const markAutofocusRestoreOnClose = (
21832
21853
  *
21833
21854
  * @param {HTMLElement} containerEl
21834
21855
  * @param {object} [options]
21835
- * @param {boolean} [options.avoidEditable]
21836
- * Keeps step 2 off anything the virtual keyboard comes up for. Step 1 is
21837
- * untouched: a field that says `autoFocus` still gets the keyboard, because
21838
- * asking for it is the one way to mean it (see open_controller.js, which
21839
- * turns this on for a surface docked on a small touch screen).
21856
+ * @param {boolean} [options.skipFirstFocusable]
21857
+ * Drops step 2 the focus then goes where something ASKED for it, or to the
21858
+ * last resort, which for a container is itself. For a surface that is read
21859
+ * before it is reached: the first focusable is wherever the content happens
21860
+ * to put it, so landing there scrolls whatever comes before it out of sight
21861
+ * (see open_controller.js, which turns this on wherever the keyboard is a
21862
+ * virtual one).
21840
21863
  * @returns {{target: HTMLElement, reason: string}|undefined}
21841
21864
  */
21842
- const findFocusTarget = (containerEl, { avoidEditable } = {}) => {
21865
+ const findFocusTarget = (containerEl, { skipFirstFocusable } = {}) => {
21843
21866
  // Not while there is anything else: what takes the focus only for want of
21844
21867
  // anything better ("last-resort") and what only takes it back ("restore").
21845
21868
  // Neither is dropped, both are simply tried later — step 3 below for the
@@ -21863,7 +21886,17 @@ const findFocusTarget = (containerEl, { avoidEditable } = {}) => {
21863
21886
  // leads somewhere focusable. One inside a screen waiting its turn (an inert
21864
21887
  // slide) says where the focus goes WHEN it arrives there, not now — so it is
21865
21888
  // passed over here rather than treated as an answer that then fails silently.
21866
- for (const asked of containerEl.querySelectorAll(`[navi-autofocus]`)) {
21889
+ //
21890
+ // The container's own mark comes last among the asked, and querySelectorAll
21891
+ // does not return it: a surface saying "the keyboard stops on me" is answered
21892
+ // by anything inside it that named itself, the more precise answer winning.
21893
+ const askedList = Array.from(
21894
+ containerEl.querySelectorAll(`[navi-autofocus]`),
21895
+ );
21896
+ if (containerEl.matches?.(`[navi-autofocus]`)) {
21897
+ askedList.push(containerEl);
21898
+ }
21899
+ for (const asked of askedList) {
21867
21900
  if (skip(asked)) {
21868
21901
  continue;
21869
21902
  }
@@ -21876,13 +21909,11 @@ const findFocusTarget = (containerEl, { avoidEditable } = {}) => {
21876
21909
  return { target: askedFocusable, reason: "navi-autofocus" };
21877
21910
  }
21878
21911
  }
21879
- const focusable = findFocusable(containerEl, {
21880
- exclude: avoidEditable
21881
- ? (element) => skip(element) || isEditableTarget(element)
21882
- : skip,
21883
- });
21884
- if (focusable) {
21885
- return { target: focusable, reason: "first focusable element" };
21912
+ if (!skipFirstFocusable) {
21913
+ const focusable = findFocusable(containerEl, { exclude: skip });
21914
+ if (focusable) {
21915
+ return { target: focusable, reason: "first focusable element" };
21916
+ }
21886
21917
  }
21887
21918
  const lastResorts = Array.from(
21888
21919
  containerEl.querySelectorAll(`[navi-autofocus="last-resort"]`),
@@ -21950,7 +21981,7 @@ const prepareFocusTransfer = (prepareEvent, debugFocus) => {
21950
21981
  transferFocus: (
21951
21982
  transferEvent,
21952
21983
  containerEl,
21953
- { getDelay, avoidEditable } = {},
21984
+ { getDelay, skipFirstFocusable } = {},
21954
21985
  ) => {
21955
21986
  let target;
21956
21987
  let reason;
@@ -21967,7 +21998,7 @@ const prepareFocusTransfer = (prepareEvent, debugFocus) => {
21967
21998
  }
21968
21999
  }
21969
22000
  if (!target) {
21970
- const found = findFocusTarget(containerEl, { avoidEditable });
22001
+ const found = findFocusTarget(containerEl, { skipFirstFocusable });
21971
22002
  if (found) {
21972
22003
  reason = found.reason;
21973
22004
  target = found.target;
@@ -21984,14 +22015,20 @@ const prepareFocusTransfer = (prepareEvent, debugFocus) => {
21984
22015
  // appears inside it next (see claimUnplacedAutofocus). Both ways of
21985
22016
  // saying no count: finding nothing at all, and the fallback above, which
21986
22017
  // leaves the focus where it already was — outside.
21987
- if (
21988
- !target ||
21989
- !(containerEl === target || containerEl.contains(target))
21990
- ) {
22018
+ const placedInside =
22019
+ target && (containerEl === target || containerEl.contains(target));
22020
+ let cancelRetry;
22021
+ if (!placedInside) {
21991
22022
  containerEl.setAttribute(AUTOFOCUS_UNPLACED_ATTRIBUTE, "");
22023
+ cancelRetry = retryWhenPlaceable(containerEl, {
22024
+ skipFirstFocusable,
22025
+ focusVisible,
22026
+ debugFocus,
22027
+ transferEvent,
22028
+ });
21992
22029
  }
21993
22030
  if (!target) {
21994
- return undefined;
22031
+ return cancelRetry;
21995
22032
  }
21996
22033
  // The modality speaks for the transfer, but an editable target outranks
21997
22034
  // it: it draws its ring on any focus (see isMatchingFocusVisible), so
@@ -22002,19 +22039,12 @@ const prepareFocusTransfer = (prepareEvent, debugFocus) => {
22002
22039
  transferEvent,
22003
22040
  `Moving focus to ${getElementSignature(target)}.focus({ preventScroll: true, focusVisible: ${targetFocusVisible} }) (reason: ${reason})`,
22004
22041
  );
22005
- target.focus({
22006
- preventScroll: true,
22007
- focusVisible: targetFocusVisible,
22008
- });
22009
- if (target.hasAttribute("navi-autofocus-select")) {
22010
- target.select();
22011
- target.scrollLeft = 0;
22012
- }
22042
+ focusTransferTarget(target, targetFocusVisible);
22013
22043
  };
22014
22044
  const delay = getDelay?.(target) || 0;
22015
22045
  if (!delay) {
22016
22046
  giveFocus();
22017
- return undefined;
22047
+ return cancelRetry;
22018
22048
  }
22019
22049
  debugFocus(
22020
22050
  transferEvent,
@@ -22023,6 +22053,7 @@ const prepareFocusTransfer = (prepareEvent, debugFocus) => {
22023
22053
  const timeout = setTimeout(giveFocus, delay);
22024
22054
  return () => {
22025
22055
  clearTimeout(timeout);
22056
+ cancelRetry?.();
22026
22057
  };
22027
22058
  },
22028
22059
 
@@ -22042,6 +22073,57 @@ const prepareFocusTransfer = (prepareEvent, debugFocus) => {
22042
22073
  };
22043
22074
  };
22044
22075
 
22076
+ /**
22077
+ * The second and last try at placing a focus the ladder had nowhere to put.
22078
+ *
22079
+ * A container can open on a moment where nothing in it — its own contents, and
22080
+ * itself — can take the focus: content still being built, a screen not yet
22081
+ * interactive. That moment is over almost immediately, and nothing else would
22082
+ * ever come back to it: the opening is the one event there is, and it has
22083
+ * passed. So the transfer keeps its promise one microtask later, still before
22084
+ * the browser paints, and still before anything the user does.
22085
+ *
22086
+ * Whoever settled the debt in between wins — content arriving with an autofocus
22087
+ * of its own claims it through use_auto_focus.js, and finding the mark gone is
22088
+ * how this knows to stand down.
22089
+ */
22090
+ const retryWhenPlaceable = (
22091
+ containerEl,
22092
+ { skipFirstFocusable, focusVisible, debugFocus, transferEvent },
22093
+ ) => {
22094
+ let cancelled = false;
22095
+ queueMicrotask(() => {
22096
+ if (cancelled || !containerEl.isConnected) {
22097
+ return;
22098
+ }
22099
+ if (!claimUnplacedAutofocus(containerEl)) {
22100
+ return;
22101
+ }
22102
+ const found = findFocusTarget(containerEl, { skipFirstFocusable });
22103
+ if (!found) {
22104
+ return;
22105
+ }
22106
+ const { target, reason } = found;
22107
+ debugFocus(
22108
+ transferEvent,
22109
+ `Moving focus to ${getElementSignature(target)} on second try (reason: ${reason})`,
22110
+ );
22111
+ focusTransferTarget(target, focusVisible || isEditableTarget(target));
22112
+ });
22113
+ return () => {
22114
+ cancelled = true;
22115
+ };
22116
+ };
22117
+
22118
+ const focusTransferTarget = (target, focusVisible) => {
22119
+ target.focus({ preventScroll: true, focusVisible });
22120
+ if (target.hasAttribute("navi-autofocus-select")) {
22121
+ target.select();
22122
+ // Keep the beginning of the text visible instead of scrolling to the end
22123
+ target.scrollLeft = 0;
22124
+ }
22125
+ };
22126
+
22045
22127
  // Get the active element before we transfer focus in the popover/dialog
22046
22128
  // We don't just use document.activeElement because when dialog is opened by mousedown
22047
22129
  // we prevent default so browser don't steal focus back from the dialog
@@ -29059,7 +29141,7 @@ const createOpenController = (
29059
29141
  requestOpenEvent,
29060
29142
  debugInteraction,
29061
29143
  );
29062
- controller.transferFocusOnOpen = (el, { avoidEditable } = {}) => {
29144
+ controller.transferFocusOnOpen = (el) => {
29063
29145
  // requestOpenEvent, not the raw `e` — getFocusedBeforeTransfer needs
29064
29146
  // e.detail.eventChain (built by chainEvent above) to recover the
29065
29147
  // element a mousedown/click landed on. `e` itself is usually the raw
@@ -29086,7 +29168,19 @@ const createOpenController = (
29086
29168
  findEvent(requestOpenEvent, isTouchDrivenEvent),
29087
29169
  );
29088
29170
  const cancelPendingFocus = focusTransfer.transferFocus(e, el, {
29089
- avoidEditable,
29171
+ // A popup is READ before it is reached wherever the keyboard is a
29172
+ // virtual one. Landing on the first focusable there costs the top of
29173
+ // the popup twice over: the browser scrolls that element into view,
29174
+ // and a field raises a keyboard that takes a third of what is left —
29175
+ // so the title and the sentence saying what this is about are gone
29176
+ // before the popup has been looked at. Only something that ASKED for
29177
+ // the focus is worth that, and asking is what `autoFocus` is.
29178
+ //
29179
+ // The device, not the opening (unlike the delay below): whether
29180
+ // focusing raises a keyboard over the popup is true of the screen,
29181
+ // and a popup opened by the page loading — no pointer in it at all —
29182
+ // is precisely the one that must not be answered "no keyboard here".
29183
+ skipFirstFocusable: coarsePointerSignal.value,
29090
29184
  getDelay: (target) =>
29091
29185
  openedByTouch && isEditableTarget(target)
29092
29186
  ? FOCUS_DELAY_ON_KEYBOARD_MS
@@ -30746,10 +30840,10 @@ const css$X = /* css */`
30746
30840
  * focusable of its own.
30747
30841
  * - `"restore"` — the dialog stays out of the opening focus chain unless it
30748
30842
  * held focus when it closed.
30749
- * Docked on a small touch screen, the default already withdraws fields from
30750
- * the choice: a bottom sheet is read before it is typed in, so the keyboard
30751
- * goes to a field only when that field asks for it by name (`autoFocus` on
30752
- * the field, which outranks whatever the dialog says).
30843
+ * Wherever the keyboard is a virtual one (a touch device), the surface is
30844
+ * already what one arrives on: a popup is read before it is reached there, so
30845
+ * the focus only leaves it for something that asked by name (`autoFocus` on
30846
+ * that element, which outranks whatever the dialog says).
30753
30847
  * @param {boolean} [props.open] - Controlled open state.
30754
30848
  * @param {boolean|"interaction"} [props.defaultOpen] - Uncontrolled, mount-only
30755
30849
  * initial open state. `true` plays no entrance animation: the dialog was
@@ -31446,16 +31540,7 @@ const useDialogProps = props => {
31446
31540
  // entrance to be over. Decided by transferFocusOnOpen, the only place that
31447
31541
  // knows WHICH element is about to be focused (open_controller.js and its
31448
31542
  // FOCUS_DELAY_ON_KEYBOARD_MS).
31449
- //
31450
- // Docked, the keyboard costs more than a wait: it takes a third of a phone
31451
- // screen from a dialog that starts at the bottom edge, pushing whatever
31452
- // comes before the field — the title, the sentence saying why it is asked
31453
- // for — above the top edge before the dialog has even been looked at. So a
31454
- // docked dialog is READ first: the transfer only reaches a field that asked
31455
- // for the keyboard by name (see findFocusTarget's `avoidEditable`).
31456
- const restoreFocus = openController.transferFocusOnOpen(dialogEl, {
31457
- avoidEditable: isDocked
31458
- });
31543
+ const restoreFocus = openController.transferFocusOnOpen(dialogEl);
31459
31544
 
31460
31545
  // isModal outside-click detection (see this file's top comment for why
31461
31546
  // this is a plain document-level listener rather than anything
@@ -32194,6 +32279,10 @@ const css$W = /* css */`
32194
32279
  * - `false` — no open-time focus transfer at all: nothing inside the popover
32195
32280
  * receives focus, whoever had the keyboard keeps it — the combobox case,
32196
32281
  * where suggestions open under an input being typed in.
32282
+ * Wherever the keyboard is a virtual one (a touch device), the surface is
32283
+ * already what one arrives on: a popup is read before it is reached there, so
32284
+ * the focus only leaves it for something that asked by name (`autoFocus` on
32285
+ * that element, which outranks whatever the popover says).
32197
32286
  * @param {boolean} [props.open] - Controlled open state.
32198
32287
  * @param {boolean|"interaction"} [props.defaultOpen] - Uncontrolled, mount-only
32199
32288
  * initial open state. `true` plays no entrance animation: the popover was
@@ -75069,5 +75158,5 @@ const UserSvg = () => jsx("svg", {
75069
75158
  })
75070
75159
  });
75071
75160
 
75072
- 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, 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 };
75161
+ 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 };
75073
75162
  //# sourceMappingURL=jsenv_navi.js.map