Skip to content

Conversation

@alina-dvloper
Copy link

@alina-dvloper alina-dvloper commented Sep 3, 2025

Problem

  • Mobile UI was completely broken on all device sizes
  • Textarea displayed text vertically instead of horizontally
  • Tables were unreadable on mobile due to lack of responsive design
  • Workflows and other sections had poor mobile UX
  • No consistent mobile experience across different screen sizes

BEFORE

before1
before2

AFTER

AFTER1
AFTER2
AFTER3

Solution

  • Mobile responsiveness: Added comprehensive CSS media queries for all screen sizes
  • Textarea fix: Fixed text orientation using writing-mode: horizontal-tb properties
  • Table handling: Implemented horizontal scroll for mobile table viewing
  • Cross-device testing: Ensured consistent behavior from iPhone SE (375px) to iPhone 14 Pro Max (428px)
  • Progressive enhancement: Desktop functionality remains unchanged

Files Changed

  • skyvern-frontend/src/index.css - Added mobile-responsive CSS
  • skyvern-frontend/src/routes/workflows/Workflows.tsx - Mobile / Tablet improvements for the workflows page
  • skyvern-frontend/src/routes/workflows/Workflows.module.css - new Mobile / Tablet styles for the workflows page

Testing Completed

  • iPhone SE (375px) - Clean horizontal input, responsive layout
  • iPhone XR (414px) - Perfect mobile experience
  • iPhone 14 Pro Max (428px) - Consistent behavior
  • Samsung Galaxy S8+ - Proper text orientation
  • Tablet sizes (768px+) - Responsive design
  • Desktop - No regressions

Impact

This PR significantly improves mobile UX for all Skyvern users on mobile/tablet devices, making Skyvern fully usable on all devices.


📱 This PR comprehensively fixes mobile responsiveness issues across the Skyvern frontend, addressing broken UI elements like vertically-displayed text in textareas and unreadable tables on mobile devices. The changes implement responsive design patterns with CSS media queries and component-specific mobile styling to ensure consistent UX across all device sizes from iPhone SE to desktop.

🔍 Detailed Analysis

Key Changes

  • Global Mobile CSS: Added comprehensive mobile responsiveness rules in index.css with media queries for screens ≤768px, fixing textarea text orientation and input field behavior
  • Workflows Page Redesign: Created dedicated mobile styles in Workflows.module.css with responsive layouts for headers, search components, tables, and navigation elements
  • Component Integration: Updated Workflows.tsx to apply mobile-specific CSS classes using conditional styling with cn() utility
  • Dependency Updates: Downgraded React type definitions to ensure compatibility and consistency across the project

Technical Implementation

flowchart TD
    A[Mobile Device Access] --> B[CSS Media Query Detection]
    B --> C{Screen Width ≤ 768px?}
    C -->|Yes| D[Apply Mobile Styles]
    C -->|No| E[Use Default Desktop Styles]
    D --> F[Fix Textarea Orientation]
    D --> G[Responsive Table Layout]
    D --> H[Mobile Button Sizing]
    D --> I[Single Column Grid]
    F --> J[Horizontal Text Display]
    G --> K[Horizontal Scroll for Tables]
    H --> L[44px Touch Target Size]
    I --> M[Stacked Layout Elements]
Loading

Impact

  • User Experience: Transforms completely broken mobile UI into fully functional responsive design across iPhone SE (375px) to iPhone 14 Pro Max (428px) and Android devices
  • Accessibility: Implements proper touch target sizes (44px minimum) and readable font sizes (16px) following mobile accessibility guidelines
  • Cross-Platform Compatibility: Ensures consistent behavior across different browsers and devices while maintaining desktop functionality unchanged
  • Maintainability: Uses modular CSS approach with dedicated mobile stylesheets, making future mobile improvements easier to implement

Created with Palmier


Important

Improves mobile responsiveness and UI for the Workflows section with CSS adjustments and layout changes.

  • Mobile Responsiveness:
    • Added CSS media queries in index.css for screen sizes up to 768px.
    • Implemented mobile-specific styles in Workflows.module.css for the Workflows page.
    • Adjusted layout and styles in Workflows.tsx using styles from Workflows.module.css.
  • Textarea and Input Fixes:
    • Fixed text orientation and size for textarea and input fields in index.css.
  • Table and Layout Adjustments:
    • Enabled horizontal scrolling for tables in index.css and Workflows.module.css.
    • Adjusted grid and container layouts for mobile in index.css.
  • Package Updates:
    • Downgraded @types/react and @types/react-dom in package.json to version 18.2.0.

