@diskette/use-render 0.10.0 → 0.11.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.
@@ -1,13 +1,11 @@
1
- import type { CSSProperties, ElementType, HTMLAttributes, JSX, ReactNode } from 'react';
1
+ import type { ComponentProps, ComponentPropsWithRef, ElementType, JSX, ReactNode } from 'react';
2
2
  import type { DataAttributes } from '../types.ts';
3
- export type SlotRenderer = (props: HTMLAttributes<any>) => ReactNode;
4
- export type SlotProps<T extends ElementType> = Omit<React.ComponentProps<T>, 'className' | 'style' | 'ref'> & {
5
- className?: string | undefined;
6
- style?: CSSProperties | undefined;
7
- render?: SlotRenderer | JSX.Element;
3
+ export type SlotRenderer<T extends ElementType> = (props: ComponentPropsWithRef<T>) => ReactNode;
4
+ export type SlotProps<T extends ElementType> = ComponentPropsWithRef<T> & {
5
+ render?: SlotRenderer<T> | JSX.Element;
8
6
  };
9
7
  export interface RenderSlotOptions<T extends ElementType> {
10
- baseProps?: Omit<React.ComponentProps<T>, 'ref'> & DataAttributes;
8
+ baseProps?: ComponentProps<T> & DataAttributes;
11
9
  props?: SlotProps<T> & DataAttributes;
12
10
  }
13
11
  /**
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export { useRender } from './use-render.ts';
2
2
  export { useRenderContainer } from './use-render-container.ts';
3
3
  export { useRenderSlot } from './use-render-slot.ts';
4
4
  export type { UseRenderOptions } from './use-render.ts';
5
- export type { SlotProps, SlotRenderer, UseRenderSlotOptions, } from './use-render-slot.ts';
5
+ export type { UseRenderSlotOptions } from './use-render-slot.ts';
6
+ export type { SlotProps, SlotRenderer } from './fns/render-slot.ts';
6
7
  export type { ContainerBaseProps, ContainerProps, UseRenderContainerOptions, UseRenderContainerResult, } from './use-render-container.ts';
7
8
  export type { BaseComponentProps, ClassName, ComponentProps, ComponentRenderer, DataAttributes, Style, } from './types.ts';
@@ -1,16 +1,7 @@
1
- import type { ComponentPropsWithRef, CSSProperties, ElementType, HTMLAttributes, JSX, ReactNode, Ref } from 'react';
2
- import type { DataAttributes } from './types.ts';
3
- export type SlotRenderer = (props: HTMLAttributes<any> & {
4
- ref?: Ref<any> | undefined;
5
- }) => ReactNode;
6
- export type SlotProps<T extends ElementType> = Omit<ComponentPropsWithRef<T>, 'className' | 'style'> & {
7
- className?: string | undefined;
8
- style?: CSSProperties | undefined;
9
- render?: SlotRenderer | JSX.Element;
10
- };
11
- export interface UseRenderSlotOptions<T extends ElementType> {
12
- baseProps?: React.ComponentProps<T> & DataAttributes;
13
- props?: SlotProps<T> & DataAttributes;
1
+ import type { ElementType, ReactNode, Ref } from 'react';
2
+ import type { RenderSlotOptions } from './fns/render-slot.ts';
3
+ export type { SlotProps, SlotRenderer } from './fns/render-slot.ts';
4
+ export interface UseRenderSlotOptions<T extends ElementType> extends RenderSlotOptions<T> {
14
5
  ref?: Ref<any> | (Ref<any> | undefined)[];
15
6
  }
16
7
  /**
@@ -1,6 +1,5 @@
1
- import { cloneElement, createElement, isValidElement } from 'react';
1
+ import { renderSlot } from "./fns/render-slot.js";
2
2
  import { useComposedRef } from "./use-composed-ref.js";
3
- import { cx, isFunction, isString, mergeProps } from "./utils.js";
4
3
  /**
5
4
  * Hook for rendering slot elements with render prop support and prop merging.
6
5
  * A simpler version of useRender for stateless components.
@@ -25,31 +24,13 @@ import { cx, isFunction, isString, mergeProps } from "./utils.js";
25
24
  * ```
26
25
  */
27
26
  export function useRenderSlot(tag, options = {}) {
28
- const baseProps = options.baseProps ?? {};
29
- const props = (options.props ?? {});
30
- const { className: baseClassName, style: baseStyle, children: baseChildren, ...base } = baseProps;
31
- const { className, style, children, ref, render, ...rest } = props;
32
- const resolvedClassName = cx(baseClassName, className);
33
- const resolvedStyle = baseStyle || style ? { ...baseStyle, ...style } : undefined;
34
- const mergedRef = useComposedRef(ref, options.ref);
35
- const resolvedProps = {
36
- ...mergeProps(base, rest),
37
- ref: mergedRef,
38
- };
39
- if (isString(resolvedClassName)) {
40
- resolvedProps.className = resolvedClassName;
27
+ const mergedRef = useComposedRef(options.props?.ref, options.ref);
28
+ const renderOptions = {};
29
+ if (options.props) {
30
+ renderOptions.props = { ...options.props, ref: mergedRef };
41
31
  }
42
- if (typeof resolvedStyle === 'object') {
43
- resolvedProps.style = resolvedStyle;
32
+ if (options.baseProps) {
33
+ renderOptions.baseProps = options.baseProps;
44
34
  }
45
- const resolvedChildren = children ?? baseChildren;
46
- // For `<Component render={<a />} />`
47
- if (isValidElement(render)) {
48
- return cloneElement(render, resolvedProps, resolvedChildren);
49
- }
50
- // For `<Component render={(props) => <a {...props} />)} />`
51
- if (isFunction(render)) {
52
- return render({ ...resolvedProps, children: resolvedChildren });
53
- }
54
- return createElement(tag, resolvedProps, resolvedChildren);
35
+ return renderSlot(tag, renderOptions);
55
36
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@diskette/use-render",
3
3
  "type": "module",
4
- "version": "0.10.0",
4
+ "version": "0.11.0",
5
5
  "exports": {
6
6
  ".": "./dist/index.js",
7
7
  "./fns": "./dist/fns/index.js"