Design System.
Swiss editorial × Monotone を支える仕様書。Primitive → Semantic の3層トークン、Components、Patterns、Motion、Guidelines を掲載。RONDO LP と同じ rondo.css で動いています。
Tokens — the atoms.
3層アーキテクチャ: Primitive(生の値)→ Semantic(用途別名)→ Legacy alias(後方互換)。新規コードは Semantic トークンを推奨。
900 / -0.055em / 0.9
900 / -0.04em / 0.95
800 / -0.02em
| Token | Value | Usage |
|---|---|---|
| --ease-primary | cubic-bezier(0.22, 1, 0.36, 1) | Reveal / scroll-in decel |
| --ease-ui | ease | Hover, toggles |
| --ease-linear | linear | Progress, continuous motion |
| --dur-instant | 0.15s | Instant UI response |
| --dur-fast | 0.3s | Hover, micro |
| --dur-base | 0.9s | Content reveal |
| --dur-slow | 1.2s | Display reveal |
| Name | Value | Scope |
|---|---|---|
| sm | 520px | Typography letter-spacing adjust |
| md | 768px | Story / feature grid stack |
| lg | 960px | Hero / feature main layout switch |
| xl | 1280px | --wrap-max content clamp |
| Token | Value | Usage |
|---|---|---|
| --z-base | 1 | Watermark, hero bg |
| --z-docked | 10 | Sticky elements |
| --z-masthead | 40 | Logo mark |
| --z-controls | 50 | Theme/lang toggle |
| --z-modal | 100 | Modal, overlay |
| --opacity-disabled | 0.4 | Disabled controls |
| --opacity-watermark | 0.08 | Bg watermark |
| --border-hair | 1px | All hairlines |
| Token | Value | Usage |
|---|---|---|
| --wrap-max | 1280px | .wrap max-width |
| --gutter | 24px | main horizontal padding |
| --tap-size | 44px | a11y min touch target |
Components — the vocabulary.
画面上で見える基本部品。各コンポーネントは Anatomy → 使用例 → コードの順で掲載しています。
Primary · accent fill, hover reverses to outline, arrow translates on hover
Lang + Theme · 36×36 outlined buttons, invert on hover. Real instance is position: fixed top-right (see this page's corner).
<div class="feature-head"> <span><span class="num">(03)</span> — 01 / Record</span> <span class="dash"></span> <span>fig. 01</span> </div>
- 日付表示の改善ログ画面の日付ヘッダーを2行表示に。
- データタブの改善期間セレクタをロケール対応+幅可変に。
マップフィルタ機能
カテゴリ・タグ・評価・訪問回数・期間などでスポットを絞り込み。
データシェア機能
統計をカード画像としてシェア可能。3サイズ、ダーク/ライトテーマに対応。
.phone {
transform: rotateX(5deg) rotateY(-10deg) translate3d(0, var(--py), 0);
transform-style: preserve-3d;
}
.phone::before { /* back plane for depth */
transform: translateZ(-20px);
}
タイル1枚ずつを独立したデザインモチーフとして使える。名前は形から。LPではこの9枚から1枚ずつを章の印として配置している。
button:focus-visible {
outline: 2px solid var(--fg);
outline-offset: 3px;
}
Patterns — the grammar.
複数の component を組み合わせた繰り返し構造と、仕組みとしてのルール群。
.dark class on root toggles all semantic tokens. OS follow when no user override.
// rondo.js
var darkMq = window.matchMedia('(prefers-color-scheme: dark)');
function applyStoredOrOsTheme() {
var stored = localStorage.getItem('theme');
var dark = stored === 'dark' || (stored === null && darkMq.matches);
document.documentElement.classList.toggle('dark', dark);
}
// OS live-follow when no user override
darkMq.addEventListener('change', () => {
if (localStorage.getItem('theme') === null) applyStoredOrOsTheme();
});
6 languages · ja / en / ko / ru / zh-CN / zh-TW · HTML-safe fallback
<p data-i18n="hero-catch">その場所に、記録を重ねる。</p>
window.T = {
'ja': { 'hero-catch': 'その場所に、記録を重ねる。' },
'en': { 'hero-catch': 'Layer memories onto places.' }
};
// runtime: innerHTML when value contains <br|<strong, else textContent
AOS · .aos becomes .aos.visible, then children reveal with per-index delay
.aos .feature-head { opacity: 0; transform: translateY(28px);
transition: opacity var(--dur-base) var(--ease-primary),
transform var(--dur-base) var(--ease-primary); }
.aos.visible .feature-head { opacity: 1; transform: translateY(0); }
/* stagger */
.aos.visible .feature-text > *:nth-child(1) { transition-delay: 0.15s; }
.aos.visible .feature-text > *:nth-child(2) { transition-delay: 0.26s; }
.aos.visible .feature-text > *:nth-child(3) { transition-delay: 0.36s; }
<section class="feature aos">
<div class="section-glyph">...</div> <!-- chapter mark -->
<div class="feature-head">(03) — 01</div> <!-- meta row -->
<div class="feature-body">
<div class="feature-text">
<h2 class="feature-title">...</h2> <!-- big display -->
<p class="feature-jp">...</p> <!-- JP catch -->
<p class="feature-desc">...</p> <!-- body -->
<div class="feature-fig">...</div> <!-- caption -->
</div>
<div class="feature-visual">...</div> <!-- phones -->
</div>
</section>
.feature-body.reverse .feature-text { order: 2; }
.feature-body.reverse .feature-visual { order: 1; }
.feature-body.reverse .phone { --tilt-y: 10deg; } /* mirrored */
Motion — the grace.
すべての動きは --ease-primary 基準。hover 系は ease、長尺は --dur-slow。
cubic-bezier(0.22, 1, 0.36, 1) · fast start, gentle landing
Body content, card reveal, list stagger.
--ease-primary · --dur-baseLarge titles — slower, more cinematic.
--ease-primary · --dur-slowButtons, menu toggles, theme switch.
--ease-ui · --dur-fastHairlines that complete the head row.
scaleX 0 → 1 · 1.1s delay 0.15sHero — d1 / d2 / d3 delays stagger introduction.
0.2s / 0.4s / 0.6sFeature phone mockups drift at different rates.
rotateX(5) rotateY(-10) + --py scroll// rondo.js bootAos()
var io = new IntersectionObserver(entries => {
entries.forEach(e => e.isIntersecting && e.target.classList.add('visible'));
}, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' });
document.querySelectorAll('.aos').forEach(el => io.observe(el));
// bootParallax() — rAF-throttled
var p = (sectionMid - vh/2) / ((vh + rect.height) / 2);
phone1.style.setProperty('--py', (p * -28) + 'px');
phone2.style.setProperty('--py', (p * 36) + 'px');
@media (prefers-reduced-motion: reduce) {
.phone { --tilt-y: 0deg; --tilt-x: 0deg; --py: 0 !important; }
.tile { opacity: 1; transform: none; transition: none; }
}
// rondo.js bootParallax() short-circuits when user opts out.
Guidelines — the rules.
書き方、作法、守るべき原則。トークンだけでは伝わらない「RONDOらしさ」のガイドライン。
Swiss editorial × Monotone
装飾を引き算し、タイポグラフィと余白で語る。色ではなく階調。1本のヘアラインが意味を持つ構造。
Japanese + English mix
英語はディスプレイ/メタラベル、日本語はキャッチと本文。"Leave a trace." の下に「写真、メモ、評価。訪れた場所に、記録を重ねていく。」
Ornament rules
グラフィックは説明せず、あしらいとして効かせる。ジャーナリング=記録を重ねる静かな作業、という製品の気分に寄り添う。
Section numbering
- (NN)Top-level · Contents, Features, What's New, Story
- (NN) — NN / nameSub-chapter · 01/02/03 Record/Revisit/Map
- fig. NNFigure callout, per section
Version strings
- Ver 1.2.1Marketing/UI
- Version 1.2.1Headline form
- 2026.04.19Dot-separated dates in YYYY.MM.DD
JP punctuation
- Full-width comma (、)Use in body JP, not Latin comma
- 「」quotation
- · (U+00B7)Between Latin meta fragments
Contrast
- Primary text#0A0A0A on #F4F4F2 · 19.5:1 AAA
- Muted text#737373 on #F4F4F2 · 4.6:1 AA
- Dim text#9A9A9A on #F4F4F2 · 3.0:1 Large only
Keyboard & Focus
- Tap target≥ 44 × 44px (--tap-size)
- Focus ring2px outline + 3px offset
- Skip linkNot currently present — TODO
Motion sensitivity
prefers-reduced-motion で tilt / parallax / stagger を無効化。bootParallax() も短絡。装飾 SVG は aria-hidden="true"。
rondo.css (shared)
全ページ共通: tokens / reset / layout / motion base / global components (btn, mast, plain-list, block-label, controls, colophon, cta)。
<style> inline (per page)
ページ固有のレイアウト・コンポーネント: hero, feature, changelog, index, phone mockup, watermark 等。
rondo.js (shared)
theme, i18n, AOS, parallax, logo/controls inject, year setter。各ページで window.T を定義してから読み込み。
Required
- CSS Custom PropertiesAll modern browsers
- aspect-ratioChrome 88+ / Safari 15+ / FF 89+
- clamp()Chrome 79+ / Safari 13.1+
Progressive
- color-mix()Used in hero watermark — falls back OK
- word-break: auto-phraseChrome 119+ — JP only, safe fallback
- :has() / nestingNot used