This description was created by Ellipsis for 42eadb2. You can customize this summary. It will automatically update as commits are pushed.

Summary by CodeRabbit

  • New Features
    • Mobile-responsive redesign across Run History and Workflows pages: single-column layouts, scrollable tables, improved headers, truncation with titles, and touch-friendly pagination.
    • Global mobile styles: prevent horizontal scroll, better input/textarea behavior, adjusted headings, grids, and container padding.
  • Refactor
    • Restructured page layouts to support responsive styling without changing navigation or data behavior.
  • Chores
    • Updated development type definitions for React and React DOM.

- Fix vertical text display in textarea on mobile devices
- Add responsive design for iPhone SE, XR, 14 Pro Max, and Android devices
- Improve table responsiveness with horizontal scroll
- Enhance workflows section mobile layout
- Textarea now behaves like normal search input
- Tested across multiple device sizes and browsers
Copy link
Contributor

@ellipsis-dev ellipsis-dev bot left a comment

Choose a reason for hiding this comment

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

Important

Looks good to me! 👍

Reviewed everything up to 42eadb2 in 1 minute and 38 seconds. Click for details.
  • Reviewed 398 lines of code in 4 files
  • Skipped 1 files when reviewing.
  • Skipped posting 4 draft comments. View those below.
  • Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.
1. skyvern-frontend/package.json:77
  • Draft comment:
    The versions for @types/react and @types/react-dom were changed from '^18.2.64' to '^18.2.0'. Please confirm that this deliberate downgrade won’t affect type compatibility.
  • Reason this comment was not posted:
    Decided after close inspection that this draft comment was likely wrong and/or not actionable: usefulness confidence = 10% vs. threshold = 50% This is a dependency-related comment about TypeScript type definitions. Our rules explicitly state not to comment on dependency changes or library versions. Additionally, the comment is asking for confirmation rather than pointing out a definite issue. The actual React version matches the type definitions version now, which might even be more correct. Maybe there could be breaking changes in the type definitions that would cause real issues? The comment might be trying to prevent a regression. While type compatibility is important, this is still fundamentally a dependency version change. Our rules clearly state to not comment on dependency changes or versions we don't recognize. The build system would catch any type incompatibilities. Delete this comment as it violates multiple rules: it's about dependencies, asks for confirmation rather than pointing out a definite issue, and any real problems would be caught by the build.
2. skyvern-frontend/src/index.css:121
  • Draft comment:
    The mobile responsiveness block uses '!important' on many properties. Consider using more specific selectors or restructuring the CSS to reduce reliance on '!important' for maintainability.
  • Reason this comment was not posted:
    Decided after close inspection that this draft comment was likely wrong and/or not actionable: usefulness confidence = 20% vs. threshold = 50% While excessive !important usage is generally considered bad practice in CSS, these appear to be intentionally used to override existing styles for mobile-specific fixes. The consistent pattern and specific targeting suggests this was a deliberate choice to ensure mobile styles take precedence. The comment suggests restructuring but doesn't provide specific guidance on how. The comment may be overlooking that !important could be necessary here to override framework styles or third-party components. Mobile fixes often legitimately need high specificity. While reducing !important usage would be nice, without understanding the full CSS cascade and what styles these need to override, removing them could break mobile functionality. The comment should be deleted as it makes a general suggestion without providing actionable guidance, and the !important usage may be intentional and necessary for mobile fixes.
3. skyvern-frontend/src/routes/workflows/Workflows.module.css:6
  • Draft comment:
    Mobile-specific styles use '!important' extensively. While this may be necessary to override existing styles, consider if more targeted selectors can be used to improve future maintainability.
  • Reason this comment was not posted:
    Decided after close inspection that this draft comment was likely wrong and/or not actionable: usefulness confidence = 20% vs. threshold = 50% While excessive use of !important is generally considered bad practice, this appears to be a deliberate mobile override stylesheet. The mobile- prefix suggests this is intentionally overriding desktop styles. Without seeing the base styles being overridden, we can't know if more specific selectors would work. The consistent pattern suggests this was an intentional architectural decision. I might be too quick to dismiss a valid concern about CSS maintainability. The use of !important could make future style changes more difficult. However, mobile override stylesheets often need !important to guarantee they take precedence, and the consistent naming convention suggests this is a deliberate pattern rather than a maintainability issue. The comment should be deleted as it questions an apparently intentional architectural decision without having full context of the styling system.
