First CH Designs

Design Gallery

良いUIを、再現できるかたちで。

First CH の制作現場で生まれたUIを、ソースコードとAI Scriptつきでストックしています。コピーして、そのまま次のプロジェクトへ。

69件のデザイン

ACC-01

FAQアコーディオン

よくある質問の開閉リスト。JavaScript不要の<details>で実装し、開くとプラス記号が45度回って×になる。1問目のみ初期表示。

Elements
BDG-01

ステータスバッジ

管理画面や一覧で状態を示すバッジ。淡い背景色+ドットの組み合わせで、4状態(公開中・レビュー待ち・停止中・下書き)。

Elements
BTN-01

スタンダードボタン

白基調サイトの基本となる3種のボタン。プライマリ(アンバー)・セカンダリ(枠線)・テキストの優先度3段階で構成。

Elements
BTN-02

押し込み3Dボタンシステム

スクワークル形状に厚みを持たせ、押すと面だけが沈む触覚的なボタン群。トーン3種・サイズ3種・アイコン付き/アイコンのみ・トグル・無効・ステッパーまでを1つの規則(深さ/沈み込み=深さ−2px)で通した、フラットなスタンダードボタンの対になる系。動かすのは transform のみで、押下・トグルON・無効はすべて同じ「沈んだ面」で表す。

Elements

フィーチャーカード

サービス紹介や特徴一覧に使うリンクカード。見出し+説明文+矢印リンクのシンプル構成。ホバーで上部にアンバーの罫線が伸び、わずかに浮き上がる。

Elements
INP-01

テキストフィールド

お問い合わせフォームの基本入力欄。通常状態とエラー状態のセット。ラベル・ヘルパーテキスト・エラーメッセージを含む。

Elements
TYP-01

セクション見出し

LPやコーポレートサイトのセクション冒頭に置く見出しセット。英字アイブロウ+見出し+リード文+アンバーの短い罫線。

Typography
TYP-02

タイプライター+グリッチ見出し

文字送りの速さ・グリッチ量・ノイズの記号セットを、マークアップ側の data 属性で宣言する見出し。エンジンは props ではなくホスト要素の data-typed-* を毎フレーム読み直すので、実行中に属性を書き換えるだけで即反映され、同じ実装を素のHTML+Vanilla JSへそのまま移植できる(Reactは属性へ値を流すだけ)。属性は外部入力として扱い、読み取り時に必ず clamp する(speed=0の無限ループ・巨大なglitch値を弾く)。打ち替えでレイアウトが跳ねないよう、inline-grid の同じセルへ「最長フレーズのinvisibleサイザー」と「動く行」を重ねて箱の寸法を固定し、ノイズ文字は本文と同じ字幅の全角カナを既定にしてちらつきを消している。prefers-reduced-motion では停止ではなく完成形へ降格し(途中まで打った文字列で固まらせない)、打ち替わる側は aria-hidden、全フレーズを通した素のテキストは sr-only で別に置く。依存ゼロ・2026-08-16。

Typography
TYP-03

風に流れる見出しテキスト

見出しを1文字ずつのマスに分け、同じキーフレームへ文字ごとに少しずつ違う animation-delay を配ることで、揺れが列を横切って伝わる=風が抜けていくように見せるタイポグラフィ演出。横揺れと縦揺れを互いに割り切れない周期(3.7s / 5.3s)で重ね、遅延の刻みも別(0.09s / 0.13s)にしているため位相が噛み合う瞬間が来ず、ループ感が出ない。振幅は文字ごとの custom property で配るので、キーフレームは1組のまま「旗のように左を固定して右へ行くほど大きく揺れる」も切り替えられる。分割はレンダリング時に行い(後からDOMを差し替えると inline-block 化で行が組み直されて必ずガタつく)、動かすのは transform だけなので行送りも隣接要素も1pxも動かない。1字ずつ inline-block にすると改行判断が変わる唯一の落とし穴は、欧文を単語単位で1マスにまとめ、行頭に置けない約物を直前のマスへ吸収させて回避している。突風は横揺れとは別レイヤーの一発アニメーションで、乱数はレンダリングに使わない(SSRと同じ絵になる)。JS依存ゼロ・prefers-reduced-motion では静止した見出しへ降格・2026-08-22。

Typography

CTAバナー

ページ下部に置く行動喚起ブロック。淡いアンバーのグラデーション面にアイブロウ+見出し+2ボタン。部品ではなくセクション単位の標本。

Blocks
BLK-02

料金プラン

3段階の料金カード。中央の「おすすめ」プランだけアンバーの枠とリングで強調し、ボタンも塗り。LPやサービス紹介ページ用のセクション。

Blocks
BLK-03

制作フロー

番号つきの工程ステップ。制作の流れなど「順序が意味を持つ」内容向け。丸番号を細い罫線で連結し、デスクトップで横並びになる。

Blocks

サービス・ジグザグ(脱カード)

サービス/特徴を3-upのカード羅列にせず、左右交互(ジグザグ)の全幅バンドで縦に積むエディトリアル変種。各行は「ドット方眼の面プレート+大インデックス数字」と「箱で囲まないテキスト」を12カラム上でorder入れ替えして互い違いに配置し、hairline罫線+広い余白でグルーピングする。画像素材ゼロ。アンバー罫線とMontserratの巨大アウトライン数字で標本的な編集感を出す(他社サイトに見られる互い違いブロック構図を参考にブランド再構築・2026-07-27)。

Blocks

強み・数字(宣言型スタッツ)

「選ばれる理由・強み」を数字で言い切る宣言型ブロック。1つのKPIをfeature statとして巨大タイポで支配的に置き、残り3つをhairline罫線で仕切ったsupporting行に従える(少数の主張の階層化)。数字はIntersectionObserverで画面内に入るとrAFで0→目標値にカウントアップし、tabular-numsで桁幅を固定してガタつきを防ぐ。カードで囲まず罫線+余白でグルーピングし、画像素材ゼロで成立。prefers-reduced-motion時はカウントせず最終値を即表示(他社サイトに見られる数字・宣言型構図を参考にブランド再構築・2026-07-28)。

Blocks
BLK-06

実績・事例(グリッド)

