@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.
Files changed (128) hide show
  1. package/dist/docs/AGENTS.md +9 -0
  2. package/dist/docs/components/accordion.md +489 -0
  3. package/dist/docs/components/address-card.md +147 -0
  4. package/dist/docs/components/agent-logo.md +194 -0
  5. package/dist/docs/components/alert-dialog.md +631 -0
  6. package/dist/docs/components/alert.md +448 -0
  7. package/dist/docs/components/amount-input.md +305 -0
  8. package/dist/docs/components/amount.md +794 -0
  9. package/dist/docs/components/app-shell.md +559 -0
  10. package/dist/docs/components/asset-chip.md +294 -0
  11. package/dist/docs/components/autocomplete.md +619 -0
  12. package/dist/docs/components/avatar.md +321 -0
  13. package/dist/docs/components/badge.md +339 -0
  14. package/dist/docs/components/badged-logo.md +116 -0
  15. package/dist/docs/components/banner.md +379 -0
  16. package/dist/docs/components/bar-chart.md +208 -0
  17. package/dist/docs/components/breadcrumbs.md +380 -0
  18. package/dist/docs/components/button-group.md +286 -0
  19. package/dist/docs/components/button.md +650 -0
  20. package/dist/docs/components/calendar.md +375 -0
  21. package/dist/docs/components/callout.md +96 -0
  22. package/dist/docs/components/checkbox-group.md +521 -0
  23. package/dist/docs/components/checkbox.md +467 -0
  24. package/dist/docs/components/choice-group.md +516 -0
  25. package/dist/docs/components/choicebox.md +641 -0
  26. package/dist/docs/components/code.md +100 -0
  27. package/dist/docs/components/combobox.md +939 -0
  28. package/dist/docs/components/container.md +257 -0
  29. package/dist/docs/components/copy-button.md +642 -0
  30. package/dist/docs/components/date-picker.md +514 -0
  31. package/dist/docs/components/dialog.md +1332 -0
  32. package/dist/docs/components/drawer.md +966 -0
  33. package/dist/docs/components/empty.md +340 -0
  34. package/dist/docs/components/field.md +570 -0
  35. package/dist/docs/components/fieldset.md +398 -0
  36. package/dist/docs/components/frame.md +434 -0
  37. package/dist/docs/components/gauge.md +299 -0
  38. package/dist/docs/components/get-started-visual.md +117 -0
  39. package/dist/docs/components/grid.md +288 -0
  40. package/dist/docs/components/hero-visual.md +155 -0
  41. package/dist/docs/components/hex.md +487 -0
  42. package/dist/docs/components/icon-tile.md +292 -0
  43. package/dist/docs/components/identicon.md +371 -0
  44. package/dist/docs/components/inline.md +233 -0
  45. package/dist/docs/components/inset.md +225 -0
  46. package/dist/docs/components/kbd.md +423 -0
  47. package/dist/docs/components/list-group.md +981 -0
  48. package/dist/docs/components/loading-dots.md +237 -0
  49. package/dist/docs/components/menu.md +934 -0
  50. package/dist/docs/components/native-select.md +204 -0
  51. package/dist/docs/components/network-logo.md +248 -0
  52. package/dist/docs/components/number-field.md +543 -0
  53. package/dist/docs/components/otp-field.md +616 -0
  54. package/dist/docs/components/pagination.md +516 -0
  55. package/dist/docs/components/popover.md +544 -0
  56. package/dist/docs/components/progress.md +388 -0
  57. package/dist/docs/components/qr.md +314 -0
  58. package/dist/docs/components/radio-group.md +528 -0
  59. package/dist/docs/components/secret-value.md +406 -0
  60. package/dist/docs/components/select.md +751 -0
  61. package/dist/docs/components/separator.md +379 -0
  62. package/dist/docs/components/sidebar-menu.md +922 -0
  63. package/dist/docs/components/skeleton.md +517 -0
  64. package/dist/docs/components/slider.md +539 -0
  65. package/dist/docs/components/snippet.md +424 -0
  66. package/dist/docs/components/spinner.md +216 -0
  67. package/dist/docs/components/split-bar.md +139 -0
  68. package/dist/docs/components/split-button.md +464 -0
  69. package/dist/docs/components/stack.md +299 -0
  70. package/dist/docs/components/status-chip.md +226 -0
  71. package/dist/docs/components/status-indicator.md +119 -0
  72. package/dist/docs/components/status-row.md +174 -0
  73. package/dist/docs/components/stepper.md +451 -0
  74. package/dist/docs/components/success-hero.md +157 -0
  75. package/dist/docs/components/surface.md +639 -0
  76. package/dist/docs/components/switch.md +472 -0
  77. package/dist/docs/components/table.md +967 -0
  78. package/dist/docs/components/tabs.md +627 -0
  79. package/dist/docs/components/tempo-logo.md +185 -0
  80. package/dist/docs/components/text-input.md +624 -0
  81. package/dist/docs/components/textarea.md +352 -0
  82. package/dist/docs/components/toast.md +535 -0
  83. package/dist/docs/components/token-logo.md +371 -0
  84. package/dist/docs/components/token.md +247 -0
  85. package/dist/docs/components/tooltip.md +490 -0
  86. package/dist/docs/components/verification-code.md +116 -0
  87. package/dist/docs/components/visual.md +249 -0
  88. package/dist/docs/components.md +203 -0
  89. package/dist/docs/foundations/accessibility.md +377 -0
  90. package/dist/docs/foundations/agents.md +150 -0
  91. package/dist/docs/foundations/color.md +522 -0
  92. package/dist/docs/foundations/content/tone.md +194 -0
  93. package/dist/docs/foundations/content/voice.md +194 -0
  94. package/dist/docs/foundations/content/writing-style.md +406 -0
  95. package/dist/docs/foundations/iconography.md +282 -0
  96. package/dist/docs/foundations/intent.md +360 -0
  97. package/dist/docs/foundations/layout.md +508 -0
  98. package/dist/docs/foundations/linter.md +296 -0
  99. package/dist/docs/foundations/motion.md +151 -0
  100. package/dist/docs/foundations/radius-and-padding.md +86 -0
  101. package/dist/docs/foundations/typography.md +266 -0
  102. package/dist/docs/index.md +137 -0
  103. package/dist/docs/introduction/faq.md +132 -0
  104. package/dist/docs/introduction/getting-started.md +377 -0
  105. package/dist/docs/patterns/blockchain-values.md +709 -0
  106. package/dist/docs/patterns/dashboards.md +638 -0
  107. package/dist/docs/patterns/destructive-actions.md +626 -0
  108. package/dist/docs/patterns/empty-states.md +612 -0
  109. package/dist/docs/patterns/errors-and-validation.md +808 -0
  110. package/dist/docs/patterns/feedback-and-status.md +518 -0
  111. package/dist/docs/patterns/forms.md +679 -0
  112. package/dist/docs/patterns/loading.md +630 -0
  113. package/dist/docs/patterns/navigation.md +397 -0
  114. package/dist/docs/patterns/payments.md +765 -0
  115. package/dist/docs/patterns/responsive-layout.md +997 -0
  116. package/dist/docs/patterns/tables-and-lists.md +964 -0
  117. package/dist/docs/products/tempo-console.md +671 -0
  118. package/dist/docs/products/tempo-performance.md +437 -0
  119. package/dist/docs/products/tempo-wallet.md +438 -0
  120. package/dist/web/components/OtpField.css +1 -1
  121. package/dist/web/components/OtpField.d.ts +1 -1
  122. package/dist/web/components/OtpField.d.ts.map +1 -1
  123. package/dist/web/components/OtpField.js +3 -4
  124. package/dist/web/components/OtpField.js.map +1 -1
  125. package/dist/web/components/OtpField.js.zyzz.json +1 -1
  126. package/dist/web/index.js.zyzz.json +1 -1
  127. package/package.json +1 -1
  128. package/src/web/components/OtpField.tsx +2 -24
