@udecode/react-utils 38.0.1 → 40.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -6,6 +6,10 @@ declare const Box: React.ForwardRefExoticComponent<{
6
6
  } & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<any>>;
7
7
  type BoxProps = React.ComponentPropsWithRef<typeof Box>;
8
8
 
9
+ declare const MemoizedChildren: React.MemoExoticComponent<({ children }: {
10
+ children: React.ReactNode;
11
+ }) => React.JSX.Element>;
12
+
9
13
  type PortalBodyProps = {
10
14
  children: React.ReactNode;
11
15
  element?: Element;
@@ -80,12 +84,16 @@ declare const composeRefs: <T>(...refs: PossibleRef<T>[]) => (node: T) => void;
80
84
  */
81
85
  declare const useComposedRef: <T>(...refs: PossibleRef<T>[]) => (node: T) => void;
82
86
 
87
+ declare function useEffectOnce(effect: React.EffectCallback, deps: React.DependencyList): void;
88
+
83
89
  declare const CAN_USE_DOM: boolean;
84
90
  /**
85
91
  * Prevent warning on SSR by falling back to React.useEffect when DOM isn't
86
92
  * available
87
93
  */
88
- declare const useIsomorphicLayoutEffect: typeof React.useLayoutEffect;
94
+ declare const useIsomorphicLayoutEffect: typeof React.useEffect;
95
+
96
+ declare function useMemoOnce<T>(factory: () => T, deps: React.DependencyList): T;
89
97
 
90
98
  declare const DEFAULT_IGNORE_CLASS = "ignore-onclickoutside";
91
99
  type UseOnClickOutsideCallback<T extends Event = Event> = (event: T) => void;
@@ -123,4 +131,4 @@ type InferElementRef<T> = T extends ElementType<any> ? T extends keyof JSX.Intri
123
131
  */
124
132
  declare function withRef<T extends ElementType, P = {}>(renderFunction: React.ForwardRefRenderFunction<InferElementRef<T>, React.ComponentPropsWithoutRef<T> & P>): ForwardRefComponent<InferElementRef<T>, React.ComponentPropsWithoutRef<T> & P>;
125
133
 
126
- export { Box, type BoxProps, CAN_USE_DOM, DEFAULT_IGNORE_CLASS, PortalBody, type PortalBodyProps, Text, type TextProps, type UseOnClickOutsideCallback, type UseOnClickOutsideOptions, type UseOnClickOutsideReturn, composeEventHandlers, composeRefs, createPrimitiveComponent, createPrimitiveElement, createSlotComponent, useComposedRef, useIsomorphicLayoutEffect, useOnClickOutside, useStableMemo, withProviders, withRef };
134
+ export { Box, type BoxProps, CAN_USE_DOM, DEFAULT_IGNORE_CLASS, MemoizedChildren, PortalBody, type PortalBodyProps, Text, type TextProps, type UseOnClickOutsideCallback, type UseOnClickOutsideOptions, type UseOnClickOutsideReturn, composeEventHandlers, composeRefs, createPrimitiveComponent, createPrimitiveElement, createSlotComponent, useComposedRef, useEffectOnce, useIsomorphicLayoutEffect, useMemoOnce, useOnClickOutside, useStableMemo, withProviders, withRef };
package/dist/index.d.ts CHANGED
@@ -6,6 +6,10 @@ declare const Box: React.ForwardRefExoticComponent<{
6
6
  } & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<any>>;
7
7
  type BoxProps = React.ComponentPropsWithRef<typeof Box>;
8
8
 
9
+ declare const MemoizedChildren: React.MemoExoticComponent<({ children }: {
10
+ children: React.ReactNode;
11
+ }) => React.JSX.Element>;
12
+
9
13
  type PortalBodyProps = {
10
14
  children: React.ReactNode;
11
15
  element?: Element;
@@ -80,12 +84,16 @@ declare const composeRefs: <T>(...refs: PossibleRef<T>[]) => (node: T) => void;
80
84
  */
81
85
  declare const useComposedRef: <T>(...refs: PossibleRef<T>[]) => (node: T) => void;
82
86
 
87
+ declare function useEffectOnce(effect: React.EffectCallback, deps: React.DependencyList): void;
88
+
83
89
  declare const CAN_USE_DOM: boolean;
84
90
  /**
85
91
  * Prevent warning on SSR by falling back to React.useEffect when DOM isn't
86
92
  * available
87
93
  */
88
- declare const useIsomorphicLayoutEffect: typeof React.useLayoutEffect;
94
+ declare const useIsomorphicLayoutEffect: typeof React.useEffect;
95
+
96
+ declare function useMemoOnce<T>(factory: () => T, deps: React.DependencyList): T;
89
97
 
90
98
  declare const DEFAULT_IGNORE_CLASS = "ignore-onclickoutside";
91
99
  type UseOnClickOutsideCallback<T extends Event = Event> = (event: T) => void;
@@ -123,4 +131,4 @@ type InferElementRef<T> = T extends ElementType<any> ? T extends keyof JSX.Intri
123
131
  */
124
132
  declare function withRef<T extends ElementType, P = {}>(renderFunction: React.ForwardRefRenderFunction<InferElementRef<T>, React.ComponentPropsWithoutRef<T> & P>): ForwardRefComponent<InferElementRef<T>, React.ComponentPropsWithoutRef<T> & P>;
125
133
 
126
- export { Box, type BoxProps, CAN_USE_DOM, DEFAULT_IGNORE_CLASS, PortalBody, type PortalBodyProps, Text, type TextProps, type UseOnClickOutsideCallback, type UseOnClickOutsideOptions, type UseOnClickOutsideReturn, composeEventHandlers, composeRefs, createPrimitiveComponent, createPrimitiveElement, createSlotComponent, useComposedRef, useIsomorphicLayoutEffect, useOnClickOutside, useStableMemo, withProviders, withRef };
134
+ export { Box, type BoxProps, CAN_USE_DOM, DEFAULT_IGNORE_CLASS, MemoizedChildren, PortalBody, type PortalBodyProps, Text, type TextProps, type UseOnClickOutsideCallback, type UseOnClickOutsideOptions, type UseOnClickOutsideReturn, composeEventHandlers, composeRefs, createPrimitiveComponent, createPrimitiveElement, createSlotComponent, useComposedRef, useEffectOnce, useIsomorphicLayoutEffect, useMemoOnce, useOnClickOutside, useStableMemo, withProviders, withRef };
package/dist/index.js CHANGED
@@ -62,6 +62,7 @@ __export(src_exports, {
62
62
  Box: () => Box,
63
63
  CAN_USE_DOM: () => CAN_USE_DOM,
64
64
  DEFAULT_IGNORE_CLASS: () => DEFAULT_IGNORE_CLASS,
65
+ MemoizedChildren: () => MemoizedChildren,
65
66
  PortalBody: () => PortalBody,
66
67
  Text: () => Text,
67
68
  composeEventHandlers: () => composeEventHandlers,
@@ -70,7 +71,9 @@ __export(src_exports, {
70
71
  createPrimitiveElement: () => createPrimitiveElement,
71
72
  createSlotComponent: () => createSlotComponent,
72
73
  useComposedRef: () => useComposedRef,
74
+ useEffectOnce: () => useEffectOnce,
73
75
  useIsomorphicLayoutEffect: () => useIsomorphicLayoutEffect,
76
+ useMemoOnce: () => useMemoOnce,
74
77
  useOnClickOutside: () => useOnClickOutside,
75
78
  useStableMemo: () => useStableMemo,
76
79
  withProviders: () => withProviders,
@@ -93,15 +96,23 @@ var createSlotComponent = (element) => (
93
96
  // src/Box.tsx
94
97
  var Box = createSlotComponent("div");
95
98
 
96
- // src/PortalBody.tsx
99
+ // src/MemoizedChildren.tsx
97
100
  var import_react2 = __toESM(require("react"));
101
+ var MemoizedChildren = import_react2.default.memo(
102
+ ({ children }) => {
103
+ return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, children);
104
+ }
105
+ );
106
+
107
+ // src/PortalBody.tsx
108
+ var import_react3 = __toESM(require("react"));
98
109
  var import_react_dom = __toESM(require("react-dom"));
99
110
  var PortalBody = ({
100
111
  children,
101
112
  element
102
113
  }) => {
103
114
  const container = element || typeof window !== "undefined" ? document.body : void 0;
104
- if (!container) return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, children);
115
+ if (!container) return /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, children);
105
116
  return import_react_dom.default.createPortal(children, element || document.body);
106
117
  };
107
118
 
@@ -117,12 +128,12 @@ var composeEventHandlers = (originalEventHandler, ourEventHandler, { checkForDef
117
128
  };
118
129
 
119
130
  // src/createPrimitiveComponent.tsx
120
- var import_react4 = __toESM(require("react"));
131
+ var import_react5 = __toESM(require("react"));
121
132
  var import_utils = require("@udecode/utils");
122
133
  var import_clsx = require("clsx");
123
134
 
124
135
  // src/useComposedRef.ts
125
- var import_react3 = __toESM(require("react"));
136
+ var import_react4 = __toESM(require("react"));
126
137
  var setRef = (ref, value) => {
127
138
  if (typeof ref === "function") {
128
139
  ref(value);
@@ -132,7 +143,7 @@ var setRef = (ref, value) => {
132
143
  };
133
144
  var composeRefs = (...refs) => (node) => refs.forEach((ref) => setRef(ref, node));
134
145
  var useComposedRef = (...refs) => {
135
- return import_react3.default.useCallback(composeRefs(...refs), refs);
146
+ return import_react4.default.useCallback(composeRefs(...refs), refs);
136
147
  };
137
148
 
138
149
  // src/createPrimitiveComponent.tsx
@@ -142,7 +153,7 @@ var createPrimitiveComponent = (element) => {
142
153
  propsHook,
143
154
  stateHook
144
155
  } = {}) => {
145
- return import_react4.default.forwardRef(
156
+ return import_react5.default.forwardRef(
146
157
  (_a2, ref) => {
147
158
  var _b = _a2, {
148
159
  asChild,
@@ -168,7 +179,7 @@ var createPrimitiveComponent = (element) => {
168
179
  const className = (0, import_utils.isDefined)(hookProps == null ? void 0 : hookProps.className) || (0, import_utils.isDefined)(classNameProp) ? (0, import_clsx.clsx)(hookProps == null ? void 0 : hookProps.className, classNameProp) : void 0;
169
180
  const style = (hookProps == null ? void 0 : hookProps.style) || props.style ? __spreadValues(__spreadValues({}, hookProps == null ? void 0 : hookProps.style), props.style) : void 0;
170
181
  if (!asChild && hidden) return null;
171
- return /* @__PURE__ */ import_react4.default.createElement(
182
+ return /* @__PURE__ */ import_react5.default.createElement(
172
183
  Comp,
173
184
  __spreadValues(__spreadValues(__spreadProps(__spreadValues({
174
185
  ref: _ref,
@@ -184,23 +195,52 @@ var createPrimitiveComponent = (element) => {
184
195
  };
185
196
 
186
197
  // src/createPrimitiveElement.tsx
187
- var import_react5 = __toESM(require("react"));
198
+ var import_react6 = __toESM(require("react"));
188
199
  function createPrimitiveElement(tag) {
189
- return import_react5.default.forwardRef(
200
+ return import_react6.default.forwardRef(
190
201
  function CreateComponent(props, ref) {
191
- return import_react5.default.createElement(tag, __spreadProps(__spreadValues({}, props), { ref }));
202
+ return import_react6.default.createElement(tag, __spreadProps(__spreadValues({}, props), { ref }));
192
203
  }
193
204
  );
194
205
  }
195
206
 
207
+ // src/useEffectOnce.ts
208
+ var import_react7 = __toESM(require("react"));
209
+ function useEffectOnce(effect, deps) {
210
+ const initialized = import_react7.default.useRef(false);
211
+ const prevDepsRef = import_react7.default.useRef(deps);
212
+ import_react7.default.useEffect(() => {
213
+ const depsChanged = deps.some((dep, i) => dep !== prevDepsRef.current[i]);
214
+ if (!initialized.current || depsChanged) {
215
+ initialized.current = true;
216
+ prevDepsRef.current = deps;
217
+ effect();
218
+ }
219
+ }, deps);
220
+ }
221
+
196
222
  // src/useIsomorphicLayoutEffect.ts
197
- var import_react6 = __toESM(require("react"));
223
+ var import_react8 = __toESM(require("react"));
198
224
  var _a;
199
225
  var CAN_USE_DOM = typeof window !== "undefined" && ((_a = window.document) == null ? void 0 : _a.createElement) !== void 0;
200
- var useIsomorphicLayoutEffect = CAN_USE_DOM ? import_react6.default.useLayoutEffect : import_react6.default.useEffect;
226
+ var useIsomorphicLayoutEffect = CAN_USE_DOM ? import_react8.default.useLayoutEffect : import_react8.default.useEffect;
227
+
228
+ // src/useMemoOnce.ts
229
+ var import_react9 = __toESM(require("react"));
230
+ function useMemoOnce(factory, deps) {
231
+ const initialized = import_react9.default.useRef(false);
232
+ const prevDepsRef = import_react9.default.useRef(deps);
233
+ const memoizedValueRef = import_react9.default.useRef();
234
+ if (!initialized.current || deps.some((dep, i) => dep !== prevDepsRef.current[i])) {
235
+ initialized.current = true;
236
+ prevDepsRef.current = deps;
237
+ memoizedValueRef.current = factory();
238
+ }
239
+ return memoizedValueRef.current;
240
+ }
201
241
 
202
242
  // src/useOnClickOutside.ts
203
- var import_react7 = __toESM(require("react"));
243
+ var import_react10 = __toESM(require("react"));
204
244
  var canUsePassiveEvents = () => {
205
245
  if (typeof window === "undefined" || typeof window.addEventListener !== "function")
206
246
  return false;
@@ -243,14 +283,14 @@ var useOnClickOutside = (callback, {
243
283
  ignoreClass = DEFAULT_IGNORE_CLASS,
244
284
  refs: refsOpt
245
285
  } = {}) => {
246
- const [refsState, setRefsState] = import_react7.default.useState([]);
247
- const callbackRef = import_react7.default.useRef(callback);
286
+ const [refsState, setRefsState] = import_react10.default.useState([]);
287
+ const callbackRef = import_react10.default.useRef(callback);
248
288
  callbackRef.current = callback;
249
- const ref = import_react7.default.useCallback(
289
+ const ref = import_react10.default.useCallback(
250
290
  (el) => setRefsState((prevState) => [...prevState, { current: el }]),
251
291
  []
252
292
  );
253
- import_react7.default.useEffect(
293
+ import_react10.default.useEffect(
254
294
  () => {
255
295
  if (!(refsOpt == null ? void 0 : refsOpt.length) && refsState.length === 0) return;
256
296
  const getEls = () => {
@@ -307,39 +347,40 @@ var useOnClickOutside = (callback, {
307
347
  };
308
348
 
309
349
  // src/useStableMemo.ts
310
- var import_react8 = __toESM(require("react"));
350
+ var import_react11 = __toESM(require("react"));
311
351
  var useStableMemo = (producer, deps) => {
312
- const [value, setValue] = import_react8.default.useState(producer);
313
- import_react8.default.useLayoutEffect(() => {
352
+ const [value, setValue] = import_react11.default.useState(producer);
353
+ import_react11.default.useLayoutEffect(() => {
314
354
  setValue(producer);
315
355
  }, deps);
316
356
  return value;
317
357
  };
318
358
 
319
359
  // src/withProviders.tsx
320
- var import_react9 = __toESM(require("react"));
360
+ var import_react12 = __toESM(require("react"));
321
361
  var withProviders = (...providers) => (WrappedComponent) => (props) => providers.reduceRight(
322
362
  (acc, prov) => {
323
363
  let Provider = prov;
324
364
  if (Array.isArray(prov)) {
325
365
  [Provider] = prov;
326
- return /* @__PURE__ */ import_react9.default.createElement(Provider, __spreadValues({}, prov[1]), acc);
366
+ return /* @__PURE__ */ import_react12.default.createElement(Provider, __spreadValues({}, prov[1]), acc);
327
367
  }
328
- return /* @__PURE__ */ import_react9.default.createElement(Provider, null, acc);
368
+ return /* @__PURE__ */ import_react12.default.createElement(Provider, null, acc);
329
369
  },
330
- /* @__PURE__ */ import_react9.default.createElement(WrappedComponent, __spreadValues({}, props))
370
+ /* @__PURE__ */ import_react12.default.createElement(WrappedComponent, __spreadValues({}, props))
331
371
  );
332
372
 
333
373
  // src/withRef.tsx
334
- var import_react10 = __toESM(require("react"));
374
+ var import_react13 = __toESM(require("react"));
335
375
  function withRef(renderFunction) {
336
- return import_react10.default.forwardRef(renderFunction);
376
+ return import_react13.default.forwardRef(renderFunction);
337
377
  }
338
378
  // Annotate the CommonJS export names for ESM import in node:
339
379
  0 && (module.exports = {
340
380
  Box,
341
381
  CAN_USE_DOM,
342
382
  DEFAULT_IGNORE_CLASS,
383
+ MemoizedChildren,
343
384
  PortalBody,
344
385
  Text,
345
386
  composeEventHandlers,
@@ -348,7 +389,9 @@ function withRef(renderFunction) {
348
389
  createPrimitiveElement,
349
390
  createSlotComponent,
350
391
  useComposedRef,
392
+ useEffectOnce,
351
393
  useIsomorphicLayoutEffect,
394
+ useMemoOnce,
352
395
  useOnClickOutside,
353
396
  useStableMemo,
354
397
  withProviders,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/createSlotComponent.tsx","../src/Box.tsx","../src/PortalBody.tsx","../src/Text.tsx","../src/composeEventHandlers.ts","../src/createPrimitiveComponent.tsx","../src/useComposedRef.ts","../src/createPrimitiveElement.tsx","../src/useIsomorphicLayoutEffect.ts","../src/useOnClickOutside.ts","../src/useStableMemo.ts","../src/withProviders.tsx","../src/withRef.tsx"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Box';\nexport * from './PortalBody';\nexport * from './Text';\nexport * from './composeEventHandlers';\nexport * from './createPrimitiveComponent';\nexport * from './createPrimitiveElement';\nexport * from './createSlotComponent';\nexport * from './useComposedRef';\nexport * from './useIsomorphicLayoutEffect';\nexport * from './useOnClickOutside';\nexport * from './useStableMemo';\nexport * from './withProviders';\nexport * from './withRef';\n","import React from 'react';\n\nimport { Slot } from '@radix-ui/react-slot';\n\nexport const createSlotComponent = <\n T extends React.ElementType,\n P extends React.ComponentPropsWithoutRef<T>,\n>(\n element: T\n) =>\n // eslint-disable-next-line react/display-name\n React.forwardRef<\n any,\n {\n as?: React.ElementType;\n asChild?: boolean;\n } & P\n >(({ as, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : (as as T) || element;\n\n return <Comp ref={ref} {...props} />;\n });\n","import type React from 'react';\n\nimport { createSlotComponent } from './createSlotComponent';\n\nexport const Box = createSlotComponent('div');\n\nexport type BoxProps = React.ComponentPropsWithRef<typeof Box>;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport type PortalBodyProps = { children: React.ReactNode; element?: Element };\n\nexport const PortalBody: ({\n children,\n element,\n}: PortalBodyProps) => React.ReactPortal = ({\n children,\n element,\n}: PortalBodyProps) => {\n const container =\n element || typeof window !== 'undefined' ? document.body : undefined;\n\n if (!container) return (<>{children}</>) as any;\n\n return ReactDOM.createPortal(children, element || document.body);\n};\n","import type React from 'react';\n\nimport { createSlotComponent } from './createSlotComponent';\n\nexport const Text = createSlotComponent('span');\n\nexport type TextProps = React.ComponentPropsWithRef<typeof Text>;\n","/** @see https://github.com/radix-ui/primitives/blob/b324ec2d7ddf13a2a115cb5b11478e24d2f45b87/packages/core/primitive/src/primitive.tsx#L1 */\nexport const composeEventHandlers =\n <E>(\n originalEventHandler?: (event: E) => void,\n ourEventHandler?: (event: E) => void,\n { checkForDefaultPrevented = true } = {}\n ) =>\n (event: E) => {\n originalEventHandler?.(event);\n\n if (\n checkForDefaultPrevented === false ||\n !(event as unknown as Event).defaultPrevented\n ) {\n return ourEventHandler?.(event);\n }\n };\n","/* eslint-disable react/display-name */\n\nimport React from 'react';\n\nimport { isDefined } from '@udecode/utils';\nimport { clsx } from 'clsx';\n\nimport { createSlotComponent } from './createSlotComponent';\nimport { useComposedRef } from './useComposedRef';\n\n/**\n * Primitive component factory. It uses hooks for managing state and props, and\n * forwards references to child components. Component props:\n *\n * - `asChild`: If true, the component will be rendered as a `Slot`\n * {@link https://www.radix-ui.com/docs/primitives/utilities/slot}.\n * - `options`: Options passed to the state hook.\n * - `state`: Provide your state instead of using the state hook.\n * - `className`: Class name to be merged to the component.\n * - `style`: Style object to be merged to the component.\n * - `setProps`: Function to set props from the props hook.\n * - `...props`: Props to be passed to the component. Props hook return value:\n * - `ref`: Reference to be forwarded to the component.\n * - `props`: Props to be passed to the component.\n * - `hidden`: If true, the component will not be rendered.\n *\n * @example\n * const MyButton = createPrimitiveComponent(Button)({\n * stateHook: useButtonState,\n * propsHook: useButton,\n * });\n *\n * @param {React.ElementType} element The base component or native HTML element.\n * @returns {function} A primitive component.\n */\nexport const createPrimitiveComponent = <\n T extends React.ElementType,\n P extends React.ComponentPropsWithoutRef<T>,\n>(\n element: T\n) => {\n const Comp = createSlotComponent<T, P>(element);\n\n return <SH extends (options: any) => any, PH extends (state: any) => any>({\n propsHook,\n stateHook,\n }: {\n propsHook?: PH;\n stateHook?: SH;\n } = {}) => {\n return React.forwardRef<\n any,\n {\n as?: React.ElementType;\n asChild?: boolean;\n className?: string;\n options?: Parameters<SH>[0];\n setProps?: (hookProps: NonNullable<ReturnType<PH>['props']>) => P;\n state?: Parameters<PH>[0];\n style?: React.CSSProperties;\n } & P\n >(\n (\n {\n asChild,\n className: classNameProp,\n getClassName,\n options,\n state: stateProp,\n ...props\n },\n ref\n ) => {\n const state = isDefined(stateProp)\n ? stateProp\n : stateHook\n ? stateHook(options as any)\n : undefined;\n const {\n hidden,\n props: hookProps,\n ref: hookRef,\n } = propsHook\n ? propsHook(state)\n : { hidden: false, props: {}, ref: null };\n\n const _ref = useComposedRef(ref, hookRef);\n const className =\n isDefined(hookProps?.className) || isDefined(classNameProp)\n ? clsx(hookProps?.className, classNameProp)\n : undefined;\n const style =\n hookProps?.style || props.style\n ? { ...hookProps?.style, ...props.style }\n : undefined;\n\n if (!asChild && hidden) return null;\n\n return (\n <Comp\n ref={_ref}\n asChild={asChild}\n {...hookProps}\n className={className}\n style={style}\n {...props}\n {...(props.setProps?.(hookProps ?? {}) ?? {})}\n />\n );\n }\n );\n };\n};\n","import React from 'react';\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value This utility takes care of different types\n * of refs: callback refs and React.RefObject(s)\n */\nconst setRef = <T>(ref: PossibleRef<T>, value: T) => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref !== null && ref !== undefined) {\n (ref as React.MutableRefObject<T>).current = value;\n }\n};\n\n/**\n * A utility to compose multiple refs together Accepts callback refs and\n * React.RefObject(s)\n */\nexport const composeRefs =\n <T>(...refs: PossibleRef<T>[]) =>\n (node: T) =>\n refs.forEach((ref) => setRef(ref, node));\n\n/**\n * A custom hook that composes multiple refs Accepts callback refs and\n * React.RefObject(s)\n */\nexport const useComposedRef = <T>(...refs: PossibleRef<T>[]) => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useCallback(composeRefs(...refs), refs);\n};\n","import React from 'react';\n\nexport function createPrimitiveElement<T extends keyof HTMLElementTagNameMap>(\n tag: T\n) {\n return React.forwardRef<HTMLElementTagNameMap[T], JSX.IntrinsicElements[T]>(\n function CreateComponent(props, ref) {\n return React.createElement(tag, { ...props, ref });\n }\n );\n}\n","import React from 'react';\n\nexport const CAN_USE_DOM =\n typeof window !== 'undefined' && window.document?.createElement !== undefined;\n\n/**\n * Prevent warning on SSR by falling back to React.useEffect when DOM isn't\n * available\n */\nexport const useIsomorphicLayoutEffect = CAN_USE_DOM\n ? React.useLayoutEffect\n : React.useEffect;\n","import React from 'react';\n\nconst canUsePassiveEvents = (): boolean => {\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function'\n )\n return false;\n\n let passive = false;\n const options = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line getter-return\n get() {\n passive = true;\n },\n });\n const noop = () => null;\n\n window.addEventListener('test', noop, options);\n window.removeEventListener('test', noop, options);\n\n return passive;\n};\n\nexport const DEFAULT_IGNORE_CLASS = 'ignore-onclickoutside';\n\nexport type UseOnClickOutsideCallback<T extends Event = Event> = (\n event: T\n) => void;\n\ntype El = HTMLElement;\ntype Refs = React.RefObject<El>[];\n\nexport interface UseOnClickOutsideOptions {\n detectIFrame?: boolean;\n disabled?: boolean;\n eventTypes?: string[];\n excludeScrollbar?: boolean;\n ignoreClass?: string[] | string;\n refs?: Refs;\n}\n\nexport type UseOnClickOutsideReturn = (element: El | null) => void;\n\nconst checkClass = (el: HTMLElement, cl: string): boolean =>\n el.classList?.contains(cl);\n\nconst hasIgnoreClass = (e: any, ignoreClass: string[] | string): boolean => {\n let el = e.target || e;\n\n while (el) {\n if (Array.isArray(ignoreClass)) {\n // eslint-disable-next-line no-loop-func\n if (ignoreClass.some((c) => checkClass(el, c))) return true;\n } else if (checkClass(el, ignoreClass)) {\n return true;\n }\n\n el = el.parentElement;\n }\n\n return false;\n};\n\nconst clickedOnScrollbar = (e: MouseEvent): boolean =>\n document.documentElement.clientWidth <= e.clientX ||\n document.documentElement.clientHeight <= e.clientY;\n\nconst getEventOptions = (type: string): { passive: boolean } | boolean =>\n type.includes('touch') && canUsePassiveEvents() ? { passive: true } : false;\n\nexport const useOnClickOutside = (\n callback: UseOnClickOutsideCallback,\n {\n detectIFrame = true,\n disabled,\n eventTypes = ['mousedown', 'touchstart'],\n excludeScrollbar,\n ignoreClass = DEFAULT_IGNORE_CLASS,\n refs: refsOpt,\n }: UseOnClickOutsideOptions = {}\n): UseOnClickOutsideReturn => {\n const [refsState, setRefsState] = React.useState<Refs>([]);\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n\n const ref: UseOnClickOutsideReturn = React.useCallback(\n (el) => setRefsState((prevState) => [...prevState, { current: el }]),\n []\n );\n\n React.useEffect(\n () => {\n if (!refsOpt?.length && refsState.length === 0) return;\n\n const getEls = () => {\n const els: El[] = [];\n (refsOpt || refsState).forEach(\n ({ current }) => current && els.push(current)\n );\n\n return els;\n };\n\n const handler = (e: any) => {\n if (\n !hasIgnoreClass(e, ignoreClass) &&\n !(excludeScrollbar && clickedOnScrollbar(e)) &&\n getEls().every((el) => !el.contains(e.target))\n )\n callbackRef.current(e);\n };\n\n const blurHandler = (e: FocusEvent) =>\n // On firefox the iframe becomes document.activeElement in the next event loop\n setTimeout(() => {\n const { activeElement } = document;\n\n if (\n activeElement?.tagName === 'IFRAME' &&\n !hasIgnoreClass(activeElement, ignoreClass) &&\n !getEls().includes(activeElement as HTMLIFrameElement)\n )\n callbackRef.current(e);\n }, 0);\n\n const removeEventListener = () => {\n eventTypes.forEach((type) =>\n document.removeEventListener(\n type,\n handler,\n getEventOptions(type) as any\n )\n );\n\n if (detectIFrame) window.removeEventListener('blur', blurHandler);\n };\n\n if (disabled) {\n removeEventListener();\n\n return;\n }\n\n eventTypes.forEach((type) =>\n document.addEventListener(type, handler, getEventOptions(type))\n );\n\n if (detectIFrame) window.addEventListener('blur', blurHandler);\n\n // eslint-disable-next-line consistent-return\n return () => removeEventListener();\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n refsState,\n ignoreClass,\n excludeScrollbar,\n disabled,\n detectIFrame,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(eventTypes),\n ]\n );\n\n return ref;\n};\n","import React from 'react';\n\nexport const useStableMemo = <T>(\n producer: () => T,\n deps?: React.DependencyList\n): T => {\n const [value, setValue] = React.useState(producer);\n\n React.useLayoutEffect(() => {\n setValue(producer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n\n return value;\n};\n","import React from 'react';\n\n/**\n * Wrap a component into multiple providers. If there are any props that you\n * want a provider to receive, you can simply pass an array.\n */\nexport const withProviders =\n (...providers: any[]) =>\n <T,>(WrappedComponent: React.FC<T>) =>\n (props: T) =>\n providers.reduceRight(\n (acc, prov) => {\n let Provider = prov;\n\n if (Array.isArray(prov)) {\n [Provider] = prov;\n\n return <Provider {...prov[1]}>{acc}</Provider>;\n }\n\n return <Provider>{acc}</Provider>;\n },\n <WrappedComponent {...(props as any)} />\n );\n","import React from 'react';\n\ntype ElementType<P = any> =\n | {\n [K in keyof JSX.IntrinsicElements]: P extends JSX.IntrinsicElements[K]\n ? K\n : never;\n }[keyof JSX.IntrinsicElements]\n | React.ComponentType<P>;\n\ntype ForwardRefComponent<T, P = {}> = React.ForwardRefExoticComponent<\n React.PropsWithoutRef<P> & React.RefAttributes<T>\n>;\n\ntype InferElementRef<T> =\n T extends ElementType<any>\n ? T extends keyof JSX.IntrinsicElements\n ? JSX.IntrinsicElements[T] extends React.DetailedHTMLProps<\n React.HTMLAttributes<infer R>,\n any\n >\n ? R\n : never\n : T extends React.ComponentType<any>\n ? T extends React.ComponentClass<any>\n ? InstanceType<T>\n : T extends React.ForwardRefExoticComponent<any>\n ? React.ComponentPropsWithRef<T>['ref'] extends React.Ref<infer R>\n ? R\n : never\n : never\n : never\n : never;\n\n/**\n * Shorter alternative to `React.forwardRef`.\n *\n * @generic1 Component type or element type\n * @generic2 Extended prop types\n */\nexport function withRef<T extends ElementType, P = {}>(\n renderFunction: React.ForwardRefRenderFunction<\n InferElementRef<T>,\n React.ComponentPropsWithoutRef<T> & P\n >\n): ForwardRefComponent<\n InferElementRef<T>,\n React.ComponentPropsWithoutRef<T> & P\n> {\n return React.forwardRef(renderFunction as any) as any;\n}\n"],"mappings":"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","names":["React","_a","import_react","React","ReactDOM","import_react","import_react","React","React","_a","_b","import_react","React","import_react","React","import_react","_a","React","import_react","React","import_react","React","import_react","React"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/createSlotComponent.tsx","../src/Box.tsx","../src/MemoizedChildren.tsx","../src/PortalBody.tsx","../src/Text.tsx","../src/composeEventHandlers.ts","../src/createPrimitiveComponent.tsx","../src/useComposedRef.ts","../src/createPrimitiveElement.tsx","../src/useEffectOnce.ts","../src/useIsomorphicLayoutEffect.ts","../src/useMemoOnce.ts","../src/useOnClickOutside.ts","../src/useStableMemo.ts","../src/withProviders.tsx","../src/withRef.tsx"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './Box';\nexport * from './MemoizedChildren';\nexport * from './PortalBody';\nexport * from './Text';\nexport * from './composeEventHandlers';\nexport * from './createPrimitiveComponent';\nexport * from './createPrimitiveElement';\nexport * from './createSlotComponent';\nexport * from './useComposedRef';\nexport * from './useEffectOnce';\nexport * from './useIsomorphicLayoutEffect';\nexport * from './useMemoOnce';\nexport * from './useOnClickOutside';\nexport * from './useStableMemo';\nexport * from './withProviders';\nexport * from './withRef';\n","import React from 'react';\n\nimport { Slot } from '@radix-ui/react-slot';\n\nexport const createSlotComponent = <\n T extends React.ElementType,\n P extends React.ComponentPropsWithoutRef<T>,\n>(\n element: T\n) =>\n // eslint-disable-next-line react/display-name\n React.forwardRef<\n any,\n {\n as?: React.ElementType;\n asChild?: boolean;\n } & P\n >(({ as, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : (as as T) || element;\n\n return <Comp ref={ref} {...props} />;\n });\n","import type React from 'react';\n\nimport { createSlotComponent } from './createSlotComponent';\n\nexport const Box = createSlotComponent('div');\n\nexport type BoxProps = React.ComponentPropsWithRef<typeof Box>;\n","import React from 'react';\n\nexport const MemoizedChildren = React.memo(\n ({ children }: { children: React.ReactNode }) => {\n return <>{children}</>;\n }\n);\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport type PortalBodyProps = { children: React.ReactNode; element?: Element };\n\nexport const PortalBody: ({\n children,\n element,\n}: PortalBodyProps) => React.ReactPortal = ({\n children,\n element,\n}: PortalBodyProps) => {\n const container =\n element || typeof window !== 'undefined' ? document.body : undefined;\n\n if (!container) return (<>{children}</>) as any;\n\n return ReactDOM.createPortal(children, element || document.body);\n};\n","import type React from 'react';\n\nimport { createSlotComponent } from './createSlotComponent';\n\nexport const Text = createSlotComponent('span');\n\nexport type TextProps = React.ComponentPropsWithRef<typeof Text>;\n","/** @see https://github.com/radix-ui/primitives/blob/b324ec2d7ddf13a2a115cb5b11478e24d2f45b87/packages/core/primitive/src/primitive.tsx#L1 */\nexport const composeEventHandlers =\n <E>(\n originalEventHandler?: (event: E) => void,\n ourEventHandler?: (event: E) => void,\n { checkForDefaultPrevented = true } = {}\n ) =>\n (event: E) => {\n originalEventHandler?.(event);\n\n if (\n checkForDefaultPrevented === false ||\n !(event as unknown as Event).defaultPrevented\n ) {\n return ourEventHandler?.(event);\n }\n };\n","/* eslint-disable react/display-name */\n\nimport React from 'react';\n\nimport { isDefined } from '@udecode/utils';\nimport { clsx } from 'clsx';\n\nimport { createSlotComponent } from './createSlotComponent';\nimport { useComposedRef } from './useComposedRef';\n\n/**\n * Primitive component factory. It uses hooks for managing state and props, and\n * forwards references to child components. Component props:\n *\n * - `asChild`: If true, the component will be rendered as a `Slot`\n * {@link https://www.radix-ui.com/docs/primitives/utilities/slot}.\n * - `options`: Options passed to the state hook.\n * - `state`: Provide your state instead of using the state hook.\n * - `className`: Class name to be merged to the component.\n * - `style`: Style object to be merged to the component.\n * - `setProps`: Function to set props from the props hook.\n * - `...props`: Props to be passed to the component. Props hook return value:\n * - `ref`: Reference to be forwarded to the component.\n * - `props`: Props to be passed to the component.\n * - `hidden`: If true, the component will not be rendered.\n *\n * @example\n * const MyButton = createPrimitiveComponent(Button)({\n * stateHook: useButtonState,\n * propsHook: useButton,\n * });\n *\n * @param {React.ElementType} element The base component or native HTML element.\n * @returns {function} A primitive component.\n */\nexport const createPrimitiveComponent = <\n T extends React.ElementType,\n P extends React.ComponentPropsWithoutRef<T>,\n>(\n element: T\n) => {\n const Comp = createSlotComponent<T, P>(element);\n\n return <SH extends (options: any) => any, PH extends (state: any) => any>({\n propsHook,\n stateHook,\n }: {\n propsHook?: PH;\n stateHook?: SH;\n } = {}) => {\n return React.forwardRef<\n any,\n {\n as?: React.ElementType;\n asChild?: boolean;\n className?: string;\n options?: Parameters<SH>[0];\n setProps?: (hookProps: NonNullable<ReturnType<PH>['props']>) => P;\n state?: Parameters<PH>[0];\n style?: React.CSSProperties;\n } & P\n >(\n (\n {\n asChild,\n className: classNameProp,\n getClassName,\n options,\n state: stateProp,\n ...props\n },\n ref\n ) => {\n const state = isDefined(stateProp)\n ? stateProp\n : stateHook\n ? stateHook(options as any)\n : undefined;\n const {\n hidden,\n props: hookProps,\n ref: hookRef,\n } = propsHook\n ? propsHook(state)\n : { hidden: false, props: {}, ref: null };\n\n const _ref = useComposedRef(ref, hookRef);\n const className =\n isDefined(hookProps?.className) || isDefined(classNameProp)\n ? clsx(hookProps?.className, classNameProp)\n : undefined;\n const style =\n hookProps?.style || props.style\n ? { ...hookProps?.style, ...props.style }\n : undefined;\n\n if (!asChild && hidden) return null;\n\n return (\n <Comp\n ref={_ref}\n asChild={asChild}\n {...hookProps}\n className={className}\n style={style}\n {...props}\n {...(props.setProps?.(hookProps ?? {}) ?? {})}\n />\n );\n }\n );\n };\n};\n","import React from 'react';\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value This utility takes care of different types\n * of refs: callback refs and React.RefObject(s)\n */\nconst setRef = <T>(ref: PossibleRef<T>, value: T) => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref !== null && ref !== undefined) {\n (ref as React.MutableRefObject<T>).current = value;\n }\n};\n\n/**\n * A utility to compose multiple refs together Accepts callback refs and\n * React.RefObject(s)\n */\nexport const composeRefs =\n <T>(...refs: PossibleRef<T>[]) =>\n (node: T) =>\n refs.forEach((ref) => setRef(ref, node));\n\n/**\n * A custom hook that composes multiple refs Accepts callback refs and\n * React.RefObject(s)\n */\nexport const useComposedRef = <T>(...refs: PossibleRef<T>[]) => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useCallback(composeRefs(...refs), refs);\n};\n","import React from 'react';\n\nexport function createPrimitiveElement<T extends keyof HTMLElementTagNameMap>(\n tag: T\n) {\n return React.forwardRef<HTMLElementTagNameMap[T], JSX.IntrinsicElements[T]>(\n function CreateComponent(props, ref) {\n return React.createElement(tag, { ...props, ref });\n }\n );\n}\n","import React from 'react';\n\nexport function useEffectOnce(\n effect: React.EffectCallback,\n deps: React.DependencyList\n) {\n const initialized = React.useRef(false);\n const prevDepsRef = React.useRef(deps);\n\n React.useEffect(() => {\n const depsChanged = deps.some((dep, i) => dep !== prevDepsRef.current[i]);\n\n if (!initialized.current || depsChanged) {\n initialized.current = true;\n prevDepsRef.current = deps;\n effect();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n}\n","import React from 'react';\n\nexport const CAN_USE_DOM =\n typeof window !== 'undefined' && window.document?.createElement !== undefined;\n\n/**\n * Prevent warning on SSR by falling back to React.useEffect when DOM isn't\n * available\n */\nexport const useIsomorphicLayoutEffect = CAN_USE_DOM\n ? React.useLayoutEffect\n : React.useEffect;\n","import React from 'react';\n\nexport function useMemoOnce<T>(\n factory: () => T,\n deps: React.DependencyList\n): T {\n const initialized = React.useRef(false);\n const prevDepsRef = React.useRef(deps);\n const memoizedValueRef = React.useRef<T>();\n\n if (\n !initialized.current ||\n deps.some((dep, i) => dep !== prevDepsRef.current[i])\n ) {\n initialized.current = true;\n prevDepsRef.current = deps;\n memoizedValueRef.current = factory();\n }\n\n return memoizedValueRef.current!;\n}\n","import React from 'react';\n\nconst canUsePassiveEvents = (): boolean => {\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function'\n )\n return false;\n\n let passive = false;\n const options = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line getter-return\n get() {\n passive = true;\n },\n });\n const noop = () => null;\n\n window.addEventListener('test', noop, options);\n window.removeEventListener('test', noop, options);\n\n return passive;\n};\n\nexport const DEFAULT_IGNORE_CLASS = 'ignore-onclickoutside';\n\nexport type UseOnClickOutsideCallback<T extends Event = Event> = (\n event: T\n) => void;\n\ntype El = HTMLElement;\ntype Refs = React.RefObject<El>[];\n\nexport interface UseOnClickOutsideOptions {\n detectIFrame?: boolean;\n disabled?: boolean;\n eventTypes?: string[];\n excludeScrollbar?: boolean;\n ignoreClass?: string[] | string;\n refs?: Refs;\n}\n\nexport type UseOnClickOutsideReturn = (element: El | null) => void;\n\nconst checkClass = (el: HTMLElement, cl: string): boolean =>\n el.classList?.contains(cl);\n\nconst hasIgnoreClass = (e: any, ignoreClass: string[] | string): boolean => {\n let el = e.target || e;\n\n while (el) {\n if (Array.isArray(ignoreClass)) {\n // eslint-disable-next-line no-loop-func\n if (ignoreClass.some((c) => checkClass(el, c))) return true;\n } else if (checkClass(el, ignoreClass)) {\n return true;\n }\n\n el = el.parentElement;\n }\n\n return false;\n};\n\nconst clickedOnScrollbar = (e: MouseEvent): boolean =>\n document.documentElement.clientWidth <= e.clientX ||\n document.documentElement.clientHeight <= e.clientY;\n\nconst getEventOptions = (type: string): { passive: boolean } | boolean =>\n type.includes('touch') && canUsePassiveEvents() ? { passive: true } : false;\n\nexport const useOnClickOutside = (\n callback: UseOnClickOutsideCallback,\n {\n detectIFrame = true,\n disabled,\n eventTypes = ['mousedown', 'touchstart'],\n excludeScrollbar,\n ignoreClass = DEFAULT_IGNORE_CLASS,\n refs: refsOpt,\n }: UseOnClickOutsideOptions = {}\n): UseOnClickOutsideReturn => {\n const [refsState, setRefsState] = React.useState<Refs>([]);\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n\n const ref: UseOnClickOutsideReturn = React.useCallback(\n (el) => setRefsState((prevState) => [...prevState, { current: el }]),\n []\n );\n\n React.useEffect(\n () => {\n if (!refsOpt?.length && refsState.length === 0) return;\n\n const getEls = () => {\n const els: El[] = [];\n (refsOpt || refsState).forEach(\n ({ current }) => current && els.push(current)\n );\n\n return els;\n };\n\n const handler = (e: any) => {\n if (\n !hasIgnoreClass(e, ignoreClass) &&\n !(excludeScrollbar && clickedOnScrollbar(e)) &&\n getEls().every((el) => !el.contains(e.target))\n )\n callbackRef.current(e);\n };\n\n const blurHandler = (e: FocusEvent) =>\n // On firefox the iframe becomes document.activeElement in the next event loop\n setTimeout(() => {\n const { activeElement } = document;\n\n if (\n activeElement?.tagName === 'IFRAME' &&\n !hasIgnoreClass(activeElement, ignoreClass) &&\n !getEls().includes(activeElement as HTMLIFrameElement)\n )\n callbackRef.current(e);\n }, 0);\n\n const removeEventListener = () => {\n eventTypes.forEach((type) =>\n document.removeEventListener(\n type,\n handler,\n getEventOptions(type) as any\n )\n );\n\n if (detectIFrame) window.removeEventListener('blur', blurHandler);\n };\n\n if (disabled) {\n removeEventListener();\n\n return;\n }\n\n eventTypes.forEach((type) =>\n document.addEventListener(type, handler, getEventOptions(type))\n );\n\n if (detectIFrame) window.addEventListener('blur', blurHandler);\n\n // eslint-disable-next-line consistent-return\n return () => removeEventListener();\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n refsState,\n ignoreClass,\n excludeScrollbar,\n disabled,\n detectIFrame,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(eventTypes),\n ]\n );\n\n return ref;\n};\n","import React from 'react';\n\nexport const useStableMemo = <T>(\n producer: () => T,\n deps?: React.DependencyList\n): T => {\n const [value, setValue] = React.useState(producer);\n\n React.useLayoutEffect(() => {\n setValue(producer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n\n return value;\n};\n","import React from 'react';\n\n/**\n * Wrap a component into multiple providers. If there are any props that you\n * want a provider to receive, you can simply pass an array.\n */\nexport const withProviders =\n (...providers: any[]) =>\n <T,>(WrappedComponent: React.FC<T>) =>\n (props: T) =>\n providers.reduceRight(\n (acc, prov) => {\n let Provider = prov;\n\n if (Array.isArray(prov)) {\n [Provider] = prov;\n\n return <Provider {...prov[1]}>{acc}</Provider>;\n }\n\n return <Provider>{acc}</Provider>;\n },\n <WrappedComponent {...(props as any)} />\n );\n","import React from 'react';\n\ntype ElementType<P = any> =\n | {\n [K in keyof JSX.IntrinsicElements]: P extends JSX.IntrinsicElements[K]\n ? K\n : never;\n }[keyof JSX.IntrinsicElements]\n | React.ComponentType<P>;\n\ntype ForwardRefComponent<T, P = {}> = React.ForwardRefExoticComponent<\n React.PropsWithoutRef<P> & React.RefAttributes<T>\n>;\n\ntype InferElementRef<T> =\n T extends ElementType<any>\n ? T extends keyof JSX.IntrinsicElements\n ? JSX.IntrinsicElements[T] extends React.DetailedHTMLProps<\n React.HTMLAttributes<infer R>,\n any\n >\n ? R\n : never\n : T extends React.ComponentType<any>\n ? T extends React.ComponentClass<any>\n ? InstanceType<T>\n : T extends React.ForwardRefExoticComponent<any>\n ? React.ComponentPropsWithRef<T>['ref'] extends React.Ref<infer R>\n ? R\n : never\n : never\n : never\n : never;\n\n/**\n * Shorter alternative to `React.forwardRef`.\n *\n * @generic1 Component type or element type\n * @generic2 Extended prop types\n */\nexport function withRef<T extends ElementType, P = {}>(\n renderFunction: React.ForwardRefRenderFunction<\n InferElementRef<T>,\n React.ComponentPropsWithoutRef<T> & P\n >\n): ForwardRefComponent<\n InferElementRef<T>,\n React.ComponentPropsWithoutRef<T> & P\n> {\n return React.forwardRef(renderFunction as any) as any;\n}\n"],"mappings":"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","names":["React","_a","import_react","React","import_react","React","ReactDOM","import_react","import_react","React","React","_a","_b","import_react","React","import_react","React","import_react","React","import_react","React","import_react","_a","React","import_react","React","import_react","React","import_react","React"]}
package/dist/index.mjs CHANGED
@@ -45,15 +45,23 @@ var createSlotComponent = (element) => (
45
45
  // src/Box.tsx
46
46
  var Box = createSlotComponent("div");
47
47
 
48
- // src/PortalBody.tsx
48
+ // src/MemoizedChildren.tsx
49
49
  import React2 from "react";
50
+ var MemoizedChildren = React2.memo(
51
+ ({ children }) => {
52
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, children);
53
+ }
54
+ );
55
+
56
+ // src/PortalBody.tsx
57
+ import React3 from "react";
50
58
  import ReactDOM from "react-dom";
51
59
  var PortalBody = ({
52
60
  children,
53
61
  element
54
62
  }) => {
55
63
  const container = element || typeof window !== "undefined" ? document.body : void 0;
56
- if (!container) return /* @__PURE__ */ React2.createElement(React2.Fragment, null, children);
64
+ if (!container) return /* @__PURE__ */ React3.createElement(React3.Fragment, null, children);
57
65
  return ReactDOM.createPortal(children, element || document.body);
58
66
  };
59
67
 
@@ -69,12 +77,12 @@ var composeEventHandlers = (originalEventHandler, ourEventHandler, { checkForDef
69
77
  };
70
78
 
71
79
  // src/createPrimitiveComponent.tsx
72
- import React4 from "react";
80
+ import React5 from "react";
73
81
  import { isDefined } from "@udecode/utils";
74
82
  import { clsx } from "clsx";
75
83
 
76
84
  // src/useComposedRef.ts
77
- import React3 from "react";
85
+ import React4 from "react";
78
86
  var setRef = (ref, value) => {
79
87
  if (typeof ref === "function") {
80
88
  ref(value);
@@ -84,7 +92,7 @@ var setRef = (ref, value) => {
84
92
  };
85
93
  var composeRefs = (...refs) => (node) => refs.forEach((ref) => setRef(ref, node));
86
94
  var useComposedRef = (...refs) => {
87
- return React3.useCallback(composeRefs(...refs), refs);
95
+ return React4.useCallback(composeRefs(...refs), refs);
88
96
  };
89
97
 
90
98
  // src/createPrimitiveComponent.tsx
@@ -94,7 +102,7 @@ var createPrimitiveComponent = (element) => {
94
102
  propsHook,
95
103
  stateHook
96
104
  } = {}) => {
97
- return React4.forwardRef(
105
+ return React5.forwardRef(
98
106
  (_a2, ref) => {
99
107
  var _b = _a2, {
100
108
  asChild,
@@ -120,7 +128,7 @@ var createPrimitiveComponent = (element) => {
120
128
  const className = isDefined(hookProps == null ? void 0 : hookProps.className) || isDefined(classNameProp) ? clsx(hookProps == null ? void 0 : hookProps.className, classNameProp) : void 0;
121
129
  const style = (hookProps == null ? void 0 : hookProps.style) || props.style ? __spreadValues(__spreadValues({}, hookProps == null ? void 0 : hookProps.style), props.style) : void 0;
122
130
  if (!asChild && hidden) return null;
123
- return /* @__PURE__ */ React4.createElement(
131
+ return /* @__PURE__ */ React5.createElement(
124
132
  Comp,
125
133
  __spreadValues(__spreadValues(__spreadProps(__spreadValues({
126
134
  ref: _ref,
@@ -136,23 +144,52 @@ var createPrimitiveComponent = (element) => {
136
144
  };
137
145
 
138
146
  // src/createPrimitiveElement.tsx
139
- import React5 from "react";
147
+ import React6 from "react";
140
148
  function createPrimitiveElement(tag) {
141
- return React5.forwardRef(
149
+ return React6.forwardRef(
142
150
  function CreateComponent(props, ref) {
143
- return React5.createElement(tag, __spreadProps(__spreadValues({}, props), { ref }));
151
+ return React6.createElement(tag, __spreadProps(__spreadValues({}, props), { ref }));
144
152
  }
145
153
  );
146
154
  }
147
155
 
156
+ // src/useEffectOnce.ts
157
+ import React7 from "react";
158
+ function useEffectOnce(effect, deps) {
159
+ const initialized = React7.useRef(false);
160
+ const prevDepsRef = React7.useRef(deps);
161
+ React7.useEffect(() => {
162
+ const depsChanged = deps.some((dep, i) => dep !== prevDepsRef.current[i]);
163
+ if (!initialized.current || depsChanged) {
164
+ initialized.current = true;
165
+ prevDepsRef.current = deps;
166
+ effect();
167
+ }
168
+ }, deps);
169
+ }
170
+
148
171
  // src/useIsomorphicLayoutEffect.ts
149
- import React6 from "react";
172
+ import React8 from "react";
150
173
  var _a;
151
174
  var CAN_USE_DOM = typeof window !== "undefined" && ((_a = window.document) == null ? void 0 : _a.createElement) !== void 0;
152
- var useIsomorphicLayoutEffect = CAN_USE_DOM ? React6.useLayoutEffect : React6.useEffect;
175
+ var useIsomorphicLayoutEffect = CAN_USE_DOM ? React8.useLayoutEffect : React8.useEffect;
176
+
177
+ // src/useMemoOnce.ts
178
+ import React9 from "react";
179
+ function useMemoOnce(factory, deps) {
180
+ const initialized = React9.useRef(false);
181
+ const prevDepsRef = React9.useRef(deps);
182
+ const memoizedValueRef = React9.useRef();
183
+ if (!initialized.current || deps.some((dep, i) => dep !== prevDepsRef.current[i])) {
184
+ initialized.current = true;
185
+ prevDepsRef.current = deps;
186
+ memoizedValueRef.current = factory();
187
+ }
188
+ return memoizedValueRef.current;
189
+ }
153
190
 
154
191
  // src/useOnClickOutside.ts
155
- import React7 from "react";
192
+ import React10 from "react";
156
193
  var canUsePassiveEvents = () => {
157
194
  if (typeof window === "undefined" || typeof window.addEventListener !== "function")
158
195
  return false;
@@ -195,14 +232,14 @@ var useOnClickOutside = (callback, {
195
232
  ignoreClass = DEFAULT_IGNORE_CLASS,
196
233
  refs: refsOpt
197
234
  } = {}) => {
198
- const [refsState, setRefsState] = React7.useState([]);
199
- const callbackRef = React7.useRef(callback);
235
+ const [refsState, setRefsState] = React10.useState([]);
236
+ const callbackRef = React10.useRef(callback);
200
237
  callbackRef.current = callback;
201
- const ref = React7.useCallback(
238
+ const ref = React10.useCallback(
202
239
  (el) => setRefsState((prevState) => [...prevState, { current: el }]),
203
240
  []
204
241
  );
205
- React7.useEffect(
242
+ React10.useEffect(
206
243
  () => {
207
244
  if (!(refsOpt == null ? void 0 : refsOpt.length) && refsState.length === 0) return;
208
245
  const getEls = () => {
@@ -259,38 +296,39 @@ var useOnClickOutside = (callback, {
259
296
  };
260
297
 
261
298
  // src/useStableMemo.ts
262
- import React8 from "react";
299
+ import React11 from "react";
263
300
  var useStableMemo = (producer, deps) => {
264
- const [value, setValue] = React8.useState(producer);
265
- React8.useLayoutEffect(() => {
301
+ const [value, setValue] = React11.useState(producer);
302
+ React11.useLayoutEffect(() => {
266
303
  setValue(producer);
267
304
  }, deps);
268
305
  return value;
269
306
  };
270
307
 
271
308
  // src/withProviders.tsx
272
- import React9 from "react";
309
+ import React12 from "react";
273
310
  var withProviders = (...providers) => (WrappedComponent) => (props) => providers.reduceRight(
274
311
  (acc, prov) => {
275
312
  let Provider = prov;
276
313
  if (Array.isArray(prov)) {
277
314
  [Provider] = prov;
278
- return /* @__PURE__ */ React9.createElement(Provider, __spreadValues({}, prov[1]), acc);
315
+ return /* @__PURE__ */ React12.createElement(Provider, __spreadValues({}, prov[1]), acc);
279
316
  }
280
- return /* @__PURE__ */ React9.createElement(Provider, null, acc);
317
+ return /* @__PURE__ */ React12.createElement(Provider, null, acc);
281
318
  },
282
- /* @__PURE__ */ React9.createElement(WrappedComponent, __spreadValues({}, props))
319
+ /* @__PURE__ */ React12.createElement(WrappedComponent, __spreadValues({}, props))
283
320
  );
284
321
 
285
322
  // src/withRef.tsx
286
- import React10 from "react";
323
+ import React13 from "react";
287
324
  function withRef(renderFunction) {
288
- return React10.forwardRef(renderFunction);
325
+ return React13.forwardRef(renderFunction);
289
326
  }
290
327
  export {
291
328
  Box,
292
329
  CAN_USE_DOM,
293
330
  DEFAULT_IGNORE_CLASS,
331
+ MemoizedChildren,
294
332
  PortalBody,
295
333
  Text,
296
334
  composeEventHandlers,
@@ -299,7 +337,9 @@ export {
299
337
  createPrimitiveElement,
300
338
  createSlotComponent,
301
339
  useComposedRef,
340
+ useEffectOnce,
302
341
  useIsomorphicLayoutEffect,
342
+ useMemoOnce,
303
343
  useOnClickOutside,
304
344
  useStableMemo,
305
345
  withProviders,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/createSlotComponent.tsx","../src/Box.tsx","../src/PortalBody.tsx","../src/Text.tsx","../src/composeEventHandlers.ts","../src/createPrimitiveComponent.tsx","../src/useComposedRef.ts","../src/createPrimitiveElement.tsx","../src/useIsomorphicLayoutEffect.ts","../src/useOnClickOutside.ts","../src/useStableMemo.ts","../src/withProviders.tsx","../src/withRef.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Slot } from '@radix-ui/react-slot';\n\nexport const createSlotComponent = <\n T extends React.ElementType,\n P extends React.ComponentPropsWithoutRef<T>,\n>(\n element: T\n) =>\n // eslint-disable-next-line react/display-name\n React.forwardRef<\n any,\n {\n as?: React.ElementType;\n asChild?: boolean;\n } & P\n >(({ as, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : (as as T) || element;\n\n return <Comp ref={ref} {...props} />;\n });\n","import type React from 'react';\n\nimport { createSlotComponent } from './createSlotComponent';\n\nexport const Box = createSlotComponent('div');\n\nexport type BoxProps = React.ComponentPropsWithRef<typeof Box>;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport type PortalBodyProps = { children: React.ReactNode; element?: Element };\n\nexport const PortalBody: ({\n children,\n element,\n}: PortalBodyProps) => React.ReactPortal = ({\n children,\n element,\n}: PortalBodyProps) => {\n const container =\n element || typeof window !== 'undefined' ? document.body : undefined;\n\n if (!container) return (<>{children}</>) as any;\n\n return ReactDOM.createPortal(children, element || document.body);\n};\n","import type React from 'react';\n\nimport { createSlotComponent } from './createSlotComponent';\n\nexport const Text = createSlotComponent('span');\n\nexport type TextProps = React.ComponentPropsWithRef<typeof Text>;\n","/** @see https://github.com/radix-ui/primitives/blob/b324ec2d7ddf13a2a115cb5b11478e24d2f45b87/packages/core/primitive/src/primitive.tsx#L1 */\nexport const composeEventHandlers =\n <E>(\n originalEventHandler?: (event: E) => void,\n ourEventHandler?: (event: E) => void,\n { checkForDefaultPrevented = true } = {}\n ) =>\n (event: E) => {\n originalEventHandler?.(event);\n\n if (\n checkForDefaultPrevented === false ||\n !(event as unknown as Event).defaultPrevented\n ) {\n return ourEventHandler?.(event);\n }\n };\n","/* eslint-disable react/display-name */\n\nimport React from 'react';\n\nimport { isDefined } from '@udecode/utils';\nimport { clsx } from 'clsx';\n\nimport { createSlotComponent } from './createSlotComponent';\nimport { useComposedRef } from './useComposedRef';\n\n/**\n * Primitive component factory. It uses hooks for managing state and props, and\n * forwards references to child components. Component props:\n *\n * - `asChild`: If true, the component will be rendered as a `Slot`\n * {@link https://www.radix-ui.com/docs/primitives/utilities/slot}.\n * - `options`: Options passed to the state hook.\n * - `state`: Provide your state instead of using the state hook.\n * - `className`: Class name to be merged to the component.\n * - `style`: Style object to be merged to the component.\n * - `setProps`: Function to set props from the props hook.\n * - `...props`: Props to be passed to the component. Props hook return value:\n * - `ref`: Reference to be forwarded to the component.\n * - `props`: Props to be passed to the component.\n * - `hidden`: If true, the component will not be rendered.\n *\n * @example\n * const MyButton = createPrimitiveComponent(Button)({\n * stateHook: useButtonState,\n * propsHook: useButton,\n * });\n *\n * @param {React.ElementType} element The base component or native HTML element.\n * @returns {function} A primitive component.\n */\nexport const createPrimitiveComponent = <\n T extends React.ElementType,\n P extends React.ComponentPropsWithoutRef<T>,\n>(\n element: T\n) => {\n const Comp = createSlotComponent<T, P>(element);\n\n return <SH extends (options: any) => any, PH extends (state: any) => any>({\n propsHook,\n stateHook,\n }: {\n propsHook?: PH;\n stateHook?: SH;\n } = {}) => {\n return React.forwardRef<\n any,\n {\n as?: React.ElementType;\n asChild?: boolean;\n className?: string;\n options?: Parameters<SH>[0];\n setProps?: (hookProps: NonNullable<ReturnType<PH>['props']>) => P;\n state?: Parameters<PH>[0];\n style?: React.CSSProperties;\n } & P\n >(\n (\n {\n asChild,\n className: classNameProp,\n getClassName,\n options,\n state: stateProp,\n ...props\n },\n ref\n ) => {\n const state = isDefined(stateProp)\n ? stateProp\n : stateHook\n ? stateHook(options as any)\n : undefined;\n const {\n hidden,\n props: hookProps,\n ref: hookRef,\n } = propsHook\n ? propsHook(state)\n : { hidden: false, props: {}, ref: null };\n\n const _ref = useComposedRef(ref, hookRef);\n const className =\n isDefined(hookProps?.className) || isDefined(classNameProp)\n ? clsx(hookProps?.className, classNameProp)\n : undefined;\n const style =\n hookProps?.style || props.style\n ? { ...hookProps?.style, ...props.style }\n : undefined;\n\n if (!asChild && hidden) return null;\n\n return (\n <Comp\n ref={_ref}\n asChild={asChild}\n {...hookProps}\n className={className}\n style={style}\n {...props}\n {...(props.setProps?.(hookProps ?? {}) ?? {})}\n />\n );\n }\n );\n };\n};\n","import React from 'react';\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value This utility takes care of different types\n * of refs: callback refs and React.RefObject(s)\n */\nconst setRef = <T>(ref: PossibleRef<T>, value: T) => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref !== null && ref !== undefined) {\n (ref as React.MutableRefObject<T>).current = value;\n }\n};\n\n/**\n * A utility to compose multiple refs together Accepts callback refs and\n * React.RefObject(s)\n */\nexport const composeRefs =\n <T>(...refs: PossibleRef<T>[]) =>\n (node: T) =>\n refs.forEach((ref) => setRef(ref, node));\n\n/**\n * A custom hook that composes multiple refs Accepts callback refs and\n * React.RefObject(s)\n */\nexport const useComposedRef = <T>(...refs: PossibleRef<T>[]) => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useCallback(composeRefs(...refs), refs);\n};\n","import React from 'react';\n\nexport function createPrimitiveElement<T extends keyof HTMLElementTagNameMap>(\n tag: T\n) {\n return React.forwardRef<HTMLElementTagNameMap[T], JSX.IntrinsicElements[T]>(\n function CreateComponent(props, ref) {\n return React.createElement(tag, { ...props, ref });\n }\n );\n}\n","import React from 'react';\n\nexport const CAN_USE_DOM =\n typeof window !== 'undefined' && window.document?.createElement !== undefined;\n\n/**\n * Prevent warning on SSR by falling back to React.useEffect when DOM isn't\n * available\n */\nexport const useIsomorphicLayoutEffect = CAN_USE_DOM\n ? React.useLayoutEffect\n : React.useEffect;\n","import React from 'react';\n\nconst canUsePassiveEvents = (): boolean => {\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function'\n )\n return false;\n\n let passive = false;\n const options = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line getter-return\n get() {\n passive = true;\n },\n });\n const noop = () => null;\n\n window.addEventListener('test', noop, options);\n window.removeEventListener('test', noop, options);\n\n return passive;\n};\n\nexport const DEFAULT_IGNORE_CLASS = 'ignore-onclickoutside';\n\nexport type UseOnClickOutsideCallback<T extends Event = Event> = (\n event: T\n) => void;\n\ntype El = HTMLElement;\ntype Refs = React.RefObject<El>[];\n\nexport interface UseOnClickOutsideOptions {\n detectIFrame?: boolean;\n disabled?: boolean;\n eventTypes?: string[];\n excludeScrollbar?: boolean;\n ignoreClass?: string[] | string;\n refs?: Refs;\n}\n\nexport type UseOnClickOutsideReturn = (element: El | null) => void;\n\nconst checkClass = (el: HTMLElement, cl: string): boolean =>\n el.classList?.contains(cl);\n\nconst hasIgnoreClass = (e: any, ignoreClass: string[] | string): boolean => {\n let el = e.target || e;\n\n while (el) {\n if (Array.isArray(ignoreClass)) {\n // eslint-disable-next-line no-loop-func\n if (ignoreClass.some((c) => checkClass(el, c))) return true;\n } else if (checkClass(el, ignoreClass)) {\n return true;\n }\n\n el = el.parentElement;\n }\n\n return false;\n};\n\nconst clickedOnScrollbar = (e: MouseEvent): boolean =>\n document.documentElement.clientWidth <= e.clientX ||\n document.documentElement.clientHeight <= e.clientY;\n\nconst getEventOptions = (type: string): { passive: boolean } | boolean =>\n type.includes('touch') && canUsePassiveEvents() ? { passive: true } : false;\n\nexport const useOnClickOutside = (\n callback: UseOnClickOutsideCallback,\n {\n detectIFrame = true,\n disabled,\n eventTypes = ['mousedown', 'touchstart'],\n excludeScrollbar,\n ignoreClass = DEFAULT_IGNORE_CLASS,\n refs: refsOpt,\n }: UseOnClickOutsideOptions = {}\n): UseOnClickOutsideReturn => {\n const [refsState, setRefsState] = React.useState<Refs>([]);\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n\n const ref: UseOnClickOutsideReturn = React.useCallback(\n (el) => setRefsState((prevState) => [...prevState, { current: el }]),\n []\n );\n\n React.useEffect(\n () => {\n if (!refsOpt?.length && refsState.length === 0) return;\n\n const getEls = () => {\n const els: El[] = [];\n (refsOpt || refsState).forEach(\n ({ current }) => current && els.push(current)\n );\n\n return els;\n };\n\n const handler = (e: any) => {\n if (\n !hasIgnoreClass(e, ignoreClass) &&\n !(excludeScrollbar && clickedOnScrollbar(e)) &&\n getEls().every((el) => !el.contains(e.target))\n )\n callbackRef.current(e);\n };\n\n const blurHandler = (e: FocusEvent) =>\n // On firefox the iframe becomes document.activeElement in the next event loop\n setTimeout(() => {\n const { activeElement } = document;\n\n if (\n activeElement?.tagName === 'IFRAME' &&\n !hasIgnoreClass(activeElement, ignoreClass) &&\n !getEls().includes(activeElement as HTMLIFrameElement)\n )\n callbackRef.current(e);\n }, 0);\n\n const removeEventListener = () => {\n eventTypes.forEach((type) =>\n document.removeEventListener(\n type,\n handler,\n getEventOptions(type) as any\n )\n );\n\n if (detectIFrame) window.removeEventListener('blur', blurHandler);\n };\n\n if (disabled) {\n removeEventListener();\n\n return;\n }\n\n eventTypes.forEach((type) =>\n document.addEventListener(type, handler, getEventOptions(type))\n );\n\n if (detectIFrame) window.addEventListener('blur', blurHandler);\n\n // eslint-disable-next-line consistent-return\n return () => removeEventListener();\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n refsState,\n ignoreClass,\n excludeScrollbar,\n disabled,\n detectIFrame,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(eventTypes),\n ]\n );\n\n return ref;\n};\n","import React from 'react';\n\nexport const useStableMemo = <T>(\n producer: () => T,\n deps?: React.DependencyList\n): T => {\n const [value, setValue] = React.useState(producer);\n\n React.useLayoutEffect(() => {\n setValue(producer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n\n return value;\n};\n","import React from 'react';\n\n/**\n * Wrap a component into multiple providers. If there are any props that you\n * want a provider to receive, you can simply pass an array.\n */\nexport const withProviders =\n (...providers: any[]) =>\n <T,>(WrappedComponent: React.FC<T>) =>\n (props: T) =>\n providers.reduceRight(\n (acc, prov) => {\n let Provider = prov;\n\n if (Array.isArray(prov)) {\n [Provider] = prov;\n\n return <Provider {...prov[1]}>{acc}</Provider>;\n }\n\n return <Provider>{acc}</Provider>;\n },\n <WrappedComponent {...(props as any)} />\n );\n","import React from 'react';\n\ntype ElementType<P = any> =\n | {\n [K in keyof JSX.IntrinsicElements]: P extends JSX.IntrinsicElements[K]\n ? K\n : never;\n }[keyof JSX.IntrinsicElements]\n | React.ComponentType<P>;\n\ntype ForwardRefComponent<T, P = {}> = React.ForwardRefExoticComponent<\n React.PropsWithoutRef<P> & React.RefAttributes<T>\n>;\n\ntype InferElementRef<T> =\n T extends ElementType<any>\n ? T extends keyof JSX.IntrinsicElements\n ? JSX.IntrinsicElements[T] extends React.DetailedHTMLProps<\n React.HTMLAttributes<infer R>,\n any\n >\n ? R\n : never\n : T extends React.ComponentType<any>\n ? T extends React.ComponentClass<any>\n ? InstanceType<T>\n : T extends React.ForwardRefExoticComponent<any>\n ? React.ComponentPropsWithRef<T>['ref'] extends React.Ref<infer R>\n ? R\n : never\n : never\n : never\n : never;\n\n/**\n * Shorter alternative to `React.forwardRef`.\n *\n * @generic1 Component type or element type\n * @generic2 Extended prop types\n */\nexport function withRef<T extends ElementType, P = {}>(\n renderFunction: React.ForwardRefRenderFunction<\n InferElementRef<T>,\n React.ComponentPropsWithoutRef<T> & P\n >\n): ForwardRefComponent<\n InferElementRef<T>,\n React.ComponentPropsWithoutRef<T> & P\n> {\n return React.forwardRef(renderFunction as any) as any;\n}\n"],"mappings":"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","names":["_a","React","React","React","React","_a","_b","React","React","React","React","_a","React","React","React","React"]}
1
+ {"version":3,"sources":["../src/createSlotComponent.tsx","../src/Box.tsx","../src/MemoizedChildren.tsx","../src/PortalBody.tsx","../src/Text.tsx","../src/composeEventHandlers.ts","../src/createPrimitiveComponent.tsx","../src/useComposedRef.ts","../src/createPrimitiveElement.tsx","../src/useEffectOnce.ts","../src/useIsomorphicLayoutEffect.ts","../src/useMemoOnce.ts","../src/useOnClickOutside.ts","../src/useStableMemo.ts","../src/withProviders.tsx","../src/withRef.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Slot } from '@radix-ui/react-slot';\n\nexport const createSlotComponent = <\n T extends React.ElementType,\n P extends React.ComponentPropsWithoutRef<T>,\n>(\n element: T\n) =>\n // eslint-disable-next-line react/display-name\n React.forwardRef<\n any,\n {\n as?: React.ElementType;\n asChild?: boolean;\n } & P\n >(({ as, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : (as as T) || element;\n\n return <Comp ref={ref} {...props} />;\n });\n","import type React from 'react';\n\nimport { createSlotComponent } from './createSlotComponent';\n\nexport const Box = createSlotComponent('div');\n\nexport type BoxProps = React.ComponentPropsWithRef<typeof Box>;\n","import React from 'react';\n\nexport const MemoizedChildren = React.memo(\n ({ children }: { children: React.ReactNode }) => {\n return <>{children}</>;\n }\n);\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport type PortalBodyProps = { children: React.ReactNode; element?: Element };\n\nexport const PortalBody: ({\n children,\n element,\n}: PortalBodyProps) => React.ReactPortal = ({\n children,\n element,\n}: PortalBodyProps) => {\n const container =\n element || typeof window !== 'undefined' ? document.body : undefined;\n\n if (!container) return (<>{children}</>) as any;\n\n return ReactDOM.createPortal(children, element || document.body);\n};\n","import type React from 'react';\n\nimport { createSlotComponent } from './createSlotComponent';\n\nexport const Text = createSlotComponent('span');\n\nexport type TextProps = React.ComponentPropsWithRef<typeof Text>;\n","/** @see https://github.com/radix-ui/primitives/blob/b324ec2d7ddf13a2a115cb5b11478e24d2f45b87/packages/core/primitive/src/primitive.tsx#L1 */\nexport const composeEventHandlers =\n <E>(\n originalEventHandler?: (event: E) => void,\n ourEventHandler?: (event: E) => void,\n { checkForDefaultPrevented = true } = {}\n ) =>\n (event: E) => {\n originalEventHandler?.(event);\n\n if (\n checkForDefaultPrevented === false ||\n !(event as unknown as Event).defaultPrevented\n ) {\n return ourEventHandler?.(event);\n }\n };\n","/* eslint-disable react/display-name */\n\nimport React from 'react';\n\nimport { isDefined } from '@udecode/utils';\nimport { clsx } from 'clsx';\n\nimport { createSlotComponent } from './createSlotComponent';\nimport { useComposedRef } from './useComposedRef';\n\n/**\n * Primitive component factory. It uses hooks for managing state and props, and\n * forwards references to child components. Component props:\n *\n * - `asChild`: If true, the component will be rendered as a `Slot`\n * {@link https://www.radix-ui.com/docs/primitives/utilities/slot}.\n * - `options`: Options passed to the state hook.\n * - `state`: Provide your state instead of using the state hook.\n * - `className`: Class name to be merged to the component.\n * - `style`: Style object to be merged to the component.\n * - `setProps`: Function to set props from the props hook.\n * - `...props`: Props to be passed to the component. Props hook return value:\n * - `ref`: Reference to be forwarded to the component.\n * - `props`: Props to be passed to the component.\n * - `hidden`: If true, the component will not be rendered.\n *\n * @example\n * const MyButton = createPrimitiveComponent(Button)({\n * stateHook: useButtonState,\n * propsHook: useButton,\n * });\n *\n * @param {React.ElementType} element The base component or native HTML element.\n * @returns {function} A primitive component.\n */\nexport const createPrimitiveComponent = <\n T extends React.ElementType,\n P extends React.ComponentPropsWithoutRef<T>,\n>(\n element: T\n) => {\n const Comp = createSlotComponent<T, P>(element);\n\n return <SH extends (options: any) => any, PH extends (state: any) => any>({\n propsHook,\n stateHook,\n }: {\n propsHook?: PH;\n stateHook?: SH;\n } = {}) => {\n return React.forwardRef<\n any,\n {\n as?: React.ElementType;\n asChild?: boolean;\n className?: string;\n options?: Parameters<SH>[0];\n setProps?: (hookProps: NonNullable<ReturnType<PH>['props']>) => P;\n state?: Parameters<PH>[0];\n style?: React.CSSProperties;\n } & P\n >(\n (\n {\n asChild,\n className: classNameProp,\n getClassName,\n options,\n state: stateProp,\n ...props\n },\n ref\n ) => {\n const state = isDefined(stateProp)\n ? stateProp\n : stateHook\n ? stateHook(options as any)\n : undefined;\n const {\n hidden,\n props: hookProps,\n ref: hookRef,\n } = propsHook\n ? propsHook(state)\n : { hidden: false, props: {}, ref: null };\n\n const _ref = useComposedRef(ref, hookRef);\n const className =\n isDefined(hookProps?.className) || isDefined(classNameProp)\n ? clsx(hookProps?.className, classNameProp)\n : undefined;\n const style =\n hookProps?.style || props.style\n ? { ...hookProps?.style, ...props.style }\n : undefined;\n\n if (!asChild && hidden) return null;\n\n return (\n <Comp\n ref={_ref}\n asChild={asChild}\n {...hookProps}\n className={className}\n style={style}\n {...props}\n {...(props.setProps?.(hookProps ?? {}) ?? {})}\n />\n );\n }\n );\n };\n};\n","import React from 'react';\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value This utility takes care of different types\n * of refs: callback refs and React.RefObject(s)\n */\nconst setRef = <T>(ref: PossibleRef<T>, value: T) => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref !== null && ref !== undefined) {\n (ref as React.MutableRefObject<T>).current = value;\n }\n};\n\n/**\n * A utility to compose multiple refs together Accepts callback refs and\n * React.RefObject(s)\n */\nexport const composeRefs =\n <T>(...refs: PossibleRef<T>[]) =>\n (node: T) =>\n refs.forEach((ref) => setRef(ref, node));\n\n/**\n * A custom hook that composes multiple refs Accepts callback refs and\n * React.RefObject(s)\n */\nexport const useComposedRef = <T>(...refs: PossibleRef<T>[]) => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useCallback(composeRefs(...refs), refs);\n};\n","import React from 'react';\n\nexport function createPrimitiveElement<T extends keyof HTMLElementTagNameMap>(\n tag: T\n) {\n return React.forwardRef<HTMLElementTagNameMap[T], JSX.IntrinsicElements[T]>(\n function CreateComponent(props, ref) {\n return React.createElement(tag, { ...props, ref });\n }\n );\n}\n","import React from 'react';\n\nexport function useEffectOnce(\n effect: React.EffectCallback,\n deps: React.DependencyList\n) {\n const initialized = React.useRef(false);\n const prevDepsRef = React.useRef(deps);\n\n React.useEffect(() => {\n const depsChanged = deps.some((dep, i) => dep !== prevDepsRef.current[i]);\n\n if (!initialized.current || depsChanged) {\n initialized.current = true;\n prevDepsRef.current = deps;\n effect();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n}\n","import React from 'react';\n\nexport const CAN_USE_DOM =\n typeof window !== 'undefined' && window.document?.createElement !== undefined;\n\n/**\n * Prevent warning on SSR by falling back to React.useEffect when DOM isn't\n * available\n */\nexport const useIsomorphicLayoutEffect = CAN_USE_DOM\n ? React.useLayoutEffect\n : React.useEffect;\n","import React from 'react';\n\nexport function useMemoOnce<T>(\n factory: () => T,\n deps: React.DependencyList\n): T {\n const initialized = React.useRef(false);\n const prevDepsRef = React.useRef(deps);\n const memoizedValueRef = React.useRef<T>();\n\n if (\n !initialized.current ||\n deps.some((dep, i) => dep !== prevDepsRef.current[i])\n ) {\n initialized.current = true;\n prevDepsRef.current = deps;\n memoizedValueRef.current = factory();\n }\n\n return memoizedValueRef.current!;\n}\n","import React from 'react';\n\nconst canUsePassiveEvents = (): boolean => {\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function'\n )\n return false;\n\n let passive = false;\n const options = Object.defineProperty({}, 'passive', {\n // eslint-disable-next-line getter-return\n get() {\n passive = true;\n },\n });\n const noop = () => null;\n\n window.addEventListener('test', noop, options);\n window.removeEventListener('test', noop, options);\n\n return passive;\n};\n\nexport const DEFAULT_IGNORE_CLASS = 'ignore-onclickoutside';\n\nexport type UseOnClickOutsideCallback<T extends Event = Event> = (\n event: T\n) => void;\n\ntype El = HTMLElement;\ntype Refs = React.RefObject<El>[];\n\nexport interface UseOnClickOutsideOptions {\n detectIFrame?: boolean;\n disabled?: boolean;\n eventTypes?: string[];\n excludeScrollbar?: boolean;\n ignoreClass?: string[] | string;\n refs?: Refs;\n}\n\nexport type UseOnClickOutsideReturn = (element: El | null) => void;\n\nconst checkClass = (el: HTMLElement, cl: string): boolean =>\n el.classList?.contains(cl);\n\nconst hasIgnoreClass = (e: any, ignoreClass: string[] | string): boolean => {\n let el = e.target || e;\n\n while (el) {\n if (Array.isArray(ignoreClass)) {\n // eslint-disable-next-line no-loop-func\n if (ignoreClass.some((c) => checkClass(el, c))) return true;\n } else if (checkClass(el, ignoreClass)) {\n return true;\n }\n\n el = el.parentElement;\n }\n\n return false;\n};\n\nconst clickedOnScrollbar = (e: MouseEvent): boolean =>\n document.documentElement.clientWidth <= e.clientX ||\n document.documentElement.clientHeight <= e.clientY;\n\nconst getEventOptions = (type: string): { passive: boolean } | boolean =>\n type.includes('touch') && canUsePassiveEvents() ? { passive: true } : false;\n\nexport const useOnClickOutside = (\n callback: UseOnClickOutsideCallback,\n {\n detectIFrame = true,\n disabled,\n eventTypes = ['mousedown', 'touchstart'],\n excludeScrollbar,\n ignoreClass = DEFAULT_IGNORE_CLASS,\n refs: refsOpt,\n }: UseOnClickOutsideOptions = {}\n): UseOnClickOutsideReturn => {\n const [refsState, setRefsState] = React.useState<Refs>([]);\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n\n const ref: UseOnClickOutsideReturn = React.useCallback(\n (el) => setRefsState((prevState) => [...prevState, { current: el }]),\n []\n );\n\n React.useEffect(\n () => {\n if (!refsOpt?.length && refsState.length === 0) return;\n\n const getEls = () => {\n const els: El[] = [];\n (refsOpt || refsState).forEach(\n ({ current }) => current && els.push(current)\n );\n\n return els;\n };\n\n const handler = (e: any) => {\n if (\n !hasIgnoreClass(e, ignoreClass) &&\n !(excludeScrollbar && clickedOnScrollbar(e)) &&\n getEls().every((el) => !el.contains(e.target))\n )\n callbackRef.current(e);\n };\n\n const blurHandler = (e: FocusEvent) =>\n // On firefox the iframe becomes document.activeElement in the next event loop\n setTimeout(() => {\n const { activeElement } = document;\n\n if (\n activeElement?.tagName === 'IFRAME' &&\n !hasIgnoreClass(activeElement, ignoreClass) &&\n !getEls().includes(activeElement as HTMLIFrameElement)\n )\n callbackRef.current(e);\n }, 0);\n\n const removeEventListener = () => {\n eventTypes.forEach((type) =>\n document.removeEventListener(\n type,\n handler,\n getEventOptions(type) as any\n )\n );\n\n if (detectIFrame) window.removeEventListener('blur', blurHandler);\n };\n\n if (disabled) {\n removeEventListener();\n\n return;\n }\n\n eventTypes.forEach((type) =>\n document.addEventListener(type, handler, getEventOptions(type))\n );\n\n if (detectIFrame) window.addEventListener('blur', blurHandler);\n\n // eslint-disable-next-line consistent-return\n return () => removeEventListener();\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n refsState,\n ignoreClass,\n excludeScrollbar,\n disabled,\n detectIFrame,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(eventTypes),\n ]\n );\n\n return ref;\n};\n","import React from 'react';\n\nexport const useStableMemo = <T>(\n producer: () => T,\n deps?: React.DependencyList\n): T => {\n const [value, setValue] = React.useState(producer);\n\n React.useLayoutEffect(() => {\n setValue(producer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n\n return value;\n};\n","import React from 'react';\n\n/**\n * Wrap a component into multiple providers. If there are any props that you\n * want a provider to receive, you can simply pass an array.\n */\nexport const withProviders =\n (...providers: any[]) =>\n <T,>(WrappedComponent: React.FC<T>) =>\n (props: T) =>\n providers.reduceRight(\n (acc, prov) => {\n let Provider = prov;\n\n if (Array.isArray(prov)) {\n [Provider] = prov;\n\n return <Provider {...prov[1]}>{acc}</Provider>;\n }\n\n return <Provider>{acc}</Provider>;\n },\n <WrappedComponent {...(props as any)} />\n );\n","import React from 'react';\n\ntype ElementType<P = any> =\n | {\n [K in keyof JSX.IntrinsicElements]: P extends JSX.IntrinsicElements[K]\n ? K\n : never;\n }[keyof JSX.IntrinsicElements]\n | React.ComponentType<P>;\n\ntype ForwardRefComponent<T, P = {}> = React.ForwardRefExoticComponent<\n React.PropsWithoutRef<P> & React.RefAttributes<T>\n>;\n\ntype InferElementRef<T> =\n T extends ElementType<any>\n ? T extends keyof JSX.IntrinsicElements\n ? JSX.IntrinsicElements[T] extends React.DetailedHTMLProps<\n React.HTMLAttributes<infer R>,\n any\n >\n ? R\n : never\n : T extends React.ComponentType<any>\n ? T extends React.ComponentClass<any>\n ? InstanceType<T>\n : T extends React.ForwardRefExoticComponent<any>\n ? React.ComponentPropsWithRef<T>['ref'] extends React.Ref<infer R>\n ? R\n : never\n : never\n : never\n : never;\n\n/**\n * Shorter alternative to `React.forwardRef`.\n *\n * @generic1 Component type or element type\n * @generic2 Extended prop types\n */\nexport function withRef<T extends ElementType, P = {}>(\n renderFunction: React.ForwardRefRenderFunction<\n InferElementRef<T>,\n React.ComponentPropsWithoutRef<T> & P\n >\n): ForwardRefComponent<\n InferElementRef<T>,\n React.ComponentPropsWithoutRef<T> & P\n> {\n return React.forwardRef(renderFunction as any) as any;\n}\n"],"mappings":"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","names":["_a","React","React","React","React","React","_a","_b","React","React","React","React","React","React","_a","React","React","React","React"]}
package/package.json CHANGED
@@ -1,23 +1,20 @@
1
1
  {
2
2
  "name": "@udecode/react-utils",
3
- "version": "38.0.1",
3
+ "version": "40.2.8",
4
4
  "description": "Udecode React utils",
5
- "license": "MIT",
5
+ "keywords": [
6
+ "utils"
7
+ ],
8
+ "bugs": {
9
+ "url": "https://github.com/udecode/plate/issues"
10
+ },
6
11
  "repository": {
7
12
  "type": "git",
8
13
  "url": "https://github.com/udecode/plate.git",
9
14
  "directory": "packages/react-utils"
10
15
  },
11
- "bugs": {
12
- "url": "https://github.com/udecode/plate/issues"
13
- },
16
+ "license": "MIT",
14
17
  "sideEffects": false,
15
- "main": "dist/index.js",
16
- "module": "dist/index.mjs",
17
- "types": "dist/index.d.ts",
18
- "files": [
19
- "dist/**/*"
20
- ],
21
18
  "exports": {
22
19
  ".": {
23
20
  "types": "./dist/index.d.ts",
@@ -26,10 +23,16 @@
26
23
  "require": "./dist/index.js"
27
24
  }
28
25
  },
26
+ "main": "dist/index.js",
27
+ "module": "dist/index.mjs",
28
+ "types": "dist/index.d.ts",
29
+ "files": [
30
+ "dist/**/*"
31
+ ],
29
32
  "scripts": {
33
+ "brl": "yarn p:brl",
30
34
  "build": "yarn p:build",
31
35
  "build:watch": "yarn p:build:watch",
32
- "brl": "yarn p:brl",
33
36
  "clean": "yarn p:clean",
34
37
  "lint": "yarn p:lint",
35
38
  "lint:fix": "yarn p:lint:fix",
@@ -46,9 +49,6 @@
46
49
  "react": ">=16.8.0",
47
50
  "react-dom": ">=16.8.0"
48
51
  },
49
- "keywords": [
50
- "utils"
51
- ],
52
52
  "publishConfig": {
53
53
  "access": "public"
54
54
  }