SORAH Design Guidelines
このプレビューはパスワードで保護されています
SORAHDesign Guidelines v5.3
SORAH inc. — Product UI Guidelines

SORAH Design
Guidelines

SORAHが手がけるすべてのプロダクトUI(アプリ・Web)に適用する共通規範。SORAH VIガイドを正典とし、iOS 26 HIG(Liquid Glass)、Strava、Apple Fitness、ChatGPTの設計思想を取り込んで新たに策定した。個別プロダクトの現行モックはこの規範に従って更新される(既存モックの見た目は本ガイドの根拠にしない)。資料・ドキュメントのトーンは別途「SORAH Document Style」が定める。

Shifting perceptions for a better world
00 — Principles

3つの原則

迷ったらこの3つに立ち返る。すべてのコンポーネント・画面・コピーはこの順で判定する。

01

コンテンツが主役、UIは退く

ユーザーが見たいのは自分のデータと変化であって、UIではない。装飾よりも余白、色よりもタイポグラフィで階層をつくる。ブランド色は面で塗らず、意味のある場所にだけ効かせる。

← ChatGPT / iOS 26 Hierarchy
02

数字は一目で、太く

数値は常に Poppins・タブラー数字・極太で組み、単位は小さく添える。ひと目でスキャンでき、変化(良い/悪い)が色と符号で即座に分かること。グラフは1画面1メッセージ。

← Strava / Apple Fitness
03

浮くものはガラス、置くものは紙

操作はガラスとしてコンテンツの上に浮き、読ませる情報は紙(不透明面)に置く。角丸は常に同心で、同じ意味には同じ色・同じ型を使い、画面ごとに発明しない。

← Apple Liquid Glass / iOS 26 Harmony
02 — Color

カラー

VIガイドのCI/UIパレットをそのままトークン化する。配分の目安は 白 90 : ブルー 7 : その他 3。ブランドを感じさせるのは面積ではなく、置き場所の正確さ。

CI パレット Brand

brand only
VI Blue
#00BFFF · --vi
ロゴ・ブランド表現専用。UIの操作色には使わない
4.0:1 w/white
Graphic 01
#006BFF · --blue
プライマリ。アクション・選択・ポジティブ。白文字は載せない(面は Fill を使う)
5.5:1 w/white
Graphic 01 Fill
#0060E6 · --blue-fill
白文字を載せるボタン・ピルの地。#006BFF は 4.0:1 で本文AAに届かない
11.6:1 w/white
Graphic 02
#05396B · --blue-dk
ホバー・押下・深さ。ブルーの影として
5.9:1 w/white
Accent
#DA003C · --accent
ネガティブ・警告・破壊的操作のみ。飾りに使わない
dark
VI Ink
#231815
印刷・ブランド背景。UIの文字は #111 を使う

UI トークン Semantic

Token値役割備考
--ink 〜 --ink4#111111 / #4A4A4A / #767676 / #8A8A8Aテキスト4段階文字に使えるのは ink3 まで(#767676 = 4.5:1)。ink4 は罫線・アイコン・区切り専用で、文字色にしない
--blue#006BFFPositive / Primary action1画面のプライマリボタンは1つ。アイコン・図・18px以上の見出しに使う
--blue-fill#0060E6白文字を載せる面ボタン・ピル・バッジの地。見た目は #006BFF とほぼ同じで 5.5:1 を満たす
--blue-dk#05396BHover / Pressed / 第2系列対になるデータ系列の対比色にも使用
--accent#DA003CNegative / 警告・削除「悪い変化」の数値色。多用禁止
--tint / --tint2#E6F0FF / #F2F7FFブルーの淡面テーブルヘッダ・選択面・シート背景
--rule / --rule2#E5E5E5 / #D4D4D4罫線・入力枠影の代わりに1px罫線で区切る
--gray-out#CCCCCCDisabled透明度でごまかさず、この色で無効を示す

ガラスの色面 Glass tint

アイコン・図版・イラスト・装飾は「ソリッドの青」×「フロスト(すりガラス)の面」の2色面で構成する。フロスト面の背後に重なったソリッドはぼけて透ける。この言語はアイコンと図版のためのもので、ディバイダーのような装飾には使わない(v5.2で見出し下のバーを廃止)。

