From 91a86134dd50c21fde4bc975d67705bd352186c7 Mon Sep 17 00:00:00 2001 From: jjunier Date: Tue, 19 May 2026 18:25:56 +0900 Subject: [PATCH] feat(layout): add common footer service info section [D2C-57] - add shared footer with service, purchase flow and implementation scope sections - add GitHub repository link with inline GitHub icon - improve footer copyright and repository metadata - fix sticky footer layout for short content pages --- apps/web/src/components/layout/MainLayout.tsx | 62 +++++++++ apps/web/src/styles/global.css | 127 ++++++++++++++++++ 2 files changed, 189 insertions(+) diff --git a/apps/web/src/components/layout/MainLayout.tsx b/apps/web/src/components/layout/MainLayout.tsx index a02e2d3..ed406da 100644 --- a/apps/web/src/components/layout/MainLayout.tsx +++ b/apps/web/src/components/layout/MainLayout.tsx @@ -62,6 +62,68 @@ export function MainLayout() {
+ + ); } \ No newline at end of file diff --git a/apps/web/src/styles/global.css b/apps/web/src/styles/global.css index e278d3b..a8852d7 100644 --- a/apps/web/src/styles/global.css +++ b/apps/web/src/styles/global.css @@ -38,7 +38,9 @@ textarea { /* App layout */ .app-shell { + display: flex; min-height: 100vh; + flex-direction: column; background-color: #f8fafc; } @@ -81,11 +83,118 @@ textarea { } .app-main { + flex: 1; + display: flex; width: min(1180px, calc(100% - 48px)); margin: 0 auto; padding: 48px 0; } +.app-main > * { + width: 100%; +} + +/* App footer */ +.app-footer { + margin-top: auto; + border-top: 1px solid #e5e7eb; + background-color: #ffffff; +} + +.app-footer-inner { + display: grid; + width: min(1180px, calc(100% - 48px)); + grid-template-columns: minmax(0, 1.4fr) minmax(0, 2fr); + gap: 48px; + margin: 0 auto; + padding: 40px 0 28px; +} + +.app-footer-brand { + display: flex; + flex-direction: column; + gap: 12px; +} + +.app-footer-brand h2 { + margin: 0; + color: #111827; + font-size: 22px; + font-weight: 900; + letter-spacing: -0.03em; +} + +.app-footer-brand p { + max-width: 420px; + margin: 0; + color: #4b5563; + font-size: 14px; + line-height: 1.75; + word-break: keep-all; +} + +.app-footer-nav { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 28px; +} + +.app-footer-nav div { + display: flex; + flex-direction: column; + gap: 10px; +} + +.app-footer-nav h3 { + margin: 0 0 4px; + color: #111827; + font-size: 14px; + font-weight: 900; +} + +.app-footer-nav a, +.app-footer-nav span { + width: fit-content; + color: #6b7280; + font-size: 14px; + line-height: 1.5; +} + +.app-footer-nav a:hover { + color: #111827; +} + +.app-footer-bottom { + display: flex; + width: min(1180px, calc(100% - 48px)); + justify-content: space-between; + gap: 16px; + margin: 0 auto; + padding: 18px 0 28px; + border-top: 1px solid #f3f4f6; + color: #9ca3af; + font-size: 13px; +} + +.app-footer-repository-link { + display: inline-flex; + align-items: center; + gap: 6px; + color: #6b7280; + font-size: 13px; + text-decoration: none; +} + +.app-footer-repository-link:hover { + color: #111827; +} + +.app-footer-github-icon { + width: 16px; + height: 16px; + flex-shrink: 0; +} + /* Shared actions */ .link-button { border: 0; @@ -2064,6 +2173,11 @@ textarea { } @media (max-width: 900px) { + .app-footer-inner { + grid-template-columns: 1fr; + gap: 28px; + } + .product-detail-layout, .cart-layout { grid-template-columns: 1fr; @@ -2110,6 +2224,19 @@ textarea { grid-template-columns: 1fr; } + .app-footer-inner, + .app-footer-bottom { + width: min(100% - 32px, 1180px); + } + + .app-footer-nav { + grid-template-columns: 1fr; + } + + .app-footer-bottom { + flex-direction: column; + } + .product-list-toolbar { align-items: flex-start; flex-direction: column;