制作実績・導入事例を情報密度高く一覧するブロック。影付きカードの羅列ではなく、gap-pxのhairline罫線で仕切った「レジャー(台帳)」で並べ、各事例に疑似ロゴ・ロックアップ(モノグラム+欧文社名/画像ゼロ)・業種タグ・巨大ゴースト番号を与えて一覧の律動を作る。ホバー(+キーボードfocus)で抜粋がフェードイン/矢印がスライドし、抜粋の高さは常に予約してリフローを起こさない。業種フィルタはhiddenトグルでリフローアニメを付けず即時に絞り込み、件数はaria-liveで通知。IntersectionObserverでスクロールインするとスタッガーでリビール、prefers-reduced-motion時は即最終状態(他社サイトの事例紹介に見られる情報密度と律動を参考にブランド再構築・2026-07-29)。

Blocks

お客様の声(引用の主従・声の台帳)

「お客様の声」を、引用の主従で見せるブロック。1件を主となる声として大きな引用文で置き、氏名・属性はamber hairlineを添えて控えめに従える。残りの声はカードで囲まず、左に縦レール1本+divide罫線で束ねた“声の台帳”として並べる。Swiperに頼らず、各証言のマーカーへ共有keyframeをanimation-delayでずらして掛けることで、明滅のハイライトが縦に流れる律動をCSSだけで作る(マーカーは各行にアンカーされるので行高が可変でも整列が崩れない)。氏名は医療系サイトにならいイニシャル・年代・属性で個人を特定しすぎず添える。画像素材ゼロ・prefers-reduced-motion時は静的マーカーと即時表示にフォールバック(参考: 参考サイトKB 医療系サイト群の声の見せ方をブランド再構築・2026-07-30)。

Blocks
BLK-08

グローバルヘッダー・ナビ

ロゴ左・ナビ右のコーポレート定番ヘッダー。CTAはナビ右端に1本だけ置き、縦hairlineで主従を仕切る。スクロールすると背景(bg-white/90 + backdrop-blur)が opacity で立ち上がり、下端のhairlineが左からワイプして出る(高さ・paddingは動かさないのでリフローなし)。SPはハンバーガー→フルスクリーンオーバーレイ(Escapeで閉じる・閉じている間はinertでtab到達を止める)。スキップリンク同梱・画像素材ゼロ。ギャラリー表示用にスクロールするデモシェルとダミー本文を同梱している(他社コーポレートサイトに見られるヘッダー構造を参考にブランド再構築・2026-08-02)。

Blocks

サイトフッター

白地にhairlineの区切りだけで組む3段フッター。1段目=サービス/会社案内/法務の多段リンク(SPは横罫の積み上げ・PCは縦罫の列にdivideの向きを入れ替える)、2段目=小さく再掲したロゴ+住所1行+電話・受付、3段目=コピーライトと「トップへ戻る」。背景の色面もカードも使わず、ページ末尾を重くしない。ロゴはワードマークだけに落としてヘッダーと役割を衝突させない。上端のアンバーtickはIntersectionObserverで1度だけ左からワイプし、リンクのホバーは文字の2px移動と下線のscale-xのみ。画像素材ゼロ(他社コーポレートサイトに見られる3段フッター構造を参考にブランド再構築・2026-08-03)。

Blocks

CTA(スプリット帯)

本文の流れに差し込む横長のCTA帯。左に和文ラベル+見出し+短い説明、右にPrimary/Secondaryの2ボタンを置き、内側は縦罫1本だけで分割する。極薄アンバー(bg-amber-50/60)は行動側のカラムにだけ敷き、左は白のまま余白で押す。既存 cta-banner(BLK-01・中央寄せのグラデ面)と対になる「罫線」型で、ページ末の締めではなく通過点のCTAに効く。画像素材ゼロ(他社コーポレートサイトに見られる下部コンバージョン帯の構図を参考にブランド再構築・2026-08-04)。

Blocks
BLK-11
BLK-13

インタラクティブ・カード&タブモジュール

タブで切り替え、パネルを開くと隣が背表紙だけ残して畳まれる「重なりアコーディオン」。全パネルを展開時と同じサイズで絶対配置しz-indexを昇順にすることで、width/flex-growを一切アニメーションせず translate だけで開閉する(レイアウト再計算ゼロ・依存ライブラリゼロ)。位置は比率のcalcで表現するためResizeObserverもmatchMediaも不要で、縦横の切替はコンテナクエリで純CSS。狭幅では縦アコーディオン、@2xl以上で横アコーディオンに変わる。カード展開+タブ切替という着想を、コード・文言・配色・構成すべてFirst CHのオリジナルとして再構築した(外部コードの取り込みなし・2026-08-07)。

Blocks

採用セクション(手書き風アクセント)

やわらかいアンバーの色面ブロックと手書き風SVG(うねり下線・粗いリング・矢印)で「人の気配」を出す採用セクション。顔写真を使わずイニシャル円で人物を表し、募集要項の破線フレームと「募集要項を見る/社員インタビューを読む」の2導線を添える。画像素材ゼロ・外部依存ゼロで、モーションは transform/opacity のみ(参考: 保育・教育系の中途採用サイトに見られる色面+手書き装飾+顔のない人物図の構図をブランド再構築・2026-08-07)。

Blocks
BLK-15

実績・事例(1件フィーチャー/重ねスタック)

実績を一覧するのではなく、直近の1件だけを大きく掘り下げるブロック。左は画面キャプチャ3枚をわずかにずらして重ねたスタック(画像素材ゼロ・ブラウザクロム+ワイヤーフレームで自作)で、hoverすると扇状に開く。右はクライアントのロックアップとhairline罫線の諸元リスト。下は課題→打ち手→結果の順に読ませる縦レジャーで、結果の行にだけ数値3点を添える。カテゴリ絞り込みは持たせず、グリッド一覧(BLK-06 work-grid)の対として使う。重なりはtranslate/rotate/scaleだけで作るためリフローが起きず、IntersectionObserverのスタッガー・リビールを含め全モーションがmotion-reduceで初期状態=最終状態に畳まれる(他社サイトに見られる、実績1件を重ねキャプチャで見せる構図を参考にブランド再構築・2026-08-08)。

Blocks

選ばれる理由・強み(非対称グリッド)

