class_docstr: Base class for dash independent blocks, then composed into sections and the dashboard.
class_docstr_tok: ["Base","class","for","dash","independent","blocks",",","then","composed","into","sections","and","the","dashboard","."]
code: def layout(self) -> Component:
      card_body = [html.A(className="anchor-pos", id=self.block_id)]
      if self.title is not None or self.controls is not None:
          row = []
          if self.title:
              row.append(dbc.Col(html.H4(self.title)))
          if self.controls is not None:
              row.append(
                  dbc.Col(
                      html.Div(self.controls, className="float-right")
                  )
              )
          card_body.append(dbc.Row(row))
      card_body.append(dbc.Row(dbc.Col(self.body)))
  
      return dbc.Card(dbc.CardBody(card_body), style=self.style)
  
imports: from abc import abstractmethod, ABC
  from typing import Optional, Tuple, Callable, List, Any, Dict, Type
  import pandas
  from tslumen.jinja_utils import create_jinja_env
  from tslumen.profile import BundledResult
  from tslumen.report.dashboard._dash import Component, Input, Output, State, JupyterDash, html, dbc
label_desc: Use image node_id 6 for calling the DashBlock obj's underlying member method code with example usage: obj.layout() and returns: dbc