el function

VElement el(
  1. String tag, {
  2. Map<String, Object> attributes = const {},
  3. Map<String, void Function(Event event)> listeners = const {},
  4. Object? child,
  5. List<Object> children = const [],
  6. void onChange(
    1. Event event
    )?,
  7. void onClick(
    1. Event event
    )?,
  8. void onDblClick(
    1. Event event
    )?,
  9. void onKeyDown(
    1. Event event
    )?,
  10. void onKeyPress(
    1. Event event
    )?,
  11. void onKeyUp(
    1. Event event
    )?,
  12. void onMouseDown(
    1. Event event
    )?,
  13. void onMouseMove(
    1. Event event
    )?,
  14. void onMouseOut(
    1. Event event
    )?,
  15. void onMouseOver(
    1. Event event
    )?,
  16. void onMouseUp(
    1. Event event
    )?,
})

Implementation

VElement el(
  String tag, {
  Map<String, Object> attributes = const {},
  Map<String, void Function(Event event)> listeners = const {},
  Object? child,
  List<Object> children = const [],
  void Function(Event event)? onChange,
  void Function(Event event)? onClick,
  void Function(Event event)? onDblClick,
  void Function(Event event)? onKeyDown,
  void Function(Event event)? onKeyPress,
  void Function(Event event)? onKeyUp,
  void Function(Event event)? onMouseDown,
  void Function(Event event)? onMouseMove,
  void Function(Event event)? onMouseOut,
  void Function(Event event)? onMouseOver,
  void Function(Event event)? onMouseUp,
}) {
  if (children.isNotEmpty && child != null) {
    throw ArgumentError(
        "The arguments 'children' and 'child' cannot be used together");
  }

  final result = VElement(tag);
  if (attributes.isNotEmpty) {
    result.attributes.addAll(attributes);
  }

  if (children.isNotEmpty) {
    for (var i = 0; i < children.length; i++) {
      final child = children[i];
      final vNode = VNodeFactory.createVNode(child);
      final vEntry = VNodeEntry(vNode);
      result.children.add(vEntry);
    }
  } else if (child != null) {
    final vNode = VNodeFactory.createVNode(child);
    final vEntry = VNodeEntry(vNode);
    result.children.add(vEntry);
  }

  if (listeners.isNotEmpty) {
    result.listeners.addAll(listeners);
  }

  final listenerMap = {
    'change': onChange,
    'click': onClick,
    'dblclick': onDblClick,
    'keydown': onKeyDown,
    'keypress': onKeyPress,
    'keyup': onKeyUp,
    'mousedown': onMouseDown,
    'mousemove': onMouseMove,
    'mouseout': onMouseOut,
    'mouseover': onMouseOver,
    'mouseup': onMouseUp,
  };

  for (final key in listenerMap.keys) {
    final value = listenerMap[key];
    if (value != null) {
      if (result.listeners.containsKey(key)) {
        throw ArgumentError(
            "The listener for the '$key' event was specified twice");
      }

      result.listeners[key] = value;
    }
  }

  return result;
}