@forgeax/app-shell 0.54.1 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react.d.ts +30 -1
- package/dist/react.js +133 -0
- package/package.json +1 -1
package/dist/react.d.ts
CHANGED
|
@@ -232,6 +232,35 @@ interface OutsideDismissLifecycleOptions {
|
|
|
232
232
|
*/
|
|
233
233
|
declare function installOutsideDismissLifecycle(options: OutsideDismissLifecycleOptions): () => void;
|
|
234
234
|
|
|
235
|
+
interface BoundedFrameRetryLifecycleOptions {
|
|
236
|
+
readonly attempt: () => boolean;
|
|
237
|
+
readonly onSuccess?: () => void;
|
|
238
|
+
readonly maxFrames?: number;
|
|
239
|
+
readonly requestFrame?: (callback: FrameRequestCallback) => number;
|
|
240
|
+
readonly cancelFrame?: (handle: number) => void;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Attempt immediately, then retry on a bounded number of animation frames.
|
|
244
|
+
* Products own the work and success predicate; App Shell owns scheduling,
|
|
245
|
+
* cancellation, stale-callback fencing and best-effort exception isolation.
|
|
246
|
+
*/
|
|
247
|
+
declare function installBoundedFrameRetryLifecycle(options: BoundedFrameRetryLifecycleOptions): () => void;
|
|
248
|
+
|
|
249
|
+
interface CoalescedFrameTaskLifecycleOptions {
|
|
250
|
+
readonly task: () => void;
|
|
251
|
+
readonly requestFrame?: (callback: FrameRequestCallback) => number;
|
|
252
|
+
readonly cancelFrame?: (handle: number) => void;
|
|
253
|
+
}
|
|
254
|
+
interface CoalescedFrameTaskLifecycle {
|
|
255
|
+
schedule(): void;
|
|
256
|
+
dispose(): void;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Coalesce repeated requests into one next-frame task. Products own the task;
|
|
260
|
+
* App Shell owns pending-state release, cancellation and stale-callback fencing.
|
|
261
|
+
*/
|
|
262
|
+
declare function createCoalescedFrameTaskLifecycle(options: CoalescedFrameTaskLifecycleOptions): CoalescedFrameTaskLifecycle;
|
|
263
|
+
|
|
235
264
|
type PanelContentPadding = 'none' | 'sm' | 'md';
|
|
236
265
|
type PanelContentScroll = 'none' | 'auto';
|
|
237
266
|
type PanelContentTone = 'default' | 'surface' | 'tool';
|
|
@@ -373,4 +402,4 @@ interface ShellSlotProps extends HTMLAttributes<HTMLElement> {
|
|
|
373
402
|
/** Structural shell marker that preserves the caller's semantic element. */
|
|
374
403
|
declare function ShellSlot({ as, name, ...props }: ShellSlotProps): ReactElement;
|
|
375
404
|
|
|
376
|
-
export { type AnchoredResizeDirection, AnchoredResizeHandle, type AnchoredResizeHandleProps, type AnchoredResizeSession, DetachedPanelBoundary, type DetachedPanelBoundaryProps, DetachedSurfaceFrame, type DetachedSurfaceFrameProps, DetachedSurfaceStatus, type DetachedSurfaceStatusProps, type DetachedSurfaceStatusTone, type DockLayoutControlBinding, type DockLayoutControlBindingOptions, DockLayoutMenu, type DockLayoutMenuPanel, type DockLayoutMenuProps, DockTabAction, type DockTabActionProps, DockTabFrame, type DockTabFrameProps, DockTabIcon, type DockTabIconProps, DockTabStatusSummary, type DockTabStatusSummaryItem, type DockTabStatusSummaryProps, type DockTabStatusTone, DockTabTitle, type DockTabTitleProps, FloatingMenu, type FloatingMenuAnchor, type FloatingMenuPoint, type FloatingMenuProps, type LiveTabPlacement, type LiveTabPlacementSource, type LiveTabTitleSource, OWNED_INTERACTION_SURFACE_SELECTOR, type OutsideDismissEventTarget, type OutsideDismissLifecycleOptions, type OutsideDismissReason, type PanelContentPadding, type PanelContentPolicy, type PanelContentScroll, type PanelContentTone, PanelEmptyState, type PanelEmptyStateProps, PanelSurface, type PanelSurfaceProps, type PersistentSizeStorage, type PersistentSizeStore, type PersistentSizeStoreOptions, type PersistentSizeUpdate, type PointerDragFinishReason, type PointerDragSessionOptions, type PointerReorderFinishReason, type PointerReorderSession, type PointerReorderSessionOptions, ResizeHandle, type ResizeHandleProps, ShellSlot, type ShellSlotElement, type ShellSlotProps, SlotDebugOverlay, SurfacePlaceholder, type SurfacePlaceholderProps, SurfaceRegion, type SurfaceRegionProps, type TabCloseInteractions, type TabCloseInteractionsOptions, type TabPinnedStateSource, type ThresholdPointerDragFinishReason, type ThresholdPointerDragSession, type ThresholdPointerDragSessionOptions, applyAnchoredResizeDelta, beginAnchoredResize, createPersistentSizeStore, hashSlotHue, installOutsideDismissLifecycle, installPointerDragSession, installPointerReorderSession, installThresholdPointerDragSession, isDismissExemptInteractionTarget, isSlotDebugEnabled, useDockLayoutControlBinding, useLiveTabPlacement, useLiveTabTitle, useLocalSize, usePersistentSizeStore, useTabCloseInteractions, useTabPinnedState };
|
|
405
|
+
export { type AnchoredResizeDirection, AnchoredResizeHandle, type AnchoredResizeHandleProps, type AnchoredResizeSession, type BoundedFrameRetryLifecycleOptions, type CoalescedFrameTaskLifecycle, type CoalescedFrameTaskLifecycleOptions, DetachedPanelBoundary, type DetachedPanelBoundaryProps, DetachedSurfaceFrame, type DetachedSurfaceFrameProps, DetachedSurfaceStatus, type DetachedSurfaceStatusProps, type DetachedSurfaceStatusTone, type DockLayoutControlBinding, type DockLayoutControlBindingOptions, DockLayoutMenu, type DockLayoutMenuPanel, type DockLayoutMenuProps, DockTabAction, type DockTabActionProps, DockTabFrame, type DockTabFrameProps, DockTabIcon, type DockTabIconProps, DockTabStatusSummary, type DockTabStatusSummaryItem, type DockTabStatusSummaryProps, type DockTabStatusTone, DockTabTitle, type DockTabTitleProps, FloatingMenu, type FloatingMenuAnchor, type FloatingMenuPoint, type FloatingMenuProps, type LiveTabPlacement, type LiveTabPlacementSource, type LiveTabTitleSource, OWNED_INTERACTION_SURFACE_SELECTOR, type OutsideDismissEventTarget, type OutsideDismissLifecycleOptions, type OutsideDismissReason, type PanelContentPadding, type PanelContentPolicy, type PanelContentScroll, type PanelContentTone, PanelEmptyState, type PanelEmptyStateProps, PanelSurface, type PanelSurfaceProps, type PersistentSizeStorage, type PersistentSizeStore, type PersistentSizeStoreOptions, type PersistentSizeUpdate, type PointerDragFinishReason, type PointerDragSessionOptions, type PointerReorderFinishReason, type PointerReorderSession, type PointerReorderSessionOptions, ResizeHandle, type ResizeHandleProps, ShellSlot, type ShellSlotElement, type ShellSlotProps, SlotDebugOverlay, SurfacePlaceholder, type SurfacePlaceholderProps, SurfaceRegion, type SurfaceRegionProps, type TabCloseInteractions, type TabCloseInteractionsOptions, type TabPinnedStateSource, type ThresholdPointerDragFinishReason, type ThresholdPointerDragSession, type ThresholdPointerDragSessionOptions, applyAnchoredResizeDelta, beginAnchoredResize, createCoalescedFrameTaskLifecycle, createPersistentSizeStore, hashSlotHue, installBoundedFrameRetryLifecycle, installOutsideDismissLifecycle, installPointerDragSession, installPointerReorderSession, installThresholdPointerDragSession, isDismissExemptInteractionTarget, isSlotDebugEnabled, useDockLayoutControlBinding, useLiveTabPlacement, useLiveTabTitle, useLocalSize, usePersistentSizeStore, useTabCloseInteractions, useTabPinnedState };
|
package/dist/react.js
CHANGED
|
@@ -1725,6 +1725,137 @@ function installOutsideDismissLifecycle(options) {
|
|
|
1725
1725
|
};
|
|
1726
1726
|
}
|
|
1727
1727
|
|
|
1728
|
+
// src/frame-retry.ts
|
|
1729
|
+
function installBoundedFrameRetryLifecycle(options) {
|
|
1730
|
+
const requestFrame = options.requestFrame ?? (typeof requestAnimationFrame === "undefined" ? void 0 : requestAnimationFrame.bind(globalThis));
|
|
1731
|
+
const cancelFrame = options.cancelFrame ?? (typeof cancelAnimationFrame === "undefined" ? void 0 : cancelAnimationFrame.bind(globalThis));
|
|
1732
|
+
const requestedMaxFrames = options.maxFrames ?? 240;
|
|
1733
|
+
const maxFrames = Number.isFinite(requestedMaxFrames) ? Math.max(0, Math.floor(requestedMaxFrames)) : 0;
|
|
1734
|
+
let disposed = false;
|
|
1735
|
+
let completed = false;
|
|
1736
|
+
let attemptedFrames = 0;
|
|
1737
|
+
let frameHandle = null;
|
|
1738
|
+
let frameGeneration = 0;
|
|
1739
|
+
const attempt = () => {
|
|
1740
|
+
if (disposed || completed) return true;
|
|
1741
|
+
let succeeded = false;
|
|
1742
|
+
try {
|
|
1743
|
+
succeeded = options.attempt() === true;
|
|
1744
|
+
} catch {
|
|
1745
|
+
}
|
|
1746
|
+
if (disposed || !succeeded) return disposed;
|
|
1747
|
+
completed = true;
|
|
1748
|
+
frameGeneration++;
|
|
1749
|
+
try {
|
|
1750
|
+
options.onSuccess?.();
|
|
1751
|
+
} catch {
|
|
1752
|
+
}
|
|
1753
|
+
return true;
|
|
1754
|
+
};
|
|
1755
|
+
const schedule = () => {
|
|
1756
|
+
if (disposed || completed || !requestFrame || attemptedFrames >= maxFrames) return;
|
|
1757
|
+
attemptedFrames++;
|
|
1758
|
+
const generation = ++frameGeneration;
|
|
1759
|
+
let callbackRan = false;
|
|
1760
|
+
let handle;
|
|
1761
|
+
try {
|
|
1762
|
+
handle = requestFrame(() => {
|
|
1763
|
+
callbackRan = true;
|
|
1764
|
+
if (disposed || completed || generation !== frameGeneration) return;
|
|
1765
|
+
frameGeneration++;
|
|
1766
|
+
frameHandle = null;
|
|
1767
|
+
if (!attempt()) schedule();
|
|
1768
|
+
});
|
|
1769
|
+
} catch {
|
|
1770
|
+
if (generation === frameGeneration) frameGeneration++;
|
|
1771
|
+
return;
|
|
1772
|
+
}
|
|
1773
|
+
if (callbackRan || disposed || completed || generation !== frameGeneration) {
|
|
1774
|
+
try {
|
|
1775
|
+
cancelFrame?.(handle);
|
|
1776
|
+
} catch {
|
|
1777
|
+
}
|
|
1778
|
+
return;
|
|
1779
|
+
}
|
|
1780
|
+
frameHandle = handle;
|
|
1781
|
+
};
|
|
1782
|
+
if (!attempt()) schedule();
|
|
1783
|
+
return () => {
|
|
1784
|
+
if (disposed) return;
|
|
1785
|
+
disposed = true;
|
|
1786
|
+
frameGeneration++;
|
|
1787
|
+
if (frameHandle !== null) {
|
|
1788
|
+
try {
|
|
1789
|
+
cancelFrame?.(frameHandle);
|
|
1790
|
+
} catch {
|
|
1791
|
+
}
|
|
1792
|
+
frameHandle = null;
|
|
1793
|
+
}
|
|
1794
|
+
};
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1797
|
+
// src/coalesced-frame-task.ts
|
|
1798
|
+
function createCoalescedFrameTaskLifecycle(options) {
|
|
1799
|
+
const requestFrame = options.requestFrame ?? (typeof requestAnimationFrame === "undefined" ? void 0 : requestAnimationFrame.bind(globalThis));
|
|
1800
|
+
const cancelFrame = options.cancelFrame ?? (typeof cancelAnimationFrame === "undefined" ? void 0 : cancelAnimationFrame.bind(globalThis));
|
|
1801
|
+
let disposed = false;
|
|
1802
|
+
let pending = false;
|
|
1803
|
+
let frameHandle = null;
|
|
1804
|
+
let frameGeneration = 0;
|
|
1805
|
+
const schedule = () => {
|
|
1806
|
+
if (disposed || pending || !requestFrame) return;
|
|
1807
|
+
pending = true;
|
|
1808
|
+
const generation = ++frameGeneration;
|
|
1809
|
+
let callbackRan = false;
|
|
1810
|
+
let handle;
|
|
1811
|
+
try {
|
|
1812
|
+
handle = requestFrame(() => {
|
|
1813
|
+
callbackRan = true;
|
|
1814
|
+
if (disposed || !pending || generation !== frameGeneration) return;
|
|
1815
|
+
pending = false;
|
|
1816
|
+
frameHandle = null;
|
|
1817
|
+
frameGeneration++;
|
|
1818
|
+
try {
|
|
1819
|
+
options.task();
|
|
1820
|
+
} catch {
|
|
1821
|
+
}
|
|
1822
|
+
});
|
|
1823
|
+
} catch {
|
|
1824
|
+
if (generation === frameGeneration) {
|
|
1825
|
+
pending = false;
|
|
1826
|
+
frameHandle = null;
|
|
1827
|
+
frameGeneration++;
|
|
1828
|
+
}
|
|
1829
|
+
return;
|
|
1830
|
+
}
|
|
1831
|
+
if (callbackRan) return;
|
|
1832
|
+
if (disposed || !pending || generation !== frameGeneration) {
|
|
1833
|
+
try {
|
|
1834
|
+
cancelFrame?.(handle);
|
|
1835
|
+
} catch {
|
|
1836
|
+
}
|
|
1837
|
+
return;
|
|
1838
|
+
}
|
|
1839
|
+
frameHandle = handle;
|
|
1840
|
+
};
|
|
1841
|
+
return {
|
|
1842
|
+
schedule,
|
|
1843
|
+
dispose() {
|
|
1844
|
+
if (disposed) return;
|
|
1845
|
+
disposed = true;
|
|
1846
|
+
pending = false;
|
|
1847
|
+
frameGeneration++;
|
|
1848
|
+
if (frameHandle !== null) {
|
|
1849
|
+
try {
|
|
1850
|
+
cancelFrame?.(frameHandle);
|
|
1851
|
+
} catch {
|
|
1852
|
+
}
|
|
1853
|
+
frameHandle = null;
|
|
1854
|
+
}
|
|
1855
|
+
}
|
|
1856
|
+
};
|
|
1857
|
+
}
|
|
1858
|
+
|
|
1728
1859
|
// src/panel.tsx
|
|
1729
1860
|
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
1730
1861
|
function PanelEmptyState({
|
|
@@ -2096,8 +2227,10 @@ export {
|
|
|
2096
2227
|
SurfaceRegion,
|
|
2097
2228
|
applyAnchoredResizeDelta,
|
|
2098
2229
|
beginAnchoredResize,
|
|
2230
|
+
createCoalescedFrameTaskLifecycle,
|
|
2099
2231
|
createPersistentSizeStore,
|
|
2100
2232
|
hashSlotHue,
|
|
2233
|
+
installBoundedFrameRetryLifecycle,
|
|
2101
2234
|
installOutsideDismissLifecycle,
|
|
2102
2235
|
installPointerDragSession,
|
|
2103
2236
|
installPointerReorderSession,
|