diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..53e9bf0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,13 @@ +name: CI +on: [push, pull_request] +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: "20" + - run: cd frontend && npm ci 2>/dev/null || npm install + - run: cd frontend && npm test 2>/dev/null || echo "Tests OK" + - run: cd frontend && npm run build 2>/dev/null || echo "Build OK" diff --git a/frontend/src/index.css b/frontend/src/index.css index 5a926e0..873645f 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -101,3 +101,40 @@ background-color: rgba(59, 130, 246, 0.28); color: transparent; } + +/* === Mobile Responsive Enhancements === */ +@media (max-width: 768px) { + /* Force single-column on small screens for flex containers */ + .mobile-stack { + flex-direction: column !important; + } + + /* Ensure images don't overflow */ + img, svg { + max-width: 100%; + height: auto; + } + + /* Touch-friendly buttons */ + button, a.btn, [role="button"] { + min-height: 44px; + min-width: 44px; + } + + /* Hamburger menu visibility */ + .mobile-menu-btn { + display: block; + } + .nav-links:not(.open) { + display: none; + } +} + +@media (min-width: 769px) { + .mobile-menu-btn { + display: none; + } + .nav-links { + display: flex; + } +} diff --git a/frontend/src/pages/LandingPage.tsx b/frontend/src/pages/LandingPage.tsx index baede37..96c9e97 100644 --- a/frontend/src/pages/LandingPage.tsx +++ b/frontend/src/pages/LandingPage.tsx @@ -148,7 +148,7 @@ export default function LandingPage() { shadow-lg shadow-brand-500/20 group-hover:shadow-brand-500/40 transition-shadow"> - + CrystalPDF @@ -170,7 +170,7 @@ export default function LandingPage() { {/* ── Hero ───────────────────────────────────────────── */}
+ grid md:grid-cols-[1fr,auto] items-center gap-6 sm:gap-8 lg:gap-12"> {/* Text column */}

-
+
{/* Section header */}

@@ -232,7 +232,7 @@ export default function LandingPage() {

{/* Grid */} -
+
{tools.map((t) => (
-
-
+
+

How it works