@cascivo/core 0.2.3 → 0.3.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/LICENSE +1 -1
- package/dist/index.d.mts +30 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +42 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/LICENSE
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -462,6 +462,35 @@ declare function DismissableLayer({
|
|
|
462
462
|
escapeDismisses
|
|
463
463
|
}: DismissableLayerProps): import("react").JSX.Element;
|
|
464
464
|
//#endregion
|
|
465
|
+
//#region src/typeahead.d.ts
|
|
466
|
+
interface UseTypeaheadOptions {
|
|
467
|
+
/**
|
|
468
|
+
* Called with the accumulated lowercased query whenever a printable character is
|
|
469
|
+
* typed within the reset window. The consumer resolves which item to focus/select
|
|
470
|
+
* (e.g. the first item whose label starts with `query`).
|
|
471
|
+
*/
|
|
472
|
+
onMatch: (query: string) => void;
|
|
473
|
+
/** Milliseconds of inactivity before the query buffer resets. Default 500. */
|
|
474
|
+
resetMs?: number;
|
|
475
|
+
}
|
|
476
|
+
interface UseTypeaheadReturn {
|
|
477
|
+
/** Spread onto the focusable container (listbox/menu). Feeds printable keys to the buffer. */
|
|
478
|
+
onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void;
|
|
479
|
+
/** Clear the buffer immediately (e.g. on close). */
|
|
480
|
+
reset: () => void;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Type-to-select buffer, without context. The consumer calls `useTypeahead({ onMatch })`
|
|
484
|
+
* and spreads `onKeyDown` onto the focusable list container; each printable key extends
|
|
485
|
+
* the query and fires `onMatch(query)`. The buffer resets after `resetMs` of inactivity.
|
|
486
|
+
*
|
|
487
|
+
* Space is treated as a query character only while a query is already in progress, so a
|
|
488
|
+
* leading Space stays available for activation (WAI-ARIA menu/listbox convention). Repeated
|
|
489
|
+
* identical characters are passed through verbatim (e.g. "aa"); consumers that want the
|
|
490
|
+
* "press 'a' repeatedly to cycle A-items" behavior can detect an all-same-char query.
|
|
491
|
+
*/
|
|
492
|
+
declare function useTypeahead(options: UseTypeaheadOptions): UseTypeaheadReturn;
|
|
493
|
+
//#endregion
|
|
465
494
|
//#region src/roving-focus.d.ts
|
|
466
495
|
type RovingOrientation = 'horizontal' | 'vertical' | 'both';
|
|
467
496
|
interface UseRovingFocusOptions {
|
|
@@ -634,5 +663,5 @@ declare function useAnchorPosition(options: UseAnchorPositionOptions): UseAnchor
|
|
|
634
663
|
//#region src/index.d.ts
|
|
635
664
|
declare const VERSION = "0.0.0";
|
|
636
665
|
//#endregion
|
|
637
|
-
export { type AccessibilityMeta, type AnchorAlign, type AnchorPlacement, type AnchorSide, type ComponentIntent, type ComponentMeta, DismissableLayer, type DismissableLayerProps, type DragOffset, type DragVelocity, type ElementSize, ErrorBoundary, type ErrorBoundaryProps, type ExampleMeta, FocusScope, type FocusScopeProps, type IntentAntiPattern, type IntentContent, type IntentFlexibility, type IntentRelated, type IntentRelationship, type Machine, type MachineConfig, Portal, type PortalProps, Presence, type PresenceProps, type PropMeta, type ReadonlySignal, type RovingItemProps, type RovingOrientation, type Signal, type SignalScope, Slot, type SlotProps, type StateConfig, type StreamBuffer, type StreamBufferOptions, SuspenseBoundary, type SuspenseBoundaryProps, type TypeDefMeta, type TypeFieldMeta, type UseAnchorPositionOptions, type UseAnchorPositionReturn, type UseClipboardOptions, type UseClipboardReturn, type UseControllableSignalOptions, type UseDisclosureOptions, type UseDisclosureReturn, type UseDraggableOptions, type UseDraggableReturn, type UseInfiniteScrollOptions, type UseInfiniteScrollReturn, type UseIntersectionObserverOptions, type UseIntersectionObserverReturn, type UseMutationObserverReturn, type UseResizeObserverOptions, type UseResizeObserverReturn, type UseRovingFocusOptions, type UseRovingFocusReturn, VERSION, VisuallyHidden, type VisuallyHiddenProps, type WcagLevel, batch, cn, composeRefs, computePosition, computed, createMachine, createScope, createStreamBuffer, effect, mergeProps, signal, useAnchorPosition, useClipboard, useComputed, useControllableSignal, useDisclosure, useDraggable, useId, useInfiniteScroll, useIntersectionObserver, useMachine, useMediaQuery, useMutationObserver, useResizeObserver, useRovingFocus, useScope, useScrollLock, useSignal, useSignalEffect, useSignals, useStreamBuffer };
|
|
666
|
+
export { type AccessibilityMeta, type AnchorAlign, type AnchorPlacement, type AnchorSide, type ComponentIntent, type ComponentMeta, DismissableLayer, type DismissableLayerProps, type DragOffset, type DragVelocity, type ElementSize, ErrorBoundary, type ErrorBoundaryProps, type ExampleMeta, FocusScope, type FocusScopeProps, type IntentAntiPattern, type IntentContent, type IntentFlexibility, type IntentRelated, type IntentRelationship, type Machine, type MachineConfig, Portal, type PortalProps, Presence, type PresenceProps, type PropMeta, type ReadonlySignal, type RovingItemProps, type RovingOrientation, type Signal, type SignalScope, Slot, type SlotProps, type StateConfig, type StreamBuffer, type StreamBufferOptions, SuspenseBoundary, type SuspenseBoundaryProps, type TypeDefMeta, type TypeFieldMeta, type UseAnchorPositionOptions, type UseAnchorPositionReturn, type UseClipboardOptions, type UseClipboardReturn, type UseControllableSignalOptions, type UseDisclosureOptions, type UseDisclosureReturn, type UseDraggableOptions, type UseDraggableReturn, type UseInfiniteScrollOptions, type UseInfiniteScrollReturn, type UseIntersectionObserverOptions, type UseIntersectionObserverReturn, type UseMutationObserverReturn, type UseResizeObserverOptions, type UseResizeObserverReturn, type UseRovingFocusOptions, type UseRovingFocusReturn, type UseTypeaheadOptions, type UseTypeaheadReturn, VERSION, VisuallyHidden, type VisuallyHiddenProps, type WcagLevel, batch, cn, composeRefs, computePosition, computed, createMachine, createScope, createStreamBuffer, effect, mergeProps, signal, useAnchorPosition, useClipboard, useComputed, useControllableSignal, useDisclosure, useDraggable, useId, useInfiniteScroll, useIntersectionObserver, useMachine, useMediaQuery, useMutationObserver, useResizeObserver, useRovingFocus, useScope, useScrollLock, useSignal, useSignalEffect, useSignals, useStreamBuffer, useTypeahead };
|
|
638
667
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/machine.ts","../src/utils.ts","../src/error-boundary.tsx","../src/suspense-boundary.tsx","../src/portal.tsx","../src/visually-hidden.tsx","../src/focus-scope.tsx","../src/slot.tsx","../src/controllable.ts","../src/media-query.ts","../src/scroll-lock.ts","../src/use-id.ts","../src/clipboard.ts","../src/disclosure.ts","../src/infinite-scroll.ts","../src/draggable.ts","../src/resize-observer.ts","../src/mutation-observer.ts","../src/intersection-observer.ts","../src/dismissable-layer.tsx","../src/roving-focus.ts","../src/presence.tsx","../src/stream-buffer.ts","../src/scope.ts","../src/anchor.tsx","../src/index.ts"],"mappings":";;;;;UAAiB,WAAA;EACf,EAAA,GAAK,MAAM;AAAA;AAAA,UAGI,aAAA,sCAAmD,CAAA,GAAI,CAAA;EACtE,OAAA,EAAS,CAAA;EACT,MAAA,EAAQ,MAAA,CAAO,CAAA,EAAG,WAAA;AAAA;AAAA,UAGH,OAAA;EACf,OAAA,EAAS,CAAA;EACT,MAAA,EAAQ,MAAA,CAAO,CAAA,EAAG,WAAA;AAAA;AAAA,UAGH,QAAA;EACf,IAAA;EACA,IAAA;EACA,QAAA;EACA,OAAA;EACA,WAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,IAAA;EACA,QAAA;EACA,WAAA;AAAA;;;;;;;UASe,WAAA;EA7Bc;EA+B7B,IAAA;EACA,WAAA;EACA,MAAA,EAAQ,aAAa;AAAA;;;;;KAOX,SAAA;AAAA,UAEK,iBAAA;EACf,IAAA;EAvCA;EAyCA,IAAA,EAAM,SAAS;EACf,QAAA;EAzCQ;;;;AAAqB;EA+C7B,UAAA;EA5CuB;;;;EAiDvB,YAAA;EA9CA;;;;EAmDA,aAAA;AAAA;AAAA,UAGe,WAAA;EACf,KAAA;EACA,IAAA;EACA,WAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,WAAA;EACA,QAAA;EASA,MAAA;EACA,QAAA;EACA,KAAA;EACA,KAAA,EAAO,QAAA;EAvDP;EAyDA,QAAA,GAAW,WAAA;EACX,MAAA;EACA,aAAA,EAAe,iBAAA;EACf,QAAA,EAAU,WAAA;EACV,YAAA;EApDU;;;;AAAS;AAErB;;EA0DE,oBAAA;EACA,IAAA;EACA,MAAA,GAAS,eAAA;AAAA;AAAA,UAGM,iBAAA;EACf,GAAA;EACA,IAAA;EACA,GAAA;AAAA;AAAA,KAGU,kBAAA;AAAA,UAEK,aAAA;EACf,IAAA;EACA,YAAA,EAAc,kBAAkB;EAChC,MAAA;AAAA;AAAA,UAGe,iBAAA;EACf,IAAA;EACA,KAAA;EACA,IAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,KAAK;AAAA;AAAA,UAGU,eAAA;EACf,SAAA;EACA,YAAA;EACA,YAAA,EAAc,iBAAA;EACd,OAAA,EAAS,aAAA;EACT,aAAA;EACA,OAAA,GAAU,aAAA;EACV,WAAA,EAAa,iBAAA;AAAA;;;iBC5IC,aAAA,6BAA0C,CAAA,GAAI,CAAA,EAC5D,MAAA,EAAQ,aAAA,CAAc,CAAA,EAAG,CAAA,IACxB,OAAA,CAAQ,CAAA;AAAA,iBAIK,UAAA,mBAA6B,OAAA,EAAS,OAAA,CAAQ,CAAA,6CAAE,MAAA,CAAA,CAAA,IAAA,KAAA;;;iBCPhD,EAAA,IAAM,OAAO;AAAA,iBAIb,WAAA,OAAkB,IAAA,GAAO,GAAA,CAAI,CAAA,mBAAoB,WAAA,CAAY,CAAA;AAAA,iBAe7D,UAAA,WAAqB,MAAA,sBAA4B,SAAA,EAAW,OAAA,CAAQ,CAAA,MAAO,CAAA;;;UCnB1E,kBAAA;EACf,QAAA,EAAU,SAAA;EACV,QAAA,EAAU,SAAA,KAAc,KAAA,EAAO,KAAA,EAAO,KAAA,iBAAsB,SAAA;EAC5D,OAAA,IAAW,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,SAAA;AAAA;AAAA,UAGvB,KAAA;EACR,KAAA,EAAO,KAAK;AAAA;AAAA,cAGD,aAAA,SAAsB,SAAA,CAAU,kBAAA,EAAoB,KAAA;EAC/D,KAAA,EAAO,KAAA;EAAA,OAEA,wBAAA,CAAyB,KAAA,EAAO,KAAA,GAAQ,KAAA;EAI/C,iBAAA,CAAkB,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,SAAA;EAItC,KAAA;EAIA,MAAA,IAAM,SAAA;AAAA;;;UCzBS,qBAAA;EACf,QAAA,EAAU,SAAA;EACV,QAAA,GAAW,SAAS;AAAA;AAAA,iBAGN,gBAAA;EAAmB,QAAA;EAAU;AAAA,GAAY,qBAAA,mBAAqB,GAAA,CAAA,OAAA;;;UCF7D,WAAA;EACf,QAAA,EAAU,SAAA;EACV,SAAA,GAAY,OAAA,GAAU,gBAAA;AAAA;AAAA,iBAGR,MAAA;EAAS,QAAA;EAAU;AAAA,GAAa,WAAA,mBAAW,WAAA;;;UCP1C,mBAAA,SAA4B,cAAA,CAAe,eAAA;EAC1D,QAAA,EAAU,SAAA;EACV,WAAA;AAAA;AAAA,iBAGc,cAAA;EACd,QAAA;EACA,WAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,mBAAA,mBAAmB,GAAA,CAAA,OAAA;;;UCNL,eAAA;EACf,QAAA,EAAU,SAAS;EACnB,OAAA;EACA,YAAA;EACA,SAAA;AAAA;AAAA,iBAGc,UAAA;EAAa,QAAA;EAAU,OAAA;EAAS,YAAA;EAAc;AAAA,GAAa,eAAA,mBAAe,GAAA,CAAA,OAAA;;;UCDzE,SAAA;EACf,QAAA,GAAW,SAAA;EACX,SAAA;EACA,KAAA,GAAQ,aAAa;EAAA,CACpB,GAAA;AAAA;;;ARhBU;AAGb;;;;;;;;;cQ8Ba,IAAA,kBAAI,yBAAA,CAAA,IAAA,CAAA,SAAA,2BAAA,aAAA;;;UC9BA,4BAAA;;EAEf,KAAA,GAAQ,CAAA;;EAER,YAAA,GAAe,CAAA;ETRW;ESU1B,QAAA,KAAa,KAAA,EAAO,CAAA;AAAA;ATTT;AAGb;;;;;;;;;;;;AAHa,iBSyBG,qBAAA,IACd,OAAA,EAAS,4BAAA,CAA6B,CAAA,KACpC,MAAA,CAAO,CAAA,IAAK,IAAA,EAAM,CAAA;;;;;;;AT5BtB;iBUagB,aAAA,CAAc,KAAA,WAAgB,cAAc;;;;;;;AVb5D;iBWQgB,aAAA,CAAc,MAAiC,EAAzB,MAAM;;;;;;;iBCD5B,KAAA,CAAM,MAAkB;;;UCHvB,mBAAA;;EAEf,OAAO;AAAA;AAAA,UAGQ,kBAAA;EACf,MAAA,EAAQ,cAAA;EACR,IAAA,GAAO,IAAA,aAAiB,OAAO;AAAA;AbVpB;AAGb;;;;AAHa,iBakBG,YAAA,CAAa,OAAA,GAAS,mBAAA,GAA2B,kBAAkB;;;UCflE,oBAAA;;EAEf,WAAA;;EAEA,MAAA;EdR0B;EcU1B,YAAA,IAAgB,IAAA;AAAA;AAAA,UAGD,mBAAA;EACf,MAAA,EAAQ,cAAc;EACtB,IAAA;EACA,KAAA;EACA,MAAA;AAAA;;;;;;;iBASc,aAAA,CAAc,OAAA,GAAS,oBAAA,GAA4B,mBAAmB;;;UCtBrE,wBAAA;;EAEf,OAAA;;EAEA,UAAA;EfR0B;EeU1B,SAAA;EfTA;EeWA,UAAA;AAAA;AAAA,UAGe,uBAAA;EfXa;Eea5B,WAAA,EAAa,SAAA,CAAU,WAAA;Efb+C;EeetE,OAAA,EAAS,SAAA,CAAU,WAAA;AAAA;;;;;;;iBASL,iBAAA,CAAkB,OAAA,EAAS,wBAAA,GAA2B,uBAAuB;;;UCxB5E,UAAA;EACf,CAAA;EACA,CAAC;AAAA;;UAIc,YAAA;EACf,CAAA;EACA,CAAC;AAAA;AAAA,UAGc,mBAAA;EACf,UAAA;EACA,SAAA,IAAa,MAAA,EAAQ,UAAU;EhBbuC;EgBetE,IAAA;AAAA;AAAA,UAGe,kBAAA;EhBhBP;EgBkBR,SAAA,EAAW,SAAA,CAAU,WAAA;EhBlBP;EgBoBd,SAAA,EAAW,SAAA,CAAU,WAAA;EACrB,MAAA,EAAQ,cAAA,CAAe,UAAA;EhBvB2C;;;;;EgB6BlE,QAAA,EAAU,cAAA,CAAe,YAAA;EACzB,UAAA,EAAY,cAAA;EACZ,KAAA;AAAA;AhB7B6B;AAG/B;;;;;;AAH+B,iBgB0Cf,YAAA,CAAa,OAAA,GAAS,mBAAA,GAA2B,kBAAkB;;;UC5ClE,WAAA;EACf,KAAA;EACA,MAAM;AAAA;AAAA,UAGS,wBAAA;;EAEf,GAAA,GAAM,wBAAwB;AAAA;AAAA,UAGf,uBAAA,WAAkC,OAAA;EjBVrB;EiBY5B,GAAA,EAAK,SAAA,CAAU,CAAA;EjBZmD;EiBclE,IAAA,EAAM,cAAA,CAAe,WAAA;EjBbZ;EiBeT,KAAA,EAAO,cAAA,CAAe,mBAAA;AAAA;;;;;;;iBASR,iBAAA,WAA4B,OAAA,GAAU,OAAA,EACpD,OAAA,GAAS,wBAAA,GACR,uBAAA,CAAwB,CAAA;;;UC3BV,yBAAA,WAAoC,IAAA;;EAEnD,GAAA,EAAK,SAAA,CAAU,CAAA;ElBNA;EkBQf,OAAA,EAAS,cAAA,CAAe,cAAA;AAAA;;AlBPb;AAGb;;;;;;;iBkBgBgB,mBAAA,WAA8B,IAAA,GAAO,OAAA,EACnD,IAAA,GAAM,oBAAA,GACL,yBAAA,CAA0B,CAAA;;;UClBZ,8BAAA;EACf,IAAA,GAAO,OAAA,GAAU,QAAQ;EACzB,UAAA;EACA,SAAA;AAAA;AAAA,UAGe,6BAAA,WAAwC,OAAA;EnBTvD;EmBWA,GAAA,EAAK,SAAA,CAAU,CAAA;EnBRA;EmBUf,KAAA,EAAO,cAAA,CAAe,yBAAA;EnBVM;EmBY5B,cAAA,EAAgB,cAAA;AAAA;;;;;;;;;;;;iBAcF,uBAAA,WAAkC,OAAA,GAAU,OAAA,EAC1D,OAAA,GAAS,8BAAA,GACR,6BAAA,CAA8B,CAAA;;;UCpBhB,qBAAA;EACf,QAAA,EAAU,SAAS;;EAEnB,SAAA;EpBfe;EoBiBf,qBAAA;;EAEA,eAAA;AAAA;ApBfF;;;;;AAAA,iBoBuBgB,gBAAA;EACd,QAAA;EACA,SAAA;EACA,qBAAA;EACA;AAAA,GACC,qBAAA,mBAAqB,GAAA,CAAA,OAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/machine.ts","../src/utils.ts","../src/error-boundary.tsx","../src/suspense-boundary.tsx","../src/portal.tsx","../src/visually-hidden.tsx","../src/focus-scope.tsx","../src/slot.tsx","../src/controllable.ts","../src/media-query.ts","../src/scroll-lock.ts","../src/use-id.ts","../src/clipboard.ts","../src/disclosure.ts","../src/infinite-scroll.ts","../src/draggable.ts","../src/resize-observer.ts","../src/mutation-observer.ts","../src/intersection-observer.ts","../src/dismissable-layer.tsx","../src/typeahead.ts","../src/roving-focus.ts","../src/presence.tsx","../src/stream-buffer.ts","../src/scope.ts","../src/anchor.tsx","../src/index.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -641,6 +641,47 @@ function DismissableLayer({ children, onDismiss, disableOutsidePointer, escapeDi
|
|
|
641
641
|
});
|
|
642
642
|
}
|
|
643
643
|
//#endregion
|
|
644
|
+
//#region src/typeahead.ts
|
|
645
|
+
function isTypeaheadChar(event) {
|
|
646
|
+
return event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Type-to-select buffer, without context. The consumer calls `useTypeahead({ onMatch })`
|
|
650
|
+
* and spreads `onKeyDown` onto the focusable list container; each printable key extends
|
|
651
|
+
* the query and fires `onMatch(query)`. The buffer resets after `resetMs` of inactivity.
|
|
652
|
+
*
|
|
653
|
+
* Space is treated as a query character only while a query is already in progress, so a
|
|
654
|
+
* leading Space stays available for activation (WAI-ARIA menu/listbox convention). Repeated
|
|
655
|
+
* identical characters are passed through verbatim (e.g. "aa"); consumers that want the
|
|
656
|
+
* "press 'a' repeatedly to cycle A-items" behavior can detect an all-same-char query.
|
|
657
|
+
*/
|
|
658
|
+
function useTypeahead(options) {
|
|
659
|
+
const { onMatch, resetMs = 500 } = options;
|
|
660
|
+
const query = useRef("");
|
|
661
|
+
const timer = useRef(void 0);
|
|
662
|
+
const onMatchRef = useRef(onMatch);
|
|
663
|
+
onMatchRef.current = onMatch;
|
|
664
|
+
const reset = () => {
|
|
665
|
+
clearTimeout(timer.current);
|
|
666
|
+
query.current = "";
|
|
667
|
+
};
|
|
668
|
+
useSignalEffect(() => () => clearTimeout(timer.current));
|
|
669
|
+
const onKeyDown = (event) => {
|
|
670
|
+
if (!isTypeaheadChar(event)) return;
|
|
671
|
+
if (event.key === " " && query.current === "") return;
|
|
672
|
+
query.current += event.key.toLowerCase();
|
|
673
|
+
clearTimeout(timer.current);
|
|
674
|
+
timer.current = setTimeout(() => {
|
|
675
|
+
query.current = "";
|
|
676
|
+
}, resetMs);
|
|
677
|
+
onMatchRef.current(query.current);
|
|
678
|
+
};
|
|
679
|
+
return {
|
|
680
|
+
onKeyDown,
|
|
681
|
+
reset
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
//#endregion
|
|
644
685
|
//#region src/roving-focus.ts
|
|
645
686
|
/**
|
|
646
687
|
* Roving tabindex without context. The parent calls `useRovingFocus(...)` and spreads
|
|
@@ -995,6 +1036,6 @@ function useAnchorPosition(options) {
|
|
|
995
1036
|
//#region src/index.ts
|
|
996
1037
|
const VERSION = "0.0.0";
|
|
997
1038
|
//#endregion
|
|
998
|
-
export { DismissableLayer, ErrorBoundary, FocusScope, Portal, Presence, Slot, SuspenseBoundary, VERSION, VisuallyHidden, batch, cn, composeRefs, computePosition, computed, createMachine, createScope, createStreamBuffer, effect, mergeProps, signal, useAnchorPosition, useClipboard, useComputed, useControllableSignal, useDisclosure, useDraggable, useId, useInfiniteScroll, useIntersectionObserver, useMachine, useMediaQuery, useMutationObserver, useResizeObserver, useRovingFocus, useScope, useScrollLock, useSignal, useSignalEffect, useSignals, useStreamBuffer };
|
|
1039
|
+
export { DismissableLayer, ErrorBoundary, FocusScope, Portal, Presence, Slot, SuspenseBoundary, VERSION, VisuallyHidden, batch, cn, composeRefs, computePosition, computed, createMachine, createScope, createStreamBuffer, effect, mergeProps, signal, useAnchorPosition, useClipboard, useComputed, useControllableSignal, useDisclosure, useDraggable, useId, useInfiniteScroll, useIntersectionObserver, useMachine, useMediaQuery, useMutationObserver, useResizeObserver, useRovingFocus, useScope, useScrollLock, useSignal, useSignalEffect, useSignals, useStreamBuffer, useTypeahead };
|
|
999
1040
|
|
|
1000
1041
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["useSignal","styles","useReactId","coreSignal","coreComputed","coreEffect"],"sources":["../src/machine.ts","../src/utils.ts","../src/error-boundary.tsx","../src/suspense-boundary.tsx","../src/portal.tsx","../src/visually-hidden.tsx","../src/focus-scope.tsx","../src/slot.tsx","../src/controllable.ts","../src/media-query.ts","../src/scroll-lock.ts","../src/use-id.ts","../src/clipboard.ts","../src/disclosure.ts","../src/infinite-scroll.ts","../src/draggable.ts","../src/resize-observer.ts","../src/mutation-observer.ts","../src/intersection-observer.ts","../src/dismissable-layer.tsx","../src/roving-focus.ts","../src/presence.tsx","../src/stream-buffer.ts","../src/scope.ts","../src/anchor.tsx","../src/index.ts"],"sourcesContent":["import { useSignal } from '@preact/signals-react'\nimport type { Machine, MachineConfig } from './types.ts'\n\nexport function createMachine<S extends string, I extends S = S>(\n config: MachineConfig<S, I>,\n): Machine<S> {\n return config as Machine<S>\n}\n\nexport function useMachine<S extends string>(machine: Machine<S>) {\n const state = useSignal<S>(machine.initial)\n const send = (event: string) => {\n const next = machine.states[state.value]?.on?.[event] as S | undefined\n if (next !== undefined) state.value = next\n }\n return [state, send] as const\n}\n","import type { Ref, RefCallback, MutableRefObject } from 'react'\n\nexport function cn(...classes: (string | undefined | null | false | 0)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\nexport function composeRefs<T>(...refs: (Ref<T> | undefined)[]): RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (!ref) return\n if (typeof ref === 'function') {\n ref(value)\n } else {\n ;(ref as MutableRefObject<T | null>).current = value\n }\n })\n }\n}\n\ntype EventHandler = (...args: unknown[]) => unknown\n\nexport function mergeProps<T extends Record<string, unknown>>(...propsList: Partial<T>[]): T {\n const result: Record<string, unknown> = {}\n for (const props of propsList) {\n for (const [key, val] of Object.entries(props)) {\n if (key.startsWith('on') && typeof val === 'function' && typeof result[key] === 'function') {\n const existing = result[key] as EventHandler\n result[key] = (...args: unknown[]) => {\n existing(...args)\n ;(val as EventHandler)(...args)\n }\n } else {\n result[key] = val\n }\n }\n }\n return result as T\n}\n","import { Component, type ErrorInfo, type ReactNode } from 'react'\n\nexport interface ErrorBoundaryProps {\n children: ReactNode\n fallback: ReactNode | ((error: Error, reset: () => void) => ReactNode)\n onError?: (error: Error, info: ErrorInfo) => void\n}\n\ninterface State {\n error: Error | null\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(error: Error): State {\n return { error }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info)\n }\n\n reset = () => {\n this.setState({ error: null })\n }\n\n render() {\n const { error } = this.state\n if (error !== null) {\n const { fallback } = this.props\n return typeof fallback === 'function' ? fallback(error, this.reset) : fallback\n }\n return this.props.children\n }\n}\n","import { Suspense, type ReactNode } from 'react'\n\nexport interface SuspenseBoundaryProps {\n children: ReactNode\n fallback?: ReactNode\n}\n\nexport function SuspenseBoundary({ children, fallback }: SuspenseBoundaryProps) {\n return (\n <Suspense fallback={fallback ?? <span aria-busy=\"true\" aria-label=\"Loading\" />}>\n {children}\n </Suspense>\n )\n}\n","'use client'\nimport { useRef, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useSignal, useSignalEffect, useSignals } from './signals.ts'\n\nexport interface PortalProps {\n children: ReactNode\n container?: Element | DocumentFragment\n}\n\nexport function Portal({ children, container }: PortalProps) {\n useSignals()\n const mounted = useSignal(false)\n const containerRef = useRef<Element | DocumentFragment | null>(null)\n\n useSignalEffect(() => {\n if (typeof document === 'undefined') return\n containerRef.current = container ?? document.body\n mounted.value = true\n return () => {\n mounted.value = false\n }\n })\n\n if (!mounted.value || containerRef.current === null) return null\n return createPortal(children, containerRef.current)\n}\n","import type { ReactNode, HTMLAttributes } from 'react'\nimport styles from './visually-hidden.module.css'\n\nexport interface VisuallyHiddenProps extends HTMLAttributes<HTMLSpanElement> {\n children: ReactNode\n showOnFocus?: boolean\n}\n\nexport function VisuallyHidden({\n children,\n showOnFocus,\n className,\n ...props\n}: VisuallyHiddenProps) {\n const classes = [styles.root, showOnFocus && styles.focusable, className]\n .filter(Boolean)\n .join(' ')\n return (\n <span className={classes} {...props}>\n {children}\n </span>\n )\n}\n","'use client'\nimport { useRef, type ReactNode } from 'react'\nimport { useSignalEffect, useSignals } from './signals.ts'\n\nconst FOCUSABLE =\n 'a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),[tabindex]:not([tabindex=\"-1\"])'\n\nexport interface FocusScopeProps {\n children: ReactNode\n trapped?: boolean\n restoreFocus?: boolean\n autoFocus?: boolean\n}\n\nexport function FocusScope({ children, trapped, restoreFocus, autoFocus }: FocusScopeProps) {\n useSignals()\n const containerRef = useRef<HTMLDivElement>(null)\n const previousFocusRef = useRef<Element | null>(null)\n\n useSignalEffect(() => {\n const container = containerRef.current\n if (!container) return\n if (restoreFocus) previousFocusRef.current = document.activeElement\n if (autoFocus) {\n const first = container.querySelector<HTMLElement>(FOCUSABLE)\n first?.focus()\n }\n if (!trapped) return\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') return\n const focusable = Array.from(container!.querySelectorAll<HTMLElement>(FOCUSABLE))\n if (focusable.length === 0) return\n const first = focusable[0]!\n const last = focusable[focusable.length - 1]!\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault()\n last.focus()\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault()\n first.focus()\n }\n }\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n if (restoreFocus && previousFocusRef.current instanceof HTMLElement) {\n previousFocusRef.current.focus()\n }\n }\n })\n\n return <div ref={containerRef}>{children}</div>\n}\n","'use client'\nimport {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { cn, composeRefs, mergeProps } from './utils.ts'\n\nexport interface SlotProps {\n children?: ReactNode\n className?: string\n style?: CSSProperties\n [key: string]: unknown\n}\n\ntype ElementWithRef = ReactElement<Record<string, unknown>> & { ref?: Ref<unknown> }\n\n/**\n * Slot renders its single child element while merging the Slot's own props and ref onto it —\n * the Radix-style `asChild` composition primitive, built on cascivo's existing\n * `mergeProps`/`composeRefs`/`cn`.\n *\n * - Non-handler props: child wins (so the consumer's element controls its own identity).\n * - `on*` handlers: chained (Slot's runs, then the child's) via `mergeProps`.\n * - `className`: unioned via `cn`. `style`: shallow-merged (child wins on conflicts).\n * - `ref`: composed so both the Slot consumer's ref and the child's own ref receive the node.\n *\n * Fails fast if `children` is not exactly one valid React element.\n */\nexport const Slot = forwardRef<unknown, SlotProps>(function Slot(props, forwardedRef) {\n const { children, className: slotClassName, style: slotStyle, ...slotProps } = props\n\n if (!isValidElement(children) || Children.count(children) !== 1) {\n throw new Error(\n 'Slot expects exactly one valid React element child (asChild requires a single element).',\n )\n }\n\n const child = children as ElementWithRef\n const childProps = child.props\n const merged = mergeProps<Record<string, unknown>>(slotProps, childProps)\n\n merged['className'] = cn(\n slotClassName as string | undefined,\n childProps['className'] as string | undefined,\n )\n merged['style'] = {\n ...(slotStyle as CSSProperties | undefined),\n ...(childProps['style'] as CSSProperties | undefined),\n }\n // React 19 exposes ref as a regular prop; React 18 keeps it on the element. Prefer props.ref to\n // avoid touching the deprecated `element.ref` getter when it isn't needed.\n const childRef = (childProps['ref'] as Ref<unknown> | undefined) ?? child.ref\n merged['ref'] = composeRefs(forwardedRef, childRef)\n\n return cloneElement(child, merged)\n})\n","'use client'\nimport { useRef } from 'react'\nimport { useSignal, type Signal } from './signals.ts'\n\nexport interface UseControllableSignalOptions<T> {\n /** Controlled value. When provided, the component is controlled for its whole life. */\n value?: T | undefined\n /** Initial value for uncontrolled use. */\n defaultValue?: T | undefined\n /** Called on every write, in both controlled and uncontrolled modes. */\n onChange?: ((value: T) => void) | undefined\n}\n\n/**\n * Codifies the controlled/uncontrolled pattern documented by hand in CLAUDE.md\n * (`const x = useSignal(open); x.value = open`).\n *\n * Returns a `[signal, setValue]` pair:\n * - **Controlled** (`value` provided): the signal mirrors `value` on every render; `setValue`\n * does not mutate the signal locally — it only routes the request through `onChange` so the\n * parent owns the state (React semantics).\n * - **Uncontrolled** (`value` undefined): the signal owns the state seeded from `defaultValue`;\n * `setValue` updates it locally and also calls `onChange`.\n *\n * Whether a component is controlled is fixed for its life, exactly like React.\n */\nexport function useControllableSignal<T>(\n options: UseControllableSignalOptions<T>,\n): [Signal<T>, (next: T) => void] {\n const { value, defaultValue, onChange } = options\n const isControlled = value !== undefined\n\n const sig = useSignal<T>((isControlled ? value : defaultValue) as T)\n\n // Keep onChange current without an effect (the onCloseRef idiom from CLAUDE.md).\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n // Controlled: mirror the prop into the signal each render (no-op if unchanged).\n if (isControlled) sig.value = value as T\n\n const setValue = (next: T): void => {\n if (!isControlled) sig.value = next\n onChangeRef.current?.(next)\n }\n\n return [sig, setValue]\n}\n","'use client'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nfunction initialMatch(query: string): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false\n return window.matchMedia(query).matches\n}\n\n/**\n * `useMediaQuery(query)` → a `ReadonlySignal<boolean>` that tracks whether the media query matches.\n * SSR-safe (defaults to `false` when `window`/`matchMedia` is unavailable). Subscribes to changes\n * inside `useSignalEffect`; the listener is cleaned up on teardown.\n */\nexport function useMediaQuery(query: string): ReadonlySignal<boolean> {\n const matches = useSignal(initialMatch(query))\n\n useSignalEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return\n const mql = window.matchMedia(query)\n matches.value = mql.matches\n const handler = (event: MediaQueryListEvent): void => {\n matches.value = event.matches\n }\n mql.addEventListener('change', handler)\n return () => mql.removeEventListener('change', handler)\n })\n\n return matches\n}\n","'use client'\nimport { useSignalEffect, type Signal } from './signals.ts'\n\n/**\n * Locks `document.body` scroll while `locked` is true, compensating for the scrollbar width to\n * avoid a layout shift. Accepts a plain boolean or a `Signal<boolean>` (reactive). The previous\n * inline styles are restored on unlock/teardown. DOM work runs inside `useSignalEffect`.\n */\nexport function useScrollLock(locked: Signal<boolean> | boolean): void {\n useSignalEffect(() => {\n const isLocked = typeof locked === 'boolean' ? locked : locked.value\n if (!isLocked || typeof document === 'undefined') return\n\n const body = document.body\n const prevOverflow = body.style.overflow\n const prevPaddingInlineEnd = body.style.paddingInlineEnd\n\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n body.style.overflow = 'hidden'\n if (scrollbarWidth > 0) {\n const current = Number.parseInt(window.getComputedStyle(body).paddingInlineEnd, 10) || 0\n body.style.paddingInlineEnd = `${current + scrollbarWidth}px`\n }\n\n return () => {\n body.style.overflow = prevOverflow\n body.style.paddingInlineEnd = prevPaddingInlineEnd\n }\n })\n}\n","'use client'\nimport { useId as useReactId } from 'react'\n\n/**\n * SSR-safe stable id for aria wiring (Label/Field). Wraps React's `useId` and strips the\n * non-selector-safe colons React emits, prefixing for readability (default `cascivo`).\n */\nexport function useId(prefix = 'cascivo'): string {\n const id = useReactId()\n return `${prefix}-${id.replace(/:/g, '')}`\n}\n","'use client'\nimport { useRef } from 'react'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nexport interface UseClipboardOptions {\n /** How long `copied` stays true after a successful copy, in ms. */\n timeout?: number\n}\n\nexport interface UseClipboardReturn {\n copied: ReadonlySignal<boolean>\n copy: (text: string) => Promise<void>\n}\n\n/**\n * Copy-to-clipboard helper that de-dupes the inline logic in `copy-button`.\n * `copy(text)` writes via `navigator.clipboard.writeText`; `copied` flips true then resets after\n * `timeout`. The reset timer is cleared on unmount via `useSignalEffect` (no `useEffect`).\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardReturn {\n const { timeout = 2000 } = options\n const copied = useSignal(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useSignalEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n })\n\n const copy = async (text: string): Promise<void> => {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return\n await navigator.clipboard.writeText(text)\n copied.value = true\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n copied.value = false\n }, timeout)\n }\n\n return { copied, copy }\n}\n","'use client'\nimport { useControllableSignal } from './controllable.ts'\nimport type { ReadonlySignal } from './signals.ts'\n\nexport interface UseDisclosureOptions {\n /** Initial open state for uncontrolled use. */\n defaultOpen?: boolean\n /** Controlled open state. When provided, the parent owns the state. */\n isOpen?: boolean\n /** Called whenever open/close/toggle is requested. */\n onOpenChange?: (open: boolean) => void\n}\n\nexport interface UseDisclosureReturn {\n isOpen: ReadonlySignal<boolean>\n open: () => void\n close: () => void\n toggle: () => void\n}\n\n/**\n * Open/close state for overlays (modal, drawer, popover, …), replacing the\n * per-component `useSignal(open)` boilerplate. Backed by `useControllableSignal`\n * so it is controlled when `isOpen` is passed and uncontrolled otherwise.\n * Replaces HeroUI's `@heroui/use-disclosure`. No `useState`/`useEffect`.\n */\nexport function useDisclosure(options: UseDisclosureOptions = {}): UseDisclosureReturn {\n const { defaultOpen = false, isOpen, onOpenChange } = options\n const [open, setOpen] = useControllableSignal<boolean>({\n value: isOpen,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n\n return {\n isOpen: open,\n open: () => setOpen(true),\n close: () => setOpen(false),\n toggle: () => setOpen(!open.value),\n }\n}\n","'use client'\nimport { useRef, type RefObject } from 'react'\nimport { useSignal, useSignalEffect } from './signals.ts'\n\nexport interface UseInfiniteScrollOptions {\n /** Whether more items remain to load. */\n hasMore: boolean\n /** Called when the sentinel scrolls into view and `hasMore` is true. */\n onLoadMore: () => void\n /** Disable the observer without unmounting. Default true. */\n isEnabled?: boolean\n /** IntersectionObserver rootMargin (e.g. '200px' to prefetch early). */\n rootMargin?: string\n}\n\nexport interface UseInfiniteScrollReturn {\n /** Place on a trailing element at the end of the list. */\n sentinelRef: RefObject<HTMLElement | null>\n /** Optional scroll container; defaults to the viewport. */\n rootRef: RefObject<HTMLElement | null>\n}\n\n/**\n * Calls `onLoadMore` when a sentinel element scrolls into view, gated by\n * `hasMore`. Wires an `IntersectionObserver` inside `useSignalEffect` and\n * disconnects it on teardown. SSR/no-DOM safe. Replaces HeroUI's\n * `@heroui/use-infinite-scroll`. No `useState`/`useEffect`.\n */\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): UseInfiniteScrollReturn {\n const { rootMargin = '0px' } = options\n const sentinelRef = useRef<HTMLElement | null>(null)\n const rootRef = useRef<HTMLElement | null>(null)\n\n // Mirror props into signals so the effect re-attaches when `isEnabled` flips;\n // `hasMore`/`onLoadMore` stay current via signal/ref reads at intersection time.\n const enabled = useSignal(options.isEnabled ?? true)\n enabled.value = options.isEnabled ?? true\n const hasMore = useSignal(options.hasMore)\n hasMore.value = options.hasMore\n const onLoadMoreRef = useRef(options.onLoadMore)\n onLoadMoreRef.current = options.onLoadMore\n\n useSignalEffect(() => {\n const isEnabled = enabled.value\n const sentinel = sentinelRef.current\n if (!isEnabled || typeof IntersectionObserver === 'undefined' || !sentinel) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting && hasMore.value) onLoadMoreRef.current()\n },\n { root: rootRef.current ?? null, rootMargin },\n )\n observer.observe(sentinel)\n return () => observer.disconnect()\n })\n\n return { sentinelRef, rootRef }\n}\n","'use client'\nimport { useRef, type RefObject } from 'react'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nexport interface DragOffset {\n x: number\n y: number\n}\n\n/** Pointer velocity at drag end, in pixels per millisecond. Sign follows the drag direction. */\nexport interface DragVelocity {\n x: number\n y: number\n}\n\nexport interface UseDraggableOptions {\n isDisabled?: boolean\n onDragEnd?: (offset: DragOffset) => void\n /** Constrain dragging to an axis. Default 'both'. */\n axis?: 'x' | 'y' | 'both'\n}\n\nexport interface UseDraggableReturn {\n /** Attach to the drag handle (e.g. a modal header). */\n handleRef: RefObject<HTMLElement | null>\n /** Attach to the moved element; apply `offset` as a CSS translate. */\n targetRef: RefObject<HTMLElement | null>\n offset: ReadonlySignal<DragOffset>\n /**\n * Pointer velocity (px/ms) from the final ~100ms of the most recent drag.\n * Set immediately before `onDragEnd` fires, so callbacks can read it to drive\n * fling/flick decisions. Zeroed by `reset()`.\n */\n velocity: ReadonlySignal<DragVelocity>\n isDragging: ReadonlySignal<boolean>\n reset: () => void\n}\n\n/** Velocity is averaged over samples no older than this (ms) at pointer-up. */\nconst VELOCITY_WINDOW_MS = 100\n\n/**\n * Pointer-driven drag offset for overlays. Returns an `{ x, y }` offset signal\n * the caller applies as a CSS `translate` (no animation library). Attaches\n * pointer listeners in `useSignalEffect` and removes them on teardown.\n * SSR/no-DOM safe. Replaces HeroUI's `@heroui/use-draggable` (Framer-free).\n * No `useState`/`useEffect`.\n */\nexport function useDraggable(options: UseDraggableOptions = {}): UseDraggableReturn {\n const handleRef = useRef<HTMLElement | null>(null)\n const targetRef = useRef<HTMLElement | null>(null)\n const offset = useSignal<DragOffset>({ x: 0, y: 0 })\n const velocity = useSignal<DragVelocity>({ x: 0, y: 0 })\n const isDragging = useSignal(false)\n\n const disabled = useSignal(options.isDisabled ?? false)\n disabled.value = options.isDisabled ?? false\n const axisRef = useRef(options.axis ?? 'both')\n axisRef.current = options.axis ?? 'both'\n const onDragEndRef = useRef(options.onDragEnd)\n onDragEndRef.current = options.onDragEnd\n\n useSignalEffect(() => {\n const isDisabled = disabled.value\n if (isDisabled || typeof window === 'undefined') return\n\n let startX = 0\n let startY = 0\n let baseX = 0\n let baseY = 0\n let activeHandle: HTMLElement | null = null\n // Recent {t,x,y} pointer samples, used to estimate fling velocity at release.\n let samples: { t: number; x: number; y: number }[] = []\n\n const sample = (event: PointerEvent): void => {\n samples.push({ t: performance.now(), x: event.clientX, y: event.clientY })\n }\n const computeVelocity = (): DragVelocity => {\n const last = samples.at(-1)\n if (!last) return { x: 0, y: 0 }\n // Oldest sample still within the averaging window (or the first sample).\n const first = samples.find((s) => last.t - s.t <= VELOCITY_WINDOW_MS) ?? samples[0]\n if (!first) return { x: 0, y: 0 }\n const dt = last.t - first.t\n if (dt <= 0) return { x: 0, y: 0 }\n const axis = axisRef.current\n return {\n x: axis === 'y' ? 0 : (last.x - first.x) / dt,\n y: axis === 'x' ? 0 : (last.y - first.y) / dt,\n }\n }\n\n const onMove = (event: PointerEvent): void => {\n const axis = axisRef.current\n const dx = axis === 'y' ? 0 : event.clientX - startX\n const dy = axis === 'x' ? 0 : event.clientY - startY\n offset.value = { x: baseX + dx, y: baseY + dy }\n sample(event)\n }\n const onUp = (event: PointerEvent): void => {\n isDragging.value = false\n activeHandle?.releasePointerCapture?.(event.pointerId)\n activeHandle = null\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n window.removeEventListener('pointercancel', onUp)\n velocity.value = computeVelocity()\n onDragEndRef.current?.(offset.value)\n }\n // Listen on the window and resolve the handle lazily, so the handle element\n // need not be attached when this effect first runs — it may live deep inside\n // a portal/overlay whose ref commits after this hook's owner.\n const onDown = (event: PointerEvent): void => {\n const handle = handleRef.current\n const target = event.target\n if (!handle || !(target instanceof Node) || !handle.contains(target)) return\n activeHandle = handle\n startX = event.clientX\n startY = event.clientY\n baseX = offset.value.x\n baseY = offset.value.y\n samples = []\n sample(event)\n isDragging.value = true\n handle.setPointerCapture?.(event.pointerId)\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n window.addEventListener('pointercancel', onUp)\n }\n\n window.addEventListener('pointerdown', onDown)\n return () => {\n window.removeEventListener('pointerdown', onDown)\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n window.removeEventListener('pointercancel', onUp)\n }\n })\n\n return {\n handleRef,\n targetRef,\n offset,\n velocity,\n isDragging,\n reset: () => {\n offset.value = { x: 0, y: 0 }\n velocity.value = { x: 0, y: 0 }\n },\n }\n}\n","'use client'\nimport { useRef, type RefObject } from 'react'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nexport interface ElementSize {\n width: number\n height: number\n}\n\nexport interface UseResizeObserverOptions {\n /** Which box model to observe. Default 'content-box'. */\n box?: ResizeObserverBoxOptions\n}\n\nexport interface UseResizeObserverReturn<T extends Element> {\n /** Attach to the element whose size you want to track. */\n ref: RefObject<T | null>\n /** Latest content-box size, or null before the first observation. */\n size: ReadonlySignal<ElementSize | null>\n /** Latest raw ResizeObserverEntry, or null before the first observation. */\n entry: ReadonlySignal<ResizeObserverEntry | null>\n}\n\n/**\n * Observes an element's size with a `ResizeObserver`, exposing the latest size\n * as a signal. The declarative counterpart to Web Awesome's `wa-resize-observer`.\n * Wires the observer inside `useSignalEffect` and disconnects it on teardown.\n * SSR/no-DOM safe. No `useState`/`useEffect`.\n */\nexport function useResizeObserver<T extends Element = Element>(\n options: UseResizeObserverOptions = {},\n): UseResizeObserverReturn<T> {\n const ref = useRef<T | null>(null)\n const size = useSignal<ElementSize | null>(null)\n const entry = useSignal<ResizeObserverEntry | null>(null)\n\n const box = useSignal(options.box)\n box.value = options.box\n\n useSignalEffect(() => {\n const observeBox = box.value\n const el = ref.current\n if (!el || typeof ResizeObserver === 'undefined') return\n\n const observer = new ResizeObserver((entries) => {\n const next = entries[entries.length - 1]\n if (!next) return\n entry.value = next\n size.value = { width: next.contentRect.width, height: next.contentRect.height }\n })\n observer.observe(el, observeBox ? { box: observeBox } : undefined)\n return () => observer.disconnect()\n })\n\n return { ref, size, entry }\n}\n","'use client'\nimport { useRef, type RefObject } from 'react'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nexport interface UseMutationObserverReturn<T extends Node> {\n /** Attach to the node whose mutations you want to watch. */\n ref: RefObject<T | null>\n /** The records from the most recent mutation batch. */\n records: ReadonlySignal<MutationRecord[]>\n}\n\n/**\n * Watches a node's DOM tree with a `MutationObserver`, exposing the latest batch\n * of records as a signal. The declarative counterpart to Web Awesome's\n * `wa-mutation-observer`. Wires the observer inside `useSignalEffect` and\n * disconnects it on teardown. SSR/no-DOM safe. No `useState`/`useEffect`.\n *\n * `init` is read when the effect (re-)subscribes; pass a stable object or accept\n * that changing it between renders won't re-subscribe (mount-time semantics).\n */\nexport function useMutationObserver<T extends Node = Element>(\n init: MutationObserverInit = { childList: true },\n): UseMutationObserverReturn<T> {\n const ref = useRef<T | null>(null)\n const records = useSignal<MutationRecord[]>([])\n const initRef = useRef(init)\n initRef.current = init\n\n useSignalEffect(() => {\n const node = ref.current\n if (!node || typeof MutationObserver === 'undefined') return\n\n const observer = new MutationObserver((mutations) => {\n records.value = mutations\n })\n observer.observe(node, initRef.current)\n return () => observer.disconnect()\n })\n\n return { ref, records }\n}\n","'use client'\nimport { useRef, type RefObject } from 'react'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nexport interface UseIntersectionObserverOptions {\n root?: Element | Document | null\n rootMargin?: string\n threshold?: number | number[]\n}\n\nexport interface UseIntersectionObserverReturn<T extends Element> {\n /** Attach to the element whose visibility you want to track. */\n ref: RefObject<T | null>\n /** Latest IntersectionObserverEntry, or null before the first observation. */\n entry: ReadonlySignal<IntersectionObserverEntry | null>\n /** Whether the element is currently intersecting the root. */\n isIntersecting: ReadonlySignal<boolean>\n}\n\n/**\n * Tracks an element's visibility with an `IntersectionObserver`, exposing the\n * latest entry and an `isIntersecting` flag as signals. The declarative\n * counterpart to Web Awesome's `wa-intersection-observer`.\n *\n * This is the **generic** observer — for \"load more when a sentinel appears\"\n * use `useInfiniteScroll`, which adds `hasMore`/`onLoadMore` semantics on top.\n *\n * Wires the observer inside `useSignalEffect` and disconnects it on teardown.\n * SSR/no-DOM safe. No `useState`/`useEffect`.\n */\nexport function useIntersectionObserver<T extends Element = Element>(\n options: UseIntersectionObserverOptions = {},\n): UseIntersectionObserverReturn<T> {\n const { rootMargin = '0px', threshold = 0 } = options\n const ref = useRef<T | null>(null)\n const entry = useSignal<IntersectionObserverEntry | null>(null)\n const isIntersecting = useSignal(false)\n const rootRef = useRef(options.root ?? null)\n rootRef.current = options.root ?? null\n\n useSignalEffect(() => {\n const el = ref.current\n if (!el || typeof IntersectionObserver === 'undefined') return\n\n const observer = new IntersectionObserver(\n (entries) => {\n const next = entries[entries.length - 1]\n if (!next) return\n entry.value = next\n isIntersecting.value = next.isIntersecting\n },\n { root: rootRef.current, rootMargin, threshold },\n )\n observer.observe(el)\n return () => observer.disconnect()\n })\n\n return { ref, entry, isIntersecting }\n}\n","'use client'\nimport { useRef, type ReactNode } from 'react'\nimport { useSignalEffect, useSignals } from './signals.ts'\n\n// Module-level registry so nested layers (a dropdown inside a modal) dismiss top-first. Effects\n// mount child-first, so a stack would invert nesting; instead we resolve the top-most layer by DOM\n// depth — a layer responds only when no other mounted layer's root is nested inside its own root.\ninterface LayerEntry {\n getRoot: () => HTMLElement | null\n}\nconst layers: LayerEntry[] = []\n\nexport interface DismissableLayerProps {\n children: ReactNode\n /** Called when an outside pointer lands or Escape is pressed (when this is the top-most layer). */\n onDismiss?: () => void\n /** Disable the outside-pointer dismissal (Escape still works unless escapeDismisses is false). */\n disableOutsidePointer?: boolean\n /** Whether Escape dismisses the top-most layer. Default true. */\n escapeDismisses?: boolean\n}\n\n/**\n * Wraps its children and dismisses on an outside pointer press or Escape. One tested implementation\n * of the dismissal logic every overlay reinvents. Nested layers form a stack — only the top-most\n * responds to Escape and outside pointers. All listeners run inside `useSignalEffect`.\n */\nexport function DismissableLayer({\n children,\n onDismiss,\n disableOutsidePointer,\n escapeDismisses = true,\n}: DismissableLayerProps) {\n useSignals()\n const rootRef = useRef<HTMLDivElement>(null)\n const onDismissRef = useRef(onDismiss)\n onDismissRef.current = onDismiss\n\n useSignalEffect(() => {\n if (typeof document === 'undefined') return\n const entry: LayerEntry = { getRoot: () => rootRef.current }\n layers.push(entry)\n\n // Top-most = deepest in the DOM: no other mounted layer's root sits inside this one's root.\n const isTop = (): boolean => {\n const root = rootRef.current\n if (!root) return false\n for (const other of layers) {\n if (other === entry) continue\n const otherRoot = other.getRoot()\n if (otherRoot && root.contains(otherRoot)) return false\n }\n return true\n }\n\n const handlePointer = (event: PointerEvent): void => {\n if (disableOutsidePointer || !isTop()) return\n const root = rootRef.current\n if (!root) return\n if (event.target instanceof Node && !root.contains(event.target)) {\n onDismissRef.current?.()\n }\n }\n const handleKey = (event: KeyboardEvent): void => {\n if (!escapeDismisses || event.key !== 'Escape' || !isTop()) return\n onDismissRef.current?.()\n }\n\n document.addEventListener('pointerdown', handlePointer, true)\n document.addEventListener('keydown', handleKey)\n return () => {\n document.removeEventListener('pointerdown', handlePointer, true)\n document.removeEventListener('keydown', handleKey)\n const idx = layers.indexOf(entry)\n if (idx !== -1) layers.splice(idx, 1)\n }\n })\n\n return <div ref={rootRef}>{children}</div>\n}\n","'use client'\nimport { useRef } from 'react'\nimport { useSignal, type ReadonlySignal } from './signals.ts'\n\nexport type RovingOrientation = 'horizontal' | 'vertical' | 'both'\n\nexport interface UseRovingFocusOptions {\n orientation?: RovingOrientation\n /** Wrap focus from last→first and first→last. Default false. */\n loop?: boolean\n /** Initial active index. Default 0. */\n defaultIndex?: number\n}\n\nexport interface RovingItemProps {\n tabIndex: number\n onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void\n onFocus: () => void\n ref: (el: HTMLElement | null) => void\n}\n\nexport interface UseRovingFocusReturn {\n activeIndex: ReadonlySignal<number>\n getItemProps: (index: number) => RovingItemProps\n setActiveIndex: (index: number) => void\n}\n\n/**\n * Roving tabindex without context. The parent calls `useRovingFocus(...)` and spreads\n * `getItemProps(i)` onto each item. Only the active item is tabbable (`tabIndex={0}`); arrow keys\n * move focus (Home/End jump; `loop` wraps). State lives in a signal — the consuming component reads\n * it during render, so React apps must call `useSignals()` (per the project rule).\n */\nexport function useRovingFocus(options: UseRovingFocusOptions = {}): UseRovingFocusReturn {\n const { orientation = 'horizontal', loop = false, defaultIndex = 0 } = options\n const activeIndex = useSignal(defaultIndex)\n const itemsRef = useRef<(HTMLElement | null)[]>([])\n\n const focusIndex = (index: number): void => {\n activeIndex.value = index\n itemsRef.current[index]?.focus()\n }\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>, index: number): void => {\n const count = itemsRef.current.length\n if (count === 0) return\n const horizontal = orientation !== 'vertical'\n const vertical = orientation !== 'horizontal'\n let next = index\n if ((horizontal && event.key === 'ArrowRight') || (vertical && event.key === 'ArrowDown')) {\n next = index + 1\n } else if ((horizontal && event.key === 'ArrowLeft') || (vertical && event.key === 'ArrowUp')) {\n next = index - 1\n } else if (event.key === 'Home') {\n next = 0\n } else if (event.key === 'End') {\n next = count - 1\n } else {\n return\n }\n event.preventDefault()\n if (next < 0) next = loop ? count - 1 : 0\n if (next >= count) next = loop ? 0 : count - 1\n focusIndex(next)\n }\n\n const getItemProps = (index: number): RovingItemProps => ({\n tabIndex: activeIndex.value === index ? 0 : -1,\n onKeyDown: (event) => handleKeyDown(event, index),\n onFocus: () => {\n activeIndex.value = index\n },\n ref: (el) => {\n itemsRef.current[index] = el\n },\n })\n\n return {\n activeIndex,\n getItemProps,\n setActiveIndex: (index: number) => {\n activeIndex.value = index\n },\n }\n}\n","'use client'\nimport { cloneElement, isValidElement, useRef, type ReactElement, type Ref } from 'react'\nimport { useSignal, useSignalEffect, useSignals, type Signal } from './signals.ts'\nimport { composeRefs } from './utils.ts'\n\nexport interface PresenceProps {\n /** Whether the content should be present. Accepts a boolean or a Signal. */\n present: boolean | Signal<boolean>\n /** A single element child; receives `data-state=\"open|closed\"` and a composed ref. */\n children: ReactElement\n}\n\ntype ElementWithRef = ReactElement<Record<string, unknown>> & { ref?: Ref<unknown> }\n\n/**\n * Defers unmount until an exit animation/transition finishes. While `present` is true the child is\n * mounted with `data-state=\"open\"`; when it flips to false the child gets `data-state=\"closed\"` and\n * stays mounted until its `animationend`/`transitionend` fires (or unmounts immediately if there is\n * no animation). CSS drives the visuals via `data-state`; this only manages mount timing. No\n * `useEffect` — the present prop is mirrored into a signal and watched with `useSignalEffect`.\n */\nexport function Presence({ present, children }: PresenceProps) {\n useSignals()\n const presentVal = typeof present === 'boolean' ? present : present.value\n\n // Mirror the (boolean or signal) present value into a local signal so the effect reacts to both\n // prop changes (re-render) and signal changes.\n const presentSig = useSignal(presentVal)\n presentSig.value = presentVal\n\n const isMounted = useSignal(presentVal)\n const state = useSignal<'open' | 'closed'>(presentVal ? 'open' : 'closed')\n const nodeRef = useRef<HTMLElement | null>(null)\n\n useSignalEffect(() => {\n if (presentSig.value) {\n isMounted.value = true\n state.value = 'open'\n return\n }\n state.value = 'closed'\n const node = nodeRef.current\n if (!node || typeof getComputedStyle === 'undefined') {\n isMounted.value = false\n return\n }\n const styles = getComputedStyle(node)\n const animates =\n (styles.animationName !== 'none' &&\n styles.animationName !== '' &&\n styles.animationDuration !== '0s') ||\n (styles.transitionDuration !== '0s' && styles.transitionDuration !== '')\n if (!animates) {\n isMounted.value = false\n return\n }\n const handleEnd = (event: Event): void => {\n if (event.target === node) isMounted.value = false\n }\n node.addEventListener('animationend', handleEnd)\n node.addEventListener('transitionend', handleEnd)\n return () => {\n node.removeEventListener('animationend', handleEnd)\n node.removeEventListener('transitionend', handleEnd)\n }\n })\n\n if (!isMounted.value) return null\n if (!isValidElement(children)) {\n throw new Error('Presence expects a single valid React element child')\n }\n const child = children as ElementWithRef\n const childRef = (child.props['ref'] as Ref<unknown> | undefined) ?? child.ref\n return cloneElement(child, {\n 'data-state': state.value,\n ref: composeRefs(childRef, (el: HTMLElement | null) => {\n nodeRef.current = el\n }),\n } as Record<string, unknown>)\n}\n","'use client'\nimport { useRef } from 'react'\nimport { signal, useSignalEffect } from './signals.ts'\nimport type { ReadonlySignal } from './signals.ts'\n\nexport interface StreamBufferOptions {\n /** Maximum retained items. Oldest are evicted past this. Must be >= 1. */\n capacity: number\n /**\n * When to publish staged appends to `signal`.\n * - `'raf'` (default): coalesce all appends within an animation frame into a\n * single `signal` write — one render per frame regardless of append rate.\n * - `'sync'`: publish immediately on every append (deterministic; for tests).\n */\n flush?: 'raf' | 'sync'\n}\n\nexport interface StreamBuffer<T> {\n /** The current window, oldest-first. A fresh readonly array per flush. */\n readonly signal: ReadonlySignal<readonly T[]>\n /** Append one item. O(1); never reallocates the backing store. */\n append: (item: T) => void\n /** Append many items. O(items). Past `capacity`, only the newest are kept. */\n appendMany: (items: readonly T[]) => void\n /** Drop all items and publish an empty window. */\n clear: () => void\n /** Cancel any pending flush. Call on teardown so no write fires after unmount. */\n dispose: () => void\n /** Current item count (0..capacity). */\n readonly size: number\n /** The configured capacity. */\n readonly capacity: number\n}\n\n/**\n * A fixed-capacity ring buffer with O(1) append and once-per-frame flushing —\n * the primitive for high-frequency streams (build logs, live metrics).\n *\n * Memory is O(capacity), not O(total appended): the backing array is allocated\n * once and overwritten in place. A burst of N appends within one animation\n * frame produces a single `signal` write (one render), so ingestion rate is\n * decoupled from render rate.\n *\n * This replaces the O(n)-per-line anti-pattern\n * `logsSignal.value = [...logsSignal.value.slice(1), line]`, which reallocates\n * and re-copies the whole array on every append and renders once per line.\n */\nexport function createStreamBuffer<T>(options: StreamBufferOptions): StreamBuffer<T> {\n const { capacity, flush = 'raf' } = options\n if (!Number.isInteger(capacity) || capacity < 1) {\n throw new RangeError(`createStreamBuffer: capacity must be an integer >= 1, got ${capacity}`)\n }\n\n const ring = Array.from({ length: capacity }) as T[]\n let head = 0 // index of the oldest item\n let length = 0 // number of live items\n\n const view = signal<readonly T[]>([])\n let frame: number | null = null\n let scheduled = false\n\n const canRaf = typeof requestAnimationFrame !== 'undefined'\n\n function materialize(): readonly T[] {\n const out: T[] = []\n for (let i = 0; i < length; i++) out.push(ring[(head + i) % capacity] as T)\n return out\n }\n\n function publish(): void {\n scheduled = false\n frame = null\n view.value = materialize()\n }\n\n // A `scheduled` flag (not just `frame === null`) keeps coalescing correct even\n // if requestAnimationFrame runs the callback synchronously: publish() clears\n // the flag before this function's `frame = …` assignment lands.\n function schedule(): void {\n if (flush === 'sync' || !canRaf) {\n publish()\n return\n }\n if (!scheduled) {\n scheduled = true\n frame = requestAnimationFrame(publish)\n }\n }\n\n function pushOne(item: T): void {\n if (length < capacity) {\n ring[(head + length) % capacity] = item\n length++\n } else {\n // Full: overwrite the oldest and advance the window.\n ring[head] = item\n head = (head + 1) % capacity\n }\n }\n\n return {\n signal: view,\n append(item: T): void {\n pushOne(item)\n schedule()\n },\n appendMany(items: readonly T[]): void {\n if (items.length === 0) return\n // Past capacity, only the newest `capacity` items can survive.\n const start = items.length > capacity ? items.length - capacity : 0\n for (let i = start; i < items.length; i++) pushOne(items[i] as T)\n schedule()\n },\n clear(): void {\n head = 0\n length = 0\n schedule()\n },\n dispose(): void {\n if (frame !== null && canRaf) cancelAnimationFrame(frame)\n frame = null\n scheduled = false\n },\n get size(): number {\n return length\n },\n get capacity(): number {\n return capacity\n },\n }\n}\n\n/**\n * Component-scoped {@link createStreamBuffer}. Created once and stable across\n * renders; cancels any pending flush on unmount. Read `buffer.signal.value` in\n * render to subscribe the component to the stream.\n */\nexport function useStreamBuffer<T>(options: StreamBufferOptions): StreamBuffer<T> {\n const ref = useRef<StreamBuffer<T> | null>(null)\n ref.current ??= createStreamBuffer<T>(options)\n\n // Cancel a pending frame on unmount so no flush fires after teardown.\n useSignalEffect(() => () => ref.current?.dispose())\n\n return ref.current\n}\n","'use client'\nimport { useRef } from 'react'\nimport {\n computed as coreComputed,\n effect as coreEffect,\n signal as coreSignal,\n useSignalEffect,\n type ReadonlySignal,\n type Signal,\n} from './signals.ts'\n\nexport interface SignalScope {\n /** Create a signal. Owned by the scope (dropped on dispose). */\n signal: <T>(value: T) => Signal<T>\n /** Create a computed. Owned by the scope. */\n computed: <T>(fn: () => T) => ReadonlySignal<T>\n /** Create an effect. Its subscription is torn down by `dispose()`. */\n effect: (fn: () => void | (() => void)) => () => void\n /** Tear down every owned effect. Idempotent. */\n dispose: () => void\n /** True once disposed. */\n readonly disposed: boolean\n}\n\n/**\n * A disposable owner for a set of signals/computeds/effects. Use one scope per\n * tenant boundary — a workspace, an org, a repository group. When the user\n * switches scope, call `dispose()` and create a fresh scope: every effect the\n * old scope started stops firing at once, with no orphaned subscriptions or\n * stale state left running against unmounted UI.\n *\n * This is a thin ownership wrapper over `@cascivo/core` signals — not a store,\n * not a context, not a DI container. Prefer it over accumulating per-workspace\n * state in a single global signal root, which leaks effects across switches.\n */\nexport function createScope(): SignalScope {\n const disposers = new Set<() => void>()\n let disposed = false\n\n return {\n signal: (value) => coreSignal(value),\n computed: (fn) => coreComputed(fn),\n effect: (fn) => {\n if (disposed) return () => {}\n const stop = coreEffect(fn)\n disposers.add(stop)\n return () => {\n disposers.delete(stop)\n stop()\n }\n },\n dispose: () => {\n if (disposed) return\n disposed = true\n for (const stop of disposers) stop()\n disposers.clear()\n },\n get disposed(): boolean {\n return disposed\n },\n }\n}\n\n/**\n * Bind a {@link createScope} to a component's lifetime: created once on mount,\n * disposed on unmount. The scope's effects stop when the component unmounts.\n */\nexport function useScope(): SignalScope {\n const ref = useRef<SignalScope | null>(null)\n ref.current ??= createScope()\n\n useSignalEffect(() => () => ref.current?.dispose())\n\n return ref.current\n}\n","'use client'\nimport { type CSSProperties, type RefObject } from 'react'\nimport { useSignal, useSignalEffect, useSignals, type Signal } from './signals.ts'\nimport { useId } from './use-id.ts'\n\nexport type AnchorSide = 'top' | 'bottom' | 'left' | 'right'\nexport type AnchorAlign = 'start' | 'center' | 'end'\nexport type AnchorPlacement = AnchorSide | `${AnchorSide}-${'start' | 'end'}`\n\nexport interface UseAnchorPositionOptions {\n anchorRef: RefObject<HTMLElement | null>\n floatingRef: RefObject<HTMLElement | null>\n placement?: AnchorPlacement\n /** Gate positioning (e.g. only while open). Default true. */\n enabled?: boolean | Signal<boolean>\n}\n\nexport interface UseAnchorPositionReturn {\n /** Spread onto the anchor element (CSS-anchor path sets `anchor-name`). */\n anchorStyle: CSSProperties\n /** Spread onto the floating element. */\n floatingStyle: CSSProperties\n /** Whether the CSS anchor-positioning primary path is active. */\n cssAnchorSupported: boolean\n}\n\nfunction supportsCssAnchor(): boolean {\n return (\n typeof CSS !== 'undefined' &&\n typeof CSS.supports === 'function' &&\n CSS.supports('anchor-name: --x')\n )\n}\n\nfunction parsePlacement(placement: AnchorPlacement): { side: AnchorSide; align: AnchorAlign } {\n const [side, end] = placement.split('-') as [AnchorSide, 'start' | 'end' | undefined]\n return { side, align: end ?? 'center' }\n}\n\n/** JS fallback math — position `floating` relative to `anchor` for the given placement. */\nexport function computePosition(\n anchor: {\n top: number\n left: number\n right: number\n bottom: number\n width: number\n height: number\n },\n floating: { width: number; height: number },\n placement: AnchorPlacement,\n): { top: number; left: number } {\n const { side, align } = parsePlacement(placement)\n let top = 0\n let left = 0\n if (side === 'top' || side === 'bottom') {\n top = side === 'bottom' ? anchor.bottom : anchor.top - floating.height\n left =\n align === 'start'\n ? anchor.left\n : align === 'end'\n ? anchor.right - floating.width\n : anchor.left + (anchor.width - floating.width) / 2\n } else {\n left = side === 'right' ? anchor.right : anchor.left - floating.width\n top =\n align === 'start'\n ? anchor.top\n : align === 'end'\n ? anchor.bottom - floating.height\n : anchor.top + (anchor.height - floating.height) / 2\n }\n return { top, left }\n}\n\nfunction cssAnchorInsets(side: AnchorSide, align: AnchorAlign): CSSProperties {\n const style: CSSProperties = {\n position: 'fixed',\n insetBlockStart: 'auto',\n insetInlineStart: 'auto',\n }\n if (side === 'bottom') style.top = 'anchor(bottom)'\n if (side === 'top') style.bottom = 'anchor(top)'\n if (side === 'right') style.left = 'anchor(right)'\n if (side === 'left') style.right = 'anchor(left)'\n if (side === 'top' || side === 'bottom') {\n style.left = align === 'end' ? undefined : align === 'start' ? 'anchor(left)' : 'anchor(center)'\n if (align === 'end') style.right = 'anchor(right)'\n } else {\n style.top = align === 'end' ? undefined : align === 'start' ? 'anchor(top)' : 'anchor(center)'\n if (align === 'end') style.bottom = 'anchor(bottom)'\n }\n return style\n}\n\n/**\n * Positions a floating element relative to an anchor. Primary path: CSS anchor positioning\n * (Chrome-leading) — emits `anchor-name`/`position-anchor` + `anchor()` insets. Fallback (behind\n * `CSS.supports`): JS `getBoundingClientRect` placement recomputed on scroll/resize inside\n * `useSignalEffect`. Small by design — not a collision/flip engine (deferred).\n */\nexport function useAnchorPosition(options: UseAnchorPositionOptions): UseAnchorPositionReturn {\n const { anchorRef, floatingRef, placement = 'bottom', enabled = true } = options\n useSignals()\n const supported = supportsCssAnchor()\n const name = useId('anchor')\n const pos = useSignal<{ top: number; left: number } | null>(null)\n\n useSignalEffect(() => {\n const isEnabled = typeof enabled === 'boolean' ? enabled : enabled.value\n if (supported || !isEnabled || typeof window === 'undefined') return\n\n const update = (): void => {\n const a = anchorRef.current\n const f = floatingRef.current\n if (!a || !f) return\n pos.value = computePosition(a.getBoundingClientRect(), f.getBoundingClientRect(), placement)\n }\n update()\n window.addEventListener('scroll', update, true)\n window.addEventListener('resize', update)\n return () => {\n window.removeEventListener('scroll', update, true)\n window.removeEventListener('resize', update)\n }\n })\n\n if (supported) {\n const { side, align } = parsePlacement(placement)\n return {\n anchorStyle: { anchorName: `--${name}` } as CSSProperties,\n floatingStyle: {\n positionAnchor: `--${name}`,\n ...cssAnchorInsets(side, align),\n } as CSSProperties,\n cssAnchorSupported: true,\n }\n }\n\n const p = pos.value\n return {\n anchorStyle: {},\n floatingStyle: p\n ? { position: 'fixed', top: p.top, left: p.left }\n : { position: 'fixed', visibility: 'hidden' },\n cssAnchorSupported: false,\n }\n}\n","export { createMachine, useMachine } from './machine.ts'\nexport {\n signal,\n computed,\n effect,\n batch,\n useSignal,\n useComputed,\n useSignalEffect,\n useSignals,\n} from './signals.ts'\nexport type { Signal, ReadonlySignal } from './signals.ts'\nexport { cn, composeRefs, mergeProps } from './utils.ts'\nexport type {\n Machine,\n MachineConfig,\n StateConfig,\n ComponentMeta,\n PropMeta,\n TypeFieldMeta,\n TypeDefMeta,\n AccessibilityMeta,\n WcagLevel,\n ExampleMeta,\n ComponentIntent,\n IntentAntiPattern,\n IntentRelated,\n IntentFlexibility,\n IntentContent,\n IntentRelationship,\n} from './types.ts'\nexport const VERSION = '0.0.0'\nexport { ErrorBoundary } from './error-boundary.tsx'\nexport type { ErrorBoundaryProps } from './error-boundary.tsx'\nexport { SuspenseBoundary } from './suspense-boundary.tsx'\nexport type { SuspenseBoundaryProps } from './suspense-boundary.tsx'\nexport { Portal } from './portal.tsx'\nexport type { PortalProps } from './portal.tsx'\nexport { VisuallyHidden } from './visually-hidden.tsx'\nexport type { VisuallyHiddenProps } from './visually-hidden.tsx'\nexport { FocusScope } from './focus-scope.tsx'\nexport type { FocusScopeProps } from './focus-scope.tsx'\nexport { Slot } from './slot.tsx'\nexport type { SlotProps } from './slot.tsx'\nexport { useControllableSignal } from './controllable.ts'\nexport type { UseControllableSignalOptions } from './controllable.ts'\nexport { useMediaQuery } from './media-query.ts'\nexport { useScrollLock } from './scroll-lock.ts'\nexport { useId } from './use-id.ts'\nexport { useClipboard } from './clipboard.ts'\nexport type { UseClipboardOptions, UseClipboardReturn } from './clipboard.ts'\nexport { useDisclosure } from './disclosure.ts'\nexport type { UseDisclosureOptions, UseDisclosureReturn } from './disclosure.ts'\nexport { useInfiniteScroll } from './infinite-scroll.ts'\nexport type { UseInfiniteScrollOptions, UseInfiniteScrollReturn } from './infinite-scroll.ts'\nexport { useDraggable } from './draggable.ts'\nexport type {\n DragOffset,\n DragVelocity,\n UseDraggableOptions,\n UseDraggableReturn,\n} from './draggable.ts'\nexport { useResizeObserver } from './resize-observer.ts'\nexport type {\n ElementSize,\n UseResizeObserverOptions,\n UseResizeObserverReturn,\n} from './resize-observer.ts'\nexport { useMutationObserver } from './mutation-observer.ts'\nexport type { UseMutationObserverReturn } from './mutation-observer.ts'\nexport { useIntersectionObserver } from './intersection-observer.ts'\nexport type {\n UseIntersectionObserverOptions,\n UseIntersectionObserverReturn,\n} from './intersection-observer.ts'\nexport { DismissableLayer } from './dismissable-layer.tsx'\nexport type { DismissableLayerProps } from './dismissable-layer.tsx'\nexport { useRovingFocus } from './roving-focus.ts'\nexport type {\n UseRovingFocusOptions,\n UseRovingFocusReturn,\n RovingItemProps,\n RovingOrientation,\n} from './roving-focus.ts'\nexport { Presence } from './presence.tsx'\nexport type { PresenceProps } from './presence.tsx'\nexport { createStreamBuffer, useStreamBuffer } from './stream-buffer.ts'\nexport type { StreamBuffer, StreamBufferOptions } from './stream-buffer.ts'\nexport { createScope, useScope } from './scope.ts'\nexport type { SignalScope } from './scope.ts'\nexport { useAnchorPosition, computePosition } from './anchor.tsx'\nexport type {\n UseAnchorPositionOptions,\n UseAnchorPositionReturn,\n AnchorPlacement,\n AnchorSide,\n AnchorAlign,\n} from './anchor.tsx'\n"],"mappings":";;;;;;AAGA,SAAgB,cACd,QACY;CACZ,OAAO;AACT;AAEA,SAAgB,WAA6B,SAAqB;CAChE,MAAM,QAAQA,YAAa,QAAQ,OAAO;CAC1C,MAAM,QAAQ,UAAkB;EAC9B,MAAM,OAAO,QAAQ,OAAO,MAAM,MAAM,EAAE,KAAK;EAC/C,IAAI,SAAS,KAAA,GAAW,MAAM,QAAQ;CACxC;CACA,OAAO,CAAC,OAAO,IAAI;AACrB;;;ACdA,SAAgB,GAAG,GAAG,SAA4D;CAChF,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACzC;AAEA,SAAgB,YAAe,GAAG,MAA8C;CAC9E,QAAQ,UAAU;EAChB,KAAK,SAAS,QAAQ;GACpB,IAAI,CAAC,KAAK;GACV,IAAI,OAAO,QAAQ,YACjB,IAAI,KAAK;QAER,IAAoC,UAAU;EAEnD,CAAC;CACH;AACF;AAIA,SAAgB,WAA8C,GAAG,WAA4B;CAC3F,MAAM,SAAkC,CAAC;CACzC,KAAK,MAAM,SAAS,WAClB,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,KAAK,GAC3C,IAAI,IAAI,WAAW,IAAI,KAAK,OAAO,QAAQ,cAAc,OAAO,OAAO,SAAS,YAAY;EAC1F,MAAM,WAAW,OAAO;EACxB,OAAO,QAAQ,GAAG,SAAoB;GACpC,SAAS,GAAG,IAAI;GACf,IAAsB,GAAG,IAAI;EAChC;CACF,OACE,OAAO,OAAO;CAIpB,OAAO;AACT;;;ACzBA,IAAa,gBAAb,cAAmC,UAAqC;CACtE,QAAe,EAAE,OAAO,KAAK;CAE7B,OAAO,yBAAyB,OAAqB;EACnD,OAAO,EAAE,MAAM;CACjB;CAEA,kBAAkB,OAAc,MAAiB;EAC/C,KAAK,MAAM,UAAU,OAAO,IAAI;CAClC;CAEA,cAAc;EACZ,KAAK,SAAS,EAAE,OAAO,KAAK,CAAC;CAC/B;CAEA,SAAS;EACP,MAAM,EAAE,UAAU,KAAK;EACvB,IAAI,UAAU,MAAM;GAClB,MAAM,EAAE,aAAa,KAAK;GAC1B,OAAO,OAAO,aAAa,aAAa,SAAS,OAAO,KAAK,KAAK,IAAI;EACxE;EACA,OAAO,KAAK,MAAM;CACpB;AACF;;;AC5BA,SAAgB,iBAAiB,EAAE,UAAU,YAAmC;CAC9E,OACE,oBAAC,UAAD;EAAU,UAAU,YAAY,oBAAC,QAAD;GAAM,aAAU;GAAO,cAAW;EAAW,CAAA;EAC1E;CACO,CAAA;AAEd;;;ACHA,SAAgB,OAAO,EAAE,UAAU,aAA0B;CAC3D,WAAW;CACX,MAAM,UAAU,UAAU,KAAK;CAC/B,MAAM,eAAe,OAA0C,IAAI;CAEnE,sBAAsB;EACpB,IAAI,OAAO,aAAa,aAAa;EACrC,aAAa,UAAU,aAAa,SAAS;EAC7C,QAAQ,QAAQ;EAChB,aAAa;GACX,QAAQ,QAAQ;EAClB;CACF,CAAC;CAED,IAAI,CAAC,QAAQ,SAAS,aAAa,YAAY,MAAM,OAAO;CAC5D,OAAO,aAAa,UAAU,aAAa,OAAO;AACpD;;;;;;;;;AClBA,SAAgB,eAAe,EAC7B,UACA,aACA,WACA,GAAG,SACmB;CAItB,OACE,oBAAC,QAAD;EAAM,WAJQ;GAACC,+BAAO;GAAM,eAAeA,+BAAO;GAAW;EAAS,CAAC,CACtE,OAAO,OAAO,CAAC,CACf,KAAK,GAEiB;EAAG,GAAI;EAC3B;CACG,CAAA;AAEV;;;AClBA,MAAM,YACJ;AASF,SAAgB,WAAW,EAAE,UAAU,SAAS,cAAc,aAA8B;CAC1F,WAAW;CACX,MAAM,eAAe,OAAuB,IAAI;CAChD,MAAM,mBAAmB,OAAuB,IAAI;CAEpD,sBAAsB;EACpB,MAAM,YAAY,aAAa;EAC/B,IAAI,CAAC,WAAW;EAChB,IAAI,cAAc,iBAAiB,UAAU,SAAS;EACtD,IAAI,WAEF,UADwB,cAA2B,SAC/C,CAAC,EAAE,MAAM;EAEf,IAAI,CAAC,SAAS;EACd,SAAS,cAAc,GAAkB;GACvC,IAAI,EAAE,QAAQ,OAAO;GACrB,MAAM,YAAY,MAAM,KAAK,UAAW,iBAA8B,SAAS,CAAC;GAChF,IAAI,UAAU,WAAW,GAAG;GAC5B,MAAM,QAAQ,UAAU;GACxB,MAAM,OAAO,UAAU,UAAU,SAAS;GAC1C,IAAI,EAAE;QACA,SAAS,kBAAkB,OAAO;KACpC,EAAE,eAAe;KACjB,KAAK,MAAM;IACb;UAEA,IAAI,SAAS,kBAAkB,MAAM;IACnC,EAAE,eAAe;IACjB,MAAM,MAAM;GACd;EAEJ;EACA,SAAS,iBAAiB,WAAW,aAAa;EAClD,aAAa;GACX,SAAS,oBAAoB,WAAW,aAAa;GACrD,IAAI,gBAAgB,iBAAiB,mBAAmB,aACtD,iBAAiB,QAAQ,MAAM;EAEnC;CACF,CAAC;CAED,OAAO,oBAAC,OAAD;EAAK,KAAK;EAAe;CAAc,CAAA;AAChD;;;;;;;;;;;;;;;ACtBA,MAAa,OAAO,WAA+B,SAAS,KAAK,OAAO,cAAc;CACpF,MAAM,EAAE,UAAU,WAAW,eAAe,OAAO,WAAW,GAAG,cAAc;CAE/E,IAAI,CAAC,eAAe,QAAQ,KAAK,SAAS,MAAM,QAAQ,MAAM,GAC5D,MAAM,IAAI,MACR,yFACF;CAGF,MAAM,QAAQ;CACd,MAAM,aAAa,MAAM;CACzB,MAAM,SAAS,WAAoC,WAAW,UAAU;CAExE,OAAO,eAAe,GACpB,eACA,WAAW,YACb;CACA,OAAO,WAAW;EAChB,GAAI;EACJ,GAAI,WAAW;CACjB;CAIA,OAAO,SAAS,YAAY,cADV,WAAW,UAAuC,MAAM,GACxB;CAElD,OAAO,aAAa,OAAO,MAAM;AACnC,CAAC;;;;;;;;;;;;;;;;ACnCD,SAAgB,sBACd,SACgC;CAChC,MAAM,EAAE,OAAO,cAAc,aAAa;CAC1C,MAAM,eAAe,UAAU,KAAA;CAE/B,MAAM,MAAM,UAAc,eAAe,QAAQ,YAAkB;CAGnE,MAAM,cAAc,OAAO,QAAQ;CACnC,YAAY,UAAU;CAGtB,IAAI,cAAc,IAAI,QAAQ;CAE9B,MAAM,YAAY,SAAkB;EAClC,IAAI,CAAC,cAAc,IAAI,QAAQ;EAC/B,YAAY,UAAU,IAAI;CAC5B;CAEA,OAAO,CAAC,KAAK,QAAQ;AACvB;;;AC5CA,SAAS,aAAa,OAAwB;CAC5C,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY,OAAO;CACrF,OAAO,OAAO,WAAW,KAAK,CAAC,CAAC;AAClC;;;;;;AAOA,SAAgB,cAAc,OAAwC;CACpE,MAAM,UAAU,UAAU,aAAa,KAAK,CAAC;CAE7C,sBAAsB;EACpB,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;EAC9E,MAAM,MAAM,OAAO,WAAW,KAAK;EACnC,QAAQ,QAAQ,IAAI;EACpB,MAAM,WAAW,UAAqC;GACpD,QAAQ,QAAQ,MAAM;EACxB;EACA,IAAI,iBAAiB,UAAU,OAAO;EACtC,aAAa,IAAI,oBAAoB,UAAU,OAAO;CACxD,CAAC;CAED,OAAO;AACT;;;;;;;;ACpBA,SAAgB,cAAc,QAAyC;CACrE,sBAAsB;EAEpB,IAAI,EADa,OAAO,WAAW,YAAY,SAAS,OAAO,UAC9C,OAAO,aAAa,aAAa;EAElD,MAAM,OAAO,SAAS;EACtB,MAAM,eAAe,KAAK,MAAM;EAChC,MAAM,uBAAuB,KAAK,MAAM;EAExC,MAAM,iBAAiB,OAAO,aAAa,SAAS,gBAAgB;EACpE,KAAK,MAAM,WAAW;EACtB,IAAI,iBAAiB,GAAG;GACtB,MAAM,UAAU,OAAO,SAAS,OAAO,iBAAiB,IAAI,CAAC,CAAC,kBAAkB,EAAE,KAAK;GACvF,KAAK,MAAM,mBAAmB,GAAG,UAAU,eAAe;EAC5D;EAEA,aAAa;GACX,KAAK,MAAM,WAAW;GACtB,KAAK,MAAM,mBAAmB;EAChC;CACF,CAAC;AACH;;;;;;;ACtBA,SAAgB,MAAM,SAAS,WAAmB;CAEhD,OAAO,GAAG,OAAO,GADNC,QACU,CAAC,CAAC,QAAQ,MAAM,EAAE;AACzC;;;;;;;;ACSA,SAAgB,aAAa,UAA+B,CAAC,GAAuB;CAClF,MAAM,EAAE,UAAU,QAAS;CAC3B,MAAM,SAAS,UAAU,KAAK;CAC9B,MAAM,WAAW,OAA6C,IAAI;CAElE,sBAAsB;EACpB,aAAa;GACX,IAAI,SAAS,SAAS,aAAa,SAAS,OAAO;EACrD;CACF,CAAC;CAED,MAAM,OAAO,OAAO,SAAgC;EAClD,IAAI,OAAO,cAAc,eAAe,CAAC,UAAU,WAAW;EAC9D,MAAM,UAAU,UAAU,UAAU,IAAI;EACxC,OAAO,QAAQ;EACf,IAAI,SAAS,SAAS,aAAa,SAAS,OAAO;EACnD,SAAS,UAAU,iBAAiB;GAClC,OAAO,QAAQ;EACjB,GAAG,OAAO;CACZ;CAEA,OAAO;EAAE;EAAQ;CAAK;AACxB;;;;;;;;;ACfA,SAAgB,cAAc,UAAgC,CAAC,GAAwB;CACrF,MAAM,EAAE,cAAc,OAAO,QAAQ,iBAAiB;CACtD,MAAM,CAAC,MAAM,WAAW,sBAA+B;EACrD,OAAO;EACP,cAAc;EACd,UAAU;CACZ,CAAC;CAED,OAAO;EACL,QAAQ;EACR,YAAY,QAAQ,IAAI;EACxB,aAAa,QAAQ,KAAK;EAC1B,cAAc,QAAQ,CAAC,KAAK,KAAK;CACnC;AACF;;;;;;;;;ACZA,SAAgB,kBAAkB,SAA4D;CAC5F,MAAM,EAAE,aAAa,UAAU;CAC/B,MAAM,cAAc,OAA2B,IAAI;CACnD,MAAM,UAAU,OAA2B,IAAI;CAI/C,MAAM,UAAU,UAAU,QAAQ,aAAa,IAAI;CACnD,QAAQ,QAAQ,QAAQ,aAAa;CACrC,MAAM,UAAU,UAAU,QAAQ,OAAO;CACzC,QAAQ,QAAQ,QAAQ;CACxB,MAAM,gBAAgB,OAAO,QAAQ,UAAU;CAC/C,cAAc,UAAU,QAAQ;CAEhC,sBAAsB;EACpB,MAAM,YAAY,QAAQ;EAC1B,MAAM,WAAW,YAAY;EAC7B,IAAI,CAAC,aAAa,OAAO,yBAAyB,eAAe,CAAC,UAAU;EAE5E,MAAM,WAAW,IAAI,sBAClB,YAAY;GACX,IAAI,QAAQ,EAAE,EAAE,kBAAkB,QAAQ,OAAO,cAAc,QAAQ;EACzE,GACA;GAAE,MAAM,QAAQ,WAAW;GAAM;EAAW,CAC9C;EACA,SAAS,QAAQ,QAAQ;EACzB,aAAa,SAAS,WAAW;CACnC,CAAC;CAED,OAAO;EAAE;EAAa;CAAQ;AAChC;;;;ACnBA,MAAM,qBAAqB;;;;;;;;AAS3B,SAAgB,aAAa,UAA+B,CAAC,GAAuB;CAClF,MAAM,YAAY,OAA2B,IAAI;CACjD,MAAM,YAAY,OAA2B,IAAI;CACjD,MAAM,SAAS,UAAsB;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;CACnD,MAAM,WAAW,UAAwB;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;CACvD,MAAM,aAAa,UAAU,KAAK;CAElC,MAAM,WAAW,UAAU,QAAQ,cAAc,KAAK;CACtD,SAAS,QAAQ,QAAQ,cAAc;CACvC,MAAM,UAAU,OAAO,QAAQ,QAAQ,MAAM;CAC7C,QAAQ,UAAU,QAAQ,QAAQ;CAClC,MAAM,eAAe,OAAO,QAAQ,SAAS;CAC7C,aAAa,UAAU,QAAQ;CAE/B,sBAAsB;EAEpB,IADmB,SAAS,SACV,OAAO,WAAW,aAAa;EAEjD,IAAI,SAAS;EACb,IAAI,SAAS;EACb,IAAI,QAAQ;EACZ,IAAI,QAAQ;EACZ,IAAI,eAAmC;EAEvC,IAAI,UAAiD,CAAC;EAEtD,MAAM,UAAU,UAA8B;GAC5C,QAAQ,KAAK;IAAE,GAAG,YAAY,IAAI;IAAG,GAAG,MAAM;IAAS,GAAG,MAAM;GAAQ,CAAC;EAC3E;EACA,MAAM,wBAAsC;GAC1C,MAAM,OAAO,QAAQ,GAAG,EAAE;GAC1B,IAAI,CAAC,MAAM,OAAO;IAAE,GAAG;IAAG,GAAG;GAAE;GAE/B,MAAM,QAAQ,QAAQ,MAAM,MAAM,KAAK,IAAI,EAAE,KAAK,kBAAkB,KAAK,QAAQ;GACjF,IAAI,CAAC,OAAO,OAAO;IAAE,GAAG;IAAG,GAAG;GAAE;GAChC,MAAM,KAAK,KAAK,IAAI,MAAM;GAC1B,IAAI,MAAM,GAAG,OAAO;IAAE,GAAG;IAAG,GAAG;GAAE;GACjC,MAAM,OAAO,QAAQ;GACrB,OAAO;IACL,GAAG,SAAS,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK;IAC3C,GAAG,SAAS,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK;GAC7C;EACF;EAEA,MAAM,UAAU,UAA8B;GAC5C,MAAM,OAAO,QAAQ;GACrB,MAAM,KAAK,SAAS,MAAM,IAAI,MAAM,UAAU;GAC9C,MAAM,KAAK,SAAS,MAAM,IAAI,MAAM,UAAU;GAC9C,OAAO,QAAQ;IAAE,GAAG,QAAQ;IAAI,GAAG,QAAQ;GAAG;GAC9C,OAAO,KAAK;EACd;EACA,MAAM,QAAQ,UAA8B;GAC1C,WAAW,QAAQ;GACnB,cAAc,wBAAwB,MAAM,SAAS;GACrD,eAAe;GACf,OAAO,oBAAoB,eAAe,MAAM;GAChD,OAAO,oBAAoB,aAAa,IAAI;GAC5C,OAAO,oBAAoB,iBAAiB,IAAI;GAChD,SAAS,QAAQ,gBAAgB;GACjC,aAAa,UAAU,OAAO,KAAK;EACrC;EAIA,MAAM,UAAU,UAA8B;GAC5C,MAAM,SAAS,UAAU;GACzB,MAAM,SAAS,MAAM;GACrB,IAAI,CAAC,UAAU,EAAE,kBAAkB,SAAS,CAAC,OAAO,SAAS,MAAM,GAAG;GACtE,eAAe;GACf,SAAS,MAAM;GACf,SAAS,MAAM;GACf,QAAQ,OAAO,MAAM;GACrB,QAAQ,OAAO,MAAM;GACrB,UAAU,CAAC;GACX,OAAO,KAAK;GACZ,WAAW,QAAQ;GACnB,OAAO,oBAAoB,MAAM,SAAS;GAC1C,OAAO,iBAAiB,eAAe,MAAM;GAC7C,OAAO,iBAAiB,aAAa,IAAI;GACzC,OAAO,iBAAiB,iBAAiB,IAAI;EAC/C;EAEA,OAAO,iBAAiB,eAAe,MAAM;EAC7C,aAAa;GACX,OAAO,oBAAoB,eAAe,MAAM;GAChD,OAAO,oBAAoB,eAAe,MAAM;GAChD,OAAO,oBAAoB,aAAa,IAAI;GAC5C,OAAO,oBAAoB,iBAAiB,IAAI;EAClD;CACF,CAAC;CAED,OAAO;EACL;EACA;EACA;EACA;EACA;EACA,aAAa;GACX,OAAO,QAAQ;IAAE,GAAG;IAAG,GAAG;GAAE;GAC5B,SAAS,QAAQ;IAAE,GAAG;IAAG,GAAG;GAAE;EAChC;CACF;AACF;;;;;;;;;ACzHA,SAAgB,kBACd,UAAoC,CAAC,GACT;CAC5B,MAAM,MAAM,OAAiB,IAAI;CACjC,MAAM,OAAO,UAA8B,IAAI;CAC/C,MAAM,QAAQ,UAAsC,IAAI;CAExD,MAAM,MAAM,UAAU,QAAQ,GAAG;CACjC,IAAI,QAAQ,QAAQ;CAEpB,sBAAsB;EACpB,MAAM,aAAa,IAAI;EACvB,MAAM,KAAK,IAAI;EACf,IAAI,CAAC,MAAM,OAAO,mBAAmB,aAAa;EAElD,MAAM,WAAW,IAAI,gBAAgB,YAAY;GAC/C,MAAM,OAAO,QAAQ,QAAQ,SAAS;GACtC,IAAI,CAAC,MAAM;GACX,MAAM,QAAQ;GACd,KAAK,QAAQ;IAAE,OAAO,KAAK,YAAY;IAAO,QAAQ,KAAK,YAAY;GAAO;EAChF,CAAC;EACD,SAAS,QAAQ,IAAI,aAAa,EAAE,KAAK,WAAW,IAAI,KAAA,CAAS;EACjE,aAAa,SAAS,WAAW;CACnC,CAAC;CAED,OAAO;EAAE;EAAK;EAAM;CAAM;AAC5B;;;;;;;;;;;;ACnCA,SAAgB,oBACd,OAA6B,EAAE,WAAW,KAAK,GACjB;CAC9B,MAAM,MAAM,OAAiB,IAAI;CACjC,MAAM,UAAU,UAA4B,CAAC,CAAC;CAC9C,MAAM,UAAU,OAAO,IAAI;CAC3B,QAAQ,UAAU;CAElB,sBAAsB;EACpB,MAAM,OAAO,IAAI;EACjB,IAAI,CAAC,QAAQ,OAAO,qBAAqB,aAAa;EAEtD,MAAM,WAAW,IAAI,kBAAkB,cAAc;GACnD,QAAQ,QAAQ;EAClB,CAAC;EACD,SAAS,QAAQ,MAAM,QAAQ,OAAO;EACtC,aAAa,SAAS,WAAW;CACnC,CAAC;CAED,OAAO;EAAE;EAAK;CAAQ;AACxB;;;;;;;;;;;;;;ACVA,SAAgB,wBACd,UAA0C,CAAC,GACT;CAClC,MAAM,EAAE,aAAa,OAAO,YAAY,MAAM;CAC9C,MAAM,MAAM,OAAiB,IAAI;CACjC,MAAM,QAAQ,UAA4C,IAAI;CAC9D,MAAM,iBAAiB,UAAU,KAAK;CACtC,MAAM,UAAU,OAAO,QAAQ,QAAQ,IAAI;CAC3C,QAAQ,UAAU,QAAQ,QAAQ;CAElC,sBAAsB;EACpB,MAAM,KAAK,IAAI;EACf,IAAI,CAAC,MAAM,OAAO,yBAAyB,aAAa;EAExD,MAAM,WAAW,IAAI,sBAClB,YAAY;GACX,MAAM,OAAO,QAAQ,QAAQ,SAAS;GACtC,IAAI,CAAC,MAAM;GACX,MAAM,QAAQ;GACd,eAAe,QAAQ,KAAK;EAC9B,GACA;GAAE,MAAM,QAAQ;GAAS;GAAY;EAAU,CACjD;EACA,SAAS,QAAQ,EAAE;EACnB,aAAa,SAAS,WAAW;CACnC,CAAC;CAED,OAAO;EAAE;EAAK;EAAO;CAAe;AACtC;;;AChDA,MAAM,SAAuB,CAAC;;;;;;AAiB9B,SAAgB,iBAAiB,EAC/B,UACA,WACA,uBACA,kBAAkB,QACM;CACxB,WAAW;CACX,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,eAAe,OAAO,SAAS;CACrC,aAAa,UAAU;CAEvB,sBAAsB;EACpB,IAAI,OAAO,aAAa,aAAa;EACrC,MAAM,QAAoB,EAAE,eAAe,QAAQ,QAAQ;EAC3D,OAAO,KAAK,KAAK;EAGjB,MAAM,cAAuB;GAC3B,MAAM,OAAO,QAAQ;GACrB,IAAI,CAAC,MAAM,OAAO;GAClB,KAAK,MAAM,SAAS,QAAQ;IAC1B,IAAI,UAAU,OAAO;IACrB,MAAM,YAAY,MAAM,QAAQ;IAChC,IAAI,aAAa,KAAK,SAAS,SAAS,GAAG,OAAO;GACpD;GACA,OAAO;EACT;EAEA,MAAM,iBAAiB,UAA8B;GACnD,IAAI,yBAAyB,CAAC,MAAM,GAAG;GACvC,MAAM,OAAO,QAAQ;GACrB,IAAI,CAAC,MAAM;GACX,IAAI,MAAM,kBAAkB,QAAQ,CAAC,KAAK,SAAS,MAAM,MAAM,GAC7D,aAAa,UAAU;EAE3B;EACA,MAAM,aAAa,UAA+B;GAChD,IAAI,CAAC,mBAAmB,MAAM,QAAQ,YAAY,CAAC,MAAM,GAAG;GAC5D,aAAa,UAAU;EACzB;EAEA,SAAS,iBAAiB,eAAe,eAAe,IAAI;EAC5D,SAAS,iBAAiB,WAAW,SAAS;EAC9C,aAAa;GACX,SAAS,oBAAoB,eAAe,eAAe,IAAI;GAC/D,SAAS,oBAAoB,WAAW,SAAS;GACjD,MAAM,MAAM,OAAO,QAAQ,KAAK;GAChC,IAAI,QAAQ,IAAI,OAAO,OAAO,KAAK,CAAC;EACtC;CACF,CAAC;CAED,OAAO,oBAAC,OAAD;EAAK,KAAK;EAAU;CAAc,CAAA;AAC3C;;;;;;;;;AC9CA,SAAgB,eAAe,UAAiC,CAAC,GAAyB;CACxF,MAAM,EAAE,cAAc,cAAc,OAAO,OAAO,eAAe,MAAM;CACvE,MAAM,cAAc,UAAU,YAAY;CAC1C,MAAM,WAAW,OAA+B,CAAC,CAAC;CAElD,MAAM,cAAc,UAAwB;EAC1C,YAAY,QAAQ;EACpB,SAAS,QAAQ,MAAM,EAAE,MAAM;CACjC;CAEA,MAAM,iBAAiB,OAAyC,UAAwB;EACtF,MAAM,QAAQ,SAAS,QAAQ;EAC/B,IAAI,UAAU,GAAG;EACjB,MAAM,aAAa,gBAAgB;EACnC,MAAM,WAAW,gBAAgB;EACjC,IAAI,OAAO;EACX,IAAK,cAAc,MAAM,QAAQ,gBAAkB,YAAY,MAAM,QAAQ,aAC3E,OAAO,QAAQ;OACV,IAAK,cAAc,MAAM,QAAQ,eAAiB,YAAY,MAAM,QAAQ,WACjF,OAAO,QAAQ;OACV,IAAI,MAAM,QAAQ,QACvB,OAAO;OACF,IAAI,MAAM,QAAQ,OACvB,OAAO,QAAQ;OAEf;EAEF,MAAM,eAAe;EACrB,IAAI,OAAO,GAAG,OAAO,OAAO,QAAQ,IAAI;EACxC,IAAI,QAAQ,OAAO,OAAO,OAAO,IAAI,QAAQ;EAC7C,WAAW,IAAI;CACjB;CAEA,MAAM,gBAAgB,WAAoC;EACxD,UAAU,YAAY,UAAU,QAAQ,IAAI;EAC5C,YAAY,UAAU,cAAc,OAAO,KAAK;EAChD,eAAe;GACb,YAAY,QAAQ;EACtB;EACA,MAAM,OAAO;GACX,SAAS,QAAQ,SAAS;EAC5B;CACF;CAEA,OAAO;EACL;EACA;EACA,iBAAiB,UAAkB;GACjC,YAAY,QAAQ;EACtB;CACF;AACF;;;;;;;;;;AC/DA,SAAgB,SAAS,EAAE,SAAS,YAA2B;CAC7D,WAAW;CACX,MAAM,aAAa,OAAO,YAAY,YAAY,UAAU,QAAQ;CAIpE,MAAM,aAAa,UAAU,UAAU;CACvC,WAAW,QAAQ;CAEnB,MAAM,YAAY,UAAU,UAAU;CACtC,MAAM,QAAQ,UAA6B,aAAa,SAAS,QAAQ;CACzE,MAAM,UAAU,OAA2B,IAAI;CAE/C,sBAAsB;EACpB,IAAI,WAAW,OAAO;GACpB,UAAU,QAAQ;GAClB,MAAM,QAAQ;GACd;EACF;EACA,MAAM,QAAQ;EACd,MAAM,OAAO,QAAQ;EACrB,IAAI,CAAC,QAAQ,OAAO,qBAAqB,aAAa;GACpD,UAAU,QAAQ;GAClB;EACF;EACA,MAAM,SAAS,iBAAiB,IAAI;EAMpC,IAAI,EAJD,OAAO,kBAAkB,UACxB,OAAO,kBAAkB,MACzB,OAAO,sBAAsB,QAC9B,OAAO,uBAAuB,QAAQ,OAAO,uBAAuB,KACxD;GACb,UAAU,QAAQ;GAClB;EACF;EACA,MAAM,aAAa,UAAuB;GACxC,IAAI,MAAM,WAAW,MAAM,UAAU,QAAQ;EAC/C;EACA,KAAK,iBAAiB,gBAAgB,SAAS;EAC/C,KAAK,iBAAiB,iBAAiB,SAAS;EAChD,aAAa;GACX,KAAK,oBAAoB,gBAAgB,SAAS;GAClD,KAAK,oBAAoB,iBAAiB,SAAS;EACrD;CACF,CAAC;CAED,IAAI,CAAC,UAAU,OAAO,OAAO;CAC7B,IAAI,CAAC,eAAe,QAAQ,GAC1B,MAAM,IAAI,MAAM,qDAAqD;CAEvE,MAAM,QAAQ;CACd,MAAM,WAAY,MAAM,MAAM,UAAuC,MAAM;CAC3E,OAAO,aAAa,OAAO;EACzB,cAAc,MAAM;EACpB,KAAK,YAAY,WAAW,OAA2B;GACrD,QAAQ,UAAU;EACpB,CAAC;CACH,CAA4B;AAC9B;;;;;;;;;;;;;;;;AChCA,SAAgB,mBAAsB,SAA+C;CACnF,MAAM,EAAE,UAAU,QAAQ,UAAU;CACpC,IAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,GAC5C,MAAM,IAAI,WAAW,6DAA6D,UAAU;CAG9F,MAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,SAAS,CAAC;CAC5C,IAAI,OAAO;CACX,IAAI,SAAS;CAEb,MAAM,OAAO,OAAqB,CAAC,CAAC;CACpC,IAAI,QAAuB;CAC3B,IAAI,YAAY;CAEhB,MAAM,SAAS,OAAO,0BAA0B;CAEhD,SAAS,cAA4B;EACnC,MAAM,MAAW,CAAC;EAClB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,IAAI,KAAK,MAAM,OAAO,KAAK,SAAc;EAC1E,OAAO;CACT;CAEA,SAAS,UAAgB;EACvB,YAAY;EACZ,QAAQ;EACR,KAAK,QAAQ,YAAY;CAC3B;CAKA,SAAS,WAAiB;EACxB,IAAI,UAAU,UAAU,CAAC,QAAQ;GAC/B,QAAQ;GACR;EACF;EACA,IAAI,CAAC,WAAW;GACd,YAAY;GACZ,QAAQ,sBAAsB,OAAO;EACvC;CACF;CAEA,SAAS,QAAQ,MAAe;EAC9B,IAAI,SAAS,UAAU;GACrB,MAAM,OAAO,UAAU,YAAY;GACnC;EACF,OAAO;GAEL,KAAK,QAAQ;GACb,QAAQ,OAAO,KAAK;EACtB;CACF;CAEA,OAAO;EACL,QAAQ;EACR,OAAO,MAAe;GACpB,QAAQ,IAAI;GACZ,SAAS;EACX;EACA,WAAW,OAA2B;GACpC,IAAI,MAAM,WAAW,GAAG;GAExB,MAAM,QAAQ,MAAM,SAAS,WAAW,MAAM,SAAS,WAAW;GAClE,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM,QAAQ,KAAK,QAAQ,MAAM,EAAO;GAChE,SAAS;EACX;EACA,QAAc;GACZ,OAAO;GACP,SAAS;GACT,SAAS;EACX;EACA,UAAgB;GACd,IAAI,UAAU,QAAQ,QAAQ,qBAAqB,KAAK;GACxD,QAAQ;GACR,YAAY;EACd;EACA,IAAI,OAAe;GACjB,OAAO;EACT;EACA,IAAI,WAAmB;GACrB,OAAO;EACT;CACF;AACF;;;;;;AAOA,SAAgB,gBAAmB,SAA+C;CAChF,MAAM,MAAM,OAA+B,IAAI;CAC/C,IAAI,YAAY,mBAAsB,OAAO;CAG7C,4BAA4B,IAAI,SAAS,QAAQ,CAAC;CAElD,OAAO,IAAI;AACb;;;;;;;;;;;;;;AC9GA,SAAgB,cAA2B;CACzC,MAAM,4BAAY,IAAI,IAAgB;CACtC,IAAI,WAAW;CAEf,OAAO;EACL,SAAS,UAAUC,OAAW,KAAK;EACnC,WAAW,OAAOC,SAAa,EAAE;EACjC,SAAS,OAAO;GACd,IAAI,UAAU,aAAa,CAAC;GAC5B,MAAM,OAAOC,OAAW,EAAE;GAC1B,UAAU,IAAI,IAAI;GAClB,aAAa;IACX,UAAU,OAAO,IAAI;IACrB,KAAK;GACP;EACF;EACA,eAAe;GACb,IAAI,UAAU;GACd,WAAW;GACX,KAAK,MAAM,QAAQ,WAAW,KAAK;GACnC,UAAU,MAAM;EAClB;EACA,IAAI,WAAoB;GACtB,OAAO;EACT;CACF;AACF;;;;;AAMA,SAAgB,WAAwB;CACtC,MAAM,MAAM,OAA2B,IAAI;CAC3C,IAAI,YAAY,YAAY;CAE5B,4BAA4B,IAAI,SAAS,QAAQ,CAAC;CAElD,OAAO,IAAI;AACb;;;AChDA,SAAS,oBAA6B;CACpC,OACE,OAAO,QAAQ,eACf,OAAO,IAAI,aAAa,cACxB,IAAI,SAAS,kBAAkB;AAEnC;AAEA,SAAS,eAAe,WAAsE;CAC5F,MAAM,CAAC,MAAM,OAAO,UAAU,MAAM,GAAG;CACvC,OAAO;EAAE;EAAM,OAAO,OAAO;CAAS;AACxC;;AAGA,SAAgB,gBACd,QAQA,UACA,WAC+B;CAC/B,MAAM,EAAE,MAAM,UAAU,eAAe,SAAS;CAChD,IAAI,MAAM;CACV,IAAI,OAAO;CACX,IAAI,SAAS,SAAS,SAAS,UAAU;EACvC,MAAM,SAAS,WAAW,OAAO,SAAS,OAAO,MAAM,SAAS;EAChE,OACE,UAAU,UACN,OAAO,OACP,UAAU,QACR,OAAO,QAAQ,SAAS,QACxB,OAAO,QAAQ,OAAO,QAAQ,SAAS,SAAS;CAC1D,OAAO;EACL,OAAO,SAAS,UAAU,OAAO,QAAQ,OAAO,OAAO,SAAS;EAChE,MACE,UAAU,UACN,OAAO,MACP,UAAU,QACR,OAAO,SAAS,SAAS,SACzB,OAAO,OAAO,OAAO,SAAS,SAAS,UAAU;CAC3D;CACA,OAAO;EAAE;EAAK;CAAK;AACrB;AAEA,SAAS,gBAAgB,MAAkB,OAAmC;CAC5E,MAAM,QAAuB;EAC3B,UAAU;EACV,iBAAiB;EACjB,kBAAkB;CACpB;CACA,IAAI,SAAS,UAAU,MAAM,MAAM;CACnC,IAAI,SAAS,OAAO,MAAM,SAAS;CACnC,IAAI,SAAS,SAAS,MAAM,OAAO;CACnC,IAAI,SAAS,QAAQ,MAAM,QAAQ;CACnC,IAAI,SAAS,SAAS,SAAS,UAAU;EACvC,MAAM,OAAO,UAAU,QAAQ,KAAA,IAAY,UAAU,UAAU,iBAAiB;EAChF,IAAI,UAAU,OAAO,MAAM,QAAQ;CACrC,OAAO;EACL,MAAM,MAAM,UAAU,QAAQ,KAAA,IAAY,UAAU,UAAU,gBAAgB;EAC9E,IAAI,UAAU,OAAO,MAAM,SAAS;CACtC;CACA,OAAO;AACT;;;;;;;AAQA,SAAgB,kBAAkB,SAA4D;CAC5F,MAAM,EAAE,WAAW,aAAa,YAAY,UAAU,UAAU,SAAS;CACzE,WAAW;CACX,MAAM,YAAY,kBAAkB;CACpC,MAAM,OAAO,MAAM,QAAQ;CAC3B,MAAM,MAAM,UAAgD,IAAI;CAEhE,sBAAsB;EACpB,MAAM,YAAY,OAAO,YAAY,YAAY,UAAU,QAAQ;EACnE,IAAI,aAAa,CAAC,aAAa,OAAO,WAAW,aAAa;EAE9D,MAAM,eAAqB;GACzB,MAAM,IAAI,UAAU;GACpB,MAAM,IAAI,YAAY;GACtB,IAAI,CAAC,KAAK,CAAC,GAAG;GACd,IAAI,QAAQ,gBAAgB,EAAE,sBAAsB,GAAG,EAAE,sBAAsB,GAAG,SAAS;EAC7F;EACA,OAAO;EACP,OAAO,iBAAiB,UAAU,QAAQ,IAAI;EAC9C,OAAO,iBAAiB,UAAU,MAAM;EACxC,aAAa;GACX,OAAO,oBAAoB,UAAU,QAAQ,IAAI;GACjD,OAAO,oBAAoB,UAAU,MAAM;EAC7C;CACF,CAAC;CAED,IAAI,WAAW;EACb,MAAM,EAAE,MAAM,UAAU,eAAe,SAAS;EAChD,OAAO;GACL,aAAa,EAAE,YAAY,KAAK,OAAO;GACvC,eAAe;IACb,gBAAgB,KAAK;IACrB,GAAG,gBAAgB,MAAM,KAAK;GAChC;GACA,oBAAoB;EACtB;CACF;CAEA,MAAM,IAAI,IAAI;CACd,OAAO;EACL,aAAa,CAAC;EACd,eAAe,IACX;GAAE,UAAU;GAAS,KAAK,EAAE;GAAK,MAAM,EAAE;EAAK,IAC9C;GAAE,UAAU;GAAS,YAAY;EAAS;EAC9C,oBAAoB;CACtB;AACF;;;ACpHA,MAAa,UAAU"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["useSignal","styles","useReactId","coreSignal","coreComputed","coreEffect"],"sources":["../src/machine.ts","../src/utils.ts","../src/error-boundary.tsx","../src/suspense-boundary.tsx","../src/portal.tsx","../src/visually-hidden.tsx","../src/focus-scope.tsx","../src/slot.tsx","../src/controllable.ts","../src/media-query.ts","../src/scroll-lock.ts","../src/use-id.ts","../src/clipboard.ts","../src/disclosure.ts","../src/infinite-scroll.ts","../src/draggable.ts","../src/resize-observer.ts","../src/mutation-observer.ts","../src/intersection-observer.ts","../src/dismissable-layer.tsx","../src/typeahead.ts","../src/roving-focus.ts","../src/presence.tsx","../src/stream-buffer.ts","../src/scope.ts","../src/anchor.tsx","../src/index.ts"],"sourcesContent":["import { useSignal } from '@preact/signals-react'\nimport type { Machine, MachineConfig } from './types.ts'\n\nexport function createMachine<S extends string, I extends S = S>(\n config: MachineConfig<S, I>,\n): Machine<S> {\n return config as Machine<S>\n}\n\nexport function useMachine<S extends string>(machine: Machine<S>) {\n const state = useSignal<S>(machine.initial)\n const send = (event: string) => {\n const next = machine.states[state.value]?.on?.[event] as S | undefined\n if (next !== undefined) state.value = next\n }\n return [state, send] as const\n}\n","import type { Ref, RefCallback, MutableRefObject } from 'react'\n\nexport function cn(...classes: (string | undefined | null | false | 0)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\nexport function composeRefs<T>(...refs: (Ref<T> | undefined)[]): RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (!ref) return\n if (typeof ref === 'function') {\n ref(value)\n } else {\n ;(ref as MutableRefObject<T | null>).current = value\n }\n })\n }\n}\n\ntype EventHandler = (...args: unknown[]) => unknown\n\nexport function mergeProps<T extends Record<string, unknown>>(...propsList: Partial<T>[]): T {\n const result: Record<string, unknown> = {}\n for (const props of propsList) {\n for (const [key, val] of Object.entries(props)) {\n if (key.startsWith('on') && typeof val === 'function' && typeof result[key] === 'function') {\n const existing = result[key] as EventHandler\n result[key] = (...args: unknown[]) => {\n existing(...args)\n ;(val as EventHandler)(...args)\n }\n } else {\n result[key] = val\n }\n }\n }\n return result as T\n}\n","import { Component, type ErrorInfo, type ReactNode } from 'react'\n\nexport interface ErrorBoundaryProps {\n children: ReactNode\n fallback: ReactNode | ((error: Error, reset: () => void) => ReactNode)\n onError?: (error: Error, info: ErrorInfo) => void\n}\n\ninterface State {\n error: Error | null\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(error: Error): State {\n return { error }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info)\n }\n\n reset = () => {\n this.setState({ error: null })\n }\n\n render() {\n const { error } = this.state\n if (error !== null) {\n const { fallback } = this.props\n return typeof fallback === 'function' ? fallback(error, this.reset) : fallback\n }\n return this.props.children\n }\n}\n","import { Suspense, type ReactNode } from 'react'\n\nexport interface SuspenseBoundaryProps {\n children: ReactNode\n fallback?: ReactNode\n}\n\nexport function SuspenseBoundary({ children, fallback }: SuspenseBoundaryProps) {\n return (\n <Suspense fallback={fallback ?? <span aria-busy=\"true\" aria-label=\"Loading\" />}>\n {children}\n </Suspense>\n )\n}\n","'use client'\nimport { useRef, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useSignal, useSignalEffect, useSignals } from './signals.ts'\n\nexport interface PortalProps {\n children: ReactNode\n container?: Element | DocumentFragment\n}\n\nexport function Portal({ children, container }: PortalProps) {\n useSignals()\n const mounted = useSignal(false)\n const containerRef = useRef<Element | DocumentFragment | null>(null)\n\n useSignalEffect(() => {\n if (typeof document === 'undefined') return\n containerRef.current = container ?? document.body\n mounted.value = true\n return () => {\n mounted.value = false\n }\n })\n\n if (!mounted.value || containerRef.current === null) return null\n return createPortal(children, containerRef.current)\n}\n","import type { ReactNode, HTMLAttributes } from 'react'\nimport styles from './visually-hidden.module.css'\n\nexport interface VisuallyHiddenProps extends HTMLAttributes<HTMLSpanElement> {\n children: ReactNode\n showOnFocus?: boolean\n}\n\nexport function VisuallyHidden({\n children,\n showOnFocus,\n className,\n ...props\n}: VisuallyHiddenProps) {\n const classes = [styles.root, showOnFocus && styles.focusable, className]\n .filter(Boolean)\n .join(' ')\n return (\n <span className={classes} {...props}>\n {children}\n </span>\n )\n}\n","'use client'\nimport { useRef, type ReactNode } from 'react'\nimport { useSignalEffect, useSignals } from './signals.ts'\n\nconst FOCUSABLE =\n 'a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),[tabindex]:not([tabindex=\"-1\"])'\n\nexport interface FocusScopeProps {\n children: ReactNode\n trapped?: boolean\n restoreFocus?: boolean\n autoFocus?: boolean\n}\n\nexport function FocusScope({ children, trapped, restoreFocus, autoFocus }: FocusScopeProps) {\n useSignals()\n const containerRef = useRef<HTMLDivElement>(null)\n const previousFocusRef = useRef<Element | null>(null)\n\n useSignalEffect(() => {\n const container = containerRef.current\n if (!container) return\n if (restoreFocus) previousFocusRef.current = document.activeElement\n if (autoFocus) {\n const first = container.querySelector<HTMLElement>(FOCUSABLE)\n first?.focus()\n }\n if (!trapped) return\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') return\n const focusable = Array.from(container!.querySelectorAll<HTMLElement>(FOCUSABLE))\n if (focusable.length === 0) return\n const first = focusable[0]!\n const last = focusable[focusable.length - 1]!\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault()\n last.focus()\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault()\n first.focus()\n }\n }\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n if (restoreFocus && previousFocusRef.current instanceof HTMLElement) {\n previousFocusRef.current.focus()\n }\n }\n })\n\n return <div ref={containerRef}>{children}</div>\n}\n","'use client'\nimport {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react'\nimport { cn, composeRefs, mergeProps } from './utils.ts'\n\nexport interface SlotProps {\n children?: ReactNode\n className?: string\n style?: CSSProperties\n [key: string]: unknown\n}\n\ntype ElementWithRef = ReactElement<Record<string, unknown>> & { ref?: Ref<unknown> }\n\n/**\n * Slot renders its single child element while merging the Slot's own props and ref onto it —\n * the Radix-style `asChild` composition primitive, built on cascivo's existing\n * `mergeProps`/`composeRefs`/`cn`.\n *\n * - Non-handler props: child wins (so the consumer's element controls its own identity).\n * - `on*` handlers: chained (Slot's runs, then the child's) via `mergeProps`.\n * - `className`: unioned via `cn`. `style`: shallow-merged (child wins on conflicts).\n * - `ref`: composed so both the Slot consumer's ref and the child's own ref receive the node.\n *\n * Fails fast if `children` is not exactly one valid React element.\n */\nexport const Slot = forwardRef<unknown, SlotProps>(function Slot(props, forwardedRef) {\n const { children, className: slotClassName, style: slotStyle, ...slotProps } = props\n\n if (!isValidElement(children) || Children.count(children) !== 1) {\n throw new Error(\n 'Slot expects exactly one valid React element child (asChild requires a single element).',\n )\n }\n\n const child = children as ElementWithRef\n const childProps = child.props\n const merged = mergeProps<Record<string, unknown>>(slotProps, childProps)\n\n merged['className'] = cn(\n slotClassName as string | undefined,\n childProps['className'] as string | undefined,\n )\n merged['style'] = {\n ...(slotStyle as CSSProperties | undefined),\n ...(childProps['style'] as CSSProperties | undefined),\n }\n // React 19 exposes ref as a regular prop; React 18 keeps it on the element. Prefer props.ref to\n // avoid touching the deprecated `element.ref` getter when it isn't needed.\n const childRef = (childProps['ref'] as Ref<unknown> | undefined) ?? child.ref\n merged['ref'] = composeRefs(forwardedRef, childRef)\n\n return cloneElement(child, merged)\n})\n","'use client'\nimport { useRef } from 'react'\nimport { useSignal, type Signal } from './signals.ts'\n\nexport interface UseControllableSignalOptions<T> {\n /** Controlled value. When provided, the component is controlled for its whole life. */\n value?: T | undefined\n /** Initial value for uncontrolled use. */\n defaultValue?: T | undefined\n /** Called on every write, in both controlled and uncontrolled modes. */\n onChange?: ((value: T) => void) | undefined\n}\n\n/**\n * Codifies the controlled/uncontrolled pattern documented by hand in CLAUDE.md\n * (`const x = useSignal(open); x.value = open`).\n *\n * Returns a `[signal, setValue]` pair:\n * - **Controlled** (`value` provided): the signal mirrors `value` on every render; `setValue`\n * does not mutate the signal locally — it only routes the request through `onChange` so the\n * parent owns the state (React semantics).\n * - **Uncontrolled** (`value` undefined): the signal owns the state seeded from `defaultValue`;\n * `setValue` updates it locally and also calls `onChange`.\n *\n * Whether a component is controlled is fixed for its life, exactly like React.\n */\nexport function useControllableSignal<T>(\n options: UseControllableSignalOptions<T>,\n): [Signal<T>, (next: T) => void] {\n const { value, defaultValue, onChange } = options\n const isControlled = value !== undefined\n\n const sig = useSignal<T>((isControlled ? value : defaultValue) as T)\n\n // Keep onChange current without an effect (the onCloseRef idiom from CLAUDE.md).\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n // Controlled: mirror the prop into the signal each render (no-op if unchanged).\n if (isControlled) sig.value = value as T\n\n const setValue = (next: T): void => {\n if (!isControlled) sig.value = next\n onChangeRef.current?.(next)\n }\n\n return [sig, setValue]\n}\n","'use client'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nfunction initialMatch(query: string): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false\n return window.matchMedia(query).matches\n}\n\n/**\n * `useMediaQuery(query)` → a `ReadonlySignal<boolean>` that tracks whether the media query matches.\n * SSR-safe (defaults to `false` when `window`/`matchMedia` is unavailable). Subscribes to changes\n * inside `useSignalEffect`; the listener is cleaned up on teardown.\n */\nexport function useMediaQuery(query: string): ReadonlySignal<boolean> {\n const matches = useSignal(initialMatch(query))\n\n useSignalEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return\n const mql = window.matchMedia(query)\n matches.value = mql.matches\n const handler = (event: MediaQueryListEvent): void => {\n matches.value = event.matches\n }\n mql.addEventListener('change', handler)\n return () => mql.removeEventListener('change', handler)\n })\n\n return matches\n}\n","'use client'\nimport { useSignalEffect, type Signal } from './signals.ts'\n\n/**\n * Locks `document.body` scroll while `locked` is true, compensating for the scrollbar width to\n * avoid a layout shift. Accepts a plain boolean or a `Signal<boolean>` (reactive). The previous\n * inline styles are restored on unlock/teardown. DOM work runs inside `useSignalEffect`.\n */\nexport function useScrollLock(locked: Signal<boolean> | boolean): void {\n useSignalEffect(() => {\n const isLocked = typeof locked === 'boolean' ? locked : locked.value\n if (!isLocked || typeof document === 'undefined') return\n\n const body = document.body\n const prevOverflow = body.style.overflow\n const prevPaddingInlineEnd = body.style.paddingInlineEnd\n\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n body.style.overflow = 'hidden'\n if (scrollbarWidth > 0) {\n const current = Number.parseInt(window.getComputedStyle(body).paddingInlineEnd, 10) || 0\n body.style.paddingInlineEnd = `${current + scrollbarWidth}px`\n }\n\n return () => {\n body.style.overflow = prevOverflow\n body.style.paddingInlineEnd = prevPaddingInlineEnd\n }\n })\n}\n","'use client'\nimport { useId as useReactId } from 'react'\n\n/**\n * SSR-safe stable id for aria wiring (Label/Field). Wraps React's `useId` and strips the\n * non-selector-safe colons React emits, prefixing for readability (default `cascivo`).\n */\nexport function useId(prefix = 'cascivo'): string {\n const id = useReactId()\n return `${prefix}-${id.replace(/:/g, '')}`\n}\n","'use client'\nimport { useRef } from 'react'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nexport interface UseClipboardOptions {\n /** How long `copied` stays true after a successful copy, in ms. */\n timeout?: number\n}\n\nexport interface UseClipboardReturn {\n copied: ReadonlySignal<boolean>\n copy: (text: string) => Promise<void>\n}\n\n/**\n * Copy-to-clipboard helper that de-dupes the inline logic in `copy-button`.\n * `copy(text)` writes via `navigator.clipboard.writeText`; `copied` flips true then resets after\n * `timeout`. The reset timer is cleared on unmount via `useSignalEffect` (no `useEffect`).\n */\nexport function useClipboard(options: UseClipboardOptions = {}): UseClipboardReturn {\n const { timeout = 2000 } = options\n const copied = useSignal(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useSignalEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n })\n\n const copy = async (text: string): Promise<void> => {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return\n await navigator.clipboard.writeText(text)\n copied.value = true\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n copied.value = false\n }, timeout)\n }\n\n return { copied, copy }\n}\n","'use client'\nimport { useControllableSignal } from './controllable.ts'\nimport type { ReadonlySignal } from './signals.ts'\n\nexport interface UseDisclosureOptions {\n /** Initial open state for uncontrolled use. */\n defaultOpen?: boolean\n /** Controlled open state. When provided, the parent owns the state. */\n isOpen?: boolean\n /** Called whenever open/close/toggle is requested. */\n onOpenChange?: (open: boolean) => void\n}\n\nexport interface UseDisclosureReturn {\n isOpen: ReadonlySignal<boolean>\n open: () => void\n close: () => void\n toggle: () => void\n}\n\n/**\n * Open/close state for overlays (modal, drawer, popover, …), replacing the\n * per-component `useSignal(open)` boilerplate. Backed by `useControllableSignal`\n * so it is controlled when `isOpen` is passed and uncontrolled otherwise.\n * Replaces HeroUI's `@heroui/use-disclosure`. No `useState`/`useEffect`.\n */\nexport function useDisclosure(options: UseDisclosureOptions = {}): UseDisclosureReturn {\n const { defaultOpen = false, isOpen, onOpenChange } = options\n const [open, setOpen] = useControllableSignal<boolean>({\n value: isOpen,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n\n return {\n isOpen: open,\n open: () => setOpen(true),\n close: () => setOpen(false),\n toggle: () => setOpen(!open.value),\n }\n}\n","'use client'\nimport { useRef, type RefObject } from 'react'\nimport { useSignal, useSignalEffect } from './signals.ts'\n\nexport interface UseInfiniteScrollOptions {\n /** Whether more items remain to load. */\n hasMore: boolean\n /** Called when the sentinel scrolls into view and `hasMore` is true. */\n onLoadMore: () => void\n /** Disable the observer without unmounting. Default true. */\n isEnabled?: boolean\n /** IntersectionObserver rootMargin (e.g. '200px' to prefetch early). */\n rootMargin?: string\n}\n\nexport interface UseInfiniteScrollReturn {\n /** Place on a trailing element at the end of the list. */\n sentinelRef: RefObject<HTMLElement | null>\n /** Optional scroll container; defaults to the viewport. */\n rootRef: RefObject<HTMLElement | null>\n}\n\n/**\n * Calls `onLoadMore` when a sentinel element scrolls into view, gated by\n * `hasMore`. Wires an `IntersectionObserver` inside `useSignalEffect` and\n * disconnects it on teardown. SSR/no-DOM safe. Replaces HeroUI's\n * `@heroui/use-infinite-scroll`. No `useState`/`useEffect`.\n */\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): UseInfiniteScrollReturn {\n const { rootMargin = '0px' } = options\n const sentinelRef = useRef<HTMLElement | null>(null)\n const rootRef = useRef<HTMLElement | null>(null)\n\n // Mirror props into signals so the effect re-attaches when `isEnabled` flips;\n // `hasMore`/`onLoadMore` stay current via signal/ref reads at intersection time.\n const enabled = useSignal(options.isEnabled ?? true)\n enabled.value = options.isEnabled ?? true\n const hasMore = useSignal(options.hasMore)\n hasMore.value = options.hasMore\n const onLoadMoreRef = useRef(options.onLoadMore)\n onLoadMoreRef.current = options.onLoadMore\n\n useSignalEffect(() => {\n const isEnabled = enabled.value\n const sentinel = sentinelRef.current\n if (!isEnabled || typeof IntersectionObserver === 'undefined' || !sentinel) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting && hasMore.value) onLoadMoreRef.current()\n },\n { root: rootRef.current ?? null, rootMargin },\n )\n observer.observe(sentinel)\n return () => observer.disconnect()\n })\n\n return { sentinelRef, rootRef }\n}\n","'use client'\nimport { useRef, type RefObject } from 'react'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nexport interface DragOffset {\n x: number\n y: number\n}\n\n/** Pointer velocity at drag end, in pixels per millisecond. Sign follows the drag direction. */\nexport interface DragVelocity {\n x: number\n y: number\n}\n\nexport interface UseDraggableOptions {\n isDisabled?: boolean\n onDragEnd?: (offset: DragOffset) => void\n /** Constrain dragging to an axis. Default 'both'. */\n axis?: 'x' | 'y' | 'both'\n}\n\nexport interface UseDraggableReturn {\n /** Attach to the drag handle (e.g. a modal header). */\n handleRef: RefObject<HTMLElement | null>\n /** Attach to the moved element; apply `offset` as a CSS translate. */\n targetRef: RefObject<HTMLElement | null>\n offset: ReadonlySignal<DragOffset>\n /**\n * Pointer velocity (px/ms) from the final ~100ms of the most recent drag.\n * Set immediately before `onDragEnd` fires, so callbacks can read it to drive\n * fling/flick decisions. Zeroed by `reset()`.\n */\n velocity: ReadonlySignal<DragVelocity>\n isDragging: ReadonlySignal<boolean>\n reset: () => void\n}\n\n/** Velocity is averaged over samples no older than this (ms) at pointer-up. */\nconst VELOCITY_WINDOW_MS = 100\n\n/**\n * Pointer-driven drag offset for overlays. Returns an `{ x, y }` offset signal\n * the caller applies as a CSS `translate` (no animation library). Attaches\n * pointer listeners in `useSignalEffect` and removes them on teardown.\n * SSR/no-DOM safe. Replaces HeroUI's `@heroui/use-draggable` (Framer-free).\n * No `useState`/`useEffect`.\n */\nexport function useDraggable(options: UseDraggableOptions = {}): UseDraggableReturn {\n const handleRef = useRef<HTMLElement | null>(null)\n const targetRef = useRef<HTMLElement | null>(null)\n const offset = useSignal<DragOffset>({ x: 0, y: 0 })\n const velocity = useSignal<DragVelocity>({ x: 0, y: 0 })\n const isDragging = useSignal(false)\n\n const disabled = useSignal(options.isDisabled ?? false)\n disabled.value = options.isDisabled ?? false\n const axisRef = useRef(options.axis ?? 'both')\n axisRef.current = options.axis ?? 'both'\n const onDragEndRef = useRef(options.onDragEnd)\n onDragEndRef.current = options.onDragEnd\n\n useSignalEffect(() => {\n const isDisabled = disabled.value\n if (isDisabled || typeof window === 'undefined') return\n\n let startX = 0\n let startY = 0\n let baseX = 0\n let baseY = 0\n let activeHandle: HTMLElement | null = null\n // Recent {t,x,y} pointer samples, used to estimate fling velocity at release.\n let samples: { t: number; x: number; y: number }[] = []\n\n const sample = (event: PointerEvent): void => {\n samples.push({ t: performance.now(), x: event.clientX, y: event.clientY })\n }\n const computeVelocity = (): DragVelocity => {\n const last = samples.at(-1)\n if (!last) return { x: 0, y: 0 }\n // Oldest sample still within the averaging window (or the first sample).\n const first = samples.find((s) => last.t - s.t <= VELOCITY_WINDOW_MS) ?? samples[0]\n if (!first) return { x: 0, y: 0 }\n const dt = last.t - first.t\n if (dt <= 0) return { x: 0, y: 0 }\n const axis = axisRef.current\n return {\n x: axis === 'y' ? 0 : (last.x - first.x) / dt,\n y: axis === 'x' ? 0 : (last.y - first.y) / dt,\n }\n }\n\n const onMove = (event: PointerEvent): void => {\n const axis = axisRef.current\n const dx = axis === 'y' ? 0 : event.clientX - startX\n const dy = axis === 'x' ? 0 : event.clientY - startY\n offset.value = { x: baseX + dx, y: baseY + dy }\n sample(event)\n }\n const onUp = (event: PointerEvent): void => {\n isDragging.value = false\n activeHandle?.releasePointerCapture?.(event.pointerId)\n activeHandle = null\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n window.removeEventListener('pointercancel', onUp)\n velocity.value = computeVelocity()\n onDragEndRef.current?.(offset.value)\n }\n // Listen on the window and resolve the handle lazily, so the handle element\n // need not be attached when this effect first runs — it may live deep inside\n // a portal/overlay whose ref commits after this hook's owner.\n const onDown = (event: PointerEvent): void => {\n const handle = handleRef.current\n const target = event.target\n if (!handle || !(target instanceof Node) || !handle.contains(target)) return\n activeHandle = handle\n startX = event.clientX\n startY = event.clientY\n baseX = offset.value.x\n baseY = offset.value.y\n samples = []\n sample(event)\n isDragging.value = true\n handle.setPointerCapture?.(event.pointerId)\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n window.addEventListener('pointercancel', onUp)\n }\n\n window.addEventListener('pointerdown', onDown)\n return () => {\n window.removeEventListener('pointerdown', onDown)\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n window.removeEventListener('pointercancel', onUp)\n }\n })\n\n return {\n handleRef,\n targetRef,\n offset,\n velocity,\n isDragging,\n reset: () => {\n offset.value = { x: 0, y: 0 }\n velocity.value = { x: 0, y: 0 }\n },\n }\n}\n","'use client'\nimport { useRef, type RefObject } from 'react'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nexport interface ElementSize {\n width: number\n height: number\n}\n\nexport interface UseResizeObserverOptions {\n /** Which box model to observe. Default 'content-box'. */\n box?: ResizeObserverBoxOptions\n}\n\nexport interface UseResizeObserverReturn<T extends Element> {\n /** Attach to the element whose size you want to track. */\n ref: RefObject<T | null>\n /** Latest content-box size, or null before the first observation. */\n size: ReadonlySignal<ElementSize | null>\n /** Latest raw ResizeObserverEntry, or null before the first observation. */\n entry: ReadonlySignal<ResizeObserverEntry | null>\n}\n\n/**\n * Observes an element's size with a `ResizeObserver`, exposing the latest size\n * as a signal. The declarative counterpart to Web Awesome's `wa-resize-observer`.\n * Wires the observer inside `useSignalEffect` and disconnects it on teardown.\n * SSR/no-DOM safe. No `useState`/`useEffect`.\n */\nexport function useResizeObserver<T extends Element = Element>(\n options: UseResizeObserverOptions = {},\n): UseResizeObserverReturn<T> {\n const ref = useRef<T | null>(null)\n const size = useSignal<ElementSize | null>(null)\n const entry = useSignal<ResizeObserverEntry | null>(null)\n\n const box = useSignal(options.box)\n box.value = options.box\n\n useSignalEffect(() => {\n const observeBox = box.value\n const el = ref.current\n if (!el || typeof ResizeObserver === 'undefined') return\n\n const observer = new ResizeObserver((entries) => {\n const next = entries[entries.length - 1]\n if (!next) return\n entry.value = next\n size.value = { width: next.contentRect.width, height: next.contentRect.height }\n })\n observer.observe(el, observeBox ? { box: observeBox } : undefined)\n return () => observer.disconnect()\n })\n\n return { ref, size, entry }\n}\n","'use client'\nimport { useRef, type RefObject } from 'react'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nexport interface UseMutationObserverReturn<T extends Node> {\n /** Attach to the node whose mutations you want to watch. */\n ref: RefObject<T | null>\n /** The records from the most recent mutation batch. */\n records: ReadonlySignal<MutationRecord[]>\n}\n\n/**\n * Watches a node's DOM tree with a `MutationObserver`, exposing the latest batch\n * of records as a signal. The declarative counterpart to Web Awesome's\n * `wa-mutation-observer`. Wires the observer inside `useSignalEffect` and\n * disconnects it on teardown. SSR/no-DOM safe. No `useState`/`useEffect`.\n *\n * `init` is read when the effect (re-)subscribes; pass a stable object or accept\n * that changing it between renders won't re-subscribe (mount-time semantics).\n */\nexport function useMutationObserver<T extends Node = Element>(\n init: MutationObserverInit = { childList: true },\n): UseMutationObserverReturn<T> {\n const ref = useRef<T | null>(null)\n const records = useSignal<MutationRecord[]>([])\n const initRef = useRef(init)\n initRef.current = init\n\n useSignalEffect(() => {\n const node = ref.current\n if (!node || typeof MutationObserver === 'undefined') return\n\n const observer = new MutationObserver((mutations) => {\n records.value = mutations\n })\n observer.observe(node, initRef.current)\n return () => observer.disconnect()\n })\n\n return { ref, records }\n}\n","'use client'\nimport { useRef, type RefObject } from 'react'\nimport { useSignal, useSignalEffect, type ReadonlySignal } from './signals.ts'\n\nexport interface UseIntersectionObserverOptions {\n root?: Element | Document | null\n rootMargin?: string\n threshold?: number | number[]\n}\n\nexport interface UseIntersectionObserverReturn<T extends Element> {\n /** Attach to the element whose visibility you want to track. */\n ref: RefObject<T | null>\n /** Latest IntersectionObserverEntry, or null before the first observation. */\n entry: ReadonlySignal<IntersectionObserverEntry | null>\n /** Whether the element is currently intersecting the root. */\n isIntersecting: ReadonlySignal<boolean>\n}\n\n/**\n * Tracks an element's visibility with an `IntersectionObserver`, exposing the\n * latest entry and an `isIntersecting` flag as signals. The declarative\n * counterpart to Web Awesome's `wa-intersection-observer`.\n *\n * This is the **generic** observer — for \"load more when a sentinel appears\"\n * use `useInfiniteScroll`, which adds `hasMore`/`onLoadMore` semantics on top.\n *\n * Wires the observer inside `useSignalEffect` and disconnects it on teardown.\n * SSR/no-DOM safe. No `useState`/`useEffect`.\n */\nexport function useIntersectionObserver<T extends Element = Element>(\n options: UseIntersectionObserverOptions = {},\n): UseIntersectionObserverReturn<T> {\n const { rootMargin = '0px', threshold = 0 } = options\n const ref = useRef<T | null>(null)\n const entry = useSignal<IntersectionObserverEntry | null>(null)\n const isIntersecting = useSignal(false)\n const rootRef = useRef(options.root ?? null)\n rootRef.current = options.root ?? null\n\n useSignalEffect(() => {\n const el = ref.current\n if (!el || typeof IntersectionObserver === 'undefined') return\n\n const observer = new IntersectionObserver(\n (entries) => {\n const next = entries[entries.length - 1]\n if (!next) return\n entry.value = next\n isIntersecting.value = next.isIntersecting\n },\n { root: rootRef.current, rootMargin, threshold },\n )\n observer.observe(el)\n return () => observer.disconnect()\n })\n\n return { ref, entry, isIntersecting }\n}\n","'use client'\nimport { useRef, type ReactNode } from 'react'\nimport { useSignalEffect, useSignals } from './signals.ts'\n\n// Module-level registry so nested layers (a dropdown inside a modal) dismiss top-first. Effects\n// mount child-first, so a stack would invert nesting; instead we resolve the top-most layer by DOM\n// depth — a layer responds only when no other mounted layer's root is nested inside its own root.\ninterface LayerEntry {\n getRoot: () => HTMLElement | null\n}\nconst layers: LayerEntry[] = []\n\nexport interface DismissableLayerProps {\n children: ReactNode\n /** Called when an outside pointer lands or Escape is pressed (when this is the top-most layer). */\n onDismiss?: () => void\n /** Disable the outside-pointer dismissal (Escape still works unless escapeDismisses is false). */\n disableOutsidePointer?: boolean\n /** Whether Escape dismisses the top-most layer. Default true. */\n escapeDismisses?: boolean\n}\n\n/**\n * Wraps its children and dismisses on an outside pointer press or Escape. One tested implementation\n * of the dismissal logic every overlay reinvents. Nested layers form a stack — only the top-most\n * responds to Escape and outside pointers. All listeners run inside `useSignalEffect`.\n */\nexport function DismissableLayer({\n children,\n onDismiss,\n disableOutsidePointer,\n escapeDismisses = true,\n}: DismissableLayerProps) {\n useSignals()\n const rootRef = useRef<HTMLDivElement>(null)\n const onDismissRef = useRef(onDismiss)\n onDismissRef.current = onDismiss\n\n useSignalEffect(() => {\n if (typeof document === 'undefined') return\n const entry: LayerEntry = { getRoot: () => rootRef.current }\n layers.push(entry)\n\n // Top-most = deepest in the DOM: no other mounted layer's root sits inside this one's root.\n const isTop = (): boolean => {\n const root = rootRef.current\n if (!root) return false\n for (const other of layers) {\n if (other === entry) continue\n const otherRoot = other.getRoot()\n if (otherRoot && root.contains(otherRoot)) return false\n }\n return true\n }\n\n const handlePointer = (event: PointerEvent): void => {\n if (disableOutsidePointer || !isTop()) return\n const root = rootRef.current\n if (!root) return\n if (event.target instanceof Node && !root.contains(event.target)) {\n onDismissRef.current?.()\n }\n }\n const handleKey = (event: KeyboardEvent): void => {\n if (!escapeDismisses || event.key !== 'Escape' || !isTop()) return\n onDismissRef.current?.()\n }\n\n document.addEventListener('pointerdown', handlePointer, true)\n document.addEventListener('keydown', handleKey)\n return () => {\n document.removeEventListener('pointerdown', handlePointer, true)\n document.removeEventListener('keydown', handleKey)\n const idx = layers.indexOf(entry)\n if (idx !== -1) layers.splice(idx, 1)\n }\n })\n\n return <div ref={rootRef}>{children}</div>\n}\n","'use client'\nimport { useRef } from 'react'\nimport { useSignalEffect } from './signals.ts'\n\nexport interface UseTypeaheadOptions {\n /**\n * Called with the accumulated lowercased query whenever a printable character is\n * typed within the reset window. The consumer resolves which item to focus/select\n * (e.g. the first item whose label starts with `query`).\n */\n onMatch: (query: string) => void\n /** Milliseconds of inactivity before the query buffer resets. Default 500. */\n resetMs?: number\n}\n\nexport interface UseTypeaheadReturn {\n /** Spread onto the focusable container (listbox/menu). Feeds printable keys to the buffer. */\n onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void\n /** Clear the buffer immediately (e.g. on close). */\n reset: () => void\n}\n\n// A printable, single-character key press with no modifier — the kind that should\n// extend a type-to-select query. Enter/Arrow/Escape/Tab/etc. report multi-char keys.\nfunction isTypeaheadChar(event: React.KeyboardEvent<HTMLElement>): boolean {\n return event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey\n}\n\n/**\n * Type-to-select buffer, without context. The consumer calls `useTypeahead({ onMatch })`\n * and spreads `onKeyDown` onto the focusable list container; each printable key extends\n * the query and fires `onMatch(query)`. The buffer resets after `resetMs` of inactivity.\n *\n * Space is treated as a query character only while a query is already in progress, so a\n * leading Space stays available for activation (WAI-ARIA menu/listbox convention). Repeated\n * identical characters are passed through verbatim (e.g. \"aa\"); consumers that want the\n * \"press 'a' repeatedly to cycle A-items\" behavior can detect an all-same-char query.\n */\nexport function useTypeahead(options: UseTypeaheadOptions): UseTypeaheadReturn {\n const { onMatch, resetMs = 500 } = options\n const query = useRef('')\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n // Keep the callback current without re-binding the handler each render.\n const onMatchRef = useRef(onMatch)\n onMatchRef.current = onMatch\n\n const reset = (): void => {\n clearTimeout(timer.current)\n query.current = ''\n }\n\n // Clear any pending timer on unmount (no useEffect per project rule).\n useSignalEffect(() => () => clearTimeout(timer.current))\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLElement>): void => {\n if (!isTypeaheadChar(event)) return\n // Leading space is left for activation; space only extends an in-progress query.\n if (event.key === ' ' && query.current === '') return\n query.current += event.key.toLowerCase()\n clearTimeout(timer.current)\n timer.current = setTimeout(() => {\n query.current = ''\n }, resetMs)\n onMatchRef.current(query.current)\n }\n\n return { onKeyDown, reset }\n}\n","'use client'\nimport { useRef } from 'react'\nimport { useSignal, type ReadonlySignal } from './signals.ts'\n\nexport type RovingOrientation = 'horizontal' | 'vertical' | 'both'\n\nexport interface UseRovingFocusOptions {\n orientation?: RovingOrientation\n /** Wrap focus from last→first and first→last. Default false. */\n loop?: boolean\n /** Initial active index. Default 0. */\n defaultIndex?: number\n}\n\nexport interface RovingItemProps {\n tabIndex: number\n onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void\n onFocus: () => void\n ref: (el: HTMLElement | null) => void\n}\n\nexport interface UseRovingFocusReturn {\n activeIndex: ReadonlySignal<number>\n getItemProps: (index: number) => RovingItemProps\n setActiveIndex: (index: number) => void\n}\n\n/**\n * Roving tabindex without context. The parent calls `useRovingFocus(...)` and spreads\n * `getItemProps(i)` onto each item. Only the active item is tabbable (`tabIndex={0}`); arrow keys\n * move focus (Home/End jump; `loop` wraps). State lives in a signal — the consuming component reads\n * it during render, so React apps must call `useSignals()` (per the project rule).\n */\nexport function useRovingFocus(options: UseRovingFocusOptions = {}): UseRovingFocusReturn {\n const { orientation = 'horizontal', loop = false, defaultIndex = 0 } = options\n const activeIndex = useSignal(defaultIndex)\n const itemsRef = useRef<(HTMLElement | null)[]>([])\n\n const focusIndex = (index: number): void => {\n activeIndex.value = index\n itemsRef.current[index]?.focus()\n }\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>, index: number): void => {\n const count = itemsRef.current.length\n if (count === 0) return\n const horizontal = orientation !== 'vertical'\n const vertical = orientation !== 'horizontal'\n let next = index\n if ((horizontal && event.key === 'ArrowRight') || (vertical && event.key === 'ArrowDown')) {\n next = index + 1\n } else if ((horizontal && event.key === 'ArrowLeft') || (vertical && event.key === 'ArrowUp')) {\n next = index - 1\n } else if (event.key === 'Home') {\n next = 0\n } else if (event.key === 'End') {\n next = count - 1\n } else {\n return\n }\n event.preventDefault()\n if (next < 0) next = loop ? count - 1 : 0\n if (next >= count) next = loop ? 0 : count - 1\n focusIndex(next)\n }\n\n const getItemProps = (index: number): RovingItemProps => ({\n tabIndex: activeIndex.value === index ? 0 : -1,\n onKeyDown: (event) => handleKeyDown(event, index),\n onFocus: () => {\n activeIndex.value = index\n },\n ref: (el) => {\n itemsRef.current[index] = el\n },\n })\n\n return {\n activeIndex,\n getItemProps,\n setActiveIndex: (index: number) => {\n activeIndex.value = index\n },\n }\n}\n","'use client'\nimport { cloneElement, isValidElement, useRef, type ReactElement, type Ref } from 'react'\nimport { useSignal, useSignalEffect, useSignals, type Signal } from './signals.ts'\nimport { composeRefs } from './utils.ts'\n\nexport interface PresenceProps {\n /** Whether the content should be present. Accepts a boolean or a Signal. */\n present: boolean | Signal<boolean>\n /** A single element child; receives `data-state=\"open|closed\"` and a composed ref. */\n children: ReactElement\n}\n\ntype ElementWithRef = ReactElement<Record<string, unknown>> & { ref?: Ref<unknown> }\n\n/**\n * Defers unmount until an exit animation/transition finishes. While `present` is true the child is\n * mounted with `data-state=\"open\"`; when it flips to false the child gets `data-state=\"closed\"` and\n * stays mounted until its `animationend`/`transitionend` fires (or unmounts immediately if there is\n * no animation). CSS drives the visuals via `data-state`; this only manages mount timing. No\n * `useEffect` — the present prop is mirrored into a signal and watched with `useSignalEffect`.\n */\nexport function Presence({ present, children }: PresenceProps) {\n useSignals()\n const presentVal = typeof present === 'boolean' ? present : present.value\n\n // Mirror the (boolean or signal) present value into a local signal so the effect reacts to both\n // prop changes (re-render) and signal changes.\n const presentSig = useSignal(presentVal)\n presentSig.value = presentVal\n\n const isMounted = useSignal(presentVal)\n const state = useSignal<'open' | 'closed'>(presentVal ? 'open' : 'closed')\n const nodeRef = useRef<HTMLElement | null>(null)\n\n useSignalEffect(() => {\n if (presentSig.value) {\n isMounted.value = true\n state.value = 'open'\n return\n }\n state.value = 'closed'\n const node = nodeRef.current\n if (!node || typeof getComputedStyle === 'undefined') {\n isMounted.value = false\n return\n }\n const styles = getComputedStyle(node)\n const animates =\n (styles.animationName !== 'none' &&\n styles.animationName !== '' &&\n styles.animationDuration !== '0s') ||\n (styles.transitionDuration !== '0s' && styles.transitionDuration !== '')\n if (!animates) {\n isMounted.value = false\n return\n }\n const handleEnd = (event: Event): void => {\n if (event.target === node) isMounted.value = false\n }\n node.addEventListener('animationend', handleEnd)\n node.addEventListener('transitionend', handleEnd)\n return () => {\n node.removeEventListener('animationend', handleEnd)\n node.removeEventListener('transitionend', handleEnd)\n }\n })\n\n if (!isMounted.value) return null\n if (!isValidElement(children)) {\n throw new Error('Presence expects a single valid React element child')\n }\n const child = children as ElementWithRef\n const childRef = (child.props['ref'] as Ref<unknown> | undefined) ?? child.ref\n return cloneElement(child, {\n 'data-state': state.value,\n ref: composeRefs(childRef, (el: HTMLElement | null) => {\n nodeRef.current = el\n }),\n } as Record<string, unknown>)\n}\n","'use client'\nimport { useRef } from 'react'\nimport { signal, useSignalEffect } from './signals.ts'\nimport type { ReadonlySignal } from './signals.ts'\n\nexport interface StreamBufferOptions {\n /** Maximum retained items. Oldest are evicted past this. Must be >= 1. */\n capacity: number\n /**\n * When to publish staged appends to `signal`.\n * - `'raf'` (default): coalesce all appends within an animation frame into a\n * single `signal` write — one render per frame regardless of append rate.\n * - `'sync'`: publish immediately on every append (deterministic; for tests).\n */\n flush?: 'raf' | 'sync'\n}\n\nexport interface StreamBuffer<T> {\n /** The current window, oldest-first. A fresh readonly array per flush. */\n readonly signal: ReadonlySignal<readonly T[]>\n /** Append one item. O(1); never reallocates the backing store. */\n append: (item: T) => void\n /** Append many items. O(items). Past `capacity`, only the newest are kept. */\n appendMany: (items: readonly T[]) => void\n /** Drop all items and publish an empty window. */\n clear: () => void\n /** Cancel any pending flush. Call on teardown so no write fires after unmount. */\n dispose: () => void\n /** Current item count (0..capacity). */\n readonly size: number\n /** The configured capacity. */\n readonly capacity: number\n}\n\n/**\n * A fixed-capacity ring buffer with O(1) append and once-per-frame flushing —\n * the primitive for high-frequency streams (build logs, live metrics).\n *\n * Memory is O(capacity), not O(total appended): the backing array is allocated\n * once and overwritten in place. A burst of N appends within one animation\n * frame produces a single `signal` write (one render), so ingestion rate is\n * decoupled from render rate.\n *\n * This replaces the O(n)-per-line anti-pattern\n * `logsSignal.value = [...logsSignal.value.slice(1), line]`, which reallocates\n * and re-copies the whole array on every append and renders once per line.\n */\nexport function createStreamBuffer<T>(options: StreamBufferOptions): StreamBuffer<T> {\n const { capacity, flush = 'raf' } = options\n if (!Number.isInteger(capacity) || capacity < 1) {\n throw new RangeError(`createStreamBuffer: capacity must be an integer >= 1, got ${capacity}`)\n }\n\n const ring = Array.from({ length: capacity }) as T[]\n let head = 0 // index of the oldest item\n let length = 0 // number of live items\n\n const view = signal<readonly T[]>([])\n let frame: number | null = null\n let scheduled = false\n\n const canRaf = typeof requestAnimationFrame !== 'undefined'\n\n function materialize(): readonly T[] {\n const out: T[] = []\n for (let i = 0; i < length; i++) out.push(ring[(head + i) % capacity] as T)\n return out\n }\n\n function publish(): void {\n scheduled = false\n frame = null\n view.value = materialize()\n }\n\n // A `scheduled` flag (not just `frame === null`) keeps coalescing correct even\n // if requestAnimationFrame runs the callback synchronously: publish() clears\n // the flag before this function's `frame = …` assignment lands.\n function schedule(): void {\n if (flush === 'sync' || !canRaf) {\n publish()\n return\n }\n if (!scheduled) {\n scheduled = true\n frame = requestAnimationFrame(publish)\n }\n }\n\n function pushOne(item: T): void {\n if (length < capacity) {\n ring[(head + length) % capacity] = item\n length++\n } else {\n // Full: overwrite the oldest and advance the window.\n ring[head] = item\n head = (head + 1) % capacity\n }\n }\n\n return {\n signal: view,\n append(item: T): void {\n pushOne(item)\n schedule()\n },\n appendMany(items: readonly T[]): void {\n if (items.length === 0) return\n // Past capacity, only the newest `capacity` items can survive.\n const start = items.length > capacity ? items.length - capacity : 0\n for (let i = start; i < items.length; i++) pushOne(items[i] as T)\n schedule()\n },\n clear(): void {\n head = 0\n length = 0\n schedule()\n },\n dispose(): void {\n if (frame !== null && canRaf) cancelAnimationFrame(frame)\n frame = null\n scheduled = false\n },\n get size(): number {\n return length\n },\n get capacity(): number {\n return capacity\n },\n }\n}\n\n/**\n * Component-scoped {@link createStreamBuffer}. Created once and stable across\n * renders; cancels any pending flush on unmount. Read `buffer.signal.value` in\n * render to subscribe the component to the stream.\n */\nexport function useStreamBuffer<T>(options: StreamBufferOptions): StreamBuffer<T> {\n const ref = useRef<StreamBuffer<T> | null>(null)\n ref.current ??= createStreamBuffer<T>(options)\n\n // Cancel a pending frame on unmount so no flush fires after teardown.\n useSignalEffect(() => () => ref.current?.dispose())\n\n return ref.current\n}\n","'use client'\nimport { useRef } from 'react'\nimport {\n computed as coreComputed,\n effect as coreEffect,\n signal as coreSignal,\n useSignalEffect,\n type ReadonlySignal,\n type Signal,\n} from './signals.ts'\n\nexport interface SignalScope {\n /** Create a signal. Owned by the scope (dropped on dispose). */\n signal: <T>(value: T) => Signal<T>\n /** Create a computed. Owned by the scope. */\n computed: <T>(fn: () => T) => ReadonlySignal<T>\n /** Create an effect. Its subscription is torn down by `dispose()`. */\n effect: (fn: () => void | (() => void)) => () => void\n /** Tear down every owned effect. Idempotent. */\n dispose: () => void\n /** True once disposed. */\n readonly disposed: boolean\n}\n\n/**\n * A disposable owner for a set of signals/computeds/effects. Use one scope per\n * tenant boundary — a workspace, an org, a repository group. When the user\n * switches scope, call `dispose()` and create a fresh scope: every effect the\n * old scope started stops firing at once, with no orphaned subscriptions or\n * stale state left running against unmounted UI.\n *\n * This is a thin ownership wrapper over `@cascivo/core` signals — not a store,\n * not a context, not a DI container. Prefer it over accumulating per-workspace\n * state in a single global signal root, which leaks effects across switches.\n */\nexport function createScope(): SignalScope {\n const disposers = new Set<() => void>()\n let disposed = false\n\n return {\n signal: (value) => coreSignal(value),\n computed: (fn) => coreComputed(fn),\n effect: (fn) => {\n if (disposed) return () => {}\n const stop = coreEffect(fn)\n disposers.add(stop)\n return () => {\n disposers.delete(stop)\n stop()\n }\n },\n dispose: () => {\n if (disposed) return\n disposed = true\n for (const stop of disposers) stop()\n disposers.clear()\n },\n get disposed(): boolean {\n return disposed\n },\n }\n}\n\n/**\n * Bind a {@link createScope} to a component's lifetime: created once on mount,\n * disposed on unmount. The scope's effects stop when the component unmounts.\n */\nexport function useScope(): SignalScope {\n const ref = useRef<SignalScope | null>(null)\n ref.current ??= createScope()\n\n useSignalEffect(() => () => ref.current?.dispose())\n\n return ref.current\n}\n","'use client'\nimport { type CSSProperties, type RefObject } from 'react'\nimport { useSignal, useSignalEffect, useSignals, type Signal } from './signals.ts'\nimport { useId } from './use-id.ts'\n\nexport type AnchorSide = 'top' | 'bottom' | 'left' | 'right'\nexport type AnchorAlign = 'start' | 'center' | 'end'\nexport type AnchorPlacement = AnchorSide | `${AnchorSide}-${'start' | 'end'}`\n\nexport interface UseAnchorPositionOptions {\n anchorRef: RefObject<HTMLElement | null>\n floatingRef: RefObject<HTMLElement | null>\n placement?: AnchorPlacement\n /** Gate positioning (e.g. only while open). Default true. */\n enabled?: boolean | Signal<boolean>\n}\n\nexport interface UseAnchorPositionReturn {\n /** Spread onto the anchor element (CSS-anchor path sets `anchor-name`). */\n anchorStyle: CSSProperties\n /** Spread onto the floating element. */\n floatingStyle: CSSProperties\n /** Whether the CSS anchor-positioning primary path is active. */\n cssAnchorSupported: boolean\n}\n\nfunction supportsCssAnchor(): boolean {\n return (\n typeof CSS !== 'undefined' &&\n typeof CSS.supports === 'function' &&\n CSS.supports('anchor-name: --x')\n )\n}\n\nfunction parsePlacement(placement: AnchorPlacement): { side: AnchorSide; align: AnchorAlign } {\n const [side, end] = placement.split('-') as [AnchorSide, 'start' | 'end' | undefined]\n return { side, align: end ?? 'center' }\n}\n\n/** JS fallback math — position `floating` relative to `anchor` for the given placement. */\nexport function computePosition(\n anchor: {\n top: number\n left: number\n right: number\n bottom: number\n width: number\n height: number\n },\n floating: { width: number; height: number },\n placement: AnchorPlacement,\n): { top: number; left: number } {\n const { side, align } = parsePlacement(placement)\n let top = 0\n let left = 0\n if (side === 'top' || side === 'bottom') {\n top = side === 'bottom' ? anchor.bottom : anchor.top - floating.height\n left =\n align === 'start'\n ? anchor.left\n : align === 'end'\n ? anchor.right - floating.width\n : anchor.left + (anchor.width - floating.width) / 2\n } else {\n left = side === 'right' ? anchor.right : anchor.left - floating.width\n top =\n align === 'start'\n ? anchor.top\n : align === 'end'\n ? anchor.bottom - floating.height\n : anchor.top + (anchor.height - floating.height) / 2\n }\n return { top, left }\n}\n\nfunction cssAnchorInsets(side: AnchorSide, align: AnchorAlign): CSSProperties {\n const style: CSSProperties = {\n position: 'fixed',\n insetBlockStart: 'auto',\n insetInlineStart: 'auto',\n }\n if (side === 'bottom') style.top = 'anchor(bottom)'\n if (side === 'top') style.bottom = 'anchor(top)'\n if (side === 'right') style.left = 'anchor(right)'\n if (side === 'left') style.right = 'anchor(left)'\n if (side === 'top' || side === 'bottom') {\n style.left = align === 'end' ? undefined : align === 'start' ? 'anchor(left)' : 'anchor(center)'\n if (align === 'end') style.right = 'anchor(right)'\n } else {\n style.top = align === 'end' ? undefined : align === 'start' ? 'anchor(top)' : 'anchor(center)'\n if (align === 'end') style.bottom = 'anchor(bottom)'\n }\n return style\n}\n\n/**\n * Positions a floating element relative to an anchor. Primary path: CSS anchor positioning\n * (Chrome-leading) — emits `anchor-name`/`position-anchor` + `anchor()` insets. Fallback (behind\n * `CSS.supports`): JS `getBoundingClientRect` placement recomputed on scroll/resize inside\n * `useSignalEffect`. Small by design — not a collision/flip engine (deferred).\n */\nexport function useAnchorPosition(options: UseAnchorPositionOptions): UseAnchorPositionReturn {\n const { anchorRef, floatingRef, placement = 'bottom', enabled = true } = options\n useSignals()\n const supported = supportsCssAnchor()\n const name = useId('anchor')\n const pos = useSignal<{ top: number; left: number } | null>(null)\n\n useSignalEffect(() => {\n const isEnabled = typeof enabled === 'boolean' ? enabled : enabled.value\n if (supported || !isEnabled || typeof window === 'undefined') return\n\n const update = (): void => {\n const a = anchorRef.current\n const f = floatingRef.current\n if (!a || !f) return\n pos.value = computePosition(a.getBoundingClientRect(), f.getBoundingClientRect(), placement)\n }\n update()\n window.addEventListener('scroll', update, true)\n window.addEventListener('resize', update)\n return () => {\n window.removeEventListener('scroll', update, true)\n window.removeEventListener('resize', update)\n }\n })\n\n if (supported) {\n const { side, align } = parsePlacement(placement)\n return {\n anchorStyle: { anchorName: `--${name}` } as CSSProperties,\n floatingStyle: {\n positionAnchor: `--${name}`,\n ...cssAnchorInsets(side, align),\n } as CSSProperties,\n cssAnchorSupported: true,\n }\n }\n\n const p = pos.value\n return {\n anchorStyle: {},\n floatingStyle: p\n ? { position: 'fixed', top: p.top, left: p.left }\n : { position: 'fixed', visibility: 'hidden' },\n cssAnchorSupported: false,\n }\n}\n","export { createMachine, useMachine } from './machine.ts'\nexport {\n signal,\n computed,\n effect,\n batch,\n useSignal,\n useComputed,\n useSignalEffect,\n useSignals,\n} from './signals.ts'\nexport type { Signal, ReadonlySignal } from './signals.ts'\nexport { cn, composeRefs, mergeProps } from './utils.ts'\nexport type {\n Machine,\n MachineConfig,\n StateConfig,\n ComponentMeta,\n PropMeta,\n TypeFieldMeta,\n TypeDefMeta,\n AccessibilityMeta,\n WcagLevel,\n ExampleMeta,\n ComponentIntent,\n IntentAntiPattern,\n IntentRelated,\n IntentFlexibility,\n IntentContent,\n IntentRelationship,\n} from './types.ts'\nexport const VERSION = '0.0.0'\nexport { ErrorBoundary } from './error-boundary.tsx'\nexport type { ErrorBoundaryProps } from './error-boundary.tsx'\nexport { SuspenseBoundary } from './suspense-boundary.tsx'\nexport type { SuspenseBoundaryProps } from './suspense-boundary.tsx'\nexport { Portal } from './portal.tsx'\nexport type { PortalProps } from './portal.tsx'\nexport { VisuallyHidden } from './visually-hidden.tsx'\nexport type { VisuallyHiddenProps } from './visually-hidden.tsx'\nexport { FocusScope } from './focus-scope.tsx'\nexport type { FocusScopeProps } from './focus-scope.tsx'\nexport { Slot } from './slot.tsx'\nexport type { SlotProps } from './slot.tsx'\nexport { useControllableSignal } from './controllable.ts'\nexport type { UseControllableSignalOptions } from './controllable.ts'\nexport { useMediaQuery } from './media-query.ts'\nexport { useScrollLock } from './scroll-lock.ts'\nexport { useId } from './use-id.ts'\nexport { useClipboard } from './clipboard.ts'\nexport type { UseClipboardOptions, UseClipboardReturn } from './clipboard.ts'\nexport { useDisclosure } from './disclosure.ts'\nexport type { UseDisclosureOptions, UseDisclosureReturn } from './disclosure.ts'\nexport { useInfiniteScroll } from './infinite-scroll.ts'\nexport type { UseInfiniteScrollOptions, UseInfiniteScrollReturn } from './infinite-scroll.ts'\nexport { useDraggable } from './draggable.ts'\nexport type {\n DragOffset,\n DragVelocity,\n UseDraggableOptions,\n UseDraggableReturn,\n} from './draggable.ts'\nexport { useResizeObserver } from './resize-observer.ts'\nexport type {\n ElementSize,\n UseResizeObserverOptions,\n UseResizeObserverReturn,\n} from './resize-observer.ts'\nexport { useMutationObserver } from './mutation-observer.ts'\nexport type { UseMutationObserverReturn } from './mutation-observer.ts'\nexport { useIntersectionObserver } from './intersection-observer.ts'\nexport type {\n UseIntersectionObserverOptions,\n UseIntersectionObserverReturn,\n} from './intersection-observer.ts'\nexport { DismissableLayer } from './dismissable-layer.tsx'\nexport type { DismissableLayerProps } from './dismissable-layer.tsx'\nexport { useTypeahead } from './typeahead.ts'\nexport type { UseTypeaheadOptions, UseTypeaheadReturn } from './typeahead.ts'\nexport { useRovingFocus } from './roving-focus.ts'\nexport type {\n UseRovingFocusOptions,\n UseRovingFocusReturn,\n RovingItemProps,\n RovingOrientation,\n} from './roving-focus.ts'\nexport { Presence } from './presence.tsx'\nexport type { PresenceProps } from './presence.tsx'\nexport { createStreamBuffer, useStreamBuffer } from './stream-buffer.ts'\nexport type { StreamBuffer, StreamBufferOptions } from './stream-buffer.ts'\nexport { createScope, useScope } from './scope.ts'\nexport type { SignalScope } from './scope.ts'\nexport { useAnchorPosition, computePosition } from './anchor.tsx'\nexport type {\n UseAnchorPositionOptions,\n UseAnchorPositionReturn,\n AnchorPlacement,\n AnchorSide,\n AnchorAlign,\n} from './anchor.tsx'\n"],"mappings":"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"}
|