「選ばれる理由」を複数並べつつ、均等グリッドにしないブロック。12カラム上で見出し:本文の比率を 7:5 → 5:5(1カラム分インデント)→ 4:7 → 7:5 とローテーションし、左端を階段状にずらすことで罫線だけでリズムを作る。左脇には縦組みの英字ミニラベルを立て、その下のレールがリスト左端の境界を兼ねる(飾りではなく構図上の役割を持たせる・375pxでは横組みに戻す)。理由は順序を持たないため 01/02 の番号マーカーは使わず、和文ミニラベルで行の性格を示す。カードで囲まず hairline罫線+余白でグルーピングし、罫線は origin-left の scale-x ワイプで引かれる。画像素材ゼロ・依存ゼロ。数字1本を特大に置く strength-stat(BLK-05)とは別軸の強みブロック(非対称2カラム+縦組みラベルの構図を他社サイトから参考にブランド再構築・2026-08-09)。

Blocks
BLK-17

お客様の声(ポラロイド風・重ね置き)

「お客様の声」を、机に置かれた印画紙として見せるブロック。白フレーム+影のカードに -3.4°〜+2.9° の傾きを個別に与え、段差と前後関係で少しずつ重ねる。整列した台帳型の testimonial-voices(BLK-07)との差は“整列の有無”で、こちらは親しみ・手作り感を担当する。顔写真は使わず、印画紙の窓にイニシャル円と声そのものを入れ、下の太いフチに手書き風(Yomogi)の署名+アンバーの一筆線を置いて人格を出す。静止姿勢が transform のため reveal と hover が衝突する問題は、外側liがtranslate-y/opacity・内側が rotate という2層分割と、animation-fill-mode:backwards の keyframe(終了キーフレーム=静止姿勢)で解いている。傾いた文字は読みにくいので各カードを tabIndex=0 でフォーカス可能にし、hover/focus-visible でまっすぐ持ち上げる。画像素材ゼロ・prefers-reduced-motion 時は即時表示(採用サイトに見られる「傾き重なりポラロイド風写真カード」の構図を参考にブランド再構築・2026-08-10)。

Blocks
BLK-19

会社概要・アクセス(地図+実写サムネイル)

来社手段(電車/バス/お車)をタブで切り替え、inline SVG の簡易地図に経路と番号ピンを描き、右に「目印になる景色」のサムネイルを並べたアクセスブロック。観光サイト(明日香村観光サイト「あすか時間」)の"場所をカテゴリに分けて実写サムネイルを地図的に配置する"情報構造を、コーポレートの動線案内へ転用した。既存 BLK-11 会社概要・アクセス(定義リスト型=会社を知る)の対で、こちらは『行き方が分かる』ことに全振りしている。目印カードにホバー/フォーカスすると地図のピンが連動し、経路は点の opacity を負のdelayでずらすことで進行方向へ流れる。外部地図APIも画像素材も使わず依存ゼロ。

Blocks

3Dティルト・ホバーカード表現

hairline罫線のレジャー(台帳)に並べた実績のうち、カーソルを重ねた1件だけがマウスに追従して傾き、台紙から起き上がる実績ブロック。追従値は React の state ではなく CSS 変数(--tx/--ty/--px/--py)へ直接書き込むため再レンダーはゼロ、rect は pointerenter で1回だけ測りスクロール時のみ測り直す。回転・層ごとの視差(translateZ)・光沢の移動はすべて transform と opacity だけで表現し、追従90ms/離脱650msの時定数も CSS 変数で切り替える。ライブラリ依存ゼロ。精密ポインタ(hover:hover and pointer:fine)かつ prefers-reduced-motion でない環境でのみ配線し、キーボード操作にはティルトの代わりに group-focus-within の罫線と矢印で状態を返す。マウス追従の3Dティルトと層の視差という着想を、コード・文言・配色・構成すべてFirst CHのオリジナルとして再構築した(外部コード・素材の取り込みなし・2026-08-11)。

Blocks

お知らせ・ニュース一覧(罫線リスト)

お知らせを「日付+カテゴリタグ+タイトル+矢印」の1行にまとめ、hairline罫線だけで区切る縦リスト。カード(面・影・角丸)を一切使わないので、件数が増えても縁のノイズが積み上がらない。ニュースは順序を持つ内容ではないため 01/02 の番号マーカーは置かず、行の識別は time要素の日付とカテゴリタグに担わせる。モバイルは日付+カテゴリを1行にまとめ、md以上では md:contents で wrapper を消して子をそのままgridセルへ昇格させる(同一DOMで2レイアウト)。ホバーはタイトル下線の origin 反転ワイプと矢印の2px移動の2つだけに絞り、面の変化を足さない。カテゴリフィルタも面を持たないテキストボタン+アンダーラインで、aria-pressed と sr-only の aria-live で状態を伝える。画像素材ゼロ・依存ゼロ(他社サイトに見られる罫線縦リスト構造を参考にブランド再構築・2026-08-12)。

Blocks
BLK-22

タブ切替×文字分解トランジション

タブを押すと、いま読んでいた文字が上へ抜け、次の文字が行の下から立ち上がってくる「文章そのものが入れ替わる」ブロック。GSAP/SplitTextのDOM実測を捨て、行をデータ(string[])として持つことで、行マスク×文字スタッガーを依存ゼロの純CSSで成立させている。分割は2粒度で、見出しは書記素(Array.from・split("")はサロゲートペアが割れるので不可)、本文は句読点まで含む文節チャンク(1文字ずつinline-blockにすると和文の禁則が効かず行頭に「。」が来るため)。入場は新規マウントでtransitionが走らないのでkeyframes+fill-mode:bothを使い、退場はclassName差し替えでanimation-nameを変えて再生し直す。既存のBLK-13(カード展開が主)との差は、動くのがパネルではなくテキストである点。motion-reduceは自前の@mediaでanimation:none !importantを当て、JS側もout位相ごと飛ばして即時切替に落とす。タブ切替時に本文を文字単位で分解して入れ替える着想を、コード・文言・配色・構成すべてFirst CHのオリジナルとして再構築した(外部コードの取り込みなし・2026-08-12)。

Blocks

取引先・掲載実績ロゴ帯(マーキー)

取引先と掲載メディアを2レーンの無限ループ帯で流すロゴストリップ。ロゴ画像を1枚も使わず、weight・tracking・大小・先頭マークを1件ずつ変えた和欧混在のワードマーク(社名はすべて架空のダミー)で「ロゴらしさ」を作る。上下レーンは逆走+速度違い(42s/52s)、両端は mask-image で断ち切り、hoverで停止。prefers-reduced-motion では帯ごと落として同じ内容をhairlineの静止グリッドで見せる(イベント系サイトに見られるマーキー帯の構造を白基調コーポレート文脈へブランド再構築・2026-08-13)。

