01 Ionic Frameworkデザインシステムのインターフェースプレビュー 書体を切り替え、キーボードで文字サイズを変更し、暖色系の紙面に切り替えて、ローカル設定のスナップショットを保存します。
Ionic Vue/Core 9.0.6、Vue 3、iOSモードを明示的に指定。ネイティブのWebコンポーネントをローカルにバンドル。·
実装リファレンス 02
Ionic Frameworkデザインシステムのデザインリファレンス Ionic Vue/Core 9.0.6を検証済みです。コアの色は、インストール済みのcore.cssから取得しています。デモではiOSモードを明示的に選択しています。読書向けのタイポグラフィ、紙面の色、周囲の間隔は、Ionicのデフォルトではなく、このアプリケーション独自の選択です。
ライトテーマのデフォルトのセマンティックカラーのロール ソース 名前 / ルール 値 / 設定 用途 --ion-color-primary#0054e9 ネイティブのメインコントロール。 --ion-color-primary-rgb0, 84, 233不透明度を使った計算用のRGBチャンネル。 --ion-color-primary-contrast#fffメインカラー上のテキストとアイコンのコントラスト。 --ion-color-primary-shade#004acd メインカラーの暗いバリエーション。 --ion-color-primary-tint#1a65eb メインカラーの明るいバリエーション。 --ion-color-secondary#0163aa セカンダリロール。 --ion-color-tertiary#6030ff ターシャリーのロール。 --ion-color-success#2dd55b 成功状態の役割。 --ion-color-warning#ffc409 警告ロール。 --ion-color-danger#c5000f 危険ロール。
名前 / ルール 値 / 設定 用途 iOS --bar-height4pxコンパイル済みのiOSレンジのデフォルト値。 iOS --knob-size26pxコンパイル済みのiOSつまみのサイズ。 MD --bar-height2pxコンパイル済みのMaterial Designモードのデフォルト値。 MD --knob-size18pxコンパイル済みのMaterial Designのつまみのサイズ。 Application min / max / step16 / 26 / 1整数の読書用文字サイズ。実際のレンジプロパティ。 snaps / ticks / pintrue / true / true目盛りと、書式設定されたサイズのフィードバックを表示。
名前 / ルール 値 / 設定 用途 Reading fontGeorgia, serif OR system-ui, sans-serifネイティブセグメントで切り替えます。デバイスにすでにあるフォントを使用します。 Reading size16–26px; default 18px記事に直接適用します。 Reading line-height1.65独自に設定した、読みやすい本文幅。 Article heading1.9em / 1.15; 1.6em below 360px読み手が選んだ本文サイズに合わせて拡大縮小します。 Control/body fontsystem-ui, sans-serifアプリケーションで明示的に選択したフォント。 Spacing10 / 12 / 14 / 16 / 20 / 22 / 24 / 28 / 32px独自のスタイルシートに定義した具体的な値であり、Ionicのスケールを示すものではありません。 Layout300px settings + flexible article; stack at 760pxどちらの列にもmin-width:0を指定します。 Paper roles#fff9eb warm; #ffffff white; #24362e ink独自のコンテンツカラー。ネイティブコントロールのロールとは分けています。 Card radius16px周囲のパネルに用いる独自の形状。
03 Ionic Frameworkデザインシステム完全ガイド 実際のインターフェースで、このデザインシステムを選び、適用し、レビューするための実践ガイドです。
DESIGN-ionic.md 詳しいガイダンス、実装の出発点、ソースへのリンクをまとめています。
ガイドをダウンロード Ionic Framework デザインシステム Ionic のカラーは、関連する変数のまとまり Ionic のカラーは、関連する変数のまとまり インストールされるコアスタイルシートでは、primary は #0054e9 と定義され、RGB チャンネル、コントラスト、シェード、ティントの値も個別に用意されています。コンポーネントは、状態に応じてこれらの関連値を使い分けます。ベースの hex 値だけを置き換えると、ほかの状態との一貫性が失われることがあります。ブランドカラーをカスタマイズする場合は、関連する値を一式定義してください。
このサンプルでは、ネイティブコントロールにデフォルトの primary カラーをそのまま使用しています。温かみのある紙色は #fff9eb の独立したアプリケーション背景で、記事の文字色は #24362e のままです。ページを白に切り替えても変わるのは読書面だけです。コントロールの配色が暗黙に変わることも、Ionic のダークパレット全体を実装したと示唆することもありません。
関連する仕様を確認する
Ionic Framework デザインシステム 読者が選んだ書体を画面で確認できるようにする 読み手が選んだ書体を画面に反映する segment を使うと、記事の書体を Georgia と system-ui の間で切り替えられます。設定の影響を意図した読書コンテンツに限定し、ラベルやコントロールの寸法が予期せず変わらないよう、コントロール自体には system-ui を使い続けます。外部フォントは読み込まず、対応するローカルのフォントスタックを使用します。
文字サイズは 16〜26 ピクセルの整数です。記事の見出しはこのサイズに比例し、行の高さは 1.65 のままです。幅が 360px 未満の場合、見出しの倍率を 1.6em に下げるため、埋め込みの狭いカラムでも最大サイズを読みやすく保てます。これらはアプリケーション独自の値であり、Ionic のコンポーネントのデフォルト値とは明確に区別されています。
関連する仕様を確認する
Ionic Framework デザインシステム segment の選択状態とネイティブのセマンティクスを適切に扱う セグメントの選択状態を管理し、ネイティブのセマンティクスを活用する IonSegment には現在の face 値を渡し、2 つの IonSegmentButton を子要素として設定します。ionChange イベントでは event.detail.value からモデルを更新します。各ボタンには serif または sans という、重複しない安定した値を割り当て、表示ラベルで選択肢を説明します。aria-labelledby を使い、説明文をコントロール全体のラベルとして関連付けます。
実際のアクセシビリティツリーでは、通常のボタンのグループではなく、選択状態を持つタブを含む tablist として公開されます。そのため、ローカルの操作テストではネイティブの Sans タブを対象にし、読書用フォントが変わることを確認します。2 つのボタンをセグメント風に見せるスタイルだけでは、同じ選択動作は実現できません。
関連する仕様を確認する
Ionic Framework デザインシステム range のイベントと制約を一体の仕様として扱う レンジイベントと制約をひとつの仕様として扱う IonRange では min、max、step を明示します。デフォルトの 0〜100 に頼るだけでは、読書用の文字サイズとして適切な範囲になりません。スナップと目盛りで選択可能な刻みを示し、ピンのフォーマッターで操作中に表示される値へ px を付けます。コントロールの下に表示されるサイズのラベルは、ドラッグを止めた後も読みやすく保たれます。
ハンドラーでは ionChange を使い、その値を数値に変換します。つまみが 1 つの場合には適切な方法ですが、つまみが 2 つある range では値の形式が異なるため、別途処理が必要です。コンパイル済みの iOS range ではつまみが 26 ピクセル、バーが 4 ピクセルで、Material モードではそれぞれ 18 と 2 です。これらの違いは、Ionic に存在しない共通トークンにまとめず、そのまま記録しています。
文字サイズのスライダーにフォーカスし、26px になるまで右矢印キーを 8 回押します。 Sans を選択し、「Warm paper」をオフにします。 設定を保存し、書体、サイズ、用紙色の正確なスナップショットを確認します。 関連する仕様を確認する
Ionic Framework デザインシステム 用紙色の切り替えは背景にすぐ反映する 紙面を切り替えたら、背景もすぐに更新する IonToggle には warm モデルの値を checked として渡します。イベントから受け取る detail.checked を、その Boolean 状態へ直接代入します。表示される「Warm paper」ラベルはネイティブのスイッチに属し、近くの説明文で記事の背景が変わることを伝えます。
warm クラスを適用すると、枠線やエッセイの内容を変えずに記事の背景だけが変わります。これにより、意味のある比較ができます。また、紙色の設定とプラットフォーム全体のライト/ダーク設定を混同せずに済みます。後者を切り替えるには、さらに多くの Ionic の背景と文字色の変数を連動させる必要があります。
関連する仕様を確認する
Ionic Framework デザインシステム 適用中の設定と保存済みスナップショットを分ける 適用中の設定と保存済みスナップショットを分ける すべての設定は記事にすぐ反映されます。「設定を保存」を押すと、現在の状態を読み取れるスナップショットとしてリアクティブな状態に記録し、その状態が現在の設定と一致する間はボタンを無効にします。3 つすべてのモデルを監視し、いずれかが変わるとメッセージを消すため、新しい組み合わせに古い確認メッセージが残りません。
「デフォルトに戻す」を押すと、serif、18 ピクセル、warm paper に戻り、保存済みメッセージを消去します。ステータスでは、設定がこのプレビュー内でのみ適用されることを明示します。この操作の背後に localStorage の永続化、アカウント設定、ネイティブの設定プラグインはありません。再読み込みするとデフォルト値で始まります。
関連する仕様を確認する
Ionic Framework デザインシステム Shadow DOM のネイティブコントロールはそのままに、全体の構成をスタイリングする Shadow DOM のネイティブコントロールはそのままに、全体の構成をスタイリングする range には「Text size」の見えるラベルがあり、toggle にはコントロール内にテキストラベルが含まれ、segment には「Typeface」というラベルが付いています。元のイラストは aria-hidden です。保存時のフィードバックには role=status を使い、記事は通常のセマンティックな HTML のままにしています。そのため、見出しや段落は読者が通常の文書ナビゲーションでたどれます。
Ionic コンポーネントは、内部マークアップをシャドウ DOM にカプセル化します。このサンプルでは、非公開の内部クラスを参照せず、公開プロパティ、イベント、ドキュメントに記載された CSS カスタムプロパティを使用しています。周囲のページではコンテンツの高さに合わせ、最小幅を 0 に設定しています。幅 280px で確認すると、単体のスマートフォン画面のスクリーンショットでは見落としやすい、埋め込み時の幅の問題を発見できます。
ラベルとの関連付けは、ネイティブコンポーネント上で維持します。 シャドウ DOM の内部を変更せず、公開プロパティとイベントを使用します。 キーボードのサイズ変更と記事表示を同時に確認します。 関連する仕様を確認する
Ionic Framework デザインシステム:Vue インテグレーションをインストールし、コア CSS を読み込む Vue連携をインストールし、コアのCSSを組み込む この完全なエントリでは、元のスタイルシートより前に IonicVue を登録し、@ionic/vue/css/core.css をインポートします。インストールした Vue パッケージは vue-router も解決するため、この埋め込みサンプルではナビゲーションを設定していませんが、再現可能な依存関係のインストールコマンドには vue-router も含めています。このピア依存関係を省略すると、ローカルバンドルの解決に失敗しました。
2つの完全なサンプルには App.vue と style.css が含まれています。標準的な Vite の Vue プロジェクトでは、SFC とネイティブコンポーネントのインポートがコンパイルされます。単独のリソースプレビューでは、コンポーネントの実装を含む最終的な JavaScript と CSS をローカルでバンドルするため、コントロールを変更しても外部 CDN へのリクエストは発生しません。
関連する仕様を確認する
Ionic Framework デザインシステムのコンポーネント例 読書設定の SFC 完全版 ネイティブの IonSegment、IonRange、IonToggle、IonButton で、オリジナルの短編エッセイを操作します。
vue コードをコピー
<script setup>
import {ref,computed,watch} from 'vue';
import {IonSegment,IonSegmentButton,IonLabel,IonRange,IonToggle,IonButton,IonChip} from '@ionic/vue';
const face=ref('serif'),size=ref(18),warm=ref(true),saved=ref('');
const family=computed(()=>face.value==='serif'?'Georgia, serif':'system-ui, sans-serif');
watch([face,size,warm],()=>saved.value='');
function save(){saved.value=`Saved locally: ${face.value}, ${size.value}px, ${warm.value?'warm':'white'} paper.`}
function reset(){face.value='serif';size.value=18;warm.value=true;saved.value=''}
</script>
<template>
<main class="reader-shell">
<header><p class="eyebrow">A QUIETER READING SPACE</p><h1>Make room for the words.</h1><p>Adjust this short essay to your reading preferences. The sample changes as you move the controls.</p></header>
<div class="reader-layout"><section class="preferences" aria-labelledby="preferences-title"><h2 id="preferences-title">Reading settings</h2><p class="label" id="face-label">Typeface</p>
<IonSegment :value="face" @ionChange="face=$event.detail.value" aria-labelledby="face-label"><IonSegmentButton value="serif"><IonLabel>Serif</IonLabel></IonSegmentButton><IonSegmentButton value="sans"><IonLabel>Sans</IonLabel></IonSegmentButton></IonSegment>
<IonRange :value="size" @ionChange="size=Number($event.detail.value)" :min="16" :max="26" :step="1" :snaps="true" :ticks="true" :pin="true" label="Text size" label-placement="stacked" :pin-formatter="v=>`${v}px`"/><p class="scale"><span>16px</span><strong>{{size}}px</strong><span>26px</span></p>
<div class="paper-toggle"><IonToggle :checked="warm" @ionChange="warm=$event.detail.checked" justify="space-between">Warm paper</IonToggle><p>Soft ivory or a white page. The controls keep their own contrast.</p></div>
<IonButton expand="block" @click="save" :disabled="!!saved">Save preferences</IonButton><IonButton expand="block" fill="clear" @click="reset">Restore defaults</IonButton><p class="save-result" role="status">{{saved||'Preferences apply to this preview only.'}}</p></section>
<article class="reading-paper" :class="{warm}" :style="{fontFamily:family,fontSize:size+'px'}"><div class="paper-art" aria-hidden="true"><span></span><i></i><b></b></div><p class="article-kicker">FIELD NOTES · 03</p><h2>The useful pause</h2><p>There is a small garden between the library and the river. Its benches face away from the busiest path, toward a row of young trees.</p><p>On an ordinary afternoon, the place asks very little. You can read a paragraph twice, let a conversation settle, or watch the shadow of a leaf move across the page.</p><p>Good reading spaces leave that choice with the reader. A comfortable line, a familiar letterform, and a little breathing room can make a page easier to return to.</p><footer><IonChip outline>Original sample essay</IonChip><span>{{size}}px · {{face==='serif'?'Georgia':'System sans'}} · 1.65 line height</span></footer></article></div>
</main>
</template>
コードリファレンス
範囲の変更は ionChange で確定され、e.detail.value は数値に変換されます。 設定を変更すると、保存済みのスナップショットは消去されます。 保存はローカルのリアクティブな状態であり、デバイスへの保存やサーバーへのリクエストは行いません。 オリジナルレイアウトのスタイルシート完全版 コンテンツの高さに合わせた埋め込み、狭い画面で縦に並ぶレイアウト、コンポーネントのシャドウルートに触れずに読者が選べるタイポグラフィを実現します。
CSS コードをコピー
html,body,#app{height:auto;min-height:0;margin:0}*{box-sizing:border-box}body{font-family:system-ui,sans-serif;color:#24362e;background:#f2f5f3}.reader-shell{max-width:1120px;margin:auto;padding:32px}.eyebrow{font-size:11px;letter-spacing:.14em;font-weight:700;color:#52695c}h1{font-size:34px;line-height:1.15;max-width:660px;margin:12px 0}header>p:last-child{font-size:15px;line-height:1.6;max-width:660px;color:#56675e}.reader-layout{display:grid;grid-template-columns:300px minmax(0,1fr);gap:24px;margin-top:28px}.preferences{background:white;border:1px solid #dbe3de;border-radius:16px;padding:22px;align-self:start;min-width:0}.preferences h2{font-size:19px;margin:0 0 22px}.label{font-size:14px;font-weight:600;margin-bottom:10px}ion-segment{margin-bottom:20px}ion-range{padding:12px 0 0;--bar-height:4px}.scale{display:flex;justify-content:space-between;font-size:12px;color:#52695c;margin:0 0 24px}.paper-toggle{border-top:1px solid #e4e9e6;padding-top:20px;margin-bottom:20px}.paper-toggle ion-toggle{width:100%;font-size:14px}.paper-toggle p{font-size:12px;line-height:1.6;color:#5a6b61}.save-result{font-size:12px;line-height:1.6;color:#46614f;min-height:38px}.reading-paper{background:white;border:1px solid #dce3dd;border-radius:16px;padding:28px;line-height:1.65;min-width:0;overflow-wrap:anywhere;transition:background .2s}.reading-paper.warm{background:#fff9eb}.reading-paper h2{font-size:1.9em;line-height:1.15;margin:14px 0 24px;font-weight:400}.reading-paper p{margin:0 0 1.2em}.article-kicker{font-family:system-ui,sans-serif;font-size:10px;letter-spacing:.15em}.paper-art{height:112px;background:#dce8d9;border-radius:8px;position:relative;overflow:hidden;margin-bottom:24px}.paper-art span{position:absolute;width:150px;height:150px;background:#a4baa2;border-radius:50%;right:15%;top:35px}.paper-art i{position:absolute;width:130px;height:70px;background:#f3e0a8;border-radius:50% 50% 0 0;right:25%;top:48px}.paper-art b{position:absolute;width:60px;height:130px;transform:rotate(24deg);background:#64816b;left:15%;top:38px;border-radius:50% 50% 0 0}.reading-paper footer{font:11px/1.6 system-ui,sans-serif;border-top:1px solid #deded3;padding-top:18px;display:flex;gap:12px;flex-wrap:wrap;align-items:center}.reading-paper ion-chip{font-size:11px;margin:0}@media(max-width:760px){.reader-shell{padding:20px}.reader-layout{grid-template-columns:minmax(0,1fr)}h1{font-size:29px}}@media(max-width:360px){.reader-shell{padding:14px}.preferences,.reading-paper{padding:16px}.reader-layout{gap:18px}.reading-paper h2{font-size:1.6em}}
コードリファレンス
範囲には、ドキュメントに記載された --bar-height カスタムプロパティを使用します。 文章に添えたイラストはすべてオリジナルの CSS で、装飾目的としてマークされています。 04
Ionic Framework デザインシステムの AI エージェント設定 実装の出発点 Ionic Vue/Core 9.0.6 で動作を確認済みです。SFC とスタイルシートの完全版は上記にあります。プレビューにはルーティングされたページはありませんが、インテグレーションの依存関係として vue-router をインストールします。
JavaScript サンプルをコピー
// Start with: npm create vite@latest ionic-reader -- --template vue
// cd ionic-reader && npm install
// npm install @ionic/[email protected] @ionic/[email protected] vue-router@4
// Save the complete examples as src/App.vue and src/style.css.
// src/main.js:
import {createApp} from 'vue';
import {IonicVue} from '@ionic/vue';
import '@ionic/vue/css/core.css';
import './style.css';
import App from './App.vue';
createApp(App).use(IonicVue, {mode:'ios'}).mount('#app');
// The Vite index.html must contain:
// <div id="app"></div><script type="module" src="/src/main.js"></script>
// Run: npm run dev あなたのプロジェクト向けプロンプト AI エージェント用プロンプト プロンプトをコピー
Ionic Vue/Core 9.0.6 を iOS モードで明示的に使用し、提供された読書設定のサンプルを構築してください。フォント選択にはネイティブの Segment、文字サイズには Range、用紙の表示には Toggle、記事のスタイルに連動する操作には Button を使用します。範囲は 16〜26px に保ち、変更をローカルに保存する設定スナップショットへ反映してください。IonicVue のセットアップに必要な CSS と vue-router のピア依存関係も含めます。埋め込み内に全画面シェルを追加せず、コンテンツの高さに合わせた構成を維持してください。検査データのアップロードやリモートアカウントへの変更はありません。 05
Ionic Framework デザインシステムのソースと適用範囲 Ionic Vue/Core 9.0.6、iOS モード。オリジナルのエッセイ、イラスト、読書スケール、温かみのある用紙色を使用しています。保存はローカルのリアクティブな状態で、再読み込み後は保持されません。この埋め込みコンポーネントのサンプルは、ルーティングやネイティブデバイス対応を含む完全な Ionic アプリではありません。