import React, { CSSProperties } from 'react'; import { useNode, UserComponent } from '@craftjs/core'; import { cssPropsToString } from '../../utils/style-helpers'; interface DividerProps { color?: string; thickness?: string; style?: CSSProperties; } export const Divider: UserComponent = ({ color = '#e4e4e7', thickness = '1px', style = {}, }) => { const { connectors: { connect, drag }, selected, } = useNode((node) => ({ selected: node.events.selected, })); return (
{ if (ref) connect(drag(ref)); }} style={{ border: 'none', borderTop: `${thickness} solid ${color}`, margin: '16px 0', outline: selected ? '2px solid #3b82f6' : 'none', ...style, }} /> ); }; /* ---------- Settings panel ---------- */ const DividerSettings: React.FC = () => { const { actions: { setProp }, props } = useNode((node) => ({ props: node.data.props as DividerProps, })); const colorPresets = ['#e4e4e7', '#d4d4d8', '#a1a1aa', '#3f3f46', '#18181b', '#3b82f6', '#ef4444', '#10b981']; const thicknessPresets = ['1px', '2px', '3px', '4px', '6px']; return (
{colorPresets.map((c) => (
{thicknessPresets.map((t) => ( ))}
); }; /* ---------- Craft config ---------- */ Divider.craft = { displayName: 'Divider', props: { color: '#e4e4e7', thickness: '1px', style: {}, }, rules: { canDrag: () => true, canMoveIn: () => false, canMoveOut: () => true, }, related: { settings: DividerSettings, }, }; /* ---------- HTML export ---------- */ (Divider as any).toHtml = (props: DividerProps, _childrenHtml: string) => { const styleStr = cssPropsToString({ border: 'none', borderTop: `${props.thickness || '1px'} solid ${props.color || '#e4e4e7'}`, margin: '16px 0', ...props.style, }); return { html: `` }; };