SORAH Design
Guidelines
SORAHが手がけるすべてのプロダクトUI(アプリ・Web)に適用する共通規範。SORAH VIガイドを正典とし、iOS 26 HIG(Liquid Glass)、Strava、Apple Fitness、ChatGPTの設計思想を取り込んで新たに策定した。個別プロダクトの現行モックはこの規範に従って更新される(既存モックの見た目は本ガイドの根拠にしない)。資料・ドキュメントのトーンは別途「SORAH Document Style」が定める。
3つの原則
迷ったらこの3つに立ち返る。すべてのコンポーネント・画面・コピーはこの順で判定する。
コンテンツが主役、UIは退く
ユーザーが見たいのは自分のデータと変化であって、UIではない。装飾よりも余白、色よりもタイポグラフィで階層をつくる。ブランド色は面で塗らず、意味のある場所にだけ効かせる。
数字は一目で、太く
数値は常に Poppins・タブラー数字・極太で組み、単位は小さく添える。ひと目でスキャンでき、変化(良い/悪い)が色と符号で即座に分かること。グラフは1画面1メッセージ。
浮くものはガラス、置くものは紙
操作はガラスとしてコンテンツの上に浮き、読ませる情報は紙(不透明面)に置く。角丸は常に同心で、同じ意味には同じ色・同じ型を使い、画面ごとに発明しない。
ロゴ
本ページのロゴはVI原版(アウトラインデータ)から抽出した正確なベクター。Web実装ではこのSVGをそのまま流用してよい。印刷・入稿はVI原版AIデータを使用する。モチーフは S・衛星軌道・データ・昼夜・地球・陰陽。
プライマリー・ロックアップ Primary lockup
墨地・写真上ではワードマークのみ白に反転し、シンボルは常にVIブルー+白で保つ。ブルー地(#00BFFF)にはロックアップを置かず、シンボル単体か白ワードマークのみを使う。
シンボル Symbol
塗り版が第一。アウトライン版は塗り版が重くなる小さめの並置(フッター・スタンプ等)にのみ使う。アプリアイコン等プロダクト固有のマークは各プロダクトで別途定義し、SORAHシンボルを流用しない。
ワードマーク Wordmark
使用ルール Usage
- クリアスペースはVI原版の規定に従う(Web運用目安: シンボル直径の1/2以上を四周に確保)
- 最小サイズ目安: シンボル16px・ロックアップ高さ20px(Web)。それ以下ではシンボル単体に切替
- 色はVIブルー(#00BFFF)/白/墨(#231815)の3色のみ
- 変形・回転・ドロップシャドウ・グラデーション・縁取りの追加
- 曲線や点の再描画・トレース(必ず原版ベクターを使用)
- ワードマークの字間・比率の変更、他書体での組み直し
- プロダクト名をSORAHワードマークより大きな比率で併記
カラー
VIガイドのCI/UIパレットをそのままトークン化する。配分の目安は 白 90 : ブルー 7 : その他 3。ブランドを感じさせるのは面積ではなく、置き場所の正確さ。
CI パレット Brand
UI トークン Semantic
| Token | 値 | 役割 | 備考 |
|---|---|---|---|
--ink 〜 --ink4 | #111111 / #4A4A4A / #767676 / #8A8A8A | テキスト4段階 | 文字に使えるのは ink3 まで(#767676 = 4.5:1)。ink4 は罫線・アイコン・区切り専用で、文字色にしない |
--blue | #006BFF | Positive / Primary action | 1画面のプライマリボタンは1つ。アイコン・図・18px以上の見出しに使う |
--blue-fill | #0060E6 | 白文字を載せる面 | ボタン・ピル・バッジの地。見た目は #006BFF とほぼ同じで 5.5:1 を満たす |
--blue-dk | #05396B | Hover / Pressed / 第2系列 | 対になるデータ系列の対比色にも使用 |
--accent | #DA003C | Negative / 警告・削除 | 「悪い変化」の数値色。多用禁止 |
--tint / --tint2 | #E6F0FF / #F2F7FF | ブルーの淡面 | テーブルヘッダ・選択面・シート背景 |
--rule / --rule2 | #E5E5E5 / #D4D4D4 | 罫線・入力枠 | 影の代わりに1px罫線で区切る |
--gray-out | #CCCCCC | Disabled | 透明度でごまかさず、この色で無効を示す |
ガラスの色面 Glass tint
アイコン・図版・イラスト・装飾は「ソリッドの青」×「フロスト(すりガラス)の面」の2色面で構成する。フロスト面の背後に重なったソリッドはぼけて透ける。この言語はアイコンと図版のためのもので、ディバイダーのような装飾には使わない(v5.2で見出し下のバーを廃止)。
重なり部のぼかしは blur(2.4)(アイコン48px基準)。フロストの上に置く細部(点・針・ドア等)はソリッドで crisp に描く。
操作色とブランド色の分離 Action vs brandFrom SORAH App 2024
アートディレクターによるSORAHアプリ原案(2024)は、この分離を最初から実践していた ── ロゴと起動画面だけがVI Blue、ボタン・リンク・強調テキストは一段沈めた青、エラーは赤、セカンダリは薄いグレー面、ダークな没入画面の上では白抜き。原案の操作青(実測 #5C7BC6)は v5.2 で Graphic 01 #006BFF に正規化する。値は変わるが原則は変わらない: 明るい青は「ブランドの瞬間」、濃い青は「押せる場所」。
| 原案での役割 | 原案の色 | v5.2 トークン | 規定 |
|---|---|---|---|
| ロゴ・スプラッシュ・スキャン待機の芯 | ≈ #6BBDEB(VI Blueを一段沈めた空色) | #00BFFF --vi | ブランドの瞬間のみ。UIの操作面には使わない。原案の空色は VI 制定前の値で、アプリの原案再現時のみ使用可 |
| プライマリボタン・リンク・強調語(日付・著者名) | #5C7BC6(実測) | #006BFF --blue | 1画面1プライマリ。テキストリンクは太字で下線なし |
| セカンダリボタン(Cancel / Close) | 薄グレー面 | #F2F7FF --tint2+ink | プライマリの直下に同幅で縦積み。並列(左右)にしない |
| エラー文・エラー枠・Log out | 赤 | #DA003C --accent | 理由と回復手段を必ず併記 |
| 没入画面(Data Scape)上のUI | 白 / 白抜き | #FFFFFF (+ダークガラス) | シーン色に埋もれない。閉じる×・ツールボタンは常に白系 |
Data Scape のシーン色 Scene palettesFrom SORAH App 2024
没入型のデータ画面(Data Scape)だけは、題材そのものの色を画面全体に使ってよい。北極海氷は紺+氷の水色、森林は白+緑、河川は白+青灰、気温はClimate Stripesの赤青。これはUIの色ではなく内容の色 ── シーンの外(ヘッダー・シート・ボタン)には漏らさず、UIクロームはモードのトークンに従う。値は原案の実測。
規則: シーン色は1画面1系統。読み出しの数値もシーン色で組む(紺地なら白、白地なら題材色)。発散スケール(気温)は白を中点に、順序スケール(氷・森林)は地色→題材色の1方向。07の「データの色」に従う。
ダークモード Dark mode
没入型のデータ画面・ネイティブアプリのダーク対応で使う公式ダークパレット。VI Ink(#231815)は使わず中立黒で組み、ブルーは明度を上げてコントラストを取り直す。ライトの各トークンと1:1で対応させる。
| Light | Dark | 役割 |
|---|---|---|
| #FFFFFF(paper) | #0A0A0A | 背景 |
| #FFFFFF+1px #E5E5E5 | ダークガラス rgba(10,18,40,.42)+blur(14px)+1px rgba(255,255,255,.16) ベタ黒地のフォールバック時のみ #141414+1px #262626 | カード・サーフェス |
| #111111 / #4A4A4A / #8A8A8A | #F5F5F5 / #B5B5B5 / #8A8A8A | テキスト3段階 |
| #006BFF / #05396B | #1E8CFF / #4DA3FF(文字) | プライマリ・青系 |
| #0060E6 の面に白文字 | #1E8CFF の面に #08122B の文字 | ボタンの地と載る文字 |
| #DA003C | #FF4D6D | ネガティブ |
| #E6F0FF(tint) | rgba(30,140,255,.16) | 選択面・淡面 |
| #00BFFF(VI・ブランドのみ) | #00BFFF(そのまま。暗所で最も映える) | ブランド |
切替はOS設定に追従(prefers-color-scheme)。ダークモードの背景にはNightskyテクスチャーを敷き、その上のカード・ボタンはダークガラス(rgba(10,18,40,.42)+blur+白ヘアライン+上辺ハイライト)で組む——黒ベタの面をNightskyの上に置かない(上のデモがその状態)。ベタ#0A0A0A+#141414はテクスチャーを使わない場面のフォールバック。ライト/ダークで意味のマッピング(良い=青、悪い=赤系)は変えない。
- 良い変化=ブルー、悪い変化=アクセント、で全プロダクト統一
- ダークは中立黒+昇格ブルーで組み、全文字のコントラストを再検証
- 紙レイヤー(コンテンツ面)への影・グラデーション(立体表現はガラスレイヤーと表現レイヤーの専権)
- アクセント赤をポイント装飾・強調に流用
- 新しい色の追加(必要ならこのガイドを改版する)
タイポグラフィ
VI指定の幾何学サンセリフ(Gotham)のWeb代替として Poppins、和文は Noto Sans JP を正とする。英数字・数値・ラベルはPoppins、日本語文はNoto Sans JP。混植時はNoto側に揃える。
PERCEPTIONS
PERCEPTIONS
人々に新たな視座をもたらす
| Style | Font / Weight | Size | 用途 |
|---|---|---|---|
| Numeric Hero | Poppins 800 | 40–64px | 主要指標の主数値。単位は0.35emでink3 |
| Display EN | Poppins 800 / ltr-sp 0.01em | 34–58px | 見出し・ブランドコピー |
| Sky Type | Display/H1に空テクスチャーをclip | 28px〜 | タイトル・強調コピー専用。本文・小さな文字は禁止 |
| H1 JP | Noto Sans JP 900 | 21–30px | 画面・セクション見出し |
| Kicker | Poppins 700 / 0.18–0.22em / 大文字 | 10px | セクション番号ラベル(例: 01 — OVERVIEW) |
| Body | Noto Sans JP 400–500 | 14–15px | 本文。行間1.7–1.85 |
| Caption | Noto Sans JP 400 / ink3 | 11–12px | 注記・メタ情報 |
| Table Numeric | Poppins 600 / tabular-nums | 13.5px | 表の数値は必ず右揃え+等幅数字 |
読み出しの対 Readout pairFrom SORAH App 2024
時系列の没入画面では、数値は「軸の値|観測値」の対で読ませる(例: Year 2000 | Area 6,200,000 km²)。ラベルは9–10pxの大文字キッカー、値はPoppins 800・タブラー、単位は値の1/3で右に添える。対の間は1pxの縦罫。値の直下にスパークライン+現在位置のスライダーを置き、スライダーは軸の単位(年)ごとに止まる。読み出しは常時表示 ── 隠さない(07の「隠さない」の法則)。
記事ヘッダーの型 Article headerFrom SORAH App 2024
The Future of Arctic Sea Ice Revisited
氷と海の境界線:北極圏から透けて見える地球の未来
ヒーロー画像(全幅・角丸なし)→ 日付(ブルー・Poppins 700) → 見出し(欧文 Poppins 800 / 和文 Noto 900、2–3行)→ 署名(ブルー) → タグ(ink3)→ 罫線 → リード(太字本文)→ 本文。ブルーは日付と署名の2箇所だけに置くことで、見出しの黒が立つ。和文版は見出し直下に番号付きの目次(01/02/03)を置いてよい。編集文の規範は08に従う。
最低フォントサイズ Minimum sizes
OSの文字サイズ可変機能に追従する前提で設計する(iOS=Dynamic Type / UIFontMetrics、Android=sp単位、Web=remでブラウザ設定を尊重)。下表のpxは既定倍率(100%)時の基準値。ユーザーが200%まで拡大してもレイアウトが破綻しないこと(WCAG 1.4.4)。
| デバイス | 本文基準 | キャプション最小 | 絶対最小 | 備考 |
|---|---|---|---|---|
| SP(〜599px) | 15px | 12px | 11px | タブバーラベル9.5pxは絶対最小の例外(アイコン併記が条件) |
| Tablet(600–1023px) | 15–16px | 12px | 11px | 2カラム時も本文を縮めない |
| PC(1024px〜) | 15–16px | 12px | 11px | 10pxはPC限定・英大文字キッカー(字間0.18em以上)のみ可 |
運用ルール: 主要数値(Numeric Hero・リスト右端の値)は拡大設定に追従して大きくなってよいが、縮小はしない。Dynamic Type最大時はラベルの折返し・タブバーの2段化を許容し、文字の省略(…)でしのがない。Sky Typeは拡大時もコントラスト検証を再実施。
レイアウトと余白
4pxグリッド。主要な余白は 8 / 12 / 16 / 24 / 40 / 64 に限定する。詰めるより削る。1画面に載せる情報を減らすことが最良のレイアウト。
| 項目 | 規定 |
|---|---|
| コンテンツ幅 | モバイル: 画面幅−28px(左右14px)/ 読み物・アプリ本文の最大幅 760px / 本ガイドのような文書 1060px |
| セクションの型 | キッカー(10px・ブルー)→ 見出し(JP 900)→ 本文。見出しと本文の間は余白(22px)だけで区切り、飾りのバー・ディバイダーは置かない(v5.2で廃止)。全プロダクト共通の開始儀式 |
| 角丸 | 同心スケール 14 / 22 / 30px+カプセル(999px)で統一(v4.0で直角を廃止)。入れ子は常に同心(外30→内22→内14)。端末の画面角とも同心に。直角を使うのはコーポレートサイト・ドキュメントのみ |
| レイヤーと深さ | 紙レイヤー(コンテンツ): 白面+1px罫線、影なし。ガラスレイヤー(操作): 半透明+blur+ヘアライン+柔らかい影で浮かせる。ガラスの入れ子は1階層まで |
| アプリシェル | 本文がedge-to-edgeでスクロールし、その上に浮遊トップバー・浮遊タブバー(ガラス)が重なる。バーは画面端から8–12px離して浮かせる。Safe Area必須 |
| アプリを広い画面で開いたとき | スマートフォン用に組んだアプリをPCブラウザで開くときは、アプリ全体を1本の列(幅460px)に閉じて中央に置く。地は列の外側だけ薄いグレー(ライト #F4F6FA / ダーク #070C18)にし、列は1px罫線で囲う。ヘッダーのアイコン・シート・モーダルは列の内側で位置を決める ── 画面幅に対して絶対配置すると、本文から離れて別のUIに見える |
| 没入画面 From SORAH App 2024 | Data Scapeなど1題材で全画面を使う画面。上端に固定タイトル(長い場合は「…」)と閉じる×、右上にツールボタン(関連記事・インフォメーション)、下部に読み出し+チャート/スライダー、または切替ボタン。縦長のときは上下中央に縦積み、横長のときはビジュアルを左・読み出しを右に横並び。SP/タブレット/PC/アプリで同じ規則 |
| 中央モーダル | 確認(製品登録など)は画面中央の白カード(角丸30)。写真→名前→説明→プライマリ/セカンダリを縦積み・同幅。背後はスクリムで暗くし、×またはCancelで戻る。1画面に1つまで |
| 認証画面 | 上1/3にマーク+ワードマーク、下にボタンの縦積み。フォームは1カラム・ラベル常時表示・入力枠は全幅。画面遷移は「Sign up ⇄ Log in」を下部のテキストリンクで往復させる |
コンポーネント
v4.0でコンポーネント言語を Liquid Glass(Apple, 2025–)に全面転換した。UIは2層でできている: 紙のレイヤー(コンテンツ。白面・同心角丸・罫線)と、その上に浮かぶガラスのレイヤー(操作。半透明・blur・カプセル・柔らかい影)。直角は廃止し、角丸は同心スケール 14 / 22 / 30px / カプセル に統一。サンプルの数値・文言はダミー。
UIファウンデーション — フラット2モード UI Foundations v5.0
実プロダクト(BODY I-O)のUI構築を経て確定。プロダクトUIの地はフラット2モード — ライト=純白 #FFFFFF、ダーク=ネイビー #0C1428。「オート」は端末の外観設定に連動する。空のテクスチャーはUI背景に使わない(用途は下記「空のテクスチャー」参照)。ライトのカードは白面+ヘアライン罫線(rgba(17,17,17,.09))で影なし、選択状態にのみ軽いリフト影を許可。ダークのカードはダークガラス。Liquid Glass(blur)はコンテンツの上に浮くオーバーレイ層だけに適用する — 固定ヘッダー・フローティングタブバー・コンポーザー・HUD。コンテンツがバーの下を通過して透ける時にだけ、ガラスは意味を持つ。
ヒーロー(主要数値・達成面)はブランドブルーのグラデーション linear-gradient(130deg, #05396B → #006BFF → #00BFFF)+白数値。両モード共通のアクセントとして機能する。
タブバー — 分離ピル構成 Split-pill tab bar
- タブバー: メインカプセル(最大4タブ・選択=白ピル+リフト影)+独立した真円のAIピル(66px・ブルー・通知ドット)の分離構成。画面下端近くに浮かせ、コンテンツは下を通過して透ける
- ヘッダー: センタリングのタイプロゴのみ。罫線・日付等のメタ情報は置かない。マークロゴはスプラッシュとローディングで象徴的に使う
- スプラッシュ: 地はモード色、中央にマーク(パルス 1.7s)+タイプロゴ。最短1.1秒表示→フェードアウト
- 更新: ボタンではなく Pull-to-Refresh(引くとマークが回転しながら降りる)。読込中はガラススクワークルHUD+パルスするマーク
- キーボード: 表示中はタブバーを退避(フェード)し、入力欄をキーボード直上に追従させる
- 表記: 専門略号(P/F/C等)は使わず日本語(たんぱく質・脂質・炭水化物)。主要数値(kcal等)は結果カードの最上段に全幅で置く
空のテクスチャー Sky textures
v5.0で用途を変更。空のテクスチャーはUI背景には敷かない(実UIで検証の結果、フラット2モードに統一)。用途はブランドアートワーク専用: アプリアイコン・キービジュアル・Sky Type(タイトル文字への流し込み)・グラフィック/印刷物。原版はsorah.ioトップの空(hero-cloud)。写実には寄せず、強くぼかした抽象的な色面+アナログフィルムのグレイン(細粒ノイズ・浅いフェード・弱いビネット)に仕上げ、4種にグレーディングする。
使い分け(アートワーク): Morning Light=朝・開始の表現/Daylight=標準(アプリアイコンの地)/Twilight=達成・祝祭の表現/Nightsky=夜・ダーク文脈の表現。グレインは表示スケールで細粒に見える解像度で書き出す(グレインの拡大はNG)。空の上の文字は白+弱いシャドウ。UI画面の背景としての使用は禁止。
マテリアル Materials — on Daylight
ガラスは操作の器
背後のコンテンツが透けて動く。読ませる本文はガラスに載せない。
浮遊トップバー(カプセル・ガラス)/ガラスカード/浮遊タブバー(画面下端から離して浮かべ、選択タブは白ピル、AI機能はティントガラスで差別化)。ガラス= rgba(255,255,255,.55)+blur(18px) saturate(1.6)+ヘアライン+上辺ハイライト。ガラスの中にガラスを重ねない(1階層まで)。
アイコン Glass icons
線アイコンを廃止し、ガラスの色面2枚で描くアイコン体系。①フロスト面=主形状(何のアイコンかを決める)②ソリッドの青=意味のある部位にだけ(ドア・針・点灯ドット・日付・レンズ・頭部…)。意味のない装飾の丸は禁止。ソリッドがフロストの背後に潜る箇所だけぼける(blur 2.4 / 48px基準)。48pxグリッド・同心角丸。BODY I/O・SORAHアプリ等での使用を想定した基本21種。
構成則: フロスト=主形状、ソリッド=意味の芯(ドア=入る/針=時刻/3点=入力中/稲妻=運動/バッジ=未読)。1アイコンにソリッドの要素は1グループまで、2色以外使わない。空テクスチャーやガラスバーの上でも成立(タブバーは同アイコン23px、ティント地は白反転)。線アイコンは表内の小さなグリフのみ許可。
ボタン Buttons
全ボタンはカプセル。プライマリ=ティントガラス(ブルー90%+内側ハイライト)、セカンダリ=クリアガラス、アイコンボタン=円形ガラス。高さ44px以上・1画面のプライマリは1つ・ラベルは動詞。押下は scale(0.94) のバネ。
サーフェス Surfaces
紙カード
コンテンツの器。白面+罫線+角丸22px。影なし。
浮遊カード
柔らかい影で1段浮かせる。1画面に1枚だけ。
ダーク面
没入型のデータ表示に。#141414+角丸、ブルーは昇格版。
紙は「置く」、ガラスは「浮く」。読ませる情報は必ず紙(不透明面)に置き、ガラスには操作とラベルだけを載せる(Liquid Glassの可読性原則)。
表現レイヤー Expressive layer
紙とガラスの2層の上に、ブランドの瞬間にだけ表現レイヤーを重ねる。1画面1箇所まで。v5.0以降、アプリUIの表現面はブランドブルーのグラデーションを標準とし、空のテクスチャーはキービジュアル等のアートワーク文脈に限る。参照: Apple Liquid Glass(ガラス質の浮遊コントロール)/ Material 3 Expressive(バネのある形態変化)/ Strava(動きのあるテクスチャー)。
表現面: ブランドの瞬間(ヒーロー・達成・オンボーディング)の背景はブランドブルーのグラデーション+白文字。ガラスバー: コンテンツの上に「浮く」操作だけ半透明+blur+ヘアライン。中身のカードには使わない。prefers-reduced-motionで全停止。
バネのある形態変化(M3 Expressive型): ピル⇄角丸のモーフィング、選択ピルのスライドは spring イージング cubic-bezier(.34,1.56,.64,1)・350ms。押下は scale(0.93)。跳ねは操作の応答にだけ使い、装飾では動かさない。
数値表示 Stat display
ヒーローはブランドグラデーション面+白数値で1画面1枚(紙のstatカードと重ねない)。値はPoppins 800・タブラー、単位は小さく。変化は色だけでなく符号を必ず併記(Strava/Fitnessの走査性)。
プログレス Progress
1画面1つ・達成率にのみ使う
対になる2系列は blue/blue-dk で統一。しきい値超過など「悪い状態」への反転は accent。バーの高さ14–20px、トラックは tint2。
リスト Inset grouped list
iOS型のinsetグループ: 角丸22pxの紙面にまとめ、区切りは左インセット付き1px罫線。左=タイトル+メタ(ピル型チップ)、右=主数値。行全体をタップ領域にし、詳細はシートで開く。
シート Glass sheet
詳細・確認はガラスシートで下から。グラバー必須、下スワイプ/外タップで閉じる。角丸は上辺30pxで画面と同心。破壊的操作はシート内で danger カプセル+確認。
会話UI Conversational
ユーザー発話=ブルー・右寄せ、AI=tint2・左寄せ。角丸22px+発話側の下角のみ6px(向きの手掛かり)。コンポーザーはガラスのカプセルで本文の上に浮かせ、送信は円形ボタン。応答内の数値は太字。
フォームとフィードバック Forms & Feedback
入力枠は角丸14px、フォーカスでブルー枠+淡いグロー。エラーはaccent枠+理由と例を1行で。ラベルは常時表示(プレースホルダー代用禁止)。成功はガラスのカプセルHUDで短く応答し、2秒で消す。
空状態 Empty state
まだ記録がありません。
最初の1件を追加するとここに表示されます。
イラスト・マスコットは使わない。何が起きるか+次の1アクションだけを示す。
コーチング・シート Coaching sheetFrom SORAH App 2024
Your Collection
「持ち物がまだ無い」タイプの空状態は、空カードではなく画面下端のシートで「何を・どうすれば・入るか」を教える。見出し=得られるもの(Add to Your Collection)、本文=動作+場所(Scan NFC アイコンをタップして製品にかざす)、右に対象物のサムネと「+」。シートはコンテンツ側なので紙(白面+ヘアライン)で組み、ガラスにしない。
スキャン待機と結果 Scan & resultFrom SORAH App 2024
この製品をコレクションに追加しました。
待機はマークを芯にした同心円のパルス(1.8s、外へ広がって消える、3輪)── これは v5.0 のスプラッシュ・パルス(拡縮)とは別の「探している」動き。実際の読み取りはOS標準のNFCシートに委ね、独自UIを重ねない(09参照)。結果は中央の小カード: 円形アイコン → 状態名 → 1文 → 1アクション。成功は「Close」だけ、失敗は回復手段(Retry)とヘルプへの導線を必ず持つ。
登録モーダル Register modalFrom SORAH App 2024
スキャンした製品をあなたのコレクションに登録します。
2007–2020年の森林被覆の変化。JAXA FNF。
認証スタック(順序固定)
物を登録する確認は写真を見せる(何を登録するのかを目で確認させる)。写真→製品名→1–2行の説明→プライマリ/セカンダリの縦積み。認証の入口は Apple → Google → メール登録 → ログイン の順で固定し、ソーシャルは各社の規定文言・アイコンをそのまま使う(改変しない)。メール登録後は「Verify」画面(盾アイコン+1文)を挟み、Sign up ⇄ Log in はテキストリンクで往復。
設定リスト Settings listFrom SORAH App 2024
マイページは1行1項目のinsetリスト+シェブロンだけで組む。順序は「自分のこと → 言語 → 助け → 会社 → 法務 → ライセンス」、最後にLog out を赤文字で1行(ボタンにしない)。アカウント削除は設定画面のいちばん下にテキストリンクで置き、確認を挟む。
モーション
| 用途 | 時間 | イージング | 備考 |
|---|---|---|---|
| タップ反応(アイコン縮小等) | 120ms | ease | scale(0.9)程度。触感の代替 |
| 要素の出現(メッセージ・シート) | 260ms | ease / backwards | translateY(8px)+fade。1方向のみ |
| バー・グラフの伸長 | 500ms | ease | 数値の変化を見せる時だけ |
| 形態変化・選択ピルのスライド(表現レイヤー) | 350ms | spring cubic-bezier(.34,1.56,.64,1) | 操作の応答にだけ。装飾では動かさない |
| スプラッシュのマーク(パルス) | 1.7s loop | ease-in-out / scale 1→1.06 | 起動時。最短1.1秒表示→フェード .55s |
| Pull-to-Refresh インジケータ | 追従 | 引き量に応じ回転・降下 | マークを使用。閾値超えで更新実行 |
| ローディングHUD(パルス) | 1.2s loop | ease-in-out | ガラススクワークル+マーク。データ読込中 |
| 注意喚起(バッジ等) | 1.8s×3回 | ease-in-out | 無限ループ禁止。3回で止める |
| スキャン待機(同心の面)App 2024 | 2.6s loop / 3面 0.85s間隔 | ease-out / scale 1→2.6, opacity .28→0 | 原案の実測: マーク(145px)を芯に #66B4E7 10%の塗り面が 210 / 270 / 340px で重なり、その外に 470 / 950px の1pxの円(#6BBDEB)。線ではなく面が外へ広がって薄れる。「探している」状態にだけ使い、OSのNFCシートが出たら止める |
| Data Scape 自動再生/自動回転App 2024 | 連続 | linear(回転)/ 年ごとにステップ(時系列) | 開いた直後は自動で動く。タップで停止→以後は手動(スライダー・ドラッグ回転)。表示切替ボタンを押しても回転は続ける。再開ボタンは置かない |
| チュートリアル(初回のみ)App 2024 | in .3s → 2s → out .3s | fade | 「Tap & Scroll」のような操作ヒント。自動で消え、閉じる操作を要求しない |
原則: 動きは情報(何が変わったか)を運ぶ時だけ使う。例外は表現レイヤーの動的テクスチャーのみ(ブランドの瞬間・1画面1箇所)。パララックスは使わない。prefers-reduced-motion で全アニメーションを停止する。
データビジュアライゼーション
SORAH は図を二つの場所で使う ── 人が操作している画面の中と、単体で受け取られる発信物。同じ規範では作れない。まずどちらかを決め、そのうえで共通の法則に従う。
二つのレジスター
| プロダクトの図 | 発信のグラフィック | |
|---|---|---|
| 読まれ方 | 操作の途中で走査される | 単体で受け取られ、共有される |
| 地 | ライト=純白 / ダーク=#0C1428 | 白のみ(紙) |
| 書体 | 数値 Poppins 800 tabular / 和文 Noto Sans JP | 欧文 Gotham / 和文 見出ゴ・Yu Gothic |
| 色 | #006BFF を強調1点。#DA003C は負の変化のみ | 紙の色(INK / GRAY)+データの色を1系統 |
| 数字 | 大きく太く、カードの最上段に | 見出しに置かない。本文に潜ませる |
| 正典 | 本ガイド | 本ガイド + SEE 編集原則 |
迷ったときの判定 ── その図を、人が操作している画面の中で見るのか、それ単体で受け取るのか。操作の中なら前者、単体なら後者。記事の中の図版は後者に従う。
共通の法則
| 法則 | 意味 | 落ちる例 |
|---|---|---|
| 1図1メッセージ | ひとつの図はひとつの発見だけを運ぶ。二つあるなら二枚に分ける | 指標を並置したダッシュボード |
| 色は階層、装飾ではない | 色は情報の重みを区別するためだけに使う。きれいだから塗る、はしない | 系列ごとに違う色を割り当てただけの折れ線 |
| 凡例より直接ラベル | 置ける場所があるなら図の上に直接書く。凡例は最後の手段 | 色と意味を目で往復させる凡例 |
| 基準のない数字は意味を持たない | 何と比べたのかを図の中に置く。平年、前年、他の地域、45年前 | 単独の「+1.23°C」 |
| 注釈が図の主役 | 言葉はパターンか解釈を名指す。「ここにデータがあります」とは言わない | 軸ラベルだけの図 |
| 比較を歪めない | 棒はゼロ起点。面積は面積で比べる。二重軸・切断軸・3Dは使わない | 差を誇張した切断軸 |
| 隠さない | 重要な内容をホバーやタップの裏に置かない。既定の状態で意味が通ること | ツールチップにしかない数値 |
| 不確かさを描く | 暫定値・欠測・観測日を、確定値と同じ顔で出さない | 観測日を書かない「今日の」 |
| グレースケールで生きる | 色を落としても読めること。赤緑の識別に依存しない | 赤と緑で正負を分けただけの図 |
図の型と用途
図の形式選びは T シャツ選びではない。型にはそれぞれ機能がある。
| 型 | 使う場面 | 注意 |
|---|---|---|
| 線 | 連続量の推移 | 同時に描くのは3本まで。4本を超えるなら面を分ける |
| 棒 | 離散した項目の比較 | ゼロ起点。項目は意味のある順に並べる(アルファベット順にしない) |
| 縞 | 1次元の長い時系列 | 1本=1期間を明示。端の年を必ず置く |
| 面 | 構成比の推移 | 合計が意味を持つときだけ。積み上げの順序を途中で変えない |
| 点 | 分布と外れ値 | 重なりは透明度ではなく間引きか六角格子で解く |
| 六角格子 | 密度 | 元データより細かい解像度に集計しない |
| 地図 | 位置そのものが発見であるとき | 下記 |
| 円グラフ | 使わない | 5分割以下でも棒が勝つ。例外は「ほぼ全部か、ほぼゼロか」を一目で示す場合のみ |
地図を使ってよい条件
- どこで起きたかが発見の中身であるとき
- 地理の形そのものが読者の知っている形と結びつくとき
- 分布の偏りが、面積ではなく位置で説明できるとき
- 「どこにでもある」ことしか示していない(=世界地図に点を撒いただけ)
- 実際に読ませたいのは順位や量で、位置は付随情報にすぎない
- 人口の多い場所に点が多い、という当たり前を再確認しているだけ
データの色
ブランドの色と、データの色は別の仕事をする。混ぜない。
| 系統 | 使う場面 | 規定 |
|---|---|---|
| 発散(青—白—赤) | 基準からの偏差 | 気温の偏差など、正負が意味を持つ量に限る。中央値を必ず白に置く |
| 順序(白→INK / 白→#05396B) | 量・密度・深さ | 色相を増やさない。明度だけで段階をつくる |
| 分類 | 使わない | 1図1メッセージなら分類色は要らない。必要になったらそれは2図に分けるべき図である |
| ブランド色 | データでの扱い |
|---|---|
| VI Blue #00BFFF | データに使わない。ブランド専用(ロゴ・ブランドの瞬間) |
| #006BFF | プロダクトの図で、強調したい1系列だけ。複数系列に配らない |
| #05396B | 第2系列、または順序スケールの濃端 |
| #DA003C | 負の変化・警告のみ。装飾に使わない |
| 虹(rainbow / jet) | 使わない。順序が知覚と一致しない |
没入シーン ── Data Scape From SORAH App 2024
プロダクトの図のうち、1題材で画面全体を使うものを「シーン」と呼ぶ。原案(2024 Data Scape仕様)は4作品を2つの型に整理していた。新しい題材はどちらかの型に収める ── 型を増やすのは、どちらにも収まらないと確かめてから。
| 地図/データ+チャート型 | 地球+ボタン型 | |
|---|---|---|
| 題材 | 時系列で形が変わるもの(Arctic Ice、Climate Stripes) | 状態を比べるもの(Forest: Original / 2020、River: Flow / Impacted) |
| 初動 | 自動再生(年が進む) | 自動回転(球体) |
| 操作 | チャートをタップで停止 → スライダーで年を選ぶ(年ごとにスナップ) | 球体をタップで停止 → ドラッグで回す。表示はボタンで切替(2択・セグメント) |
| 読み出し | 「年|値」の対+スパークライン(03「読み出しの対」) | 比率+面積など「率|量」の対。切替に連動して更新 |
| 色 | 題材色を全画面に(02「シーン色」)。発散スケールは白が中点 | 白地+題材色1色。切替の2状態は同じ色相の濃淡で、別の色を足さない |
| 共通の骨格 | 固定タイトル+×、右上に「関連記事」「インフォメーション(出典・観測日)」の2ボタン、初回のみ操作チュートリアル(2秒で消える)。SP/タブレット/PCで縦横比に応じて縦積み⇄横並び(04「没入画面」) | |
シーンは「操作している画面の中」にあるのでプロダクトの図だが、切り取っても意味が残るように作る(発信のグラフィックの条件を兼ねる)── だから出典と観測日はインフォメーションに必ず入れ、読み出しは常時表示にする。
数字の組み方
- 数値は必ずタブラー数字。桁が縦に揃わない図は作らない
- 4桁以上は3桁区切り。単位は数字より小さく添え、数字との間を空けない(1,234 kcal ではなく 1,234kcal)
- 有効桁は意味のある桁で止める。観測精度を超える桁を書かない
- 大きすぎる数はそのまま出さず、身体か生活で測れる単位に翻訳する
- 比率と実数の両方を持たせる。読者に暗算をさせない
- 作画が紙面を支配する。図が主で、余白は従
- 軸・罫・格子は最小限。消して読めるなら消す
- 色を落として(グレースケールで)読めるか毎回確認する
- 出典・観測日・系列の位置を必ず添える
- 影・グラデーション・3D・立体棒・装飾アイコン
- 二重軸、切断軸、面積で量を表す円
- 凡例を読ませる、単位を換算させる、順路を探させる
- 図を余白に浮かせる(作画が小さいのは、決められていないことの現れ)
ボイス&トーン
SORAH の言葉にも二つのレジスターがある。UIコピーは「有能で、簡潔で、責めない」声。編集文は「観察的で、削ぎ落とされた」声。人称も文体も違う。
レジスターの選択
| UIコピー | 編集文(発信) | |
|---|---|---|
| 置かれる場所 | アプリ・Web の操作面、AI応答 | グラフィック、記事、投稿、ニュースレター |
| 文体 | 敬体(です・ます) | 常体(である・だ) |
| 人称 | 主語を立てない。ユーザーを「あなた」と呼ばない | 一人称複数(私たち)。ただし名乗りは最小限 |
| 構え | 結論から。次の操作を示す | 観察を置く。断定しない。読者が自分で結論に達する余地を残す |
| 数字 | 最初に、太く | 見出しに置かない。本文に潜ませる |
UIコピー
- 結論から。数字を根拠に短く話す
- できなかったことは「次どうするか」に言い換える
- 敬体(です・ます)。専門用語を避ける
- ボタンは動詞で(「この内容で保存」「撮り直す」)
- 責める・煽る表現(未入力は仕組みの問題かもしれない)
- 精神論・根拠のない断定・専門領域(医療等)の判断
- 絵文字の乱用(AIの文章では使わない)
- 「エラーが発生しました」だけの無情報メッセージ
状態を告げるコピー State copyFrom SORAH App 2024
原案のコピーは、状態名を短い名詞句で立て、その下に1文で「何をすればよいか」を置く型で統一されていた。この型を規範にする: 状態名(2–3語)→ 動作+場所の1文 → 回復手段。
| 場面 | 原案(EN) | 日本語UI(敬体) | 型 |
|---|---|---|---|
| 待機 | Ready to Scan Hold the NFC tag steady and long enough to your iPhone. | スキャンできます 端末の上端をタグに近づけて、そのまま待ってください。 | 状態名+動作と場所 |
| 空(持ち物なし) | Add to Your Collection Tap the Scan NFC icon and hold your device over the product. | コレクションに追加 スキャンのアイコンをタップして、製品に端末をかざしてください。 | 得られるもの+動作と場所 |
| 失敗 | Scan error view help page / Retry Scan | 読み取れませんでした ヘルプを見る / もう一度スキャン | 状態名+回復手段2つ(やり直す・調べる) |
| 成功 | Register success Close | 登録しました 閉じる | 状態名+閉じるだけ。祝福語や絵文字は足さない |
| 確認 | Register your Product Register / Cancel | この製品を登録 登録する / キャンセル | 動詞で始まる見出し+動詞のボタン |
英語UIは原案の文言をそのまま正とする(Sign up / Log in / Forgot Password? / Don't have an account? Sign up)。日本語は敬体で、「エラー」という語を状態名に使わない ── 何が起きたかを言う。
編集文 ── 発信のトーン
- 観察を書く。「〜である」と言い切る前に、何を見たのかを書く。規範ではなく観察のレジスターに立つ
- 削ぎ落とす。形容詞と副詞を疑う。修飾を1つ外して意味が減らないなら、外す
- 見出しは問いか観察。結論の数字を見出しに置かない
- 数字は本文に潜ませる。本文では算用数字・3桁区切り。単位との間を空けない
- 単位を身体に落とす。°C・km²・ppm で止めず、人・日・面積の比喩まで翻訳する
- 体言止めを多用しない。断定が強くなり、観察のレジスターから外れる
- ひらがなに開く基準を持つ。動詞の本体は漢字(退く・縮む・届く)、補助動詞と形式名詞はひらく(〜していく・〜のこと)
見出しの作法
- 和文17字以内を目安にする(G1 の作画枠がそれ以上を許さない)
- 主語を立てる。「何が」どうしたのかが読める形にする
- 比較を含める。何と比べたのかが無い見出しは、情報ではなく数字の報告になる
- 専門語を素の言葉に置き換える。「平年」「偏差」「エクステント」は本文か注に落とす
和欧混植
境界は文字単位ではなく連(run)単位で判定する。
- 数字で始まる欧文連は数量 → 詰める:この30日 2,274万人 1.1°C高い
- 英字で始まる欧文連は語 → 四分アキ:NASA GISTEMP v4 の観測
- 入力に含まれる余分な空白は先に取り除く。処理は何度かけても同じ結果になること
直した文
2026.08 の日次グラフィックから。左が最初に出したもの、右が本規範に通したもの。
| 直す前 | 直したあと | 理由 |
|---|---|---|
| この10年の平年は、最初の30年より1.3°C高い | 赤が途切れなくなったのは、1980年からだ | 「平年」は気候学の術語で日常語ではない。数字の報告ではなく、図に見えているパターンを名指す |
| 9月1日の氷は、45年で日本7個分ちいさくなった | 45年で、日本7つ分の氷が退いた | 「ちいさくなった」の開きすぎと「個分」の粗さ。動詞の本体は漢字に戻す |
| この30日、揺れが届いた範囲に5,905万人が暮らす | (保留 ── 数字を先に詰める) | 「届いた」の定義が曖昧なまま人口を数えている。定義を決めるまで文にしない |
| 1本が1年。色は1951–1980年平均との差。 | 1本が1年。右へ行くほど、基準より暑い | 凡例の説明ではなく、読み方を渡す |
| 今日の線 — 2026.08.28 | 最新の線(2026.08.28 観測) | 発行日と観測日の不一致を、注記なしで「今日」と書かない |
書いたあとの三問
- この文を読んだ人は、それを誰かに説明できるか
- 見出しを隠しても、図だけで「何かがおかしい」と気づけるか
- 数字に基準が添えてあるか
使わない語
革新的 / 革命的 / イノベーション / 「世界をより良くする」の単独使用 / 「届ける」「提供する」の多用(一方向的) / 絵文字 / 専門略号(P・F・C 等)/ Creative Platform(退役した自己定義)
絵文字と絵文字的な記号は、文章にもUIにも使わない。☝ ➡️ ✓ ✔ のようなピクトグラフを操作の合図や状態のマークに置かない ── 環境ごとに字形と色が変わり、トーンが崩れる。チェック・警告・方向はSVGで組む(線幅と色はトークンに従う)。文中の矢印は活字の ↗(外部リンク)まで。
iOS作法(iOS 26 / Liquid Glass対応)
| 項目 | 規定 |
|---|---|
| 階層 Hierarchy | コントロールはコンテンツの上に「浮く」。ネイティブ化ではタブバー・ツールバーに標準のガラスマテリアルを許容し、中身のカードはこのガイドのフラット様式を保つ |
| 調和 Harmony | 角丸は端末・親コンテナと同心(concentric)に。Web版も同じ同心スケール(14/22/30/カプセル)なのでそのまま移植できる |
| 一貫 Consistency | 標準コンポーネント(シート・ナビゲーション・触覚)を優先し、独自実装は本ガイドのコンポーネントに限る |
| タップ領域 | 44×44pt以上。行タップ・×ボタンは余白込みで確保。Webも同値(10参照) |
| Safe Area | 上下とも必須。タブバーは env(safe-area-inset-bottom) を含めて設計 |
| ダーク対応 | 背景は中立黒(#0A0A0A付近)+ブルーは明度を上げた #1E8CFF / #00BFFF 系に切替(コントラスト再検証) |
| NFC App 2024 | 読み取りはCore NFCの標準シート(Ready to Scan)に委ねる。独自の読み取りUIを重ねない。シートの案内文(alertMessage)は本ガイド08の「状態を告げるコピー」で書く。待機中の同心円パルスはシート表示前のアプリ画面側に置く |
| Sign in with Apple App 2024 | ソーシャルログインを置く場合はAppleを最上段(App Store審査要件)。ボタンはApple/Googleの規定スタイルを改変しない。順序: Apple → Google → メール → ログイン |
| アカウント削除 | 設定の最下部にテキストリンクで置き、確認ダイアログを挟む(審査要件)。Log out は赤文字の1行 |
アクセシビリティ
| 項目 | 基準 |
|---|---|
| コントラスト | 本文 WCAG AA(4.5:1)以上。#006BFF×白は4.0:1のため18px未満の本文文字色には使わない(アイコン・18px以上の見出し・数値はOK)。小さな青文字は --blue-txt #05396B(11.7:1)、ダークは #4DA3FF(7.1:1) |
| ボタンの地 | 白文字を載せる面は --blue-fill #0060E6(5.5:1)。#006BFF に白文字は 4.0:1 で不足する。ダークでは明るい青地 #1E8CFF に濃紺 #08122B の文字を載せる(5.6:1)── 明るい青に白は 3.3:1 |
| グレー階調 | 文字色に使えるのは --ink3 まで。--ink4 は白地で 2.1:1 なので文字に使わない(罫線・アイコン・区切り専用)。リストのシェブロンなど意味を持つ記号は ink2 |
| タップ領域 | 44×44pt 以上(戻る・アイコンボタン・閉じる・See All・チェックボックス)。文中のインラインリンクは行の制約を受けるため例外だが、行間で 24px は確保する |
| 文字サイズ | 本文15 / キャプション12 / 絶対最小11px、11px未満は作らない。Webは rem で組み、OSの文字サイズ設定に追従させる。200%拡大で横スクロールを出さない(固定列のグリッドは auto-fit / minmax() に) |
| 色以外の手掛かり | 良い/悪いを色だけで伝えない。符号(+/−)・ラベルを併記 |
| 数値 | tabular-nums必須。桁区切りは半角カンマ |
| フォーム | 全入力にラベル。プレースホルダーをラベル代わりにしない |
| モーション | prefers-reduced-motion でアニメーション停止。自動再生・自動回転も初期状態で止める(Data Scape のシーンは停止状態で開き、操作で動かす) |
| 画像 | 意味のある画像にはalt。装飾のSVG・図形は aria-hidden="true" + focusable="false" で読み上げから外す |
| フォーカス | キーボード操作に :focus-visible のリング(3px、2px offset)。outline:none だけにしない |
参照と改版
原案: SORAH App(2024)── アートディレクターによる画面遷移仕様(2024-09-03)・UIデザイン31画面(SORAH_APP+++ 0902)・Data Scape仕様書(2024-10-18)・実機キャプチャ(2025-01)。v5.2で要素を各セクションに取り込んだ(From SORAH App 2024 の印)
参照: Apple Human Interface Guidelines(iOS 26 / Liquid Glass) · iOS & iPadOS 26 Figma Library · Material 3 Expressive(バネのあるモーション・形態変化) · Google Stitch — DESIGN.md(機械可読スペック形式) · design.md spec(GitHub) · Strava(数値の走査性・動きのあるテクスチャー) · Apple Fitness(ダーク面とリング・大数字) · ChatGPT(抑制されたニュートラル面・会話UI・トーン) · NYT Graphics / The Upshot(注釈層・スクロール前提・再説明テスト) · WSJ Graphics(ダッシュボードからの離脱・連続ものは系として作る) · Dona Wong『WSJ Guide to Information Graphics』(図形式の機能・色は階層) · WIRED(見えないものに形を与える・For Future Reference)
改版: v5.3 — 2026-09-06 アクセシビリティ(10)を追補。SORAHアプリ v0.7 でガイドを実装に当て、自動監査(コントラスト・文字サイズ・タップ領域を light/dark × 100%/200% で走査)にかけた結果を差し戻した。ボタンの地に
--blue-fill #0060E6 を新設(#006BFF に白文字は 4.0:1 で本文AAに届かない。見た目はほぼ同じで 5.5:1)、ダークは明るい青地 #1E8CFF に濃紺 #08122B の文字(白文字は 3.3:1)、--ink4 を文字色から外す(白地 2.1:1。罫線・アイコン専用とし、文字は ink3 #767676 まで)。あわせてタップ領域 44×44pt、文字サイズの下限と rem 化・200%非破綻、自動再生と自動回転も reduced-motion で初期停止、装飾SVGの aria-hidden + focusable="false"、:focus-visible のリングを明文化。02 のスウォッチと semantic トークン表、ダークの対応表も更新。あわせて04に「アプリを広い画面で開いたとき」(PCでは幅460pxの1列に閉じ、ヘッダー・シート・モーダルは列の内側で位置を決める)、08に絵文字と絵文字的記号の禁止(☝ ➡️ ✓ をUIの合図に使わない。チェック・警告・方向はSVGで組む)を追記。DESIGN.md に a11y ブロックを追加(5.3.0)。 v5.2 — 2026-09-05 見出し下のフロスト×ソリッドのディバイダーを全廃(装飾のディバイダーは置かない。区切りは余白と1px罫線のみ)。アートディレクター原案のSORAHアプリ(2024)から要素を取り込み、既存セクションに分配。02 操作色とブランド色の分離(原案の操作青を #006BFF に正規化)と Data Scape のシーン色4種、03 読み出しの対(年|値+スパークライン・年スナップのスライダー)と記事ヘッダーの型、04 没入画面/中央モーダル/認証画面のレイアウト規則、05 コーチング・シート/スキャン待機と結果カード/登録モーダル・認証スタック/設定リスト、06 スキャン待機パルス・シーンの自動再生と停止・チュートリアル、07 没入シーン Data Scape の2つの型、08 状態を告げるコピー(状態名→動作と場所→回復手段)、09 NFC標準シート・Sign in with Apple・アカウント削除。DESIGN.md に app / scenes ブロックを追加(5.2.0)。 v5.1 — 2026-08-31 データビジュアライゼーション(07)を新設。図を「プロダクトの図/発信のグラフィック」の二つのレジスターに分け、選択の判定を規定。共通の9法則(1図1メッセージ・色は階層・直接ラベル・基準・注釈が主役・比較を歪めない・隠さない・不確かさ・グレースケール耐性)、図の型と用途、地図を使ってよい条件、データの色(発散/順序/分類とブランド色の扱い、虹スケール禁止)、数字の組み方を追加。ボイス&トーン(08)をリッチ化し、UIコピー(敬体)と編集文(常体)の二レジスターに分割。見出しの作法、和欧混植の連単位規則、直した文の実例、書いたあとの三問、使わない語を追加。DESIGN.md に dataViz / copy ブロックを追加。 v5.0 — 2026-08-30 実プロダクト(BODY I-O)でのUI構築を経て確定した内容を反映。UI地をフラット2モード(ライト=純白+ヘアライン罫線カード・影なし/ダーク=#0C1428+ダークガラス、オート=端末外観連動)に変更し、空のテクスチャーをUI背景から引退させブランドアートワーク専用(アプリアイコン・キービジュアル・Sky Type)に再定義。ヒーロー/表現面はブランドブルーグラデーションを標準化。タブバーを分離ピル構成(メインカプセル+真円AIピル)に、ヘッダーをセンタリングのタイプロゴのみに規定。スプラッシュ/Pull-to-Refresh/ローディングHUD/キーボード退避の挙動を規範化。表記規定(略号禁止・主要数値は全幅最上段)を追加。v4.4 — 2026-08-29 Nightsky上のダークサーフェスをダークガラス化(黒ベタ廃止)、コントロール内アイコンをグラスアイコンに統一(線アイコン残存を排除)、デバイス別の最低フォントサイズと文字サイズ可変追従を規定。v4.3 — 2026-08-29 Morning Light追加で空4種に、アイコンを「ソリッド=意味の芯」原則で再設計し21種へ拡充(意味のない丸を全廃)、ダークモード背景にNightskyを採用。v4.2 — 2026-08-29 ガラスの色面(Frost×Solid)をカラーに追加しガイド全体へ適用、Sky Type(空テクスチャー文字)をタイトル・強調用に規定、2色面グラスアイコン体系を新設(線アイコン廃止)。v4.1 — 2026-08-29 空のテクスチャー3種(Daylight/Twilight/Nightsky、sorah.ioトップの空hero-cloud原版)を導入しガラス背景を全面置換、ダークガラス材質を追加。v4.0 — 2026-08-29 コンポーネント言語をLiquid Glassに全面転換(紙/ガラスの2層モデル、同心角丸14/22/30/カプセル、直角廃止、浮遊ナビ・ガラスシート・insetグループリスト)。v3.0 — 2026-08-29 ダークモード規範・表現レイヤー・機械可読DESIGN.md追加、CIパレット修正。v2.0 — 2026-08-29 ロゴをVI原版ベクターに差替え、標準型へ全面改定。v1.0 — 2026-08-29 初版。このガイドの変更はSORAHの承認を経て改版する。色・コンポーネントの追加は必ずここに反映してから実装する。
機械可読スペック
Google(Stitch)がオープンソース化した DESIGN.md 形式によるSORAHデザインシステムの機械可読版。AIエージェント(Claude Code等)にUIを作らせる時、この1ファイルをリポジトリ直下に置けば、色の「意図」まで含めてブランド通りのUIが生成される。YAMLフロントマター=正規値、本文=適用の文脈。
---
name: SORAH Design System
version: 5.3.0
colors:
vi: "#00BFFF" # Brand only — logo & brand moments. Never for UI actions.
primary: "#006BFF" # Actions, selection, positive change. One primary button per screen. Icons & >=18px headings only for text.
blueFill: "#0060E6" # Ground for white text (buttons, pills, badges). 5.5:1 — #006BFF is 4.0:1 and fails AA.
blueText: "#05396B" # Blue text under 18px. 11.7:1 on white.
primaryDeep: "#05396B" # Hover / pressed / second data series.
negative: "#DA003C" # Negative change, warnings, destructive only. Never decorative.
ink: "#111111"
ink2: "#4A4A4A"
ink3: "#767676" # Last step usable as text (4.5:1).
ink4: "#8A8A8A" # Rules, icons, dividers. NEVER text.
paper: "#FFFFFF"
tint: "#E6F0FF"
tint2: "#F2F7FF"
rule: "#E5E5E5"
rule2: "#D4D4D4"
disabled: "#CCCCCC"
frost: "#CBD9F9" # Glass tint plane (82%) — icon & illustration language.
modes: # v5.0 — flat two-mode ground. "auto" follows OS appearance. Sky textures are NOT UI backgrounds.
lightBg: "#FFFFFF" # Pure white ground; cards = white + 1px hairline rgba(17,17,17,.09), no shadow (lift shadow on selected state only).
darkBg: "#0C1428" # Flat navy ground; cards = dark glass.
dark:
bg: "#0C1428" # Flat navy. (nightsky texture retired from UI backgrounds in v5.0)
surface: "rgba(10,18,40,.42)" # Dark glass + blur(14px) + 1px rgba(255,255,255,.16) — never opaque black slabs on Nightsky.
surfaceFallback: "#141414" # Only on flat-black fallback ground.
border: "rgba(255,255,255,.16)"
text: "#F5F5F5"
primary: "#1E8CFF" # Elevated blue — #006BFF sinks on dark.
blueFill: "#1E8CFF" # Ground for buttons on dark…
onBlueFill: "#08122B" # …with deep navy text (5.6:1). White on #1E8CFF is 3.3:1.
blueText: "#4DA3FF"
negative: "#FF4D6D"
typography:
numeric: { fontFamily: Poppins, weight: 800, feature: tabular-nums }
displayEn:{ fontFamily: Poppins, weight: 800, letterSpacing: 0.01em }
headingJp:{ fontFamily: "Noto Sans JP", weight: 900 }
body: { fontFamily: "Noto Sans JP", weight: 400, size: 15px, lineHeight: 1.85 }
kicker: { fontFamily: Poppins, weight: 700, size: 10px, letterSpacing: 0.2em, transform: uppercase }
minSize: # At default (100%) scale. MUST track OS text scaling (Dynamic Type / sp / rem) up to 200%.
phone: { body: 15px, caption: 12px, absolute: 11px } # 9.5px tab labels only with icons.
tablet: { body: 15px, caption: 12px, absolute: 11px }
desktop:{ body: 15px, caption: 12px, absolute: 11px } # 10px uppercase kickers desktop-only.
scaling: { web: rem, ios: dynamic-type, android: sp, layoutMustSurvive: 200% }
a11y: # v5.3 — verified on SORAH App v0.7 with an automated audit (contrast / size / tap).
contrast: { bodyText: 4.5, largeText: 3.0, note: "Large = >=24px, or >=18.66px bold." }
textColor: { blueOnLight: "#05396B", blueOnDark: "#4DA3FF", lastUsableGray: ink3 }
buttonFill:{ light: "#0060E6", lightLabel: "#FFFFFF", dark: "#1E8CFF", darkLabel: "#08122B" }
tapTarget: { min: 44, unit: pt, inlineLinkException: 24 }
motion: { respectReducedMotion: true, autoplayStartsStopped: true }
decoration:{ svg: 'aria-hidden="true" focusable="false"', focusRing: "3px, 2px offset" }
dataViz: # v5.1 — two registers. Decide the register first, then obey the shared laws.
registers:
product: { ground: mode, numerals: "Poppins 800 tabular", accent: "#006BFF", negative: "#DA003C", numbersFirst: true }
editorial: { ground: "#FFFFFF", roman: Gotham, palette: "paper ink/gray + ONE data scale", numbersInBody: true, alsoObeys: "SEE editorial principles" }
decide: "Seen inside a screen the reader is operating -> product. Received on its own -> editorial. Figures inside articles are editorial."
laws:
- one figure, one message
- colour encodes hierarchy, never decorates
- label directly; a legend is the fallback
- a number without a reference means nothing
- the annotation layer is the figure
- never distort the comparison (bars from zero, no dual axis, no truncation, no 3D)
- nothing important behind hover or tap
- draw the uncertainty (provisional, missing, observation date)
- must survive greyscale and red-green deficiency
forms:
line: continuous # max 3 series
bar: discrete-comparison # zero baseline, meaningful order
stripe: one-dimensional-time
area: composition
dot: distribution
hex: density # never finer than the source raster
map: "only when location itself is the finding"
pie: not-used
scales:
diverging: { use: "signed anomaly only", mid: white }
sequential: { use: "quantity / density / depth", ramp: "white -> ink or #05396B" }
categorical: not-used
brandColourInData:
"#00BFFF": never # brand only
"#006BFF": "one emphasised series (product register)"
"#05396B": "second series or deep end of a sequential ramp"
"#DA003C": "negative change only"
rainbow: never
numerals: { tabular: true, grouping: true, unitTight: true, significantDigitsOnly: true, translateLargeNumbers: true }
forbidden: [ shadow, gradient-fill, 3d, dual-axis, truncated-axis, area-encoded-circles, decorative-icons, floating-small-plot ]
scenes: # v5.2 — full-screen single-subject figures (Data Scape). From SORAH App 2024 (AD).
types:
timeseries: { subjects: [arctic-ice, climate-stripes], start: autoplay, stop: tap-chart, then: "slider snaps per year", readout: "axis value | measured value + sparkline" }
globe: { subjects: [forest, river], start: autorotate, stop: tap-globe, then: drag-rotate, switch: "2-state segmented button, same hue light/deep", readout: "rate | quantity" }
chrome: { title: fixed-top-ellipsis, close: x-top-right, tools: [related-article, information], tutorial: "first open only, fade 2s" }
layout: { portrait: "stack, centered vertically", landscape: "visual left, readout right" }
palettes: # content colour — never leaks outside the scene
arcticIce: { bg: "#16223C", ice: "#7ACAFD" }
forest: { bg: "#FBFBFB", fg: "#008102" }
river: { bg: "#FFFFFF", fg: "#006AAD" }
stripes: { cold: "#074D92", mid: "#FFFFFF", warm: "#F3241C" }
readoutAlwaysVisible: true
sourceAndDateRequired: true
copy: # v5.1 — two registers; see section 08.
registers:
ui: { form: 敬体, voice: "capable, brief, never blaming", numbersFirst: true }
editorial: { form: 常体, voice: "observational, pared down", person: "first person plural, named sparingly", numbersInBody: true }
headline: { maxJaChars: 17, mustHave: [subject, comparison], mustNotHave: [conclusive-number, jargon] }
mixedScript: { digitRunTight: true, latinWordRunQuarterSpace: true, idempotent: true }
kanaOpening: { verbStems: kanji, auxiliaries: kana, formalNouns: kana }
checks: [ "can the reader re-explain it", "does the figure alone signal something is off", "is the reference stated" ]
banned: [ 革新的, 革命的, イノベーション, "世界をより良くする(単独)", 届ける濫用, 提供する濫用, 絵文字, 専門略号, Creative Platform ]
stateCopy: # v5.2 — state name (2–3 words) -> one sentence of action + place -> recovery. From SORAH App 2024.
pattern: [ stateName, actionAndPlace, recovery ]
en: { ready: "Ready to Scan", empty: "Add to Your Collection", error: "Scan error", success: "Register success", confirm: "Register your Product" }
ja: { ready: "スキャンできます", empty: "コレクションに追加", error: "読み取れませんでした", success: "登録しました", confirm: "この製品を登録" }
rules: [ "never use the word エラー as a state name", "success gets Close only — no celebration", "error carries two recoveries: retry + help" ]
rounded: # Concentric scale — nesting must stay concentric (30 > 22 > 14).
s: 14px # Inputs, small chips-in-cards.
m: 22px # Cards, lists, sheets' rows, bubbles.
l: 30px # Screens, sheets, hero surfaces.
capsule: 999px # Every button, bar, chip, HUD.
glass: # Liquid-Glass material — floating control layer only.
light: { background: "rgba(255,255,255,.55)", blur: 18px, saturate: 1.6,
border: "1px rgba(255,255,255,.65)", highlight: "inset 0 1px 0 rgba(255,255,255,.7)" }
tinted: { background: "rgba(0,107,255,.9)" } # Primary actions.
shadow: "0 6px 18px rgba(5,57,107,.14)" # Soft float — glass layer only, never on paper.
spacing: [8px, 12px, 16px, 24px, 40px, 64px] # 4px grid.
motion:
tap: { duration: 120ms, easing: ease }
appear: { duration: 260ms, easing: ease }
spring: { duration: 350ms, easing: "cubic-bezier(.34,1.56,.64,1)" } # Expressive layer only.
splashPulse: { duration: 1.7s, effect: "scale 1 -> 1.06", loop: ease-in-out } # Mark on splash; min 1.1s then fade .55s.
hudPulse: { duration: 1.2s } # Loading HUD (glass squircle + mark).
pullToRefresh: mark rotates and descends with pull; refresh past threshold.
scanPulse: { discs: 3, fill: "#66B4E7 @ 10% stacked", sizes: "1.45x / 1.86x / 2.34x of mark", hairlines: "3.24x / 6.55x, 1px #6BBDEB", duration: 2.6s, stagger: 0.85s, easing: ease-out, scale: "1 -> 2.6", opacity: ".28 -> 0", stopWhen: "OS NFC sheet appears" } # v5.2 — measured from App 2024 p.5
sceneAutoplay: { start: auto, stop: tap, resume: never-automatic } # v5.2
tutorial: { fadeIn: .3s, hold: 2s, fadeOut: .3s, firstOpenOnly: true } # v5.2
texture: # Sky family — graded from sorah.io hero sky (hero-cloud), abstract + film grain.
morninglight: sky-morning.jpg # Morning review / day start / goal setting.
daylight: sky-day.jpg # Default light scenes, heroes, nav backdrops.
twilight: sky-twilight.jpg # Achievement / celebration / onboarding moments.
nightsky: sky-night.jpg # Dark mode background and night-time data scenes.
rule: v5.0 — artwork only (app icons, key visuals, Sky Type, print). NEVER a UI screen background.
skyType: display/H1 only — clip a sky texture into bold type (background-clip:text).
iconography: # Two-plane glassmorphism icons — no line icons.
planes: [ "{colors.frost} main shape", "{colors.primary} meaningful core only" ]
meaning: solid marks the semantic core (door, hands, typing dots, badge, lens, head).
forbidden: decorative circles or accents with no meaning.
overlap: solid passing behind frost is blurred (2.4 @48px); crisp solid details on top.
grid: 48px, concentric radii; tab-bar size 23px; on tinted tabs invert to white.
copy:
nutrients: use Japanese words (たんぱく質・脂質・炭水化物), never P/F/C abbreviations.
keyNumbers: primary figures (kcal etc.) go full-width at the top of result cards.
components:
buttonPrimary: { material: "{glass.tinted}", textColor: "#FFFFFF", minHeight: 44px, radius: "{rounded.capsule}" }
buttonSecondary: { material: "{glass.light}", textColor: "{colors.primaryDeep}", radius: "{rounded.capsule}" }
buttonDanger: { backgroundColor: "rgba(218,0,60,.92)", textColor: "#FFFFFF", radius: "{rounded.capsule}" }
card: { backgroundColor: "{colors.paper}", border: "1px {colors.rule}", radius: "{rounded.m}", shadow: none }
statHero: { background: "linear-gradient(130deg,#05396B -10%,#006BFF 55%,#00BFFF 130%)", textColor: "#FFFFFF", radius: "{rounded.m}", typography: "{typography.numeric}" }
listGroup: { backgroundColor: "{colors.paper}", radius: "{rounded.m}", separator: "1px {colors.rule} inset-left 16px" }
tabBar: { layout: split-pills, main: "capsule, max 4 tabs, selected = white pill + lift shadow", ai: "detached 66px circle, tinted blue, badge dot", placement: floating-near-bottom, content-scrolls-under: true }
appHeader: { content: centered-wordmark-only, border: none, meta: none, mark-usage: "splash & loading only" }
refresh: pull-to-refresh (no header button)
keyboard: hide tab bar while keyboard is open; composer hugs the keyboard
sheet: { material: "{glass.light}", radius: "{rounded.l} {rounded.l} 0 0", grabber: required }
composer: { material: "{glass.light}", radius: "{rounded.capsule}" }
# v5.2 — from SORAH App 2024 (AD)
coachSheet: { use: "empty state of a possession", material: paper, radius: "{rounded.l} {rounded.l} 0 0", grabber: required, parts: [ headline-what-you-get, action-and-place, thumbnail-plus ] }
modalConfirm: { radius: "{rounded.l}", parts: [ title, sentence, photo, name, description, "primary+secondary stacked full-width" ], scrim: true, maxPerScreen: 1 }
resultCard: { parts: [ circle-icon, state-name, one-sentence, one-action ], success: "Close only", error: "retry + help link" }
readoutPair: { label: "9–10px uppercase kicker", value: "{typography.numeric} 28–32px", unit: "1/3 size", divider: "1px vertical rule", below: "sparkline + slider snapping to axis unit" }
articleHeader: { order: [ hero-image-full-bleed, date-blue, headline, byline-blue, tags, rule, lede-bold ], blueOnly: [ date, byline ] }
authStack: { order: [ apple, google, email-signup, login ], socialButtons: vendor-spec-unchanged, verify: "shield + one sentence", crossLink: "Sign up <-> Log in as text link" }
settingsList: { style: inset-grouped-chevron, order: [ user, language, help, about, legal, licence ], logout: "red text row, last", deleteAccount: "text link at bottom of user settings + confirm" }
actionBlue: { token: "{colors.primary}", note: "App 2024 used ≈#426ABC; normalised to #006BFF. Bright VI blue = brand moments, deep blue = tappable." }
---
## Overview
SORAH inc. — "Shifting perceptions for a better world".
Typography-led, content-first, Liquid-Glass component language.
Two layers: PAPER (content — opaque white, hairline rules, concentric radii,
no shadows) and GLASS (controls — translucent capsules floating above content
with blur and soft shadows). Glass sits over the sky-texture family
(Daylight / Twilight / Nightsky) at brand moments — at most once per screen.
## Colors
White : blue : others = 90 : 7 : 3. Good change = primary blue, bad change =
negative red, across every product. #006BFF on white is 4.0:1 — never use it
for body text under 18px (use #05396B). VI blue #00BFFF is brand-only.
## Typography
Numbers are always Poppins 800 tabular with small units in ink3.
Japanese text is Noto Sans JP; mixed runs follow Noto.
## Layout
4px grid. Content max 760px (app) / 1060px (docs). Separate with 1px rules
and whitespace, never shadows.
## Elevation & Depth
Paper layer: no shadows — depth via luminance steps + hairline borders.
Glass layer: translucent material (blur 18px, saturate 1.6, hairline,
top highlight) with a soft float shadow. Never nest glass inside glass.
Readable content never sits on glass — glass carries controls and labels only.
## Shapes
Concentric radius scale 14/22/30px, capsules for every control.
Nested corners stay concentric with their container and the device screen.
Right angles survive only in corporate-site and document design.
## Components
One primary button and one hero stat per screen. Missing data renders an
ink4 em-dash, never zero. Lists are inset-grouped rounded cards.
Tab bar floats detached from the screen edge; sheets are glass with a grabber.
Possession-type empty states use a paper coaching sheet (what / how / where).
Confirmations show the photo; results are circle-icon + state + one action.
AI/conversational: user = blue bubble right, AI = tint2 bubble left,
composer = glass capsule.
## Scenes (Data Scape)
Full-screen single-subject figures: timeseries (autoplay, tap to stop, slider
snaps per year, "axis | value" readout) or globe (autorotate, tap to stop,
2-state switch in one hue). Subject colour fills the scene and never leaks
into chrome. Source + observation date live behind the (i) button.
## Do's and Don'ts
Do: sign every delta (+/−) beside its color. Respect prefers-reduced-motion.
Don't: decorative dividers under headings — separate with whitespace or a 1px rule only.
Don't: gradients/shadows on the static skeleton, red as decoration,
new colors without revising this file.
運用: 各プロダクトのリポジトリ直下に DESIGN.md として配置し、AIエージェントへの指示に「DESIGN.mdに従う」と書く。本ガイド(人間可読)とDESIGN.md(機械可読)は同時に改版する。