We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Missing link styles in `Toast` notifcations
This follows on from discussion #3526 about adding a clickable link in a notification.

 The `Toast` widget doesn't inherit the styling from the base class, so the "default" links styling defined in Widget is lost. You can obviously just add it back in like I've done here, but it might be nicer if you didn't have to do that.

```python
# toast_with_link.py

import webbrowser

from textual.app import App


class ToastLinkApp(App):
    # Uncomment the CSS_PATH to see the link!
    # CSS_PATH = "toast_with_link.css"

    def on_mount(self) -> None:
        self.notify(
            "Don't forget to "
            "[@click=link('https://github.com/Textualize/textual')]star[/] "
            "the repository!",
            timeout=10,
        )

    def action_link(self, href: str) -> None:
        webbrowser.open(href)


if __name__ == "__main__":
    app = ToastLinkApp()
    app.run()
```

```css
/* toast_with_link.css */

Toast {
  link-background: ;
  link-color: $text;
  link-style: underline;
  link-hover-background: $accent;
  link-hover-color: $text;
  link-hover-style: bold not underline;
}
```



--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/textual/widgets/_toast.py`
Content:
```
1 """Widgets for showing notification messages in toasts."""
2 
3 from __future__ import annotations
4 
5 from typing import ClassVar
6 
7 from rich.console import RenderableType
8 from rich.text import Text
9 
10 from .. import on
11 from ..containers import Container
12 from ..css.query import NoMatches
13 from ..events import Click, Mount
14 from ..notifications import Notification, Notifications
15 from ._static import Static
16 
17 
18 class ToastHolder(Container, inherit_css=False):
19     """Container that holds a single toast.
20 
21     Used to control the alignment of each of the toasts in the main toast
22     container.
23     """
24 
25     DEFAULT_CSS = """
26     ToastHolder {
27         align-horizontal: right;
28         width: 1fr;
29         height: auto;
30         visibility: hidden;
31     }
32     """
33 
34 
35 class Toast(Static, inherit_css=False):
36     """A widget for displaying short-lived notifications."""
37 
38     DEFAULT_CSS = """
39     Toast {
40         width: 60;
41         max-width: 50%;
42         height: auto;
43         visibility: visible;
44         margin-top: 1;
45         padding: 1 1;
46         background: $panel;
47         tint: white 5%;
48     }
49 
50     .toast--title {
51         text-style: bold;
52     }
53 
54     Toast {
55         border-right: wide $background;
56     }
57 
58     Toast.-information {
59         border-left: wide $success;
60     }
61 
62     Toast.-information .toast--title {
63         color: $success-darken-1;
64     }
65 
66     Toast.-warning {
67         border-left: wide $warning;
68     }
69 
70     Toast.-warning .toast--title {
71         color: $warning-darken-1;
72     }
73 
74     Toast.-error {
75         border-left: wide $error;
76     }
77 
78     Toast.-error .toast--title {
79        color: $error-darken-1;
80     }
81     """
82 
83     COMPONENT_CLASSES: ClassVar[set[str]] = {"toast--title"}
84     """
85     | Class | Description |
86     | :- | :- |
87     | `toast--title` | Targets the title of the toast. |
88     """
89 
90     def __init__(self, notification: Notification) -> None:
91         """Initialise the toast.
92 
93         Args:
94             notification: The notification to show in the toast.
95         """
96         super().__init__(classes=f"-{notification.severity}")
97         self._notification = notification
98         self._timeout = notification.time_left
99 
100     def render(self) -> RenderableType:
101         """Render the toast's content.
102 
103         Returns:
104             A Rich renderable for the title and content of the Toast.
105         """
106         notification = self._notification
107         if notification.title:
108             header_style = self.get_component_rich_style("toast--title")
109             notification_text = Text.assemble(
110                 (notification.title, header_style),
111                 "\n",
112                 Text.from_markup(notification.message),
113             )
114         else:
115             notification_text = Text.assemble(
116                 Text.from_markup(notification.message),
117             )
118         return notification_text
119 
120     def _on_mount(self, _: Mount) -> None:
121         """Set the time running once the toast is mounted."""
122         self.set_timer(self._timeout, self._expire)
123 
124     @on(Click)
125     def _expire(self) -> None:
126         """Remove the toast once the timer has expired."""
127         # Before we removed ourself, we also call on the app to forget about
128         # the notification that caused us to exist. Note that we tell the
129         # app to not bother refreshing the display on our account, we're
130         # about to handle that anyway.
131         self.app._unnotify(self._notification, refresh=False)
132         # Note that we attempt to remove our parent, because we're wrapped
133         # inside an alignment container. The testing that we are is as much
134         # to keep type checkers happy as anything else.
135         (self.parent if isinstance(self.parent, ToastHolder) else self).remove()
136 
137 
138 class ToastRack(Container, inherit_css=False):
139     """A container for holding toasts."""
140 
141     DEFAULT_CSS = """
142     ToastRack {
143         layer: _toastrack;
144         width: 1fr;
145         height: auto;
146         dock: top;
147         align: right bottom;
148         visibility: hidden;
149         layout: vertical;
150         overflow-y: scroll;
151         margin-bottom: 1;
152         margin-right: 1;
153     }
154     """
155 
156     @staticmethod
157     def _toast_id(notification: Notification) -> str:
158         """Create a Textual-DOM-internal ID for the given notification.
159 
160         Args:
161             notification: The notification to create the ID for.
162 
163         Returns:
164             An ID for the notification that can be used within the DOM.
165         """
166         return f"--textual-toast-{notification.identity}"
167 
168     def show(self, notifications: Notifications) -> None:
169         """Show the notifications as toasts.
170 
171         Args:
172             notifications: The notifications to show.
173         """
174 
175         # Look for any stale toasts and remove them.
176         for toast in self.query(Toast):
177             if toast._notification not in notifications:
178                 toast.remove()
179 
180         # Gather up all the notifications that we don't have toasts for yet.
181         new_toasts: list[Notification] = []
182         for notification in notifications:
183             try:
184                 # See if there's already a toast for that notification.
185                 _ = self.get_child_by_id(self._toast_id(notification))
186             except NoMatches:
187                 if not notification.has_expired:
188                     new_toasts.append(notification)
189 
190         # If we got any...
191         if new_toasts:
192             # ...mount them.
193             self.mount_all(
194                 ToastHolder(Toast(toast), id=self._toast_id(toast))
195                 for toast in new_toasts
196             )
197             self.call_later(self.scroll_end, animate=False, force=True)
198
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/textual/widgets/_toast.py b/src/textual/widgets/_toast.py
--- a/src/textual/widgets/_toast.py
+++ b/src/textual/widgets/_toast.py
@@ -45,6 +45,12 @@
         padding: 1 1;
         background: $panel;
         tint: white 5%;
