@jsenv/navi 0.29.493 → 0.29.494

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.
@@ -6,7 +6,7 @@ import { installImportMetaCssBuild, coarsePointerSignal, windowHeightSignal, win
6
6
  import { createPubSub, createIterableWeakSet, elementIsFocusable, getScrollContainer, dispatchInternalCustomEvent, dispatchCustomEvent, findEvent, mergeOneStyle, findFocusable, getElementSignature, chainEvent, isTouchDrivenEvent, getKeyboardEventDefaultAction, isPressDrivenClick, getVisuallyVisibleInfo, getFirstVisuallyVisibleAncestor, createValueEffect, findFocusDelegateTarget, scrollIntoViewThroughScrollables, allowWheelThrough, dispatchPublicCustomEvent, resolveCSSColor, getScrollContainerSet, ELEMENT_SIZE_CHANGE, findSelfOrAncestorFixedPosition, visibleRectEffect, pickPositionRelativeTo, getBorderSizes, getPaddingSizes, applyNewPosition, measureLongestVisualLineWidth, keepTouchRefusable, waitForTap, waitForPressHeld, suppressClickAfterGesture, startDragToTravel, dragSourceThatStoodDown, markDragSource, refuseDragTo, startDragTo, installPanZoom, createInternalCustomEvent, activeElementSignal, normalizeStyle, getPositionedParent, normalizeStyles, createGroupTransitionController, getBorderRadius, preventIntermediateScrollbar, createOpacityTransition, watchWheelTravel, scrollRoomTowards, trapScrollInside, scrollIntoViewScoped, isPressDisputedByDrag, closestOpenableAncestor, isAncestorOpen, isDisplayedDespiteClosedAncestor, observeAncestorOpenState, getAncestorOpenType, findBefore, findAfter, resolveCSSSize, hasCSSSizeUnit, releaseWheelGesture, getScrollIntoViewScopedOffsets, wheelGestureIsTakenFrom, claimWheelGesture, initFocusGroup, stringifyStyle as stringifyStyle$1, isScrollable, resolveOklchLightness, contrastColor, overflowGoesToViewport, parsePositionArea, snapToPixel, trapFocusInside, onAncestorReopen, canScroll, measureWidestChildRow, performTabNavigation, dragAfterIntent, stickyAsRelativeCoords, createDragToMoveGestureController, getDropTargetInfo, setStyles, useActiveElement, setVirtualKeyboardOverlaysContent, subscribeVirtualKeyboardGeometryChange, getVirtualKeyboardOverlayHeight } from "@jsenv/dom";
7
7
  export { chainEvent, clickIsSuppressed, contrastColor, createDragGestureController, dragAfterIntent, findEvent, markDragSource, startDragTo } from "@jsenv/dom";
8
8
  import { signal, computed, effect, untracked, batch, useComputed, useSignal } from "@preact/signals";
9
- import { useState, useLayoutEffect, useErrorBoundary, useContext, useMemo, useRef, useReducer, useEffect, useCallback, useId } from "preact/hooks";
9
+ import { useState, useLayoutEffect, useErrorBoundary, useContext, useMemo, useRef, useReducer, useEffect, useCallback } from "preact/hooks";
10
10
  import { options, isValidElement, createContext, render as render$1, h, toChildArray, createRef, cloneElement, createElement, Fragment as Fragment$1 } from "preact";
11
11
  import { humanizeI18n, setRuntimeLangSource, formatDuration, formatMonth, formatDay, resolveTimeRangePrecision, formatDatePlaceholder, toDate, getRelativeDay, formatDayRelative, formatMonthPlaceholder, formatWeekPlaceholder, formatDatetimePlaceholder, formatDatetime, toTimeOfDay, formatTimeOfDay, formatMinuteDuration, formatTime, formatSecondDuration, formatHourDuration, formatTimeRelative, pluralCategory, formatNumber, interpolateText, installInterpolateJsx } from "@jsenv/humanize";
12
12
  export { createI18n, formatByteSize, formatDatetime, formatDay, formatDayRelative, formatDuration, formatHourDuration, formatList, formatMinuteDuration, formatMonth, formatNumber, formatSecondDuration, formatTime, formatTimeOfDay, formatTimeRange, formatTimeRelative, interpolateText, pluralCategory } from "@jsenv/humanize";
@@ -13457,13 +13457,13 @@ const writePressWritesHere = (pressWrites) => {
13457
13457
  }
13458
13458
  };
13459
13459
 
13460
- // Preact's own useId() (see preact/hooks) returns "P<mask0>-<mask1>", where the
13461
- // mask is derived from render order within the nearest root/async boundary:
13462
- // stable across re-renders of the same mount, but not across two mounts on the
13463
- // same page, and not across two documents.
13464
- const PREACT_GENERATED_ID_REGEX = /^P\d+-\d+/;
13465
- const isLikelyPreactGeneratedId = (id) => {
13466
- return PREACT_GENERATED_ID_REGEX.test(id);
13460
+ // An id made up at render names one mount: navi's own ("navi_<n>", see
13461
+ // useGeneratedId) counts mounts in the document, and preact's useId(), which
13462
+ // an app may hand a component, gives "P<mask0>-<mask1>" from the render order.
13463
+ // Neither names the same component in two mounts or two documents.
13464
+ const GENERATED_ID_REGEX = /^(?:navi_\d+|P\d+-\d+)/;
13465
+ const isGeneratedId = (id) => {
13466
+ return GENERATED_ID_REGEX.test(id);
13467
13467
  };
13468
13468
 
13469
13469
  /**
@@ -13487,7 +13487,7 @@ const dropGeneratedIdKeys = (state) => {
13487
13487
  }
13488
13488
  let stateWithoutGeneratedIdKeys = state;
13489
13489
  for (const key of Object.keys(state)) {
13490
- if (!isLikelyPreactGeneratedId(key)) {
13490
+ if (!isGeneratedId(key)) {
13491
13491
  continue;
13492
13492
  }
13493
13493
  if (stateWithoutGeneratedIdKeys === state) {
@@ -14776,10 +14776,10 @@ const useNavStateBasic = (
14776
14776
 
14777
14777
  let effectiveType = type;
14778
14778
  // A push bakes the key into a history entry of its own, and an id naming a
14779
- // render position (see isLikelyPreactGeneratedId) can be claimed by two
14779
+ // render position (see isGeneratedId) can be claimed by two
14780
14780
  // mounts of this same page. A replace keeps the key on the entry the document
14781
14781
  // is already on, where the id at least names one render.
14782
- if (type === "push" && isLikelyPreactGeneratedId(id)) {
14782
+ if (type === "push" && isGeneratedId(id)) {
14783
14783
  effectiveType = "replace";
14784
14784
  }
14785
14785
 
@@ -14895,7 +14895,7 @@ const useNavStateBasic = (
14895
14895
  * - "push": creates a new history entry — pressing the back button removes it and calls onLeave.
14896
14896
  * - "replace": updates the current history entry — no extra history entry is created.
14897
14897
  * Silently downgraded to "replace" (with a dev-only console.warn) when `id`
14898
- * looks auto-generated (e.g. preact's own useId()) — an unstable id baked
14898
+ * looks auto-generated (navi's own, or preact's useId()) — an unstable id baked
14899
14899
  * into a pushed history entry won't survive a reload correctly, and could
14900
14900
  * even collide with a different component's own auto-generated id. Pass a
14901
14901
  * stable, explicit id to actually get "push" behavior.
@@ -29677,7 +29677,8 @@ ${name}.many("${propertyName}") source location: ${declarationSite}`,
29677
29677
  * - `DELETE: async ({ id }) => [id, null]`
29678
29678
  *
29679
29679
  * `ownerId` may also be `{ [uniqueKey]: value }` when the owner is known by an alternate key.
29680
- * The property is `null` until a callback provides data; setting it to `null` clears it.
29680
+ * The property is `undefined` until an answer speaks for the owner (its row, or a
29681
+ * callback), `null` when that answer holds none; setting it to `null` clears it.
29681
29682
  * Mutations apply directly to the owner's signal, so the parent GET is never rerun; an
29682
29683
  * owner the store does not hold yet is left alone, its child comes with its next read.
29683
29684
  *
@@ -29733,7 +29734,10 @@ ${name}.many("${propertyName}") source location: ${declarationSite}`,
29733
29734
  for (const childSetup of childSetupCallbackSet) {
29734
29735
  childSetup(childItem);
29735
29736
  }
29736
- const childSignal = signal(null);
29737
+ // `undefined` until something answers for this owner, `null` once an
29738
+ // answer says it holds none: a screen tells « not read yet » from
29739
+ // « nothing » as it does with an action's data.
29740
+ const childSignal = signal(undefined);
29737
29741
  // The child keeps its identity while its props change, so the owner's
29738
29742
  // getter also reads this version, bumped by each change in place:
29739
29743
  // whichever way the props came in — the owner's row, a write of this
@@ -29742,7 +29746,10 @@ ${name}.many("${propertyName}") source location: ${declarationSite}`,
29742
29746
  // Returns whether the child changed — what the store asks a relation
29743
29747
  // (see assign in array_signal_store.js).
29744
29748
  const applyProps = (props) => {
29745
- if (!props) {
29749
+ if (props === undefined) {
29750
+ return false;
29751
+ }
29752
+ if (props === null) {
29746
29753
  if (childSignal.peek() === null) {
29747
29754
  return false;
29748
29755
  }
@@ -29764,7 +29771,7 @@ ${name}.many("${propertyName}") source location: ${declarationSite}`,
29764
29771
  }
29765
29772
  }
29766
29773
  if (childSignal.peek() !== childItem) {
29767
- childSignal.value = childItem; // first activation: null → childItem
29774
+ childSignal.value = childItem; // first activation
29768
29775
  return true;
29769
29776
  }
29770
29777
  if (changed) {
@@ -33639,7 +33646,12 @@ const Box = props => {
33639
33646
  mount,
33640
33647
  ...computeProps
33641
33648
  } = props;
33642
- const parentBoxFlow = useContext(BoxFlowContext);
33649
+ // The flow of the nearest Box above in the component tree, which lays this
33650
+ // box out unless a plain element sits between the two in the DOM: the box
33651
+ // then reads that element's flow once mounted (see readDomParentFlow).
33652
+ const contextBoxFlow = useContext(BoxFlowContext);
33653
+ const [domParentFlow, setDomParentFlow] = useState(null);
33654
+ const parentBoxFlow = domParentFlow && domParentFlow.contextBoxFlow === contextBoxFlow ? domParentFlow.flow : contextBoxFlow;
33643
33655
  // Which interactions this box answers, and with what. Read here rather than
33644
33656
  // on the control, so a swipe or a hold can be declared on anything — a row, a
33645
33657
  // card, a block of text — and reach the control it belongs to (which is what
@@ -33686,7 +33698,17 @@ const Box = props => {
33686
33698
  childForwardedProps,
33687
33699
  styleDeps
33688
33700
  } = computed;
33689
- const syncBox = useCallback(computed.syncBox, styleDeps);
33701
+ const verifyParentFlow = parentBoxFlow === contextBoxFlow && FLOW_STYLING_ITS_CHILDREN_SET.has(contextBoxFlow) && readsParentFlow(computeProps);
33702
+ const syncBox = useCallback(verifyParentFlow ? boxEl => {
33703
+ const flow = readDomParentFlow(boxEl);
33704
+ if (flow !== contextBoxFlow) {
33705
+ setDomParentFlow({
33706
+ contextBoxFlow,
33707
+ flow
33708
+ });
33709
+ }
33710
+ return computed.syncBox(boxEl);
33711
+ } : computed.syncBox, styleDeps);
33690
33712
  const finalRef = useComposeElementRef(syncBox, ref);
33691
33713
  useInteractionsEffect(finalRef, interactionsRef);
33692
33714
  let innerChildren = children;
@@ -33991,6 +34013,13 @@ const computeBox = (props, parentBoxFlow) => {
33991
34013
  const mergedValue = prepareStyleValue(stylesTarget[name], value, name, styleContext);
33992
34014
  const cssVar = readCSSVarName(styleContext.styleCSSVars[name]);
33993
34015
  if (cssVar) {
34016
+ if (name === "color" && value === "inherit") {
34017
+ // A token set to `inherit` takes the token of the parent element
34018
+ // (a list's white for its selected items), never the parent's color.
34019
+ // `color: currentColor` IS `color: inherit`, and a token carries it.
34020
+ addCSSVar("currentColor", cssVar, stylesTarget);
34021
+ return true;
34022
+ }
33994
34023
  addCSSVar(mergedValue, cssVar, stylesTarget);
33995
34024
  if (name === "borderRadius" && value === "inherit") {
33996
34025
  // "inherit" cannot be expressed via a CSS variable — a var() reference
@@ -34302,6 +34331,47 @@ const declaresSomething = value => {
34302
34331
  }
34303
34332
  return true;
34304
34333
  };
34334
+ // The flows the styles of a child branch on (see expandX, selfAlignX… in
34335
+ // box_style_util.js): under any other the child writes the same styles
34336
+ // whatever its parent is.
34337
+ const FLOW_STYLING_ITS_CHILDREN_SET = new Set(["flex-x", "flex-y", "inline-flex-x", "inline-flex-y", "grid", "inline-grid"]);
34338
+ const PARENT_FLOW_PROP_NAMES = ["expand", "expandX", "expandY", "selfAlignX", "selfAlignY"];
34339
+ const readsParentFlow = props => {
34340
+ for (const name of PARENT_FLOW_PROP_NAMES) {
34341
+ if (props[name]) {
34342
+ return true;
34343
+ }
34344
+ }
34345
+ return false;
34346
+ };
34347
+ // A Box parent says its flow on its element; a plain element is read from its
34348
+ // computed style, which only a box mounted under one pays for.
34349
+ const readDomParentFlow = boxEl => {
34350
+ let parent = boxEl.parentElement;
34351
+ while (parent) {
34352
+ const flowAttribute = parent.getAttribute("navi-box-flow");
34353
+ if (flowAttribute) {
34354
+ return flowAttribute;
34355
+ }
34356
+ const {
34357
+ display,
34358
+ flexDirection
34359
+ } = window.getComputedStyle(parent);
34360
+ if (display === "contents") {
34361
+ parent = parent.parentElement;
34362
+ continue;
34363
+ }
34364
+ if (display === "flex" || display === "inline-flex") {
34365
+ const axis = flexDirection.startsWith("column") ? "y" : "x";
34366
+ return `${display}-${axis}`;
34367
+ }
34368
+ if (display === "grid" || display === "inline-grid") {
34369
+ return display;
34370
+ }
34371
+ return "block";
34372
+ }
34373
+ return undefined;
34374
+ };
34305
34375
  const isScrollingOverflow = value => value === "auto" || value === "scroll";
34306
34376
  const mayHoldComponent = children => {
34307
34377
  if (children === null || children === undefined) {
@@ -59788,7 +59858,7 @@ const Expandable = props => {
59788
59858
  const rootRef = ref || defaultRef;
59789
59859
  const uiRef = useRef();
59790
59860
  const contentContainerRef = useRef();
59791
- const contentId = useId();
59861
+ const contentId = useGeneratedId();
59792
59862
  const isColumn = layout === "column";
59793
59863
  const closedContentSized = isColumn && mount === "always";
59794
59864
  // Only the two directions the layout has room for: a column layout reveals
@@ -61428,7 +61498,7 @@ const ButtonConfirm = ({
61428
61498
  // it is elsewhere by then, and pulling it back would take it from whatever
61429
61499
  // the person moved to.
61430
61500
  const restoreFocusRef = useRef(false);
61431
- const questionId = `${useId()}_question`;
61501
+ const questionId = `${useGeneratedId()}_question`;
61432
61502
  const cancel = restoreFocus => {
61433
61503
  restoreFocusRef.current = restoreFocus;
61434
61504
  setAsking(false);
@@ -62213,7 +62283,7 @@ const ControlSwap = props => {
62213
62283
  const activeSide = sides[activeIndex];
62214
62284
  const capRefs = [useRef(), useRef()];
62215
62285
  const slotRefs = [useRef(), useRef()];
62216
- const slotIdPrefix = useId();
62286
+ const slotIdPrefix = useGeneratedId();
62217
62287
  const activeNameRef = useRef(floor.name);
62218
62288
  activeNameRef.current = activeSide.name;
62219
62289
  const swapTo = (name, event, pressedCapIndex = null) => {
@@ -63063,7 +63133,7 @@ const InputCheckboxFieldInterface = props => {
63063
63133
  // setting's name — which are its label and its accessible name: a mode one
63064
63134
  // toggles is a checkbox, not a button writing a signal on each press.
63065
63135
  const hasLabel = variant === "button" && children !== undefined && children !== null && children !== false;
63066
- const labelId = useId();
63136
+ const labelId = useGeneratedId();
63067
63137
  const boxRef = useRef();
63068
63138
  useAccentColorAttributes(boxRef, accentColor, {
63069
63139
  elementSelector: ".navi_checkbox_accent_probe"
@@ -74208,7 +74278,7 @@ const PopupTitleContext = createContext(null);
74208
74278
  const PopupTitle = props => {
74209
74279
  import.meta.css = [css$E, "@jsenv/navi/src/layout/popup_title.jsx"];
74210
74280
  const registerTitle = useContext(PopupTitleContext);
74211
- const idDefault = useId();
74281
+ const idDefault = useGeneratedId();
74212
74282
  const id = props.id || `popup_title_${idDefault}`;
74213
74283
  useLayoutEffect(() => {
74214
74284
  if (!registerTitle) {
@@ -77513,7 +77583,7 @@ const usePopoverProps = props => {
77513
77583
  // open, two separate invocations of openEffect that don't otherwise share
77514
77584
  // any scope, hence the ref.
77515
77585
  const disarmBackdropHideRef = useRef(null);
77516
- const defaultId = useId();
77586
+ const defaultId = useGeneratedId();
77517
77587
  const id = rest.id || defaultId;
77518
77588
  const backdropId = `${id}-backdrop`;
77519
77589
  const debugPopup = useDebugPopup();
@@ -79103,10 +79173,10 @@ const PickerCustom = props => {
79103
79173
  // before computing popupId below, so two Pickers without an explicit id never collide.
79104
79174
  // Captured before the fallback chain below overwrites props.id — needed to
79105
79175
  // know whether the id actually came from the caller (stable) or from
79106
- // useId()/ControlIdContext (a generated id names one mount: a reload, or a
79176
+ // useGeneratedId()/ControlIdContext (a generated id names one mount: a reload, or a
79107
79177
  // return to this page, generates another), see pickerNavType below.
79108
79178
  const hasExplicitId = Boolean(props.id);
79109
- const idDefault = useId();
79179
+ const idDefault = useGeneratedId();
79110
79180
  const controlId = useContext(ControlIdContext);
79111
79181
  props.id = props.id || controlId || idDefault;
79112
79182
  // Given no value, the picker holds what the control in its popup holds (see
@@ -79207,7 +79277,7 @@ const PickerCustom = props => {
79207
79277
  const debugPopup = useDebugPopup();
79208
79278
  // In "dialog" mode with a stable, caller-provided id, enterExpanded()
79209
79279
  // pushes a history entry so the back button closes it. Every other case
79210
- // (popover mode, or a dialog whose id was auto-generated via useId()/
79280
+ // (popover mode, or a dialog whose id was auto-generated via useGeneratedId()/
79211
79281
  // ControlIdContext) replaces the current history state instead — a
79212
79282
  // generated id names one mount, so pushing it would either leave an entry
79213
79283
  // nothing reads or, worse, collide with a different component's own
@@ -82084,7 +82154,7 @@ const ListSelectable = props => {
82084
82154
  const Next = useNextResolver();
82085
82155
  import.meta.css = [css$x, "@jsenv/navi/src/control/list/list_selectable.jsx"];
82086
82156
  // we allow ourselves to auto-generate a name
82087
- const defaultName = useId();
82157
+ const defaultName = useGeneratedId();
82088
82158
  props.name = props.name || `listbox_${defaultName}`;
82089
82159
  const {
82090
82160
  ref,
@@ -82433,7 +82503,7 @@ const ListItemSelectableResolver = props => {
82433
82503
  };
82434
82504
  const ListItemSelectable = props => {
82435
82505
  const Next = useNextResolver();
82436
- const defaultId = useId();
82506
+ const defaultId = useGeneratedId();
82437
82507
  // Whether the caller SAYS anything about this row's selection. Passing
82438
82508
  // `checked: undefined` is not the same as not passing it: a control with the
82439
82509
  // key present calls itself controlled, and a controlled row is one the list
@@ -83423,7 +83493,7 @@ const ListUI = props => {
83423
83493
  } = props;
83424
83494
  // Remembered by name, and a name made up at render (see ListFirstResolver)
83425
83495
  // names no list a later mount would recognize.
83426
- const rememberScroll = !scrollResetOnNavigation && !isLikelyPreactGeneratedId(rest.id);
83496
+ const rememberScroll = !scrollResetOnNavigation && !isGeneratedId(rest.id);
83427
83497
  // Where the list was when its screen was left, when this is the way back
83428
83498
  // (see scroll_restoration.js). Read once: `defaultScrolled` is held by
83429
83499
  // reference, and a place read again each render would be a list moved each
@@ -83733,7 +83803,7 @@ const ListFirstResolver = props => {
83733
83803
  const Next = useNextResolver();
83734
83804
  const refDefault = useRef(null);
83735
83805
  props.ref = props.ref || refDefault;
83736
- const idDefault = useId();
83806
+ const idDefault = useGeneratedId();
83737
83807
  props.id = props.id || idDefault;
83738
83808
  const listItemsRef = useRef(null);
83739
83809
  if (!listItemsRef.current) {
@@ -87147,7 +87217,7 @@ const ListItemUI = props => {
87147
87217
  if (identityMatters && props.id === undefined) {
87148
87218
  console.warn("ListItem is missing an explicit id prop. Provide a stable id so pointed/selected state survives search reordering.");
87149
87219
  }
87150
- const idDefault = useId();
87220
+ const idDefault = useGeneratedId();
87151
87221
  props.id = props.id || idDefault;
87152
87222
  const listItems = useContext(ListItemsContext);
87153
87223
  const groupId = useContext(ListGroupContext);
@@ -87960,7 +88030,7 @@ const useRunItems = (store, {
87960
88030
  renderSkeleton,
87961
88031
  renderError
87962
88032
  }) => {
87963
- const ownerId = useId();
88033
+ const ownerId = useGeneratedId();
87964
88034
  // Dev only: the group `groupOfMissing` put an item not held in, by rank,
87965
88035
  // checked against `groupBy` once the item lands.
87966
88036
  const missingGroupCheckRef = useRef(null);
@@ -88515,7 +88585,7 @@ const ListRunSkeletonItem = ({
88515
88585
  }) => {
88516
88586
  const listItems = useContext(ListItemsContext);
88517
88587
  const groupId = useContext(ListGroupContext);
88518
- const entryId = useId();
88588
+ const entryId = useGeneratedId();
88519
88589
  listItems.draw(entryId, {
88520
88590
  ownerId: runItem.ownerId,
88521
88591
  place: runItem.index,
@@ -89247,7 +89317,7 @@ const ListItemGroup = ({
89247
89317
  children,
89248
89318
  ...rest
89249
89319
  }) => {
89250
- const groupId = useId();
89320
+ const groupId = useGeneratedId();
89251
89321
  const listItems = useContext(ListItemsContext);
89252
89322
  const group = listItems.group(groupId);
89253
89323
  useLayoutEffect(() => {
@@ -93470,7 +93540,7 @@ const Spin = ({
93470
93540
  } else {
93471
93541
  compareValues ??= compareValuesDefault;
93472
93542
  }
93473
- const id = useId();
93543
+ const id = useGeneratedId();
93474
93544
  // What the group around it says, when there is one: how big the whole thing
93475
93545
  // is written is said once, on the group, and every spin in it follows.
93476
93546
  const group = useContext(SpinGroupContext);
@@ -94688,7 +94758,7 @@ const TimeRangeSpin = ({
94688
94758
  endTimeProps,
94689
94759
  ...rest
94690
94760
  }) => {
94691
- const startId = useId();
94761
+ const startId = useGeneratedId();
94692
94762
  return jsxs(ControlGroup, {
94693
94763
  flex: true,
94694
94764
  alignY: "center",
@@ -94781,7 +94851,7 @@ const css$q = /* css */`.navi_checkbox_group {
94781
94851
  const CheckboxGroup = props => {
94782
94852
  const refDefault = useRef(null);
94783
94853
  props.ref = props.ref || refDefault;
94784
- const defaultName = useId();
94854
+ const defaultName = useGeneratedId();
94785
94855
  props.name = props.name || `checkbox_group_${defaultName}`;
94786
94856
  const checkboxGroup = jsx(CheckboxGroupInterface, {
94787
94857
  ...props
@@ -95546,7 +95616,7 @@ const css$o = /* css */`.navi_radio_group {
95546
95616
  const RadioGroup = props => {
95547
95617
  const refDefault = useRef(null);
95548
95618
  props.ref = props.ref || refDefault;
95549
- const defaultName = useId();
95619
+ const defaultName = useGeneratedId();
95550
95620
  props.name = props.name || `radio_group_${defaultName}`;
95551
95621
  const radioGroup = jsx(RadioGroupInterface, {
95552
95622
  ...props
@@ -95884,7 +95954,7 @@ const SplitButton = props => {
95884
95954
  if (popupProps.positionArea === undefined && mode === "popover") {
95885
95955
  popupProps.positionArea = "bottom-end";
95886
95956
  }
95887
- const idDefault = useId();
95957
+ const idDefault = useGeneratedId();
95888
95958
  const idResolved = id || idDefault;
95889
95959
  const menuId = `${idResolved}_menu`;
95890
95960
  const rootRef = useRef(null);
@@ -98934,7 +99004,7 @@ const WheelItem = ({
98934
99004
  children,
98935
99005
  ...rest
98936
99006
  }) => {
98937
- const idDefault = useId();
99007
+ const idDefault = useGeneratedId();
98938
99008
  const resolvedId = id || idDefault;
98939
99009
  // Wheel.Item must live inside a Wheel, so the context is always present.
98940
99010
  const trackerContext = useContext(WheelItemTrackerContext);
@@ -99532,7 +99602,7 @@ const TimeRangeWheel = ({
99532
99602
  ...rest
99533
99603
  }) => {
99534
99604
  import.meta.css = [css$j, "@jsenv/navi/src/control/wheel/wheel_time.jsx"];
99535
- const startId = useId();
99605
+ const startId = useGeneratedId();
99536
99606
  const startRef = useRef(null);
99537
99607
  const endRef = useRef(null);
99538
99608
  const endHourList = useMemo(() => resolveHourList(hours), [hours ? hours.min : undefined, hours ? hours.max : undefined, hours]);
@@ -102520,7 +102590,7 @@ const useIsInTableHead = () => useContext(TableSectionContext) === "head";
102520
102590
  const Table = props => {
102521
102591
  installTableCss();
102522
102592
  const tableDefaultRef = useRef();
102523
- const tableDefaultId = `table-${useId()}`;
102593
+ const tableDefaultId = `table-${useGeneratedId()}`;
102524
102594
  const {
102525
102595
  id = tableDefaultId,
102526
102596
  selection = [],