Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 31 additions & 25 deletions apps/desktop/src/routes/(window-chrome)/new-main/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1597,36 +1597,42 @@ function createUpdateReadyToast() {
createTauriEventListener(events.updateReady, (update) => {
toast.custom(
(t) => (
<div class="flex gap-3 items-center px-4 py-3 rounded-xl border shadow-lg bg-gray-1 border-gray-4 text-gray-12">
// The main window is only 330px wide, so the toast must fit inside it
// (never exceed the viewport) and stack its actions below the message
// rather than racing them on one line — otherwise the card overflows
// the window edge and gets clipped.
<div class="flex flex-col gap-2.5 px-4 py-3 rounded-xl border shadow-lg bg-gray-1 border-gray-4 text-gray-12 w-[min(24rem,calc(100vw-2rem))]">

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works, but Tailwind arbitrary values with min(..., ...) (comma + nested parens) can be a little brittle in class scanners. Same behavior, a bit more readable:

Suggested change
<div class="flex flex-col gap-2.5 px-4 py-3 rounded-xl border shadow-lg bg-gray-1 border-gray-4 text-gray-12 w-[min(24rem,calc(100vw-2rem))]">
<div class="flex flex-col gap-2.5 px-4 py-3 rounded-xl border shadow-lg bg-gray-1 border-gray-4 text-gray-12 w-[calc(100vw-2rem)] max-w-sm">

<p class="text-sm">
{update.installed
? `Cap ${update.version} has been installed — restart to apply`
: `Cap ${update.version} is ready to install`}
</p>
<button
type="button"
class="px-2.5 py-1 text-xs font-medium rounded-lg transition-colors bg-blue-9 text-white hover:bg-blue-10"
onClick={() => {
toast.dismiss(t.id);
const install = update.installed
? Promise.resolve(null)
: commands.updatesDownloadAndInstall();
// On Windows the NSIS installer restarts Cap itself, so the
// relaunch call is unreachable there; that matches update.tsx.
install
.then(() => relaunch())
.catch((e) => console.error("Failed to install update:", e));
}}
>
{update.installed ? "Restart now" : "Install and restart"}
</button>
<button
type="button"
class="px-2.5 py-1 text-xs font-medium rounded-lg transition-colors text-gray-11 hover:text-gray-12"
onClick={() => toast.dismiss(t.id)}
>
Dismiss
</button>
<div class="flex gap-2 items-center">

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: to avoid horizontal overflow if button labels get a bit longer (e.g. future copy changes), consider allowing the action row to wrap.

Suggested change
<div class="flex gap-2 items-center">
<div class="flex flex-wrap gap-2 items-center">

<button
type="button"
class="px-2.5 py-1 text-xs font-medium rounded-lg transition-colors bg-blue-9 text-white hover:bg-blue-10"
onClick={() => {
toast.dismiss(t.id);
const install = update.installed
? Promise.resolve(null)
: commands.updatesDownloadAndInstall();
// On Windows the NSIS installer restarts Cap itself, so the
// relaunch call is unreachable there; that matches update.tsx.
install
.then(() => relaunch())
.catch((e) => console.error("Failed to install update:", e));
}}
>
{update.installed ? "Restart now" : "Install and restart"}
</button>
<button
type="button"
class="px-2.5 py-1 text-xs font-medium rounded-lg transition-colors text-gray-11 hover:text-gray-12"
onClick={() => toast.dismiss(t.id)}
>
Dismiss
</button>
</div>
</div>
),
{
Expand Down
Loading