@deriv-ds/design-intelligence-layer 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,250 @@
1
+ # Deriv brand voice
2
+
3
+ A reference guide for anyone writing in Deriv's voice — product copy, marketing, documentation, support, or internal comms. This guide defines how Deriv sounds, not just what it says.
4
+
5
+ ---
6
+
7
+ ## Voice principles
8
+
9
+ Deriv's voice is **friendly and direct, never condescending**. Every piece of communication — from a button label to a blog post — should feel like it comes from the same company.
10
+
11
+ These five qualities define the voice:
12
+
13
+ 1. **Capable, not patronising.** Talk to traders as adults who understand risk. Don't over-explain the obvious.
14
+ 2. **Warm but efficient.** Be human, then get to the point. "Deposit successful. Funds usually appear in a few minutes." — not "Great news! Your deposit has been successfully processed."
15
+ 3. **Calm under pressure.** When something goes wrong — a loss, an error, a delay — the copy should be steady, not alarming. A financial loss is serious. Meet it with composure.
16
+ 4. **Personal, not corporate.** Use "you" and "we." The relationship is clear. Avoid the passive voice that hides who does what.
17
+ 5. **Simple, always.** Deriv's traders come from 38+ markets. Many are not native English speakers. If a sentence sounds clever, it probably won't translate.
18
+
19
+ ---
20
+
21
+ ## Tone calibration
22
+
23
+ The voice stays the same. The tone shifts based on what the trader is experiencing.
24
+
25
+ | Context | Tone | Example |
26
+ |---------|------|---------|
27
+ | Onboarding | Warm, encouraging | "Let's get your account set up. It takes about 3 minutes." |
28
+ | Trade placement | Focused, efficient | "Place trade" — not "Let's go!" |
29
+ | Error or failure | Calm, helpful | "We hit a snag. Try again or contact support." |
30
+ | Financial loss or stop-out | Steady, factual | "Your position has been closed. The market reached your stop-out level." |
31
+ | Success | Confirming, brief | "Withdrawal submitted. We'll process it within 1-3 business days." |
32
+ | Empty state | Inviting, low pressure | "Your trades will appear here. Ready to start?" |
33
+ | Destructive action | Clear, no drama | "Delete your account? This can't be undone." |
34
+
35
+ ---
36
+
37
+ ## Writing rules
38
+
39
+ ### 1. Say the thing first
40
+
41
+ No preamble. The most important word goes first.
42
+
43
+ | ❌ Don't | ✅ Do |
44
+ |----------|-------|
45
+ | Please note that your session has expired | Your session has expired |
46
+ | In order to proceed, you'll need to verify your identity | Verify your identity to continue |
47
+ | We wanted to let you know that your deposit was successful | Deposit successful |
48
+ | Kindly be informed that this feature is unavailable | This feature isn't available yet |
49
+
50
+ ### 2. Active voice
51
+
52
+ Passive voice hides who does what. In Deriv's world, someone always acts.
53
+
54
+ | ❌ Don't | ✅ Do |
55
+ |----------|-------|
56
+ | Your account has been verified | We've verified your account |
57
+ | An error was encountered | Something went wrong |
58
+ | Your withdrawal has been submitted | We've submitted your withdrawal |
59
+ | Deal cancellation has been activated | Deal cancellation is now active |
60
+
61
+ ### 3. Positive framing
62
+
63
+ Tell traders what they *can* do, not what they *can't*. This is a hard rule for geographic restrictions.
64
+
65
+ | ❌ Don't | ✅ Do |
66
+ |----------|-------|
67
+ | Not available in your country | Available in selected countries |
68
+ | You can't withdraw until you verify | Verify your identity to unlock withdrawals |
69
+ | This feature is not supported on mobile | Available on desktop |
70
+ | Stop loss is not available during deal cancellation | Stop loss is available once deal cancellation expires |
71
+
72
+ ### 4. Be specific
73
+
74
+ Vague copy forces people to guess. Specific copy removes doubt — especially around money.
75
+
76
+ | ❌ Don't | ✅ Do |
77
+ |----------|-------|
78
+ | We'll be in touch soon | We'll respond within 2 business days |
79
+ | Your request is being processed | Withdrawal processing — usually 1-3 hours |
80
+ | Please try again later | Try again in a few minutes |
81
+ | A small fee applies | A cancellation fee of [amount] applies |
82
+
83
+ ### 5. Plain language, not jargon
84
+
85
+ Use Deriv's approved terminology, but write around it plainly. Labels use official terms — everything else explains them in plain language.
86
+
87
+ | ❌ Jargon | ✅ Plain |
88
+ |-----------|---------|
89
+ | Crystallise your position | Close your trade to lock in your profit or loss |
90
+ | The contract has lapsed | Your trade has expired |
91
+ | Initiate a deposit | Deposit funds |
92
+ | The indicative price is non-deterministic | This price may change before your trade closes |
93
+
94
+ ### 6. One job per string
95
+
96
+ Each label, message, or instruction does one thing. If copy is trying to explain two things at once, that's a structural problem — don't solve it with longer copy.
97
+
98
+ ---
99
+
100
+ ## Banned words
101
+
102
+ These are regulatory and brand rules. No exceptions, regardless of channel.
103
+
104
+ | ❌ Never use | ✅ Use instead | Why |
105
+ |-------------|---------------|-----|
106
+ | invest / investment | trade | Regulatory compliance |
107
+ | investor | trader | Regulatory compliance |
108
+ | win | earn / receive | Regulatory compliance |
109
+ | click here | Descriptive verb + noun (e.g. "Visit the Help centre") | Accessibility and clarity |
110
+ | soon | A specific timeframe (e.g. "within 2 business days") | Precision |
111
+ | a small fee | The actual fee amount | Specificity — always show the number |
112
+ | not available in your country | Available in selected countries | Positive framing — hard rule |
113
+ | something went wrong | Name the specific failure | Too vague — gives people nothing to act on |
114
+ | unsuccessful | Not possible | "Unsuccessful" implies general failure; "not possible" names a constraint |
115
+
116
+ ### On "stake"
117
+
118
+ Allowed as a UI label and in trade mechanics context. The banned substitution ("initial capital") applies only in regulatory or compliance-facing copy. When in doubt, check with compliance.
119
+
120
+ ---
121
+
122
+ ## Terminology and naming
123
+
124
+ ### Platform names — exact capitalisation
125
+
126
+ One wrong character damages consistency. These are the only correct forms:
127
+
128
+ | ✅ Correct | ❌ Never |
129
+ |-----------|---------|
130
+ | Deriv MT5 | dMT5, MT5 alone, Deriv MT 5 |
131
+ | Deriv cTrader | Deriv Ctrader, DCtrader, ctrader |
132
+ | Deriv GO | Deriv Go, DerivGo |
133
+ | Deriv Bot | dBot, DerivBot |
134
+ | Deriv Trader | DTrader, dTrader |
135
+ | SmartTrader | Smart Trader, Smarttrader |
136
+ | Deriv Nakala | Nakala alone |
137
+ | Deriv P2P | DerivP2P, Deriv p2p |
138
+ | Deriv One | Deriv one, DerivOne, D1, Deriv 1 |
139
+ | Swap-free | Swap-Free, SwapFree, Swap free |
140
+ | Zero Spread | Zero spread, zero-spread, ZeroSpread |
141
+
142
+ ### Trade type capitalisation
143
+
144
+ - Accumulator options (not "Accumulators")
145
+ - Digital options (not "Digitals")
146
+ - Multipliers (capital M as product name)
147
+ - CFDs (never "CFD's")
148
+ - Vanilla options, Lookbacks options — lowercase "options"
149
+ - Rise/Fall, Higher/Lower, Ends Between, Stays Between — as shown
150
+
151
+ ### Derived indices — use the right level
152
+
153
+ | Term | When to use |
154
+ |------|-------------|
155
+ | Derived indices | Umbrella term for the whole category |
156
+ | Synthetic indices | The simulated subset (Volatility, Crash/Boom, Jump, etc.) |
157
+ | Basket indices | Currency basket products |
158
+ | Derived FX | Simulated forex products |
159
+
160
+ Never use "Synthetic indices" as a synonym for "Derived indices." They are a subset, not the whole.
161
+
162
+ ---
163
+
164
+ ## Language conventions
165
+
166
+ ### British English — always
167
+
168
+ | ✅ British | ❌ American |
169
+ |-----------|-----------|
170
+ | authorise | authorize |
171
+ | centre | center |
172
+ | colour | color |
173
+ | programme | program (unless a proper noun) |
174
+ | fulfil | fulfill |
175
+ | licence (noun) | license (noun) |
176
+ | practise (verb) | practice (verb) |
177
+ | realise | realize |
178
+
179
+ ### Sentence case — everywhere
180
+
181
+ Buttons, headings, labels, navigation, tab names, modal titles — all sentence case. No Title Case except proper nouns and platform/product names.
182
+
183
+ | ✅ Do | ❌ Don't |
184
+ |-------|----------|
185
+ | Your account settings | Your Account Settings |
186
+ | Deposit funds | Deposit Funds |
187
+ | Trade on Deriv MT5 | Trade On Deriv MT5 |
188
+
189
+ ### Numbers
190
+
191
+ - Use numerals always: 5%, not "five per cent."
192
+ - Use commas for 4+ digits: 1,200 USD.
193
+ - Truncate large numbers with units only in charts ("1.2K"). Never truncate in financial confirmations — always show the full amount.
194
+
195
+ ---
196
+
197
+ ## Error and loss communication
198
+
199
+ Errors and loss events are the highest-stakes moments for Deriv's voice. The rules are stricter here.
200
+
201
+ **Structure for errors:** What happened → What to do → Why (only if it helps).
202
+
203
+ **Tone rules:**
204
+ - Never blame the user: "You entered an invalid…" → "Enter a valid…"
205
+ - Never use error codes in user-facing messages (logs only).
206
+ - For financial loss events: factual and steady, not apologetic or alarming.
207
+ - Always include what to do next — even if it's just "Try again."
208
+
209
+ ---
210
+
211
+ ## Geographic and regulatory sensitivity
212
+
213
+ Deriv operates across 38+ markets under different regulatory bodies. Copy must respect this.
214
+
215
+ | Scenario | Guidance |
216
+ |----------|----------|
217
+ | Feature not available in EU | Do not expose in EU-regulated flows. When in doubt, flag to compliance before writing. |
218
+ | Feature restricted in some non-EU markets | Use positive framing: "Available in selected countries." Never "Not available in your country." |
219
+ | Copy must work across EU and non-EU surfaces | Write for the more restricted version. Flag to the team that a variant may be needed. |
220
+ | Tooltip for an EU-unavailable term in shared codebase | Write the copy, but ensure the component is hidden for EU users. Don't omit the copy — coordinate with engineering. |
221
+
222
+ ---
223
+
224
+ ## Quick reference checklist
225
+
226
+ Before any copy ships, run through this:
227
+
228
+ **Clarity**
229
+ - Does it start with the most important word?
230
+ - Can any word be removed without losing meaning?
231
+ - Is the voice active?
232
+ - Is it free of jargon a first-time trader wouldn't know?
233
+
234
+ **Accuracy**
235
+ - Does it avoid banned words?
236
+ - Are platform and product names capitalised correctly?
237
+ - Is it sentence case?
238
+ - Is it British English?
239
+ - Does it use positive framing for restrictions?
240
+
241
+ **Action**
242
+ - Does it tell the reader what to do, not just what happened?
243
+ - If it's a button: is the label a verb that matches the outcome?
244
+ - If it's an error: does it say what to do next?
245
+
246
+ ---
247
+
248
+ ## Sources
249
+
250
+ This guide is derived from Deriv's UX writing system, product glossary, and content style guide. For element-specific rules (character limits, component patterns, copy bricks), refer to the full UX writing skill. For approved product term definitions, refer to the Deriv product glossary.
@@ -1,7 +1,7 @@
1
- # Trading Game Design System Guide
1
+ # Deriv Design Intelligence Guide
2
2
 