4. skyvern-frontend/src/routes/workflows/Workflows.tsx:116
  • Draft comment:
    The mobile UI integrations via CSS modules look well integrated. As a minor suggestion, consider memoizing inline event handlers (e.g., handleRowClick, handleIconClick) if performance becomes critical, though this is not an immediate issue.
  • Reason this comment was not posted:
    Confidence changes required: 33% <= threshold 50% None

Workflow ID: wflow_QnakQ3ES1jlBCdla

You can customize Ellipsis by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.

@wintonzheng
Copy link
Contributor

@jomido for review

@suchintan
Copy link
Contributor

@jomido bump

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 7, 2025

Walkthrough

Adds mobile-responsive styles across the frontend, introduces CSS modules for Run History and Workflows, and restructures their JSX to use mobile-oriented containers, tables, and pagination. Updates row click navigation targets and accessibility titles. Also adjusts devDependency pins for React type definitions.

Changes

Cohort / File(s) Summary
Frontend dependencies
skyvern-frontend/package.json
Pin devDependencies: @types/react to ^18.2.0 and @types/react-dom to ^18.2.0; no runtime logic changes.
Global mobile styles
skyvern-frontend/src/index.css
Adds @media (max-width: 768px) rules for textarea/input behavior, table overflow, body/container/grid spacing, and mobile heading sizes.
Run History responsive refactor
skyvern-frontend/src/routes/history/RunHistory.module.css, skyvern-frontend/src/routes/history/RunHistory.tsx
Introduces CSS module and rewrites layout to mobile-first containers/wrappers; mobile table structure, titles for truncated cells, updated row navigation: tasks → /tasks/{task_id}/actions, workflows → /workflows/{workflow_permanent_id}/{workflow_run_id}/overview; skeleton and pagination styled for mobile.
Workflows responsive refactor
skyvern-frontend/src/routes/workflows/Workflows.module.css, skyvern-frontend/src/routes/workflows/Workflows.tsx
Adds CSS module and applies mobile-oriented wrappers for header, controls, cards, table, and pagination; refactors table DOM while preserving behavior, tooltips, and actions; integrates Tailwind with module styles.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant RunHistory as RunHistory UI
  participant Router as Client Router

  User->>RunHistory: Tap a row
  alt Task row
    RunHistory->>Router: navigate(/tasks/{task_id}/actions)
  else Workflow row
    RunHistory->>Router: navigate(/workflows/{workflow_permanent_id}/{workflow_run_id}/overview)
  end
Loading
sequenceDiagram
  autonumber
  actor User
  participant Workflows as Workflows UI
  participant Router as Client Router

  User->>Workflows: Tap workflow row
  Workflows->>Router: navigate(/workflows/{permanent_id}/{run_id}/overview)
  Note over Workflows: Mobile wrappers/table adjust layout only
  User->>Workflows: Use pagination/search/actions
  Workflows->>Workflows: Update UI state within mobile containers
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested labels

sync, jomido

Poem

I thump my paws in CSS delight,
Media queries tuck the UI tight.
Tables glide, rows tap—whoosh, away!
Workflows, histories, both okay.
Type pins snug like burrow doors,
Mobile moons, responsive floors.
Hippity-hop—ship it, of course! 🐇✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title succinctly captures the primary change by emphasizing mobile responsiveness and UI improvements across the application, which aligns directly with the PR’s objectives. It is concise and specific without extraneous detail, making the main purpose clear to anyone scanning the pull request.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

This is the final PR Bugbot will review for you during this billing cycle

Your free Bugbot reviews will reset on November 13

Details

You are on the Bugbot Free tier. On this plan, Bugbot will review limited PRs each billing cycle.

To receive Bugbot reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

<div className="flex items-center gap-2">
<span title="Ran with code">
<LightningBoltIcon className="text-[gold]" />
</span>
Copy link

Choose a reason for hiding this comment

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