Blocks

軌跡ストランド・キャンバス(パラメータ操作つき)

Canvas 2D 上でカーソルの軌跡を等間隔ノードのロープに変換し、重力・うねり・距離拘束で落として溜める描画ブロック。First CH のワードマークをオフスクリーンに描いて alpha を 0/1 マスクへ落とし、線が字面に当たると弾き返して接点だけをアンバー(#d97706)に灯す。圧力・重力・うねりの3スライダーと消去/自動描画のトグルを hairline 罫線で区切ったパネルに置き、カード羅列を避けた。描いている線はアンバー、置かれた線はインクへ 900ms かけて変わる。prefers-reduced-motion・画面外(IntersectionObserver)・タブ非表示の3条件で rAF を止め、モーション低減時は同じ物理を同期計算した静止フレームを1枚だけ描く(スライダーは再計算として機能するので操作が死なない)。無操作が続くとリサージュ曲線の仮想ポインタが引き継ぐためタッチ環境でも成立する。依存ライブラリゼロ・画像素材ゼロ。軌跡から曲線ストランドを作る発想とpressure/gravity/curlのパラメータパネルという構成を、コード・文言・配色・構図・ワードマークすべてFirst CHのオリジナルとして再構築した(外部コードの取り込みなし・2026-08-13)。

Blocks
BLK-25

沿革・ヒストリータイムライン

縦1本の細線と年号ノードで沿革を刻むタイムライン。IntersectionObserver で1件ずつ「線が引かれ→同心円のノードが描かれ→年号と本文が立ち上がる」順に一度だけリビールする。カードで囲わず hairline と余白だけでグルーピングし、画像素材ゼロ・依存ゼロで組んでいる。年号・出来事は架空のプレースホルダー。

Blocks
BLK-26

メンバー紹介グリッド

在籍メンバーを顔写真ゼロで紹介するグリッド。網点(ハーフトーン)パッチ・細線フレーム・イニシャル円・傾いたキャプション帯の4層コラージュを人物像の代わりに置き、hover と focus-within で層が「開く」。カードで囲わず上罫1本と余白でグルーピングし、IntersectionObserver で一度だけ順にリビールする。画像素材ゼロ・依存ゼロ。人物・役割・ひとことはすべて架空のプレースホルダー。

Blocks

ディレクトリ型メガフッター

情報量そのものを主役に据えたフッター。事業別の4列ディレクトリを、左端に立てた和文縦書きラベル+縦hairlineの「軸」で束ねる。列の区切りはSPが横罫の積み上げ、PCが縦罫の列で、DOMは1つのまま(divide-xは複数行グリッドで2行目の先頭に罫が出るため使わない)。SPでは各列がaria-expandedの開閉に切り替わり、長いサイトマップでも末尾が伸びない。リンクのホバーは幅ゼロのアンバー罫を先頭に仕込み、文字をtranslate-xで退かせるだけでレイアウトを動かさない。入場は軸のscale-yと列のスタッガーに集約。画像素材ゼロ。

Blocks

サービス紹介(縦長ビジュアル×積層インフォカード)

サービスを3-upのカードで羅列せず、縦長ビジュアル1枚の面に説明カードを積み重ねるブロック。カードは1枚ずつ水平オフセット・幅・直前カードとの食い込みを変え、重ね順はz-index・動きはtransformだけで作るためリフローが起きない。左のビジュアルはグラデーション面+細線リング・対角バンド・ぼかし円・ドット方眼の重ね合わせで写真素材ゼロのまま枠を確定させ、実案件ではaspectを保ったまま1カットへ差し替えられる。lg以上ではビジュアルがstickyで留まり、読み進める間ずっと『1枚の面に積んでいる』ことが伝わる。カット数の少ない案件で密度を作るための構図で、左右交互配置(BLK-04)やカード羅列(CRD-01)の対として使う。IntersectionObserverのスタッガー・リビールを含め全モーションがmotion-reduceで初期状態=最終状態に畳まれる。

Blocks
BLK-29

板ポリ・ギャラリー(WebGLカメラ巡回・依存ゼロ)

実績のサムネを6枚の板ポリとして円弧に並べ、カメラ(ビュー行列)の注視点を回して巡る実績ブロック。3Dライブラリは使わず、射影行列・lookAt・モデル行列の3本をJSで組んで素のWebGL(GLSL ES 1.00)へ渡すだけで動く。板は頂点4つのTRIANGLE_STRIPを1個だけ持ち、uniform(MVP・図案番号・面の向き・強調度)を差し替えて6回描くので、バッファもテクスチャも増えない。絵柄は画像ではなくフラグメントシェーダの関数で描くため画像素材ゼロで、板が何枚並んでもネットワーク転送は発生しない。当たり判定はレイを飛ばさず、描画に使ったMVPで4隅を画面座標へ射影して多角形の内外判定を行う(逆行列も交差計算も不要・カメラ背面のw<=0だけ弾く)。ホバーした板は自分の法線方向へ引き寄せて手前へせり出し、同時に下の実績台帳の行が強調される。逆に台帳の行にホバー/フォーカスするとカメラがその板の正面へ回り込むため、キーボードだけでも同じ体験になり、canvasはaria-hiddenの装飾に徹して内容は罫線リスト(DOM)を正にできる。無操作時はパンが端で反転する往復になりループの継ぎ目が出ない。prefers-reduced-motion時はrAFを回さず、円弧をやめた3×2の静止グリッドを1枚だけ描いて強調はアンバーの枠線のみで示す。画面外(IntersectionObserver)とタブ非表示でも停止し、起動直後48フレームの平均フレーム時間が32msを超えたらバッキングストアを0.6倍、それでも超えたらCSSの静的グラデーションへ降りる。webglcontextlostは必ずpreventDefaultで握り、アンマウント時はWEBGL_lose_contextでGPUリソースを明示的に解放する。文言・配色・構成はすべてFirst CHのオリジナル。

Blocks

ガラス質3Dホバーカード

すりガラスの面・光沢の縁・浮いた本文の3層で奥行きを作る実績ブロック。光源はカードごとではなくグループに1つだけ置き、親で受けた1本の pointermove から全カードのローカル座標を毎フレーム算出するため、カーソルの下にないカードにも「近い辺だけが明るい」縁が出る。ポインタ位置から傾き(rotateX/rotateY)を求めるのはホバー中の1枚だけで、追従90ms/離脱650msの時定数まで CSS 変数(--lx/--ly/--near/--tx/--ty/--lift/--tilt-ms)で切り替えるので React の再レンダーはゼロ。白地では半透明板を重ねてもガラスに見えないため、面の背後に斜めの帯とアンバーのブロブ(ぼかし半径より粗い模様=1px級のドットは消える)を敷いてぼかす対象を作り、暗面の発光縁は明面の光沢ハイライトへ翻訳している。ライブラリ依存ゼロ。精密ポインタかつ prefers-reduced-motion でない環境でのみ配線し、キーボード操作には group-focus-within の光沢リングと矢印で同じ状態を返す(2026-08-18)。

Blocks
BLK-31

実績ショーケース(不揃いグリッド)

通販サイトの商品一覧に見られる「グリッド分割」と「情報の詰め方の優先順位」を、実績・事例の情報設計へ置き換えたブロック。3カラムのうち先頭の1件だけを2×2で大きく取り、残り5件を小サイズで並べて9セルをちょうど埋める。サムネの代わりに制作種別と標本番号のロックアップを置いた画像ゼロのプレート、NEW/SALEバッジの位置に案件ステータス、価格の位置に成果指標(before→after+変化率チップ)、カラースウォッチの位置に担当した工程の塗り/中抜きドットを配置し、視線の落ち方を商品一覧のまま数字で比較できる実績一覧にした。並び替え(新着順/成果順)で主役の2×2枠そのものが入れ替わる。折り返しはビューポートではなくコンテナクエリ(@container)基準なので、狭い枠に埋め込んでもレイアウトがずれない。リンクはセルにつき1本のstretched link(after:absolute inset-0)で<a>の入れ子を作らず、モーションはtransform/opacityのみ・すべてmotion-reduceで降格する。

Blocks
BLK-32

実績カルーセル(横スクロール・層視差)

アニメーションライブラリを使わず、ブラウザ標準のスクロールスナップだけで組んだ実績・事例カルーセル。トラックは overflow-x-auto + snap-x snap-mandatory なので、ドラッグ・スワイプ・ホイール・キーボードのフォーカス送りは実装せずに手に入る。JSが担うのは「今どこにいるか読む」ことと scrollTo で送ることだけで、送りの緩急はCSSのscroll-behaviorに委ねているため prefers-reduced-motion では自動的に瞬間移動へ降格する。カード内は、スクロール位置から求めた1つのCSS変数(--p)を地紋・アンバー図形・ゴースト番号・種別ロックアップの4層が別々の係数で読み、層ごとの移動量の差で視差の奥行きを作る(Reactのstateは経由せず再レンダーはゼロ)。自動送りは末尾で巻き戻さず進行方向を反転し、停止ボタン・画面外・ポインタ滞在・タブ非表示・reduced-motionの5条件で止まる。画像素材とライブラリ依存はゼロ、リンクはスライドにつき1本のstretched linkで<a>の入れ子を作らない。

Blocks
BLK-33

料金②機能比較マトリクス

プラン×機能を1枚の表で見せる料金ブロック。推奨プランの列だけ薄いアンバー地とバッジで縦に貫き、対応は細線チェック・非対応は淡いダッシュに落として表全体の濃度を均した。価格やページ数は tabular-nums で桁を揃え、狭い画面では先頭列を sticky にしたまま横スワイプで比較できる。

Blocks
BLK-34

制作フロー②スクロール連動ステップ

左の見出しをstickyで残したまま、右の工程リストを読み進みに応じてアクティブ化する制作フロー。縦の進捗罫がスクロール量ぶんだけ伸び、罫線が丸印に届いた工程から順に立ち上がる。対応環境ではCSSのスクロール駆動アニメーション(view-timeline)だけで動きJSはゼロ、非対応環境はrAFで同じCSS変数を書くfallbackに切り替わる。

Blocks
BLK-35

FAQ②カテゴリタブ+2カラム

「料金について/進め方/納品後」のカテゴリタブで質問を絞り込むFAQブロック。開閉はネイティブの<details>/<summary>のまま、タブは roving tabindex と ←→キーに対応する。広い幅では前半/後半で割った2カラムに並べ、開いても隣の列が動かない。件数バッジはMontserrat + tabular-numsで桁が変わっても幅が揺れない。

Blocks

立方体6面のサービス切り替え

6つの提供領域を「1つの立方体の6面」に載せ、選ぶと最短経路で回ってその面が正面に来るサービスブロック。面は同じ正方形を `<回転> translateZ(calc(var(--cube)/2))` で自分の法線方向へ押し出しただけで、辺の長さはCSS変数1つに集約しているためレスポンシブでも箱が崩れない。角度は0〜360に丸めず連続値として貯め、現在値に最も近い等価角へ寄せてから代入するので、5番目→1番目でも逆回りに大回りしない。正対させると平らなカードと区別がつかないため、外側にもう1枚preserve-3dのラッパを噛ませて固定の傾き(rotateX(-9deg) rotateY(-15deg))を与え、面の切り替えと見え方の姿勢で回転の役割を分けている。陰影は面に固定で塗らず「正面かどうか」でopacityを出し入れするため、どの面が来ても正面だけが明るい。見た目は3Dでも操作はタブ(縦tablist・ローミングtabindex・矢印/Home/End)で、正面以外の面はinertで読み上げから外す。prefers-reduced-motionでは3Dをやめて平面パネルの差し替えへ降格。ライブラリ依存ゼロ・画像素材ゼロ。

Blocks
BLK-37

お知らせ②ピックアップ+カテゴリタブ

新着に「主従」を持ち込んだお知らせブロック。最新1件だけを左に大きくフィーチャーし(日付+細枠カテゴリバッジ+大見出し+抄録+テキストCTA)、残りは右の罫線リストへ畳む。差を付けるのは面や色ではなく文字サイズと余白だけなので、画像素材ゼロでも紙面が立つ。2カラムの境界は縦罫1本、1カラムに畳んだときは横罫へ入れ替える(同じDOMで区切り方だけ変える)。カテゴリ絞り込みは role="tablist" + roving tabindex の正しいタブUIで、←→/Home/End で移動しつつ主役も入れ替わる。切替は key の付け替えによる再マウント+CSS animation で常に頭から再生し、行は 55ms ずつスタッガー。日付は欧文タブラーで年だけ薄く落とし、カテゴリは塗らない細枠バッジ。0件・1件(従が無い)の状態まで設計に含め、空の罫線枠を残さない。画像素材ゼロ・依存ゼロ。

Blocks
BLK-38

改修前後の比較スライダー

同じ座標に「改修前」と「改修後」の誌面を2枚重ね、境界をドラッグして見比べるブロック。上層は幅ではなく clip-path で削るため、動かしても中身が再レイアウトされず文字の折り返し位置が1pxも変わらない(幅を変える実装では折り返しが動いて「同じ紙面の比較」に見えなくなる)。境界位置は pointermove ごとに CSS カスタムプロパティへ直書きし、React state は rAF で間引いて読み上げ用の数値だけに使う=指と境界の間に再レンダ分の遅れが出ない。inline style の初期値を state 由来にしないのが要点で、定数で1度だけ書けば以後 React がその属性に触らず直書きが生き残る。setPointerCapture で枠外へ出ても追従し、touch-action は pan-y にして狭幅の縦スクロールを殺さない。BEFOREバッジは上層のDOMに入れて境界が通れば一緒に切れるので、出し分けの状態を持たない。つまみは role="slider" で ←→ 2%・PageUp/Down 10%・Home/End で端まで。誌面は2枚ともDOMで組んであり画像素材ゼロ・依存ゼロ。初回だけ境界が1往復して「掴める」ことを伝え、prefers-reduced-motion では最初から動かさない。2026-08-24。

Blocks

数字で見る会社(hairline格子インフォグラフィック)

会社紹介・採用ページ向けの「数字で見る◯◯」ブロック。創業年数・累計実績・継続率などを優劣なく等価に並べ、カードで囲まずに1pxの罫線だけで格子に束ねる。親を grid gap-px bg-gray-200・セルを bg-white にすることで、隙間そのものが罫線になり列数が変わっても二重線が出ない。数字は特大Montserratのtabular-nums、単位と注記は小さく従える。IntersectionObserverで画面内に入るとrAFで0→目標値へカウントアップし、同じ進捗をamberの計測バーのscaleXにも流して数字と罫線を同じ時間軸で伸ばす。列の折り返しはコンテナクエリ(@md/@2xl)なので狭い枠に埋め込んでも破綻しない。画像素材ゼロ、prefers-reduced-motion時はカウントせず最終値を即表示(2026-08-25追加)。

Blocks
BLK-40

折り屏風カルーセル

板を1枚ずつ別々の消失点で回す横送りカルーセル。perspective をトラックではなくスライドの箱ごとに置くと、板は各自の中心を軸に回るため台形の歪みが出ず、「同じ板が角度だけ違う」=屏風の折りとして読める。3D空間を共有しないので台紙側を普通に overflow-hidden でクリップでき(preserve-3d との併用と違って潰れない)、代わりに重なり順は DOM 順のままなので中央からの距離で z-index を配る。送り量は flex w-fit のトラック幅が板1枚×N枚である性質を使い translateX(-active * 100/N %) と%で書くため、板幅をブレークポイントで変えても寸法の測定が一切要らない。±90°を超えて回り込んだ板は backface-visibility が自動的に消すので「何枚見せるか」の計算も持たない(折り角を深くすると見える枚数がひとりでに減る)。角度と拡大率は CSS 変数として style で渡し transform 自体はクラスで書く(inline style の transform は media query より強く、モーション降格が効かなくなるため)。動かすのは transform と opacity だけ・依存ゼロ・prefers-reduced-motion では回転と遷移を捨てた素の横並びへ降格・2026-08-25。

Blocks
BLK-41

代表メッセージ(縦書きアクセント×エディトリアル)

会社案内の「代表挨拶」ブロック。写真も肩書きバッジも使わず、縦組みの本見出し1本と横組み2段の長文本文という組み方向の対比だけで格と余白をつくる。縦組みは高さ折り返しをブラウザに任せず1行=1要素をflex-row-reverseで並べて改行位置を固定し、行ごとの字下げも効かせる。強調は色や太字ではなく傍点(text-emphasisのfilled sesame・アンバー)、半角数字は縦中横(text-combine-upright)で立てる。本文はmulti-columnの流し込み+段間hairlineで、狭い枠ではコンテナクエリで1段に戻る。動きは掛け軸を下ろすような縦マスクリビールと罫線のscaleだけで、transformとopacityしか触らない。角丸・英字キッカー・末尾の矢印リンクは使わず、締めは肩書き+署名(2026-08-26追加)。

Blocks
BLK-42

深度視差ワードウォール(5層・掴んで送れる無限流し)

取り組み領域のキーワードを、速度の違う5層に分けて無限に流す帯。canvasもWebGLも使わず素のDOM要素を translate3d で動かすので、流れている語はテキストのまま選択・フォーカスでき、手前2層はボタンとしてキーボードで辿れる。無限ループは要素の生成破棄ではなく「レーン長の剰余」で作り、余った隙間は要素数で割って自動的に均す。ドラッグと横ホイールで送り量と進行方向を掴み替えられ(縦ホイールはページへ通す)、語を選ぶと流れが止まって説明が出る。prefers-reduced-motion では流さず、同じ語をhairlineの一覧として静止表示する。依存ゼロ。

Blocks
BLK-43
BLK-44

選ばれる理由③ 自社と他の選択肢の比較

依頼先の選択肢と自社を並べて見せる比較ブロック。○×の記号表にせず、同じ観点について短文どうしを突き合わせて差を語る。比較相手は切替チップ(radiogroup・矢印キー対応)で1者ずつ選ぶため、狭い画面でも横スワイプや固定列を使わずに読み切れる。自社側は12カラム上で幅広に取り、本文と同じグリッドを重ねた1枚の帯で薄いアンバーの柱を通す(塗りは常時・立ち上がるのは縦罫1本だけなのでJSに依存しない)。最終行を「向いている場面」にして相手側の利点も書き、特定企業ではなく体制の傾向である旨の注記を添える。画像素材ゼロ・依存ゼロ。

Blocks
BLK-45

課題共感→解決ブリッジ(こんなお悩みありませんか)

悩みの列挙をカードにせず、hairline罫線+チェックボックスの本物のチェックリストにしたLP定番の課題提起ブロック。読むだけの一覧ではなく複数選択でき、選んだ課題に対応する打ち手だけが下の転換帯に残る(ゼロ件のときは絞り込みを解いて全件を表示し、空白を見せない)。共感パートと解決パートは、scale-yで下へ伸びる縦罫と rotate-45 の三角だけでつなぐ。温度を変えるのは転換帯の面1枚だけで、bg-amber-50/70 と border-amber-600/25 に切り替え、上のリストは白のまま残す。件数の変化は aria-live="polite" の1文に集約し、リスト自体は live にしない。角丸ゼロ・英字キッカーなし・末尾の矢印リンクなし。画像素材ゼロ・依存ゼロ。

Blocks
BLK-46

資格・認証・受賞バッジ帯(標本枠+取得年レール)

ISO・適合・受賞などの信頼要素を、ロゴ画像に一切頼らずタイポと細枠だけの標本バッジで掲示する帯。6件を取得年の昇順に並べ、カードで囲まず gap-px + 下地色の hairline で束ねる。各バッジは欧文ロックアップを四隅トンボ付きの細枠に収め、取得年を tabular-nums で下端にそろえる。hoverとキーボードフォーカスで一言説明のツールチップが開き、帯・セル・吹き出しの3つのrectを測って left を帯の内側へクランプするため端の列でも枠外へ出ない(三角だけは別途セル中央を指す)。読み上げ用の説明はボタン内の sr-only に常設し、aria-describedby のトグルに依存しない。帯の下には取得年の目盛レールを敷き、選択中の年のマーカーが translateX(%) だけで移動する。掲載内容はすべて表示サンプル。

Blocks
BLK-48

ブログ・コラム抜粋(エディトリアルリスト)

読了目安を第一の軸に据えた記事一覧。行の左端に読了分数を特大の欧文数字で置き、その下に最長記事との比で長さを固定したバーを敷くので、サムネイル画像がなくても「どれがどれくらい重いか」が一目で比較できる。数字が表すのは順序ではなく量なので、01/02 の番号マーカーのように手順へ誤読されない。並べ替えは新着順と読了目安の短い順の2つで、絞り込みと違って件数が変わらないため、件数ではなく「何順になったか」を sr-only の aria-live で伝える。カテゴリは枠付きバッジにせず文字色と hairline の縦罫だけで仕分け、行は面(背景・影・角丸)を一切持たない。hover では見出し下線の origin 反転ワイプとバーの overlay 表示だけを動かし、バーの長さは変えない(操作でデータの見た目を歪めない)。矢印リンク・英字キッカー・角丸は使わない。画像素材ゼロ・依存ゼロ。

Blocks
BLK-49

セミナー・イベント一覧(開催日ブロック型)

左端に月/日を特大のタブラー数字で積んだ日付ブロックを起点にする、セミナー・イベントの開催日一覧。1行が席という在庫を持ち、残席の状態(受付中/残りわずか/満席/受付終了)が席数ぶんの目盛りゲージ・申込締切・操作の可否をまとめて切り替える。満席回と終了回はカードではなく傾いた判子で示し、終了した回はスイッチで開閉する。角丸・英字キッカー・矢印リンクを使わず、hairline罫線と余白だけで月ごとに段を作る。画像素材ゼロ・依存ゼロ。

Blocks
BLK-50

拠点・店舗一覧(罫線グリッド)

複数拠点を1枚の台帳として横断比較させる一覧ブロック。拠点名・所在地・電話・営業時間を同じ列に揃え、角丸も影も面の塗りも使わず、横罫と縦罫の直交だけで律動を作る。現在時刻から各拠点の営業状況(営業中/まもなく終了/本日休業)を算出して表示し、エリア絞り込みと「営業中のみ」の2操作で候補を絞れる。電話は tel: リンク+タブラー数字、地図は細字のテキストリンクに留めた。地図・写真を持たないため画像素材ゼロで成立する。

Blocks
BLK-51

対応エリア(簡略マップ+エリアリスト)

「自社がどこにあるか」ではなく「相手の住所が範囲に入るか」を答える対応エリアブロック。実地図を使わず、共有格子点をジッタさせた自作SVGの区割り図に当日対応・翌営業日・要相談・対象外の4段をアンバーで塗り分け、右に市区町村の可否台帳(読み・出張費・最短訪問・条件)を並べる。地名や読み・区分名での検索が図と一覧を同時に絞り込み、hover/focusで図とリストが相互にハイライトする。塗りは拠点からの距離順に広がる。画像素材ゼロ・依存ゼロ。

Blocks
BLK-52

電話一次CTA帯(タップトゥコール)

電話を一次導線に置くCTA帯。最大の活字は見出しでもボタンでもなく電話番号そのもので、番号がそのまま tel: のタップ領域になる。狭い幅では全幅のアンバー面(タップで発信)、sm 以上では下線の引ける大活字へ戻る同一アンカー。上段には現在時刻から求めた受付状態(受付中/時間外・次の受付)を出し、右カラムに平日・土曜・日曜祝日の受付時間表を置いて今日の行に印を付ける。通話料無料などの注記は従、メール相談と折り返し予約は細字の下線リンクに落とす。角丸・英字キッカー・末尾の矢印は使わず、罫線と余白だけで束ねている。番号と時間はすべて架空の表示サンプル。

Blocks
BLK-53

空き枠カレンダー直結CTA

予約導線を二段にしたCTA。押す前に選ばせる型で、主役は文でもボタンでもなく在庫そのもの。直近1週間の日付を列、午前・午後・夜間を行に取ったマトリクスへ空き状況(◎空きあり/○残りわずか/×満席/–受付なし)を並べ、記号の意味は表の前の凡例で先に渡す。空きのある枠だけが押せるボタンで、満席の枠は disabled にしてタブ順から外す。枠を選ぶと選択面がスケールで立ち上がり、その列の日付見出しにアンバーの罫が入り、最下段の要約が日付・曜日・時間帯を文で読み上げ、それまで灰色だった予約ボタンが活性化する。今週/翌週の切り替えつき。日付はマウント後に描いて hydration のずれを避けている。角丸・英字キッカー・矢印リンクを使わず、hairline罫線と余白だけで束ねた。日付・空き状況はすべて架空の表示サンプル。

Blocks

スプリットヒーロー

コーポレートサイト冒頭のヒーロー。左に見出し+2ボタン+実績数値、右にCSSだけで作ったブラウザ枠のサイトプレビュー。画像素材なしで成立する。

Pages
PGE-03

全面ビジュアルヒーロー

全面KVを4×3のタイルに分解して見せ、タイルが着地して1枚の全景に戻る重厚な導入のヒーロー。白スクリムで和文の可読性を確保し、下部はhairline罫線だけで概要をグルーピングする(カードにしない)。出現はCSSの@keyframes+animation-fill-mode: backwardsのみで組んでいるためJSゼロ・SSRの初期HTMLとreduced-motion時は完成状態で表示される。背景KV(/designs/hero-fullbleed-visual-kv.webp・文字なし)は生成画像で、imageSrcプロパティで差し替えられる。他社サイトに見られる「写真グリッド→全景」の導入演出を参考にブランド再構築(2026-08-01)。

Pages

キャンバス粒子ヒーロー(方眼+バネ物理)

Canvas 2D の粒子をランダムではなく方眼グリッドに並べ、ポインタの斥力で押し出し、フックの法則と減衰でホーム座標へ戻す背景ヒーロー。「整っていたものが乱れて戻る」動きはドット方眼の標本モチーフと噛み合い、近傍の粒子だけアンバー(#d97706)へ寄る。速度と減衰はdtで正規化するため120Hzでも倍速にならず、prefers-reduced-motion・画面外(IntersectionObserver)・タブ非表示の3条件でrAFを止める。無操作が続くとLissajous曲線の仮想ポインタへ引き継ぐのでタッチ環境でも成立する。依存ライブラリゼロ・画像素材ゼロ。Canvasの粒子+ポインタ物理という着想を、コード・文言・配色・構図すべてFirst CHのオリジナルとして再構築した(外部コードの取り込みなし・2026-08-08)。

Pages

リキッドガラス・ヒーロー背景(WebGL屈折+メルト)

フルスクリーンの三角形1枚とフラグメントシェーダ1本だけで、ヒーロー背景に屈折するガラスの塊を敷いたブロック。3Dライブラリは使わず素のWebGL(GLSL ES 1.00)で組んでいるので、webgl2でもwebglでも同じシェーダが動き、依存ライブラリはゼロ。背景の方眼ドットとアンバーの斜め帯はテクスチャではなくシェーダ内の関数で描き、それを法線方向にずらして再サンプルすることで屈折を作る(R/G/Bで屈折率を1.035/1.00/0.965とずらす色収差つき)。塊どうしは距離場のsmin(多項式スムーズ最小値)で結合するため、近づくと首を作って溶け合う=メルトになり、粘性kを時間で揺らすと呼吸して見える。ポインタは6つ目の塊として振る舞い、無操作が続くとリサージュ曲線の仮想ポインタが引き継ぐのでタッチ環境でも成立する。低スペック対策は解像度スケールの二段落とし(起動直後48フレームの平均が32msを超えたらバッキングストアを0.6倍、それでも超えたらrAFを止めてCSSの静的グラデーションへ降りる)。prefers-reduced-motion時はrAFを回さず同じシェーダで静止フレームを1枚だけ描き、画面外(IntersectionObserver)とタブ非表示でも停止する。webglcontextlostは必ずpreventDefaultで握り、アンマウント時はWEBGL_lose_contextでGPUリソースを明示的に解放する(同種ブロックが並ぶ一覧ページではコンテキスト数の上限に当たるため)。テキスト・配色・構図はすべてFirst CHのオリジナル、画像素材ゼロ。屈折・メルトのシェーダーをヒーロー背景に敷き通常のDOMを上に重ねるという構造だけを着想として再構築した(外部コードの取り込みなし・2026-08-14)。

Pages
PGE-06

3Dオブジェクト・ギャラリーHero(PBR・環境マップ・影)

「サイトに3Dを載せたい」に応えるためのヒーロー。金属・陶磁・ガラスの3標本を切り替えて質感を見せるが、モデルデータもテクスチャ画像も一切持たず、形は TorusKnot / Lathe(回転体のプロファイルを関数で作る)/ Extrude(角丸シェイプ+ベベル押し出し)でコード生成する。映り込みは白い箱の内側に発光板を4枚置いた"撮影スタジオ"を組み、PMREMGenerator.fromScene() で畳んで scene.environment に渡す(HDRIファイルを読まずにPBRらしい面光源の映り込みが出る・アンバーの背面パネルで反射の色までブランドに寄せられる)。光源は方向光(影あり・PCF)+アンバーの点光源+半球光の3灯で、影は ShadowMaterial の床1枚だけを敷いて白背景を汚さずに接地感を出す。登場・退場・浮遊は AnimationMixer で扱う——モデルが無くても VectorKeyframeTrack('.scale') 等を手で組めばクリップになるので、rAFの中に手続きを書き散らさずに済む。標本の切り替えは canvas ではなく下の罫線台帳(button・aria-pressed)が正で、キーボードだけでも全て操作できる。3Dライブラリ(three)の採用はこのギャラリーの依存ゼロ方針に対する唯一の例外で、理由は「PBR・環境マップ・影・アニメーションを素のWebGLで書くと割に合わないため」——つまり素のWebGLで足りる表現(板ポリ・シェーダ背景・粒子)はこれまで通り依存ゼロで作り、3Dの質感実証だけをこのブロックに集約している。実測の追加コスト(three 0.185・本番ビルド)は追加チャンク 725,217バイト(約708KB)・gzip 181,641バイト(約177KB)で、静的importではなく useEffect 内の動的importで別チャンクに切り出し、実際に3Dを表示する画面でだけ読み込む(縮小プレビューでは親のscaleを rect.width÷offsetWidth で検出して読み込まない)。prefers-reduced-motion では自動回転もタイムラインも動かさず1フレームだけ描き、WebGL非対応・コンテキストロスト・低速時は静止パネルへ降りる。文言・配色・シェイプはすべてFirst CHのオリジナル。

Pages
PGE-07

分割ヒーロー(左テキスト×右ビジュアルの帯構成)

ヒーローを「テキスト面 / 細い分割レール / ビジュアル面」の縦3カラムに割った分割構成。右のビジュアル面は6本の縦帯に分解され、帯ごとに位置と長さの違う色片が下からせり上がる。その入りを90msずつずらすことで、視線が右のビジュアル→左の見出しへ流れる時間差を作る。画像素材ゼロ・JSゼロで、animation-fill-mode: backwards によりSSRの初期HTML・JS無効・reduced-motion では組み上がった完成状態で表示される。概要はカードにせず hairline罫線+余白でグルーピング(2026-08-21)。

Pages