3
- > **Package:** `@trading-game/design-intelligence-layer`
4
- > **Audience:** AI agents and developers building UI for the Trading Game. This is the single source of truth for setting up and using the design system in any project.
3
+ > **Package:** `@deriv-ds/design-intelligence-layer`
4
+ > **Audience:** AI agents and developers building UI for Deriv products. This is the single source of truth for setting up and using the design system in any project.
5
5
 
6
6
  ---
7
7
 
@@ -82,7 +82,7 @@ Each component in the catalogue is tagged:
82
82
  ### Step 1 — Install the package
83
83
 
84
84
  ```bash
85
- npm install @trading-game/design-intelligence-layer@latest --safe-chain-skip-minimum-package-age
85
+ npm install @deriv-ds/design-intelligence-layer@latest --safe-chain-skip-minimum-package-age
86
86
  ```
87
87
 
88
88
  ### Step 2 — Add CSS imports
@@ -92,8 +92,8 @@ In your main CSS file (e.g. `globals.css` or `index.css`):
92
92
  ```css
93
93
  @import url("https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&display=swap");
94
94
  @import "tailwindcss";
95
- @import "@trading-game/design-intelligence-layer/styles";
96
- @source "../node_modules/@trading-game/design-intelligence-layer/dist";
95
+ @import "@deriv-ds/design-intelligence-layer/styles";
96
+ @source "../node_modules/@deriv-ds/design-intelligence-layer/dist";
97
97
  ```