82%
Frost
#CBD9F9 / 82% · --frost
すりガラスの面。アイコン・図版の主面
solid
Solid Plane
#006BFF · --blue
フロストと対になるソリッドの色面・アクセント
blur 18
Frost White
rgba(255,255,255,.55)+blur
UIコントロールのガラス(マテリアル参照)
dark
Frost Dark
rgba(8,16,38,.42)+blur
夜景・ダーク面上のガラス

重なり部のぼかしは 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 --blue1画面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クロームはモードのトークンに従う。値は原案の実測。

Arctic Ice · 1979–2023
6,200,000km²
BG #16223C · ICE #7ACAFD
Forest Cover
53.7%
BG #FBFBFB · #008102
River Flow
35,000,000km
BG #FFFFFF · #006AAD
Temperature
+0.77℃
#074D92 → #F3241C

規則: シーン色は1画面1系統。読み出しの数値もシーン色で組む(紺地なら白、白地なら題材色)。発散スケール(気温)は白を中点に、順序スケール(氷・森林)は地色→題材色の1方向。07の「データの色」に従う。

ダークモード Dark mode

没入型のデータ画面・ネイティブアプリのダーク対応で使う公式ダークパレット。VI Ink(#231815)は使わず中立黒で組み、ブルーは明度を上げてコントラストを取り直す。ライトの各トークンと1:1で対応させる。

base
Dark BG
#0A0A0A · --d-bg
画面の地。純黒#000は避け、わずかに浮かせる
surface
Dark Surface
#141414 · --d-surface
カード・シート。区切りは #262626 の罫線
4.5:1 on bg
Blue (dark)
#1E8CFF · --d-blue
プライマリ。#006BFFは暗所で沈むため昇格版を使う
text-safe
Blue Text (dark)
#4DA3FF · --d-blue-tx
ダーク地の小さな青文字・良い変化の数値
negative
Accent (dark)
#FF4D6D · --d-accent
悪い変化・警告。#DA003Cの昇格版
LightDark役割
#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(そのまま。暗所で最も映える)ブランド
64.2%
+2.4
良い変化 = #4DA3FF
312件
−18
悪い変化 = #FF4D6D
ダークガラスのリスト行
罫線 rgba(255,255,255,.14)
434
無効エントリ
—

切替はOS設定に追従(prefers-color-scheme)。ダークモードの背景にはNightskyテクスチャーを敷き、その上のカード・ボタンはダークガラス(rgba(10,18,40,.42)+blur+白ヘアライン+上辺ハイライト)で組む——黒ベタの面をNightskyの上に置かない(上のデモがその状態)。ベタ#0A0A0A+#141414はテクスチャーを使わない場面のフォールバック。ライト/ダークで意味のマッピング(良い=青、悪い=赤系)は変えない。

Do
  • 良い変化=ブルー、悪い変化=アクセント、で全プロダクト統一
  • ダークは中立黒+昇格ブルーで組み、全文字のコントラストを再検証
Don't
  • 紙レイヤー(コンテンツ面)への影・グラデーション(立体表現はガラスレイヤーと表現レイヤーの専権)
  • アクセント赤をポイント装飾・強調に流用
  • 新しい色の追加(必要ならこのガイドを改版する)
03 — Typography

タイポグラフィ

VI指定の幾何学サンセリフ(Gotham)のWeb代替として Poppins、和文は Noto Sans JP を正とする。英数字・数値・ラベルはPoppins、日本語文はNoto Sans JP。混植時はNoto側に揃える。

Display / 数値ヒーローPoppins 800 · tabular-nums
82.4%
SHIFTING
PERCEPTIONS
Sky Type — タイトル・強調コピーbackground-clip:text × 空テクスチャー
SHIFTING
PERCEPTIONS
空を、まとう言葉。
sorah.ioトップのメインコピーと同じ手法。文字の中に空テクスチャーを流し込む。適用はタイトル・強調コピーのみ(本文・UIラベル・小さな文字は禁止)。Poppins 800 / Noto Sans JP 900 の極太でのみ成立する。地色とのコントラストが弱い場合は使わない。
Heading JPNoto Sans JP 900
より良い世界のために、
人々に新たな視座をもたらす
Body / CaptionNoto Sans JP 400 / 15px / 1.85
本文は15px・行間1.85を基準にする。UIの説明文は2行以内に収め、詳しい話はシートや別画面へ逃がす。
キャプション 11–12px / ink3。参考値・注記・出典に使う。
StyleFont / WeightSize用途
Numeric HeroPoppins 80040–64px主要指標の主数値。単位は0.35emでink3
Display ENPoppins 800 / ltr-sp 0.01em34–58px見出し・ブランドコピー
Sky TypeDisplay/H1に空テクスチャーをclip28px〜タイトル・強調コピー専用。本文・小さな文字は禁止
H1 JPNoto Sans JP 90021–30px画面・セクション見出し
KickerPoppins 700 / 0.18–0.22em / 大文字10pxセクション番号ラベル(例: 01 — OVERVIEW)
BodyNoto Sans JP 400–50014–15px本文。行間1.7–1.85
CaptionNoto Sans JP 400 / ink311–12px注記・メタ情報
Table NumericPoppins 600 / tabular-nums13.5px表の数値は必ず右揃え+等幅数字

読み出しの対 Readout pairFrom SORAH App 2024

Year
2000
Area
6,200,000km²
1979199120032015

時系列の没入画面では、数値は「軸の値|観測値」の対で読ませる(例: Year 2000 | Area 6,200,000 km²)。ラベルは9–10pxの大文字キッカー、値はPoppins 800・タブラー、単位は値の1/3で右に添える。対の間は1pxの縦罫。値の直下にスパークライン+現在位置のスライダーを置き、スライダーは軸の単位(年)ごとに止まる。読み出しは常時表示 ── 隠さない(07の「隠さない」の法則)。

記事ヘッダーの型 Article headerFrom SORAH App 2024

Published on 24/May/2024

The Future of Arctic Sea Ice Revisited

By Dr. Flavio Lehner
#sea-ice #arctic
Arctic sea ice has been melting rapidly over the last couple of decades, bringing with it a host of negative impacts.
20/November/2024
By SORAH
01. 森林減少の現実 / 02. 森林の役割 / 03. 森林の未来

ヒーロー画像(全幅・角丸なし)→ 日付(ブルー・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)15px12px11pxタブバーラベル9.5pxは絶対最小の例外(アイコン併記が条件)
Tablet(600–1023px)15–16px12px11px2カラム時も本文を縮めない
PC(1024px〜)15–16px12px11px10pxはPC限定・英大文字キッカー(字間0.18em以上)のみ可

運用ルール: 主要数値(Numeric Hero・リスト右端の値)は拡大設定に追従して大きくなってよいが、縮小はしない。Dynamic Type最大時はラベルの折返し・タブバーの2段化を許容し、文字の省略(…)でしのがない。Sky Typeは拡大時もコントラスト検証を再実施。

04 — Layout

レイアウトと余白

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 2024Data Scapeなど1題材で全画面を使う画面。上端に固定タイトル(長い場合は「…」)と閉じる×、右上にツールボタン(関連記事・インフォメーション)、下部に読み出し+チャート/スライダー、または切替ボタン。縦長のときは上下中央に縦積み、横長のときはビジュアルを左・読み出しを右に横並び。SP/タブレット/PC/アプリで同じ規則
中央モーダル確認(製品登録など)は画面中央の白カード(角丸30)。写真→名前→説明→プライマリ/セカンダリを縦積み・同幅。背後はスクリムで暗くし、×またはCancelで戻る。1画面に1つまで
認証画面上1/3にマーク+ワードマーク、下にボタンの縦積み。フォームは1カラム・ラベル常時表示・入力枠は全幅。画面遷移は「Sign up ⇄ Log in」を下部のテキストリンクで往復させる
05 — Components

コンポーネント

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。コンテンツがバーの下を通過して透ける時にだけ、ガラスは意味を持つ。

Light — #FFFFFF
白面+ヘアライン罫線・影なし
92.16 kg
HERO — BRAND GRADIENT
Dark — #0C1428
ダークガラスカード
92.16 kg
HERO — 両モード共通

ヒーロー(主要数値・達成面)はブランドブルーのグラデーション linear-gradient(130deg, #05396B → #006BFF → #00BFFF)+白数値。両モード共通のアクセントとして機能する。

タブバー — 分離ピル構成 Split-pill tab bar

ホーム
記録
データ
活動
AI
アプリの骨格 — BODY I-O で確定した規範v5.0
  • タブバー: メインカプセル(最大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 — ダーク・夜

使い分け(アートワーク): Morning Light=朝・開始の表現/Daylight=標準(アプリアイコンの地)/Twilight=達成・祝祭の表現/Nightsky=夜・ダーク文脈の表現。グレインは表示スケールで細粒に見える解像度で書き出す(グレインの拡大はNG)。空の上の文字は白+弱いシャドウ。UI画面の背景としての使用は禁止。

マテリアル Materials — on Daylight

Glass card

ガラスは操作の器

背後のコンテンツが透けて動く。読ませる本文はガラスに載せない。

浮遊トップバー(カプセル・ガラス)/ガラスカード/浮遊タブバー(画面下端から離して浮かべ、選択タブは白ピル、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種。

ホーム
レポート
履歴
AI
体重
食事
活動
心拍
目標
カメラ
記事
音声
検索
プロフィール
カレンダー
通知
設定
ファイル
ショップ
共有
同期

構成則: フロスト=主形状、ソリッド=意味の芯(ドア=入る/針=時刻/3点=入力中/稲妻=運動/バッジ=未読)。1アイコンにソリッドの要素は1グループまで、2色以外使わない。空テクスチャーやガラスバーの上でも成立(タブバーは同アイコン23px、ティント地は白反転)。線アイコンは表内の小さなグリフのみ許可。

ボタン Buttons

全ボタンはカプセル。プライマリ=ティントガラス(ブルー90%+内側ハイライト)、セカンダリ=クリアガラス、アイコンボタン=円形ガラス。高さ44px以上・1画面のプライマリは1つ・ラベルは動詞。押下は scale(0.94) のバネ。

サーフェス Surfaces

Paper

紙カード

コンテンツの器。白面+罫線+角丸22px。影なし。

Floating

浮遊カード

柔らかい影で1段浮かせる。1画面に1枚だけ。

Dark surface

ダーク面

没入型のデータ表示に。#141414+角丸、ブルーは昇格版。

紙は「置く」、ガラスは「浮く」。読ませる情報は必ず紙(不透明面)に置き、ガラスには操作とラベルだけを載せる(Liquid Glassの可読性原則)。

表現レイヤー Expressive layer

紙とガラスの2層の上に、ブランドの瞬間にだけ表現レイヤーを重ねる。1画面1箇所まで。v5.0以降、アプリUIの表現面はブランドブルーのグラデーションを標準とし、空のテクスチャーはキービジュアル等のアートワーク文脈に限る。参照: Apple Liquid Glass(ガラス質の浮遊コントロール)/ Material 3 Expressive(バネのある形態変化)/ Strava(動きのあるテクスチャー)。

Nightsky — Brand Moment
1,284 pt

表現面: ブランドの瞬間(ヒーロー・達成・オンボーディング)の背景はブランドブルーのグラデーション+白文字。ガラスバー: コンテンツの上に「浮く」操作だけ半透明+blur+ヘアライン。中身のカードには使わない。prefers-reduced-motionで全停止。

バネのある形態変化(M3 Expressive型): ピル⇄角丸のモーフィング、選択ピルのスライドは spring イージング cubic-bezier(.34,1.56,.64,1)・350ms。押下は scale(0.93)。跳ねは操作の応答にだけ使い、装飾では動かさない。

数値表示 Stat display

1,284pt
Primary metric
64.2%
+2.4
良い変化はブルー+符号
312件
−18
悪い変化はアクセント+符号
—
欠測はダッシュ。0埋め禁止

ヒーローはブランドグラデーション面+白数値で1画面1枚(紙のstatカードと重ねない)。値はPoppins 800・タブラー、単位は小さく。変化は色だけでなく符号を必ず併記(Strava/Fitnessの走査性)。

プログレス Progress

系列A73%
系列B91%
82%
リング(Apple Fitness型)は
1画面1つ・達成率にのみ使う

対になる2系列は blue/blue-dk で統一。しきい値超過など「悪い状態」への反転は accent。バーの高さ14–20px、トラックは tint2。

リスト Inset grouped list

エントリのタイトル
08/29 07:12 · A30 B8.4
434unit
2行目のエントリ
08/29 14:50 · 17分
107unit
無効・過去のエントリ
08/28
—

iOS型のinsetグループ: 角丸22pxの紙面にまとめ、区切りは左インセット付き1px罫線。左=タイトル+メタ(ピル型チップ)、右=主数値。行全体をタップ領域にし、詳細はシートで開く。

シート Glass sheet

エントリの詳細
時間42 分
値A386
値B24.8

詳細・確認はガラスシートで下から。グラバー必須、下スワイプ/外タップで閉じる。角丸は上辺30pxで画面と同心。破壊的操作はシート内で danger カプセル+確認。

会話UI Conversational

今週のサマリーを見せて
今週の合計は1,284ptで、先週から+6%です。伸びの中心は火曜の記録でした。

ユーザー発話=ブルー・右寄せ、AI=tint2・左寄せ。角丸22px+発話側の下角のみ6px(向きの手掛かり)。コンポーザーはガラスのカプセルで本文の上に浮かせ、送信は円形ボタン。応答内の数値は太字。

フォームとフィードバック Forms & Feedback

形式が正しくありません(例: 12.5)
✓ 保存しました

入力枠は角丸14px、フォーカスでブルー枠+淡いグロー。エラーはaccent枠+理由と例を1行で。ラベルは常時表示(プレースホルダー代用禁止)。成功はガラスのカプセルHUDで短く応答し、2秒で消す。

空状態 Empty state

—

まだ記録がありません。
最初の1件を追加するとここに表示されます。

イラスト・マスコットは使わない。何が起きるか+次の1アクションだけを示す。

コーチング・シート Coaching sheetFrom SORAH App 2024

Add to
Your Collection
Tap the Scan NFC icon and hold your device over the product.

「持ち物がまだ無い」タイプの空状態は、空カードではなく画面下端のシートで「何を・どうすれば・入るか」を教える。見出し=得られるもの(Add to Your Collection)、本文=動作+場所(Scan NFC アイコンをタップして製品にかざす)、右に対象物のサムネと「+」。シートはコンテンツ側なので紙(白面+ヘアライン)で組み、ガラスにしない。

スキャン待機と結果 Scan & resultFrom SORAH App 2024

✓
Register success

この製品をコレクションに追加しました。

!
Scan error

タグを読み取れませんでした。端末の上端を製品のタグに近づけて、動かさずに待ってください。

ヘルプを見る

待機はマークを芯にした同心円のパルス(1.8s、外へ広がって消える、3輪)── これは v5.0 のスプラッシュ・パルス(拡縮)とは別の「探している」動き。実際の読み取りはOS標準のNFCシートに委ね、独自UIを重ねない(09参照)。結果は中央の小カード: 円形アイコン → 状態名 → 1文 → 1アクション。成功は「Close」だけ、失敗は回復手段(Retry)とヘルプへの導線を必ず持つ。

登録モーダル Register modalFrom SORAH App 2024

Continue with Apple
G Continue with Google
✉ Sign up with email
Log in

認証スタック(順序固定)

物を登録する確認は写真を見せる(何を登録するのかを目で確認させる)。写真→製品名→1–2行の説明→プライマリ/セカンダリの縦積み。認証の入口は Apple → Google → メール登録 → ログイン の順で固定し、ソーシャルは各社の規定文言・アイコンをそのまま使う(改変しない)。メール登録後は「Verify」画面(盾アイコン+1文)を挟み、Sign up ⇄ Log in はテキストリンクで往復。

設定リスト Settings listFrom SORAH App 2024

User setting›
Language›
Q&A›
About SORAH›
Legal›
Licence›
Log out

マイページは1行1項目のinsetリスト+シェブロンだけで組む。順序は「自分のこと → 言語 → 助け → 会社 → 法務 → ライセンス」、最後にLog out を赤文字で1行(ボタンにしない)。アカウント削除は設定画面のいちばん下にテキストリンクで置き、確認を挟む。

06 — Motion

モーション

用途時間イージング備考
タップ反応(アイコン縮小等)120mseasescale(0.9)程度。触感の代替
要素の出現(メッセージ・シート)260msease / backwardstranslateY(8px)+fade。1方向のみ
バー・グラフの伸長500msease数値の変化を見せる時だけ
形態変化・選択ピルのスライド(表現レイヤー)350msspring cubic-bezier(.34,1.56,.64,1)操作の応答にだけ。装飾では動かさない
スプラッシュのマーク(パルス)1.7s loopease-in-out / scale 1→1.06起動時。最短1.1秒表示→フェード .55s
Pull-to-Refresh インジケータ追従引き量に応じ回転・降下マークを使用。閾値超えで更新実行
ローディングHUD(パルス)1.2s loopease-in-outガラススクワークル+マーク。データ読込中
注意喚起(バッジ等)1.8s×3回ease-in-out無限ループ禁止。3回で止める
スキャン待機(同心の面)App 20242.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 2024in .3s → 2s → out .3sfade「Tap & Scroll」のような操作ヒント。自動で消え、閉じる操作を要求しない

原則: 動きは情報(何が変わったか)を運ぶ時だけ使う。例外は表現レイヤーの動的テクスチャーのみ(ブランドの瞬間・1画面1箇所)。パララックスは使わない。prefers-reduced-motion で全アニメーションを停止する。

07 — Data Visualization

データビジュアライゼーション

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)
  • 有効桁は意味のある桁で止める。観測精度を超える桁を書かない
  • 大きすぎる数はそのまま出さず、身体か生活で測れる単位に翻訳する
  • 比率と実数の両方を持たせる。読者に暗算をさせない
Do
  • 作画が紙面を支配する。図が主で、余白は従
  • 軸・罫・格子は最小限。消して読めるなら消す
  • 色を落として(グレースケールで)読めるか毎回確認する
  • 出典・観測日・系列の位置を必ず添える
Don't
  • 影・グラデーション・3D・立体棒・装飾アイコン
  • 二重軸、切断軸、面積で量を表す円
  • 凡例を読ませる、単位を換算させる、順路を探させる
  • 図を余白に浮かせる(作画が小さいのは、決められていないことの現れ)
08 — Voice & Tone

ボイス&トーン

SORAH の言葉にも二つのレジスターがある。UIコピーは「有能で、簡潔で、責めない」声。編集文は「観察的で、削ぎ落とされた」声。人称も文体も違う。

レジスターの選択

UIコピー編集文(発信)
置かれる場所アプリ・Web の操作面、AI応答グラフィック、記事、投稿、ニュースレター
文体敬体(です・ます)常体(である・だ)
人称主語を立てない。ユーザーを「あなた」と呼ばない一人称複数(私たち)。ただし名乗りは最小限
構え結論から。次の操作を示す観察を置く。断定しない。読者が自分で結論に達する余地を残す
数字最初に、太く見出しに置かない。本文に潜ませる

UIコピー

Do
  • 結論から。数字を根拠に短く話す
  • できなかったことは「次どうするか」に言い換える
  • 敬体(です・ます)。専門用語を避ける
  • ボタンは動詞で(「この内容で保存」「撮り直す」)
Don't
  • 責める・煽る表現(未入力は仕組みの問題かもしれない)
  • 精神論・根拠のない断定・専門領域(医療等)の判断
  • 絵文字の乱用(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で組む(線幅と色はトークンに従う)。文中の矢印は活字の ↗(外部リンク)まで。

09 — iOS

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行
10 — Accessibility

アクセシビリティ

項目基準
コントラスト本文 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 だけにしない
11 — References

参照と改版

正典: SORAH VI GUIDE(ロゴ・CI/UIカラー・タイポグラフィの原典。本ページのロゴはVI原版OLデータから抽出)/ SORAH Document Style(資料・ドキュメントのトーン)
原案: 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の承認を経て改版する。色・コンポーネントの追加は必ずここに反映してから実装する。
12 — DESIGN.md

機械可読スペック

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(機械可読)は同時に改版する。