@@ -0,0 +1,437 @@
1
+ # Tempo Performance
2
+
3
+ Tempo Performance is the public benchmark dashboard for the Tempo network.
4
+
5
+ > [!NOTE]
6
+ > The reference layout on this page is a composition of library components and `style`, not a shipped component. `@tempoxyz/ds` exports no `MetricTile` or `BenchmarkDashboard`. Copy the layout into your app and adapt it. The library has no chart component, so the layout marks where a chart goes.
7
+
8
+ ## Overview
9
+
10
+ Tempo Performance runs at [perf.tempo.xyz](https://perf.tempo.xyz). It shows one benchmark run at a time:
11
+
12
+ * **Headline:** Settled TPS, block time, and gas throughput.
13
+ * **Charts:** Block validation, payload building, the transaction pool, persistence, and server resources.
14
+
15
+ A Methodology page describes the benchmark host, the workload, and the derivation of each metric.
16
+
17
+ Roles:
18
+
19
+ * **Protocol and Node Engineers:** Compare nightly runs to catch regressions.
20
+ * **Anyone Evaluating Tempo:** Read the public results.
21
+
22
+ ## Surfaces
23
+
24
+ Tempo Performance is a responsive web app built with `@tempoxyz/ds`. No native app is documented.
25
+
26
+ On a phone, the run selects stack at full width, the settled TPS tile spans the column, and the other metric tiles form two columns.
27
+
28
+ ## Key Screens
29
+
30
+ ### Dashboard
31
+
32
+ ```tsx
33
+ import { Button, ChoiceGroup, Field, Grid, Popover, Select, style, Surface, Table } from '@tempoxyz/ds'
34
+ import { InfoCircle } from '@tempoxyz/ds/icons'
35
+ import { useState } from 'react'
36
+
37
+ export const fill = true
38
+ const nightlies = [
39
+ 'main-2026-10-19-296be2ab',
40
+ 'main-2026-10-17-2c25f7cd',
41
+ 'main-2026-10-16-dee08cf9',
42
+ ]
43
+
44
+ const scenarios = { 'public-mix': 'Public mix · multi-region' }
45
+
46
+ const metrics = [
47
+ {
48
+ definition: 'Number of blocks produced during the benchmark run.',
49
+ label: 'Blocks',
50
+ value: '142',
51
+ },
52
+ {
53
+ definition: 'Average wall-clock time between consecutive blocks.',
54
+ label: 'Block time',
55
+ value: '633 ms',
56
+ },
57
+ {
58
+ definition:
59
+ 'Average gas per second across the entire run: total gas used ÷ total run duration.',
60
+ label: 'Avg gas/s',
61
+ value: '1.38 Ggas/s',
62
+ },
63
+ {
64
+ definition:
65
+ 'Highest gas per second achieved by any single block, from its gas usage and block time.',
66
+ label: 'Peak gas/s',
67
+ value: '2.00 Ggas/s',
68
+ },
69
+ {
70
+ definition:
71
+ 'Total configured account set for this run, including txgen senders and pre-state recipients.',
72
+ label: 'Accounts',
73
+ value: '1,000',
74
+ },
75
+ {
76
+ definition: 'Number of TIP-20 tokens configured for this benchmark run.',
77
+ label: 'TIP-20 tokens',
78
+ value: '4',
79
+ },
80
+ ]
81
+
82
+ const quantiles = [
83
+ ['p50', '219.1 ms'],
84
+ ['p95', '264.4 ms'],
85
+ ['p99', '452.3 ms'],
86
+ ]
87
+
88
+ function Definition(props: Definition.Props) {
89
+ return (
90
+ <Popover.Root>
91
+ <Popover.Trigger
92
+ aria-label={`About ${props.label}`}
93
+ render={<Button shape="icon" size="small" variant="tertiary" />}
94
+ >
95
+ <InfoCircle />
96
+ </Popover.Trigger>
97
+ <Popover.Popup>
98
+ <Popover.Title>{props.label}</Popover.Title>
99
+ <Popover.Description>{props.children}</Popover.Description>
100
+ </Popover.Popup>
101
+ </Popover.Root>
102
+ )
103
+ }
104
+
105
+ declare namespace Definition {
106
+ type Props = { children: string; label: string }
107
+ }
108
+
109
+ export function Demo() {
110
+ const [nightly, setNightly] = useState<string | null>(nightlies[0] ?? null)
111
+ const [scenario, setScenario] = useState<string | null>('public-mix')
112
+ const commit = (nightly ?? '').slice(-8, -1)
113
+
114
+ return (
115
+ <div {...styles.page()}>
116
+ <header {...styles.bar()}>
117
+ <span {...styles.brand()}>Tempo Performance</span>
118
+ <nav aria-label="Performance" {...styles.nav()}>
119
+ <Button.Link aria-current="page" href="#dashboard" size="small" variant="secondary">
120
+ Dashboard
121
+ </Button.Link>
122
+ <Button.Link href="#methodology" size="small" variant="tertiary">
123
+ Methodology
124
+ </Button.Link>
125
+ </nav>
126
+ </header>
127
+
128
+ <div {...styles.run()}>
129
+ <div>
130
+ <h1 {...styles.title()}>Benchmark run</h1>
131
+ <p {...styles.meta()}>
132
+ Oct 20, 2026, 3:01 AM ·{' '}
133
+ <a href="#commit" {...styles.commit()}>
134
+ {commit}
135
+ </a>{' '}
136
+ · 2m 35s ·{' '}
137
+ <a href="#workflow" {...styles.link()}>
138
+ GitHub workflow
139
+ </a>
140
+ </p>
141
+ </div>
142
+ <div {...styles.filters()}>
143
+ <Field.Root {...styles.filter()}>
144
+ <Field.Label>Nightly</Field.Label>
145
+ <Select.Root onValueChange={setNightly} value={nightly}>
146
+ <Select.Trigger>
147
+ <Select.Value>
148
+ {(value: string) => <span {...styles.mono()}>{value}</span>}
149
+ </Select.Value>
150
+ <Select.Icon />
151
+ </Select.Trigger>
152
+ <Select.Popup size="small">
153
+ {nightlies.map((value) => (
154
+ <Select.Item key={value} value={value}>
155
+ <Select.ItemText>
156
+ <span {...styles.mono()}>{value}</span>
157
+ </Select.ItemText>
158
+ </Select.Item>
159
+ ))}
160
+ </Select.Popup>
161
+ </Select.Root>
162
+ </Field.Root>
163
+ <Field.Root {...styles.filter()}>
164
+ <Field.Label>Scenario</Field.Label>
165
+ <Select.Root items={scenarios} onValueChange={setScenario} value={scenario}>
166
+ <Select.Trigger>
167
+ <Select.Value />
168
+ <Select.Icon />
169
+ </Select.Trigger>
170
+ <Select.Popup size="small">
171
+ {Object.entries(scenarios).map(([value, label]) => (
172
+ <Select.Item key={value} label={label} value={value}>
173
+ <Select.ItemText>{label}</Select.ItemText>
174
+ </Select.Item>
175
+ ))}
176
+ </Select.Popup>
177
+ </Select.Root>
178
+ </Field.Root>
179
+ </div>
180
+ </div>
181
+
182
+ <Surface size="medium">
183
+ <div {...styles.label()}>
184
+ Settled TPS
185
+ <Definition label="Settled TPS">
186
+ Median transactions per second that landed in blocks for this benchmark run.
187
+ </Definition>
188
+ </div>
189
+ <p {...styles.hero()}>
190
+ 14,960 <span {...styles.unit()}>TPS</span>
191
+ </p>
192
+ <p {...styles.caption()}>
193
+ Median settled throughput across 142 measured blocks. Run duration: 2m 35s.
194
+ </p>
195
+ </Surface>
196
+
197
+ <Grid fit="small" gap="16">
198
+ {metrics.map((metric) => (
199
+ <Surface key={metric.label} size="medium">
200
+ <div {...styles.label()}>
201
+ {metric.label}
202
+ <Definition label={metric.label}>{metric.definition}</Definition>
203
+ </div>
204
+ <p {...styles.value()}>{metric.value}</p>
205
+ </Surface>
206
+ ))}
207
+ </Grid>
208
+
209
+ <Surface>
210
+ <Surface.Header {...styles.section()}>
211
+ <Surface.Title>Block validation</Surface.Title>
212
+ <ChoiceGroup.Root aria-label="Metric scope" defaultValue="network" size="small">
213
+ <ChoiceGroup.Item value="network">Network</ChoiceGroup.Item>
214
+ <ChoiceGroup.Item value="rpc">RPC node</ChoiceGroup.Item>
215
+ <ChoiceGroup.Item value="validators">Validators</ChoiceGroup.Item>
216
+ </ChoiceGroup.Root>
217
+ </Surface.Header>
218
+ <div {...styles.label()}>
219
+ <h3 {...styles.heading()}>New payload validation latency</h3>
220
+ <Definition label="New payload validation latency">
221
+ Latency percentiles reported by the consensus engine while validating newPayload
222
+ requests.
223
+ </Definition>
224
+ </div>
225
+ <div {...styles.chart()}>Time-series chart. The library has no chart component yet.</div>
226
+ <Table.Root size="small">
227
+ <Table.Caption>Average latency by quantile for this run</Table.Caption>
228
+ <Table.Head>
229
+ <Table.Row>
230
+ <Table.HeaderCell>Quantile</Table.HeaderCell>
231
+ <Table.HeaderCell>Average</Table.HeaderCell>
232
+ </Table.Row>
233
+ </Table.Head>
234
+ <Table.Body>
235
+ {quantiles.map(([quantile, average]) => (
236
+ <Table.Row key={quantile}>
237
+ <Table.Cell mono>{quantile}</Table.Cell>
238
+ <Table.Cell numeric>{average}</Table.Cell>
239
+ </Table.Row>
240
+ ))}
241
+ </Table.Body>
242
+ </Table.Root>
243
+ </Surface>
244
+ </div>
245
+ )
246
+ }
247
+
248
+ namespace styles {
249
+ export const bar = style({
250
+ alignItems: 'center',
251
+ display: 'flex',
252
+ flexWrap: 'wrap',
253
+ gap: '12',
254
+ justifyContent: 'space-between',
255
+ })
256
+
257
+ export const brand = style({ typography: 'body.b1Strong' })
258
+
259
+ export const caption = style({ color: 'content.secondary', margin: '0', typography: 'body.b3' })
260
+
261
+ export const chart = style({
262
+ alignItems: 'center',
263
+ borderColor: 'line.secondary',
264
+ borderRadius: 'xs',
265
+ borderStyle: 'dashed',
266
+ borderWidth: 'regular',
267
+ color: 'content.secondary',
268
+ display: 'flex',
269
+ justifyContent: 'center',
270
+ marginBlock: '16',
271
+ minHeight: '200',
272
+ padding: '16',
273
+ textAlign: 'center',
274
+ typography: 'body.b3',
275
+ })
276
+
277
+ export const commit = style({ color: 'content.primary', typography: 'mono.m1' })
278
+
279
+ export const filter = style({ flex: '1 1 14rem !custom', minWidth: '0' })
280
+
281
+ export const filters = style({ display: 'flex', flexWrap: 'wrap', gap: '12' })
282
+
283
+ export const heading = style({ margin: '0', typography: 'body.b2Strong' })
284
+
285
+ export const hero = style({
286
+ alignItems: 'baseline',
287
+ columnGap: '8',
288
+ display: 'flex',
289
+ fontFamily: 'mono',
290
+ fontSize: '36',
291
+ fontVariantNumeric: 'tabular-nums !custom',
292
+ margin: '0',
293
+ marginBlock: '8',
294
+ })
295
+
296
+ export const label = style({
297
+ alignItems: 'center',
298
+ color: 'content.secondary',
299
+ columnGap: '4',
300
+ display: 'flex',
301
+ typography: 'body.b3',
302
+ })
303
+
304
+ export const link = style({ color: 'content.primary' })
305
+
306
+ export const meta = style({ color: 'content.secondary', margin: '0', typography: 'body.b3' })
307
+
308
+ export const mono = style({ typography: 'mono.m1' })
309
+
310
+ export const nav = style({ columnGap: '4', display: 'flex' })
311
+
312
+ export const page = style({
313
+ backgroundColor: 'background.primary',
314
+ display: 'flex',
315
+ flexDirection: 'column',
316
+ padding: '16',
317
+ rowGap: '16',
318
+ })
319
+
320
+ export const run = style({
321
+ alignItems: 'flex-end',
322
+ display: 'flex',
323
+ flexWrap: 'wrap',
324
+ gap: '16',
325
+ justifyContent: 'space-between',
326
+ })
327
+
328
+ export const section = style({ flexWrap: 'wrap', rowGap: '12' })
329
+
330
+ export const title = style({ margin: '0', typography: 'heading.h3' })
331
+
332
+ export const unit = style({ color: 'content.secondary', fontSize: '14' })
333
+
334
+ export const value = style({
335
+ fontFamily: 'mono',
336
+ fontSize: '24',
337
+ fontVariantNumeric: 'tabular-nums !custom',
338
+ margin: '0',
339
+ marginBlockStart: '4',
340
+ })
341
+ }
342
+ ```
343
+
344
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Products/PerformanceDashboard.tsx)
345
+
346
+ The dashboard names the run and offers a run picker. Content runs from the headline metric down to the detailed sections.
347
+
348
+ * **Page Links (aria-current):** Links to Dashboard and Methodology mark the current page. Use links, not tabs, since each is its own page.
349
+ * **Run Header:** Shows the date, the short commit as a monospace link, the duration, and a link to the GitHub workflow.
350
+ * **Run and Scenario (Select):** Selects pick the nightly run and the scenario. Run IDs, such as `main-2026-10-19-296be2ab`, render in monospace.
351
+ * **Hero Metric (Surface):** Holds the settled TPS value and a caption that states its computation.
352
+ * **Metric Tiles (fit=small):** A fitted grid holds one surface per metric. An info button opens each metric's definition.
353
+ * **Sections (ChoiceGroup):** Switches the metric scope (Network, RPC node, or Validators) above a chart and a quantile table.
354
+
355
+ Patterns:
356
+
357
+ * [Dashboards](/docs/patterns/dashboards) for the hero metric, tile grid, filters, and sections.
358
+ * [Tables and Lists](/docs/patterns/tables-and-lists) for the quantile table.
359
+ * [Blockchain Values](/docs/patterns/blockchain-values) for commit hashes, gas units, and block counts.
360
+
361
+ ## Content
362
+
363
+ ### Lead With One Hero Metric
364
+
365
+ Settled TPS is the headline of the run. Give it a caption that states the aggregate and the sample, such as Median settled throughput across 142 measured blocks.
366
+
367
+ ### Define Every Metric
368
+
369
+ Give every tile and chart a one-sentence definition of the measurement and its aggregate. Start with the noun, as in Average wall-clock time between consecutive blocks.
370
+
371
+ Open definitions in a [Popover](/docs/components/popover) from an icon button. A [Tooltip](/docs/components/tooltip) stays closed on touch input, so a phone never shows the definition.
372
+
373
+ **Do:** Open a metric's definition in a `Popover`, with the metric name as its `Popover.Title`.
374
+
375
+ **Don't:** Put a definition in a `Tooltip`, which stays closed on touch screens.
376
+
377
+ ### Put the Unit With the Value
378
+
379
+ Write the full unit beside the number, such as 1.38 Ggas/s, and use one format per metric across tiles, legends, and tables.
380
+
381
+ **Do:** Label the tile Avg gas/s and show 1.38 Ggas/s.
382
+
383
+ **Don't:** Show 633ms in a tile and 219.1 ms in a legend for the same kind of value.
384
+
385
+ ### Say Submitted or Settled
386
+
387
+ * **Submitted TPS:** The input of the load generator.
388
+ * **Settled TPS:** The count of transactions included in blocks.
389
+
390
+ Name the kind in every label, legend, and caption.
391
+
392
+ ### Identify Runs Exactly
393
+
394
+ Show run IDs in full in the Nightly select, since two runs can share a date. In the run header, use the seven-character commit and link it to GitHub.
395
+
396
+ ### Name Quantiles the Same Way Everywhere
397
+
398
+ Write quantiles as p50, p95, and p99 everywhere. State whether a chart shows one quantile, as in Persistence (p50), or several.
399
+
400
+ ## Open Gaps
401
+
402
+ The library has no part for these needs yet. Before you add one, propose it as an issue in the Design System project.
403
+
404
+ * **Charts:** No time-series, stacked, or bar chart exists, and no axis, legend, or hover readout. Legends also toggle series with Show only this series.
405
+ * **Metric Tile:** A surface with a label, a definition button, and a value. All three Tempo products repeat it.
406
+ * **Monospace Display Type (mono.m1):** The only mono set, at 12px. Hero and tile values pair `fontFamily: 'mono'` with a size token.
407
+ * **Info Button:** Each screen composes the info button and popover for definitions again.
408
+
409
+ ## Related
410
+
411
+ [Dashboards](/docs/patterns/dashboards)
412
+
413
+ Covers metric layouts.
414
+
415
+ [Tables and Lists](/docs/patterns/tables-and-lists)
416
+
417
+ Covers quantile and timing tables.
418
+
419
+ [Surface](/docs/components/surface)
420
+
421
+ Use for tiles and sections.
422
+
423
+ [Grid](/docs/components/grid)
424
+
425
+ Use for the tile layout.
426
+
427
+ [Popover](/docs/components/popover)
428
+
429
+ Use for metric definitions.
430
+
431
+ [Select](/docs/components/select)
432
+
433
+ Use for run and scenario filters.
434
+
435
+ [ChoiceGroup](/docs/components/choice-group)
436
+
437
+ Use for the metric scope.