@nivaro/react 0.3.42 → 0.3.44

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.
@@ -9,7 +9,7 @@ import { noteReplayEvent as _e, createReplayCheckoutState as De } from "../share
9
9
  import { emitReplayTap as Te, setReplayRecorderMode as N, registerReplayCapture as qe, clipEndOffset as Le, withClipKind as Pe } from "../shared/lib/replay-capture.js";
10
10
  import { instrumentConsole as Ne, instrumentRequests as Fe, redactSecrets as Me } from "../shared/lib/replay-context.js";
11
11
  import { instrumentSocket as Oe } from "../shared/lib/replay-socket.js";
12
- const Ue = "nivaro-react@0.3.42", j = 1e4, We = 150, He = 3e3, Ke = 600, $e = (n) => `nvr_replay_resume${n ? `:${n}` : ""}`, G = () => typeof navigator > "u" || navigator.onLine !== !1;
12
+ const Ue = "nivaro-react@0.3.44", j = 1e4, We = 150, He = 3e3, Ke = 600, $e = (n) => `nvr_replay_resume${n ? `:${n}` : ""}`, G = () => typeof navigator > "u" || navigator.onLine !== !1;
13
13
  function Be(n) {
14
14
  return typeof n.url != "string" || typeof fetch != "function" ? null : (f, a) => {
15
15
  const u = typeof n.getToken == "function" ? n.getToken() : void 0, d = { "Content-Type": "application/json" };
package/dist/index.d.ts CHANGED
@@ -2693,6 +2693,20 @@ declare interface DisplayPrefs {
2693
2693
 
2694
2694
  export declare function DisplayPrefsCard(): JSX.Element;
2695
2695
 
2696
+ /**
2697
+ * The crumbs to show: walk back from the current page, newest first, skipping
2698
+ * the current page itself and repeats (the NEWEST visit of a page wins — the
2699
+ * fewest steps back), and stop after the first "root" page (a list or hub the
2700
+ * person started from) or `max` crumbs. Oldest first.
2701
+ */
2702
+ export declare function displayTrail(chain: TrailEntry[], current: {
2703
+ idx: number;
2704
+ path: string;
2705
+ }, opts?: {
2706
+ isRoot?: (pathname: string) => boolean;
2707
+ max?: number;
2708
+ }): TrailCrumb[];
2709
+
2696
2710
  declare type DmOpener = (userId: string, displayName?: string) => void;
2697
2711
 
2698
2712
  export declare function dmPeer(room: string, self: string): string | null;
@@ -8760,6 +8774,9 @@ declare type RecordingHandoff = {
8760
8774
  };
8761
8775
  };
8762
8776
 
8777
+ /** Feed one location change. Returns the entry now current. */
8778
+ export declare function recordNavigation(ev: TrailEvent): TrailEntry | undefined;
8779
+
8763
8780
  /**
8764
8781
  * Mounted ONCE by a host (admin's AppLayout), inside a NivaroProvider and a
8765
8782
  * QueryClientProvider: binds the outbox to the signed-in person so saves left
@@ -9787,6 +9804,13 @@ export declare function setServerClockOffset(ms: number): void;
9787
9804
 
9788
9805
  export declare function setTimeDisplay(mode: string | null | undefined): void;
9789
9806
 
9807
+ /**
9808
+ * Name a page in the trail (what later crumbs will show for it): the current
9809
+ * entry — and, when a key is given, only while that key is still current (a
9810
+ * label that lands after the person moved on is dropped, never misfiled).
9811
+ */
9812
+ export declare function setTrailLabel(label: string | null | undefined, key?: string): void;
9813
+
9790
9814
  /** True when this browser can share a socket between tabs. */
9791
9815
  export declare function sharedWorkerSupported(): boolean;
9792
9816
 
@@ -10714,6 +10738,68 @@ export declare function TrafficMiniMap({ window: win, tone, href, refreshMs, cla
10714
10738
  className?: string;
10715
10739
  }): JSX.Element | null;
10716
10740
 
10741
+ /**
10742
+ * #3225 — breadcrumbs that know the path. A per-TAB record of the history
10743
+ * entries this tab walked through (sessionStorage, so a reload keeps it and
10744
+ * another tab has its own), keyed by the router's history index. The page
10745
+ * header turns the entries before the current one into crumbs — how the
10746
+ * person actually got here (Queue "Pending approvals" → PO 4471 → Line 3) —
10747
+ * and a crumb click goes BACK that many history entries, so the page comes
10748
+ * back exactly as it was left: same URL (filters, tab), and the scroll
10749
+ * position the trail remembered.
10750
+ *
10751
+ * The host feeds it: call `recordNavigation()` on every location change with
10752
+ * the router's action ('PUSH' | 'REPLACE' | 'POP'), the location key and
10753
+ * `history.state.idx` (React Router keeps the index there across reloads).
10754
+ * Nothing here touches the router, so any host (admin, efp-new) can wire it.
10755
+ *
10756
+ * Pure parts (`reduceTrail`, `trailChain`, `displayTrail`) are tested on their own.
10757
+ */
10758
+ declare type TrailAction = 'PUSH' | 'REPLACE' | 'POP';
10759
+
10760
+ /** The unbroken run of entries right before the current one, oldest first. */
10761
+ export declare function trailChain(state: TrailState): TrailEntry[];
10762
+
10763
+ declare interface TrailCrumb {
10764
+ key: string;
10765
+ path: string;
10766
+ label?: string;
10767
+ /** History steps to go back to reach it (negative). */
10768
+ delta: number;
10769
+ }
10770
+
10771
+ declare interface TrailEntry {
10772
+ key: string;
10773
+ idx: number;
10774
+ /** pathname + search + hash */
10775
+ path: string;
10776
+ label?: string;
10777
+ scroll?: TrailScroll[];
10778
+ at: number;
10779
+ }
10780
+
10781
+ declare interface TrailEvent {
10782
+ action: TrailAction;
10783
+ key: string;
10784
+ idx: number;
10785
+ path: string;
10786
+ at?: number;
10787
+ }
10788
+
10789
+ declare interface TrailScroll {
10790
+ /** '' = the page scroller itself; otherwise a child path from it (see scrollPathOf). */
10791
+ path: string;
10792
+ top: number;
10793
+ }
10794
+
10795
+ declare interface TrailState {
10796
+ entries: TrailEntry[];
10797
+ current: {
10798
+ key: string;
10799
+ idx: number;
10800
+ } | null;
10801
+ }
10802
+
10717
10803
  /**
10718
10804
  * Translate scope values (target-collection IDS) into a filter's value space.
10719
10805
  * When the filter compares ids (valueField 'id'/undefined) this is identity;
@@ -11377,6 +11463,9 @@ export declare function useMyScopes(): {
11377
11463
 
11378
11464
  export declare function useNavigation(): NavigationContextValue;
11379
11465
 
11466
+ /** The tab's trail, re-rendering on every change. */
11467
+ export declare function useNavTrail(): TrailState;
11468
+
11380
11469
  export declare function useNivaroClient(): NivaroClient;
11381
11470
 
11382
11471
  /**
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import { NivaroField as g } from "./components/NivaroField.js";
11
11
  import { NivaroForm as y } from "./components/NivaroForm.js";
12
12
  import { useAutoRecord as w } from "./hooks/useAutoRecord.js";
13
13
  import { clearFormSchemaCache as I, fetchSchema as k, useFormSchema as E } from "./hooks/useFormSchema.js";
14
- import { useFieldArray as D, useFieldState as v, useFormDirty as V, useFormStatus as O, useOrderedLayout as b, useSectionState as L, useTabState as N, useWatchFields as B } from "./hooks/useLayoutHooks.js";
14
+ import { useFieldArray as v, useFieldState as D, useFormDirty as V, useFormStatus as O, useOrderedLayout as b, useSectionState as L, useTabState as N, useWatchFields as B } from "./hooks/useLayoutHooks.js";
15
15
  import { liveListKey as M, liveRecordKey as _, useLiveList as W, useLiveRecord as G } from "./hooks/useLive.js";
16
16
  import { useNivaroForm as Q } from "./hooks/useNivaroForm.js";
17
17
  import { useRelationOptions as z } from "./hooks/useRelationOptions.js";
@@ -24,7 +24,7 @@ import { AddendumPanel as ye } from "./shared/components/panels/AddendumPanel.js
24
24
  import { AiAnalyticsView as we } from "./shared/components/ai/AiAnalyticsView.js";
25
25
  import { AiFeedbackButtons as Ie } from "./shared/components/ai/AiFeedbackButtons.js";
26
26
  import { AiMarkdown as Ee } from "./shared/components/ai/AiMarkdown.js";
27
- import { AiMemorySuggestions as De } from "./shared/components/ai/AiMemorySuggestions.js";
27
+ import { AiMemorySuggestions as ve } from "./shared/components/ai/AiMemorySuggestions.js";
28
28
  import { AiPlanCard as Ve } from "./shared/components/ai/AiPlanCard.js";
29
29
  import { AiReviewCard as be, OwnerGapsCard as Le, PipelineEditorView as Ne, PipelineSimulatorCard as Be } from "./shared/components/pipeline/PipelineEditorView.js";
30
30
  import { AlertManagerView as Me } from "./shared/components/alerts/AlertManagerView.js";
@@ -43,7 +43,7 @@ import { BaseMap as co } from "./shared/components/BaseMap.js";
43
43
  import { BroadcastView as Ro } from "./shared/components/BroadcastView.js";
44
44
  import { BrowserPushCard as ho } from "./shared/components/profile/BrowserPushCard.js";
45
45
  import { BulkActionButtons as Po, useAvailableBulkActions as yo } from "./shared/components/bulk/BulkActionButtons.js";
46
- import { CLEAN_RECORDING_ATTR as wo, DEMO_USER as Ao, RECORDING_ATTR as Io, RECORDING_HIDE_ATTR as ko, beginCleanRecording as Eo, beginRecordingScreen as Fo, isCleanRecording as Do, setRecordingSelf as vo, useCleanRecording as Vo, useIsRecordingSelf as Oo } from "./shared/components/help-videos/recorder/cleanRecording.js";
46
+ import { CLEAN_RECORDING_ATTR as wo, DEMO_USER as Ao, RECORDING_ATTR as Io, RECORDING_HIDE_ATTR as ko, beginCleanRecording as Eo, beginRecordingScreen as Fo, isCleanRecording as vo, setRecordingSelf as Do, useCleanRecording as Vo, useIsRecordingSelf as Oo } from "./shared/components/help-videos/recorder/cleanRecording.js";
47
47
  import { CLIENT_CHAOS_HEADER as Lo, bindClientChaosSocket as No, canUseClientChaos as Bo, clientChaosAxiosInterceptor as Ho, getClientChaos as Mo, installClientChaosFetch as _o, startClientChaos as Wo, stopClientChaos as Go, subscribeClientChaos as Uo, withClientChaos as Qo } from "./shared/lib/client-chaos.js";
48
48
  import { CLIENT_CHAOS_SHORTCUT as zo, ClientChaosToolbar as qo, clientChaosSummary as Yo, openClientChaosToolbar as Jo } from "./shared/components/ClientChaosToolbar.js";
49
49
  import { CacheStamp as jo } from "./shared/components/CacheStamp.js";
@@ -56,7 +56,7 @@ import { ChatAppearAwayRow as dr, ChatChannelBrowser as cr, ChatChannelSettings
56
56
  import { CloneDialog as wr } from "./shared/components/item-edit/CloneDialog.js";
57
57
  import { CollectionBrowserView as Ir } from "./shared/components/CollectionBrowserView.js";
58
58
  import { CollectionImportPanel as Er } from "./shared/components/imports/CollectionImportPanel.js";
59
- import { CommandCenterView as Dr } from "./shared/components/command-center/CommandCenterView.js";
59
+ import { CommandCenterView as vr } from "./shared/components/command-center/CommandCenterView.js";
60
60
  import { CommentPanel as Vr } from "./shared/components/panels/CommentPanel.js";
61
61
  import { ConformanceView as br } from "./shared/components/ConformanceView.js";
62
62
  import { CopyAsButton as Nr } from "./shared/components/CopyAsButton.js";
@@ -74,7 +74,7 @@ import { DisplayPrefsCard as mt, NotificationRulesCard as ft, ProfileFieldsCard
74
74
  import { DndMark as Ct, DoNotDisturbRow as Rt, useDndActive as St } from "./shared/components/DoNotDisturb.js";
75
75
  import { DocumentAutofillButton as gt } from "./shared/components/import/DocumentAutofillButton.js";
76
76
  import { DrillBanner as yt, useArmedFaults as Tt, useDrillBannerShowing as wt } from "./shared/components/chaos/DrillBanner.js";
77
- import { DrilldownContext as It, DrilldownViewsContext as kt, GridFlushContext as Et, ItemEditAuthContext as Ft, NavigationContext as Dt, NivaroProvider as vt, OverlayHistoryContext as Vt, RecordSurfaceContext as Ot, decodePrefill as bt, defaultItemUrl as Lt, encodePrefill as Nt, fieldDrilldownConfig as Bt, useApiFetchConfig as Ht, useDrilldown as Mt, useDrilldownViews as _t, useGridFlush as Wt, useItemEditAuth as Gt, useItemNavigation as Ut, useNavigation as Qt, useNivaroClient as Kt, useOptionalNivaroClient as zt, useOverlayState as qt } from "./shared/context.js";
77
+ import { DrilldownContext as It, DrilldownViewsContext as kt, GridFlushContext as Et, ItemEditAuthContext as Ft, NavigationContext as vt, NivaroProvider as Dt, OverlayHistoryContext as Vt, RecordSurfaceContext as Ot, decodePrefill as bt, defaultItemUrl as Lt, encodePrefill as Nt, fieldDrilldownConfig as Bt, useApiFetchConfig as Ht, useDrilldown as Mt, useDrilldownViews as _t, useGridFlush as Wt, useItemEditAuth as Gt, useItemNavigation as Ut, useNavigation as Qt, useNivaroClient as Kt, useOptionalNivaroClient as zt, useOverlayState as qt } from "./shared/context.js";
78
78
  import { EmptyState as Jt } from "./shared/components/EmptyState.js";
79
79
  import { ErpFailureBanner as jt } from "./shared/components/panels/ErpFailureBanner.js";
80
80
  import { ErrorSurface as $t } from "./shared/components/ErrorSurface.js";
@@ -91,7 +91,7 @@ import { HelpVideoButton as yi } from "./shared/components/help-videos/viewer/He
91
91
  import { HelpVideoEditor as wi } from "./shared/components/help-videos/editor/HelpVideoEditor.js";
92
92
  import { HelpVideoLibrary as Ii } from "./shared/components/help-videos/library/HelpVideoLibrary.js";
93
93
  import { HelpVideoMatchChip as Ei } from "./shared/components/help-videos/viewer/HelpVideoMatchChip.js";
94
- import { HelpVideoPlayer as Di } from "./shared/components/help-videos/HelpVideoPlayer.js";
94
+ import { HelpVideoPlayer as vi } from "./shared/components/help-videos/HelpVideoPlayer.js";
95
95
  import { HelpVideoRecorder as Vi } from "./shared/components/help-videos/recorder/HelpVideoRecorder.js";
96
96
  import { HelpVideoRecordingProvider as bi, useHelpVideoRecording as Li } from "./shared/components/help-videos/recorder/HelpVideoRecordingProvider.js";
97
97
  import { HelpVideoSheet as Bi } from "./shared/components/help-videos/viewer/HelpVideoSheet.js";
@@ -113,7 +113,7 @@ import { IntegrationObligationsView as ya } from "./shared/components/integratio
113
113
  import { IntegrationsConsole as wa } from "./shared/components/integrations/console/IntegrationsConsole.js";
114
114
  import { ItemActionButtons as Ia } from "./shared/components/panels/ItemActionButtons.js";
115
115
  import { ItemEditForm as Ea } from "./shared/components/ItemEditForm.js";
116
- import { ItemLockBanner as Da, useItemLock as va } from "./shared/components/panels/ItemLockBanner.js";
116
+ import { ItemLockBanner as va, useItemLock as Da } from "./shared/components/panels/ItemLockBanner.js";
117
117
  import { JobsTray as Oa } from "./shared/components/JobsTray.js";
118
118
  import { JsonMapEditor as La } from "./shared/components/JsonMapEditor.js";
119
119
  import { LAYOUT_PUSH_SETTLE_MS as Ba, useLayoutEditingQuiet as Ha } from "./shared/components/item-edit/layout-editing-quiet.js";
@@ -130,7 +130,7 @@ import { NotificationAnalyticsView as yn } from "./shared/components/notificatio
130
130
  import { NotificationBell as wn } from "./shared/components/NotificationBell.js";
131
131
  import { NotificationCenterView as In } from "./shared/components/notifications/NotificationCenterView.js";
132
132
  import { NotificationSourcesCard as En } from "./shared/components/NotificationSourcesCard.js";
133
- import { NotificationSubscriptionsView as Dn } from "./shared/components/notifications/NotificationSubscriptionsView.js";
133
+ import { NotificationSubscriptionsView as vn } from "./shared/components/notifications/NotificationSubscriptionsView.js";
134
134
  import { NotificationTemplatesView as Vn } from "./shared/components/notifications/NotificationTemplatesView.js";
135
135
  import { OfflineBanner as bn } from "./shared/components/OfflineBanner.js";
136
136
  import { OpsTasksView as Nn } from "./shared/components/ops/OpsTasksView.js";
@@ -151,7 +151,7 @@ import { SectionCard as ys } from "./shared/components/profile/primitives.js";
151
151
  import { QualityRulesView as ws } from "./shared/components/QualityRulesView.js";
152
152
  import { QueryStatStrip as Is } from "./shared/components/QueryStatStrip.js";
153
153
  import { QueryTable as Es } from "./shared/components/QueryTable.js";
154
- import { QueryWidgetBody as Ds, ReportView as vs, ReportWidgetCard as Vs } from "./shared/components/ReportView.js";
154
+ import { QueryWidgetBody as vs, ReportView as Ds, ReportWidgetCard as Vs } from "./shared/components/ReportView.js";
155
155
  import { QueueBulkBar as bs } from "./shared/components/queue/QueueBulkBar.js";
156
156
  import { QueueItemSheet as Ns } from "./shared/components/queue/QueueItemSheet.js";
157
157
  import { QueueKanbanBoard as Hs } from "./shared/components/queue/QueueKanbanBoard.js";
@@ -159,7 +159,7 @@ import { QueueWorklist as _s } from "./shared/components/queue/QueueWorklist.js"
159
159
  import { QueueWorkloadView as Gs } from "./shared/components/queue/QueueWorkloadView.js";
160
160
  import { QuickPicker as Qs } from "./shared/components/item-edit/QuickPicker.js";
161
161
  import { QuickPickerDialog as zs, useQuickPickerSteps as qs } from "./shared/components/item-edit/QuickPickerDialog.js";
162
- import { REACTION_EMOJI as Js, canOpenChatRoom as Xs, canOpenDm as js, chatAvatarColor as Zs, chatInitials as $s, chatRoomTypesQuery as ep, dmPeer as op, dmRoom as rp, getMentionQuery as tp, openChatRoom as ip, openDmWith as ap, registerDmOpener as np, registerRoomOpener as sp, splitMessageTokens as pp, useChannelAdmin as lp, useChannelDirectory as mp, useChannelMembers as fp, useChatConfig as up, useChatMessages as xp, useChatRoles as dp, useChatRooms as cp, useChatSearch as Cp, useCreateChannel as Rp, useCreateGroupDm as Sp, useDeleteMessage as hp, useEditMessage as gp, useEntityRoomLink as Pp, useMarkRoomRead as yp, useNotificationSoundPreference as Tp, useOpenRoomRegistration as wp, usePeerReadAt as Ap, useRoomMembership as Ip, useRoomPins as kp, useSendChatMessage as Ep, useTogglePin as Fp, useToggleReaction as Dp, useTypingIndicator as vp, useUnreadChirp as Vp, useUserSearch as Op } from "./shared/components/chat/chat-core.js";
162
+ import { REACTION_EMOJI as Js, canOpenChatRoom as Xs, canOpenDm as js, chatAvatarColor as Zs, chatInitials as $s, chatRoomTypesQuery as ep, dmPeer as op, dmRoom as rp, getMentionQuery as tp, openChatRoom as ip, openDmWith as ap, registerDmOpener as np, registerRoomOpener as sp, splitMessageTokens as pp, useChannelAdmin as lp, useChannelDirectory as mp, useChannelMembers as fp, useChatConfig as up, useChatMessages as xp, useChatRoles as dp, useChatRooms as cp, useChatSearch as Cp, useCreateChannel as Rp, useCreateGroupDm as Sp, useDeleteMessage as hp, useEditMessage as gp, useEntityRoomLink as Pp, useMarkRoomRead as yp, useNotificationSoundPreference as Tp, useOpenRoomRegistration as wp, usePeerReadAt as Ap, useRoomMembership as Ip, useRoomPins as kp, useSendChatMessage as Ep, useTogglePin as Fp, useToggleReaction as vp, useTypingIndicator as Dp, useUnreadChirp as Vp, useUserSearch as Op } from "./shared/components/chat/chat-core.js";
163
163
  import { ROW_HIGHLIGHT_TINTS as Lp, rowHighlightClass as Np, rowHighlightTextClass as Bp } from "./shared/lib/row-highlight.js";
164
164
  import { RealtimeContext as Mp, updateItemIds as _p, updateTouches as Wp, useOptionalRealtime as Gp, useRealtimeStatus as Up } from "./shared/lib/realtime.js";
165
165
  import { RealtimeStaleMark as Kp, RealtimeStatusBanner as zp } from "./shared/components/RealtimeStatusBanner.js";
@@ -180,7 +180,7 @@ import { RequiredVideosCard as yl } from "./shared/components/help-videos/viewer
180
180
  import { ReviewListWidget as wl } from "./shared/components/widgets/ReviewListWidget.js";
181
181
  import { RevisionsPanel as Il } from "./shared/components/panels/RevisionsPanel.js";
182
182
  import { RowPresence as El } from "./shared/components/RowPresence.js";
183
- import { SOMETHING_WENT_WRONG as Dl, isCodeError as vl, reportCodeError as Vl, userErrorMessage as Ol } from "./shared/lib/safe-error.js";
183
+ import { SOMETHING_WENT_WRONG as vl, isCodeError as Dl, reportCodeError as Vl, userErrorMessage as Ol } from "./shared/lib/safe-error.js";
184
184
  import { SearchHighlight as Ll } from "./shared/components/SearchHighlight.js";
185
185
  import { SignalCard as Bl } from "./shared/components/integrations/console/SignalCard.js";
186
186
  import { SkipReportCard as Ml, TemplateLintCard as _l } from "./shared/components/pipeline/PipelineHealthCards.js";
@@ -203,7 +203,7 @@ import { TipLayer as ym } from "./shared/components/TipLayer.js";
203
203
  import { TrafficMiniMap as wm } from "./shared/components/monitoring/TrafficMiniMap.js";
204
204
  import { UserAvatar as Im } from "./shared/components/UserAvatar.js";
205
205
  import { UserChip as Em, UserRosterCluster as Fm } from "./shared/components/item-edit/UserChip.js";
206
- import { WidgetSlot as vm } from "./shared/components/WidgetSlot.js";
206
+ import { WidgetSlot as Dm } from "./shared/components/WidgetSlot.js";
207
207
  import { WorkflowPanel as Om } from "./shared/components/panels/WorkflowPanel.js";
208
208
  import { activityWhy as Lm, actorName as Nm, groupActivity as Bm, renderActivityGroupSentence as Hm, renderActivitySentence as Mm } from "./shared/lib/activity-sentence.js";
209
209
  import { agingBucket as Wm, buildGroups as Gm, deriveGroupKey as Um } from "./shared/lib/queue-grouping.js";
@@ -219,56 +219,57 @@ import { captureReplayClip as Cf, clipEndOffset as Rf, prepareReplayClip as Sf,
219
219
  import { clearRecordOutbox as Tf } from "./shared/lib/record-outbox.js";
220
220
  import { configureTabSound as Af } from "./shared/lib/tab-sound.js";
221
221
  import { configureUserSync as kf, useUserSync as Ef } from "./shared/lib/user-sync.js";
222
- import { createGatedClient as Df, forgetSettledReads as vf, releaseGatedReads as Vf, releaseGatedReadsOnSharedFetch as Of, withGetCoalescing as bf } from "./shared/lib/request-gate.js";
222
+ import { createGatedClient as vf, forgetSettledReads as Df, releaseGatedReads as Vf, releaseGatedReadsOnSharedFetch as Of, withGetCoalescing as bf } from "./shared/lib/request-gate.js";
223
223
  import { createLeaderSocket as Nf } from "./shared/lib/leader-socket.js";
224
224
  import { createSocketRealtime as Hf } from "./shared/lib/socket-realtime.js";
225
225
  import { createWorkerSocket as _f, sharedWorkerSupported as Wf, shouldUseWorkerSocket as Gf, workerSocketPreference as Uf } from "./shared/lib/worker-socket.js";
226
226
  import { dismissAutofillRun as Kf, getAutofillRuns as zf, startAutofillRun as qf, useAutofillRuns as Yf } from "./shared/lib/autofill-runs.js";
227
- import { dotsForRecord as Xf } from "./shared/lib/integration-dots.js";
228
- import { effectiveScopeSeedIds as Zf, matchScopeDimension as $f, translateScopeValues as eu, useMyScopes as ou } from "./shared/lib/use-my-scopes.js";
229
- import { endHelpVideoWalk as tu, registerHelpVideoPage as iu, startHelpVideoWalk as au, useCurrentHelpVideoPage as nu } from "./shared/components/help-videos/walk/store.js";
230
- import { evaluateBoolean as pu, evaluateExpression as lu, evaluateNumeric as mu, extractExpressionTokens as fu, formulaConstant as uu, networkdaysBetween as xu, parseExpression as du, setFormulaConstants as cu, validateExpression as Cu } from "./shared/lib/expression.js";
231
- import { expandTokens as Su, foldSearchText as hu, highlightParts as gu, matchesSearch as Pu, searchRankTier as yu, tokenize as Tu } from "./shared/lib/search-text.js";
232
- import { extSlotKey as Au, getLayoutSlot as Iu, registerLayoutSlot as ku } from "./shared/lib/layout-slots.js";
233
- import { fiscalPeriodOf as Fu, fiscalQuarterOf as Du, fiscalYearOf as vu, getFiscalStartMonth as Vu, setFiscalStartMonth as Ou } from "./shared/lib/fiscal.js";
234
- import { formSkeletonFromLayout as Lu, skeletonColumnsFrom as Nu } from "./shared/lib/skeleton-shapes.js";
235
- import { formatMultiValue as Hu, formatValue as Mu, numericIntlOptions as _u, precisionOf as Wu } from "./shared/lib/format-value.js";
236
- import { formatReplayTail as Uu, getReplayTail as Qu, installReplayTail as Ku } from "./shared/lib/replay-tail.js";
237
- import { getApiUpdate as qu, startApiVersionWatch as Yu, useApiUpdate as Ju } from "./shared/lib/api-version.js";
238
- import { getFieldInterface as ju, listFieldInterfaces as Zu, onFieldInterfacesChange as $u, registerFieldInterface as ex } from "./shared/lib/field-interfaces.js";
239
- import { guardIdentityCall as rx, isSignedOut as tx, isSignedOutError as ix, noteCredentialChanged as ax, noteSignedIn as nx, noteUnauthorized as sx, onSignedIn as px } from "./shared/lib/signed-out.js";
240
- import { hasUnsavedWork as mx, isReloadingForUpdate as fx, registerUnsavedWork as ux, subscribeUnsavedWork as xx, unsavedWorkLabels as dx, useUnsavedWork as cx } from "./shared/lib/unsaved-work.js";
241
- import { helpVideoApi as Rx, helpVideoKeys as Sx, useHelpVideo as hx, useHelpVideoWalk as gx, useHelpVideosFor as Px, useRequiredVideos as yx } from "./shared/components/help-videos/api.js";
242
- import { holdNotification as wx, huddleHolds as Ax, releaseHeld as Ix } from "./shared/components/chat/huddle/huddle-hold.js";
243
- import { installStaleChunkRecovery as Ex, isStaleChunkError as Fx } from "./shared/lib/stale-chunk.js";
244
- import { isListTimeout as vx, listLoadErrorText as Vx, loadErrorText as Ox } from "./shared/lib/load-error.js";
245
- import { knownTotalFrom as Lx, slowReasonText as Nx } from "./shared/lib/slow-reason.js";
246
- import { measureClockOffset as Hx, serverNow as Mx, setServerClockOffset as _x } from "./shared/lib/server-clock.js";
247
- import { normalizeFieldType as Gx } from "./hooks/schemaBuilder.js";
248
- import { obligationQueryParams as Qx, toneForOutcome as Kx } from "./shared/lib/obligation-filters.js";
249
- import { pageAtPayload as qx, usePageAt as Yx } from "./shared/lib/use-page-at.js";
250
- import { playNotificationSound as Xx } from "./shared/lib/notification-sound.js";
251
- import { rankTeamForFilters as Zx, useScopeDimensions as $x } from "./shared/components/pipeline/teamScopes.js";
252
- import { registerReloadHold as od } from "./shared/lib/reload-holds.js";
253
- import { resolveNotificationTarget as td, resolveNotificationTargetFor as id, runNotificationTarget as ad } from "./shared/lib/notification-target.js";
254
- import { restoreMetadata as sd, startMetadataPersistence as pd, wipeMetadataCache as ld } from "./shared/lib/metadata-persist.js";
255
- import { rowPresenceKey as fd, useFieldFocus as ud, usePresence as xd, useRowPresence as dd, useTyping as cd } from "./shared/lib/presence-hooks.js";
256
- import { rumRouteChange as Rd, rumWidget as Sd, startRum as hd } from "./shared/lib/rum.js";
257
- import { seedQuickPickerSteps as Pd } from "./shared/components/item-edit/helpers.js";
258
- import { signalSentence as Td, useRecordSignalPeers as wd, useRecordSignalWhile as Ad, useTopicPresence as Id } from "./shared/lib/presence-signals.js";
259
- import { stuckText as Ed } from "./shared/lib/presence-state.js";
260
- import { tapReplaySocket as Dd } from "./shared/lib/replay-socket.js";
261
- import { useAfterIdle as Vd } from "./shared/lib/defer.js";
262
- import { useBackgroundRun as bd } from "./shared/lib/background-runs.js";
263
- import { useClientChaos as Nd, useClientChaosGate as Bd } from "./shared/components/client-chaos-gate.js";
264
- import { useDebounced as Md } from "./shared/hooks/useDebounced.js";
265
- import { useElapsedLoading as Wd } from "./shared/hooks/useElapsedLoading.js";
266
- import { useEventPath as Ud, usePartner as Qd, usePartners as Kd, useRecordIntegrationActivity as zd, useRefreshSignals as qd, useSignalAction as Yd, useSignals as Jd, useSnooze as Xd } from "./shared/components/integrations/console/api.js";
267
- import { useFeatureFlag as Zd, useFeatureFlags as $d } from "./shared/lib/feature-flags.js";
268
- import { useFileHealth as oc } from "./shared/hooks/useFileHealth.js";
269
- import { useOnlineUsers as tc } from "./shared/lib/use-online-users.js";
270
- import { usePersonProfile as ac } from "./shared/components/profile/types.js";
271
- import { useSlowReason as sc } from "./shared/hooks/useSlowReason.js";
227
+ import { displayTrail as Xf, recordNavigation as jf, setTrailLabel as Zf, trailChain as $f, useNavTrail as eu } from "./shared/lib/nav-trail.js";
228
+ import { dotsForRecord as ru } from "./shared/lib/integration-dots.js";
229
+ import { effectiveScopeSeedIds as iu, matchScopeDimension as au, translateScopeValues as nu, useMyScopes as su } from "./shared/lib/use-my-scopes.js";
230
+ import { endHelpVideoWalk as lu, registerHelpVideoPage as mu, startHelpVideoWalk as fu, useCurrentHelpVideoPage as uu } from "./shared/components/help-videos/walk/store.js";
231
+ import { evaluateBoolean as du, evaluateExpression as cu, evaluateNumeric as Cu, extractExpressionTokens as Ru, formulaConstant as Su, networkdaysBetween as hu, parseExpression as gu, setFormulaConstants as Pu, validateExpression as yu } from "./shared/lib/expression.js";
232
+ import { expandTokens as wu, foldSearchText as Au, highlightParts as Iu, matchesSearch as ku, searchRankTier as Eu, tokenize as Fu } from "./shared/lib/search-text.js";
233
+ import { extSlotKey as Du, getLayoutSlot as Vu, registerLayoutSlot as Ou } from "./shared/lib/layout-slots.js";
234
+ import { fiscalPeriodOf as Lu, fiscalQuarterOf as Nu, fiscalYearOf as Bu, getFiscalStartMonth as Hu, setFiscalStartMonth as Mu } from "./shared/lib/fiscal.js";
235
+ import { formSkeletonFromLayout as Wu, skeletonColumnsFrom as Gu } from "./shared/lib/skeleton-shapes.js";
236
+ import { formatMultiValue as Qu, formatValue as Ku, numericIntlOptions as zu, precisionOf as qu } from "./shared/lib/format-value.js";
237
+ import { formatReplayTail as Ju, getReplayTail as Xu, installReplayTail as ju } from "./shared/lib/replay-tail.js";
238
+ import { getApiUpdate as $u, startApiVersionWatch as ex, useApiUpdate as ox } from "./shared/lib/api-version.js";
239
+ import { getFieldInterface as tx, listFieldInterfaces as ix, onFieldInterfacesChange as ax, registerFieldInterface as nx } from "./shared/lib/field-interfaces.js";
240
+ import { guardIdentityCall as px, isSignedOut as lx, isSignedOutError as mx, noteCredentialChanged as fx, noteSignedIn as ux, noteUnauthorized as xx, onSignedIn as dx } from "./shared/lib/signed-out.js";
241
+ import { hasUnsavedWork as Cx, isReloadingForUpdate as Rx, registerUnsavedWork as Sx, subscribeUnsavedWork as hx, unsavedWorkLabels as gx, useUnsavedWork as Px } from "./shared/lib/unsaved-work.js";
242
+ import { helpVideoApi as Tx, helpVideoKeys as wx, useHelpVideo as Ax, useHelpVideoWalk as Ix, useHelpVideosFor as kx, useRequiredVideos as Ex } from "./shared/components/help-videos/api.js";
243
+ import { holdNotification as vx, huddleHolds as Dx, releaseHeld as Vx } from "./shared/components/chat/huddle/huddle-hold.js";
244
+ import { installStaleChunkRecovery as bx, isStaleChunkError as Lx } from "./shared/lib/stale-chunk.js";
245
+ import { isListTimeout as Bx, listLoadErrorText as Hx, loadErrorText as Mx } from "./shared/lib/load-error.js";
246
+ import { knownTotalFrom as Wx, slowReasonText as Gx } from "./shared/lib/slow-reason.js";
247
+ import { measureClockOffset as Qx, serverNow as Kx, setServerClockOffset as zx } from "./shared/lib/server-clock.js";
248
+ import { normalizeFieldType as Yx } from "./hooks/schemaBuilder.js";
249
+ import { obligationQueryParams as Xx, toneForOutcome as jx } from "./shared/lib/obligation-filters.js";
250
+ import { pageAtPayload as $x, usePageAt as ed } from "./shared/lib/use-page-at.js";
251
+ import { playNotificationSound as rd } from "./shared/lib/notification-sound.js";
252
+ import { rankTeamForFilters as id, useScopeDimensions as ad } from "./shared/components/pipeline/teamScopes.js";
253
+ import { registerReloadHold as sd } from "./shared/lib/reload-holds.js";
254
+ import { resolveNotificationTarget as ld, resolveNotificationTargetFor as md, runNotificationTarget as fd } from "./shared/lib/notification-target.js";
255
+ import { restoreMetadata as xd, startMetadataPersistence as dd, wipeMetadataCache as cd } from "./shared/lib/metadata-persist.js";
256
+ import { rowPresenceKey as Rd, useFieldFocus as Sd, usePresence as hd, useRowPresence as gd, useTyping as Pd } from "./shared/lib/presence-hooks.js";
257
+ import { rumRouteChange as Td, rumWidget as wd, startRum as Ad } from "./shared/lib/rum.js";
258
+ import { seedQuickPickerSteps as kd } from "./shared/components/item-edit/helpers.js";
259
+ import { signalSentence as Fd, useRecordSignalPeers as vd, useRecordSignalWhile as Dd, useTopicPresence as Vd } from "./shared/lib/presence-signals.js";
260
+ import { stuckText as bd } from "./shared/lib/presence-state.js";
261
+ import { tapReplaySocket as Nd } from "./shared/lib/replay-socket.js";
262
+ import { useAfterIdle as Hd } from "./shared/lib/defer.js";
263
+ import { useBackgroundRun as _d } from "./shared/lib/background-runs.js";
264
+ import { useClientChaos as Gd, useClientChaosGate as Ud } from "./shared/components/client-chaos-gate.js";
265
+ import { useDebounced as Kd } from "./shared/hooks/useDebounced.js";
266
+ import { useElapsedLoading as qd } from "./shared/hooks/useElapsedLoading.js";
267
+ import { useEventPath as Jd, usePartner as Xd, usePartners as jd, useRecordIntegrationActivity as Zd, useRefreshSignals as $d, useSignalAction as ec, useSignals as oc, useSnooze as rc } from "./shared/components/integrations/console/api.js";
268
+ import { useFeatureFlag as ic, useFeatureFlags as ac } from "./shared/lib/feature-flags.js";
269
+ import { useFileHealth as sc } from "./shared/hooks/useFileHealth.js";
270
+ import { useOnlineUsers as lc } from "./shared/lib/use-online-users.js";
271
+ import { usePersonProfile as fc } from "./shared/components/profile/types.js";
272
+ import { useSlowReason as xc } from "./shared/hooks/useSlowReason.js";
272
273
  export {
273
274
  j as ACTIVE_GAMEDAYS_KEY,
274
275
  oe as ACTIVE_USER_OPTION_FILTER,
@@ -279,7 +280,7 @@ export {
279
280
  we as AiAnalyticsView,
280
281
  Ie as AiFeedbackButtons,
281
282
  Ee as AiMarkdown,
282
- De as AiMemorySuggestions,
283
+ ve as AiMemorySuggestions,
283
284
  Ve as AiPlanCard,
284
285
  be as AiReviewCard,
285
286
  Me as AlertManagerView,
@@ -321,7 +322,7 @@ export {
321
322
  wr as CloneDialog,
322
323
  Ir as CollectionBrowserView,
323
324
  Er as CollectionImportPanel,
324
- Dr as CommandCenterView,
325
+ vr as CommandCenterView,
325
326
  Vr as CommentPanel,
326
327
  br as ConformanceView,
327
328
  Nr as CopyAsButton,
@@ -366,7 +367,7 @@ export {
366
367
  wi as HelpVideoEditor,
367
368
  Ii as HelpVideoLibrary,
368
369
  Ei as HelpVideoMatchChip,
369
- Di as HelpVideoPlayer,
370
+ vi as HelpVideoPlayer,
370
371
  Vi as HelpVideoRecorder,
371
372
  bi as HelpVideoRecordingProvider,
372
373
  Bi as HelpVideoSheet,
@@ -393,7 +394,7 @@ export {
393
394
  Ia as ItemActionButtons,
394
395
  Ft as ItemEditAuthContext,
395
396
  Ea as ItemEditForm,
396
- Da as ItemLockBanner,
397
+ va as ItemLockBanner,
397
398
  Oa as JobsTray,
398
399
  La as JsonMapEditor,
399
400
  Ba as LAYOUT_PUSH_SETTLE_MS,
@@ -406,18 +407,18 @@ export {
406
407
  en as MAX_PREFETCH_IN_FLIGHT,
407
408
  dn as MatrixEditor,
408
409
  Cn as MyWorkView,
409
- Dt as NavigationContext,
410
+ vt as NavigationContext,
410
411
  Sn as NewImportDialog,
411
412
  g as NivaroField,
412
413
  y as NivaroForm,
413
- vt as NivaroProvider,
414
+ Dt as NivaroProvider,
414
415
  gn as NotificationActions,
415
416
  yn as NotificationAnalyticsView,
416
417
  wn as NotificationBell,
417
418
  In as NotificationCenterView,
418
419
  ft as NotificationRulesCard,
419
420
  En as NotificationSourcesCard,
420
- Dn as NotificationSubscriptionsView,
421
+ vn as NotificationSubscriptionsView,
421
422
  Vn as NotificationTemplatesView,
422
423
  p as NumberField,
423
424
  bn as OfflineBanner,
@@ -451,7 +452,7 @@ export {
451
452
  ws as QualityRulesView,
452
453
  Is as QueryStatStrip,
453
454
  Es as QueryTable,
454
- Ds as QueryWidgetBody,
455
+ vs as QueryWidgetBody,
455
456
  Jn as QueryWidgetView,
456
457
  bs as QueueBulkBar,
457
458
  Ns as QueueItemSheet,
@@ -484,13 +485,13 @@ export {
484
485
  m as RelationField,
485
486
  Rl as RenderSettingsButton,
486
487
  hl as ReportProblemButton,
487
- vs as ReportView,
488
+ Ds as ReportView,
488
489
  Vs as ReportWidgetCard,
489
490
  yl as RequiredVideosCard,
490
491
  wl as ReviewListWidget,
491
492
  Il as RevisionsPanel,
492
493
  El as RowPresence,
493
- Dl as SOMETHING_WENT_WRONG,
494
+ vl as SOMETHING_WENT_WRONG,
494
495
  Ll as SearchHighlight,
495
496
  u as SelectField,
496
497
  Bl as SignalCard,
@@ -524,7 +525,7 @@ export {
524
525
  Im as UserAvatar,
525
526
  Em as UserChip,
526
527
  Fm as UserRosterCluster,
527
- vm as WidgetSlot,
528
+ Dm as WidgetSlot,
528
529
  Om as WorkflowPanel,
529
530
  Qr as activeCustomStatus,
530
531
  Lm as activityWhy,
@@ -564,7 +565,7 @@ export {
564
565
  Af as configureTabSound,
565
566
  kf as configureUserSync,
566
567
  rn as connectionAllowsPrefetch,
567
- Df as createGatedClient,
568
+ vf as createGatedClient,
568
569
  Nf as createLeaderSocket,
569
570
  Wa as createLiveQueryBridge,
570
571
  Hf as createSocketRealtime,
@@ -575,183 +576,187 @@ export {
575
576
  Um as deriveGroupKey,
576
577
  Mr as describeCron,
577
578
  Kf as dismissAutofillRun,
579
+ Xf as displayTrail,
578
580
  op as dmPeer,
579
581
  rp as dmRoom,
580
- Xf as dotsForRecord,
581
- Zf as effectiveScopeSeedIds,
582
+ ru as dotsForRecord,
583
+ iu as effectiveScopeSeedIds,
582
584
  Nt as encodePrefill,
583
- tu as endHelpVideoWalk,
584
- pu as evaluateBoolean,
585
- lu as evaluateExpression,
586
- mu as evaluateNumeric,
587
- Su as expandTokens,
588
- Au as extSlotKey,
589
- fu as extractExpressionTokens,
585
+ lu as endHelpVideoWalk,
586
+ du as evaluateBoolean,
587
+ cu as evaluateExpression,
588
+ Cu as evaluateNumeric,
589
+ wu as expandTokens,
590
+ Du as extSlotKey,
591
+ Ru as extractExpressionTokens,
590
592
  k as fetchSchema,
591
593
  Bt as fieldDrilldownConfig,
592
594
  Jr as filterDefLabel,
593
595
  Xr as filterValueDisplay,
594
- Fu as fiscalPeriodOf,
595
- Du as fiscalQuarterOf,
596
- vu as fiscalYearOf,
596
+ Lu as fiscalPeriodOf,
597
+ Nu as fiscalQuarterOf,
598
+ Bu as fiscalYearOf,
597
599
  _n as focusRecordTarget,
598
- hu as foldSearchText,
599
- vf as forgetSettledReads,
600
- Lu as formSkeletonFromLayout,
600
+ Au as foldSearchText,
601
+ Df as forgetSettledReads,
602
+ Wu as formSkeletonFromLayout,
601
603
  ie as formatDate,
602
604
  ae as formatDateTime,
603
605
  ne as formatFileSize,
604
- Hu as formatMultiValue,
606
+ Qu as formatMultiValue,
605
607
  se as formatNumber,
606
608
  pe as formatRelative,
607
- Uu as formatReplayTail,
609
+ Ju as formatReplayTail,
608
610
  Kr as formatStatusExpiry,
609
- Mu as formatValue,
610
- uu as formulaConstant,
611
- qu as getApiUpdate,
611
+ Ku as formatValue,
612
+ Su as formulaConstant,
613
+ $u as getApiUpdate,
612
614
  zf as getAutofillRuns,
613
615
  Mo as getClientChaos,
614
- ju as getFieldInterface,
615
- Vu as getFiscalStartMonth,
616
- Iu as getLayoutSlot,
616
+ tx as getFieldInterface,
617
+ Hu as getFiscalStartMonth,
618
+ Vu as getLayoutSlot,
617
619
  tp as getMentionQuery,
618
- Qu as getReplayTail,
620
+ Xu as getReplayTail,
619
621
  Bm as groupActivity,
620
- rx as guardIdentityCall,
621
- mx as hasUnsavedWork,
622
- Rx as helpVideoApi,
623
- Sx as helpVideoKeys,
624
- gu as highlightParts,
625
- wx as holdNotification,
622
+ px as guardIdentityCall,
623
+ Cx as hasUnsavedWork,
624
+ Tx as helpVideoApi,
625
+ wx as helpVideoKeys,
626
+ Iu as highlightParts,
627
+ vx as holdNotification,
626
628
  Qi as huddleCallLayerMounted,
627
- Ax as huddleHolds,
629
+ Dx as huddleHolds,
628
630
  qi as idleState,
629
631
  _o as installClientChaosFetch,
630
632
  tn as installIntentPrefetch,
631
- Ku as installReplayTail,
632
- Ex as installStaleChunkRecovery,
633
+ ju as installReplayTail,
634
+ bx as installStaleChunkRecovery,
633
635
  an as intentProps,
634
636
  yr as isChatPanelPinned,
635
- Do as isCleanRecording,
636
- vl as isCodeError,
637
- vx as isListTimeout,
638
- fx as isReloadingForUpdate,
639
- tx as isSignedOut,
640
- ix as isSignedOutError,
641
- Fx as isStaleChunkError,
642
- Lx as knownTotalFrom,
637
+ vo as isCleanRecording,
638
+ Dl as isCodeError,
639
+ Bx as isListTimeout,
640
+ Rx as isReloadingForUpdate,
641
+ lx as isSignedOut,
642
+ mx as isSignedOutError,
643
+ Lx as isStaleChunkError,
644
+ Wx as knownTotalFrom,
643
645
  hs as layoutPretendDownOptions,
644
- Zu as listFieldInterfaces,
645
- Vx as listLoadErrorText,
646
+ ix as listFieldInterfaces,
647
+ Hx as listLoadErrorText,
646
648
  nn as listQueryKeys,
647
649
  M as liveListKey,
648
650
  Ga as liveQueryMeta,
649
651
  _ as liveRecordKey,
650
652
  Ua as liveRefetchInterval,
651
- Ox as loadErrorText,
653
+ Mx as loadErrorText,
652
654
  df as maskInputsIn,
653
- $f as matchScopeDimension,
654
- Pu as matchesSearch,
655
- Hx as measureClockOffset,
656
- xu as networkdaysBetween,
657
- Gx as normalizeFieldType,
658
- ax as noteCredentialChanged,
659
- nx as noteSignedIn,
660
- sx as noteUnauthorized,
661
- _u as numericIntlOptions,
662
- Qx as obligationQueryParams,
663
- $u as onFieldInterfacesChange,
655
+ au as matchScopeDimension,
656
+ ku as matchesSearch,
657
+ Qx as measureClockOffset,
658
+ hu as networkdaysBetween,
659
+ Yx as normalizeFieldType,
660
+ fx as noteCredentialChanged,
661
+ ux as noteSignedIn,
662
+ xx as noteUnauthorized,
663
+ zu as numericIntlOptions,
664
+ Xx as obligationQueryParams,
665
+ ax as onFieldInterfacesChange,
664
666
  Yi as onIdleChange,
665
- px as onSignedIn,
667
+ dx as onSignedIn,
666
668
  eo as openAskPanel,
667
669
  nf as openCatalogItem,
668
670
  ip as openChatRoom,
669
671
  Jo as openClientChaosToolbar,
670
672
  ap as openDmWith,
671
- qx as pageAtPayload,
672
- du as parseExpression,
673
- Xx as playNotificationSound,
674
- Wu as precisionOf,
673
+ $x as pageAtPayload,
674
+ gu as parseExpression,
675
+ rd as playNotificationSound,
676
+ qu as precisionOf,
675
677
  sn as prefetchCollectionList,
676
678
  pn as prefetchRecord,
677
679
  Sf as prepareReplayClip,
678
680
  di as rankSignals,
679
- Zx as rankTeamForFilters,
681
+ id as rankTeamForFilters,
682
+ jf as recordNavigation,
680
683
  ln as recordQueryKeys,
681
684
  sf as registerCatalogItemOpener,
682
685
  np as registerDmOpener,
683
- ex as registerFieldInterface,
684
- iu as registerHelpVideoPage,
685
- ku as registerLayoutSlot,
686
- od as registerReloadHold,
686
+ nx as registerFieldInterface,
687
+ mu as registerHelpVideoPage,
688
+ Ou as registerLayoutSlot,
689
+ sd as registerReloadHold,
687
690
  hf as registerReplayCapture,
688
691
  sp as registerRoomOpener,
689
- ux as registerUnsavedWork,
692
+ Sx as registerUnsavedWork,
690
693
  mf as registerViewAsOpener,
691
694
  Vf as releaseGatedReads,
692
695
  Of as releaseGatedReadsOnSharedFetch,
693
- Ix as releaseHeld,
696
+ Vx as releaseHeld,
694
697
  Hm as renderActivityGroupSentence,
695
698
  Mm as renderActivitySentence,
696
699
  gf as replayHref,
697
700
  $m as reportClientCrash,
698
701
  Vl as reportCodeError,
699
702
  le as resolveCollectionIcon,
700
- td as resolveNotificationTarget,
701
- id as resolveNotificationTargetFor,
702
- sd as restoreMetadata,
703
+ ld as resolveNotificationTarget,
704
+ md as resolveNotificationTargetFor,
705
+ xd as restoreMetadata,
703
706
  Np as rowHighlightClass,
704
707
  Bp as rowHighlightTextClass,
705
- fd as rowPresenceKey,
706
- Rd as rumRouteChange,
707
- Sd as rumWidget,
708
- ad as runNotificationTarget,
709
- yu as searchRankTier,
710
- Pd as seedQuickPickerSteps,
711
- Mx as serverNow,
708
+ Rd as rowPresenceKey,
709
+ Td as rumRouteChange,
710
+ wd as rumWidget,
711
+ fd as runNotificationTarget,
712
+ Eu as searchRankTier,
713
+ kd as seedQuickPickerSteps,
714
+ Kx as serverNow,
712
715
  me as setDisplayTimezone,
713
- Ou as setFiscalStartMonth,
714
- cu as setFormulaConstants,
716
+ Mu as setFiscalStartMonth,
717
+ Pu as setFormulaConstants,
715
718
  fe as setNumberFormat,
716
- vo as setRecordingSelf,
717
- _x as setServerClockOffset,
719
+ Do as setRecordingSelf,
720
+ zx as setServerClockOffset,
718
721
  ue as setTimeDisplay,
722
+ Zf as setTrailLabel,
719
723
  Wf as sharedWorkerSupported,
720
724
  Gf as shouldUseWorkerSocket,
721
- Td as signalSentence,
722
- Nu as skeletonColumnsFrom,
723
- Nx as slowReasonText,
725
+ Fd as signalSentence,
726
+ Gu as skeletonColumnsFrom,
727
+ Gx as slowReasonText,
724
728
  pp as splitMessageTokens,
725
- Yu as startApiVersionWatch,
729
+ ex as startApiVersionWatch,
726
730
  qf as startAutofillRun,
727
731
  Wo as startClientChaos,
728
- au as startHelpVideoWalk,
729
- pd as startMetadataPersistence,
730
- hd as startRum,
732
+ fu as startHelpVideoWalk,
733
+ dd as startMetadataPersistence,
734
+ Ad as startRum,
731
735
  Go as stopClientChaos,
732
- Ed as stuckText,
736
+ bd as stuckText,
733
737
  Uo as subscribeClientChaos,
734
- xx as subscribeUnsavedWork,
735
- Dd as tapReplaySocket,
738
+ hx as subscribeUnsavedWork,
739
+ Nd as tapReplaySocket,
736
740
  xe as titleCase,
737
- Tu as tokenize,
738
- Kx as toneForOutcome,
741
+ Fu as tokenize,
742
+ jx as toneForOutcome,
739
743
  Ji as trackActivity,
740
- eu as translateScopeValues,
741
- dx as unsavedWorkLabels,
744
+ $f as trailChain,
745
+ nu as translateScopeValues,
746
+ gx as unsavedWorkLabels,
742
747
  _p as updateItemIds,
743
748
  Wp as updateTouches,
744
749
  $ as useActiveGamedays,
745
750
  ge as useActivityLabels,
746
- Vd as useAfterIdle,
751
+ Hd as useAfterIdle,
747
752
  Ht as useApiFetchConfig,
748
- Ju as useApiUpdate,
753
+ ox as useApiUpdate,
749
754
  Tt as useArmedFaults,
750
755
  oo as useAskRecordDrag,
751
756
  w as useAutoRecord,
752
757
  Yf as useAutofillRuns,
753
758
  yo as useAvailableBulkActions,
754
- bd as useBackgroundRun,
759
+ _d as useBackgroundRun,
755
760
  lp as useChannelAdmin,
756
761
  mp as useChannelDirectory,
757
762
  fp as useChannelMembers,
@@ -761,12 +766,12 @@ export {
761
766
  cp as useChatRooms,
762
767
  Cp as useChatSearch,
763
768
  Vo as useCleanRecording,
764
- Nd as useClientChaos,
765
- Bd as useClientChaosGate,
769
+ Gd as useClientChaos,
770
+ Ud as useClientChaosGate,
766
771
  Rp as useCreateChannel,
767
772
  Sp as useCreateGroupDm,
768
- nu as useCurrentHelpVideoPage,
769
- Md as useDebounced,
773
+ uu as useCurrentHelpVideoPage,
774
+ Kd as useDebounced,
770
775
  hp as useDeleteMessage,
771
776
  zm as useDisplayPreferences,
772
777
  St as useDndActive,
@@ -774,29 +779,29 @@ export {
774
779
  Mt as useDrilldown,
775
780
  _t as useDrilldownViews,
776
781
  gp as useEditMessage,
777
- Wd as useElapsedLoading,
782
+ qd as useElapsedLoading,
778
783
  Pp as useEntityRoomLink,
779
- Ud as useEventPath,
780
- Zd as useFeatureFlag,
781
- $d as useFeatureFlags,
782
- D as useFieldArray,
783
- ud as useFieldFocus,
784
- v as useFieldState,
785
- oc as useFileHealth,
784
+ Jd as useEventPath,
785
+ ic as useFeatureFlag,
786
+ ac as useFeatureFlags,
787
+ v as useFieldArray,
788
+ Sd as useFieldFocus,
789
+ D as useFieldState,
790
+ sc as useFileHealth,
786
791
  V as useFormDirty,
787
792
  E as useFormSchema,
788
793
  O as useFormStatus,
789
794
  Wt as useGridFlush,
790
- hx as useHelpVideo,
795
+ Ax as useHelpVideo,
791
796
  Li as useHelpVideoRecording,
792
- gx as useHelpVideoWalk,
793
- Px as useHelpVideosFor,
797
+ Ix as useHelpVideoWalk,
798
+ kx as useHelpVideosFor,
794
799
  mn as useIdleNextPage,
795
800
  sa as useImportHealth,
796
801
  fn as useIntentPrefetch,
797
802
  Oo as useIsRecordingSelf,
798
803
  Gt as useItemEditAuth,
799
- va as useItemLock,
804
+ Da as useItemLock,
800
805
  Ut as useItemNavigation,
801
806
  Ha as useLayoutEditingQuiet,
802
807
  W as useLiveList,
@@ -805,64 +810,65 @@ export {
805
810
  G as useLiveRecord,
806
811
  za as useLiveRefetchInterval,
807
812
  yp as useMarkRoomRead,
808
- ou as useMyScopes,
813
+ su as useMyScopes,
814
+ eu as useNavTrail,
809
815
  Qt as useNavigation,
810
816
  Kt as useNivaroClient,
811
817
  Q as useNivaroForm,
812
818
  Tp as useNotificationSoundPreference,
813
- tc as useOnlineUsers,
819
+ lc as useOnlineUsers,
814
820
  wp as useOpenRoomRegistration,
815
821
  zt as useOptionalNivaroClient,
816
822
  Gp as useOptionalRealtime,
817
823
  b as useOrderedLayout,
818
824
  qt as useOverlayState,
819
- Yx as usePageAt,
820
- Qd as usePartner,
821
- Kd as usePartners,
825
+ ed as usePageAt,
826
+ Xd as usePartner,
827
+ jd as usePartners,
822
828
  Ap as usePeerReadAt,
823
- ac as usePersonProfile,
829
+ fc as usePersonProfile,
824
830
  us as usePlanGridHost,
825
831
  un as usePrefetchIntent,
826
- xd as usePresence,
832
+ hd as usePresence,
827
833
  gs as usePretendDownScope,
828
834
  ro as usePublishAskContext,
829
835
  qs as useQuickPickerSteps,
830
836
  Up as useRealtimeStatus,
831
- zd as useRecordIntegrationActivity,
832
- wd as useRecordSignalPeers,
833
- Ad as useRecordSignalWhile,
834
- qd as useRefreshSignals,
837
+ Zd as useRecordIntegrationActivity,
838
+ vd as useRecordSignalPeers,
839
+ Dd as useRecordSignalWhile,
840
+ $d as useRefreshSignals,
835
841
  z as useRelationOptions,
836
- yx as useRequiredVideos,
842
+ Ex as useRequiredVideos,
837
843
  Ip as useRoomMembership,
838
844
  kp as useRoomPins,
839
- dd as useRowPresence,
840
- $x as useScopeDimensions,
845
+ gd as useRowPresence,
846
+ ad as useScopeDimensions,
841
847
  L as useSectionState,
842
848
  Ep as useSendChatMessage,
843
849
  J as useSessionRecorder,
844
850
  pa as useSetImportCadence,
845
- Yd as useSignalAction,
846
- Jd as useSignals,
847
- sc as useSlowReason,
848
- Xd as useSnooze,
851
+ ec as useSignalAction,
852
+ oc as useSignals,
853
+ xc as useSlowReason,
854
+ rc as useSnooze,
849
855
  em as useSubscriptionMutations,
850
856
  N as useTabState,
851
857
  Fp as useTogglePin,
852
- Dp as useToggleReaction,
853
- Id as useTopicPresence,
854
- cd as useTyping,
855
- vp as useTypingIndicator,
858
+ vp as useToggleReaction,
859
+ Vd as useTopicPresence,
860
+ Pd as useTyping,
861
+ Dp as useTypingIndicator,
856
862
  Vp as useUnreadChirp,
857
- cx as useUnsavedWork,
863
+ Px as useUnsavedWork,
858
864
  Op as useUserSearch,
859
865
  Ef as useUserSync,
860
866
  B as useWatchFields,
861
867
  Ol as userErrorMessage,
862
868
  de as userOptionFilter,
863
- Cu as validateExpression,
869
+ yu as validateExpression,
864
870
  ff as viewAs,
865
- ld as wipeMetadataCache,
871
+ cd as wipeMetadataCache,
866
872
  Qo as withClientChaos,
867
873
  Pf as withClipKind,
868
874
  bf as withGetCoalescing,
@@ -0,0 +1,107 @@
1
+ import { useSyncExternalStore as m } from "react";
2
+ const p = "nvr:nav-trail", y = 60, f = (n) => n.split(/[?#]/)[0] || "/";
3
+ function k(n, t) {
4
+ const i = t.at ?? Date.now(), e = Number.isFinite(t.idx) ? Math.max(0, Math.floor(t.idx)) : 0, r = n.entries.find((s) => s.idx === e);
5
+ let o;
6
+ if (t.action === "PUSH")
7
+ o = [...n.entries.filter((s) => s.idx < e), { key: t.key, idx: e, path: t.path, at: i }];
8
+ else if (r && r.key === t.key && r.path === t.path)
9
+ o = n.entries;
10
+ else {
11
+ const s = r && f(r.path) === f(t.path) ? r : null, c = {
12
+ key: t.key,
13
+ idx: e,
14
+ path: t.path,
15
+ at: i,
16
+ ...s != null && s.label ? { label: s.label } : {},
17
+ ...s != null && s.scroll && t.action === "REPLACE" ? { scroll: s.scroll } : {}
18
+ };
19
+ o = [...n.entries.filter((l) => l.idx !== e), c].sort((l, a) => l.idx - a.idx);
20
+ }
21
+ return o.length > y && (o = o.slice(o.length - y)), { entries: o, current: { key: t.key, idx: e } };
22
+ }
23
+ function I(n) {
24
+ const t = n.current;
25
+ if (!t) return [];
26
+ const i = new Map(n.entries.map((r) => [r.idx, r])), e = [];
27
+ for (let r = t.idx - 1; r >= 0; r--) {
28
+ const o = i.get(r);
29
+ if (!o) break;
30
+ e.unshift(o);
31
+ }
32
+ return e;
33
+ }
34
+ function A(n, t, i = {}) {
35
+ var c;
36
+ const e = i.max ?? 4, r = f(t.path), o = /* @__PURE__ */ new Set([r]), s = [];
37
+ for (let l = n.length - 1; l >= 0 && s.length < e; l--) {
38
+ const a = n[l], d = f(a.path);
39
+ if (!o.has(d) && (o.add(d), s.unshift({ key: a.key, path: a.path, label: a.label, delta: a.idx - t.idx }), (c = i.isRoot) != null && c.call(i, d)))
40
+ break;
41
+ }
42
+ return s;
43
+ }
44
+ const b = { entries: [], current: null };
45
+ let u = null;
46
+ const x = /* @__PURE__ */ new Set();
47
+ function h() {
48
+ if (u) return u;
49
+ try {
50
+ const n = typeof sessionStorage < "u" ? sessionStorage.getItem(p) : null, t = n ? JSON.parse(n) : null;
51
+ u = { entries: Array.isArray(t == null ? void 0 : t.entries) ? t.entries.filter(
52
+ (e) => !!e && typeof e.key == "string" && typeof e.path == "string" && Number.isFinite(e.idx)
53
+ ) : [], current: (t == null ? void 0 : t.current) ?? null };
54
+ } catch {
55
+ u = b;
56
+ }
57
+ return u;
58
+ }
59
+ function g(n) {
60
+ u = n;
61
+ try {
62
+ sessionStorage.setItem(p, JSON.stringify(n));
63
+ } catch {
64
+ }
65
+ for (const t of x) t();
66
+ }
67
+ function S() {
68
+ return h();
69
+ }
70
+ function w(n) {
71
+ const t = k(h(), n);
72
+ return t !== u && g(t), t.entries.find((i) => {
73
+ var e;
74
+ return i.idx === ((e = t.current) == null ? void 0 : e.idx);
75
+ });
76
+ }
77
+ function N(n, t) {
78
+ const i = h(), e = i.current, r = n ? e && e.key === n ? i.entries.findIndex((c) => c.idx === e.idx && c.key === n) : -1 : e ? i.entries.findIndex((c) => c.idx === e.idx && c.key === e.key) : -1;
79
+ if (r < 0) return;
80
+ const o = t(i.entries[r]);
81
+ if (!o) return;
82
+ const s = [...i.entries];
83
+ s[r] = o, g({ ...i, entries: s });
84
+ }
85
+ function M(n, t) {
86
+ const i = (n ?? "").trim().slice(0, 120);
87
+ i && N(t, (e) => e.label === i ? null : { ...e, label: i });
88
+ }
89
+ function T(n) {
90
+ return x.add(n), () => {
91
+ x.delete(n);
92
+ };
93
+ }
94
+ function R() {
95
+ return m(T, S, () => b);
96
+ }
97
+ export {
98
+ p as NAV_TRAIL_KEY,
99
+ A as displayTrail,
100
+ S as getNavTrail,
101
+ w as recordNavigation,
102
+ k as reduceTrail,
103
+ M as setTrailLabel,
104
+ T as subscribeNavTrail,
105
+ I as trailChain,
106
+ R as useNavTrail
107
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nivaro/react",
3
- "version": "0.3.42",
3
+ "version": "0.3.44",
4
4
  "description": "React hooks and components for Nivaro CMS forms",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",