CADDi DESIGN.md
DESIGN.md
Design System Inspiration of CADDi (キャディ)
Overview
Visual Theme & Atmosphere
CADDi builds an AI data platform for manufacturing. Its own company page gives the mission as 「モノづくり産業のポテンシャルを解放する」, the head office in Asakusabashi, Taito-ku, Tokyo, 加藤勇志郎 as CEO and co-founder, and 911 employees as of 1 July 2026. The products are CADDi Drawer, CADDi Quote and the AI Data Platform.
The interface is completely square. In a census of 2,500 elements the only radius other
than zero was a single 50% avatar. Buttons, selects, cards, images — nothing is rounded,
and the token set publishes a radius scale that the page does not use.
Colour is equally restrained: #1f2533 ink on white, #d5d7e0 rules, and one blue #224bd2
that appears only as a link colour and a focus ring.
The spacing is the system. 54 of the 158 properties are --space-*, and they are not one
scale — they are four directional families drawn from a shared raw ramp.
Primary tasks
- Understand the platform and reach a contact form.
- Switch language, which is the other control the header offers.
Brand Narrative
CADDi states its mission as unleashing the potential of the manufacturing industry, works from Asakusabashi in Taito-ku, Tokyo, is led by co-founder 加藤勇志郎, and had 911 employees on 1 July 2026. It ships CADDi Drawer for custom-parts procurement, CADDi Quote for quotation, and an AI Data Platform underneath both.
The interface reads like software for people who look at engineering drawings: square, grey, one blue, one weight of type doing most of the work, and a spacing system that names the direction of every gap.
Principles
- Name the direction, not just the size.
inline,stack,inset,block. - Two surfaces, and hovering crosses between them. Pale to dark, dark to pale.
- Square, everywhere. A radius scale exists and is left alone.
Personas
Not researched. No persona claim is made from a UI capture.
Colors
Measured 2026-09-22 with getComputedStyle on caddi.com/ja-jp/platform/. 25 of the 158
properties are colours, and they are heavily aliased: the same nine values carry 25 names.
- Primary (
#224bd2) —--color-primary-500. The link colour and the focus ring; it is never a fill at rest anywhere this capture measured. - Primary Deep (
#0d34b5) —--color-primary-600. - Foreground (
#1f2533) — one value under four names:--color-text-primary,--color-neutral-800,--color-bg-darkand--color-state-default. It is the ink, the dark fill and the default state, all at once — 80 elements. - Text Secondary (
#606985) —--color-text-secondary, also--color-neutral-500and--color-state-current. - Text Tertiary (
#374059) —--color-text-tertiary, also--color-neutral-700and--color-border-on-dark. - Border (
#d5d7e0) —--color-border-secondary,--color-neutral-200, and — this one is worth noting —--color-state-hover. - Surface (
#f4f5f8) —--color-bg-subtle/--color-neutral-50. - Canvas (
#ffffff) —--color-neutral-0,--color-bg-primary,--color-text-inverse,--color-border-inverse. - Status: Error
#ff4e57· Success#2ec7cc— a teal, not a green · Warning#e9c212.
The aliasing is the interesting part. A consumer reading --color-state-default and a consumer
reading --color-text-primary get the same #1f2533, so the role names are a vocabulary over
a very small palette rather than nine independent decisions.
Typography
Font Family — four faces, three of them commercial
--font-family-bodyis"NB International Pro"— a Latin grotesk, rendered on 32 elements of the platform page and 84 of the company page.--font-family-monois"JetBrains Mono", on 12–18 elements.--font-family-displayis"Zalando Sans Expanded"— declared and not loaded. It appears in no font the browser reported, so it is recorded here in prose and not as a token.- The face that actually carries the page is
MFW-PIshiiGothicStdN— Morisawa's Pi Shii Gothic, in three weights (R, M, B) totalling 145 elements on the platform page. It comes from the fallback chain rather than from a--font-family-*token, which is how a Japanese site usually reaches its CJK face.
Both the declared Latin face and the rendered Japanese one are recorded, because taking either alone misrepresents the page.
Scale
Eight published steps: 12 · 14 · 16 · 20 · 24 · 32 · 40 · 48px. Rendered, 16px leads on 78 elements, then 14px on 58.
Weights: --font-weight-regular 400 · -medium 500 · -bold 700. The page is a 500-weight
page — 109 elements at medium against 38 bold and 33 regular.
Five line heights: tight 1.25 · display 1.2 · body 1.5 · normal 1.5 · relaxed 1.75.
Letter spacing is 0 for both body and display.
Values kept in prose
Measured values the DESIGN.md token grammar cannot carry, kept verbatim:
typography.leading.tight:1.25typography.leading.display:1.2typography.leading.body:1.5typography.leading.normal:1.5typography.leading.relaxed:1.75
Layout
Spacing named by direction, not only by size
54 tokens in four families, each 2xs → 4xl, all drawn from --space-scale-*:
| Family | Meaning | Range |
|---|---|---|
--space-inline-* | horizontal gap | 2 · 4 · 8 · 12 · 16 · 24 · 32 · 40 · 56 |
--space-stack-* | vertical gap between siblings | 2 · 4 · 8 · 12 · 16 · 24 · 32 · 40 · 56 |
--space-inset-* | padding inside a box | 4 · 8 · 12 · 16 · 24 · 32 · 40 · 48 |
--space-block-* | page-level block rhythm | 40 · 56 · 80 · 96 · 120 · 160 |
Plus --space-section-sm/md/lg at 48 / 80 / 120 and --space-section-padding-x at 96.
inline and stack carry the same numbers, so the distinction is not about value — it is
about intent, and reading --space-stack-md tells you the direction before you look it up.
The raw --space-scale-* ramp underneath runs 0 · 2 · 4 · 6 · 8 · 12 · 16 · 20 · 24 · 32 · 40
· 48 · 56 · 64 · 80 · 96 · 120 · 160px.
The rest
Three max-widths — --size-max-width-sm 800 · -md 1000 · -lg 1600px — and a fixed header
offset, --caddi-header-offset 111px, with a stuck menu bar at 80px.
Responsive Behavior
Not measured. Desktop 1440×1100 only. The three max-widths and the fixed header offset are declared; no breakpoint was observed.
Elevation & Depth
No shadow token exists and none was observed on any measured control. With no radius and no
shadow, separation is done entirely by the #d5d7e0 rule and the #f4f5f8 surface.
Motion & Easing
No motion token exists. Durations are written inline on the controls and differ by
component: background 0.2s, background-color 0.2s, color 0.2s on the primary button,
background-color 0.15s, border-color 0.15s on the select, and color 0.3s on the contact
block. Three components, three durations, no shared value.
Tier 1 sources: https://caddi.com/ja-jp/platform/ (live product surface — 158 custom properties read via getComputedStyle, three controls measured at rest, hover, pressed and focus, 2026-09-22); https://caddi.com/ja-jp/company/ (CADDi's own company page — mission, headquarters, representative, headcount and the product list, and a second brand-owned Japanese surface carrying the same token set, 2026-09-22); https://caddi.com/ja-jp/ (the landing surface, where the census of typefaces and the square-radius reading were taken; 2026-09-22)
Components
Three controls measured on live content pages, each state read on its own page load.
Primary — and it inverts
#1f2533 fill, #ffffff text, 1px transparent border, 0px radius, 48px, 16px 20px
padding, 14px/500.
Hover and pressed swap it end to end: #f4f5f8 fill, #1f2533 text and border.
Focus: outline: rgb(34, 75, 210) solid 2px — that is --color-primary-500, and solid
is the tell that it is authored rather than the browser's auto.
Language select — the same move, mirrored
#f4f5f8 fill, #1f2533 text, 1px solid #d5d7e0, 0px radius, 160×43, 16px/500.
Hover and pressed go to #1f2533 with white text and a matching border.
Put beside the primary button, the pair describes the whole interaction language: there are two surfaces, pale and dark, and hovering moves a control from one to the other.
Contact
Transparent with #224bd2 text, 0px radius, 153×47, 16px/400, transition: color 0.3s.
Hover and pressed fill with #224bd2.
Its focus is the browser's (auto 1px), unlike the two above — it is a CMS-authored block
rather than a CaddiButton, and the difference shows. No focus value is recorded for it.
Radius — declared, unused
--radius-s 4 · -m 6 · -l 8 · -full 200px are all published. The rendered page uses
none of them: every measured control computes border-radius: 0px, and the whole census
found one 50% and one 1px. The scale exists and the design does not draw on it.
States, and the tokens that are not styles
Two of three components carry measured hover, pressed and focus; the third carries hover and pressed with the browser's focus ring. The pattern is a single move — invert — applied in both directions.
46 tokens carry interface copy rather than style. --label-login is "Log in",
--label-drawer is "CADDi Drawer", --label-copyright is "© CADDi, Inc.",
--label-privacy-recruiting is "Recruiting Privacy Policy", and a run of industry names
(--label-auto "Automotive", --label-plant "Plant & Chemical") sits beside them. All in
English, on a ja-jp page.
Two of them are worth recording as found:
--label-missionis"文字列値"— literally "string value", a placeholder that reached production.- Six have degenerate names —
--label---,--label-----,--label------— carrying "Previous", "Announcements", "Back to list", "Media coverage" and "Press releases". A generator that ran out of slugs.
Neither is promoted to a token here. They are recorded because a reader of this system should
know that its --label-* layer is generated, and that generated layers carry their mistakes
into the custom-property namespace where nothing checks them.
Do's and Don'ts
Do
- Pick a spacing token by direction —
inlinefor a row gap,stackfor a column gap,insetfor padding — even though the numbers coincide. - Use
#224bd2for focus atsolid 2px; it is the system's one authored ring. - Keep corners square. The radius tokens exist; the design does not use them.
Don't
- Don't treat the colour names as nine separate values.
--color-state-default,--color-text-primary,--color-neutral-800and--color-bg-darkare all#1f2533. - Don't set
Zalando Sans Expandedbecause--font-family-displaynames it — it does not load. - Don't assume every control shares the focus ring. The CMS-authored contact button falls back to the browser's.
Voice & Tone
Not assessed as authored voice — but see §14, because 46 tokens carry interface copy.
Agent Prompt Guide
Quick Color Reference
#224bd2 primary, links and focus · #0d34b5 primary deep · #1f2533 ink and dark fill ·
#606985 secondary · #374059 tertiary · #d5d7e0 rules · #f4f5f8 surface · #ffffff
canvas · #ff4e57 error · #2ec7cc success · #e9c212 warning
Example Component Prompts
- "A 48px square button:
#1f2533fill,#ffffff14px/500 label,16px 20pxpadding, no radius; hover inverts to#f4f5f8fill with#1f2533text and border; focus draws#224bd2 solid 2px." - "A 43px square select:
#f4f5f8fill,1px solid #d5d7e0,#1f253316px/500 label, inverting to#1f2533on hover."
Governance
Known Gaps
- Contrast,
button-contact. Text#224bd2on#00000000measures 3.01:1, below the WCAG AA 4.5:1 minimum for normal-size text. Recorded as measured, not adjusted.
색상
브랜드
면과 글자
상태
타이포그래피
- NB International Pro산세리프
- MFW-PIshiiGothicStdNjapanese
- JetBrains Mono고정폭 · 오픈 글꼴 · OFLGoogle Fonts에서 설치
타입 스케일
- display--font-size-4xl; the largest published step48px
- xxxl--font-size-3xl40px
- xxl--font-size-2xl32px
- xl--font-size-xl24px
- l--font-size-l20px
- m--font-size-m; the most common rendered size, on 78 elements16px
- s--font-size-s; the button label size14px
- xs--font-size-xs12px
여백과 모양
여백
- s22px
- s44px
- s66px
- s88px
- s1212px
- s1616px
- s2020px
- s2424px
- s3232px
- s4040px
- s4848px
- s5656px
- s6464px
- s8080px
- s9696px
- s120120px
- s160160px
모서리 반경
- s4px
- m6px
- l8px
- full200px
컴포넌트
- button-primarybutton-primary채움 #1f2533 · 글자 #ffffff · 테두리 1px solid transparent · 반경 0px · 높이 48px · 안쪽 여백 16px 20px · 글자 크기·굵기 14px / 500
- 호버 #f4f5f8
- 누름 #f4f5f8
- 포커스 #224bd2
- select-language채움 #f4f5f8 · 글자 #1f2533 · 테두리 1px solid #d5d7e0 · 반경 0px · 높이 43px · 안쪽 여백 0 12px · 글자 크기·굵기 16px / 500
- 호버 #1f2533
- 누름 #1f2533
- 포커스 #224bd2