98
98
 
99
99
  > **Note:** Fonts are loaded via a direct Google Fonts `@import` URL. Do NOT use `next/font`.
@@ -105,7 +105,7 @@ The design system is light-first. No extra class is required on `<html>` for the
105
105
  ### Step 4 — Import components
106
106
 
107
107
  ```tsx
108
- import { Button, Card, Badge } from "@trading-game/design-intelligence-layer"
108
+ import { Button, Card, Badge } from "@deriv-ds/design-intelligence-layer"
109
109
  ```
110
110
 
111
111
  ---
@@ -457,7 +457,7 @@ All buttons: `font-display font-bold`, sentence case (no `uppercase`, no `tracki
457
457
 
458
458
  ## 8 — Available Components
459
459
 
460
- > **All components below are exported from `@trading-game/design-intelligence-layer`.**
460
+ > **All components below are exported from `@deriv-ds/design-intelligence-layer`.**
461
461
  > - If a component is listed → import and use it. Do NOT re-implement.
462
462
  > - If NOT listed → STOP and ask the user (see Rule 1).
463
463
  > - For props, variants, sizes, and sub-components → inspect the package's TypeScript types after installation.
@@ -467,13 +467,13 @@ All buttons: `font-display font-bold`, sentence case (no `uppercase`, no `tracki
467
467
  All components use the same import path:
468
468
 
469
469
  ```tsx
470
- import { Button, Card, Badge } from "@trading-game/design-intelligence-layer"
470
+ import { Button, Card, Badge } from "@deriv-ds/design-intelligence-layer"
471
471
  ```
472
472
 
473
473
  ### Example — composed component with sub-components
474
474
 
475
475
  ```tsx
476
- import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, DialogClose } from "@trading-game/design-intelligence-layer"
476
+ import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, DialogClose } from "@deriv-ds/design-intelligence-layer"
477
477
 
478
478
  <Dialog>
479
479
  <DialogTrigger asChild><Button>Open</Button></DialogTrigger>
@@ -528,7 +528,7 @@ import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, Dialog
528
528
  | Kbd | [simple] | KbdGroup |
529
529
  | Label | [simple] | — |
530
530
  | Link | [simple] | — |
531
- | Menubar | [complex] | MenubarMenu, MenubarTrigger, MenubarContent, MenubarItem, MenubarSeparator, MenubarLabel, MenubarCheckboxItem, MenubarRadioGroup, MenubarRadioItem, MenubarSub, MenubarSubTrigger, MenubarSubContent, MenubarShortcut |
531
+ | LoadingSpinner | [simple] | |
532
532
  | NavigationMenu | [complex] | NavigationMenuList, NavigationMenuItem, NavigationMenuTrigger, NavigationMenuContent, NavigationMenuLink, NavigationMenuIndicator, NavigationMenuViewport, navigationMenuTriggerStyle |
533
533
  | NativeSelect | [simple] | NativeSelectOption, NativeSelectOptGroup |
534
534
  | Pagination | [composed] | PaginationContent, PaginationItem, PaginationLink, PaginationPrevious, PaginationNext, PaginationEllipsis |
@@ -570,12 +570,12 @@ These are styling behaviors you can't discover from TypeScript types alone:
570
570
  | Tabs | **Variants:** `default` (pill, `bg-tabs`) and `line` (underline, transparent bg). **Sizes:** `sm` (h-8, text-xs), `md` (h-10, text-sm, default), `lg` (h-12, text-base). **Icon position:** `inline` (default) or `top` (stacks icon above label). **Orientation:** `horizontal` (default) or `vertical` (line variant renders left-edge indicator). Hover: `bg-secondary-hover` (default) / `text-primary` (line). Selected: `bg-tabs-active` + `text-primary font-semibold`. Line variant underline: `bg-primary`. |
571
571
  | Select | Item hover: `bg-primary/[0.08]`. Selected: `text-primary font-medium` + checkmark. `SelectTrigger` accepts `readOnly` prop: blocks interaction, retains full default appearance, chevron renders at `opacity-30` |
572
572
  | Progress | Track: `bg-primary/20`. Indicator: `bg-primary`. Radius: `rounded-2xs` |
573
- | Spinner | Inherits parent text color. **Always pass `text-primary` for standalone use** |
573
+ | LoadingSpinner | Arc spinner. Color comes from `--loading-spinner-bg-default` token (coral `#ff444f`). Size defaults to `size-4` (16px); override via `className` (e.g. `size-6`, `size-8`). |
574
574
  | Stepper | Numeric input flanked by `−` / `+` tertiary `icon-xs` buttons. Composes `InputGroup` internally. Props: `value`, `defaultValue`, `onValueChange`, `min`, `max`, `step` (default 1), `disabled`, `placeholder`. Supports controlled & uncontrolled modes, keyboard Arrow Up/Down, and floating-point steps. Default width: `w-32` |
575
575
  | Switch | Checked track: `bg-slider-range`. Checked thumb: `bg-primary` |
576
576
  | Slider | Thumb: square `rounded-[4px]`, `bg-primary`. Track range: `bg-slider-range` |
577
577
  | Dialog/Sheet | Footer buttons should use `size="md"`. Overlay: `bg-overlay` |
578
- | Menubar | Hover: `bg-primary/[0.08]`. Open state: `bg-primary/10` |
578
+ | Link | **5 variants:** `primary` (coral, theme-agnostic), `secondary-normal` (dark on light / auto-switches to inverse white on dark mode), `secondary-inverse` (white, always for dark backgrounds), `secondary-static-light` (always dark, light backgrounds), `secondary-static-dark` (always white, dark backgrounds). Always underlined. Sizes: `sm` (12px), `md` (14px), `lg` (16px, default). Disabled via `aria-disabled="true"`. |
579
579
  | Toggle | Pressed: `bg-primary/10` + `border-primary` + `text-primary` |
580
580
  | Calendar | Selected: `bg-secondary-hover` + `text-primary font-bold`. Today: primary dot below date |
581
581
 
@@ -585,7 +585,7 @@ These are styling behaviors you can't discover from TypeScript types alone:
585
585
 
586
586
  > Blocks are fully composed UI sections built from design system primitives. They appear in the **Blocks** tab of the playground.
587
587
  > - Blocks are **NOT exported** from the npm package — they are playground demonstrations only.
588
- > - To build them in a consuming project, import the underlying components (`Button`, etc.) from `@trading-game/design-intelligence-layer` and compose them manually using design tokens only.
588
+ > - To build them in a consuming project, import the underlying components (`Button`, etc.) from `@deriv-ds/design-intelligence-layer` and compose them manually using design tokens only.
589
589
  > - Do NOT mistake a Block for a component — it will not appear in Rule 1's component list.
590
590
 
591
591
  ### NavBar