@flamingo-stack/openframe-frontend-core 0.0.716 → 0.0.718

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.
Files changed (113) hide show
  1. package/dist/chat-protocol/index.cjs +23 -14
  2. package/dist/chat-protocol/index.js +23 -14
  3. package/dist/chat-protocol/nats-decoder.d.ts.map +1 -1
  4. package/dist/chat-protocol/source-metadata.d.ts +11 -2
  5. package/dist/chat-protocol/source-metadata.d.ts.map +1 -1
  6. package/dist/{chunk-DPX6244M.js → chunk-45F7PXUI.js} +3 -3
  7. package/dist/{chunk-KYFNFRSV.js → chunk-67QBMN4R.js} +2 -2
  8. package/dist/{chunk-3RKBJT6K.cjs → chunk-6A43ZDWV.cjs} +2 -2
  9. package/dist/chunk-A6P6DHEZ.cjs +130 -0
  10. package/dist/{chunk-KNOZVVCU.cjs → chunk-BOTM373R.cjs} +9 -9
  11. package/dist/{chunk-DHMO5GI4.cjs → chunk-BWIN42ZA.cjs} +21 -21
  12. package/dist/{chunk-YTMV4OBY.js → chunk-DCD5WZUF.js} +4 -4
  13. package/dist/{chunk-V36WGIYR.js → chunk-DEZDMTBM.js} +5 -5
  14. package/dist/{chunk-YO5JB3WE.cjs → chunk-DXCBOZVT.cjs} +35 -35
  15. package/dist/{chunk-ZX7SCPLO.cjs → chunk-E7YCPY7K.cjs} +3 -3
  16. package/dist/{chunk-I5F2OTFE.cjs → chunk-EZC2F5OT.cjs} +33 -33
  17. package/dist/{chunk-DLEO53NX.cjs → chunk-GN4A7PMB.cjs} +69 -69
  18. package/dist/{chunk-6T3BTD6Q.js → chunk-IWCPXJEE.js} +201 -327
  19. package/dist/{chunk-ROBQ5TR7.js → chunk-JH2SIWPQ.js} +28 -17
  20. package/dist/{chunk-3AJIQPFG.js → chunk-JIWMBIVZ.js} +6 -6
  21. package/dist/{chunk-DDWFCWOE.js → chunk-JPD4NXH6.js} +1 -1
  22. package/dist/{chunk-JVCAK4W3.cjs → chunk-LE5WKGJV.cjs} +3 -3
  23. package/dist/{chunk-NPAQSMRY.js → chunk-LOYPRJWA.js} +1053 -357
  24. package/dist/{chunk-5IJXM3RU.cjs → chunk-MIQLUUVF.cjs} +10 -10
  25. package/dist/{chunk-MXPQMQI3.js → chunk-MM7MCIXL.js} +6 -6
  26. package/dist/{chunk-C5AGSZBT.js → chunk-N2PF5CFX.js} +4837 -5425
  27. package/dist/{chunk-STCJYO2Z.cjs → chunk-NDZ5ZXOQ.cjs} +11 -11
  28. package/dist/{chunk-H5R7U2D2.js → chunk-NZ5BHDFZ.js} +1 -1
  29. package/dist/{chunk-JCA5MBVY.js → chunk-PQ6HBLZ7.js} +4 -4
  30. package/dist/{chunk-EOKSKJSS.cjs → chunk-QBCDSTLE.cjs} +13 -13
  31. package/dist/{chunk-NQWJAOHO.js → chunk-QXZCLQNV.js} +1 -1
  32. package/dist/{chunk-2V7D5GJX.cjs → chunk-S2FUFMLW.cjs} +25 -25
  33. package/dist/{chunk-64F6OEEV.js → chunk-SGFTTJKO.js} +1 -1
  34. package/dist/{chunk-P7IL4CX3.js → chunk-TBCZCRQ5.js} +6 -6
  35. package/dist/{chunk-HETQETPV.cjs → chunk-UWQWMGJ7.cjs} +28 -17
  36. package/dist/{chunk-X2MNNV5H.cjs → chunk-WALCXC7J.cjs} +3 -3
  37. package/dist/{chunk-YBS5QGON.js → chunk-XGHGGBM3.js} +2 -2
  38. package/dist/{chunk-NKILEG3Y.cjs → chunk-YC5COB5V.cjs} +45 -45
  39. package/dist/{chunk-BVZ7W4HW.js → chunk-YEMCCYIF.js} +4 -4
  40. package/dist/chunk-YYYVS7CX.js +130 -0
  41. package/dist/{chunk-S2VWQX6T.cjs → chunk-Z3CVSPO3.cjs} +842 -1430
  42. package/dist/{chunk-PPXR22YC.cjs → chunk-Z5UWW3Z2.cjs} +707 -11
  43. package/dist/{chunk-JO5TLJPM.cjs → chunk-ZXCZYMN4.cjs} +37 -163
  44. package/dist/{cloud-tenants-2J7CPTKT.cjs → cloud-tenants-PFDF7O5U.cjs} +6 -5
  45. package/dist/{cloud-tenants-YOY2WLGC.js → cloud-tenants-TAKOWXLD.js} +5 -4
  46. package/dist/components/case-studies/index.cjs +17 -16
  47. package/dist/components/case-studies/index.js +6 -5
  48. package/dist/components/chat/index.cjs +2 -2
  49. package/dist/components/chat/index.js +1 -1
  50. package/dist/components/chat/types/message.types.d.ts +20 -16
  51. package/dist/components/chat/types/message.types.d.ts.map +1 -1
  52. package/dist/components/chat/types/unified-chat-state.types.d.ts +1 -1
  53. package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
  54. package/dist/components/contact/index.cjs +7 -6
  55. package/dist/components/contact/index.js +6 -5
  56. package/dist/components/docs/index.cjs +10 -9
  57. package/dist/components/docs/index.js +9 -8
  58. package/dist/components/embeds/index.cjs +7 -6
  59. package/dist/components/embeds/index.js +6 -5
  60. package/dist/components/faq/index.cjs +7 -6
  61. package/dist/components/faq/index.js +6 -5
  62. package/dist/components/features/index.cjs +10 -5
  63. package/dist/components/features/index.js +9 -4
  64. package/dist/components/features/remote-session/index.d.ts +2 -0
  65. package/dist/components/features/remote-session/index.d.ts.map +1 -1
  66. package/dist/components/features/remote-session/remote-session-keep-modals.d.ts +3 -3
  67. package/dist/components/features/remote-session/remote-session-keep-modals.d.ts.map +1 -1
  68. package/dist/components/features/remote-session/remote-session-ticket-modals.d.ts +29 -0
  69. package/dist/components/features/remote-session/remote-session-ticket-modals.d.ts.map +1 -0
  70. package/dist/components/help-center-pages/index.cjs +71 -70
  71. package/dist/components/help-center-pages/index.js +17 -16
  72. package/dist/components/index.cjs +44 -39
  73. package/dist/components/index.js +22 -17
  74. package/dist/components/meeting-scheduler/index.cjs +33 -32
  75. package/dist/components/meeting-scheduler/index.js +5 -4
  76. package/dist/components/navigation/index.cjs +9 -8
  77. package/dist/components/navigation/index.js +8 -7
  78. package/dist/components/onboarding-guides/index.cjs +9 -8
  79. package/dist/components/onboarding-guides/index.js +8 -7
  80. package/dist/components/product-demo/index.cjs +7 -7
  81. package/dist/components/product-demo/index.js +7 -7
  82. package/dist/components/tickets/index.cjs +10 -9
  83. package/dist/components/tickets/index.js +9 -8
  84. package/dist/components/ui/autocomplete.d.ts +6 -0
  85. package/dist/components/ui/autocomplete.d.ts.map +1 -1
  86. package/dist/components/ui/index.cjs +8 -7
  87. package/dist/components/ui/index.js +7 -6
  88. package/dist/{devices-5NADSKDZ.cjs → devices-KRCGZMGA.cjs} +7 -6
  89. package/dist/{devices-EQXXILXW.js → devices-LHEX7O5T.js} +5 -4
  90. package/dist/hooks/index.cjs +6 -4
  91. package/dist/hooks/index.js +5 -3
  92. package/dist/index.cjs +17 -11
  93. package/dist/index.js +18 -12
  94. package/dist/{knowledge-LHQYZJE7.cjs → knowledge-KLVPVEYZ.cjs} +7 -6
  95. package/dist/{knowledge-YCQITBJB.js → knowledge-RZSFNR33.js} +5 -4
  96. package/dist/{logs-LZNXGOSW.js → logs-E5DOV5JO.js} +5 -4
  97. package/dist/{logs-DUVKSQU3.cjs → logs-OX3XTVL2.cjs} +14 -13
  98. package/dist/{policies-5H74FS4S.cjs → policies-FOSCIZGK.cjs} +10 -9
  99. package/dist/{policies-VYWOJ7IF.js → policies-MC2S4S5G.js} +5 -4
  100. package/dist/{remote-session-R6VAFESR.cjs → remote-session-DRFE5XZE.cjs} +4 -3
  101. package/dist/{remote-session-GSGZOFDX.js → remote-session-JQ2BPIE3.js} +2 -1
  102. package/dist/{software-update-MSDY3OLX.js → software-update-D4OEIH65.js} +7 -5
  103. package/dist/{software-update-VRRX5U4W.cjs → software-update-HOBSTWVO.cjs} +12 -10
  104. package/package.json +1 -1
  105. package/src/chat-protocol/nats-decoder.ts +10 -8
  106. package/src/chat-protocol/source-metadata.ts +25 -2
  107. package/src/components/chat/types/message.types.ts +21 -15
  108. package/src/components/chat/types/unified-chat-state.types.ts +1 -1
  109. package/src/components/chat/utils/process-historical-messages.ts +12 -4
  110. package/src/components/features/remote-session/index.ts +2 -0
  111. package/src/components/features/remote-session/remote-session-keep-modals.tsx +4 -4
  112. package/src/components/features/remote-session/remote-session-ticket-modals.tsx +140 -0
  113. package/src/components/ui/autocomplete.tsx +18 -4
