old_contents: """Button class.
  
  Represents a button in the frontend using a widget.  Allows user to listen for
  click events on the button and trigger backend code when the clicks are fired.
  """
  
  # Copyright (c) Jupyter Development Team.
  # Distributed under the terms of the Modified BSD License.
  
  from .domwidget import DOMWidget
  from .widget import CallbackDispatcher, register
  from traitlets import Unicode, Bool, CaselessStrEnum
  
  
  @register('Jupyter.Button')
  class Button(DOMWidget):
      """Button widget.
  
      This widget has an `on_click` method that allows you to listen for the
      user clicking on the button.  The click event itself is stateless.
  
      Parameters
      ----------
      description: str
         description displayed next to the button
      tooltip: str
         tooltip caption of the toggle button
      icon: str
         font-awesome icon name
      """
      _model_module = Unicode('jupyter-js-widgets').tag(sync=True)
      _view_module = Unicode('jupyter-js-widgets').tag(sync=True)
      _view_name = Unicode('ButtonView').tag(sync=True)
      _model_name = Unicode('ButtonModel').tag(sync=True)
  
      description = Unicode('', help="Button label.").tag(sync=True)
      tooltip = Unicode(help="Tooltip caption of the button.").tag(sync=True)
      disabled = Bool(False, help="Enable or disable user changes.").tag(sync=True)
      icon = Unicode('', help="Font-awesome icon.").tag(sync=True)
  
      button_style = CaselessStrEnum(
          values=['primary', 'success', 'info', 'warning', 'danger', ''], default_value='',
          help="""Use a predefined styling for the button.""").tag(sync=True)
  
      def __init__(self, **kwargs):
          super(Button, self).__init__(**kwargs)
          self._click_handlers = CallbackDispatcher()
          self.on_msg(self._handle_button_msg)
  
      def on_click(self, callback, remove=False):
          """Register a callback to execute when the button is clicked.
  
          The callback will be called with one argument, the clicked button
          widget instance.
  
          Parameters
          ----------
          remove: bool (optional)
              Set to true to remove the callback from the list of callbacks.
          """
          self._click_handlers.register_callback(callback, remove=remove)
  
      def _handle_button_msg(self, _, content, buffers):
          """Handle a msg from the front-end.
  
          Parameters
          ----------
          content: dict
              Content of the msg.
          """
          if content.get('event', '') == 'click':
              self._click_handlers(self)
  
new_contents: """Button class.
  
  Represents a button in the frontend using a widget.  Allows user to listen for
  click events on the button and trigger backend code when the clicks are fired.
  """
  
  # Copyright (c) Jupyter Development Team.
  # Distributed under the terms of the Modified BSD License.
  
  from .domwidget import DOMWidget
  from .widget import CallbackDispatcher, register
  from traitlets import Unicode, Bool, CaselessStrEnum, validate
  import warnings
  
  @register('Jupyter.Button')
  class Button(DOMWidget):
      """Button widget.
  
      This widget has an `on_click` method that allows you to listen for the
      user clicking on the button.  The click event itself is stateless.
  
      Parameters
      ----------
      description: str
         description displayed next to the button
      tooltip: str
         tooltip caption of the toggle button
      icon: str
         font-awesome icon name
      """
      _model_module = Unicode('jupyter-js-widgets').tag(sync=True)
      _view_module = Unicode('jupyter-js-widgets').tag(sync=True)
      _view_name = Unicode('ButtonView').tag(sync=True)
      _model_name = Unicode('ButtonModel').tag(sync=True)
  
      description = Unicode('', help="Button label.").tag(sync=True)
      tooltip = Unicode(help="Tooltip caption of the button.").tag(sync=True)
      disabled = Bool(False, help="Enable or disable user changes.").tag(sync=True)
      icon = Unicode('', help="Font-awesome icon name, without the 'fa-' prefix.").tag(sync=True)
  
      button_style = CaselessStrEnum(
          values=['primary', 'success', 'info', 'warning', 'danger', ''], default_value='',
          help="""Use a predefined styling for the button.""").tag(sync=True)
  
      def __init__(self, **kwargs):
          super(Button, self).__init__(**kwargs)
          self._click_handlers = CallbackDispatcher()
          self.on_msg(self._handle_button_msg)
  
      @validate('icon')
      def _validate_icon(self, proposal):
          """Strip 'fa-' if necessary'"""
          value = proposal['value']
          if value.startswith('fa-'):
              warnings.warn("icons names no longer start with 'fa-', "
              "just use the class name itself (for example, 'check' instead of 'fa-check')", DeprecationWarning)
              value = value[3:]
          return value
  
      def on_click(self, callback, remove=False):
          """Register a callback to execute when the button is clicked.
  
          The callback will be called with one argument, the clicked button
          widget instance.
  
          Parameters
          ----------
          remove: bool (optional)
              Set to true to remove the callback from the list of callbacks.
          """
          self._click_handlers.register_callback(callback, remove=remove)
  
      def _handle_button_msg(self, _, content, buffers):
          """Handle a msg from the front-end.
  
          Parameters
          ----------
          content: dict
              Content of the msg.
          """
          if content.get('event', '') == 'click':
              self._click_handlers(self)
  
subject: Add a ‘validator’ that strips the fa- prefix for button icons and a deprecation warning.