Bug: TypeScript Assertion Bypass and Unused Import

The (run as any).script_run assertion bypasses TypeScript's type safety, potentially causing runtime errors if the script_run property is missing from the run object. Additionally, replacing the Tip component with a basic span removes interactive tooltip functionality and leaves an unused import.

Fix in Cursor Fix in Web

Copy link
Contributor

Choose a reason for hiding this comment

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

What the bot said.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (4)
skyvern-frontend/src/index.css (2)

119-201: Reduce reliance on !important declarations.

This mobile responsive block applies !important to nearly every CSS property (50+ instances). This pattern suggests underlying specificity conflicts that should be resolved through proper CSS architecture rather than force-overriding.

Excessive !important usage:

  • Makes future maintenance and debugging difficult
  • Can create specificity wars when styles need adjustment
  • Masks the root cause of styling conflicts
  • Reduces code maintainability

Consider these approaches:

  1. Increase selector specificity naturally (e.g., body textarea instead of textarea)
  2. Scope mobile styles within a higher-specificity container
  3. Use Tailwind's responsive prefixes where possible (md:, sm:)
  4. Review the source of conflicting styles and adjust their specificity

If Tailwind utilities are the source of conflicts, consider using @layer to control cascade order or applying mobile classes more selectively in components.


120-120: Minor: Fix comment formatting.

The comment has inconsistent spacing (double space after "Fixes").

-/* Mobile Responsiveness Fixes  */
+/* Mobile Responsiveness Fixes */
skyvern-frontend/src/routes/history/RunHistory.module.css (1)

1-136: Reduce !important declarations and consider extracting shared styles.

This CSS module has the same issues as Workflows.module.css:

  1. Excessive !important usage (60+ declarations) - see the detailed comment in Workflows.module.css for approaches to resolve this.

  2. Code duplication: Many class definitions are nearly identical between RunHistory.module.css and Workflows.module.css:

    • .mobileContainer / .mobileMainContainer
    • .mobileTableContainer / .mobileTableWrapper / .mobileTable
    • .mobilePagination
    • Table cell sizing and overflow handling

Consider creating a shared CSS module for common mobile table styles:

/* shared/mobile-table.module.css */
@media (max-width: 768px) {
  .container { /* common container styles */ }
  .tableContainer { /* common table container styles */ }
  .table { /* common table styles */ }
  .pagination { /* common pagination styles */ }
}

Then import and compose in both files:

import sharedStyles from '@/shared/mobile-table.module.css';
import styles from './RunHistory.module.css';

<div className={cn(sharedStyles.container, styles.specificStyles)}>

This reduces duplication and ensures consistent mobile behavior across tables.

skyvern-frontend/src/routes/workflows/Workflows.tsx (1)

5-5: Remove unnecessary React import.

With React 18 and the new JSX transform, explicitly importing React is no longer required. The build configuration should handle JSX transformation automatically.

Remove the unused import:

-import React from "react";
 import {
   Pagination,

If there are specific React APIs being used (e.g., React.MouseEvent), those types should be imported explicitly:

import type { MouseEvent } from "react";
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d7fe7b6 and dc845f7.

⛔ Files ignored due to path filters (1)
  • skyvern-frontend/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (6)
  • skyvern-frontend/package.json (1 hunks)
  • skyvern-frontend/src/index.css (1 hunks)
  • skyvern-frontend/src/routes/history/RunHistory.module.css (1 hunks)
  • skyvern-frontend/src/routes/history/RunHistory.tsx (4 hunks)
  • skyvern-frontend/src/routes/workflows/Workflows.module.css (1 hunks)
  • skyvern-frontend/src/routes/workflows/Workflows.tsx (8 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
skyvern-frontend/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

skyvern-frontend/**/*.{ts,tsx}: TypeScript in skyvern-frontend must be linted with ESLint and formatted with Prettier
Enforce a maximum line length of 120 characters in frontend TypeScript files

Files:

  • skyvern-frontend/src/routes/workflows/Workflows.tsx
  • skyvern-frontend/src/routes/history/RunHistory.tsx
🧬 Code graph analysis (2)
skyvern-frontend/src/routes/workflows/Workflows.tsx (1)
skyvern-frontend/src/util/utils.ts (1)
  • cn (4-6)
skyvern-frontend/src/routes/history/RunHistory.tsx (4)
skyvern-frontend/src/util/utils.ts (1)
  • cn (4-6)
skyvern-frontend/src/components/StatusBadge.tsx (1)
  • StatusBadge (35-35)
skyvern-frontend/src/util/timeFormat.ts (2)
  • basicTimeFormat (72-72)
  • basicLocalTimeFormat (71-71)
skyvern-frontend/src/components/ui/pagination.tsx (1)
  • Pagination (118-118)
🔇 Additional comments (5)
skyvern-frontend/src/index.css (1)

129-130: Touch target sizes meet WCAG requirements.

The minimum touch target sizes are correctly set to 44px for mobile interactions (line 129: min-height: 44px, line 142: min-height: 44px), which meets WCAG 2.1 Level AAA guidelines (Target Size 2.5.5).

Also applies to: 142-143, 161-163

skyvern-frontend/src/routes/workflows/Workflows.tsx (1)

161-167: Mobile-responsive class application looks good.

The use of the cn() utility to compose Tailwind classes with CSS module classes is appropriate and follows best practices. The mobile-specific containers are consistently applied throughout the component hierarchy.

Also applies to: 168-173, 184-184, 199-208, 220-220, 223-223, 230-230, 241-243, 373-373, 398-400

skyvern-frontend/src/routes/history/RunHistory.tsx (3)

103-109: Mobile-responsive styling consistently applied.

The CSS module integration follows the same pattern as Workflows.tsx, with appropriate use of cn() for class composition. The mobile container hierarchy (mobileContainer → mobileMainContainer → mobileTableContainer → mobileTableWrapper → mobileTable) provides good structure for responsive layouts.

Also applies to: 110-110, 117-230, 251-251


180-190: Nice UX enhancement with script run indicator.

The gold lightning bolt icon for script runs (script_run === true) provides clear visual feedback to users about how the workflow was executed. The tooltip "Ran with code" adds helpful context.


157-158: Navigation routes validated
The paths /tasks/:taskId/actions and /workflows/:workflowPermanentId/:workflowRunId/overview are defined in src/router.tsx (with TaskActions and WorkflowRunOverview handlers). No existing deep links are affected.

Comment on lines +79 to +80
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0",
Copy link
Contributor

@coderabbitai coderabbitai bot Oct 7, 2025

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

🧩 Analysis chain

Verify the necessity of downgrading type definitions.

Downgrading @types/react and @types/react-dom from higher patch versions (^18.2.64 and ^18.2.21) to ^18.2.0 is unusual for dev dependencies. Type definition patches typically add fixes and improvements without breaking changes.

The PR description mentions this is for "compatibility" but doesn't specify what issue this resolves. If there were type errors with the newer versions, those may indicate legitimate type issues in the code that are now being masked.

Please clarify:

  1. What specific compatibility issue required this downgrade?
  2. Were there build or type errors with the previous versions?
  3. Could we address the root cause instead of downgrading?

Run the following to check for any type errors after reverting to the previous versions:


🏁 Script executed:

#!/bin/bash
# Description: Test if there are type errors with newer type definition versions
# Expected: Build completes without errors, or shows specific errors to address

cd skyvern-frontend

# Temporarily upgrade back to check
npm install --save-dev @types/react@^18.2.64 @types/react-dom@^18.2.21

# Run type check
npm run build 2>&1 | tee /tmp/typecheck.log

# Show any errors
if grep -i "error" /tmp/typecheck.log; then
  echo "=== Type errors found with newer versions ==="
  grep -i "error" /tmp/typecheck.log | head -20
else
  echo "=== No type errors found - downgrade may not be necessary ==="
fi

Length of output: 812


🏁 Script executed:

#!/bin/bash
cd skyvern-frontend

# Upgrade back to latest patch versions
npm install --save-dev @types/react@latest @types/react-dom@latest

# Run type check and capture output
npm run build > /tmp/typecheck.log 2>&1 || true

# Report any errors
if grep -i "error" /tmp/typecheck.log; then
  echo "=== Type errors found with newer versions ==="
  grep -i "error" /tmp/typecheck.log | head -20
else
  echo "=== No type errors found - downgrade may not be necessary ==="
fi

Length of output: 16599


Fix type errors rather than downgrading @types packages.

  • FloatingWindow.tsx(459,24): guard parentBottom before use.
  • ui/command.tsx(31,11): align ReactNode import with cmdk’s @types/react.
  • RunHistory.tsx: remove unused Tip.
  • FlowRenderer.tsx(523,14): adjust ref to RefObject<HTMLDivElement | null>.

Once these are addressed, restore @types/react and @types/react-dom to the latest patch.

🤖 Prompt for AI Agents
In skyvern-frontend/package.json lines ~79-80 and across the files referenced:
Fix the TypeScript type errors instead of downgrading @types/react and
@types/react-dom; in FloatingWindow.tsx (around line 459) add a null/undefined
guard for parentBottom before it is accessed (e.g., check existence or use
optional chaining) so the value is not used when absent; in ui/command.tsx
(around line 31) import ReactNode in a way compatible with cmdk’s @types/react
(align the import style to the project’s React types, e.g., import type {
ReactNode } from 'react'); in RunHistory.tsx remove the unused Tip identifier
and any associated imports/usages; in FlowRenderer.tsx (around line 523) change
the ref type to RefObject<HTMLDivElement | null> so assignments are type-safe;
after these fixes, restore @types/react and @types/react-dom to the latest patch
versions in package.json.

Copy link
Contributor

Choose a reason for hiding this comment

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

Why did you bump the version of these types down? The hare seems to think it's to fix type issues. That's likely the wrong way to go.

Copy link
Contributor

Choose a reason for hiding this comment

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

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Comment on lines +1 to +207
/* Mobile-specific styles for Workflows page */
@media (max-width: 768px) {
.mobileMainContainer {
padding: 0 1rem !important;
overflow-x: hidden !important;
}

/* Header section */
.mobileHeaderContainer {
flex-direction: column !important;
height: auto !important;
gap: 1rem !important;
margin-bottom: 2rem !important;
}

.mobileNarrativeCards {
flex-direction: column !important;
gap: 0.75rem !important;
width: 100% !important;
margin-top: 1rem !important;
}

.mobileNarrativeCards > * {
width: 100% !important;
max-width: 100% !important;
min-width: auto !important;
font-size: 0.875rem !important;
padding: 1rem !important;
}

.mobileHeaderContent {
width: 100% !important;
}

.mobileFlowsSection {
margin-top: 2rem !important;
}

.mobileFlowsHeader {
margin-bottom: 1rem !important;
}

.mobileSearchButtonContainer {
flex-direction: column !important;
gap: 1rem !important;
align-items: stretch !important;
width: 100% !important;
}

.mobileSearchContainer {
width: 100% !important;
max-width: 100% !important;
}

.mobileSearchInput {
width: 100% !important;
max-width: 100% !important;
min-height: 44px !important;
font-size: 16px !important;
box-sizing: border-box !important;
}

.mobileButtonContainer {
display: flex !important;
gap: 0.75rem !important;
width: 100% !important;
justify-content: center !important;
align-items: center !important;
}

.mobileButton {
min-height: 44px !important;
font-size: 0.875rem !important;
padding: 0.75rem 1.5rem !important;
flex: 0 1 auto !important;
}

.mobileButtonContainer > * {
min-height: 44px !important;
}

.mobileTableContainer {
width: 100% !important;
margin: 0 !important;
border-radius: 0.5rem !important;
overflow: hidden !important;
}

.mobileTableWrapper {
overflow-x: auto !important;
-webkit-overflow-scrolling: touch !important;
width: 100% !important;
max-width: 100vw !important;
}

.mobileTable {
min-width: 100% !important;
width: 100% !important;
font-size: 0.875rem !important;
margin: 0 !important;
table-layout: fixed !important;
}

.mobileTable th,
.mobileTable td {
padding: 0.75rem 0.5rem !important;
font-size: 0.875rem !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
}

.mobileTable th {
font-size: 0.75rem !important;
font-weight: 600 !important;
}

.mobileTable th:nth-child(1),
.mobileTable td:nth-child(1) {
width: 80px !important;
min-width: 80px !important;
max-width: 80px !important;
font-size: 0.75rem !important;
}

.mobileTable th:nth-child(2),
.mobileTable td:nth-child(2) {
width: 40% !important;
min-width: 120px !important;
max-width: 150px !important;
}

.mobileTable th:nth-child(3),
.mobileTable td:nth-child(3) {
width: 100px !important;
min-width: 100px !important;
max-width: 100px !important;
font-size: 0.75rem !important;
}

.mobileTable th:nth-child(4),
.mobileTable td:nth-child(4) {
width: 120px !important;
min-width: 120px !important;
max-width: 120px !important;
}

.mobileTableActions button {
min-height: 40px !important;
min-width: 40px !important;
}

.mobilePagination {
padding-top: 0 !important;
width: 100% !important;
justify-content: center !important;
margin-top: 1rem !important;
}

.mobilePagination button {
min-height: 44px !important;
min-width: 44px !important;
font-size: 0.875rem !important;
}

.mobileContainer {
max-width: 100vw !important;
overflow-x: hidden !important;
box-sizing: border-box !important;
}

.mobileWorkflowTemplates {
width: 100% !important;
overflow-x: hidden !important;
}

.mobileTableContainer div[class*="relative px-3 py-3"] {
position: static !important;
padding: 1rem !important;
display: flex !important;
flex-direction: column !important;
gap: 1rem !important;
}

.mobileTableContainer div[class*="absolute left-3"] {
position: static !important;
transform: none !important;
display: flex !important;
flex-direction: column !important;
align-items: center !important;
text-align: center !important;
}

.mobileTableContainer select {
width: 100% !important;
max-width: 200px !important;
min-height: 44px !important;
font-size: 16px !important;
text-align: center !important;
}

.mobileTableContainer .text-slate-400 {
font-size: 0.875rem !important;
text-align: center !important;
margin-bottom: 0.5rem !important;
}
}
Copy link
Contributor

@coderabbitai coderabbitai bot Oct 7, 2025

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Excessive !important usage in CSS module.

This CSS module contains over 100 !important declarations. CSS Modules already provide scoping through unique class names, so this level of !important usage is unexpected and problematic.

The heavy reliance on !important:

  • Suggests conflicts with global styles or Tailwind utilities that should be resolved differently
  • Negates the benefits of CSS Module scoping
  • Makes it difficult to override these styles when needed (e.g., for themes or variants)
  • Creates a maintenance burden

Recommended approaches:

  1. Review Tailwind conflicts: If fighting Tailwind utilities, apply mobile classes directly in JSX using Tailwind's responsive prefixes (md:, sm:, lg:)
  2. Increase natural specificity: Use nested selectors or combine with element selectors
  3. Layer ordering: Ensure CSS module imports come after global styles
  4. Compose classes: Use the cn() utility to properly merge Tailwind and module classes

Example refactor:

/* Instead of: */
.mobileButton {
  min-height: 44px !important;
  font-size: 0.875rem !important;
}

/* Use: */
.mobileButton {
  min-height: 44px;
  font-size: 0.875rem;
}

Then in JSX, ensure module classes are applied after Tailwind classes in the cn() call so they naturally override.

🤖 Prompt for AI Agents
In skyvern-frontend/src/routes/workflows/Workflows.module.css lines 1-207, the
file contains excessive use of !important on virtually every rule which fights
Tailwind/global styles and negates CSS Module scoping; remove the majority of
!important declarations, keep only those that are strictly unavoidable, and
replace overrides by applying responsive Tailwind classes directly in JSX (e.g.,
sm:/md: prefixes) or by increasing selector specificity (nesting or
element+class combos) where needed; ensure the CSS module is imported after
global styles and use the cn() utility to compose module classes with Tailwind
so module rules naturally override without !important.

Copy link
Contributor

Choose a reason for hiding this comment

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

Follow the advice from the rabbit, pls. !important has its uses, but you've used it way to much in this PR.

Copy link
Contributor

Choose a reason for hiding this comment

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

@jomido Thank you for reinforcing this feedback! The excessive !important usage is indeed a significant concern that should be addressed before merging.

@alina-dvloper, if you need any help implementing the refactoring suggestions I provided earlier (removing !important declarations, using Tailwind responsive prefixes, or increasing selector specificity), feel free to ask. I'm happy to provide specific examples for any parts you're unsure about.

@jomido
Copy link
Contributor

jomido commented Oct 7, 2025

Hey, thanks for the submission!

Hm the /history page doesn't quite look right on narrow views:

image

The "Items per Page" is extra wide at /workflows, and the buttons are spaced incorrectly:

image

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.

4 participants