+        link-background:;
+        link-color: $text;
+        link-style: underline;
+        link-hover-background: $accent;
+        link-hover-color: $text;
+        link-hover-style: bold not underline;
     }
 
     .toast--title {

{"golden_diff": "diff --git a/src/textual/widgets/_toast.py b/src/textual/widgets/_toast.py\n--- a/src/textual/widgets/_toast.py\n+++ b/src/textual/widgets/_toast.py\n@@ -45,6 +45,12 @@\n         padding: 1 1;\n         background: $panel;\n         tint: white 5%;\n+        link-background:;\n+        link-color: $text;\n+        link-style: underline;\n+        link-hover-background: $accent;\n+        link-hover-color: $text;\n+        link-hover-style: bold not underline;\n     }\n \n     .toast--title {\n", "issue": "Missing link styles in `Toast` notifcations\nThis follows on from discussion #3526 about adding a clickable link in a notification.\r\n\r\n The `Toast` widget doesn't inherit the styling from the base class, so the \"default\" links styling defined in Widget is lost. You can obviously just add it back in like I've done here, but it might be nicer if you didn't have to do that.\r\n\r\n```python\r\n# toast_with_link.py\r\n\r\nimport webbrowser\r\n\r\nfrom textual.app import App\r\n\r\n\r\nclass ToastLinkApp(App):\r\n    # Uncomment the CSS_PATH to see the link!\r\n    # CSS_PATH = \"toast_with_link.css\"\r\n\r\n    def on_mount(self) -> None:\r\n        self.notify(\r\n            \"Don't forget to \"\r\n            \"[@click=link('https://github.com/Textualize/textual')]star[/] \"\r\n            \"the repository!\",\r\n            timeout=10,\r\n        )\r\n\r\n    def action_link(self, href: str) -> None:\r\n        webbrowser.open(href)\r\n\r\n\r\nif __name__ == \"__main__\":\r\n    app = ToastLinkApp()\r\n    app.run()\r\n```\r\n\r\n```css\r\n/* toast_with_link.css */\r\n\r\nToast {\r\n  link-background: ;\r\n  link-color: $text;\r\n  link-style: underline;\r\n  link-hover-background: $accent;\r\n  link-hover-color: $text;\r\n  link-hover-style: bold not underline;\r\n}\r\n```\r\n\r\n\n", "before_files": [{"content": "\"\"\"Widgets for showing notification messages in toasts.\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import ClassVar\n\nfrom rich.console import RenderableType\nfrom rich.text import Text\n\nfrom .. import on\nfrom ..containers import Container\nfrom ..css.query import NoMatches\nfrom ..events import Click, Mount\nfrom ..notifications import Notification, Notifications\nfrom ._static import Static\n\n\nclass ToastHolder(Container, inherit_css=False):\n    \"\"\"Container that holds a single toast.\n\n    Used to control the alignment of each of the toasts in the main toast\n    container.\n    \"\"\"\n\n    DEFAULT_CSS = \"\"\"\n    ToastHolder {\n        align-horizontal: right;\n        width: 1fr;\n        height: auto;\n        visibility: hidden;\n    }\n    \"\"\"\n\n\nclass Toast(Static, inherit_css=False):\n    \"\"\"A widget for displaying short-lived notifications.\"\"\"\n\n    DEFAULT_CSS = \"\"\"\n    Toast {\n        width: 60;\n        max-width: 50%;\n        height: auto;\n        visibility: visible;\n        margin-top: 1;\n        padding: 1 1;\n        background: $panel;\n        tint: white 5%;\n    }\n\n    .toast--title {\n        text-style: bold;\n    }\n\n    Toast {\n        border-right: wide $background;\n    }\n\n    Toast.-information {\n        border-left: wide $success;\n    }\n\n    Toast.-information .toast--title {\n        color: $success-darken-1;\n    }\n\n    Toast.-warning {\n        border-left: wide $warning;\n    }\n\n    Toast.-warning .toast--title {\n        color: $warning-darken-1;\n    }\n\n    Toast.-error {\n        border-left: wide $error;\n    }\n\n    Toast.-error .toast--title {\n       color: $error-darken-1;\n    }\n    \"\"\"\n\n    COMPONENT_CLASSES: ClassVar[set[str]] = {\"toast--title\"}\n    \"\"\"\n    | Class | Description |\n    | :- | :- |\n    | `toast--title` | Targets the title of the toast. |\n    \"\"\"\n\n    def __init__(self, notification: Notification) -> None:\n        \"\"\"Initialise the toast.\n\n        Args:\n            notification: The notification to show in the toast.\n        \"\"\"\n        super().__init__(classes=f\"-{notification.severity}\")\n        self._notification = notification\n        self._timeout = notification.time_left\n\n    def render(self) -> RenderableType:\n        \"\"\"Render the toast's content.\n\n        Returns:\n            A Rich renderable for the title and content of the Toast.\n        \"\"\"\n        notification = self._notification\n        if notification.title:\n            header_style = self.get_component_rich_style(\"toast--title\")\n            notification_text = Text.assemble(\n                (notification.title, header_style),\n                \"\\n\",\n                Text.from_markup(notification.message),\n            )\n        else:\n            notification_text = Text.assemble(\n                Text.from_markup(notification.message),\n            )\n        return notification_text\n\n    def _on_mount(self, _: Mount) -> None:\n        \"\"\"Set the time running once the toast is mounted.\"\"\"\n        self.set_timer(self._timeout, self._expire)\n\n    @on(Click)\n    def _expire(self) -> None:\n        \"\"\"Remove the toast once the timer has expired.\"\"\"\n        # Before we removed ourself, we also call on the app to forget about\n        # the notification that caused us to exist. Note that we tell the\n        # app to not bother refreshing the display on our account, we're\n        # about to handle that anyway.\n        self.app._unnotify(self._notification, refresh=False)\n        # Note that we attempt to remove our parent, because we're wrapped\n        # inside an alignment container. The testing that we are is as much\n        # to keep type checkers happy as anything else.\n        (self.parent if isinstance(self.parent, ToastHolder) else self).remove()\n\n\nclass ToastRack(Container, inherit_css=False):\n    \"\"\"A container for holding toasts.\"\"\"\n\n    DEFAULT_CSS = \"\"\"\n    ToastRack {\n        layer: _toastrack;\n        width: 1fr;\n        height: auto;\n        dock: top;\n        align: right bottom;\n        visibility: hidden;\n        layout: vertical;\n        overflow-y: scroll;\n        margin-bottom: 1;\n        margin-right: 1;\n    }\n    \"\"\"\n\n    @staticmethod\n    def _toast_id(notification: Notification) -> str:\n        \"\"\"Create a Textual-DOM-internal ID for the given notification.\n\n        Args:\n            notification: The notification to create the ID for.\n\n        Returns:\n            An ID for the notification that can be used within the DOM.\n        \"\"\"\n        return f\"--textual-toast-{notification.identity}\"\n\n    def show(self, notifications: Notifications) -> None:\n        \"\"\"Show the notifications as toasts.\n\n        Args:\n            notifications: The notifications to show.\n        \"\"\"\n\n        # Look for any stale toasts and remove them.\n        for toast in self.query(Toast):\n            if toast._notification not in notifications:\n                toast.remove()\n\n        # Gather up all the notifications that we don't have toasts for yet.\n        new_toasts: list[Notification] = []\n        for notification in notifications:\n            try:\n                # See if there's already a toast for that notification.\n                _ = self.get_child_by_id(self._toast_id(notification))\n            except NoMatches:\n                if not notification.has_expired:\n                    new_toasts.append(notification)\n\n        # If we got any...\n        if new_toasts:\n            # ...mount them.\n            self.mount_all(\n                ToastHolder(Toast(toast), id=self._toast_id(toast))\n                for toast in new_toasts\n            )\n            self.call_later(self.scroll_end, animate=False, force=True)\n", "path": "src/textual/widgets/_toast.py"}], "after_files": [{"content": "\"\"\"Widgets for showing notification messages in toasts.\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import ClassVar\n\nfrom rich.console import RenderableType\nfrom rich.text import Text\n\nfrom .. import on\nfrom ..containers import Container\nfrom ..css.query import NoMatches\nfrom ..events import Click, Mount\nfrom ..notifications import Notification, Notifications\nfrom ._static import Static\n\n\nclass ToastHolder(Container, inherit_css=False):\n    \"\"\"Container that holds a single toast.\n\n    Used to control the alignment of each of the toasts in the main toast\n    container.\n    \"\"\"\n\n    DEFAULT_CSS = \"\"\"\n    ToastHolder {\n        align-horizontal: right;\n        width: 1fr;\n        height: auto;\n        visibility: hidden;\n    }\n    \"\"\"\n\n\nclass Toast(Static, inherit_css=False):\n    \"\"\"A widget for displaying short-lived notifications.\"\"\"\n\n    DEFAULT_CSS = \"\"\"\n    Toast {\n        width: 60;\n        max-width: 50%;\n        height: auto;\n        visibility: visible;\n        margin-top: 1;\n        padding: 1 1;\n        background: $panel;\n        tint: white 5%;\n        link-background:;\n        link-color: $text;\n        link-style: underline;\n        link-hover-background: $accent;\n        link-hover-color: $text;\n        link-hover-style: bold not underline;\n    }\n\n    .toast--title {\n        text-style: bold;\n    }\n\n    Toast {\n        border-right: wide $background;\n    }\n\n    Toast.-information {\n        border-left: wide $success;\n    }\n\n    Toast.-information .toast--title {\n        color: $success-darken-1;\n    }\n\n    Toast.-warning {\n        border-left: wide $warning;\n    }\n\n    Toast.-warning .toast--title {\n        color: $warning-darken-1;\n    }\n\n    Toast.-error {\n        border-left: wide $error;\n    }\n\n    Toast.-error .toast--title {\n       color: $error-darken-1;\n    }\n    \"\"\"\n\n    COMPONENT_CLASSES: ClassVar[set[str]] = {\"toast--title\"}\n    \"\"\"\n    | Class | Description |\n    | :- | :- |\n    | `toast--title` | Targets the title of the toast. |\n    \"\"\"\n\n    def __init__(self, notification: Notification) -> None:\n        \"\"\"Initialise the toast.\n\n        Args:\n            notification: The notification to show in the toast.\n        \"\"\"\n        super().__init__(classes=f\"-{notification.severity}\")\n        self._notification = notification\n        self._timeout = notification.time_left\n\n    def render(self) -> RenderableType:\n        \"\"\"Render the toast's content.\n\n        Returns:\n            A Rich renderable for the title and content of the Toast.\n        \"\"\"\n        notification = self._notification\n        if notification.title:\n            header_style = self.get_component_rich_style(\"toast--title\")\n            notification_text = Text.assemble(\n                (notification.title, header_style),\n                \"\\n\",\n                Text.from_markup(notification.message),\n            )\n        else:\n            notification_text = Text.assemble(\n                Text.from_markup(notification.message),\n            )\n        return notification_text\n\n    def _on_mount(self, _: Mount) -> None:\n        \"\"\"Set the time running once the toast is mounted.\"\"\"\n        self.set_timer(self._timeout, self._expire)\n\n    @on(Click)\n    def _expire(self) -> None:\n        \"\"\"Remove the toast once the timer has expired.\"\"\"\n        # Before we removed ourself, we also call on the app to forget about\n        # the notification that caused us to exist. Note that we tell the\n        # app to not bother refreshing the display on our account, we're\n        # about to handle that anyway.\n        self.app._unnotify(self._notification, refresh=False)\n        # Note that we attempt to remove our parent, because we're wrapped\n        # inside an alignment container. The testing that we are is as much\n        # to keep type checkers happy as anything else.\n        (self.parent if isinstance(self.parent, ToastHolder) else self).remove()\n\n\nclass ToastRack(Container, inherit_css=False):\n    \"\"\"A container for holding toasts.\"\"\"\n\n    DEFAULT_CSS = \"\"\"\n    ToastRack {\n        layer: _toastrack;\n        width: 1fr;\n        height: auto;\n        dock: top;\n        align: right bottom;\n        visibility: hidden;\n        layout: vertical;\n        overflow-y: scroll;\n        margin-bottom: 1;\n        margin-right: 1;\n    }\n    \"\"\"\n\n    @staticmethod\n    def _toast_id(notification: Notification) -> str:\n        \"\"\"Create a Textual-DOM-internal ID for the given notification.\n\n        Args:\n            notification: The notification to create the ID for.\n\n        Returns:\n            An ID for the notification that can be used within the DOM.\n        \"\"\"\n        return f\"--textual-toast-{notification.identity}\"\n\n    def show(self, notifications: Notifications) -> None:\n        \"\"\"Show the notifications as toasts.\n\n        Args:\n            notifications: The notifications to show.\n        \"\"\"\n\n        # Look for any stale toasts and remove them.\n        for toast in self.query(Toast):\n            if toast._notification not in notifications:\n                toast.remove()\n\n        # Gather up all the notifications that we don't have toasts for yet.\n        new_toasts: list[Notification] = []\n        for notification in notifications:\n            try:\n                # See if there's already a toast for that notification.\n                _ = self.get_child_by_id(self._toast_id(notification))\n            except NoMatches:\n                if not notification.has_expired:\n                    new_toasts.append(notification)\n\n        # If we got any...\n        if new_toasts:\n            # ...mount them.\n            self.mount_all(\n                ToastHolder(Toast(toast), id=self._toast_id(toast))\n                for toast in new_toasts\n            )\n            self.call_later(self.scroll_end, animate=False, force=True)\n", "path": "src/textual/widgets/_toast.py"}]}