@@ -63,95 +63,22 @@ import {
63
63
  cn
64
64
  } from "./chunk-7RXWKTAP.js";
65
65
 
66
- // src/hooks/ui/use-auto-limit-tags.ts
67
- import { useCallback, useEffect, useRef, useState } from "react";
68
- function useAutoLimitTags({
69
- count,
70
- limitTags = "auto",
71
- placeholder = "",
72
- reserveInputWidth = true
73
- }) {
74
- const middleRef = useRef(null);
75
- const measureRef = useRef(null);
76
- const textMeasureRef = useRef(null);
77
- const badgeRef = useRef(null);
78
- const inputRef = useRef(null);
79
- const [measuredCount, setMeasuredCount] = useState(null);
80
- const recalculate = useCallback(() => {
81
- const middle = middleRef.current;
82
- const measure2 = measureRef.current;
83
- if (!middle || !measure2) {
84
- setMeasuredCount(null);
85
- return;
86
- }
87
- if (count === 0) {
88
- setMeasuredCount(0);
89
- return;
90
- }
91
- const cs = getComputedStyle(middle);
92
- const padL = parseFloat(cs.paddingLeft) || 0;
93
- const padR = parseFloat(cs.paddingRight) || 0;
94
- const gap = parseFloat(cs.gap) || 0;
95
- const middleW = middle.clientWidth;
96
- let inputReservedW = 0;
97
- let trailingGap = 0;
98
- if (reserveInputWidth) {
99
- const textW = textMeasureRef.current?.offsetWidth ?? 60;
100
- const inputMinW = inputRef.current ? parseFloat(getComputedStyle(inputRef.current).minWidth) || 60 : 60;
101
- inputReservedW = Math.max(textW + 8, inputMinW);
102
- trailingGap = gap;
103
- }
104
- const available = middleW - padL - padR - inputReservedW - trailingGap;
105
- const tagEls = Array.from(measure2.children);
106
- const widths = tagEls.map((el) => el.offsetWidth);
107
- let total = 0;
108
- for (let i = 0; i < widths.length; i++) {
109
- total += widths[i] + (i > 0 ? gap : 0);
110
- }
111
- if (total <= available) {
112
- setMeasuredCount(count);
113
- return;
114
- }
115
- const badgeW = badgeRef.current?.offsetWidth ?? 40;
116
- const spaceWithBadge = available - badgeW - gap;
117
- let used = 0;
118
- let fitCount = 0;
119
- for (let i = 0; i < widths.length; i++) {
120
- const need = widths[i] + (i > 0 ? gap : 0);
121
- if (used + need > spaceWithBadge) break;
122
- used += need;
123
- fitCount++;
124
- }
125
- setMeasuredCount(Math.max(0, fitCount));
126
- }, [count, placeholder, reserveInputWidth]);
127
- useEffect(() => {
128
- if (limitTags !== "auto") return void 0;
129
- const el = middleRef.current;
130
- if (!el) return void 0;
131
- const ro = new ResizeObserver(recalculate);
132
- ro.observe(el);
133
- return () => ro.disconnect();
134
- }, [recalculate, limitTags]);
135
- const visibleCount = limitTags !== "auto" ? Math.min(limitTags, count) : measuredCount === null ? count : Math.min(measuredCount, count);
136
- return { visibleCount, middleRef, measureRef, textMeasureRef, badgeRef, inputRef };
137
- }
138
-
139
66
  // src/hooks/ui/use-deferred-error.ts
