Quite easy to add a new field type that can be selected and used by authors and on node types. It's also a React.Component that is registered to the Field Types.
class SingleLineText extends React.Component { constructor(props) { super(props); this.state = { value: props.value, field: props.field }; this.value = ''; } onChange = (value) => { this.setState({value: value}); } componentDidUpdate(prevProps) { if (prevProps.value !== this.props.value) { this.setState({value: this.props.value}) } } render() { let value = this.state.field.value; if(this.state.value !== null) { value = this.state.value; } if(value === null || typeof value === 'undefined') { value = ''; } return ( <input type="text" disabled={this.props.isDisabled} value={value} onChange={e => this.onChange(e.target.value)} onBlur={e => this.props.onChange(e.target.value)} className="block w-full px-3 py-2 bg-tealGreen-800 bg-opacity-35 border border-transparent rounded-md text-sm placeholder-slate-400 focus:outline-none focus:border-tealGreen-500 focus:ring-1 focus:border-tealGreen-500 disabled:opacity-50 invalid:border-pink-500 invalid:text-pink-600 focus:invalid:border-pink-500 focus:invalid:ring-pink-500"/> ) } static renderTeaser() { let arrowIcon = (<svg viewBox="0 0 12 24" className={"w-4 h-4 mr-2 text-slate-400 overflow-visible group-hover:text-slate-600 dark:text-slate-600 dark:group-hover:text-slate-500"}> <path d="M0 0L12 12L0 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"></path> </svg>); return( <div> <div className={"flex"}> {arrowIcon} <span className={"font-medium dark:text-slate-400 text-sm block mb-1"}>Single Line Text</span> </div> </div> ); } } window.fieldTypes['SingleLineText'] = { field: SingleLineText, title: 'Single Line Text', settings: [ 'Required', 'DefaultValue', 'LanguageFallback' ] }
This example shows the implementation of the Single Line Text field type.
Important notes:
Fields can be assigned with settings: