design system

lemona.de・banana.de・melocil.de が共有するデザイントークンとルール。純黒、モノクロ、1px のヘアライン、小さな大文字のモノスペース。 値はすべて tokens/tokens.json から生成しています(81 tokens / 35 colors)。

Principles

純黒とモノクロ

背景は #000000。区別は色相ではなく明度・字間・罫線で付ける。色相はメーター(ok / caution / over)、未入力・エラーの danger、コードビューのハイライトだけ。

塗りでなく罫線

面は 1px のヘアライン(border)で区切る。カードの塗りや影は使わない。余白は広めに取る。

小さな大文字のモノスペース

ラベル・ボタン・キャプションは等幅・大文字・小さめ(10–11px)で、字間 0.14em。見出しと長文だけプロポーショナル。

角丸は最小限

ウィジェットは 2px、パネル・ツールチップでも 6px まで。影・グラデーションは使わない。

反転で強調

ON / 押下 / ホバー時は fg で塗って文字を bg にする。アクセントカラーは持たない。

トークン以外の色を書かない

UI の色はすべてトークンから取る。新しい値が必要なら tokens.json に足して全アプリへ配る。

Color

Core — 全アプリ共通

bg
#000000
Window, panel and page background (pure black).
fg
#f2f2f3
Primary text, toggles that are on (inverted), fader caps, the selection stroke.
muted
#a1a1a8
Labels, captions, values.
muted-2
#7a7a80
Dimmer secondary text, hover borders, number wires, focus outlines.
white
#ffffff
Links and tooltip text on the web, where pure white sits above fg.
border
#ffffff29 · α 0.16
1px hairline borders and separators; pressed fill.
border-strong
#ffffff73 · α 0.45
Borders that should draw the eye: empty required fields, slider tracks.
border-subtle
#ffffff1a · α 0.10
Subtler borders, hover fills, empty heatmap cells.
selection
#ffffff40 · α 0.25
Text selection fill.
surface
#0a0a0b
Slightly lifted surface for buttons, inputs and nodes.
tip-bg
#080809f5 · α 0.96
Tooltips, popups, menus.

Film — 背景が動くページの半透明の面

film-panel
#ffffff09 · α 0.04
Panels over the background.
film-raised
#ffffff0f · α 0.06
A surface raised inside a panel (one track, a notice).
film-sunken
#00000073 · α 0.45
Inputs and code blocks, sunk below the panel.

Feedback — 未入力・エラー

feedback-danger
#ff6a5f
Error text, the 3px bar on the left of an invalid field or alert.
feedback-danger-border
#ff6a5f8c · α 0.55
Border of an invalid field or alert.
feedback-danger-surface
#ff6a5f14 · α 0.08
Fill of an invalid field or alert.

Role — melocil.de の DJ / VJ

role-dj
#ffffff → color.core.white
DJ appearances (melocil.de activity graph).
role-vj
#7a7a80 → color.core.muted-2
VJ appearances (melocil.de activity graph).

Meter — 唯一の色相とモノクロ 3 段

meter-ok
#4cd964
True peak below caution — one of the only three hues in the system.
meter-caution
#f5b731
True peak at or above the caution level.
meter-over
#ff453a
True peak over 0 dBTP.
meter-tier-low
#7a7a80 → color.core.muted-2
Monochrome level meter below the caution level.
meter-tier-mid
#a1a1a8 → color.core.muted
Monochrome level meter from caution up to 0 dB.
meter-tier-high
#f2f2f3 → color.core.fg
Monochrome level meter over 0 dB, and the peak-hold line.

Syntax — lemona.de のコードビュー

syntax-plain
#f2f2f3 → color.core.fg
Code view: plain text.
syntax-comment
#7f8c98
Code view: comments.
syntax-preprocessor
#ffa14f
Code view: #include, #define.
syntax-keyword
#ff7ab2
Code view: keywords.
syntax-type
#6bdfff
Code view: types.
syntax-builtin
#dabaff
Code view: built-in functions.
syntax-engine
#acf2e4
Code view: engine uniforms.
syntax-number
#d9c97c
Code view: numbers.
syntax-string
#ff8170
Code view: strings.
syntax-line-number
#4a4a50
Code view: line numbers.

Type

Web — melocil.de

type.web.display
clamp(2.75rem, 11vw, 4.5rem)
melocil.de
type.web.title
1.5rem
Section title
type.web.body
0.875rem
本文 Body text — 黒と罫線と小さな大文字
type.web.small
0.75rem
2026-10-12 · 23:00–24:00
type.web.label
0.6875rem
Label / caption
type.web.micro
0.625rem
Badge · axis

Native — egui / JUCE(px)

TYPE_HEADING
20px
lemona.de
TYPE_BODY
12px
Body 12 — SF Mono
TYPE_BUTTON
11.5px
Button
TYPE_CAPTION
10.5px
Caption
TYPE_SMALL
10px
Small 10

UI は等幅(SF Mono → Menlo → Consolas)、日本語はヒラギノ角ゴ / 游ゴシック / Noto Sans JP にフォールバック。見出しと長文だけ system-ui のプロポーショナル。

Shape & space

TokenValueUsage
radius.swatch1pxLegend swatches, dots.
radius.widget2pxButtons, inputs, tags, menus.
radius.panel6pxLargest radius: panels, windows, tooltips.
stroke.hairline1pxEvery border, separator and outline.
space.native.item-x8pxHorizontal gap between widgets.
space.native.item-y6pxVertical gap between widgets.
space.native.button-x8pxHorizontal button padding.
space.native.button-y3pxVertical button padding.
space.web.10.25remTight gaps.
space.web.20.5remSmall gaps.
space.web.30.75remInline groups.
space.web.41remDefault gap.
space.web.51.5remGroup gaps.
space.web.62remSection margins.
space.web.73remSection margins.
space.web.84remBetween major sections.
motion.fast150msEvery hover / focus transition.
layout.content-max860pxWeb content column.
layout.breakpoint-sm34remNarrow: one column, hide secondary labels.
layout.breakpoint-md56remMedium: two columns.

Components

Buttons — inactive / hover / pressed / on / disabled

surface · border
border-subtle · muted-2
border · fg
on = fg 反転
disabled α 0.4

Links, badges, inputs, tooltips

outline pill · hover で反転
DJ
badge
input · selection
2026-10-12tip-bg · white · radius-panel
tooltip / popup

Meters, faders, knobs

LEVELS: muted-2 / muted / fg
TRUE PEAK: ok / caution / over
fader
knob
1#include "util/common.glsl"
2// pulse on the beat
3void main() {
4  float k = smoothstep(0.0, 1.0, u_beat);
5}
code view (syntax.*)

Apps

lemona.de

Rust / egui

dist/rust/theme_tokens.rs
→ crates/lemonade-ui/src/theme.rs
banana.de

C++ / JUCE

dist/cpp/DesignTokens.h
→ app/Source/Theme.h
melocil.de

Next.js / CSS

dist/css/tokens.css
→ app/globals.css
cue-parser

Next.js / Tailwind

dist/css/tokens.css
dist/ts/tokens.ts
→ web/app/tokens.css
→ web/utils/designTokens.ts
// lemona.de — theme.rs
mod theme_tokens;
pub use theme_tokens::*;          // BG, FG, MUTED, BORDER, RADIUS_WIDGET, ...

// banana.de — Theme.h
#include "DesignTokens.h"
const juce::Colour BG{design::BG};

/* melocil.de-site — app/layout.tsx */
import './tokens.css';            /* var(--bg), var(--ds-radius-widget), ... */

All tokens

TokenValueRust / C++CSSUsage
color.core.bg#000000BG--ds-color-core-bg --bgWindow, panel and page background (pure black).
color.core.fg#f2f2f3FG--ds-color-core-fg --fgPrimary text, toggles that are on (inverted), fader caps, the selection stroke.
color.core.muted#a1a1a8MUTED--ds-color-core-muted --mutedLabels, captions, values.
color.core.muted-2#7a7a80MUTED_2--ds-color-core-muted-2Dimmer secondary text, hover borders, number wires, focus outlines.
color.core.white#ffffffWHITE--ds-color-core-white --link --tip-fgLinks and tooltip text on the web, where pure white sits above fg.
color.core.border#ffffff29BORDER--ds-color-core-border --border1px hairline borders and separators; pressed fill.
color.core.border-strong#ffffff73BORDER_STRONG--ds-color-core-border-strong --border-strongBorders that should draw the eye: empty required fields, slider tracks.
color.core.border-subtle#ffffff1aBORDER_SUBTLE--ds-color-core-border-subtle --cell-emptySubtler borders, hover fills, empty heatmap cells.
color.core.selection#ffffff40SELECTION--ds-color-core-selectionText selection fill.
color.core.surface#0a0a0bSURFACE--ds-color-core-surfaceSlightly lifted surface for buttons, inputs and nodes.
color.core.tip-bg#080809f5TIP_BG--ds-color-core-tip-bg --tip-bgTooltips, popups, menus.
color.film.panel#ffffff09FILM_PANEL--ds-color-film-panel --panelPanels over the background.
color.film.raised#ffffff0fFILM_RAISED--ds-color-film-raised --raisedA surface raised inside a panel (one track, a notice).
color.film.sunken#00000073FILM_SUNKEN--ds-color-film-sunken --sunkenInputs and code blocks, sunk below the panel.
color.feedback.danger#ff6a5fFEEDBACK_DANGER--ds-color-feedback-danger --dangerError text, the 3px bar on the left of an invalid field or alert.
color.feedback.danger-border#ff6a5f8cFEEDBACK_DANGER_BORDER--ds-color-feedback-danger-border --danger-borderBorder of an invalid field or alert.
color.feedback.danger-surface#ff6a5f14FEEDBACK_DANGER_SURFACE--ds-color-feedback-danger-surface --danger-surfaceFill of an invalid field or alert.
color.role.dj{color.core.white}ROLE_DJ--ds-color-role-dj --role-djDJ appearances (melocil.de activity graph).
color.role.vj{color.core.muted-2}ROLE_VJ--ds-color-role-vj --role-vjVJ appearances (melocil.de activity graph).
color.meter.ok#4cd964METER_OK--ds-color-meter-okTrue peak below caution — one of the only three hues in the system.
color.meter.caution#f5b731METER_CAUTION--ds-color-meter-cautionTrue peak at or above the caution level.
color.meter.over#ff453aMETER_OVER--ds-color-meter-overTrue peak over 0 dBTP.
color.meter.tier-low{color.core.muted-2}METER_TIER_LOW--ds-color-meter-tier-lowMonochrome level meter below the caution level.
color.meter.tier-mid{color.core.muted}METER_TIER_MID--ds-color-meter-tier-midMonochrome level meter from caution up to 0 dB.
color.meter.tier-high{color.core.fg}METER_TIER_HIGH--ds-color-meter-tier-highMonochrome level meter over 0 dB, and the peak-hold line.
color.syntax.plain{color.core.fg}SYNTAX_PLAIN--ds-color-syntax-plainCode view: plain text.
color.syntax.comment#7f8c98SYNTAX_COMMENT--ds-color-syntax-commentCode view: comments.
color.syntax.preprocessor#ffa14fSYNTAX_PREPROCESSOR--ds-color-syntax-preprocessorCode view: #include, #define.
color.syntax.keyword#ff7ab2SYNTAX_KEYWORD--ds-color-syntax-keywordCode view: keywords.
color.syntax.type#6bdfffSYNTAX_TYPE--ds-color-syntax-typeCode view: types.
color.syntax.builtin#dabaffSYNTAX_BUILTIN--ds-color-syntax-builtinCode view: built-in functions.
color.syntax.engine#acf2e4SYNTAX_ENGINE--ds-color-syntax-engineCode view: engine uniforms.
color.syntax.number#d9c97cSYNTAX_NUMBER--ds-color-syntax-numberCode view: numbers.
color.syntax.string#ff8170SYNTAX_STRING--ds-color-syntax-stringCode view: strings.
color.syntax.line-number#4a4a50SYNTAX_LINE_NUMBER--ds-color-syntax-line-numberCode view: line numbers.
font.family.monoui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Noto Sans Mono, monospace—--ds-font-family-mono --font-monoUI font: labels, values, buttons, node titles.
font.family.sanssystem-ui, -apple-system, Segoe UI, Noto Sans JP, sans-serif—--ds-font-family-sans --font-sansHeadings and longer text, Japanese.
font.file.mono/System/Library/Fonts/SFNSMono.ttf, /System/Library/Fonts/Menlo.ttc, C:\Windows\Fonts\consola.ttfFONT_FILE_MONO—Monospace UI font files.
font.file.jp/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc, C:\Windows\Fonts\YuGothR.ttcFONT_FILE_JP—Japanese fallback font files.
type.native.small10TYPE_SMALL--ds-type-native-smallSmall text.
type.native.caption10.5TYPE_CAPTION--ds-type-native-captionCaption: uppercase, monospace, muted, tracking 0.14em.
type.native.button11.5TYPE_BUTTON--ds-type-native-buttonButton labels.
type.native.body12TYPE_BODY--ds-type-native-bodyBody and monospace text.
type.native.heading20TYPE_HEADING--ds-type-native-headingHeading / app title (proportional).
type.web.displayclamp(2.75rem, 11vw, 4.5rem)—--ds-type-web-displayPage title (h1), sans 650, tracking -0.045em, line-height 1.
type.web.title1.5rem—--ds-type-web-titleSection titles, mono 500, tracking 0.04em.
type.web.body0.875rem—--ds-type-web-bodyList body.
type.web.small0.75rem—--ds-type-web-smallSummaries, times (mono, tabular-nums).
type.web.label0.6875rem—--ds-type-web-labelLabels, links, legends: mono, uppercase, tracking 0.14em.
type.web.micro0.625rem—--ds-type-web-microBadges, axis labels, overlays.
type.weight.regular400TYPE_WEIGHT_REGULAR--ds-type-weight-regularDefault.
type.weight.medium500TYPE_WEIGHT_MEDIUM--ds-type-weight-mediumSection titles; code view text.
type.weight.display650TYPE_WEIGHT_DISPLAY--ds-type-weight-displayPage title (h1).
type.tracking.caption0.14TYPE_TRACKING_CAPTION--ds-type-tracking-captionUppercase labels and captions (1.4px at 10.5px).
type.tracking.title0.04TYPE_TRACKING_TITLE--ds-type-tracking-titleSection titles.
type.tracking.display-0.045TYPE_TRACKING_DISPLAY--ds-type-tracking-displayPage title (h1).
type.line-height.body1.6TYPE_LINE_HEIGHT_BODY--ds-type-line-height-bodyWeb body text.
radius.swatch1RADIUS_SWATCH--ds-radius-swatchLegend swatches, dots.
radius.widget2RADIUS_WIDGET--ds-radius-widgetButtons, inputs, tags, menus.
radius.panel6RADIUS_PANEL--ds-radius-panelLargest radius: panels, windows, tooltips.
stroke.hairline1STROKE_HAIRLINE--ds-stroke-hairlineEvery border, separator and outline.
space.native.item-x8SPACE_ITEM_X--ds-space-native-item-xHorizontal gap between widgets.
space.native.item-y6SPACE_ITEM_Y--ds-space-native-item-yVertical gap between widgets.
space.native.button-x8SPACE_BUTTON_X--ds-space-native-button-xHorizontal button padding.
space.native.button-y3SPACE_BUTTON_Y--ds-space-native-button-yVertical button padding.
space.web.10.25rem—--ds-space-web-1Tight gaps.
space.web.20.5rem—--ds-space-web-2Small gaps.
space.web.30.75rem—--ds-space-web-3Inline groups.
space.web.41rem—--ds-space-web-4Default gap.
space.web.51.5rem—--ds-space-web-5Group gaps.
space.web.62rem—--ds-space-web-6Section margins.
space.web.73rem—--ds-space-web-7Section margins.
space.web.84rem—--ds-space-web-8Between major sections.
motion.fast150ms—--ds-motion-fastEvery hover / focus transition.
layout.content-max860px—--ds-layout-content-maxWeb content column.
layout.breakpoint-sm34rem—--ds-layout-breakpoint-smNarrow: one column, hide secondary labels.
layout.breakpoint-md56rem—--ds-layout-breakpoint-mdMedium: two columns.
meter-db.floor-60METER_DB_FLOOR--ds-meter-db-floorBottom of the meter range.
meter-db.ceiling6METER_DB_CEILING--ds-meter-db-ceilingTop of the meter range.
meter-db.caution-12METER_DB_CAUTION--ds-meter-db-cautionCaution level.
meter-db.over0METER_DB_OVER--ds-meter-db-overOver level.