@tempoxyz/ds 0.3.9 → 0.3.11
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.
- package/dist/docs/AGENTS.md +9 -0
- package/dist/docs/components/accordion.md +489 -0
- package/dist/docs/components/address-card.md +147 -0
- package/dist/docs/components/agent-logo.md +194 -0
- package/dist/docs/components/alert-dialog.md +631 -0
- package/dist/docs/components/alert.md +448 -0
- package/dist/docs/components/amount-input.md +305 -0
- package/dist/docs/components/amount.md +794 -0
- package/dist/docs/components/app-shell.md +559 -0
- package/dist/docs/components/asset-chip.md +294 -0
- package/dist/docs/components/autocomplete.md +619 -0
- package/dist/docs/components/avatar.md +321 -0
- package/dist/docs/components/badge.md +339 -0
- package/dist/docs/components/badged-logo.md +116 -0
- package/dist/docs/components/banner.md +379 -0
- package/dist/docs/components/bar-chart.md +208 -0
- package/dist/docs/components/breadcrumbs.md +380 -0
- package/dist/docs/components/button-group.md +286 -0
- package/dist/docs/components/button.md +650 -0
- package/dist/docs/components/calendar.md +375 -0
- package/dist/docs/components/callout.md +96 -0
- package/dist/docs/components/checkbox-group.md +521 -0
- package/dist/docs/components/checkbox.md +467 -0
- package/dist/docs/components/choice-group.md +516 -0
- package/dist/docs/components/choicebox.md +641 -0
- package/dist/docs/components/code.md +100 -0
- package/dist/docs/components/combobox.md +939 -0
- package/dist/docs/components/container.md +257 -0
- package/dist/docs/components/copy-button.md +642 -0
- package/dist/docs/components/date-picker.md +514 -0
- package/dist/docs/components/dialog.md +1332 -0
- package/dist/docs/components/drawer.md +966 -0
- package/dist/docs/components/empty.md +340 -0
- package/dist/docs/components/field.md +570 -0
- package/dist/docs/components/fieldset.md +398 -0
- package/dist/docs/components/frame.md +434 -0
- package/dist/docs/components/gauge.md +299 -0
- package/dist/docs/components/get-started-visual.md +117 -0
- package/dist/docs/components/grid.md +288 -0
- package/dist/docs/components/hero-visual.md +155 -0
- package/dist/docs/components/hex.md +487 -0
- package/dist/docs/components/icon-tile.md +292 -0
- package/dist/docs/components/identicon.md +371 -0
- package/dist/docs/components/inline.md +233 -0
- package/dist/docs/components/inset.md +225 -0
- package/dist/docs/components/kbd.md +423 -0
- package/dist/docs/components/list-group.md +981 -0
- package/dist/docs/components/loading-dots.md +237 -0
- package/dist/docs/components/menu.md +934 -0
- package/dist/docs/components/native-select.md +204 -0
- package/dist/docs/components/network-logo.md +248 -0
- package/dist/docs/components/number-field.md +543 -0
- package/dist/docs/components/otp-field.md +616 -0
- package/dist/docs/components/pagination.md +516 -0
- package/dist/docs/components/popover.md +544 -0
- package/dist/docs/components/progress.md +388 -0
- package/dist/docs/components/qr.md +314 -0
- package/dist/docs/components/radio-group.md +528 -0
- package/dist/docs/components/secret-value.md +406 -0
- package/dist/docs/components/select.md +751 -0
- package/dist/docs/components/separator.md +379 -0
- package/dist/docs/components/sidebar-menu.md +922 -0
- package/dist/docs/components/skeleton.md +517 -0
- package/dist/docs/components/slider.md +539 -0
- package/dist/docs/components/snippet.md +424 -0
- package/dist/docs/components/spinner.md +216 -0
- package/dist/docs/components/split-bar.md +139 -0
- package/dist/docs/components/split-button.md +464 -0
- package/dist/docs/components/stack.md +299 -0
- package/dist/docs/components/status-chip.md +226 -0
- package/dist/docs/components/status-indicator.md +119 -0
- package/dist/docs/components/status-row.md +174 -0
- package/dist/docs/components/stepper.md +451 -0
- package/dist/docs/components/success-hero.md +157 -0
- package/dist/docs/components/surface.md +639 -0
- package/dist/docs/components/switch.md +472 -0
- package/dist/docs/components/table.md +967 -0
- package/dist/docs/components/tabs.md +627 -0
- package/dist/docs/components/tempo-logo.md +185 -0
- package/dist/docs/components/text-input.md +624 -0
- package/dist/docs/components/textarea.md +352 -0
- package/dist/docs/components/toast.md +535 -0
- package/dist/docs/components/token-logo.md +371 -0
- package/dist/docs/components/token.md +247 -0
- package/dist/docs/components/tooltip.md +490 -0
- package/dist/docs/components/verification-code.md +116 -0
- package/dist/docs/components/visual.md +249 -0
- package/dist/docs/components.md +203 -0
- package/dist/docs/foundations/accessibility.md +377 -0
- package/dist/docs/foundations/agents.md +150 -0
- package/dist/docs/foundations/color.md +522 -0
- package/dist/docs/foundations/content/tone.md +194 -0
- package/dist/docs/foundations/content/voice.md +194 -0
- package/dist/docs/foundations/content/writing-style.md +406 -0
- package/dist/docs/foundations/iconography.md +282 -0
- package/dist/docs/foundations/intent.md +360 -0
- package/dist/docs/foundations/layout.md +508 -0
- package/dist/docs/foundations/linter.md +296 -0
- package/dist/docs/foundations/motion.md +151 -0
- package/dist/docs/foundations/radius-and-padding.md +86 -0
- package/dist/docs/foundations/typography.md +266 -0
- package/dist/docs/index.md +137 -0
- package/dist/docs/introduction/faq.md +132 -0
- package/dist/docs/introduction/getting-started.md +377 -0
- package/dist/docs/patterns/blockchain-values.md +709 -0
- package/dist/docs/patterns/dashboards.md +638 -0
- package/dist/docs/patterns/destructive-actions.md +626 -0
- package/dist/docs/patterns/empty-states.md +612 -0
- package/dist/docs/patterns/errors-and-validation.md +808 -0
- package/dist/docs/patterns/feedback-and-status.md +518 -0
- package/dist/docs/patterns/forms.md +679 -0
- package/dist/docs/patterns/loading.md +630 -0
- package/dist/docs/patterns/navigation.md +397 -0
- package/dist/docs/patterns/payments.md +765 -0
- package/dist/docs/patterns/responsive-layout.md +997 -0
- package/dist/docs/patterns/tables-and-lists.md +964 -0
- package/dist/docs/products/tempo-console.md +671 -0
- package/dist/docs/products/tempo-performance.md +437 -0
- package/dist/docs/products/tempo-wallet.md +438 -0
- package/dist/web/components/OtpField.css +1 -1
- package/dist/web/components/OtpField.d.ts +1 -1
- package/dist/web/components/OtpField.d.ts.map +1 -1
- package/dist/web/components/OtpField.js +3 -4
- package/dist/web/components/OtpField.js.map +1 -1
- package/dist/web/components/OtpField.js.zyzz.json +1 -1
- package/dist/web/index.js.zyzz.json +1 -1
- package/package.json +1 -1
- package/src/web/components/OtpField.tsx +2 -24
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
# Kbd
|
|
2
|
+
|
|
3
|
+
Shows a keyboard key or shortcut.
|
|
4
|
+
|
|
5
|
+
[View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/Kbd.tsx)
|
|
6
|
+
|
|
7
|
+
Figma: [Keyboard Key](https://www.figma.com/design/yE96kcymnNR88PJp6G1sPs?node-id=5402-2104)
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
Kbd renders a key or shortcut in a native `<kbd>` element. Pass the main key as children and modifiers as props. Modifiers follow the platform's conventions, and screen readers announce them by name.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
### Basic
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import { Kbd } from '@tempoxyz/ds'
|
|
19
|
+
|
|
20
|
+
export function Demo() {
|
|
21
|
+
return <Kbd>Esc</Kbd>
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Kbd/Basic.tsx)
|
|
26
|
+
|
|
27
|
+
### Modifiers
|
|
28
|
+
|
|
29
|
+
Set `ctrl`, `alt`, `shift`, or `meta` to add modifiers before the key. Apple platforms show the glyphs `⌃`, `⌥`, `⇧`, and `⌘`, always in that order. Windows and Linux show Win (Super on Linux), Ctrl, Alt, and Shift, in that order.
|
|
30
|
+
|
|
31
|
+
Set `mod` for the primary shortcut modifier, which is `⌘` on Apple platforms and Ctrl elsewhere.
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { Kbd, style } from '@tempoxyz/ds'
|
|
35
|
+
|
|
36
|
+
export function Demo() {
|
|
37
|
+
return (
|
|
38
|
+
<div {...styles.row()}>
|
|
39
|
+
<Kbd mod>K</Kbd>
|
|
40
|
+
<Kbd meta>K</Kbd>
|
|
41
|
+
<Kbd shift>P</Kbd>
|
|
42
|
+
<Kbd alt>Space</Kbd>
|
|
43
|
+
<Kbd ctrl>C</Kbd>
|
|
44
|
+
<Kbd alt meta shift>
|
|
45
|
+
T
|
|
46
|
+
</Kbd>
|
|
47
|
+
</div>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
namespace styles {
|
|
52
|
+
export const row = style({ alignItems: 'center', display: 'flex', flexWrap: 'wrap', gap: '8' })
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Kbd/Modifiers.tsx)
|
|
57
|
+
|
|
58
|
+
### Platform
|
|
59
|
+
|
|
60
|
+
Kbd reads the browser's platform after hydration, and the server renders Apple glyphs. If the request identifies the platform, set `platform` so the server renders the final labels. The `Sec-CH-UA-Platform` request header maps to `platform` as follows:
|
|
61
|
+
|
|
62
|
+
| `Sec-CH-UA-Platform` | `platform` |
|
|
63
|
+
| ------------------------------------------------------ | --------------- |
|
|
64
|
+
| `"iOS"`, `"macOS"` | `apple` |
|
|
65
|
+
| `"Android"`, `"Chrome OS"`, `"Chromium OS"`, `"Linux"` | `linux` |
|
|
66
|
+
| `"Windows"` | `windows` |
|
|
67
|
+
| `"Unknown"`, or no header | Omit `platform` |
|
|
68
|
+
|
|
69
|
+
Kbd ignores any other `platform` value, such as the raw header, and reads the browser's platform instead.
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
import { Kbd, style } from '@tempoxyz/ds'
|
|
73
|
+
|
|
74
|
+
export function Demo() {
|
|
75
|
+
return (
|
|
76
|
+
<div {...styles.row()}>
|
|
77
|
+
{(['apple', 'linux', 'windows'] as const).map((platform) => (
|
|
78
|
+
<div key={platform} {...styles.row()}>
|
|
79
|
+
<Kbd mod platform={platform} shift>
|
|
80
|
+
P
|
|
81
|
+
</Kbd>
|
|
82
|
+
<Kbd meta platform={platform}>
|
|
83
|
+
K
|
|
84
|
+
</Kbd>
|
|
85
|
+
</div>
|
|
86
|
+
))}
|
|
87
|
+
</div>
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
namespace styles {
|
|
92
|
+
export const row = style({ alignItems: 'center', display: 'flex', flexWrap: 'wrap', gap: '8' })
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Kbd/Platform.tsx)
|
|
97
|
+
|
|
98
|
+
### Size
|
|
99
|
+
|
|
100
|
+
Set `size` to `small`, `medium` (default), or `large`.
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
import { Kbd, style } from '@tempoxyz/ds'
|
|
104
|
+
|
|
105
|
+
export function Demo() {
|
|
106
|
+
return (
|
|
107
|
+
<div {...styles.row()}>
|
|
108
|
+
{(['small', 'medium', 'large'] as const).map((size) => (
|
|
109
|
+
<div key={size} {...styles.row()}>
|
|
110
|
+
<Kbd size={size}>Esc</Kbd>
|
|
111
|
+
<Kbd mod size={size}>
|
|
112
|
+
K
|
|
113
|
+
</Kbd>
|
|
114
|
+
</div>
|
|
115
|
+
))}
|
|
116
|
+
</div>
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
namespace styles {
|
|
121
|
+
export const row = style({ alignItems: 'center', display: 'flex', flexWrap: 'wrap', gap: '8' })
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Kbd/Size.tsx)
|
|
126
|
+
|
|
127
|
+
## Anatomy
|
|
128
|
+
|
|
129
|
+
Import the component and assemble its parts.
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
import { Kbd } from '@tempoxyz/ds'
|
|
133
|
+
|
|
134
|
+
<Kbd />
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Guidelines
|
|
138
|
+
|
|
139
|
+
### When to Use
|
|
140
|
+
|
|
141
|
+
* Show the shortcut beside its action, such as in a [Menu](/docs/components/menu) item, a [Tooltip](/docs/components/tooltip), or a search field hint.
|
|
142
|
+
* Name keys in instructions, such as Press Esc to close.
|
|
143
|
+
|
|
144
|
+
### When Not to Use
|
|
145
|
+
|
|
146
|
+
* Use [Snippet](/docs/components/snippet) for terminal commands.
|
|
147
|
+
* Use [Badge](/docs/components/badge) for a status or attribute.
|
|
148
|
+
* Use a visible [Button](/docs/components/button) to run an action. A shortcut only makes it faster.
|
|
149
|
+
|
|
150
|
+
### Use Modifier Props
|
|
151
|
+
|
|
152
|
+
Kbd orders and labels modifier props for the reader's platform. Glyphs typed into children lose the platform labels, the order, and the spoken names. Screen readers may skip or misread a typed `⌘`.
|
|
153
|
+
|
|
154
|
+
**Do:** Set modifier props and pass the main key as children.
|
|
155
|
+
|
|
156
|
+
```tsx
|
|
157
|
+
/**
|
|
158
|
+
* Do example for "Use Modifier Props" on the Kbd page.
|
|
159
|
+
* Set modifier props and pass the main key as children.
|
|
160
|
+
* @module
|
|
161
|
+
*/
|
|
162
|
+
import { Kbd, style } from '@tempoxyz/ds'
|
|
163
|
+
|
|
164
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
165
|
+
export function Demo() {
|
|
166
|
+
return (
|
|
167
|
+
<div {...styles.row()}>
|
|
168
|
+
<span {...styles.label()}>Open command menu</span>
|
|
169
|
+
<Kbd mod shift size="small">
|
|
170
|
+
P
|
|
171
|
+
</Kbd>
|
|
172
|
+
</div>
|
|
173
|
+
)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
namespace styles {
|
|
177
|
+
export const label = style({ color: 'content.primary', typography: 'body.b2' })
|
|
178
|
+
|
|
179
|
+
export const row = style({
|
|
180
|
+
alignItems: 'center',
|
|
181
|
+
display: 'flex',
|
|
182
|
+
gap: '16',
|
|
183
|
+
justifyContent: 'space-between',
|
|
184
|
+
width: '100% !custom',
|
|
185
|
+
})
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Don't:** Type modifier glyphs into children.
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
/** Don't example for "Use Modifier Props" on the Kbd page. Don't type modifier glyphs into children. @module */
|
|
193
|
+
import { Kbd, style } from '@tempoxyz/ds'
|
|
194
|
+
|
|
195
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
196
|
+
export function Demo() {
|
|
197
|
+
return (
|
|
198
|
+
<div {...styles.row()}>
|
|
199
|
+
<span {...styles.label()}>Open command menu</span>
|
|
200
|
+
<Kbd size="small">⌘⇧P</Kbd>
|
|
201
|
+
</div>
|
|
202
|
+
)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
namespace styles {
|
|
206
|
+
export const label = style({ color: 'content.primary', typography: 'body.b2' })
|
|
207
|
+
|
|
208
|
+
export const row = style({
|
|
209
|
+
alignItems: 'center',
|
|
210
|
+
display: 'flex',
|
|
211
|
+
gap: '16',
|
|
212
|
+
justifyContent: 'space-between',
|
|
213
|
+
width: '100% !custom',
|
|
214
|
+
})
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Show the Platform's Modifier
|
|
219
|
+
|
|
220
|
+
Set `mod` for shortcuts that take Command on macOS and Ctrl on Windows and Linux, so the hint matches the keys people press. Set `meta` only when the shortcut takes Command on macOS and the Windows or Super key elsewhere.
|
|
221
|
+
|
|
222
|
+
* **macOS (mod):** `mod` renders `⌘` for Command shortcuts on macOS.
|
|
223
|
+
* **Windows and Linux (mod):** `mod` renders Ctrl for the same shortcut on Windows and Linux.
|
|
224
|
+
|
|
225
|
+
### Use One Kbd per Chord
|
|
226
|
+
|
|
227
|
+
One `Kbd` shows keys pressed together.
|
|
228
|
+
|
|
229
|
+
**Do:** For a sequence, use one `Kbd` per step with a word between them.
|
|
230
|
+
|
|
231
|
+
```tsx
|
|
232
|
+
/**
|
|
233
|
+
* Do example for "Use One Kbd per Chord" on the Kbd page.
|
|
234
|
+
* For a sequence, use one `Kbd` per step with a word between them.
|
|
235
|
+
* @module
|
|
236
|
+
*/
|
|
237
|
+
import { Kbd, style } from '@tempoxyz/ds'
|
|
238
|
+
|
|
239
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
240
|
+
export function Demo() {
|
|
241
|
+
return (
|
|
242
|
+
<div {...styles.row()}>
|
|
243
|
+
<span {...styles.label()}>Go to activity</span>
|
|
244
|
+
<span {...styles.keys()}>
|
|
245
|
+
<Kbd size="small">G</Kbd>
|
|
246
|
+
then
|
|
247
|
+
<Kbd size="small">A</Kbd>
|
|
248
|
+
</span>
|
|
249
|
+
</div>
|
|
250
|
+
)
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
namespace styles {
|
|
254
|
+
export const keys = style({
|
|
255
|
+
alignItems: 'center',
|
|
256
|
+
color: 'content.secondary',
|
|
257
|
+
display: 'flex',
|
|
258
|
+
gap: '4',
|
|
259
|
+
typography: 'body.b3',
|
|
260
|
+
})
|
|
261
|
+
|
|
262
|
+
export const label = style({ color: 'content.primary', typography: 'body.b2' })
|
|
263
|
+
|
|
264
|
+
export const row = style({
|
|
265
|
+
alignItems: 'center',
|
|
266
|
+
display: 'flex',
|
|
267
|
+
gap: '16',
|
|
268
|
+
justifyContent: 'space-between',
|
|
269
|
+
width: '100% !custom',
|
|
270
|
+
})
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Don't:** Put the steps of a sequence in one `Kbd`.
|
|
275
|
+
|
|
276
|
+
```tsx
|
|
277
|
+
/**
|
|
278
|
+
* Don't example for "Use One Kbd per Chord" on the Kbd page.
|
|
279
|
+
* Don't put the steps of a sequence in one `Kbd`.
|
|
280
|
+
* @module
|
|
281
|
+
*/
|
|
282
|
+
import { Kbd, style } from '@tempoxyz/ds'
|
|
283
|
+
|
|
284
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
285
|
+
export function Demo() {
|
|
286
|
+
return (
|
|
287
|
+
<div {...styles.row()}>
|
|
288
|
+
<span {...styles.label()}>Go to activity</span>
|
|
289
|
+
<Kbd size="small">G A</Kbd>
|
|
290
|
+
</div>
|
|
291
|
+
)
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
namespace styles {
|
|
295
|
+
export const label = style({ color: 'content.primary', typography: 'body.b2' })
|
|
296
|
+
|
|
297
|
+
export const row = style({
|
|
298
|
+
alignItems: 'center',
|
|
299
|
+
display: 'flex',
|
|
300
|
+
gap: '16',
|
|
301
|
+
justifyContent: 'space-between',
|
|
302
|
+
width: '100% !custom',
|
|
303
|
+
})
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Keep Shortcuts Optional
|
|
308
|
+
|
|
309
|
+
If a shortcut is a single character, such as `/`, let people turn it off or remap it ([Character Key Shortcuts](https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html)).
|
|
310
|
+
|
|
311
|
+
**Do:** Give every shortcut a visible control that does the same thing.
|
|
312
|
+
|
|
313
|
+
```tsx
|
|
314
|
+
/**
|
|
315
|
+
* Do example for "Keep Shortcuts Optional" on the Kbd page.
|
|
316
|
+
* Give every shortcut a visible control that does the same thing.
|
|
317
|
+
* @module
|
|
318
|
+
*/
|
|
319
|
+
import { Kbd, style, TextInput } from '@tempoxyz/ds'
|
|
320
|
+
|
|
321
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
322
|
+
export function Demo() {
|
|
323
|
+
return (
|
|
324
|
+
<TextInput.Group {...styles.field()}>
|
|
325
|
+
<TextInput.Control
|
|
326
|
+
aria-keyshortcuts="Meta+K Control+K"
|
|
327
|
+
aria-label="Search"
|
|
328
|
+
placeholder="Search payments"
|
|
329
|
+
/>
|
|
330
|
+
<TextInput.Suffix>
|
|
331
|
+
<Kbd mod size="small">
|
|
332
|
+
K
|
|
333
|
+
</Kbd>
|
|
334
|
+
</TextInput.Suffix>
|
|
335
|
+
</TextInput.Group>
|
|
336
|
+
)
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
namespace styles {
|
|
340
|
+
export const field = style({ width: '100% !custom' })
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**Don't:** Make a shortcut the only way to reach an action.
|
|
345
|
+
|
|
346
|
+
```tsx
|
|
347
|
+
/**
|
|
348
|
+
* Don't example for "Keep Shortcuts Optional" on the Kbd page.
|
|
349
|
+
* Don't make a shortcut the only way to reach an action.
|
|
350
|
+
* @module
|
|
351
|
+
*/
|
|
352
|
+
import { Kbd, style } from '@tempoxyz/ds'
|
|
353
|
+
|
|
354
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
355
|
+
export function Demo() {
|
|
356
|
+
return (
|
|
357
|
+
<span {...styles.hint()}>
|
|
358
|
+
Press
|
|
359
|
+
<Kbd mod size="small">
|
|
360
|
+
K
|
|
361
|
+
</Kbd>
|
|
362
|
+
to search payments
|
|
363
|
+
</span>
|
|
364
|
+
)
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
namespace styles {
|
|
368
|
+
export const hint = style({
|
|
369
|
+
alignItems: 'center',
|
|
370
|
+
color: 'content.secondary',
|
|
371
|
+
display: 'flex',
|
|
372
|
+
gap: '4',
|
|
373
|
+
typography: 'body.b2',
|
|
374
|
+
})
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### Match Size to the Text
|
|
379
|
+
|
|
380
|
+
Heights match static badges.
|
|
381
|
+
|
|
382
|
+
* **Small (20px):** For menus and tooltips.
|
|
383
|
+
* **Medium (24px):** The default, for body text.
|
|
384
|
+
* **Large (32px):** Beside large controls.
|
|
385
|
+
|
|
386
|
+
## Content
|
|
387
|
+
|
|
388
|
+
* **Key names:** Write them as printed on keys, such as Esc, Enter, Tab, and Space.
|
|
389
|
+
* **Letter keys:** Write them as capitals, such as K, even without Shift.
|
|
390
|
+
* **Verb:** Write Press, not Hit or Type.
|
|
391
|
+
|
|
392
|
+
## Accessibility
|
|
393
|
+
|
|
394
|
+
Kbd renders a native `<kbd>` element and is not interactive.
|
|
395
|
+
|
|
396
|
+
### Semantics
|
|
397
|
+
|
|
398
|
+
* **Root (kbd):** Marks the text as keyboard input.
|
|
399
|
+
* **Modifier Props (aria-hidden):** Each label, such as ⌘ or Ctrl, is hidden. Screen readers read the key's name instead.
|
|
400
|
+
* **Modifier Order:** Modifiers render in the platform's order, such as Control, Option, Shift, Command on macOS, whatever the order of the props.
|
|
401
|
+
|
|
402
|
+
### Keyboard
|
|
403
|
+
|
|
404
|
+
* **Display Only:** Kbd takes no focus and does not listen for key presses. Your app registers the shortcut.
|
|
405
|
+
* **Declare the Shortcut (aria-keyshortcuts):** Set it on the control the shortcut triggers, such as `aria-keyshortcuts="Meta+K Control+K"` for a search field that accepts both.
|
|
406
|
+
|
|
407
|
+
## Related
|
|
408
|
+
|
|
409
|
+
[Menu](/docs/components/menu)
|
|
410
|
+
|
|
411
|
+
Use for actions with shortcuts.
|
|
412
|
+
|
|
413
|
+
[Tooltip](/docs/components/tooltip)
|
|
414
|
+
|
|
415
|
+
Use for labelling icon buttons.
|
|
416
|
+
|
|
417
|
+
[Snippet](/docs/components/snippet)
|
|
418
|
+
|
|
419
|
+
Use for terminal commands.
|
|
420
|
+
|
|
421
|
+
[Badge](/docs/components/badge)
|
|
422
|
+
|
|
423
|
+
Use for statuses and attributes.
|