--- name: front-design description: "WebAuthn TODOアプリのフロントエンドデザインシステム(katasu.meインスパイア)をプロジェクトに適用するスキル。CSS変数・コンポーネントクラス・HTMLパターン・Googleフォントを丸ごとプロジェクトに取り込む。「デザインを適用して」「katasu.meスタイルにして」「CSSシステムを入れて」「WebAuthnのデザインを使いたい」などと言ったときに使用する。" --- # WebAuthn Front Design katasu.me にインスパイアされたデザインシステムを現在のプロジェクトに適用するスキル。 CSS 変数・コンポーネントクラス・HTML パターンをそのまま利用できる。 ## デザインの特徴 - **カラーパレット**: 温かみのある低彩度ブラウン系(katasu.me インスパイア) - **フォント**: Reddit Sans + IBM Plex Sans JP(日本語対応) - **アニメーション**: `cubic-bezier(0.16, 1, 0.3, 1)` の弾むような ease - **最大幅**: 768px 中央寄せのシングルカラムレイアウト - **角丸**: 12px / 8px の2段階 --- ## Step 1: Google Fonts の読み込み `
` に以下を追加する: ```html ``` CSS ファイルの先頭に `@import` する場合: ```css @import url("https://fonts.googleapis.com/css2?family=Reddit+Sans:ital,wdth,wght@0,75..100,200..900;1,75..100,200..900&family=IBM+Plex+Sans+JP:wght@300;400;500;600;700&display=swap"); ``` --- ## Step 2: CSS 変数の定義 `:root` に以下の変数を追加する: ```css :root { /* カラーパレット (katasu.me インスパイア) */ --color-bg: #fefbfb; --color-text: #483030; --color-muted: #a39696; --color-border: #dfd7d7; --color-surface: #f2f0f0; --color-accent: #73862d; --color-danger: #ff340b; --color-sunday: #e05252; --color-saturday: #4a90d9; --font-size-base: 16px; /* フォント */ --font: "Reddit Sans", "IBM Plex Sans JP", BlinkMacSystemFont, sans-serif; /* アニメーション */ --ease: cubic-bezier(0.16, 1, 0.3, 1); --transition: all 0.4s var(--ease); /* レイアウト */ --max-w: 768px; --radius: 12px; --radius-sm: 8px; } ``` --- ## Step 3: ベーススタイルの適用 ```css *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { scroll-behavior: smooth; } body { font-family: var(--font); font-size: var(--font-size-base); color: var(--color-text); background: var(--color-bg); line-height: 1.65; -webkit-font-smoothing: antialiased; min-height: 100vh; } a { color: inherit; text-decoration: none; } button { cursor: pointer; font-family: var(--font); border: none; } ``` --- ## Step 4: コンポーネントクラスの追加 ### インタラクション (katasu.me スケールエフェクト) ```css .interactive-scale { transition: var(--transition); } .interactive-scale:hover { transform: scale(1.05); } .interactive-scale:active { transform: scale(0.95); } .interactive-scale-sm { transition: var(--transition); } .interactive-scale-sm:hover { transform: scale(1.02); } .interactive-scale-sm:active { transform: scale(0.98); } ``` ### ボタン ```css /* プライマリボタン: 黒背景・白文字 */ .btn-primary { display: inline-flex; align-items: center; justify-content: center; padding: 10px 22px; background: var(--color-text); color: var(--color-bg); border-radius: var(--radius-sm); font-size: 0.9rem; font-weight: 600; letter-spacing: 0.01em; transition: var(--transition); white-space: nowrap; } .btn-primary:hover:not(:disabled) { opacity: 0.85; } .btn-primary:disabled { opacity: 0.45; cursor: not-allowed; } .btn-primary.btn-lg { padding: 13px 30px; font-size: 1rem; border-radius: var(--radius); } .btn-primary.btn-full { width: 100%; } /* ゴーストボタン: 透明背景・ボーダー */ .btn-ghost { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 8px 16px; background: transparent; color: var(--color-muted); border: 1px solid var(--color-border); border-radius: var(--radius-sm); font-size: 0.875rem; font-weight: 500; transition: var(--transition); white-space: nowrap; text-decoration: none; } .btn-ghost:hover { color: var(--color-text); background: var(--color-surface); } .btn-ghost.btn-lg { padding: 12px 26px; font-size: 1rem; border-radius: var(--radius); } .btn-ghost.btn-sm { padding: 6px 12px; font-size: 0.8rem; } ``` ### カード ```css .card { background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--radius); padding: 1.5rem; } ``` ### タブ ```css .tab-btn { padding: 8px 16px; background: transparent; color: var(--color-muted); border-bottom: 2px solid transparent; border-radius: 0; font-size: 0.9rem; font-weight: 500; transition: var(--transition); white-space: nowrap; } .tab-btn.active, .tab-btn:hover { color: var(--color-text); border-bottom-color: var(--color-accent); } ``` ### フォームグループ ```css .form-group { display: flex; flex-direction: column; gap: 6px; } .form-group label { font-size: 0.875rem; font-weight: 500; color: var(--color-muted); } .form-group input, .form-group textarea, .form-group select { padding: 10px 14px; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-sm); font-family: var(--font); font-size: 0.95rem; color: var(--color-text); transition: border-color 0.2s; outline: none; } .form-group input:focus, .form-group textarea:focus, .form-group select:focus { border-color: var(--color-accent); } ``` ### ヘッダー ```css #site-header { position: sticky; top: 0; z-index: 100; background: var(--color-bg); border-bottom: 1px solid var(--color-border); } .header-inner { max-width: var(--max-w); margin: 0 auto; padding: 0 1.25rem; min-height: 56px; display: flex; align-items: center; justify-content: space-between; gap: 8px; } .logo { display: flex; align-items: center; gap: 8px; font-weight: 700; font-size: 1rem; color: var(--color-text); text-decoration: none; white-space: nowrap; flex-shrink: 0; transition: var(--transition); } .logo:hover { opacity: 0.75; } ``` --- ## HTML パターン ### ページ全体の構成 ```htmlコンテンツ