@intentface/chat 0.1.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.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +108 -0
  3. package/dist/ask-user/ask-user.d.ts +104 -0
  4. package/dist/ask-user/ask-user.js +226 -0
  5. package/dist/ask-user/index.d.ts +3 -0
  6. package/dist/ask-user/index.js +3 -0
  7. package/dist/ask-user/index.parts.d.ts +1 -0
  8. package/dist/ask-user/index.parts.js +5 -0
  9. package/dist/attachments/attachments.d.ts +41 -0
  10. package/dist/attachments/attachments.js +91 -0
  11. package/dist/attachments/index.d.ts +3 -0
  12. package/dist/attachments/index.js +3 -0
  13. package/dist/attachments/index.parts.d.ts +1 -0
  14. package/dist/attachments/index.parts.js +5 -0
  15. package/dist/chip/chip.d.ts +25 -0
  16. package/dist/chip/chip.js +25 -0
  17. package/dist/chip/index.d.ts +2 -0
  18. package/dist/chip/index.js +2 -0
  19. package/dist/chip/index.parts.d.ts +1 -0
  20. package/dist/chip/index.parts.js +5 -0
  21. package/dist/chip-markdown.d.ts +25 -0
  22. package/dist/chip-markdown.js +52 -0
  23. package/dist/composer/actions.d.ts +35 -0
  24. package/dist/composer/actions.js +75 -0
  25. package/dist/composer/ask-user-machine.d.ts +52 -0
  26. package/dist/composer/ask-user-machine.js +164 -0
  27. package/dist/composer/attachments-machine.d.ts +34 -0
  28. package/dist/composer/attachments-machine.js +91 -0
  29. package/dist/composer/attachments.d.ts +16 -0
  30. package/dist/composer/attachments.js +32 -0
  31. package/dist/composer/command-list.d.ts +49 -0
  32. package/dist/composer/command-list.js +357 -0
  33. package/dist/composer/commands.d.ts +28 -0
  34. package/dist/composer/commands.js +56 -0
  35. package/dist/composer/container.d.ts +3 -0
  36. package/dist/composer/container.js +32 -0
  37. package/dist/composer/controller.d.ts +3 -0
  38. package/dist/composer/controller.js +6 -0
  39. package/dist/composer/editor-dom.d.ts +55 -0
  40. package/dist/composer/editor-dom.js +431 -0
  41. package/dist/composer/fuzzy.d.ts +4 -0
  42. package/dist/composer/fuzzy.js +49 -0
  43. package/dist/composer/index.d.ts +25 -0
  44. package/dist/composer/index.js +13 -0
  45. package/dist/composer/index.parts.d.ts +11 -0
  46. package/dist/composer/index.parts.js +15 -0
  47. package/dist/composer/internals.d.ts +29 -0
  48. package/dist/composer/internals.js +102 -0
  49. package/dist/composer/keyboard.d.ts +61 -0
  50. package/dist/composer/keyboard.js +75 -0
  51. package/dist/composer/panel.d.ts +28 -0
  52. package/dist/composer/panel.js +80 -0
  53. package/dist/composer/placeholder.d.ts +10 -0
  54. package/dist/composer/placeholder.js +8 -0
  55. package/dist/composer/popover.d.ts +12 -0
  56. package/dist/composer/popover.js +63 -0
  57. package/dist/composer/prefix-detection.d.ts +23 -0
  58. package/dist/composer/prefix-detection.js +58 -0
  59. package/dist/composer/root.d.ts +21 -0
  60. package/dist/composer/root.js +107 -0
  61. package/dist/composer/segments.d.ts +108 -0
  62. package/dist/composer/segments.js +366 -0
  63. package/dist/composer/store.d.ts +97 -0
  64. package/dist/composer/store.js +451 -0
  65. package/dist/composer/textarea.d.ts +39 -0
  66. package/dist/composer/textarea.js +64 -0
  67. package/dist/composer/trigger-tracker.d.ts +12 -0
  68. package/dist/composer/trigger-tracker.js +90 -0
  69. package/dist/composer/types.d.ts +126 -0
  70. package/dist/composer/types.js +4 -0
  71. package/dist/composer/use-composer-editor.d.ts +43 -0
  72. package/dist/composer/use-composer-editor.js +649 -0
  73. package/dist/internal/collapsible.d.ts +22 -0
  74. package/dist/internal/collapsible.js +90 -0
  75. package/dist/internal/primitive-props.d.ts +4 -0
  76. package/dist/internal/primitive-props.js +4 -0
  77. package/dist/internal/render/baseTypes.d.ts +18 -0
  78. package/dist/internal/render/baseTypes.js +4 -0
  79. package/dist/internal/render/empty.d.ts +3 -0
  80. package/dist/internal/render/empty.js +5 -0
  81. package/dist/internal/render/getReactElementRef.d.ts +5 -0
  82. package/dist/internal/render/getReactElementRef.js +15 -0
  83. package/dist/internal/render/getStateAttributesProps.d.ts +4 -0
  84. package/dist/internal/render/getStateAttributesProps.js +23 -0
  85. package/dist/internal/render/mergeObjects.d.ts +1 -0
  86. package/dist/internal/render/mergeObjects.js +14 -0
  87. package/dist/internal/render/mergeProps.d.ts +55 -0
  88. package/dist/internal/render/mergeProps.js +183 -0
  89. package/dist/internal/render/positioning.d.ts +22 -0
  90. package/dist/internal/render/positioning.js +78 -0
  91. package/dist/internal/render/reactVersion.d.ts +3 -0
  92. package/dist/internal/render/reactVersion.js +7 -0
  93. package/dist/internal/render/resolveClassName.d.ts +8 -0
  94. package/dist/internal/render/resolveClassName.js +12 -0
  95. package/dist/internal/render/resolveStyle.d.ts +8 -0
  96. package/dist/internal/render/resolveStyle.js +12 -0
  97. package/dist/internal/render/transition.d.ts +48 -0
  98. package/dist/internal/render/transition.js +203 -0
  99. package/dist/internal/render/types.d.ts +74 -0
  100. package/dist/internal/render/types.js +3 -0
  101. package/dist/internal/render/useMergedRefs.d.ts +21 -0
  102. package/dist/internal/render/useMergedRefs.js +102 -0
  103. package/dist/internal/render/useRefWithInit.d.ts +10 -0
  104. package/dist/internal/render/useRefWithInit.js +12 -0
  105. package/dist/internal/render/useRender.d.ts +71 -0
  106. package/dist/internal/render/useRender.js +12 -0
  107. package/dist/internal/render/useRenderElement.d.ts +62 -0
  108. package/dist/internal/render/useRenderElement.js +157 -0
  109. package/dist/internal/render/warn.d.ts +1 -0
  110. package/dist/internal/render/warn.js +15 -0
  111. package/dist/internal/state-mappings.d.ts +8 -0
  112. package/dist/internal/state-mappings.js +17 -0
  113. package/dist/message/index.d.ts +3 -0
  114. package/dist/message/index.js +3 -0
  115. package/dist/message/index.parts.d.ts +1 -0
  116. package/dist/message/index.parts.js +5 -0
  117. package/dist/message/message.d.ts +43 -0
  118. package/dist/message/message.js +78 -0
  119. package/dist/message-utils.d.ts +55 -0
  120. package/dist/message-utils.js +79 -0
  121. package/dist/reasoning/index.d.ts +3 -0
  122. package/dist/reasoning/index.js +3 -0
  123. package/dist/reasoning/index.parts.d.ts +1 -0
  124. package/dist/reasoning/index.parts.js +5 -0
  125. package/dist/reasoning/reasoning.d.ts +20 -0
  126. package/dist/reasoning/reasoning.js +49 -0
  127. package/dist/steps/index.d.ts +2 -0
  128. package/dist/steps/index.js +2 -0
  129. package/dist/steps/index.parts.d.ts +1 -0
  130. package/dist/steps/index.parts.js +5 -0
  131. package/dist/steps/steps.d.ts +53 -0
  132. package/dist/steps/steps.js +79 -0
  133. package/dist/thread/geometry.d.ts +18 -0
  134. package/dist/thread/geometry.js +59 -0
  135. package/dist/thread/index.d.ts +4 -0
  136. package/dist/thread/index.js +3 -0
  137. package/dist/thread/index.parts.d.ts +1 -0
  138. package/dist/thread/index.parts.js +5 -0
  139. package/dist/thread/stores.d.ts +21 -0
  140. package/dist/thread/stores.js +63 -0
  141. package/dist/thread/thread.d.ts +66 -0
  142. package/dist/thread/thread.js +639 -0
  143. package/dist/types.d.ts +58 -0
  144. package/dist/types.js +17 -0
  145. package/package.json +106 -0
