docs: def _params(sig):
          """Read params, values and annotations from the signature"""
          params = []
          for p in sig.parameters:
              param = sig.parameters[p]
              optional = param.default != inspect.Signature.empty
              default = UIBuilder._safe_default(param.default) if param.default != inspect.Signature.empty else ''
              annotation = param.annotation if param.annotation != inspect.Signature.empty else ''
              type = UIBuilder._guess_type(default)
  
              # Create the parameter attribute dict
              p_attr = {
                  "name": param.name,
                  "label": param.name,
                  "optional": optional,
                  "default": default,
                  "description": annotation,
                  "hide": False,
                  "type": type,
                  "kinds": None,
                  "choices": [],
                  "id": None,
                  "events": None
              }
  
              # Special choices handling for boolean parameters
              if isinstance(default, bool):
                  p_attr['choices'] = {
                      'True': 'true',
                      'False': 'false'
                  }
  
              # Append it to the list
              params.append(p_attr)
          return params