@tempoxyz/ds 0.3.10 → 0.3.13

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.
Files changed (210) hide show
  1. package/README.md +7 -6
  2. package/dist/docs/AGENTS.md +12 -0
  3. package/dist/docs/index.md +145 -0
  4. package/dist/docs/marketing/introduction/getting-started.md +241 -0
  5. package/dist/docs/product/components/accordion.md +489 -0
  6. package/dist/docs/product/components/address-card.md +147 -0
  7. package/dist/docs/product/components/agent-logo.md +194 -0
  8. package/dist/docs/product/components/alert-dialog.md +631 -0
  9. package/dist/docs/product/components/alert.md +448 -0
  10. package/dist/docs/product/components/amount-input.md +305 -0
  11. package/dist/docs/product/components/amount.md +794 -0
  12. package/dist/docs/product/components/app-shell.md +559 -0
  13. package/dist/docs/product/components/asset-chip.md +294 -0
  14. package/dist/docs/product/components/autocomplete.md +620 -0
  15. package/dist/docs/product/components/avatar.md +321 -0
  16. package/dist/docs/product/components/badge.md +339 -0
  17. package/dist/docs/product/components/badged-logo.md +116 -0
  18. package/dist/docs/product/components/banner.md +379 -0
  19. package/dist/docs/product/components/bar-chart.md +208 -0
  20. package/dist/docs/product/components/breadcrumbs.md +380 -0
  21. package/dist/docs/product/components/button-group.md +286 -0
  22. package/dist/docs/product/components/button.md +650 -0
  23. package/dist/docs/product/components/calendar.md +375 -0
  24. package/dist/docs/product/components/callout.md +96 -0
  25. package/dist/docs/product/components/checkbox-group.md +521 -0
  26. package/dist/docs/product/components/checkbox.md +467 -0
  27. package/dist/docs/product/components/choice-group.md +516 -0
  28. package/dist/docs/product/components/choicebox.md +641 -0
  29. package/dist/docs/product/components/code.md +100 -0
  30. package/dist/docs/product/components/combobox.md +939 -0
  31. package/dist/docs/product/components/container.md +257 -0
  32. package/dist/docs/product/components/copy-button.md +642 -0
  33. package/dist/docs/product/components/date-picker.md +514 -0
  34. package/dist/docs/product/components/dialog.md +1332 -0
  35. package/dist/docs/product/components/drawer.md +966 -0
  36. package/dist/docs/product/components/empty.md +340 -0
  37. package/dist/docs/product/components/field.md +570 -0
  38. package/dist/docs/product/components/fieldset.md +398 -0
  39. package/dist/docs/product/components/frame.md +434 -0
  40. package/dist/docs/product/components/gauge.md +299 -0
  41. package/dist/docs/product/components/get-started-visual.md +117 -0
  42. package/dist/docs/product/components/grid.md +288 -0
  43. package/dist/docs/product/components/hero-visual.md +155 -0
  44. package/dist/docs/product/components/hex.md +487 -0
  45. package/dist/docs/product/components/icon-tile.md +292 -0
  46. package/dist/docs/product/components/identicon.md +371 -0
  47. package/dist/docs/product/components/inline.md +233 -0
  48. package/dist/docs/product/components/inset.md +225 -0
  49. package/dist/docs/product/components/kbd.md +423 -0
  50. package/dist/docs/product/components/list-group.md +981 -0
  51. package/dist/docs/product/components/loading-dots.md +237 -0
  52. package/dist/docs/product/components/menu.md +934 -0
  53. package/dist/docs/product/components/native-select.md +204 -0
  54. package/dist/docs/product/components/network-logo.md +248 -0
  55. package/dist/docs/product/components/number-field.md +543 -0
  56. package/dist/docs/product/components/otp-field.md +616 -0
  57. package/dist/docs/product/components/pagination.md +516 -0
  58. package/dist/docs/product/components/popover.md +544 -0
  59. package/dist/docs/product/components/progress.md +388 -0
  60. package/dist/docs/product/components/qr.md +314 -0
  61. package/dist/docs/product/components/radio-group.md +528 -0
  62. package/dist/docs/product/components/secret-value.md +406 -0
  63. package/dist/docs/product/components/select.md +751 -0
  64. package/dist/docs/product/components/separator.md +379 -0
  65. package/dist/docs/product/components/sidebar-menu.md +922 -0
  66. package/dist/docs/product/components/skeleton.md +517 -0
  67. package/dist/docs/product/components/slider.md +539 -0
  68. package/dist/docs/product/components/snippet.md +424 -0
  69. package/dist/docs/product/components/spinner.md +216 -0
  70. package/dist/docs/product/components/split-bar.md +139 -0
  71. package/dist/docs/product/components/split-button.md +464 -0
  72. package/dist/docs/product/components/stack.md +299 -0
  73. package/dist/docs/product/components/status-chip.md +226 -0
  74. package/dist/docs/product/components/status-indicator.md +119 -0
  75. package/dist/docs/product/components/status-row.md +174 -0
  76. package/dist/docs/product/components/stepper.md +451 -0
  77. package/dist/docs/product/components/success-hero.md +157 -0
  78. package/dist/docs/product/components/surface.md +639 -0
  79. package/dist/docs/product/components/switch.md +472 -0
  80. package/dist/docs/product/components/table.md +967 -0
  81. package/dist/docs/product/components/tabs.md +627 -0
  82. package/dist/docs/product/components/tempo-logo.md +185 -0
  83. package/dist/docs/product/components/text-input.md +624 -0
  84. package/dist/docs/product/components/textarea.md +352 -0
  85. package/dist/docs/product/components/toast.md +535 -0
  86. package/dist/docs/product/components/token-logo.md +371 -0
  87. package/dist/docs/product/components/token.md +247 -0
  88. package/dist/docs/product/components/tooltip.md +490 -0
  89. package/dist/docs/product/components/verification-code.md +116 -0
  90. package/dist/docs/product/components/visual.md +249 -0
  91. package/dist/docs/product/components.md +203 -0
  92. package/dist/docs/product/foundations/accessibility.md +377 -0
  93. package/dist/docs/product/foundations/agents.md +150 -0
  94. package/dist/docs/product/foundations/color.md +522 -0
  95. package/dist/docs/product/foundations/content/tone.md +194 -0
  96. package/dist/docs/product/foundations/content/voice.md +194 -0
  97. package/dist/docs/product/foundations/content/writing-style.md +406 -0
  98. package/dist/docs/product/foundations/iconography.md +282 -0
  99. package/dist/docs/product/foundations/intent.md +360 -0
  100. package/dist/docs/product/foundations/layout.md +508 -0
  101. package/dist/docs/product/foundations/linter.md +496 -0
  102. package/dist/docs/product/foundations/motion.md +151 -0
  103. package/dist/docs/product/foundations/radius-and-padding.md +86 -0
  104. package/dist/docs/product/foundations/typography.md +266 -0
  105. package/dist/docs/product/introduction/faq.md +133 -0
  106. package/dist/docs/product/introduction/getting-started.md +377 -0
  107. package/dist/docs/product/patterns/blockchain-values.md +709 -0
  108. package/dist/docs/product/patterns/dashboards.md +638 -0
  109. package/dist/docs/product/patterns/destructive-actions.md +626 -0
  110. package/dist/docs/product/patterns/empty-states.md +612 -0
  111. package/dist/docs/product/patterns/errors-and-validation.md +808 -0
  112. package/dist/docs/product/patterns/feedback-and-status.md +518 -0
  113. package/dist/docs/product/patterns/forms.md +679 -0
  114. package/dist/docs/product/patterns/loading.md +630 -0
  115. package/dist/docs/product/patterns/navigation.md +397 -0
  116. package/dist/docs/product/patterns/payments.md +765 -0
  117. package/dist/docs/product/patterns/responsive-layout.md +997 -0
  118. package/dist/docs/product/patterns/tables-and-lists.md +964 -0
  119. package/dist/docs/product/products/tempo-console.md +671 -0
  120. package/dist/docs/product/products/tempo-performance.md +437 -0
  121. package/dist/docs/product/products/tempo-wallet.md +438 -0
  122. package/dist/marketing/index.d.ts +4 -0
  123. package/dist/marketing/index.d.ts.map +1 -0
  124. package/dist/marketing/index.js +4 -0
  125. package/dist/marketing/index.js.map +1 -0
  126. package/dist/marketing/index.js.zyzz.json +1 -0
  127. package/dist/marketing/vars.d.ts +907 -0
  128. package/dist/marketing/vars.d.ts.map +1 -0
  129. package/dist/marketing/vars.js +15 -0
  130. package/dist/marketing/vars.js.map +1 -0
  131. package/dist/marketing/vars.js.zyzz.json +1 -0
  132. package/dist/marketing/zyzz.config.d.ts +4512 -0
  133. package/dist/marketing/zyzz.config.d.ts.map +1 -0
  134. package/dist/marketing/zyzz.config.js +63 -0
  135. package/dist/marketing/zyzz.config.js.map +1 -0
  136. package/dist/marketing/zyzz.config.js.zyzz.json +1 -0
  137. package/dist/oxlint/index.d.ts +12 -1
  138. package/dist/oxlint/index.d.ts.map +1 -1
  139. package/dist/oxlint/index.js +39 -1
  140. package/dist/oxlint/index.js.map +1 -1
  141. package/dist/oxlint/internal/Docs.d.ts +9 -0
  142. package/dist/oxlint/internal/Docs.d.ts.map +1 -0
  143. package/dist/oxlint/internal/Docs.js +15 -0
  144. package/dist/oxlint/internal/Docs.js.map +1 -0
  145. package/dist/oxlint/internal/Imports.d.ts +1 -1
  146. package/dist/oxlint/internal/Imports.d.ts.map +1 -1
  147. package/dist/oxlint/internal/Imports.js +2 -0
  148. package/dist/oxlint/internal/Imports.js.map +1 -1
  149. package/dist/oxlint/internal/Styles.d.ts +40 -0
  150. package/dist/oxlint/internal/Styles.d.ts.map +1 -0
  151. package/dist/oxlint/internal/Styles.js +194 -0
  152. package/dist/oxlint/internal/Styles.js.map +1 -0
  153. package/dist/oxlint/internal/Tokens.d.ts +16 -0
  154. package/dist/oxlint/internal/Tokens.d.ts.map +1 -0
  155. package/dist/oxlint/internal/Tokens.js +39 -0
  156. package/dist/oxlint/internal/Tokens.js.map +1 -0
  157. package/dist/oxlint/rules/NoCrossSurface.d.ts +2 -2
  158. package/dist/oxlint/rules/NoCrossSurface.js +3 -3
  159. package/dist/oxlint/rules/NoCrossSurface.js.map +1 -1
  160. package/dist/oxlint/rules/NoCustomValues.d.ts +11 -0
  161. package/dist/oxlint/rules/NoCustomValues.d.ts.map +1 -0
  162. package/dist/oxlint/rules/NoCustomValues.js +150 -0
  163. package/dist/oxlint/rules/NoCustomValues.js.map +1 -0
  164. package/dist/oxlint/rules/NoSingleKeyShortcuts.d.ts +11 -0
  165. package/dist/oxlint/rules/NoSingleKeyShortcuts.d.ts.map +1 -0
  166. package/dist/oxlint/rules/NoSingleKeyShortcuts.js +158 -0
  167. package/dist/oxlint/rules/NoSingleKeyShortcuts.js.map +1 -0
  168. package/dist/oxlint/rules/PreferComponent.d.ts +3 -2
  169. package/dist/oxlint/rules/PreferComponent.d.ts.map +1 -1
  170. package/dist/oxlint/rules/PreferComponent.js +11 -4
  171. package/dist/oxlint/rules/PreferComponent.js.map +1 -1
  172. package/dist/oxlint/rules/PreferLayout.d.ts +9 -0
  173. package/dist/oxlint/rules/PreferLayout.d.ts.map +1 -0
  174. package/dist/oxlint/rules/PreferLayout.js +90 -0
  175. package/dist/oxlint/rules/PreferLayout.js.map +1 -0
  176. package/dist/oxlint/rules/PreferProgress.d.ts +9 -0
  177. package/dist/oxlint/rules/PreferProgress.d.ts.map +1 -0
  178. package/dist/oxlint/rules/PreferProgress.js +43 -0
  179. package/dist/oxlint/rules/PreferProgress.js.map +1 -0
  180. package/dist/oxlint/rules/PreferSurface.d.ts +9 -0
  181. package/dist/oxlint/rules/PreferSurface.d.ts.map +1 -0
  182. package/dist/oxlint/rules/PreferSurface.js +55 -0
  183. package/dist/oxlint/rules/PreferSurface.js.map +1 -0
  184. package/dist/oxlint/rules/RequireAccessibleName.d.ts.map +1 -1
  185. package/dist/oxlint/rules/RequireAccessibleName.js +3 -1
  186. package/dist/oxlint/rules/RequireAccessibleName.js.map +1 -1
  187. package/dist/oxlint/rules/RequireScrollRegion.d.ts +11 -0
  188. package/dist/oxlint/rules/RequireScrollRegion.d.ts.map +1 -0
  189. package/dist/oxlint/rules/RequireScrollRegion.js +71 -0
  190. package/dist/oxlint/rules/RequireScrollRegion.js.map +1 -0
  191. package/dist/web/icons/index.js.zyzz.json +1 -0
  192. package/package.json +6 -1
  193. package/src/marketing/README.md +21 -0
  194. package/src/marketing/index.ts +3 -0
  195. package/src/marketing/vars.ts +751 -0
  196. package/src/marketing/zyzz.config.ts +376 -0
  197. package/src/oxlint/index.ts +40 -1
  198. package/src/oxlint/internal/Docs.ts +18 -0
  199. package/src/oxlint/internal/Imports.ts +2 -1
  200. package/src/oxlint/internal/Styles.ts +240 -0
  201. package/src/oxlint/internal/Tokens.ts +43 -0
  202. package/src/oxlint/rules/NoCrossSurface.ts +3 -3
  203. package/src/oxlint/rules/NoCustomValues.ts +170 -0
  204. package/src/oxlint/rules/NoSingleKeyShortcuts.ts +190 -0
  205. package/src/oxlint/rules/PreferComponent.ts +11 -4
  206. package/src/oxlint/rules/PreferLayout.ts +96 -0
  207. package/src/oxlint/rules/PreferProgress.ts +49 -0
  208. package/src/oxlint/rules/PreferSurface.ts +70 -0
  209. package/src/oxlint/rules/RequireAccessibleName.ts +3 -1
  210. package/src/oxlint/rules/RequireScrollRegion.ts +92 -0
@@ -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](menu.md) item, a [Tooltip](tooltip.md), 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](snippet.md) for terminal commands.
147
+ * Use [Badge](badge.md) for a status or attribute.
148
+ * Use a visible [Button](button.md) 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](menu.md)
410
+
411
+ Use for actions with shortcuts.
412
+
413
+ [Tooltip](tooltip.md)
414
+
415
+ Use for labelling icon buttons.
416
+
417
+ [Snippet](snippet.md)
418
+
419
+ Use for terminal commands.
420
+
421
+ [Badge](badge.md)
422
+
423
+ Use for statuses and attributes.