@@ -0,0 +1,48 @@
1
+ import { type RefObject } from "react";
2
+ export type TransitionStatus = "starting" | "ending" | "idle" | undefined;
3
+ /**
4
+ * A status string for CSS open/close animations.
5
+ * @param open - whether the element is open.
6
+ * @param enableIdleState - enables the `'idle'` state between `'starting'` and settled.
7
+ * @param deferEndingState - defer the `'ending'` state by a frame (avoids a same-commit flip).
8
+ */
9
+ export declare const useTransitionStatus: (open: boolean, enableIdleState?: boolean, deferEndingState?: boolean) => {
10
+ mounted: boolean;
11
+ setMounted: import("react").Dispatch<import("react").SetStateAction<boolean>>;
12
+ transitionStatus: TransitionStatus;
13
+ };
14
+ /**
15
+ * Returns a function that runs `fn` once all animations on the element finish (or immediately
16
+ * if none / unsupported). Flushes synchronously so the browser can't paint a settled frame
17
+ * before the component unmounts (mui/base-ui#979).
18
+ */
19
+ export declare const useAnimationsFinished: (elementOrRef: RefObject<HTMLElement | null> | HTMLElement | null, waitForStartingStyleRemoved?: boolean, treatAbortedAsFinished?: boolean) => (fnToExecute: () => void, signal?: AbortSignal | null | undefined) => void | undefined;
20
+ export type UseOpenChangeCompleteParameters = {
21
+ /** Whether the hook is enabled. @default true */
22
+ enabled?: boolean;
23
+ /** Whether the element is open. */
24
+ open?: boolean;
25
+ /** Ref to the animating element. */
26
+ ref: RefObject<HTMLElement | null>;
27
+ /** Called once the open/close animation completes (or there is no animation). */
28
+ onComplete: () => void;
29
+ };
30
+ /** Calls `onComplete` when the CSS open/close animation or transition completes. */
31
+ export declare const useOpenChangeComplete: ({ enabled, open, ref, onComplete: onCompleteParam, }: UseOpenChangeCompleteParameters) => void;
32
+ export type UseOpenTransitionOptions = {
33
+ /** Measure the element's natural height into `height` (for a height-collapse CSS var). */
34
+ measureHeight?: boolean;
35
+ /** Called when the close animation completes, alongside the internal unmount. */
36
+ onClosed?: () => void;
37
+ };
38
+ /**
39
+ * Drives a Base UI-style open/close for an element: keeps it `mounted` through the exit,
40
+ * reports `transitionStatus` (feed it to a stateAttributesMapping for data-open/closed/
41
+ * starting-style/ending-style), optionally measures its natural `height`, and unmounts once
42
+ * `element.getAnimations()` resolve. Composes useTransitionStatus + useOpenChangeComplete.
43
+ */
44
+ export declare const useOpenTransition: (open: boolean, ref: RefObject<HTMLElement | null>, { measureHeight, onClosed }?: UseOpenTransitionOptions) => {
45
+ mounted: boolean;
46
+ transitionStatus: TransitionStatus;
47
+ height: number | null;
48
+ };
@@ -0,0 +1,203 @@
1
+ "use client";
2
+ // Adapted from @base-ui/react master (MIT) — the open/close transition lifecycle hooks
3
+ // (internals/useTransitionStatus, useAnimationsFinished, useOpenChangeComplete). Consolidated
4
+ // into one self-contained module and trimmed of the @base-ui/utils runtime dep (the tiny
5
+ // AnimationFrame / useStableCallback / resolveRef helpers are inlined), mirroring how this
6
+ // package already vendors useRenderElement. Behavior is preserved.
7
+ //
8
+ // Model: presence is the `mounted` boolean; `transitionStatus` is a CSS-animation status
9
+ // ('starting' | 'ending' | 'idle' | undefined). Pair with data-starting-style/data-ending-style
10
+ // (see state-mappings.ts) and drive unmount off `mounted`, cleared once animations finish.
11
+ import { useEffect, useInsertionEffect, useLayoutEffect, useRef, useState, } from "react";
12
+ import { flushSync } from "react-dom";
13
+ import { useRefWithInit } from "./useRefWithInit.js";
14
+ const useIsoLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
15
+ // ---------------------------------------------------------------------------
16
+ // Small helpers (inlined from @base-ui/utils)
17
+ // ---------------------------------------------------------------------------
18
+ // Stable callback: identity-stable trampoline over the latest callback. Must only be called
19
+ // from effects/handlers, never during render.
20
+ const useStableCallback = (callback) => {
21
+ const latest = useRef(callback);
22
+ useInsertionEffect(() => {
23
+ latest.current = callback;
24
+ });
25
+ return useRefWithInit(() => (...args) => latest.current?.(...args)).current;
26
+ };
27
+ const resolveRef = (elementOrRef) => elementOrRef && "current" in elementOrRef ? elementOrRef.current : elementOrRef;
28
+ // requestAnimationFrame handle with auto-cancel on unmount and single-in-flight semantics.
29
+ class AnimationFrameHandle {
30
+ id = null;
31
+ request(fn) {
32
+ this.cancel();
33
+ this.id = requestAnimationFrame(() => {
34
+ this.id = null;
35
+ fn();
36
+ });
37
+ }
38
+ cancel = () => {
39
+ if (this.id !== null) {
40
+ cancelAnimationFrame(this.id);
41
+ this.id = null;
42
+ }
43
+ };
44
+ }
45
+ const useAnimationFrame = () => {
46
+ const handle = useRefWithInit(() => new AnimationFrameHandle()).current;
47
+ useEffect(() => handle.cancel, [handle]);
48
+ return handle;
49
+ };
50
+ /**
51
+ * A status string for CSS open/close animations.
52
+ * @param open - whether the element is open.
53
+ * @param enableIdleState - enables the `'idle'` state between `'starting'` and settled.
54
+ * @param deferEndingState - defer the `'ending'` state by a frame (avoids a same-commit flip).
55
+ */
56
+ export const useTransitionStatus = (open, enableIdleState = false, deferEndingState = false) => {
57
+ const [transitionStatus, setTransitionStatus] = useState(open && enableIdleState ? "idle" : undefined);
58
+ const [mounted, setMounted] = useState(open);
59
+ if (open && !mounted) {
60
+ setMounted(true);
61
+ setTransitionStatus("starting");
62
+ }
63
+ if (!open && mounted && transitionStatus !== "ending" && !deferEndingState) {
64
+ setTransitionStatus("ending");
65
+ }
66
+ if (!open && !mounted && transitionStatus === "ending") {
67
+ setTransitionStatus(undefined);
68
+ }
69
+ useIsoLayoutEffect(() => {
70
+ if (!open && mounted && transitionStatus !== "ending" && deferEndingState) {
71
+ const frame = requestAnimationFrame(() => setTransitionStatus("ending"));
72
+ return () => cancelAnimationFrame(frame);
73
+ }
74
+ return undefined;
75
+ }, [open, mounted, transitionStatus, deferEndingState]);
76
+ useIsoLayoutEffect(() => {
77
+ if (!open || enableIdleState)
78
+ return undefined;
79
+ // Avoid flushSync here (Firefox). See mui/base-ui#3424.
80
+ const frame = requestAnimationFrame(() => setTransitionStatus(undefined));
81
+ return () => cancelAnimationFrame(frame);
82
+ }, [enableIdleState, open]);
83
+ useIsoLayoutEffect(() => {
84
+ if (!open || !enableIdleState)
85
+ return undefined;
86
+ if (open && mounted && transitionStatus !== "idle") {
87
+ setTransitionStatus("starting");
88
+ }
89
+ const frame = requestAnimationFrame(() => setTransitionStatus("idle"));
90
+ return () => cancelAnimationFrame(frame);
91
+ }, [enableIdleState, open, mounted, transitionStatus]);
92
+ return { mounted, setMounted, transitionStatus };
93
+ };
94
+ // ---------------------------------------------------------------------------
95
+ // useAnimationsFinished
96
+ // ---------------------------------------------------------------------------
97
+ /**
98
+ * Returns a function that runs `fn` once all animations on the element finish (or immediately
99
+ * if none / unsupported). Flushes synchronously so the browser can't paint a settled frame
100
+ * before the component unmounts (mui/base-ui#979).
101
+ */
102
+ export const useAnimationsFinished = (elementOrRef, waitForStartingStyleRemoved = false, treatAbortedAsFinished = true) => {
103
+ const frame = useAnimationFrame();
104
+ return useStableCallback((fnToExecute, signal = null) => {
105
+ frame.cancel();
106
+ const element = resolveRef(elementOrRef);
107
+ if (element == null)
108
+ return;
109
+ const resolvedElement = element;
110
+ const done = () => flushSync(fnToExecute);
111
+ if (typeof resolvedElement.getAnimations !== "function") {
112
+ fnToExecute();
113
+ return;
114
+ }
115
+ const exec = () => {
116
+ Promise.all(resolvedElement.getAnimations().map((animation) => animation.finished))
117
+ .then(() => {
118
+ if (!signal?.aborted)
119
+ done();
120
+ })
121
+ .catch(() => {
122
+ if (treatAbortedAsFinished) {
123
+ if (!signal?.aborted)
124
+ done();
125
+ return;
126
+ }
127
+ const current = resolvedElement.getAnimations();
128
+ if (!signal?.aborted &&
129
+ current.length > 0 &&
130
+ current.some((animation) => animation.pending || animation.playState !== "finished")) {
131
+ // A dependency changed mid-animation and aborted it; re-check for new animations.
132
+ exec();
133
+ }
134
+ });
135
+ };
136
+ if (waitForStartingStyleRemoved) {
137
+ const startingStyleAttribute = "data-starting-style";
138
+ // Not present yet → wait a frame so "open" animations can register.
139
+ if (!resolvedElement.hasAttribute(startingStyleAttribute)) {
140
+ frame.request(exec);
141
+ return;
142
+ }
143
+ // Wait for [data-starting-style] to be removed, then check.
144
+ const observer = new MutationObserver(() => {
145
+ if (!resolvedElement.hasAttribute(startingStyleAttribute)) {
146
+ observer.disconnect();
147
+ exec();
148
+ }
149
+ });
150
+ observer.observe(resolvedElement, {
151
+ attributes: true,
152
+ attributeFilter: [startingStyleAttribute],
153
+ });
154
+ signal?.addEventListener("abort", () => observer.disconnect(), { once: true });
155
+ return;
156
+ }
157
+ frame.request(exec);
158
+ });
159
+ };
160
+ /** Calls `onComplete` when the CSS open/close animation or transition completes. */
161
+ export const useOpenChangeComplete = ({ enabled = true, open, ref, onComplete: onCompleteParam, }) => {
162
+ const onComplete = useStableCallback(onCompleteParam);
163
+ const runOnceAnimationsFinish = useAnimationsFinished(ref, open, false);
164
+ // biome-ignore lint/correctness/useExhaustiveDependencies: `open` isn't read in the body but re-arms the finalize when it flips — runOnceAnimationsFinish is identity-stable, so without it the effect wouldn't re-run on open/close (matches Base UI).
165
+ useEffect(() => {
166
+ if (!enabled)
167
+ return undefined;
168
+ const abortController = new AbortController();
169
+ runOnceAnimationsFinish(onComplete, abortController.signal);
170
+ return () => abortController.abort();
171
+ }, [enabled, open, onComplete, runOnceAnimationsFinish]);
172
+ };
173
+ /**
174
+ * Drives a Base UI-style open/close for an element: keeps it `mounted` through the exit,
175
+ * reports `transitionStatus` (feed it to a stateAttributesMapping for data-open/closed/
176
+ * starting-style/ending-style), optionally measures its natural `height`, and unmounts once
177
+ * `element.getAnimations()` resolve. Composes useTransitionStatus + useOpenChangeComplete.
178
+ */
179
+ export const useOpenTransition = (open, ref, { measureHeight = false, onClosed } = {}) => {
180
+ const { mounted, setMounted, transitionStatus } = useTransitionStatus(open);
181
+ const [height, setHeight] = useState(null);
182
+ // Measure on the transitional frames (before the CSS transition runs). scrollHeight is the
183
+ // natural content height regardless of any clamp the data-starting/ending-style sets.
184
+ useIsoLayoutEffect(() => {
185
+ if (!measureHeight)
186
+ return;
187
+ if (transitionStatus === "starting" || transitionStatus === "ending") {
188
+ const element = ref.current;
189
+ if (element)
190
+ setHeight(element.scrollHeight);
191
+ }
192
+ }, [measureHeight, transitionStatus, ref]);
193
+ useOpenChangeComplete({
194
+ open,
195
+ ref,
196
+ enabled: !open && mounted,
197
+ onComplete: () => {
198
+ setMounted(false);
199
+ onClosed?.();
200
+ },
201
+ });
202
+ return { mounted, transitionStatus, height };
203
+ };
@@ -0,0 +1,74 @@
1
+ import type * as React from 'react';
2
+ import type { BaseUIEvent, ComponentRenderFn, HTMLProps } from './baseTypes';
3
+ export type { HTMLProps, BaseUIEvent, ComponentRenderFn };
4
+ export type MaybeBaseUIEvent<E extends React.SyntheticEvent<Element, Event>> = E & Partial<Pick<BaseUIEvent<E>, 'preventBaseUIHandler' | 'baseUIHandlerPrevented'>>;
5
+ export interface FloatingUIOpenChangeDetails {
6
+ open: boolean;
7
+ reason: string;
8
+ nativeEvent: Event;
9
+ nested: boolean;
10
+ triggerElement?: Element | undefined;
11
+ }
12
+ type WithPreventBaseUIHandler<T> = T extends (event: infer E) => any ? E extends React.SyntheticEvent<Element, Event> ? (event: BaseUIEvent<E>) => ReturnType<T> : T : T extends undefined ? undefined : T;
13
+ /**
14
+ * Adds a `preventBaseUIHandler` method to all event handlers.
15
+ */
16
+ export type WithBaseUIEvent<T> = {
17
+ [K in keyof T]: WithPreventBaseUIHandler<T[K]>;
18
+ };
19
+ /**
20
+ * Props shared by all Base UI components.
21
+ * Contains `className` (string or callback taking the component's state as an argument) and `render` (function to customize rendering).
22
+ */
23
+ export type BaseUIComponentProps<ElementType extends React.ElementType, State, RenderFunctionProps = HTMLProps> = Omit<WithBaseUIEvent<React.ComponentPropsWithRef<ElementType>>, 'className' | 'color' | 'defaultValue' | 'defaultChecked' | 'style'> & {
24
+ /**
25
+ * CSS class applied to the element, or a function that
26
+ * returns a class based on the component's state.
27
+ */
28
+ className?: string | ((state: State) => string | undefined) | undefined;
29
+ /**
30
+ * Allows you to replace the component's HTML element
31
+ * with a different tag, or compose it with another component.
32
+ *
33
+ * Accepts a `ReactElement` or a function that returns the element to render.
34
+ */
35
+ render?: React.ReactElement | ComponentRenderFn<RenderFunctionProps, State> | undefined;
36
+ /**
37
+ * Style applied to the element, or a function that
38
+ * returns a style object based on the component's state.
39
+ */
40
+ style?: React.CSSProperties | ((state: State) => React.CSSProperties | undefined) | undefined;
41
+ };
42
+ export interface NativeButtonProps {
43
+ /**
44
+ * Whether the component renders a native `<button>` element when replacing it
45
+ * via the `render` prop.
46
+ * Set to `false` if the rendered element is not a button (for example, `<div>`).
47
+ * @default true
48
+ */
49
+ nativeButton?: boolean | undefined;
50
+ }
51
+ export interface NonNativeButtonProps {
52
+ /**
53
+ * Whether the component renders a native `<button>` element when replacing it
54
+ * via the `render` prop.
55
+ * Set to `true` if the rendered element is a native button.
56
+ * @default false
57
+ */
58
+ nativeButton?: boolean | undefined;
59
+ }
60
+ /**
61
+ * Simplifies the display of a type (without modifying it).
62
+ * Taken from https://effectivetypescript.com/2022/02/25/gentips-4-display/
63
+ */
64
+ export type Simplify<T> = T extends Function ? T : {
65
+ [K in keyof T]: T[K];
66
+ };
67
+ /**
68
+ * Makes specified keys in a type required.
69
+ *
70
+ * @template T - The original type.
71
+ * @template K - The keys to make required.
72
+ */
73
+ export type RequiredExcept<T, K extends keyof T> = Required<Omit<T, K>> & Pick<T, K>;
74
+ export type Orientation = 'horizontal' | 'vertical';
@@ -0,0 +1,3 @@
1
+ // Vendored from @base-ui/react v1.6.0 (MIT) — packages/react/src/internals/types.ts
2
+ // https://github.com/mui/base-ui — exact copy; only import specifiers rewired.
3
+ export {};
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+ type Empty = null | undefined;
3
+ type InputRef<I> = React.Ref<I> | Empty;
4
+ type Result<I> = React.RefCallback<I> | null;
5
+ /**
6
+ * Merges refs into a single memoized callback ref or `null`.
7
+ * This makes sure multiple refs are updated together and have the same value.
8
+ *
9
+ * This function accepts up to four refs. If you need to merge more, or have an unspecified number of refs to merge,
10
+ * use `useMergedRefsN` instead.
11
+ */
12
+ export declare function useMergedRefs<I>(a: InputRef<I>, b: InputRef<I>): Result<I>;
13
+ export declare function useMergedRefs<I>(a: InputRef<I>, b: InputRef<I>, c: InputRef<I>): Result<I>;
14
+ export declare function useMergedRefs<I>(a: InputRef<I>, b: InputRef<I>, c: InputRef<I>, d: InputRef<I>): Result<I>;
15
+ /**
16
+ * Merges an array of refs into a single memoized callback ref or `null`.
17
+ *
18
+ * If you need to merge a fixed number (up to four) of refs, use `useMergedRefs` instead for better performance.
19
+ */
20
+ export declare function useMergedRefsN<I>(refs: InputRef<I>[]): Result<I>;
21
+ export {};
@@ -0,0 +1,102 @@
1
+ // Vendored from @base-ui/utils v1.6.0 (MIT) — packages/utils/src/useMergedRefs.ts
2
+ // https://github.com/mui/base-ui — exact copy.
3
+ import * as React from 'react';
4
+ import { useRefWithInit } from './useRefWithInit';
5
+ export function useMergedRefs(a, b, c, d) {
6
+ const forkRef = useRefWithInit((createForkRef)).current;
7
+ if (didChange(forkRef, a, b, c, d)) {
8
+ update(forkRef, [a, b, c, d]);
9
+ }
10
+ return forkRef.callback;
11
+ }
12
+ /**
13
+ * Merges an array of refs into a single memoized callback ref or `null`.
14
+ *
15
+ * If you need to merge a fixed number (up to four) of refs, use `useMergedRefs` instead for better performance.
16
+ */
17
+ export function useMergedRefsN(refs) {
18
+ const forkRef = useRefWithInit((createForkRef)).current;
19
+ if (didChangeN(forkRef, refs)) {
20
+ update(forkRef, refs);
21
+ }
22
+ return forkRef.callback;
23
+ }
24
+ function createForkRef() {
25
+ return {
26
+ callback: null,
27
+ cleanup: null,
28
+ refs: [],
29
+ };
30
+ }
31
+ function didChange(forkRef, a, b, c, d) {
32
+ // prettier-ignore
33
+ return (forkRef.refs[0] !== a ||
34
+ forkRef.refs[1] !== b ||
35
+ forkRef.refs[2] !== c ||
36
+ forkRef.refs[3] !== d);
37
+ }
38
+ function didChangeN(forkRef, newRefs) {
39
+ return (forkRef.refs.length !== newRefs.length ||
40
+ forkRef.refs.some((ref, index) => ref !== newRefs[index]));
41
+ }
42
+ function update(forkRef, refs) {
43
+ forkRef.refs = refs;
44
+ if (refs.every((ref) => ref == null)) {
45
+ forkRef.callback = null;
46
+ return;
47
+ }
48
+ forkRef.callback = (instance) => {
49
+ if (forkRef.cleanup) {
50
+ forkRef.cleanup();
51
+ forkRef.cleanup = null;
52
+ }
53
+ if (instance != null) {
54
+ const cleanupCallbacks = Array(refs.length).fill(null);
55
+ for (let i = 0; i < refs.length; i += 1) {
56
+ const ref = refs[i];
57
+ if (ref == null) {
58
+ continue;
59
+ }
60
+ switch (typeof ref) {
61
+ case 'function': {
62
+ const refCleanup = ref(instance);
63
+ if (typeof refCleanup === 'function') {
64
+ cleanupCallbacks[i] = refCleanup;
65
+ }
66
+ break;
67
+ }
68
+ case 'object': {
69
+ ref.current = instance;
70
+ break;
71
+ }
72
+ default:
73
+ }
74
+ }
75
+ forkRef.cleanup = () => {
76
+ for (let i = 0; i < refs.length; i += 1) {
77
+ const ref = refs[i];
78
+ if (ref == null) {
79
+ continue;
80
+ }
81
+ switch (typeof ref) {
82
+ case 'function': {
83
+ const cleanupCallback = cleanupCallbacks[i];
84
+ if (typeof cleanupCallback === 'function') {
85
+ cleanupCallback();
86
+ }
87
+ else {
88
+ ref(null);
89
+ }
90
+ break;
91
+ }
92
+ case 'object': {
93
+ ref.current = null;
94
+ break;
95
+ }
96
+ default:
97
+ }
98
+ }
99
+ };
100
+ }
101
+ };
102
+ }
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * A React.useRef() that is initialized with a function. Note that it accepts an optional
4
+ * initialization argument, so the initialization function doesn't need to be an inline closure.
5
+ *
6
+ * @usage
7
+ * const ref = useRefWithInit(sortColumns, columns)
8
+ */
9
+ export declare function useRefWithInit<T>(init: () => T): React.RefObject<T>;
10
+ export declare function useRefWithInit<T, U>(init: (arg: U) => T, initArg: U): React.RefObject<T>;
@@ -0,0 +1,12 @@
1
+ // Vendored from @base-ui/utils v1.6.0 (MIT) — packages/utils/src/useRefWithInit.ts
2
+ // https://github.com/mui/base-ui — exact copy.
3
+ 'use client';
4
+ import * as React from 'react';
5
+ const UNINITIALIZED = {};
6
+ export function useRefWithInit(init, initArg) {
7
+ const ref = React.useRef(UNINITIALIZED);
8
+ if (ref.current === UNINITIALIZED) {
9
+ ref.current = init(initArg);
10
+ }
11
+ return ref;
12
+ }
@@ -0,0 +1,71 @@
1
+ import * as React from 'react';
2
+ import type { ComponentRenderFn } from './types';
3
+ import type { HTMLProps } from './types';
4
+ import type { StateAttributesMapping } from './getStateAttributesProps';
5
+ /**
6
+ * Renders a Base UI element.
7
+ *
8
+ * @public
9
+ */
10
+ export declare function useRender<State extends Record<string, unknown>, RenderedElementType extends Element, Enabled extends boolean | undefined = undefined>(params: useRender.Parameters<State, RenderedElementType, Enabled>): useRender.ReturnValue<Enabled>;
11
+ export type UseRenderRenderProp<State = Record<string, unknown>> = React.ReactElement | ComponentRenderFn<React.HTMLAttributes<any>, State>;
12
+ export type UseRenderElementProps<ElementType extends React.ElementType> = React.ComponentPropsWithRef<ElementType>;
13
+ export type UseRenderComponentProps<ElementType extends React.ElementType, State = {}, RenderFunctionProps = HTMLProps> = React.ComponentPropsWithRef<ElementType> & {
14
+ /**
15
+ * Allows you to replace the component's HTML element
16
+ * with a different tag, or compose it with another component.
17
+ *
18
+ * Accepts a `ReactElement` or a function that returns the element to render.
19
+ */
20
+ render?: React.ReactElement | ComponentRenderFn<RenderFunctionProps, State> | undefined;
21
+ };
22
+ export interface UseRenderParameters<State, RenderedElementType extends Element, Enabled extends boolean | undefined> {
23
+ /**
24
+ * The React element or a function that returns one to override the default element.
25
+ */
26
+ render?: UseRenderRenderProp<State> | undefined;
27
+ /**
28
+ * The ref to apply to the rendered element.
29
+ */
30
+ ref?: React.Ref<RenderedElementType> | React.Ref<RenderedElementType>[] | undefined;
31
+ /**
32
+ * The state of the component, passed as the second argument to the `render` callback.
33
+ * State properties are automatically converted to data-* attributes.
34
+ */
35
+ state?: State | undefined;
36
+ /**
37
+ * Custom mapping for converting state properties to data-* attributes.
38
+ * @example
39
+ * { isActive: (value) => (value ? { 'data-is-active': '' } : null) }
40
+ */
41
+ stateAttributesMapping?: StateAttributesMapping<State> | undefined;
42
+ /**
43
+ * Props to be spread on the rendered element.
44
+ * They are merged with the internal props of the component, so that event handlers
45
+ * are merged, `className` strings and `style` properties are joined, while other external props overwrite the
46
+ * internal ones.
47
+ */
48
+ props?: Record<string, unknown> | undefined;
49
+ /**
50
+ * If `false`, the hook will skip most of its internal logic and return `null`.
51
+ * This is useful for rendering a component conditionally.
52
+ * @default true
53
+ */
54
+ enabled?: Enabled | undefined;
55
+ /**
56
+ * The default tag name to use for the rendered element when `render` is not provided.
57
+ * @default 'div'
58
+ */
59
+ defaultTagName?: keyof React.JSX.IntrinsicElements | undefined;
60
+ }
61
+ export type UseRenderReturnValue<Enabled extends boolean | undefined> = Enabled extends false ? null : React.ReactElement;
62
+ export interface UseRenderState {
63
+ }
64
+ export declare namespace useRender {
65
+ type State = UseRenderState;
66
+ type RenderProp<TState = Record<string, unknown>> = UseRenderRenderProp<TState>;
67
+ type ElementProps<ElementType extends React.ElementType> = UseRenderElementProps<ElementType>;
68
+ type ComponentProps<ElementType extends React.ElementType, TState = {}, RenderFunctionProps = HTMLProps> = UseRenderComponentProps<ElementType, TState, RenderFunctionProps>;
69
+ type Parameters<TState, RenderedElementType extends Element, Enabled extends boolean | undefined> = UseRenderParameters<TState, RenderedElementType, Enabled>;
70
+ type ReturnValue<Enabled extends boolean | undefined> = UseRenderReturnValue<Enabled>;
71
+ }
@@ -0,0 +1,12 @@
1
+ // Vendored from @base-ui/react v1.6.0 (MIT) — packages/react/src/use-render/useRender.ts
2
+ // https://github.com/mui/base-ui — exact copy; only import specifiers rewired.
3
+ import * as React from 'react';
4
+ import { useRenderElement } from './useRenderElement';
5
+ /**
6
+ * Renders a Base UI element.
7
+ *
8
+ * @public
9
+ */
10
+ export function useRender(params) {
11
+ return useRenderElement(params.defaultTagName ?? 'div', params, params);
12
+ }
@@ -0,0 +1,62 @@
1
+ import * as React from 'react';
2
+ import type { ComponentRenderFn, HTMLProps } from './types';
3
+ import type { WithDataAttributes } from './baseTypes';
4
+ import { type StateAttributesMapping } from './getStateAttributesProps';
5
+ type IntrinsicTagName = keyof React.JSX.IntrinsicElements;
6
+ /**
7
+ * Renders a Base UI element.
8
+ *
9
+ * @param element The default HTML element to render. Can be overridden by the `render` prop.
10
+ * @param componentProps An object containing the `render` and `className` props to be used for element customization. Other props are ignored.
11
+ * @param params Additional parameters for rendering the element.
12
+ */
13
+ export declare function useRenderElement<State extends Record<string, any>, RenderedElementType extends Element, TagName extends IntrinsicTagName | undefined, Enabled extends boolean | undefined = undefined>(element: TagName, componentProps: UseRenderElementComponentProps<State>, params?: UseRenderElementParameters<State, RenderedElementType, TagName, Enabled>): Enabled extends false ? null : React.ReactElement;
14
+ type RenderFunctionProps<TagName> = TagName extends keyof React.JSX.IntrinsicElements ? React.JSX.IntrinsicElements[TagName] : React.HTMLAttributes<any>;
15
+ export type UseRenderElementParameters<State, RenderedElementType extends Element, TagName, Enabled extends boolean | undefined> = {
16
+ /**
17
+ * If `false`, the hook will skip most of its internal logic and return `null`.
18
+ * This is useful for rendering a component conditionally.
19
+ * @default true
20
+ */
21
+ enabled?: Enabled | undefined;
22
+ /**
23
+ * @deprecated
24
+ */
25
+ propGetter?: ((externalProps: HTMLProps) => HTMLProps) | undefined;
26
+ /**
27
+ * The ref to apply to the rendered element.
28
+ */
29
+ ref?: React.Ref<RenderedElementType> | (React.Ref<RenderedElementType> | undefined)[] | undefined;
30
+ /**
31
+ * The state of the component.
32
+ */
33
+ state?: State | undefined;
34
+ /**
35
+ * Intrinsic props to be spread on the rendered element. Accepts bespoke
36
+ * data-* part attributes in plain object literals (WithDataAttributes).
37
+ */
38
+ props?: WithDataAttributes<RenderFunctionProps<TagName>> | Array<WithDataAttributes<RenderFunctionProps<TagName>> | undefined | ((props: RenderFunctionProps<TagName>) => RenderFunctionProps<TagName>)> | undefined;
39
+ /**
40
+ * A mapping of state to `data-*` attributes.
41
+ */
42
+ stateAttributesMapping?: StateAttributesMapping<State> | undefined;
43
+ };
44
+ export interface UseRenderElementComponentProps<State> {
45
+ /**
46
+ * The class name to apply to the rendered element.
47
+ * Can be a string or a function that accepts the state and returns a string.
48
+ */
49
+ className?: string | ((state: State) => string | undefined) | undefined;
50
+ /**
51
+ * The render prop or React element to override the default element.
52
+ */
53
+ render?: undefined | React.ReactElement | ComponentRenderFn<React.HTMLAttributes<any>, State>;
54
+ /**
55
+ * The style to apply to the rendered element.
56
+ * Can be a style object or a function that accepts the state and returns a style object.
57
+ */
58
+ style?: React.CSSProperties | ((state: State) => React.CSSProperties | undefined) | undefined;
59
+ }
60
+ export interface UseRenderElementState {
61
+ }
62
+ export {};