高山さんが構築した v2.0 (Splashtop 本家ベース) に、2026-06-04 の UI 改修で生まれた新パターン (pill 形ボタン・3D シャドウ・進捗メーター・要確認カード等) を統合した拡張版。
base token は :root 共通、CAM/FWD は data-theme で variant 切替。
2026-06-04 のダッシュボード/CAM ハブ大規模 UI 改修で発生した独自パターンを正式トークン化。
追加 8 個 + 既存集約 2 個で、改修パターンの 95% を体系に取り込み。
| 分類 | 追加 token / パターン | 値 / 内容 | 主な利用箇所 |
|---|---|---|---|
| Color | color.surface.primarySoft | CAM #EAF1FB / FWD #EBF7EF (variant 別、不透明な薄色) | ドロップダウン背景・薄塗りパネル |
| Color | color.alert.softBg | #FEE2E2 (要確認アラート背景) | BulkLogWidget 要確認状態 |
| Radius | radius.pill | 999px | アクションボタン (進捗情報 / 役割分担入力 / 保存 / 編集) / CAM ハブの ic-item / ic-procbtn |
| Radius | radius.circle | 50% | アバター画像 (Topbar / アカウントメニュー) |
| Shadow | shadow.elevated | 3 段重ね (落ち影 + 厚み + 内側 highlight) | CAM ハブ pill ボタンの立体感 |
| Shadow | shadow.popoverHeavy | shadow.popover を強化 (重厚 dropdown 用) | 管理日付ドロップダウン |
| Layout | grid.cols.5 | flex 0 0 20% (Bootstrap 12-col 系外) | KPI 5 列レイアウト (col-lg-fifth) |
| Component | progressBar.* | track 80×6px / fill 動的色 (primary→success at 100%) | タスクスケジュール section 行 |
| Component | card.alert.* | 赤系グラデ + 左ライン赤 + パルスアニメ | BulkLogWidget 要確認状態 |
| Pattern | linked-accordion | 複数子の collapsed を親 state で同期 | ChartComboWidget |
base token は :root 共通。primary 系 (color.primary.* / focus.ring) と surface.primarySoft のみを [data-theme="cam|fwd"] で上書き。
セマンティック命名で用途別に分離。v2.1 で surface.primarySoft(variant 別の不透明な薄色背景)と alert.softBg(要確認状態カード)を追加。
フォント: Inter + Noto Sans JP/SC。base 16px、line-height 1.5。高密度テーブル用の逃がし token --text-table: 14px。
Splashtop 8 base スケール。--space-1 ~ --space-8。
用途別に 7 種類。v2.1 で radius.pill (999px) と radius.circle (50%) を追加。pill はアクションボタンで頻用、circle はアバター画像専用。
v2.0 の 3 種 (tooltip / popover / modal) に加え、v2.1 で shadow.elevated(pill ボタンの立体感)と shadow.popoverHeavy(重厚 dropdown 用)を追加。
/* elevated: 3 段重ね — pill ボタンの立体感 */ box-shadow: 0 3px 0 color-mix(in srgb, var(--accent) 22%, var(--color-border)), /* 下の厚み */ 0 4px 8px rgba(0,0,0,0.10), /* 落ち影 */ inset 0 1px 0 rgba(255,255,255,0.85); /* 上のハイライト */ /* popoverHeavy: 重厚 dropdown */ box-shadow: 0 12px 32px rgba(15,23,42,0.22), /* 大きな影 */ 0 4px 10px var(--color-primary-shadow), /* アクセント色の影 */ inset 0 1px 0 rgba(255,255,255,0.85); /* 内側ハイライト */
duration 3 種類、easing 3 種類のみ(一本主義)。
寸法基準。v2.1 で grid.cols.5(KPI 5 列レイアウト)を追加。
v2.0 既定の角丸 4px に加え、v2.1 で pill 形 (999px) + elevated shadow のバリアントを追加。
単発の token ではなく、コンポーネント単位で値の組合せを定義。
progressBar:
trackWidth: 80px
trackHeight: 6px
trackRadius: 3px
trackBg: {color.border.default}
fillColor: {color.primary.base} /* < 100% */
fillColorComplete: {color.successVivid} /* = 100% */
transition: width 280ms cubic-bezier(.22,.61,.36,1)
card.alert:
background: linear-gradient(180deg, rgba(254,226,226,0.4) 0%, #fff 60%)
borderLeft: 5px solid {color.danger} /* 既存 ::before 形式で左ライン */
pulseAnimation: ks-bulk-log-pulse 1.6s ease-in-out infinite



avatar: shape: circle (border-radius: 50%) innerImg: position absolute + inset 0 + width/height 100% + object-fit cover sizes: 32px (topbar) / 40px (account menu) / 60px+ (profile)
トークンを組合せた構造的なパターン。複数コンポーネントの連携が必要なもの。
複数の子コンポーネントの開閉状態を親 state で同期。どちらの ▼ を押しても両方が同時に開閉。
// 親
const [collapsed, setCollapsed] = useState(true)
const toggle = () => setCollapsed((v) => !v)
<ChildA collapsed={collapsed} onToggle={toggle} />
<ChildB collapsed={collapsed} onToggle={toggle} />
// 子 (制御 / 非制御の両モード対応)
const isControlled = typeof collapsedProp === 'boolean'
const collapsed = isControlled ? collapsedProp : internalCollapsed
特定ページでのみ Topbar に要素を追加したい時、共通 Topbar に空 slot を置き、ページ側から createPortal で注入。Topbar に条件分岐を持ち込まない。
// 共通 Topbar
<div id="dashboard-edit-slot" />
// ページ側 (DashboardGrid)
const [slotEl, setSlotEl] = useState<HTMLElement | null>(null)
useEffect(() => setSlotEl(document.getElementById('dashboard-edit-slot')), [])
{slotEl && createPortal(<button>ダッシュボード編集</button>, slotEl)}
Bootstrap .table はセル padding が高さの下限を決めている。tr に height を指定するだけでは縮まないので、対象 tr に class を付けて padding 上書き。
.ks-gantt-host table.table > tbody > tr.ks-task-row > td {
padding-top: 0 !important;
padding-bottom: 0 !important;
vertical-align: middle;
line-height: 1.1;
}
「いま画面に見えているものは、ロード完了後も同じものか?」で使い分け。
| # | パターン | 用途 | 実装 |
|---|---|---|---|
| 1 | テーブル再取得 overlay | 同じ対象の更新中 | <LoadingOverlay /> |
| 2 | 汎用スピナー | 小領域の読込 | .ks-loading + .ks-spinner |
| 3 | ボタン内スピナー | 実行ボタン | cam-input-spin |
| 4 | 初回フルロード ripple | データ未取得時 | .gl-ripple-overlay |
| 5 | fs-pivot OlapCube | fs-pivot 専用 | <OlapCubeLoaderOverlay /> |
| 6 | テーブル型スケルトン | データ入替時 | <TableSkeleton /> |
design/DESIGN.md (frontmatter YAML)
│
├──▶ build-theme-css.mjs (Node)
│ │
│ ├──▶ design/theme-overrides.yaml (CAM/FWD 差分)
│ │
│ ▼
│ src/styles/theme.generated.css
│ :root { --color-text: ...; --radius-pill: 999px; ... }
│ [data-theme="cam"] { --color-primary: #206BC4; --color-surface-primary-soft: #EAF1FB; ... }
│ [data-theme="fwd"] { --color-primary: #0D9488; --color-surface-primary-soft: #EBF7EF; ... }
│
▼
src/styles/globals.css @import './theme.generated.css';
│
▼
全ページ・全コンポーネント
globals.css に token を直書きしない。[data-theme="cam|fwd"] ブロックは build-theme-css.mjs が生成。color.primary.* / focus.ring) + surface.primarySoft v2.1 追加 のみ。--bs-* / --tblr-* は base token を参照。--text-table: 14px。各色・形・コンポーネントに ID を採番。指示するときに「BTN06 で」「C10 + R06」のように呼び出せます。NEW マークは v2.1 追加分。
| ID | 名前 | 色 | 値 | v2.1 |
|---|---|---|---|---|
| C01 | text.base | #1A202C | ||
| C02 | text.heading | #1C1C1C | ||
| C03 | text.strong | #333333 | ||
| C04 | text.muted | #80859F | ||
| C05 | text.soft | #ACAFBB | ||
| C06 | text.onPrimary | #FFFFFF | ||
| C07 | surface.default | #FFFFFF | ||
| C08 | surface.sunken | #F9F9F9 | ||
| C09 | surface.cool | #F4F6FA | ||
| C10 | surface.primarySoft (CAM) | #EAF1FB | NEW | |
| C11 | surface.primarySoft (FWD) | #EBF7EF | NEW | |
| C12 | border.default | #DFE4E9 | ||
| C13 | border.subtle | #E2E8F0 | ||
| C14 | border.faint | #DDDDDD | ||
| C15 | border.strong | #C9D2DE | ||
| C16 | primary (CAM) | #206BC4 | ||
| C17 | primary (FWD) | #0D9488 | ||
| C18 | primary.hoverOverlay | rgba(32,107,196,.08) | ||
| C19 | focus.ring | #82B0EF | ||
| C20 | iconHoverBg | #EBF2FC | ||
| C21 | success | #10B981 | ||
| C22 | success.vivid | #22C55E | ||
| C23 | success.vividStrong | #16A34A | ||
| C24 | success.softBg | #F0FDF4 | ||
| C25 | success.border | #86EFAC | ||
| C26 | warning | #F59E0B | ||
| C27 | warning.softBg | #FEF3C7 | ||
| C28 | danger | #EF4444 | ||
| C29 | danger.strong | #B91C1C | ||
| C30 | danger.softBg | #F4C7C7 | ||
| C31 | danger.border | #FCA5A5 | ||
| C32 | alert.softBg | #FEE2E2 | NEW | |
| C33 | cfBand.bsPrev *1 前期末BS | #EEF2F7 | ||
| C34 | cfBand.bsCurr *2 当期末BS | #DCE3ED | ||
| C35 | cfBand.diff 00 BS増減 | #E8F1FB | ||
| C36 | cfBand.fx 10 為替影響 | #FDF3E2 | ||
| C37 | cfBand.net 20 純額表示 | #E6F4EE | ||
| C38 | cfBand.gross 30 総額表示 | #D4EADD | ||
| C39 | cfBand.accrual 40 未収・未払 | #F2E9F7 | ||
| C40 | cfBand.pl 50 損益 | #FBE8EC | ||
| C41 | cfBand.jvPrev 81 前期仕訳 | #F5E6D3 | ||
| C42 | cfBand.jvCurr 83 当期仕訳 | #EAD3B5 | ||
| C43 | cfBand.other 99 その他 | #ECECEC | ||
| C44 | cfBand.total ZZ 総合計 | #1F3A5F |
| ID | 名前 | 形 | 値 | v2.1 |
|---|---|---|---|---|
| R01 | button / input | 4px | ||
| R02 | checkbox | 2px | ||
| R03 | popover | 6px | ||
| R04 | modal | 8px | ||
| R05 | avatar | 20px | ||
| R06 | pill | 999px | NEW | |
| R07 | circle | 50% | NEW |
| ID | 名前 | サンプル | 用途 | v2.1 |
|---|---|---|---|---|
| S01 | tooltip | tooltip | ||
| S02 | popover | popover/menu/dropdown | ||
| S03 | modal | center modal | ||
| S04 | elevated | pill ボタン立体感 | NEW | |
| S05 | popoverHeavy | 重厚 dropdown | NEW |
| ID | 名前 | サンプル | 値 |
|---|---|---|---|
| T01 | tooltip | サンプル text 12px | 12px |
| T02 | sm | サンプル text 14px | 14px |
| T03 | base | サンプル text 16px (body 既定) | 16px |
| T04 | heading | サンプル heading 24px | 24px |
| T05 | table (逃がし) | 高密度テーブル 14px | 14px |
| W01 | normal | The quick brown fox 400 | 400 |
| W02 | medium | The quick brown fox 500 | 500 |
| W03 | semibold | The quick brown fox 600 | 600 |
| W04 | bold | The quick brown fox 700 | 700 |
| ID | 名前 | サイズ | 値 |
|---|---|---|---|
| SP01 | space-1 | 4px | |
| SP02 | space-2 | 8px | |
| SP03 | space-3 | 12px | |
| SP04 | space-4 | 16px | |
| SP05 | space-5 | 24px | |
| SP06 | space-6 | 32px | |
| SP07 | space-7 | 40px | |
| SP08 | space-8 | 48px |
| ID | カテゴリ | 名前 | 値 |
|---|---|---|---|
| M01 | Motion | duration.default | 200ms |
| M02 | Motion | duration.subnav | 300ms |
| M03 | Motion | duration.sidebar | 360ms |
| CTRL01 | Control Height | sm | 28px |
| CTRL02 | Control Height | md | 32px |
| CTRL03 | Control Height | lg | 36px |
| L01 | Layout | sidebar.width | 276px |
| L02 | Layout | sidebar.collapsedWidth | 61px |
| L03 | Layout | topbar.height | 49px |
| ID | 名前 | 幅 | 用途 | v2.1 |
|---|---|---|---|---|
| G01 | col-12 (full) | 100% | 全幅 | |
| G02 | col-9 (lg) | 75% | 主領域 + サイドペイン | |
| G03 | col-6 (md) | 50% | 2 列レイアウト | |
| G04 | col-4 (third) | 33% | 3 列レイアウト | |
| G05 | col-3 (sm) | 25% | 4 列 KPI | |
| G06 | col-fifth | 20% | 5 列 KPI | NEW |
| ID | サンプル | 説明 | 構成 | v2.1 |
|---|---|---|---|---|
| BTN01 | 主アクション | R01 + C16 bg | ||
| BTN02 | 副アクション | R01 + 透明 bg + C12 border | ||
| BTN03 | 成功 CTA | R01 + C23 bg | ||
| BTN04 | 削除/破壊操作 | R01 + C28 bg | ||
| BTN05 | 透明背景 | 透明 + C18 hover | ||
| BTN06 | pill 形・主アクション | R06 + C16 bg | NEW | |
| BTN07 | pill 形・副アクション | R06 + 透明 bg + C12 border | NEW | |
| BTN08 | 立体感 (CAM ハブ用) | R06 + S04 + 薄青グラデ | NEW | |
| BTN09 | 無効状態 | BTN01 + opacity 0.4 |
| ID | サンプル | 説明 | 構成 |
|---|---|---|---|
| BDG01 | ✓ 完了 | 成功/完了 | C24 bg + C23 文字 + C25 border |
| BDG02 | ⚠ 警告 | 警告 | C27 bg |
| BDG03 | ✕ エラー | エラー | C30 bg + C29 文字 + C31 border |
| BDG04 | 準備中 | 未対応/中立 | C08 bg + C04 文字 + C12 border |
| ID | 名前 | サンプル | 説明 | v2.1 |
|---|---|---|---|---|
| CMP01 | progressBar | 3/5 | セクション進捗インラインバー | NEW |
| CMP02 | card.alert | ⚠ 要確認 |
要確認状態カード | NEW |
| CMP03 | avatar.circle | ![]() |
円形アバター画像 | NEW |
| ID | 名前 | 説明 | 主な実装場所 | v2.1 |
|---|---|---|---|---|
| P01 | linked-accordion | 複数子の collapsed を親 state で同期 | ChartComboWidget | NEW |
| P02 | portal-slot | 共通 Topbar に slot div、ページから portal で注入 | ダッシュボード編集ボタン | NEW |
| P03 | table-row-compact | Bootstrap .table の高さ圧縮 (tr 単位) | TaskTableGantt セクション | NEW |
| ID | 名前 | 用途 | 実装 |
|---|---|---|---|
| LD01 | LoadingOverlay | 同じ対象の更新中 | <LoadingOverlay show={loading} /> |
| LD02 | 汎用スピナー | 小領域の読込 | .ks-loading + .ks-spinner |
| LD03 | ボタン内スピナー | 実行ボタン | cam-input-spin |
| LD04 | ripple | 初回ロード・キー未選択 | .gl-ripple-overlay |
| LD05 | OlapCube | fs-pivot 専用 | <OlapCubeLoaderOverlay /> |
| LD06 | TableSkeleton | データ入替時 | <TableSkeleton rows cols /> |
呼び出し例:
💡 ID は組み合わせて使えます。「BTN06 + S04」のように立体感ありの pill が欲しい場合は表現可能です。
Adobe Stock 由来の素材 + カスタム SVG + @tabler/icons-react の併用。アイコンも IC01 〜 で採番し、トークンと同じ感覚で呼び出せるようにする。
| ディレクトリ | 用途 | 備考 |
|---|---|---|
public/icons/adobestock/ | Adobe Stock からダウンロードした素材 | ライセンスを LICENSE.csv に記録 |
public/icons/custom/ | 自前 SVG / PNG | — |
npm: @tabler/icons-react | JSX で import するアイコン (既存) | サイドバー・トップバーで多用 |
ic-{category}-{name}.{ext}
例:
ic-action-edit.svg ← アクション系 / 編集
ic-domain-consolidation.svg ← 業務 / 連結
ic-status-warning-shield.png ← ステータス / 警告盾
category:
nav ナビゲーション(サイドバー / トップバー)
action アクション(編集 / 削除 / 保存 / 追加 / コピー / ダウンロード等)
status ステータス(成功 / 警告 / エラー / 読込 / ロック等)
domain 業務領域(連結 / 仕訳 / CF / マスタ / 帳票等)
data データ表現(グラフ / 表 / カレンダー / 統計等)
system システム(設定 / 通知 / ヘルプ / ユーザー等)
各素材のメタ情報を public/icons/adobestock/LICENSE.csv に記録(asset_id / license_id / license_type / 使用許諾範囲 / クレジット要否)。後で監査・更新できるように。
file,asset_id,license_id,license_type,downloaded_at,allowed_use,credit_required,note ic-action-edit.svg,123456789,STKL-XXX,standard,2026-06-05,web/print,no, ic-domain-consolidation.svg,987654321,STKL-YYY,standard,2026-06-05,web,no,
素材ダウンロード時にこの表に追加。実物未配置の枠は灰色プレースホルダで表示。
| ID | プレビュー | 名前 | カテゴリ | ファイル | asset_id | 使用例 |
|---|---|---|---|---|---|---|
| ━ nav (ナビゲーション) | ||||||
| IC01 | 未配置 | ダッシュボード | nav | ic-nav-dashboard.svg | — | サイドバー第 1 項目 |
| IC02 | 未配置 | マスタ管理 | nav | ic-nav-masters.svg | — | サイドバー |
| IC03 | 未配置 | 運用管理 | nav | ic-nav-settings.svg | — | サイドバー |
| ━ action (アクション) | ||||||
| IC11 | 未配置 | 編集 (鉛筆) | action | ic-action-edit.svg | — | 役割分担入力ボタン / 行内編集 |
| IC12 | 未配置 | 保存 (ディスク) | action | ic-action-save.svg | — | 保存ボタン |
| IC13 | 未配置 | 削除 (ゴミ箱) | action | ic-action-delete.svg | — | 削除ボタン |
| IC14 | 未配置 | 追加 (+) | action | ic-action-add.svg | — | 新規追加 |
| IC15 | 未配置 | 実行 (再生) | action | ic-action-play.svg | — | 一括処理 / batch 実行 |
| IC16 | 未配置 | ダウンロード | action | ic-action-download.svg | — | CSV/Excel 出力 |
| IC17 | 未配置 | 更新 (リロード) | action | ic-action-refresh.svg | — | 再取得 |
| ━ status (ステータス) | ||||||
| IC21 | 未配置 | 成功 (チェック) | status | ic-status-success.svg | — | 完了通知 |
| IC22 | 未配置 | 警告 (三角) | status | ic-status-warning.svg | — | 要確認 |
| IC23 | 未配置 | エラー (×) | status | ic-status-error.svg | — | 失敗 |
| IC24 | 未配置 | 情報 (i) | status | ic-status-info.svg | — | ヒント |
| IC25 | 未配置 | ロック (鍵) | status | ic-status-lock.svg | — | 編集不可 |
| ━ domain (業務領域) | ||||||
| IC31 | 未配置 | 連結 (鎖) | domain | ic-domain-consolidation.svg | — | 連結処理関連 |
| IC32 | 未配置 | 仕訳 (帳簿) | domain | ic-domain-journal.svg | — | 仕訳帳・元帳 |
| IC33 | 未配置 | キャッシュフロー | domain | ic-domain-cf.svg | — | CF 関連 |
| IC34 | 未配置 | F/S (財務諸表) | domain | ic-domain-fs.svg | — | 個別 F/S 取込 |
| IC35 | 未配置 | 会社 / グループ | domain | ic-domain-company.svg | — | 連結グループ数 KPI |
| IC36 | 未配置 | マスタ (DB) | domain | ic-domain-master.svg | — | マスタ管理 |
| ━ data (データ表現) | ||||||
| IC41 | 未配置 | 棒グラフ | data | ic-data-bar.svg | — | 売上高推移 |
| IC42 | 未配置 | 円グラフ | data | ic-data-pie.svg | — | セグメント別構成 |
| IC43 | 未配置 | 折れ線 | data | ic-data-line.svg | — | 経営指標推移 |
| IC44 | 未配置 | カレンダー | data | ic-data-calendar.svg | — | タスクスケジュール |
| IC45 | 未配置 | チェックリスト | data | ic-data-checklist.svg | — | 決算チェックリスト |
| IC46 | 未配置 | 履歴 (時計) | data | ic-data-history.svg | — | 一括処理ログ |
| ━ system (システム) | ||||||
| IC51 | 未配置 | 設定 (歯車) | system | ic-system-settings.svg | — | 各種設定 |
| IC52 | 未配置 | 通知 (ベル) | system | ic-system-bell.svg | — | お知らせ |
| IC53 | 未配置 | ユーザー (人) | system | ic-system-user.svg | — | アカウント |
| IC54 | 未配置 | ヘルプ (?) | system | ic-system-help.svg | — | ヘルプ |
| IC55 | 未配置 | 検索 (虫眼鏡) | system | ic-system-search.svg | — | サイドバー検索 |
呼び出し例:
<img src="/icons/adobestock/ic-action-edit.svg" width="16" />💡 同じ意味のアイコンは複数の category で重複しないように、命名規約に従い 1 つに決める。
public/icons/adobestock/ に命名規約に沿ってリネーム配置LICENSE.csv に asset_id / license_id / 使用許諾範囲を追記<img src="/icons/adobestock/ic-action-edit.svg" />)使い分け:
同じアイコンを複数ソースから持ち込むと統一感が崩れるため、原則は 各カテゴリで使う供給元を 1 つに固定。