c64864b3b5
Accept className on action declarations and carry it through compiled actions, default toolbar controls, menu items, custom renderers, and custom controls. Keep preset action ordering consistent across toolbar and bubble placements, with coverage for default and custom rendering paths.
74 lines
1.8 KiB
TypeScript
74 lines
1.8 KiB
TypeScript
import { Button } from "@workspace/ui/components/button"
|
|
import {
|
|
Tooltip,
|
|
TooltipContent,
|
|
TooltipTrigger,
|
|
} from "@workspace/ui/components/tooltip"
|
|
import { useLexicalActionContext } from "./context"
|
|
import { useLexicalMessage } from "./i18n"
|
|
import type { LexicalControlProps } from "./types"
|
|
|
|
export function LexicalControl<Value = string>({
|
|
action,
|
|
className,
|
|
label,
|
|
presentation = "control",
|
|
render,
|
|
value,
|
|
}: LexicalControlProps<Value>) {
|
|
const context = useLexicalActionContext()
|
|
const active = action.isActive?.(context) ?? false
|
|
const disabled = action.isDisabled?.(context) ?? false
|
|
const resolvedLabel = useLexicalMessage(label ?? action.label)
|
|
const execute = (nextValue?: Value) =>
|
|
action.execute(context, nextValue ?? value)
|
|
const onClick = () => execute()
|
|
const renderProps = {
|
|
active,
|
|
className,
|
|
disabled,
|
|
execute,
|
|
label: resolvedLabel,
|
|
onClick,
|
|
}
|
|
|
|
if (render) return render(renderProps)
|
|
|
|
if (action.control) {
|
|
const ActionControl = action.control
|
|
return (
|
|
<ActionControl
|
|
{...renderProps}
|
|
action={action}
|
|
context={context}
|
|
presentation={presentation}
|
|
value={value}
|
|
/>
|
|
)
|
|
}
|
|
|
|
const Icon = action.icon
|
|
return (
|
|
<Tooltip>
|
|
<TooltipTrigger
|
|
render={
|
|
<Button
|
|
type="button"
|
|
size="icon-sm"
|
|
className={className}
|
|
variant={active ? "secondary" : "ghost"}
|
|
disabled={disabled}
|
|
aria-label={resolvedLabel}
|
|
aria-pressed={active}
|
|
onMouseDown={(event) => event.preventDefault()}
|
|
onClick={onClick}
|
|
/>
|
|
}
|
|
>
|
|
{Icon ? <Icon /> : null}
|
|
</TooltipTrigger>
|
|
<TooltipContent showArrow>{resolvedLabel}</TooltipContent>
|
|
</Tooltip>
|
|
)
|
|
}
|