mirror of
https://github.com/facebook/docusaurus.git
synced 2025-07-19 01:28:38 +02:00
feat(theme-common): JSDoc for all APIs (#6974)
* feat(theme-common): JSDoc for all APIs * fix tests
This commit is contained in:
parent
4103fef11e
commit
b456a64f61
48 changed files with 871 additions and 679 deletions
|
@ -20,20 +20,19 @@ import React, {
|
|||
|
||||
const DefaultAnimationEasing = 'ease-in-out';
|
||||
|
||||
export type UseCollapsibleConfig = {
|
||||
/**
|
||||
* This hook is a very thin wrapper around a `useState`.
|
||||
*/
|
||||
export function useCollapsible({
|
||||
initialState,
|
||||
}: {
|
||||
/** The initial state. Will be non-collapsed by default. */
|
||||
initialState: boolean | (() => boolean);
|
||||
};
|
||||
|
||||
export type UseCollapsibleReturns = {
|
||||
}): {
|
||||
collapsed: boolean;
|
||||
setCollapsed: Dispatch<SetStateAction<boolean>>;
|
||||
toggleCollapsed: () => void;
|
||||
};
|
||||
|
||||
// This hook just define the state
|
||||
export function useCollapsible({
|
||||
initialState,
|
||||
}: UseCollapsibleConfig): UseCollapsibleReturns {
|
||||
} {
|
||||
const [collapsed, setCollapsed] = useState(initialState ?? false);
|
||||
|
||||
const toggleCollapsed = useCallback(() => {
|
||||
|
@ -152,8 +151,10 @@ type CollapsibleElementType = React.ElementType<
|
|||
Pick<React.HTMLAttributes<unknown>, 'className' | 'onTransitionEnd' | 'style'>
|
||||
>;
|
||||
|
||||
// Prevent hydration layout shift before animations are handled imperatively
|
||||
// with JS
|
||||
/**
|
||||
* Prevent hydration layout shift before animations are handled imperatively
|
||||
* with JS
|
||||
*/
|
||||
function getSSRStyle(collapsed: boolean) {
|
||||
if (ExecutionEnvironment.canUseDOM) {
|
||||
return undefined;
|
||||
|
@ -162,16 +163,27 @@ function getSSRStyle(collapsed: boolean) {
|
|||
}
|
||||
|
||||
type CollapsibleBaseProps = {
|
||||
/** The actual DOM element to be used in the markup. */
|
||||
as?: CollapsibleElementType;
|
||||
/** Initial collapsed state. */
|
||||
collapsed: boolean;
|
||||
children: ReactNode;
|
||||
/** Configuration of animation, like `duration` and `easing` */
|
||||
animation?: CollapsibleAnimationConfig;
|
||||
/**
|
||||
* A callback fired when the collapse transition animation ends. Receives
|
||||
* the **new** collapsed state: e.g. when
|
||||
* expanding, `collapsed` will be `false`. You can use this for some "cleanup"
|
||||
* like applying new styles when the container is fully expanded.
|
||||
*/
|
||||
onCollapseTransitionEnd?: (collapsed: boolean) => void;
|
||||
/** Class name for the underlying DOM element. */
|
||||
className?: string;
|
||||
|
||||
// This is mostly useful for details/summary component where ssrStyle is not
|
||||
// needed (as details are hidden natively) and can mess up with the default
|
||||
// native behavior of the browser when JS fails to load or is disabled
|
||||
/**
|
||||
* This is mostly useful for details/summary component where ssrStyle is not
|
||||
* needed (as details are hidden natively) and can mess up with the browser's
|
||||
* native behavior when JS fails to load or is disabled
|
||||
*/
|
||||
disableSSRStyle?: boolean;
|
||||
};
|
||||
|
||||
|
@ -233,14 +245,20 @@ function CollapsibleLazy({collapsed, ...props}: CollapsibleBaseProps) {
|
|||
}
|
||||
|
||||
type CollapsibleProps = CollapsibleBaseProps & {
|
||||
// Lazy allows to delay the rendering when collapsed => it will render
|
||||
// children only after hydration, on first expansion
|
||||
// Required prop: it forces to think if content should be server-rendered
|
||||
// or not! This has perf impact on the SSR output and html file sizes
|
||||
// See https://github.com/facebook/docusaurus/issues/4753
|
||||
/**
|
||||
* Delay rendering of the content till first expansion. Marked as required to
|
||||
* force us to think if content should be server-rendered or not. This has
|
||||
* perf impact since it reduces html file sizes, but could undermine SEO.
|
||||
* @see https://github.com/facebook/docusaurus/issues/4753
|
||||
*/
|
||||
lazy: boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
* A headless component providing smooth and uniform collapsing behavior. The
|
||||
* component will be invisible (zero height) when collapsed. Doesn't provide
|
||||
* interactivity by itself: collapse state is toggled through props.
|
||||
*/
|
||||
export function Collapsible({lazy, ...props}: CollapsibleProps): JSX.Element {
|
||||
const Comp = lazy ? CollapsibleLazy : CollapsibleBase;
|
||||
return <Comp {...props} />;
|
||||
|
|
|
@ -31,9 +31,14 @@ function hasParent(node: HTMLElement | null, parent: HTMLElement): boolean {
|
|||
}
|
||||
|
||||
export type DetailsProps = {
|
||||
/** Summary is provided as props, including the wrapping `<summary>` tag */
|
||||
summary?: ReactElement;
|
||||
} & ComponentProps<'details'>;
|
||||
|
||||
/**
|
||||
* A mostly un-styled `<details>` element with smooth collapsing. Provides some
|
||||
* very lightweight styles, but you should bring your UI.
|
||||
*/
|
||||
export function Details({
|
||||
summary,
|
||||
children,
|
||||
|
@ -45,8 +50,8 @@ export function Details({
|
|||
const {collapsed, setCollapsed} = useCollapsible({
|
||||
initialState: !props.open,
|
||||
});
|
||||
// Use a separate prop because it must be set only after animation completes
|
||||
// Otherwise close anim won't work
|
||||
// Use a separate state for the actual details prop, because it must be set
|
||||
// only after animation completes, otherwise close animations won't work
|
||||
const [open, setOpen] = useState(props.open);
|
||||
|
||||
return (
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue