Skip to content

style(ui): full-product Emil design pass — tokens, focus, motion, a11y#5

Merged
Lionvsx merged 2 commits into
fix/toggle-widget-ui-polishfrom
ui/emil-design-pass
Jun 6, 2026
Merged

style(ui): full-product Emil design pass — tokens, focus, motion, a11y#5
Lionvsx merged 2 commits into
fix/toggle-widget-ui-polishfrom
ui/emil-design-pass

Conversation

@Lionvsx

@Lionvsx Lionvsx commented May 30, 2026

Copy link
Copy Markdown
Member

Summary

A full-product UI polish pass following Emil Kowalski's design-engineering principles, extending the foundational polish from #3. Visual + interaction only — no behavior, data-flow, or copy changes.

Stacked on fix/toggle-widget-ui-polish (#3) so this diff stays clean. Rebase onto main once #3 merges.

What changed

Design tokens (src/index.css)

  • Elevation scale: shadow-card / shadow-popover / shadow-overlay (hairline ring + soft shadow)
  • Z-index scale (--z-dropdown/modal/tooltip/toast), macOS window-control colors, fade-in/modal-in keyframes

Shared components

  • Button: focus-visible ring, tactile active:scale press, new variant="link" for inline text actions
  • Modal: role="dialog" + aria-modal, focus trap + restore, body scroll-lock, entrance animation, --z-modal (focusable selector extracted to its own file per repo convention)
  • Card: elevation token + optional interactive hover-lift
  • Badge / Select / SearchableSelect / PeriodSelector / ModelCard: focus-visible, ease-out, motion-reduce; dropdowns share the popover shadow + pop-in

Shell & pages

  • No more layout shift on active states — sidebar nav, onboarding stepper, profile tabs now keep constant font-weight (color/bg only)
  • transition-all → named properties (transition-[width] for progress bars, transition-colors for hovers) everywhere, with motion-reduce
  • focus-visible added to nav links, traffic-light buttons (+ aria-label), transcript/profile list items, footer buttons
  • Inline accent text-buttons ("Change", "Update available", "GitHub"/"Feedback") routed through Button variant="link"
  • tabular-nums on numeric badges; for literal ellipses

Verification

  • npm run build (tsc + vite) — all new tokens compile (bg-mac-close, shadow-*, z-modal confirmed in output CSS)
  • ✅ Full .doctor suite green (react + rust); registered the new link variant in .doctor/dupe-ignore
  • ✅ Pre-push hook (doctor + tsc + cargo check + clippy) passed
  • ✅ Dev app relaunched cleanly; STT capture + paste still work (the fix(ui): center toggle knob, surface hidden widget during STT, polish UI #3 focus-safe widget fix holds)
  • Manual passes: keyboard Tab (visible focus rings, modal focus trap), reduced-motion, no-layout-shift on active toggles

🤖 Generated with Claude Code

Foundation + product-wide polish following Emil Kowalski's design
engineering principles. Visual/interaction only — no behavior changes.

Tokens (index.css): elevation scale (shadow-card/popover/overlay),
z-index scale, macOS window-control colors, modal/fade keyframes.

Shared components: Button gains focus-visible ring, press feedback and a
link variant; Modal gains role/aria-modal, focus trap + restore, scroll
lock and an entrance animation; Card uses the elevation token (+optional
interactive lift); Badge/SearchableSelect/PeriodSelector/ModelCard get
focus-visible, ease-out and motion-reduce; dropdowns share the popover
shadow + pop-in.

Shell & pages: sidebar/onboarding/profiles no longer shift layout on
active states (constant font-weight); transition-all replaced with named
properties; focus-visible added to nav, list items, tabs and footer
buttons; inline accent text-buttons routed through Button link variant.

dupe-ignore: register the new "link" variant string (matches existing
ghost/secondary entries).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented May 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
loqui Ready Ready Preview, Comment Jun 5, 2026 1:22pm

Request Review

@coderabbitai

coderabbitai Bot commented May 30, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: aed59360-857b-4bd3-9ad7-60242faf6e9f

📥 Commits

Reviewing files that changed from the base of the PR and between 35ee065 and 22291ac.

📒 Files selected for processing (25)
  • src-tauri/src/window/widget.rs
  • src-tauri/tauri.conf.json
  • src/dashboard/dashboard-page.tsx
  • src/dashboard/stats/stat-cards.ts
  • src/dashboard/stats/stat-placeholders.ts
  • src/dashboard/stats/stats-row.tsx
  • src/index.css
  • src/layout/main-layout.tsx
  • src/layout/sidebar.tsx
  • src/profiles/profiles-page.tsx
  • src/settings/about/about-section.tsx
  • src/settings/data/data-section.tsx
  • src/settings/debug-section.tsx
  • src/settings/general/general-section.tsx
  • src/settings/llm/llm-section.tsx
  • src/settings/settings-page.tsx
  • src/settings/speech/speech-section.tsx
  • src/settings/widget/widget-section.tsx
  • src/shared/components/modal-focusable-selector.ts
  • src/shared/components/modal.tsx
  • src/shared/components/page-header.tsx
  • src/shared/components/toggle.tsx
  • src/transcripts/transcripts-page.tsx
  • src/widget/hooks/use-fft-bars.ts
  • src/widget/widget-app.tsx
💤 Files with no reviewable changes (1)
  • src/dashboard/stats/stat-placeholders.ts
✅ Files skipped from review due to trivial changes (9)
  • src/layout/main-layout.tsx
  • src/settings/debug-section.tsx
  • src/settings/data/data-section.tsx
  • src/transcripts/transcripts-page.tsx
  • src/settings/speech/speech-section.tsx
  • src/settings/widget/widget-section.tsx
  • src/settings/llm/llm-section.tsx
  • src/profiles/profiles-page.tsx
  • src/settings/settings-page.tsx
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/shared/components/modal-focusable-selector.ts
  • src/shared/components/modal.tsx
  • src/settings/general/general-section.tsx
  • src/layout/sidebar.tsx

Walkthrough

This PR enhances the UI system with a new link-style button variant, implements full modal accessibility with focus trapping, refactors multiple components to use the shared button system, extends the design theme with new tokens and animations, and systematically improves motion handling across components with motion-reduce support.

Changes

UI Enhancement and Accessibility

Layer / File(s) Summary
Theme & Animation System
src/index.css
New Tailwind @theme tokens for macOS window control colors (--color-mac-close, --color-mac-min, --color-mac-max) and shadow elevation variables (--shadow-card, --shadow-popover, --shadow-overlay). New @keyframes for fade-in and modal-in animations with corresponding .animate-fade-in and .animate-modal-in utility classes.
Button System: Link Variant
src/shared/components/button/button-size-styles.ts, src/shared/components/button/button-variant-styles.ts, src/shared/components/button/button.tsx
Button component extended with variant="link" and size="inline" to support text-only inline actions. New size and variant style maps define text-colored link styling with underline on hover. Button logic now treats links distinctly, using inline sizing and conditional tactile feedback (scale press only on non-link variants).
Card Component & Badge Updates
src/shared/components/card.tsx, src/shared/components/badge/badge.tsx
Card adds optional interactive prop enabling hover shadow transitions for clickable cards, with shadow styling migrated to new CSS variable. Badge adds tabular-nums for numeric alignment.
Modal Accessibility & Focus Trapping
src/shared/components/modal-focusable-selector.ts, src/shared/components/modal.tsx
Modal implements full accessibility: new focusable-selector module exports CSS selector for tabbable elements. Modal component now locks background scroll, traps focus via Tab cycling within focusable elements, restores previously focused element on close, moves initial focus into dialog, and closes on Escape. ARIA attributes (role="dialog", aria-modal, aria-label) added.
Button Refactoring: Sidebar, Settings, Layout
src/layout/sidebar.tsx, src/settings/about/about-section.tsx, src/settings/general/general-section.tsx, src/onboarding/onboarding-layout.tsx
Multiple components refactored to use new Button link variant: Sidebar window controls and update notification, AboutSection GitHub links, GeneralSection hotkey button. OnboardingLayout Back and footer buttons updated with expanded focus-visible and motion-reduce styling. Loading text changed to ellipsis; stepper label font weight kept constant.
Transition & Motion Refinements Across Components
src/onboarding/steps/step-microphone.tsx, src/profiles/list/profile-list-item.tsx, src/profiles/llm/llm-model-selector.tsx, src/settings/llm/llm-model-download-row.tsx, src/settings/speech/speech-model-modal.tsx, src/shared/components/model-card/model-card.tsx, src/shared/components/period-selector.tsx, src/shared/components/searchable-select/searchable-select.tsx, src/transcripts/transcript-item.tsx, src/widget/idle-bar.tsx
Systematic updates replacing generic transition-all with property-specific transitions (e.g., transition-[width], transition-colors). All transitions now explicitly specify duration and easing. Motion-reduce override (motion-reduce:transition-none) added throughout for accessibility. Dropdown container styling updated to use CSS variable z-index and animate-pop-in.
Tauri Widget Thread-Safety & Window Config
src-tauri/src/window/widget.rs, src-tauri/tauri.conf.json
Dispatches macOS AppKit widget show/hide operations to the Tauri main thread using run_on_main_thread, preserving visibility behavior; updates main window chrome config (decorations, titleBarStyle, hiddenTitle, transparent).
Dashboard Stats Refactor
src/dashboard/stats/stat-cards.ts, src/dashboard/stats/stats-row.tsx, src/dashboard/stats/stat-placeholders.ts
New StatCard interface and statCards module added; StatsRow now maps over statCards for rendering. Prior statPlaceholders file and local in-file placeholder logic removed.
PageHeader Component & Adoption
src/shared/components/page-header.tsx, src/dashboard/dashboard-page.tsx, src/settings/settings-page.tsx
New PageHeader component introduced and used by DashboardPage and SettingsPage to render page titles/descriptions and optional actions.
Toggle Accessibility
src/shared/components/toggle.tsx, src/settings/widget/widget-section.tsx
ToggleProps adds optional ariaLabel?: string; Toggle uses ariaLabel ?? label for aria-label. Widget section “Show widget” toggle now passes an explicit ariaLabel.
FFT Hook Controlled by Active Flag
src/widget/hooks/use-fft-bars.ts, src/widget/widget-app.tsx
useFftBars signature updated to useFftBars(rms, active) adding a zeros() helper; animation/effect lifecycle now respects active to avoid RAF when inactive. Widget computes isRecording and passes it to the hook.
Layout & Spacing Tweaks
src/layout/main-layout.tsx, src/profiles/profiles-page.tsx, src/transcripts/transcripts-page.tsx
Adjusted container paddings/negative margins (px-10 py-8, -mx-10 -my-8) for consistent spacing across pages.
Duplicate Detection Configuration
.doctor/dupe-ignore
Added MAGIC:link ignore rule.

🎯 3 (Moderate) | ⏱️ ~25 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: a comprehensive UI design pass covering tokens, focus states, motion, and accessibility improvements across the product.
Description check ✅ Passed The description is well-detailed and directly related to the changeset, explaining design tokens, component updates, and verification steps for the UI polish pass.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ui/emil-design-pass

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
src/shared/components/card.tsx (1)

21-24: ⚡ Quick win

Verify Tailwind v4 CSS-variable shadow utility syntax.

On Tailwind v4, these shadow-[var(--...)] forms may be parsed differently than expected for CSS-variable utilities. If they’re not generated, the card/popover elevation silently disappears.

Proposed change if v4 parsing is not generating these classes
-        "bg-bg-card rounded-xl border shadow-[var(--shadow-card)]",
+        "bg-bg-card rounded-xl border shadow-(--shadow-card)",
@@
-          "transition-shadow duration-200 ease-out motion-reduce:transition-none hover:shadow-[var(--shadow-popover)]",
+          "transition-shadow duration-200 ease-out motion-reduce:transition-none hover:shadow-(--shadow-popover)",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/components/card.tsx` around lines 21 - 24, The Tailwind arbitrary
shadow syntax shadow-[var(--shadow-card)] and
hover:shadow-[var(--shadow-popover)] used in the class list inside the Card
component (the strings next to featured and interactive in
src/shared/components/card.tsx) may not be emitted by Tailwind v4; update by
either adding explicit safelist entries or by replacing those arbitrary-variable
uses with stable utilities — e.g., create custom utilities/keys like shadow-card
and shadow-popover in tailwind.config.js (or add the exact arbitrary class names
to the safelist) and then swap the strings "shadow-[var(--shadow-card)]" and
"hover:shadow-[var(--shadow-popover)]" to the new utility names so the
card/popover elevation is produced reliably.
src/shared/components/searchable-select/searchable-select.tsx (1)

136-140: ⚡ Quick win

Tailwind v4: the current CSS-variable z-index/shadow syntax is valid

z-[var(--z-dropdown)] and shadow-[var(--shadow-popover)] work in Tailwind v4 (they’re equivalent to the z-(--z-dropdown) / shadow-(--shadow-popover) shorthand). Functional change isn’t needed; the shorthand is just a readability improvement.

Optional readability refactor
- "animate-pop-in origin-top absolute left-0 right-0 top-full mt-1.5 z-[var(--z-dropdown)]",
+ "animate-pop-in origin-top absolute left-0 right-0 top-full mt-1.5 z-(--z-dropdown)",

- "shadow-[var(--shadow-popover)] p-1",
+ "shadow-(--shadow-popover) p-1",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/components/searchable-select/searchable-select.tsx` around lines
136 - 140, The Tailwind v4 variable syntax is valid but for readability update
the class strings in the SearchableSelect component: replace
"z-[var(--z-dropdown)]" with the shorthand "z-(--z-dropdown)" and replace
"shadow-[var(--shadow-popover)]" with "shadow-(--shadow-popover)" in the
className array used in searchable-select.tsx (the array containing
"animate-pop-in origin-top..." and "shadow-[var(--shadow-popover)] p-1") so the
semantics remain identical but the classes read cleaner.
src/shared/components/modal.tsx (1)

63-82: 💤 Low value

Consider using Tailwind v4 parentheses syntax for CSS variables.

The arbitrary value syntax z-[var(--z-modal)] and shadow-[var(--shadow-overlay)] works, but Tailwind v4 introduces a cleaner shorthand using parentheses for CSS custom properties.

Idiomatic v4 syntax
     <div
-      className="fixed inset-0 z-[var(--z-modal)] flex items-center justify-center"
+      className="fixed inset-0 z-(--z-modal) flex items-center justify-center"
       role="dialog"
       ...
       <div
         ref={panelRef}
         tabIndex={-1}
         className="
           relative bg-bg-primary rounded-2xl border border-border
-          shadow-[var(--shadow-overlay)]
+          shadow-(--shadow-overlay)
           ...
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/components/modal.tsx` around lines 63 - 82, The Tailwind
arbitrary-value usage in the modal component should switch to v4 parentheses
syntax: replace instances of z-[var(--z-modal)] and
shadow-[var(--shadow-overlay)] in the className of the outer role="dialog" div
and the inner panel div (the element using ref={panelRef}) with z-(--z-modal)
and shadow-(--shadow-overlay) respectively so the CSS custom properties use the
idiomatic Tailwind v4 form while leaving the rest of the className values
unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/shared/components/modal-focusable-selector.ts`:
- Around line 2-3: The CSS selector modalFocusableSelector currently excludes
disabled buttons but still matches disabled input, textarea, and select elements
causing focus trap calls like focusables?.[0]?.focus() to silently fail; update
modalFocusableSelector to add :not([disabled]) for input, textarea and select
(i.e., ensure each form control in the selector includes :not([disabled])) so
disabled controls are filtered out before focus is applied.

---

Nitpick comments:
In `@src/shared/components/card.tsx`:
- Around line 21-24: The Tailwind arbitrary shadow syntax
shadow-[var(--shadow-card)] and hover:shadow-[var(--shadow-popover)] used in the
class list inside the Card component (the strings next to featured and
interactive in src/shared/components/card.tsx) may not be emitted by Tailwind
v4; update by either adding explicit safelist entries or by replacing those
arbitrary-variable uses with stable utilities — e.g., create custom
utilities/keys like shadow-card and shadow-popover in tailwind.config.js (or add
the exact arbitrary class names to the safelist) and then swap the strings
"shadow-[var(--shadow-card)]" and "hover:shadow-[var(--shadow-popover)]" to the
new utility names so the card/popover elevation is produced reliably.

In `@src/shared/components/modal.tsx`:
- Around line 63-82: The Tailwind arbitrary-value usage in the modal component
should switch to v4 parentheses syntax: replace instances of z-[var(--z-modal)]
and shadow-[var(--shadow-overlay)] in the className of the outer role="dialog"
div and the inner panel div (the element using ref={panelRef}) with
z-(--z-modal) and shadow-(--shadow-overlay) respectively so the CSS custom
properties use the idiomatic Tailwind v4 form while leaving the rest of the
className values unchanged.

In `@src/shared/components/searchable-select/searchable-select.tsx`:
- Around line 136-140: The Tailwind v4 variable syntax is valid but for
readability update the class strings in the SearchableSelect component: replace
"z-[var(--z-dropdown)]" with the shorthand "z-(--z-dropdown)" and replace
"shadow-[var(--shadow-popover)]" with "shadow-(--shadow-popover)" in the
className array used in searchable-select.tsx (the array containing
"animate-pop-in origin-top..." and "shadow-[var(--shadow-popover)] p-1") so the
semantics remain identical but the classes read cleaner.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 207dc473-e2e3-4fd5-b09d-4777d7a6f10c

📥 Commits

Reviewing files that changed from the base of the PR and between f9cc485 and 35ee065.

📒 Files selected for processing (23)
  • .doctor/dupe-ignore
  • src/index.css
  • src/layout/sidebar.tsx
  • src/onboarding/onboarding-layout.tsx
  • src/onboarding/steps/step-microphone.tsx
  • src/profiles/list/profile-list-item.tsx
  • src/profiles/llm/llm-model-selector.tsx
  • src/settings/about/about-section.tsx
  • src/settings/general/general-section.tsx
  • src/settings/llm/llm-model-download-row.tsx
  • src/settings/speech/speech-model-modal.tsx
  • src/shared/components/badge/badge.tsx
  • src/shared/components/button/button-size-styles.ts
  • src/shared/components/button/button-variant-styles.ts
  • src/shared/components/button/button.tsx
  • src/shared/components/card.tsx
  • src/shared/components/modal-focusable-selector.ts
  • src/shared/components/modal.tsx
  • src/shared/components/model-card/model-card.tsx
  • src/shared/components/period-selector.tsx
  • src/shared/components/searchable-select/searchable-select.tsx
  • src/transcripts/transcript-item.tsx
  • src/widget/idle-bar.tsx

Comment thread src/shared/components/modal-focusable-selector.ts Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

2 issues found across 23 files

Confidence score: 3/5

  • There is a concrete user-impacting accessibility risk in src/shared/components/modal.tsx: initial focus may land on a selector match that is not actually focusable, which can break expected keyboard flow when the modal opens.
  • Focus restoration in src/shared/components/modal.tsx appears to run on effect re-renders instead of only on close, so users may experience unexpected focus jumps while the dialog is still open.
  • Given the medium severity (6/10 and 5/10) and high confidence, this introduces some regression risk in modal interaction behavior before merge.
  • Pay close attention to src/shared/components/modal.tsx - focus targeting and restore timing can cause keyboard navigation instability.

Reply with feedback, questions, or to request a fix.

Fix all with cubic | Re-trigger cubic

Comment thread src/shared/components/modal.tsx
Comment thread src/shared/components/modal.tsx Outdated
Review fixes:
- widget.rs: hop NSPanel show/hide to the main thread via run_on_main_thread
  (calling AppKit from the hotkey background thread crashed on every recording)
- toggle: add `ariaLabel` prop so switches with an external label still expose
  an accessible name; pass it at all three call sites
- modal: keep onClose in a ref so focus restoration only runs on close (not on
  every re-render); make initial focus fall back to the panel; exclude disabled
  controls from the focus-trap selector

Other:
- use-fft-bars: gate the rAF loop on `active` so it idles instead of running
  at 60fps for the app's lifetime (fixes idle CPU/heap churn)
- native macOS traffic lights (titleBarStyle Overlay) + premium redesign of
  Dashboard/Settings (PageHeader, icon stat cards, spacing, type scale)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

1 issue found across 25 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src-tauri/src/window/widget.rs">

<violation number="1" location="src-tauri/src/window/widget.rs:16">
P2: Main-thread dispatch errors are silently ignored, so widget visibility updates can fail without any signal.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Fix all with cubic | Re-trigger cubic

if !panel.is_visible() {
panel.order_front_regardless();
let app = app_handle.clone();
let _ = app_handle.run_on_main_thread(move || {

@cubic-dev-ai cubic-dev-ai Bot Jun 5, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: Main-thread dispatch errors are silently ignored, so widget visibility updates can fail without any signal.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src-tauri/src/window/widget.rs, line 16:

<comment>Main-thread dispatch errors are silently ignored, so widget visibility updates can fail without any signal.</comment>

<file context>
@@ -7,28 +7,36 @@ use tauri::{AppHandle, LogicalSize, Manager, PhysicalPosition, WebviewWindow};
-            if !panel.is_visible() {
-                panel.order_front_regardless();
+    let app = app_handle.clone();
+    let _ = app_handle.run_on_main_thread(move || {
+        #[cfg(target_os = "macos")]
+        {
</file context>
Fix with cubic

@Lionvsx Lionvsx merged commit 92643cc into fix/toggle-widget-ui-polish Jun 6, 2026
8 checks passed
@Lionvsx Lionvsx deleted the ui/emil-design-pass branch June 6, 2026 14:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant