import { CSSProperties, ElementType, forwardRef, FunctionComponent, HTMLProps, ReactNode, Ref } from "react"; import { jsx } from "react/jsx-runtime"; import { SizeUnit } from "../types"; export type BoxCSSPropertiesBehvaior = { default: T; onHover?: T; onFocus?: T; onFocusVisible?: T; onActive?: T; } export type BoxCSSProperties = { [P in keyof T]?: T[P]; // | BoxCSSPropertiesBehvaior; } export interface BoxProperties extends BoxCSSProperties { id?: string; className?: string; innerHTML?: string; children?: ReactNode; tagName?: ElementType; size?: SizeUnit; ref?: Ref; onClick?: React.MouseEventHandler; onClickCapture?: React.MouseEventHandler; onDoubleClick?: React.MouseEventHandler; onDoubleClickCapture?: React.MouseEventHandler; onFocus?: React.FocusEventHandler onFocusCapture?: React.FocusEventHandler onChange?: React.FormEventHandler; onChangeCapture?: React.FormEventHandler; onRateChange?: React.ReactEventHandler onRateChangeCapture?: React.ReactEventHandler onVolumeChange?: React.ReactEventHandler onVolumeChangeCapture?: React.ReactEventHandler [key: string]: any; } export const Box = forwardRef((p, ref) => { const style = {...p}; const props: HTMLProps = { id: p.id, className: p.className, children: p.children, ref: ref, // About HTML syntax string for child element. dangerouslySetInnerHTML: p.innerHTML ? {__html: p.innerHTML} : undefined, // About event handler for HTML element. onClick: p.onClick, onClickCapture: p.onClickCapture, onDoubleClick: p.onDoubleClick, onDoubleClickCapture: p.onDoubleClickCapture, onFocus: p.onFocus, onFocusCapture: p.onFocusCapture, onChange: p.onChange, onChangeCapture: p.onChangeCapture, onRateChange: p.onRateChange, onRateChangeCapture: p.onRateChangeCapture, onVolumeChange: p.onVolumeChange, onVolumeChangeCapture: p.onVolumeChangeCapture }; if (p.size) { console.assert(p.width == null, "The width cannot be defined when defining the size."); console.assert(p.height == null, "The height cannot be defined when defining the size."); style.width = p.size; style.height = p.size; } return jsx(p.tagName ?? "div", {...props, style: style}); }) as FunctionComponent;