diff --git a/panel/chat/message.py b/panel/chat/message.py index 736f2b9137d..9715e4c6014 100644 --- a/panel/chat/message.py +++ b/panel/chat/message.py @@ -479,6 +479,20 @@ def _include_stylesheets_inplace(self, obj): for o in obj.objects: self._include_stylesheets_inplace(o) + def _include_message_css_class_inplace(self, obj): + if hasattr(obj, "objects"): + for o in obj.objects: + self._include_message_css_class_inplace(o) + elif isinstance(obj, str): + return self._include_message_css_class_inplace(Markdown(obj)) + + is_markup = isinstance(obj, HTMLBasePane) and not isinstance(obj, FileBase) + if obj.css_classes or not is_markup: + return + if len(str(obj.object)) > 0: # only show a background if there is content + obj.css_classes = [*(css for css in obj.css_classes if css != "message"), "message"] + obj.sizing_mode = None + def _set_params(self, obj, **params): """ Set the sizing mode and height of the object. @@ -486,9 +500,7 @@ def _set_params(self, obj, **params): self._include_stylesheets_inplace(obj) is_markup = isinstance(obj, HTMLBasePane) and not isinstance(obj, FileBase) if is_markup: - if len(str(obj.object)) > 0: # only show a background if there is content - params['css_classes'] = [*(css for css in obj.css_classes if css != "message"), "message"] - params['sizing_mode'] = None + self._include_message_css_class_inplace(obj) else: if obj.sizing_mode is None and not obj.width: params['sizing_mode'] = "stretch_width" @@ -508,6 +520,7 @@ def _create_panel(self, value, old=None): if isinstance(value, Viewable): self._internal = False self._include_stylesheets_inplace(value) + self._include_message_css_class_inplace(value) return value renderer = None diff --git a/panel/tests/chat/test_message.py b/panel/tests/chat/test_message.py index bb33240f8dc..cb99f46c142 100644 --- a/panel/tests/chat/test_message.py +++ b/panel/tests/chat/test_message.py @@ -214,6 +214,27 @@ def test_include_stylesheets_inplace_on_layouts(self): assert message.object.stylesheets == ChatMessage._stylesheets + ["chat.css", "row.css"] assert message.object.objects[0].stylesheets == ChatMessage._stylesheets + ["chat.css", "row2.css"] + def test_include_message_css_class_inplace(self): + # markdown + message = ChatMessage(object=Markdown("hello")) + assert message.object.css_classes == ["message"] + + # custom css class; no message appended + message = ChatMessage(object=Markdown("hello", css_classes=["custom"])) + assert message.object.css_classes == ["custom"] + + # nested in layout; message appended + message = ChatMessage(object=Row(Markdown("hello"))) + assert message.object.objects[0].css_classes == ["message"] + + # nested in layout as a string; message appended + message = ChatMessage(object=Row("hello")) + assert message.object.objects[0].css_classes == ["message"] + + # nested in layout with custom css; no message appended + message = ChatMessage(object=Row(Markdown("hello", css_classes=["custom"]))) + assert message.object.objects[0].css_classes == ["custom"] + @mpl_available def test_can_display_any_python_object_that_panel_can_display(self): # For example matplotlib figures