Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[useRenderer] Add public hook #1418

Open
wants to merge 31 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
3cfc3c5
[useRenderer] Add public hook
mnajdova Feb 5, 2025
9f32729
prettier
mnajdova Feb 5, 2025
1b705fa
update package.json exports
mnajdova Feb 5, 2025
5e4fbce
apply review changes
mnajdova Feb 6, 2025
b7c1d09
fix types
mnajdova Feb 6, 2025
8038e58
optional prop
mnajdova Feb 6, 2025
0051604
add tests
mnajdova Feb 6, 2025
29fd26a
add test, change API
mnajdova Feb 6, 2025
b87aadc
lint & fix example
mnajdova Feb 6, 2025
116a673
export more types, rename param
mnajdova Feb 7, 2025
d50077d
add docs page
mnajdova Feb 7, 2025
3c753fa
Aaron's review
mnajdova Feb 7, 2025
2baa3dd
prettier
mnajdova Feb 7, 2025
b94b8ce
Use render element instead of string as a default render value
mnajdova Feb 7, 2025
6a8d16f
move ref to props
mnajdova Feb 7, 2025
2a9621f
rename style hooks mapping
mnajdova Feb 7, 2025
c523e6f
fix type usage
mnajdova Feb 12, 2025
ec02061
add component & demo for comparison
mnajdova Feb 12, 2025
034b747
optional state
mnajdova Feb 12, 2025
f067410
remove test for now
mnajdova Feb 12, 2025
7dcdc5e
simplify demo
mnajdova Feb 12, 2025
15728ad
simlify hook demo
mnajdova Feb 12, 2025
56ff6fe
StateDataAttributes -> stateAttributesMap
mnajdova Feb 14, 2025
df8d773
improve state
mnajdova Feb 14, 2025
b813b3e
pointer cursor
mnajdova Feb 14, 2025
9515c77
Update packages/react/src/use-renderer/index.ts
mnajdova Feb 14, 2025
7103e08
improve docs page
mnajdova Feb 14, 2025
a113201
remove slot component
mnajdova Feb 14, 2025
be499fa
fix lint issue
mnajdova Feb 14, 2025
ed89bb1
remove non-sense styles
mnajdova Feb 14, 2025
a12e865
markdownlint
mnajdova Feb 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/react/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
"./tooltip": "./src/tooltip/index.ts",
"./unstable-no-ssr": "./src/unstable-no-ssr/index.ts",
"./unstable-use-media-query": "./src/unstable-use-media-query/index.ts",
"./use-renderer": "./src/use-renderer/index.ts",
"./utils": "./src/utils/index.ts"
},
"imports": {
Expand Down
1 change: 1 addition & 0 deletions packages/react/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,4 @@ export * from './tabs';
export * from './toggle';
export * from './toggle-group';
export * from './tooltip';
export * from './use-renderer';
1 change: 1 addition & 0 deletions packages/react/src/use-renderer/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { useRenderer } from './useRenderer';
49 changes: 49 additions & 0 deletions packages/react/src/use-renderer/useRenderer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import * as React from 'react';
import type { ComponentRenderFn } from '../utils/types';
mnajdova marked this conversation as resolved.
Show resolved Hide resolved
import { useComponentRenderer } from '../utils/useComponentRenderer';
import { defaultRenderFunctions } from '../utils/defaultRenderFunctions';

/**
* Returns a function that renders a Base UI component.
*/
export function useRenderer<State extends Record<string, any>, RenderedElementType extends Element>(
settings: useRenderer.Settings<State, RenderedElementType>,
) {
return useComponentRenderer(settings);
}

namespace useRenderer {
export interface Settings<State, RenderedElementType extends Element> {
/**
* The class name to apply to the rendered element.
* Can be a string or a function that accepts the state and returns a string.
*/
className?: string | ((state: State) => string);
/**
* The render prop or React element to override the default element.
*/
render:
| ComponentRenderFn<React.HTMLAttributes<any>, State>
| React.ReactElement<Record<string, unknown>>
| keyof typeof defaultRenderFunctions;
/**
* The state of the component. It will be used as a parameter for the render and className callbacks.
*/
state: State;
/**
* The ref to apply to the rendered element.
*/
ref?: React.Ref<RenderedElementType>;
/**
* A function that returns props for the rendered element.
* It should accept and merge additional props.
*/
propGetter?: (
mnajdova marked this conversation as resolved.
Show resolved Hide resolved
externalProps: Record<string, any>,
) => React.HTMLAttributes<any> & React.RefAttributes<RenderedElementType>;
/**
* Additional props to be spread on the rendered element.
*/
extraProps?: Record<string, any>;
mnajdova marked this conversation as resolved.
Show resolved Hide resolved
}
}