140
- import { useState as useState2, useEffect as useEffect2, useCallback as useCallback2 } from "react";
67
+ import { useState, useEffect, useCallback } from "react";
141
68
  function useDeferredError(error, value, delay = 1500) {
142
- const [touched, setTouched] = useState2(false);
143
- const [paused, setPaused] = useState2(false);
144
- const [pausedFor, setPausedFor] = useState2(value);
69
+ const [touched, setTouched] = useState(false);
70
+ const [paused, setPaused] = useState(false);
71
+ const [pausedFor, setPausedFor] = useState(value);
145
72
  if (pausedFor !== value) {
146
73
  setPausedFor(value);
147
74
  setPaused(false);
148
75
  }
149
- useEffect2(() => {
76
+ useEffect(() => {
150
77
  if (touched) return void 0;
151
78
  const timer = setTimeout(() => setPaused(true), delay);
152
79
  return () => clearTimeout(timer);
153
80
  }, [value, delay, touched]);
154
- const onBlur = useCallback2(() => setTouched(true), []);
81
+ const onBlur = useCallback(() => setTouched(true), []);
155
82
  return {
156
83
  error: error && (touched || paused) ? error : void 0,
157
84
  onBlur
@@ -159,7 +86,7 @@ function useDeferredError(error, value, delay = 1500) {
159
86
  }
160
87
 
161
88
  // src/hooks/ui/use-focus-trap.ts
162
- import { useEffect as useEffect3, useRef as useRef2 } from "react";
89
+ import { useEffect as useEffect2, useRef } from "react";
163
90
  var FOCUSABLE_SELECTOR = [
164
91
  "a[href]",
165
92
  "button:not([disabled])",
@@ -169,11 +96,11 @@ var FOCUSABLE_SELECTOR = [
169
96
  '[tabindex]:not([tabindex="-1"])'
170
97
  ].join(", ");
171
98
  function useFocusTrap(containerRef, active, { onEscape, contain = true } = {}) {
172
- const onEscapeRef = useRef2(onEscape);
173
- useEffect3(() => {
99
+ const onEscapeRef = useRef(onEscape);
100
+ useEffect2(() => {
174
101
  onEscapeRef.current = onEscape;
175
102
  });
176
- useEffect3(() => {
103
+ useEffect2(() => {
177
104
  if (!active) return void 0;
178
105
  const container = containerRef.current;
179
106
  if (!container) return void 0;
@@ -218,17 +145,17 @@ function useFocusTrap(containerRef, active, { onEscape, contain = true } = {}) {
218
145
  }
219
146
 
220
147
  // src/hooks/ui/use-sticky-toolbar.ts
221
- import { useCallback as useCallback3, useEffect as useEffect4, useState as useState3 } from "react";
148
+ import { useCallback as useCallback2, useEffect as useEffect3, useState as useState2 } from "react";
222
149
  function useStickyToolbar() {
223
- const [node, setNode] = useState3(null);
224
- const [height, setHeight] = useState3(0);
225
- const toolbarRef = useCallback3((el) => setNode(el), []);
226
- const [lastNode, setLastNode] = useState3(node);
150
+ const [node, setNode] = useState2(null);
151
+ const [height, setHeight] = useState2(0);
152
+ const toolbarRef = useCallback2((el) => setNode(el), []);
153
+ const [lastNode, setLastNode] = useState2(node);
227
154
  if (node !== lastNode) {
228
155
  setLastNode(node);
229
156
  if (!node) setHeight(0);
230
157
  }
231
- useEffect4(() => {
158
+ useEffect3(() => {
232
159
  if (!node) return void 0;
233
160
  const update = () => setHeight(node.offsetHeight);
234
161
  update();
@@ -243,97 +170,46 @@ function useStickyToolbar() {
243
170
  };
244
171
  }
245
172
 
246
- // src/hooks/ui/use-keyboard-collision-padding.ts
247
- import { useSyncExternalStore } from "react";
248
- var KEYBOARD_INSET_VAR = "--of-keyboard-inset";
249
- function measure() {
250
- if (typeof document === "undefined") return 0;
251
- const inset = Number.parseFloat(getComputedStyle(document.documentElement).getPropertyValue(KEYBOARD_INSET_VAR));
252
- if (!(inset > 0)) return 0;
253
- const layoutHeight = document.documentElement.clientHeight;
254
- const viewport = window.visualViewport;
255
- const viewportBottom = viewport ? viewport.offsetTop + viewport.height : layoutHeight;
256
- return Math.max(0, Math.round(viewportBottom - (layoutHeight - inset)));
257
- }
258
- var listeners = /* @__PURE__ */ new Set();
259
- var padding = 0;
260
- var teardown = null;
261
- function sync() {
262
- const next = measure();
263
- if (next === padding) return;
264
- padding = next;
265
- for (const notify of listeners) notify();
266
- }
267
- function subscribe(onStoreChange) {
268
- listeners.add(onStoreChange);
269
- if (listeners.size === 1) {
270
- padding = measure();
271
- const observer = new MutationObserver(sync);
272
- observer.observe(document.documentElement, { attributes: true, attributeFilter: ["style"] });
273
- const viewport = window.visualViewport;
274
- viewport?.addEventListener("resize", sync);
275
- viewport?.addEventListener("scroll", sync);
276
- teardown = () => {
277
- observer.disconnect();
278
- viewport?.removeEventListener("resize", sync);
279
- viewport?.removeEventListener("scroll", sync);
280
- };
281
- }
282
- return () => {
283
- listeners.delete(onStoreChange);
284
- if (listeners.size > 0) return;
285
- teardown?.();
286
- teardown = null;
287
- };
288
- }
289
- function useKeyboardCollisionPadding() {
290
- return useSyncExternalStore(
291
- subscribe,
292
- () => padding,
293
- () => 0
294
- );
295
- }
296
-
297
173
  // src/hooks/ui/use-memoized-callback.ts
298
- import { useCallback as useCallback4, useEffect as useEffect5, useRef as useRef3 } from "react";
174
+ import { useCallback as useCallback3, useEffect as useEffect4, useRef as useRef2 } from "react";
299
175
  function useMemoizedCallback(callback, _dependencies) {
300
- const callbackRef = useRef3(callback);
301
- useEffect5(() => {
176
+ const callbackRef = useRef2(callback);
177
+ useEffect4(() => {
302
178
  callbackRef.current = callback;
303
179
  });
304
- const stable = useCallback4((...args) => callbackRef.current(...args), []);
180
+ const stable = useCallback3((...args) => callbackRef.current(...args), []);
305
181
  return stable;
306
182
  }
307
183
 
308
184
  // src/hooks/ui/use-notification-permission.ts
309
- import { useCallback as useCallback5, useEffect as useEffect6, useState as useState4 } from "react";
185
+ import { useCallback as useCallback4, useEffect as useEffect5, useState as useState3 } from "react";
310
186
  function useNotificationPermission() {
311
- const [supported, setSupported] = useState4(false);
312
- const [permission, setPermission] = useState4("default");
313
- useEffect6(() => {
187
+ const [supported, setSupported] = useState3(false);
188
+ const [permission, setPermission] = useState3("default");
189
+ useEffect5(() => {
314
190
  if (typeof window === "undefined" || !("Notification" in window)) return void 0;
315
- const sync2 = () => {
191
+ const sync = () => {
316
192
  setSupported(true);
317
193
  setPermission(Notification.permission);
318
194
  };
319
- sync2();
195
+ sync();
320
196
  let cancelled = false;
321
197
  let status;
322
198
  navigator.permissions?.query({ name: "notifications" }).then((s) => {
323
199
  if (cancelled) return;
324
200
  status = s;
325
- s.addEventListener("change", sync2);
201
+ s.addEventListener("change", sync);
326
202
  }).catch(() => void 0);
327
- document.addEventListener("visibilitychange", sync2);
328
- window.addEventListener("focus", sync2);
203
+ document.addEventListener("visibilitychange", sync);
204
+ window.addEventListener("focus", sync);
329
205
  return () => {
330
206
  cancelled = true;
331
- status?.removeEventListener("change", sync2);
332
- document.removeEventListener("visibilitychange", sync2);
333
- window.removeEventListener("focus", sync2);
207
+ status?.removeEventListener("change", sync);
208
+ document.removeEventListener("visibilitychange", sync);
209
+ window.removeEventListener("focus", sync);
334
210
  };
335
211
  }, []);
336
- const request = useCallback5(async () => {
212
+ const request = useCallback4(async () => {
337
213
  if (typeof window === "undefined" || !("Notification" in window)) {
338
214
  return "denied";
339
215
  }
@@ -350,7 +226,7 @@ function useNotificationPermission() {
350
226
  }
351
227
 
352
228
  // src/hooks/ui/use-onboarding-state.ts
353
- import { useState as useState5, useEffect as useEffect7, useCallback as useCallback6 } from "react";
229
+ import { useState as useState4, useEffect as useEffect6, useCallback as useCallback5 } from "react";
354
230
 
355
231
  // src/utils/onboarding-storage.ts
356
232
  var DEFAULT_STATE = {
@@ -434,9 +310,9 @@ function resetOnboardingState(key) {
434
310
 
435
311
  // src/hooks/ui/use-onboarding-state.ts
436
312
  function useOnboardingState(storageKey = "openframe-onboarding-state") {
437
- const [state, setState] = useState5(() => loadOnboardingState(storageKey));
438
- const [, forceUpdate] = useState5(0);
439
- useEffect7(() => {
313
+ const [state, setState] = useState4(() => loadOnboardingState(storageKey));
314
+ const [, forceUpdate] = useState4(0);
315
+ useEffect6(() => {
440
316
  const handleStorageUpdate = (event) => {
441
317
  const detail = readLocalStorageUpdateDetail(event);
442
318
  if (detail?.key !== storageKey) return;
@@ -449,7 +325,7 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
449
325
  window.removeEventListener("localStorageUpdate", handleStorageUpdate);
450
326
  };
451
327
  }, [storageKey]);
452
- const markComplete = useCallback6(
328
+ const markComplete = useCallback5(
453
329
  (stepId) => {
454
330
  const newState = markStepComplete(storageKey, stepId);
455
331
  setState(newState);
@@ -457,7 +333,7 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
457
333
  },
458
334
  [storageKey]
459
335
  );
460
- const markSkipped = useCallback6(
336
+ const markSkipped = useCallback5(
461
337
  (stepId) => {
462
338
  const newState = markStepSkipped(storageKey, stepId);
463
339
  setState(newState);
@@ -465,17 +341,17 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
465
341
  },
466
342
  [storageKey]
467
343
  );
468
- const dismissOnboarding2 = useCallback6(() => {
344
+ const dismissOnboarding2 = useCallback5(() => {
469
345
  const newState = dismissOnboarding(storageKey);
470
346
  setState(newState);
471
347
  forceUpdate((prev) => prev + 1);
472
348
  }, [storageKey]);
473
- const resetOnboarding = useCallback6(() => {
349
+ const resetOnboarding = useCallback5(() => {
474
350
  const newState = resetOnboardingState(storageKey);
475
351
  setState(newState);
476
352
  forceUpdate((prev) => prev + 1);
477
353
  }, [storageKey]);
478
- const markMultipleComplete2 = useCallback6(
354
+ const markMultipleComplete2 = useCallback5(
479
355
  (stepIds) => {
480
356
  const newState = markMultipleComplete(storageKey, stepIds);
481
357
  setState(newState);
@@ -483,19 +359,19 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
483
359
  },
484
360
  [storageKey]
485
361
  );
486
- const isStepComplete = useCallback6(
362
+ const isStepComplete = useCallback5(
487
363
  (stepId) => {
488
364
  return state.completedSteps.includes(stepId);
489
365
  },
490
366
  [state.completedSteps]
491
367
  );
492
- const isStepSkipped = useCallback6(
368
+ const isStepSkipped = useCallback5(
493
369
  (stepId) => {
494
370
  return state.skippedSteps.includes(stepId);
495
371
  },
496
372
  [state.skippedSteps]
497
373
  );
498
- const allStepsComplete = useCallback6(
374
+ const allStepsComplete = useCallback5(
499
375
  (steps) => {
500
376
  return steps.every((step) => isStepComplete(step.id) || isStepSkipped(step.id));
501
377
  },
@@ -515,27 +391,27 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
515
391
  }
516
392
 
517
393
  // src/hooks/ui/use-search.ts
518
- import { useState as useState6, useEffect as useEffect8, useCallback as useCallback7, useRef as useRef4 } from "react";
394
+ import { useState as useState5, useEffect as useEffect7, useCallback as useCallback6, useRef as useRef3 } from "react";
519
395
  var NO_RESULTS = [];
520
396
  function useSearch(config) {
521
397
  const { searchFn, mapResult, debounceMs = 300, minQueryLength = 2 } = config;
522
- const [query, setQuery] = useState6("");
523
- const [results, setResults] = useState6(NO_RESULTS);
524
- const [isLoading, setIsLoading] = useState6(false);
525
- const [error, setError] = useState6(null);
526
- const searchFnRef = useRef4(searchFn);
527
- const mapResultRef = useRef4(mapResult);
528
- useEffect8(() => {
398
+ const [query, setQuery] = useState5("");
399
+ const [results, setResults] = useState5(NO_RESULTS);
400
+ const [isLoading, setIsLoading] = useState5(false);
401
+ const [error, setError] = useState5(null);
402
+ const searchFnRef = useRef3(searchFn);
403
+ const mapResultRef = useRef3(mapResult);
404
+ useEffect7(() => {
529
405
  searchFnRef.current = searchFn;
530
406
  mapResultRef.current = mapResult;
531
407
  });
532
408
  const debouncedQuery = useDebounce(query, debounceMs);
533
- const clearResults = useCallback7(() => {
409
+ const clearResults = useCallback6(() => {
534
410
  setResults(NO_RESULTS);
535
411
  setError(null);
536
412
  }, []);
537
413
  const searchable = Boolean(debouncedQuery) && debouncedQuery.length >= minQueryLength;
538
- const [wasSearchable, setWasSearchable] = useState6(searchable);
414
+ const [wasSearchable, setWasSearchable] = useState5(searchable);
539
415
  if (wasSearchable !== searchable) {
540
416
  setWasSearchable(searchable);
541
417
  if (!searchable) {
@@ -544,7 +420,7 @@ function useSearch(config) {
544
420
  setError(null);
545
421
  }
546
422
  }
547
- useEffect8(() => {
423
+ useEffect7(() => {
548
424
  if (!searchable) return void 0;
549
425
  let cancelled = false;
550
426
  const run = async () => {
@@ -612,12 +488,12 @@ function useTablePagination(config) {
612
488
  }
613
489
 
614
490
  // src/hooks/ui/use-throttle.ts
615
- import { useState as useState7, useEffect as useEffect9, useRef as useRef5 } from "react";
491
+ import { useState as useState6, useEffect as useEffect8, useRef as useRef4 } from "react";
616
492
  function useThrottle(value, limit = 200) {
617
- const [throttledValue, setThrottledValue] = useState7(value);
618
- const [mountedAt] = useState7(() => Date.now());
619
- const lastUpdated = useRef5(mountedAt);
620
- useEffect9(() => {
493
+ const [throttledValue, setThrottledValue] = useState6(value);
494
+ const [mountedAt] = useState6(() => Date.now());
495
+ const lastUpdated = useRef4(mountedAt);
496
+ useEffect8(() => {
621
497
  const now = Date.now();
622
498
  const elapsed = now - lastUpdated.current;
623
499
  if (elapsed >= limit) {
@@ -637,9 +513,9 @@ function useThrottle(value, limit = 200) {
637
513
  }
638
514
 
639
515
  // src/hooks/ui/use-window-size.ts
640
- import { useLayoutEffect, useState as useState8 } from "react";
516
+ import { useLayoutEffect, useState as useState7 } from "react";
641
517
  function useWindowSize() {
642
- const [windowSize, setWindowSize] = useState8({
518
+ const [windowSize, setWindowSize] = useState7({
643
519
  width: 0,
644
520
  height: 0
645
521
  });
@@ -690,11 +566,11 @@ function useActiveSection(menus, pathname) {
690
566
 
691
567
  // src/hooks/ui/use-nav-menus.ts
692
568
  import {
693
- useCallback as useCallback8,
694
- useEffect as useEffect10,
569
+ useCallback as useCallback7,
570
+ useEffect as useEffect9,
695
571
  useId,
696
- useRef as useRef6,
697
- useState as useState9
572
+ useRef as useRef5,
573
+ useState as useState8
698
574
  } from "react";
699
575
  function useNavMenus({
700
576
  pathname,
@@ -702,31 +578,31 @@ function useNavMenus({
702
578
  hoverCloseMs = 300
703
579
  }) {
704
580
  const baseId = useId();
705
- const [opened, setOpened] = useState9(null);
581
+ const [opened, setOpened] = useState8(null);
706
582
  const stale = opened !== null && opened.pathname !== pathname;
707
583
  if (stale) setOpened(null);
708
584
  const openId = opened && !stale ? opened.id : null;
709
- const triggers = useRef6(/* @__PURE__ */ new Map());
710
- const panels = useRef6(/* @__PURE__ */ new Map());
711
- const openTimer = useRef6(null);
712
- const closeTimer = useRef6(null);
713
- const openedByHover = useRef6(null);
714
- const clearTimers = useCallback8(() => {
585
+ const triggers = useRef5(/* @__PURE__ */ new Map());
586
+ const panels = useRef5(/* @__PURE__ */ new Map());
587
+ const openTimer = useRef5(null);
588
+ const closeTimer = useRef5(null);
589
+ const openedByHover = useRef5(null);
590
+ const clearTimers = useCallback7(() => {
715
591
  if (openTimer.current) clearTimeout(openTimer.current);
716
592
  if (closeTimer.current) clearTimeout(closeTimer.current);
717
593
  openTimer.current = null;
718
594
  closeTimer.current = null;
719
595
  }, []);
720
- useEffect10(() => clearTimers, [clearTimers]);
721
- const close = useCallback8(() => {
596
+ useEffect9(() => clearTimers, [clearTimers]);
597
+ const close = useCallback7(() => {
722
598
  clearTimers();
723
599
  setOpened(null);
724
600
  }, [clearTimers]);
725
- const cancelClose = useCallback8(() => {
601
+ const cancelClose = useCallback7(() => {
726
602
  if (closeTimer.current) clearTimeout(closeTimer.current);
727
603
  closeTimer.current = null;
728
604
  }, []);
729
- const scheduleClose = useCallback8(() => {
605
+ const scheduleClose = useCallback7(() => {
730
606
  if (openTimer.current) clearTimeout(openTimer.current);
731
607
  openTimer.current = null;
732
608
  cancelClose();
@@ -735,7 +611,7 @@ function useNavMenus({
735
611
  setOpened(null);
736
612
  }, hoverCloseMs);
737
613
  }, [cancelClose, hoverCloseMs]);
738
- useEffect10(() => {
614
+ useEffect9(() => {
739
615
  if (!openId) return void 0;
740
616
  const handleKeyDown = (event) => {
741
617
  if (event.key !== "Escape") return;
@@ -757,7 +633,7 @@ function useNavMenus({
757
633
  document.removeEventListener("pointerdown", handlePointerDown);
758
634
  };
759
635
  }, [openId, close]);
760
- const getTriggerProps = useCallback8(
636
+ const getTriggerProps = useCallback7(
761
637
  (id) => ({
762
638
  ref: (el) => {
763
639
  if (el) triggers.current.set(id, el);
@@ -793,7 +669,7 @@ function useNavMenus({
793
669
  }),
794
670
  [baseId, openId, pathname, hoverOpenMs, clearTimers, scheduleClose]
795
671
  );
796
- const getPanelProps = useCallback8(
672
+ const getPanelProps = useCallback7(
797
673
  (id) => ({
798
674
  ref: (el) => {
799
675
  if (el) panels.current.set(id, el);
@@ -811,7 +687,7 @@ function useNavMenus({
811
687
  }
812
688
 
813
689
  // src/hooks/platform/use-platform-config.ts
814
- import { useState as useState10, useEffect as useEffect11 } from "react";
690
+ import { useState as useState9, useEffect as useEffect10 } from "react";
815
691
  var platformCache = null;
816
692
  var fetchPromise = null;
817
693
  function isRecord(value) {
@@ -847,10 +723,10 @@ function toPlatformConfigs(payload) {
847
723
  return configs;
848
724
  }
849
725
  function usePlatformConfig() {
850
- const [platforms, setPlatforms] = useState10(platformCache || []);
851
- const [isLoading, setIsLoading] = useState10(!platformCache);
852
- const [error, setError] = useState10(null);
853
- useEffect11(() => {
726
+ const [platforms, setPlatforms] = useState9(platformCache || []);
727
+ const [isLoading, setIsLoading] = useState9(!platformCache);
728
+ const [error, setError] = useState9(null);
729
+ useEffect10(() => {
854
730
  const commit = (data) => {
855
731
  setPlatforms((prev) => prev === data ? prev : data);
856
732
  setIsLoading(false);
@@ -918,7 +794,7 @@ function useValidatePlatform(value) {
918
794
  import { toast as sonnerToast2 } from "sonner";
919
795
 
920
796
  // src/components/ui/toaster.tsx
921
- import { useState as useState11 } from "react";
797
+ import { useState as useState10 } from "react";
922
798
  import { Toaster as SonnerToaster, toast as sonnerToast } from "sonner";
923
799
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
924
800
  var dotColorByVariant = {
@@ -1034,7 +910,7 @@ function CommandApprovalToast({
1034
910
  defaultExpanded = false,
1035
911
  className
1036
912
  }) {
1037
- const [expanded, setExpanded] = useState11(defaultExpanded);
913
+ const [expanded, setExpanded] = useState10(defaultExpanded);
1038
914
  const handleApprove = () => {
1039
915
  onApprove?.();
1040
916
  sonnerToast.dismiss(id);
@@ -1234,15 +1110,15 @@ var useToast = () => ({
1234
1110
  });
1235
1111
 
1236
1112
  // src/hooks/use-contact-submission.ts
1237
- import { useState as useState12, useCallback as useCallback9, useEffect as useEffect12 } from "react";
1113
+ import { useState as useState11, useCallback as useCallback8, useEffect as useEffect11 } from "react";
1238
1114
  function useContactSubmission(options = {}) {
1239
1115
  const { userId, successRedirectUrl, successToastMessage, onSuccess } = options;
1240
1116
  const { toast: toast2 } = useToast();
1241
1117
  const router = useRouter();
1242
1118
  const { contactUrl } = useRequiredEndpointsRuntime();
1243
- const [isSubmitting, setIsSubmitting] = useState12(false);
1244
- const [isSuccess, setIsSuccess] = useState12(false);
1245
- const submit = useCallback9(
1119
+ const [isSubmitting, setIsSubmitting] = useState11(false);
1120
+ const [isSuccess, setIsSuccess] = useState11(false);
1121
+ const submit = useCallback8(
1246
1122
  async (formData) => {
1247
1123
  if (isSubmitting) return;
1248
1124
  setIsSubmitting(true);
@@ -1280,7 +1156,7 @@ function useContactSubmission(options = {}) {
1280
1156
  },
1281
1157
  [isSubmitting, toast2, userId, successToastMessage, contactUrl]
1282
1158
  );
1283
- useEffect12(() => {
1159
+ useEffect11(() => {
1284
1160
  if (!isSuccess || !successRedirectUrl) return void 0;
1285
1161
  console.log("\u{1F680} Contact submission successful, redirecting to:", successRedirectUrl);
1286
1162
  const timer = setTimeout(() => {
@@ -1293,7 +1169,7 @@ function useContactSubmission(options = {}) {
1293
1169
  }, 1500);
1294
1170
  return () => clearTimeout(timer);
1295
1171
  }, [isSuccess, successRedirectUrl, router]);
1296
- useEffect12(() => {
1172
+ useEffect11(() => {
1297
1173
  if (isSuccess && onSuccess) {
1298
1174
  onSuccess();
1299
1175
  }
@@ -1302,7 +1178,7 @@ function useContactSubmission(options = {}) {
1302
1178
  }
1303
1179
 
1304
1180
  // src/hooks/use-copy-to-clipboard.ts
1305
- import { useCallback as useCallback10, useState as useState13 } from "react";
1181
+ import { useCallback as useCallback9, useState as useState12 } from "react";
1306
1182
  function useCopyToClipboard({
1307
1183
  successTitle = "Copied",
1308
1184
  successDescription = "Copied to clipboard",
@@ -1311,8 +1187,8 @@ function useCopyToClipboard({
1311
1187
  resetDelay = 2e3
1312
1188
  } = {}) {
1313
1189
  const { toast: toast2 } = useToast();
1314
- const [copied, setCopied] = useState13(false);
1315
- const copy = useCallback10(
1190
+ const [copied, setCopied] = useState12(false);
1191
+ const copy = useCallback9(
1316
1192
  async (text) => {
1317
1193
  try {
1318
1194
  await navigator.clipboard.writeText(text);
@@ -1329,7 +1205,7 @@ function useCopyToClipboard({
1329
1205
  }
1330
1206
 
1331
1207
  // src/hooks/use-batch-images.ts
1332
- import { useEffect as useEffect13, useMemo as useMemo3, useState as useState14, useRef as useRef7 } from "react";
1208
+ import { useEffect as useEffect12, useMemo as useMemo3, useState as useState13, useRef as useRef6 } from "react";
1333
1209
  var globalBatchImageConfig = {};
1334
1210
  function configureBatchImageFetch(config) {
1335
1211
  globalBatchImageConfig = { ...globalBatchImageConfig, ...config };
@@ -1402,17 +1278,17 @@ async function batchFetchAuthenticatedImages(imageUrls, config) {
1402
1278
  return results;
1403
1279
  }
1404
1280
  function useBatchImages(imageUrls, config) {
1405
- const [fetchedImages, setFetchedImages] = useState14({});
1281
+ const [fetchedImages, setFetchedImages] = useState13({});
1406
1282
  const uniqueUrls = useMemo3(
1407
1283
  () => Array.from(new Set(imageUrls.filter((url) => Boolean(url)))),
1408
1284
  [imageUrls]
1409
1285
  );
1410
- const requestedUrls = useRef7(/* @__PURE__ */ new Set());
1411
- const fetchedImagesRef = useRef7(fetchedImages);
1412
- useEffect13(() => {
1286
+ const requestedUrls = useRef6(/* @__PURE__ */ new Set());
1287
+ const fetchedImagesRef = useRef6(fetchedImages);
1288
+ useEffect12(() => {
1413
1289
  fetchedImagesRef.current = fetchedImages;
1414
1290
  }, [fetchedImages]);
1415
- useEffect13(
1291
+ useEffect12(
1416
1292
  () => () => {
1417
1293
  Object.values(fetchedImagesRef.current).forEach((blobUrl) => {
1418
1294
  if (blobUrl && blobUrl.startsWith("blob:")) {
@@ -1422,7 +1298,7 @@ function useBatchImages(imageUrls, config) {
1422
1298
  },
1423
1299
  []
1424
1300
  );
1425
- useEffect13(() => {
1301
+ useEffect12(() => {
1426
1302
  const urlsToFetch = uniqueUrls.filter((url) => !requestedUrls.current.has(url));
1427
1303
  if (urlsToFetch.length === 0) {
1428
1304
  return;
@@ -1440,7 +1316,7 @@ function useBatchImages(imageUrls, config) {
1440
1316
  }
1441
1317
 
1442
1318
  // src/hooks/use-authenticated-image.ts
1443
- import { useEffect as useEffect14, useState as useState15, useRef as useRef8 } from "react";
1319
+ import { useEffect as useEffect13, useState as useState14, useRef as useRef7 } from "react";
1444
1320
  var globalImageConfig = {};
1445
1321
  var imageCache = /* @__PURE__ */ new Map();
1446
1322
  var pendingRequests = /* @__PURE__ */ new Map();
@@ -1469,8 +1345,8 @@ function getImageConfig() {
1469
1345
  };
1470
1346
  }
1471
1347
  function useAuthenticatedImage(imageUrl, refreshKey, config) {
1472
- const [settled, setSettled] = useState15(null);
1473
- const currentCacheKeyRef = useRef8(null);
1348
+ const [settled, setSettled] = useState14(null);
1349
+ const currentCacheKeyRef = useRef7(null);
1474
1350
  const { tenantHostUrl, enableDevMode, accessTokenKey } = {
1475
1351
  ...getImageConfig(),
1476
1352
  ...config
@@ -1488,7 +1364,7 @@ function useAuthenticatedImage(imageUrl, refreshKey, config) {
1488
1364
  }
1489
1365
  }
1490
1366
  const cacheKey = fullImageUrl === null ? null : refreshKey ? `${fullImageUrl}?v=${refreshKey}` : fullImageUrl;
1491
- useEffect14(() => {
1367
+ useEffect13(() => {
1492
1368
  if (cacheKey === null) {
1493
1369
  if (currentCacheKeyRef.current) {
1494
1370
  const entry = imageCache.get(currentCacheKeyRef.current);
@@ -1565,7 +1441,7 @@ function useAuthenticatedImage(imageUrl, refreshKey, config) {
1565
1441
  });
1566
1442
  pendingRequests.set(cacheKey, fetchPromise2);
1567
1443
  }, [cacheKey, fullImageUrl, refreshKey, enableDevMode, accessTokenKey]);
1568
- useEffect14(() => {
1444
+ useEffect13(() => {
1569
1445
  return () => {
1570
1446
  if (currentCacheKeyRef.current) {
1571
1447
  const entry = imageCache.get(currentCacheKeyRef.current);
@@ -1586,7 +1462,7 @@ function useAuthenticatedImage(imageUrl, refreshKey, config) {
1586
1462
  }
1587
1463
 
1588
1464
  // src/hooks/state/use-query-params.ts
1589
- import { useEffect as useEffect15, useState as useState16, useMemo as useMemo4, useCallback as useCallback11, useRef as useRef9 } from "react";
1465
+ import { useEffect as useEffect14, useState as useState15, useMemo as useMemo4, useCallback as useCallback10, useRef as useRef8 } from "react";
1590
1466
 
1591
1467
  // src/hooks/state/flatten-schema.ts
1592
1468
  function flattenQueryVariables(queryVariables, introspector2) {
@@ -2037,26 +1913,26 @@ function validateVariables(variables, schema) {
2037
1913
  function useQueryParams(query, options = {}) {
2038
1914
  const router = useRouter();
2039
1915
  const searchParams = useSearchParams();
2040
- const [isLoading, setIsLoading] = useState16(true);
2041
- const [isReady, setIsReady] = useState16(false);
2042
- const [error, setError] = useState16(null);
2043
- const [schema, setSchema] = useState16({});
1916
+ const [isLoading, setIsLoading] = useState15(true);
1917
+ const [isReady, setIsReady] = useState15(false);
1918
+ const [error, setError] = useState15(null);
1919
+ const [schema, setSchema] = useState15({});
2044
1920
  const defaultValues = useMemo4(() => options.defaultValues || {}, [options.defaultValues]);
2045
1921
  const skipIntrospection = options.skipIntrospection || false;
2046
1922
  const debug = options.debug || false;
2047
- const initSourceRef = useRef9({
1923
+ const initSourceRef = useRef8({
2048
1924
  introspectionHeaders: options.introspectionHeaders,
2049
1925
  paramMapping: options.paramMapping,
2050
1926
  defaultValues
2051
1927
  });
2052
- useEffect15(() => {
1928
+ useEffect14(() => {
2053
1929
  initSourceRef.current = {
2054
1930
  introspectionHeaders: options.introspectionHeaders,
2055
1931
  paramMapping: options.paramMapping,
2056
1932
  defaultValues
2057
1933
  };
2058
1934
  });
2059
- useEffect15(() => {
1935
+ useEffect14(() => {
2060
1936
  let cancelled = false;
2061
1937
  async function initialize() {
2062
1938
  try {
@@ -2133,7 +2009,7 @@ function useQueryParams(query, options = {}) {
2133
2009
  });
2134
2010
  return result;
2135
2011
  }, [searchParams]);
2136
- const updateUrl = useCallback11(
2012
+ const updateUrl = useCallback10(
2137
2013
  (newParams) => {
2138
2014
  const url = newParams.toString() ? `?${newParams.toString()}` : window.location.pathname;
2139
2015
  if (debug) {
@@ -2143,7 +2019,7 @@ function useQueryParams(query, options = {}) {
2143
2019
  },
2144
2020
  [router, debug]
2145
2021
  );
2146
- const setParam = useCallback11(
2022
+ const setParam = useCallback10(
2147
2023
  (key, value) => {
2148
2024
  if (!isReady) {
2149
2025
  console.warn("[useQueryParams] Schema not ready, cannot set param");
@@ -2159,7 +2035,7 @@ function useQueryParams(query, options = {}) {
2159
2035
  },
2160
2036
  [variables, schema, isReady, updateUrl]
2161
2037
  );
2162
- const setParams = useCallback11(
2038
+ const setParams = useCallback10(
2163
2039
  (updates) => {
2164
2040
  if (!isReady) {
2165
2041
  console.warn("[useQueryParams] Schema not ready, cannot set params");
@@ -2175,7 +2051,7 @@ function useQueryParams(query, options = {}) {
2175
2051
  },
2176
2052
  [variables, schema, isReady, updateUrl]
2177
2053
  );
2178
- const clearParamsHandler = useCallback11(
2054
+ const clearParamsHandler = useCallback10(
2179
2055
  (keys) => {
2180
2056
  if (!isReady) {
2181
2057
  console.warn("[useQueryParams] Schema not ready, cannot clear params");
@@ -2191,7 +2067,7 @@ function useQueryParams(query, options = {}) {
2191
2067
  },
2192
2068
  [variables, schema, isReady, updateUrl]
2193
2069
  );
2194
- const resetParams = useCallback11(() => {
2070
+ const resetParams = useCallback10(() => {
2195
2071
  if (debug) {
2196
2072
  console.log("[useQueryParams] Resetting params");
2197
2073
  }
@@ -2226,9 +2102,9 @@ function applyParamMapping(schema, mapping) {
2226
2102
  }
2227
2103
 
2228
2104
  // src/hooks/state/use-api-params.ts
2229
- import { useCallback as useCallback12, useEffect as useEffect16, useMemo as useMemo5, useRef as useRef10, useState as useState17 } from "react";
2105
+ import { useCallback as useCallback11, useEffect as useEffect15, useMemo as useMemo5, useRef as useRef9, useState as useState16 } from "react";
2230
2106
  function useContentStable(value, key) {
2231
- const [cached, setCached] = useState17({ value, key });
2107
+ const [cached, setCached] = useState16({ value, key });
2232
2108
  if (cached.key !== key) setCached({ value, key });
2233
2109
  return cached.key === key ? cached.value : value;
2234
2110
  }
@@ -2255,9 +2131,9 @@ function useApiParams(schema, options = {}) {
2255
2131
  const searchParamsLive = useSearchParams();
2256
2132
  const debug = options.debug || false;
2257
2133
  const searchString = searchParamsLive.toString();
2258
- const pendingRef = useRef10([]);
2259
- const [pendingTail, setPendingTail] = useState17(void 0);
2260
- const syncPendingTail = useCallback12(() => {
2134
+ const pendingRef = useRef9([]);
2135
+ const [pendingTail, setPendingTail] = useState16(void 0);
2136
+ const syncPendingTail = useCallback11(() => {
2261
2137
  setPendingTail(pendingRef.current[pendingRef.current.length - 1]);
2262
2138
  }, []);
2263
2139
  const schemaKey = useMemo5(() => JSON.stringify(schema), [schema]);
@@ -2285,14 +2161,14 @@ function useApiParams(schema, options = {}) {
2285
2161
  }
2286
2162
  return result;
2287
2163
  }, [searchString, debug, stableSchema, options.absent]);
2288
- const [paramsCache, setParamsCache] = useState17(() => ({ src: rawParams, value: rawParams }));
2164
+ const [paramsCache, setParamsCache] = useState16(() => ({ src: rawParams, value: rawParams }));
2289
2165
  let stableParams = paramsCache.value;
2290
2166
  if (paramsCache.src !== rawParams) {
2291
2167
  stableParams = reuseArrayRefs(paramsCache.value, rawParams);
2292
2168
  setParamsCache({ src: rawParams, value: stableParams });
2293
2169
  }
2294
2170
  const params = stableParams;
2295
- const addParamToSearchParams = useCallback12((searchParams, key, value) => {
2171
+ const addParamToSearchParams = useCallback11((searchParams, key, value) => {
2296
2172
  for (const [k, v] of createSearchParams({ [key]: value })) searchParams.append(k, v);
2297
2173
  }, []);
2298
2174
  const urlSearchParams = useMemo5(() => {
@@ -2307,7 +2183,7 @@ function useApiParams(schema, options = {}) {
2307
2183
  }
2308
2184
  return newParams;
2309
2185
  }, [params, flattenedSchema, addParamToSearchParams, stableSchema]);
2310
- const updateUrl = useCallback12(
2186
+ const updateUrl = useCallback11(
2311
2187
  (newParams, keysToRemove = []) => {
2312
2188
  const base = pendingRef.current[pendingRef.current.length - 1] ?? searchString;
2313
2189
  const finalParams = new URLSearchParams(base);
@@ -2342,14 +2218,14 @@ function useApiParams(schema, options = {}) {
2342
2218
  },
2343
2219
  [router, debug, searchString, stableSchema, syncPendingTail]
2344
2220
  );
2345
- useEffect16(() => {
2221
+ useEffect15(() => {
2346
2222
  const queue = pendingRef.current;
2347
2223
  if (queue.length === 0) return;
2348
2224
  const hit = queue.indexOf(searchString);
2349
2225
  pendingRef.current = hit === -1 ? [] : queue.slice(hit + 1);
2350
2226
  syncPendingTail();
2351
2227
  }, [searchString, syncPendingTail]);
2352
- const setParam = useCallback12(
2228
+ const setParam = useCallback11(
2353
2229
  (key, value) => {
2354
2230
  const config = stableSchema[key];
2355
2231
  if (!config) {
@@ -2366,7 +2242,7 @@ function useApiParams(schema, options = {}) {
2366
2242
  },
2367
2243
  [updateUrl, addParamToSearchParams, stableSchema]
2368
2244
  );
2369
- const setParams = useCallback12(
2245
+ const setParams = useCallback11(
2370
2246
  (updates) => {
2371
2247
  const newParams = new URLSearchParams();
2372
2248
  const keysToRemove = [];
@@ -2386,14 +2262,14 @@ function useApiParams(schema, options = {}) {
2386
2262
  },
2387
2263
  [updateUrl, addParamToSearchParams, stableSchema, flattenedSchema]
2388
2264
  );
2389
- const clearParams2 = useCallback12(
2265
+ const clearParams2 = useCallback11(
2390
2266
  (keys) => {
2391
2267
  const newParams = new URLSearchParams();
2392
2268
  updateUrl(newParams, keys);
2393
2269
  },
2394
2270
  [updateUrl]
2395
2271
  );
2396
- const resetParams = useCallback12(() => {
2272
+ const resetParams = useCallback11(() => {
2397
2273
  if (debug) {
2398
2274
  console.log("[useApiParams] Resetting params");
2399
2275
  }
@@ -2417,7 +2293,7 @@ function useApiParams(schema, options = {}) {
2417
2293
  }
2418
2294
 
2419
2295
  // src/hooks/state/use-cursor-pagination-state.ts
2420
- import { useCallback as useCallback13, useEffect as useEffect17, useRef as useRef11, useState as useState18 } from "react";
2296
+ import { useCallback as useCallback12, useEffect as useEffect16, useRef as useRef10, useState as useState17 } from "react";
2421
2297
  var urlSchema = {
2422
2298
  search: { type: "string", default: "" },
2423
2299
  cursor: { type: "string", default: "" }
@@ -2425,21 +2301,21 @@ var urlSchema = {
2425
2301
  function useCursorPaginationState(options) {
2426
2302
  const { onInitialLoad, onSearchChange } = options;
2427
2303
  const { params, setParam, setParams } = useApiParams(urlSchema);
2428
- const [searchInput, setSearchInput] = useState18(params.search || "");
2429
- const [hasLoadedBeyondFirst, setHasLoadedBeyondFirst] = useState18(false);
2430
- const [initialLoadCount, setInitialLoadCount] = useState18(0);
2431
- const lastSearchRef = useRef11(null);
2432
- const isSyncingFromUrl = useRef11(false);
2433
- const isInitialLoadInProgress = useRef11(true);
2434
- const searchInputRef = useRef11(searchInput);
2435
- const onInitialLoadRef = useRef11(onInitialLoad);
2436
- const paramsRef = useRef11(params);
2437
- useEffect17(() => {
2304
+ const [searchInput, setSearchInput] = useState17(params.search || "");
2305
+ const [hasLoadedBeyondFirst, setHasLoadedBeyondFirst] = useState17(false);
2306
+ const [initialLoadCount, setInitialLoadCount] = useState17(0);
2307
+ const lastSearchRef = useRef10(null);
2308
+ const isSyncingFromUrl = useRef10(false);
2309
+ const isInitialLoadInProgress = useRef10(true);
2310
+ const searchInputRef = useRef10(searchInput);
2311
+ const onInitialLoadRef = useRef10(onInitialLoad);
2312
+ const paramsRef = useRef10(params);
2313
+ useEffect16(() => {
2438
2314
  searchInputRef.current = searchInput;
2439
2315
  onInitialLoadRef.current = onInitialLoad;
2440
2316
  paramsRef.current = params;
2441
2317
  });
2442
- useEffect17(() => {
2318
+ useEffect16(() => {
2443
2319
  if (isInitialLoadInProgress.current) return;
2444
2320
  const urlSearch = params.search || "";
2445
2321
  if (urlSearch !== searchInputRef.current) {
@@ -2450,7 +2326,7 @@ function useCursorPaginationState(options) {
2450
2326
  }, 0);
2451
2327
  }
2452
2328
  }, [params.search, initialLoadCount]);
2453
- useEffect17(() => {
2329
+ useEffect16(() => {
2454
2330
  if (isInitialLoadInProgress.current) return;
2455
2331
  if (isSyncingFromUrl.current) return;
2456
2332
  if (searchInput !== params.search) {
@@ -2461,7 +2337,7 @@ function useCursorPaginationState(options) {
2461
2337
  });
2462
2338
  }
2463
2339
  }, [searchInput, params.search, setParams, initialLoadCount]);
2464
- useEffect17(() => {
2340
+ useEffect16(() => {
2465
2341
  if (initialLoadCount === 0) {
2466
2342
  const cursor = paramsRef.current.cursor || null;
2467
2343
  const search = paramsRef.current.search || "";
@@ -2477,7 +2353,7 @@ function useCursorPaginationState(options) {
2477
2353
  });
2478
2354
  }
2479
2355
  }, [initialLoadCount]);
2480
- useEffect17(() => {
2356
+ useEffect16(() => {
2481
2357
  if (isInitialLoadInProgress.current) return;
2482
2358
  if (initialLoadCount === 0) return;
2483
2359
  const currentSearch = params.search || "";
@@ -2489,7 +2365,7 @@ function useCursorPaginationState(options) {
2489
2365
  });
2490
2366
  }
2491
2367
  }, [params.search, onSearchChange, initialLoadCount]);
2492
- const handleNextPage = useCallback13(
2368
+ const handleNextPage = useCallback12(
2493
2369
  async (endCursor, fetchFn) => {
2494
2370
  setParam("cursor", endCursor);
2495
2371
  await fetchFn();
@@ -2497,7 +2373,7 @@ function useCursorPaginationState(options) {
2497
2373
  },
2498
2374
  [setParam]
2499
2375
  );
2500
- const handleResetToFirstPage = useCallback13(
2376
+ const handleResetToFirstPage = useCallback12(
2501
2377
  async (fetchFn) => {
2502
2378
  setParam("cursor", "");
2503
2379
  await fetchFn();
@@ -2519,22 +2395,22 @@ function useCursorPaginationState(options) {
2519
2395
  }
2520
2396
 
2521
2397
  // src/hooks/nats/use-nats-client.ts
2522
- import { useEffect as useEffect18, useMemo as useMemo6, useState as useState19 } from "react";
2398
+ import { useEffect as useEffect17, useMemo as useMemo6, useState as useState18 } from "react";
2523
2399
  function useNatsClient(clientOptions, options = {}) {
2524
2400
  const { autoConnect = true } = options;
2525
2401
  const client = useMemo6(() => {
2526
2402
  if (!clientOptions) return null;
2527
2403
  return createNatsClient(clientOptions);
2528
2404
  }, [clientOptions]);
2529
- const [status, setStatus] = useState19("disconnected");
2530
- const [lastError, setLastError] = useState19(null);
2531
- const [statusClient, setStatusClient] = useState19(client);
2405
+ const [status, setStatus] = useState18("disconnected");
2406
+ const [lastError, setLastError] = useState18(null);
2407
+ const [statusClient, setStatusClient] = useState18(client);
2532
2408
  if (statusClient !== client) {
2533
2409
  setStatusClient(client);
2534
2410
  setStatus("disconnected");
2535
2411
  setLastError(null);
2536
2412
  }
2537
- useEffect18(() => {
2413
+ useEffect17(() => {
2538
2414
  if (!client) return void 0;
2539
2415
  const off = client.onStatus((event) => {
2540
2416
  setStatus(event.status);
@@ -2561,7 +2437,7 @@ function useNatsClient(clientOptions, options = {}) {
2561
2437
  }
2562
2438
 
2563
2439
  // src/hooks/use-scenario-player.ts
2564
- import { useCallback as useCallback14, useEffect as useEffect19, useRef as useRef12, useState as useState20 } from "react";
2440
+ import { useCallback as useCallback13, useEffect as useEffect18, useRef as useRef11, useState as useState19 } from "react";
2565
2441
  var START_MS = 300;
2566
2442
  function useScenarioPlayer({
2567
2443
  scenarioCount,
@@ -2574,14 +2450,14 @@ function useScenarioPlayer({
2574
2450
  }) {
2575
2451
  const auto = useAutoplay(enabled);
2576
2452
  const { reducedMotion, paused, setPaused } = auto;
2577
- const [scenario, setScenario] = useState20(initialScenario);
2578
- const [rawStep, setRawStep] = useState20(startAtEnd ? Number.MAX_SAFE_INTEGER : 0);
2453
+ const [scenario, setScenario] = useState19(initialScenario);
2454
+ const [rawStep, setRawStep] = useState19(startAtEnd ? Number.MAX_SAFE_INTEGER : 0);
2579
2455
  const lastStep = typeof lastStepOption === "function" ? lastStepOption(scenario) : lastStepOption;
2580
2456
  const step = reducedMotion ? lastStep : Math.min(rawStep, lastStep);
2581
2457
  const playing = auto.playing && scenarioCount > 0;
2582
- const starting = useRef12(false);
2583
- const wasPlaying = useRef12(false);
2584
- useEffect19(() => {
2458
+ const starting = useRef11(false);
2459
+ const wasPlaying = useRef11(false);
2460
+ useEffect18(() => {
2585
2461
  if (playing && !wasPlaying.current) starting.current = true;
2586
2462
  wasPlaying.current = playing;
2587
2463
  if (!playing) return void 0;
@@ -2601,14 +2477,14 @@ function useScenarioPlayer({
2601
2477
  );
2602
2478
  return () => clearTimeout(timer);
2603
2479
  }, [playing, rawStep, lastStep, stepMs, holdMs, scenario, scenarioCount]);
2604
- const setStep = useCallback14(
2480
+ const setStep = useCallback13(
2605
2481
  (next) => {
2606
2482
  setRawStep(Math.max(0, Math.min(lastStep, next)));
2607
2483
  setPaused(false);
2608
2484
  },
2609
2485
  [lastStep, setPaused]
2610
2486
  );
2611
- const go = useCallback14(
2487
+ const go = useCallback13(
2612
2488
  (next) => {
2613
2489
  setScenario(next);
2614
2490
  setRawStep(0);
@@ -2663,7 +2539,7 @@ function useAccessCodeIntegration() {
2663
2539
  }
2664
2540
 
2665
2541
  // src/hooks/use-claude-mirror-src.ts
2666
- import { useEffect as useEffect20, useState as useState21 } from "react";
2542
+ import { useEffect as useEffect19, useState as useState20 } from "react";
2667
2543
  async function revalidateMirror(mirrorPath) {
2668
2544
  try {
2669
2545
  const res = await fetch(`${mirrorPath}?revalidate=1`);
@@ -2677,9 +2553,9 @@ async function revalidateMirror(mirrorPath) {
2677
2553
  function useClaudeMirrorSrc(url) {
2678
2554
  const endpoints = useEndpointsRuntime();
2679
2555
  const mirrorPath = toClaudeMirrorPath(url, endpoints?.storageViewBaseUrl);
2680
- const [resolved, setResolved] = useState21(null);
2556
+ const [resolved, setResolved] = useState20(null);
2681
2557
  const state = resolved && resolved.key === mirrorPath ? resolved.value : { src: null, status: mirrorPath ? "probing" : "absent" };
2682
- useEffect20(() => {
2558
+ useEffect19(() => {
2683
2559
  if (!mirrorPath) return void 0;
2684
2560
  let cancelled = false;
2685
2561
  const settle = (value) => {
@@ -2706,9 +2582,9 @@ function useClaudeMirrorSrc(url) {
2706
2582
  }
2707
2583
 
2708
2584
  // src/hooks/use-location-hash.ts
2709
- import { useSyncExternalStore as useSyncExternalStore2 } from "react";
2585
+ import { useSyncExternalStore } from "react";
2710
2586
  var HASH_EVENTS = ["hashchange", "popstate", LOCATION_HASH_SYNC_EVENT];
2711
- function subscribe2(onChange) {
2587
+ function subscribe(onChange) {
2712
2588
  for (const event of HASH_EVENTS) window.addEventListener(event, onChange);
2713
2589
  return () => {
2714
2590
  for (const event of HASH_EVENTS) window.removeEventListener(event, onChange);
@@ -2723,15 +2599,15 @@ function readHash() {
2723
2599
  }
2724
2600
  }
2725
2601
  function useLocationHash() {
2726
- return useSyncExternalStore2(subscribe2, readHash, () => "");
2602
+ return useSyncExternalStore(subscribe, readHash, () => "");
2727
2603
  }
2728
2604
 
2729
2605
  // src/hooks/use-scroll-to-hash.ts
2730
- import { useEffect as useEffect21 } from "react";
2606
+ import { useEffect as useEffect20 } from "react";
2731
2607
  var MAX_POLL_FRAMES = 60;
2732
2608
  function useScrollToHash(readyDep = true, options) {
2733
2609
  const headerOffset = options?.headerOffset ?? 0;
2734
- useEffect21(() => {
2610
+ useEffect20(() => {
2735
2611
  if (typeof window === "undefined") return void 0;
2736
2612
  if (readyDep === null || readyDep === false) return void 0;
2737
2613
  let rafId = null;
@@ -2772,19 +2648,19 @@ function useScrollToHash(readyDep = true, options) {
2772
2648
  }
2773
2649
 
2774
2650
  // src/hooks/use-humanity-signals.ts
2775
- import { useCallback as useCallback15, useRef as useRef13, useState as useState22 } from "react";
2651
+ import { useCallback as useCallback14, useRef as useRef12, useState as useState21 } from "react";
2776
2652
  function useHumanitySignals() {
2777
- const ref = useRef13(null);
2778
- const [mountedAt] = useState22(() => typeof performance !== "undefined" ? performance.now() : 0);
2779
- const startedAtRef = useRef13(mountedAt);
2780
- const getSignals = useCallback15(
2653
+ const ref = useRef12(null);
2654
+ const [mountedAt] = useState21(() => typeof performance !== "undefined" ? performance.now() : 0);
2655
+ const startedAtRef = useRef12(mountedAt);
2656
+ const getSignals = useCallback14(
2781
2657
  () => ({
2782
2658
  [HONEYPOT_FIELD]: ref.current?.value ?? "",
2783
2659
  [ELAPSED_MS_FIELD]: typeof performance !== "undefined" ? Math.round(performance.now() - startedAtRef.current) : 0
2784
2660
  }),
2785
2661
  []
2786
2662
  );
2787
- const resetSignals = useCallback15(() => {
2663
+ const resetSignals = useCallback14(() => {
2788
2664
  if (ref.current) ref.current.value = "";
2789
2665
  if (typeof performance !== "undefined") startedAtRef.current = performance.now();
2790
2666
  }, []);
@@ -2792,7 +2668,7 @@ function useHumanitySignals() {
2792
2668
  }
2793
2669
 
2794
2670
  // src/hooks/use-form-rescue.ts
2795
- import { useCallback as useCallback16, useEffect as useEffect22, useMemo as useMemo7, useRef as useRef14 } from "react";
2671
+ import { useCallback as useCallback15, useEffect as useEffect21, useMemo as useMemo7, useRef as useRef13 } from "react";
2796
2672
  var LOCAL_DRAFT_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
2797
2673
  var STORAGE_PREFIX = "form-rescue:v1:";
2798
2674
  var UTM_KEYS = ["source", "medium", "campaign", "content", "term"];
@@ -2854,27 +2730,27 @@ function readUtm() {
2854
2730
  function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
2855
2731
  const draftsUrl = useEndpointsRuntime()?.formDraftsUrl;
2856
2732
  const formId = form?.id ?? null;
2857
- const attemptIdRef = useRef14(null);
2858
- const resumeTokenRef = useRef14(null);
2859
- const latestRef = useRef14(null);
2860
- const dirtyRef = useRef14(false);
2861
- const startedRef = useRef14(false);
2862
- const leadCapturedRef = useRef14(false);
2863
- const completedRef = useRef14(false);
2864
- const timerRef = useRef14(null);
2865
- const fieldNamesRef = useRef14(fieldNames);
2866
- const onRestoreRef = useRef14(onRestore);
2867
- const getSignalsRef = useRef14(getSignals);
2868
- useEffect22(() => {
2733
+ const attemptIdRef = useRef13(null);
2734
+ const resumeTokenRef = useRef13(null);
2735
+ const latestRef = useRef13(null);
2736
+ const dirtyRef = useRef13(false);
2737
+ const startedRef = useRef13(false);
2738
+ const leadCapturedRef = useRef13(false);
2739
+ const completedRef = useRef13(false);
2740
+ const timerRef = useRef13(null);
2741
+ const fieldNamesRef = useRef13(fieldNames);
2742
+ const onRestoreRef = useRef13(onRestore);
2743
+ const getSignalsRef = useRef13(getSignals);
2744
+ useEffect21(() => {
2869
2745
  fieldNamesRef.current = fieldNames;
2870
2746
  onRestoreRef.current = onRestore;
2871
2747
  getSignalsRef.current = getSignals;
2872
2748
  });
2873
- const attemptId = useCallback16(() => {
2749
+ const attemptId = useCallback15(() => {
2874
2750
  if (!attemptIdRef.current) attemptIdRef.current = newAttemptId();
2875
2751
  return attemptIdRef.current;
2876
2752
  }, []);
2877
- const send = useCallback16(
2753
+ const send = useCallback15(
2878
2754
  (keepalive) => {
2879
2755
  if (!formId || !draftsUrl || !dirtyRef.current || completedRef.current || !latestRef.current) return;
2880
2756
  dirtyRef.current = false;
@@ -2905,7 +2781,7 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
2905
2781
  },
2906
2782
  [attemptId, draftsUrl, formId]
2907
2783
  );
2908
- useEffect22(() => {
2784
+ useEffect21(() => {
2909
2785
  if (!formId || typeof window === "undefined") return void 0;
2910
2786
  let cancelled = false;
2911
2787
  const token = new URLSearchParams(window.location.search).get(FORM_RESCUE_RESUME_PARAM);
@@ -2935,7 +2811,7 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
2935
2811
  cancelled = true;
2936
2812
  };
2937
2813
  }, [attemptId, draftsUrl, formId]);
2938
- useEffect22(() => {
2814
+ useEffect21(() => {
2939
2815
  if (!formId || typeof document === "undefined") return void 0;
2940
2816
  const onHide = () => {
2941
2817
  if (completedRef.current || !startedRef.current) return;
@@ -2962,7 +2838,7 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
2962
2838
  if (timerRef.current) clearTimeout(timerRef.current);
2963
2839
  };
2964
2840
  }, [attemptId, formId, send]);
2965
- const track = useCallback16(
2841
+ const track = useCallback15(
2966
2842
  (values, lastField) => {
2967
2843
  if (!formId || completedRef.current) return;
2968
2844
  const names = fieldNamesRef.current;
@@ -2995,14 +2871,14 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
2995
2871
  },
2996
2872
  [attemptId, formId, send]
2997
2873
  );
2998
- const submitFields = useCallback16(() => {
2874
+ const submitFields = useCallback15(() => {
2999
2875
  if (!formId) return {};
3000
2876
  return {
3001
2877
  [FORM_RESCUE_ATTEMPT_FIELD]: attemptId(),
3002
2878
  ...resumeTokenRef.current ? { [FORM_RESCUE_RESUME_FIELD]: resumeTokenRef.current } : {}
3003
2879
  };
3004
2880
  }, [attemptId, formId]);
3005
- const complete = useCallback16(() => {
2881
+ const complete = useCallback15(() => {
3006
2882
  if (!formId) return;
3007
2883
  if (timerRef.current) {
3008
2884
  clearTimeout(timerRef.current);
@@ -3020,7 +2896,7 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
3020
2896
  }
3021
2897
 
3022
2898
  // src/hooks/use-rescued-form.ts
3023
- import { useEffect as useEffect23 } from "react";
2899
+ import { useEffect as useEffect22 } from "react";
3024
2900
  function flattenOneLevel(values) {
3025
2901
  const flat = {};
3026
2902
  for (const [key, value] of Object.entries(values)) {
@@ -3044,7 +2920,7 @@ function useRescuedForm(form, { rescue, fields, getSignals, fieldPath }) {
3044
2920
  }
3045
2921
  }
3046
2922
  });
3047
- useEffect23(() => {
2923
+ useEffect22(() => {
3048
2924
  const subscription = watch((values, { name }) => {
3049
2925
  handle.track(flattenOneLevel(values), name ? name.split(".").pop() ?? null : null);
3050
2926
  });
@@ -3054,8 +2930,6 @@ function useRescuedForm(form, { rescue, fields, getSignals, fieldPath }) {
3054
2930
  }
3055
2931
 
3056
2932
  export {
3057
- useAutoLimitTags,
3058
- useKeyboardCollisionPadding,
3059
2933
  useDeferredError,
3060
2934
  useFocusTrap,
3061
2935
  useStickyToolbar,