@genome-spy/app 0.74.0 → 0.76.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.
Files changed (66) hide show
  1. package/dist/AbortablePromiseCache-beUIcZcW.js +96 -0
  2. package/dist/agentApi-CzdacisO.js +25226 -0
  3. package/dist/agentApi.es.js +9460 -0
  4. package/dist/agentShared.es.js +4742 -0
  5. package/dist/{blosc-oa0DlI6G.js → blosc-BX4BJ8sR.js} +1 -1
  6. package/dist/componentStyles-CIXoKEp0.js +2182 -0
  7. package/dist/dialog.es.js +377 -0
  8. package/dist/{esm-n0auOe11.js → esm-BH0wx5y-.js} +1 -1
  9. package/dist/esm-BLfLaJtE.js +121 -0
  10. package/dist/{esm-D-WfYOx7.js → esm-BWsx1OJ2.js} +25 -25
  11. package/dist/{browser-Dvlo92rx.js → esm-BY4T8YoD.js} +38 -22
  12. package/dist/esm-CZvS2Ldm.js +155 -0
  13. package/dist/esm-CdIesJ1z.js +461 -0
  14. package/dist/{esm-DCCYNvaz.js → esm-Cr7pLUfG.js} +50 -50
  15. package/dist/esm-D-y0Ce1M.js +573 -0
  16. package/dist/esm-DHOMWRoL.js +1426 -0
  17. package/dist/{esm-Cmo4qEPr.js → esm-DJUb6vy0.js} +5 -5
  18. package/dist/esm-DPS6pYKF.js +1248 -0
  19. package/dist/esm-DRZ5LLNH.js +142 -0
  20. package/dist/esm-DjF6pKy5.js +369 -0
  21. package/dist/esm-PDPkTR1_.js +1015 -0
  22. package/dist/esm-s_SlArJ8.js +298 -0
  23. package/dist/index.es.js +7910 -28759
  24. package/dist/index.js +1135 -736
  25. package/dist/lit-ymUSmGBw.js +510 -0
  26. package/dist/{lz4-jZ0zyLBa.js → lz4-BSYl80V8.js} +1 -1
  27. package/dist/parquetRead-m8-8_SpH.js +1609 -0
  28. package/dist/schema.json +665 -97
  29. package/dist/style.css +1 -1
  30. package/dist/viewUtils-C5htqZCm.js +14147 -0
  31. package/dist/{zstd-C6ksIG9r.js → zstd-BAfRM3IH.js} +1 -1
  32. package/package.json +30 -5
  33. package/src/agentApi/index.d.ts +123 -0
  34. package/src/agentShared/index.d.ts +97 -0
  35. package/src/agentShared/types.d.ts +8 -0
  36. package/src/appTypes.d.ts +75 -0
  37. package/src/bookmark/databaseSchema.d.ts +33 -0
  38. package/src/charts/boxplotTypes.d.ts +15 -0
  39. package/src/charts/sampleAttributePlotTypes.d.ts +149 -0
  40. package/src/coreSpecAugmentation.d.ts +29 -0
  41. package/src/dialog/index.d.ts +5 -0
  42. package/src/embedTypes.d.ts +9 -0
  43. package/src/index.d.ts +16 -0
  44. package/src/sampleView/sampleViewTypes.d.ts +174 -0
  45. package/src/sampleView/state/payloadTypes.d.ts +400 -0
  46. package/src/sampleView/state/sampleState.d.ts +76 -0
  47. package/src/sampleView/types.d.ts +125 -0
  48. package/src/spec/appSpec.d.ts +54 -0
  49. package/src/spec/sampleView.d.ts +487 -0
  50. package/src/spec/view.d.ts +124 -0
  51. package/src/state/paramProvenanceTypes.d.ts +215 -0
  52. package/src/state/selectionExpansionTypes.d.ts +77 -0
  53. package/src/state.d.ts +97 -0
  54. package/src/types/lz-string.d.ts +24 -0
  55. package/src/types/vega-loader.d.ts +1 -0
  56. package/src/utils/colorScaleSummary.d.ts +15 -0
  57. package/src/utils/statistics/fieldSummary.d.ts +49 -0
  58. package/src/vite-env.d.ts +6 -0
  59. package/LICENSE +0 -21
  60. /package/dist/{AbortablePromiseCache-3gHJdF3E.js → AbortablePromiseCache-BDH1cqFl.js} +0 -0
  61. /package/dist/{chunk-INHXZS53-fPMmEwMt.js → chunk-INHXZS53-DwEV9sMh.js} +0 -0
  62. /package/dist/{esm-BygJiwh0.js → esm-BL9SNSnj.js} +0 -0
  63. /package/dist/{esm-B8-vSu-c.js → esm-BwW--bVV.js} +0 -0
  64. /package/dist/{esm-CGX-qz1d.js → esm-Bz_92nH0.js} +0 -0
  65. /package/dist/{esm-CuMSzCHy.js → esm-D2_c7lXY.js} +0 -0
  66. /package/dist/{parquetRead-CJe1UPsz.js → parquetRead-BuEN-6yG.js} +0 -0
@@ -0,0 +1,125 @@
1
+ import { ViewAttributeSpecifier } from "./sampleViewTypes.js";
2
+ import { SampleHierarchy } from "./state/sampleState.js";
3
+ import { ChromosomalLocus } from "@genome-spy/core/spec/genome.js";
4
+ import { Scale } from "@genome-spy/core/spec/scale.js";
5
+
6
+ /**
7
+ * Stable identifier for an abstract attribute used by actions and agent
8
+ * context.
9
+ *
10
+ * `type` identifies the attribute source kind, and `specifier` contains the
11
+ * concrete lookup information for that source.
12
+ *
13
+ * Examples:
14
+ * - `{ type: "SAMPLE_ATTRIBUTE", specifier: "age" }`
15
+ */
16
+ export type AttributeIdentifierType =
17
+ | "SAMPLE_ATTRIBUTE"
18
+ | "VALUE_AT_LOCUS"
19
+ | "SAMPLE_NAME"
20
+ | "VIEW_ATTRIBUTE";
21
+
22
+ export interface AttributeIdentifier {
23
+ type: AttributeIdentifierType;
24
+ specifier?: string | ViewAttributeSpecifier;
25
+ }
26
+
27
+ /**
28
+ * One endpoint of an interval.
29
+ */
30
+ export type IntervalPoint = number | ChromosomalLocus;
31
+
32
+ /**
33
+ * Interval expressed as two scalar or locus points.
34
+ */
35
+ export type Interval = [IntervalPoint, IntervalPoint];
36
+
37
+ /**
38
+ * Aggregation operators supported by interval-based attribute access.
39
+ */
40
+ export type AggregationOp =
41
+ | "itemCount"
42
+ | "min"
43
+ | "max"
44
+ | "weightedMean"
45
+ | "variance"
46
+ | "count";
47
+
48
+ /**
49
+ * Aggregation configuration for interval-derived attribute access.
50
+ */
51
+ export interface AggregationSpec {
52
+ op: AggregationOp;
53
+ }
54
+
55
+ /**
56
+ * Arguments passed to attribute value providers, including the current
57
+ * selection of sample ids and optional interval/aggregation context.
58
+ */
59
+ export interface AttributeValuesScope {
60
+ sampleIds: string[];
61
+ sampleHierarchy: SampleHierarchy;
62
+ interval?: Interval;
63
+ aggregation?: AggregationSpec;
64
+ }
65
+
66
+ /**
67
+ * Context passed to attribute availability hooks.
68
+ */
69
+ export interface AttributeEnsureContext {
70
+ signal?: AbortSignal;
71
+ }
72
+
73
+ export interface AttributeInfo {
74
+ /**
75
+ * A concise name of the attribute: TODO: Used for what?
76
+ * @deprecated Use attribute instead
77
+ */
78
+ name: string;
79
+
80
+ attribute: AttributeIdentifier;
81
+
82
+ /** More detailed name with optional formatting */
83
+ title: string | import("lit").TemplateResult;
84
+
85
+ /** Formatted attribute name for context menus (e.g., with selective emphasis). */
86
+ emphasizedName: string | import("lit").TemplateResult;
87
+
88
+ /**
89
+ * Optional description of the attribute. Can be used in UI and agent
90
+ * context to explain the meaning of the attribute.
91
+ */
92
+ description?: string;
93
+
94
+ /** Function that maps a sampleId to an attribute value */
95
+ accessor: (sampleId: string, sampleHierarchy: SampleHierarchy) => any;
96
+
97
+ /**
98
+ * Provides values for dialogs (e.g., histograms) with optional interval aggregation.
99
+ * Use `extractAttributeValues` for the default fallback implementation.
100
+ */
101
+ valuesProvider: (scope: AttributeValuesScope) => any[];
102
+
103
+ /** e.g., "quantitative" */
104
+ type: string;
105
+
106
+ /**
107
+ * Optional hook for ensuring attribute availability before access.
108
+ * Used by async intent processing to resolve lazy data dependencies.
109
+ */
110
+ ensureAvailability?: (context: AttributeEnsureContext) => Promise<void>;
111
+
112
+ /**
113
+ * Optional hook for awaiting post-dispatch readiness.
114
+ * Used by async intent processing to guarantee that state and data are ready.
115
+ */
116
+ awaitProcessed?: (context: AttributeEnsureContext) => Promise<void>;
117
+
118
+ scale?: any;
119
+
120
+ /**
121
+ * Authored scale definition for the source encoding, when available.
122
+ * Unlike `scale`, this does not include runtime-inferred defaults.
123
+ */
124
+ scaleSpec?: Scale;
125
+ }
@@ -0,0 +1,54 @@
1
+ import { RootConfig } from "@genome-spy/core/spec/root.js";
2
+ import { AppViewSpec } from "./view.js";
3
+
4
+ export interface RemoteBookmarkConfig {
5
+ /**
6
+ * URL to the remote bookmark file.
7
+ */
8
+ url: string;
9
+
10
+ /**
11
+ * Should the user be shown a tour of the remote bookmarks when the visualization
12
+ * is launched? If the `initialBookmark` property is not defined, the tour starts
13
+ * from the first bookmark.
14
+ *
15
+ * __Default value:__ `false`
16
+ */
17
+ tour?: boolean;
18
+
19
+ /**
20
+ * Name of the bookmark that should be loaded as the initial state. The bookmark
21
+ * description dialog is shown only if the `tour` property is set to `true`.
22
+ */
23
+ initialBookmark?: string;
24
+
25
+ /**
26
+ * Name of the bookmark that should be loaded when the user ends the tour.
27
+ * If `null`, the dialog will be closed and the current state is retained.
28
+ * If undefined, the default state without any performed actions will be loaded.
29
+ */
30
+ afterTourBookmark?: string;
31
+ }
32
+
33
+ export interface BookmarkConfig {
34
+ /**
35
+ * Configuration for loading bookmarks from a remote JSON file.
36
+ */
37
+ remote?: RemoteBookmarkConfig;
38
+ }
39
+
40
+ interface AppRootConfig {
41
+ /**
42
+ * A unique identifier that is used in storing state bookmarks to browser's
43
+ * IndexedDB. This is needed to make distinction between visualizations that
44
+ * are served from the same origin, i.e., the same host and port.
45
+ */
46
+ specId?: string;
47
+
48
+ /**
49
+ * Bookmark configuration.
50
+ */
51
+ bookmarks?: BookmarkConfig;
52
+ }
53
+
54
+ export type AppRootSpec = AppViewSpec & RootConfig & AppRootConfig;
@@ -0,0 +1,487 @@
1
+ import { Data, InlineData, UrlData } from "@genome-spy/core/spec/data.js";
2
+ import { Align, FontStyle, FontWeight } from "@genome-spy/core/spec/font.js";
3
+ import { Scale } from "@genome-spy/core/spec/scale.js";
4
+ import { ViewSpecBase, ViewBackground } from "@genome-spy/core/spec/view.js";
5
+ import {
6
+ AppConfigurableVisibilitySpec,
7
+ AppLayerSpec,
8
+ AppNestedViewSpec,
9
+ AppUnitSpec,
10
+ } from "./view.js";
11
+
12
+ /**
13
+ * A view specification for a SampleView.
14
+ */
15
+ export interface SampleSpec extends Omit<ViewSpecBase, "templates"> {
16
+ /**
17
+ * Is the SampleView visibility configurable from the GenomeSpy App toolbar.
18
+ *
19
+ * __Default value:__ `true`
20
+ */
21
+ configurableVisibility?: AppConfigurableVisibilitySpec["configurableVisibility"];
22
+
23
+ /**
24
+ * Sample identity and label configuration.
25
+ *
26
+ * If `identity` is omitted, sample identifiers are inferred from the data.
27
+ */
28
+ samples: SampleDef;
29
+
30
+ /**
31
+ * Metadata sources and metadata matrix layout.
32
+ */
33
+ metadata?: MetadataDef;
34
+
35
+ /**
36
+ * An object defining the view background and outline. The background is
37
+ * repeated for each group.
38
+ */
39
+ view?: ViewBackground;
40
+
41
+ /**
42
+ * The view specification to be repeated for each sample.
43
+ */
44
+ spec: AppLayerSpec | AppUnitSpec;
45
+
46
+ // Templates inside a SampleSpec may only produce non-sample descendants.
47
+ // This keeps SampleView as a top-level/sibling concept instead of nestable.
48
+ templates?: Record<string, AppNestedViewSpec>;
49
+
50
+ /**
51
+ * Keep summary tracks visible while scrolling samples.
52
+ *
53
+ * __Default value:__ `true`
54
+ */
55
+ stickySummaries?: boolean;
56
+ }
57
+
58
+ export type SampleAttributeType = "nominal" | "ordinal" | "quantitative";
59
+
60
+ export type SampleAttributeSemanticType =
61
+ | "subjectId"
62
+ | "modelSystemId"
63
+ | "timeToEvent"
64
+ | "eventStatus"
65
+ | "category";
66
+
67
+ export interface SampleAttributeDef {
68
+ /**
69
+ * User-facing description of the metadata attribute.
70
+ */
71
+ description?: string;
72
+
73
+ /**
74
+ * The attribute type. One of `"nominal"`, `"ordinal"`, or `"quantitative"`.
75
+ */
76
+ type?: SampleAttributeType;
77
+
78
+ /**
79
+ * Domain-specific meaning of the metadata attribute.
80
+ */
81
+ semanticType?: SampleAttributeSemanticType;
82
+
83
+ /**
84
+ * Color scale for metadata cells.
85
+ */
86
+ scale?: Scale;
87
+
88
+ /**
89
+ * Scale for mapping quantitative values to metadata cell width.
90
+ */
91
+ barScale?: Scale;
92
+
93
+ /**
94
+ * Width of the column in pixels.
95
+ */
96
+ width?: number;
97
+
98
+ /**
99
+ * Whether the attribute is visible when the view opens.
100
+ */
101
+ visible?: boolean;
102
+
103
+ /**
104
+ * Attribute label shown in the metadata header.
105
+ *
106
+ * If omitted, the attribute name is used.
107
+ */
108
+ title?: string;
109
+ }
110
+
111
+ export interface SampleIdentityDef {
112
+ /**
113
+ * Data source that defines the sample set for the view.
114
+ *
115
+ * The source must contain one row per sample. Metadata imports are matched
116
+ * against these sample ids.
117
+ */
118
+ data: Data;
119
+
120
+ /**
121
+ * Field that contains the canonical sample id.
122
+ *
123
+ * __Default value:__ `"sample"`
124
+ */
125
+ idField?: string;
126
+
127
+ /**
128
+ * Field containing a user-visible sample label.
129
+ *
130
+ * If omitted, sample ids are used.
131
+ */
132
+ displayNameField?: string;
133
+ }
134
+
135
+ export interface ColumnIdentifierField {
136
+ /**
137
+ * Name of the identifier field shown in UI and diagnostics.
138
+ *
139
+ * Example values: `"symbol"`, `"ensembl"`, `"entrez"`.
140
+ */
141
+ name: string;
142
+
143
+ /**
144
+ * Backend path to identifier values aligned to matrix columns.
145
+ *
146
+ * The array length must equal the number of columns in the matrix.
147
+ */
148
+ path: string;
149
+
150
+ /**
151
+ * Marks this identifier as the primary, canonical identifier.
152
+ */
153
+ primary?: boolean;
154
+
155
+ /**
156
+ * Enables case-insensitive matching for this identifier field.
157
+ */
158
+ caseInsensitive?: boolean;
159
+
160
+ /**
161
+ * Remove version suffixes during matching (for example, ENSG...`.12`).
162
+ *
163
+ * Useful for identifiers such as Ensembl ids that may contain version
164
+ * suffixes in some datasets but not in user queries.
165
+ */
166
+ stripVersionSuffix?: boolean;
167
+ }
168
+
169
+ export interface DataBackendDef {
170
+ backend: "data";
171
+
172
+ /**
173
+ * Eager tabular metadata source.
174
+ *
175
+ * Supports `UrlData` and `InlineData`.
176
+ */
177
+ data: UrlData | InlineData;
178
+
179
+ /**
180
+ * Field name in the table that matches sample ids in the view.
181
+ *
182
+ * __Default value:__ `"sample"`
183
+ */
184
+ sampleIdField?: string;
185
+ }
186
+
187
+ export interface ZarrMatrixLayoutDef {
188
+ /**
189
+ * Path to matrix values, arranged as sample rows by metadata columns.
190
+ *
191
+ * __Default value:__ `"X"`
192
+ */
193
+ valuesPath?: string;
194
+
195
+ /**
196
+ * Path to matrix row identifiers (sample ids).
197
+ *
198
+ * __Default value:__ `"obs_names"`
199
+ */
200
+ rowIdsPath?: string;
201
+
202
+ /**
203
+ * Path to matrix column identifiers.
204
+ *
205
+ * __Default value:__ `"var_names"`
206
+ */
207
+ columnIdsPath?: string;
208
+ }
209
+
210
+ export interface ZarrBackendDef {
211
+ backend: "zarr";
212
+
213
+ /**
214
+ * URL to the root of the Zarr store.
215
+ */
216
+ url: string;
217
+
218
+ /**
219
+ * Path overrides for the matrix layout.
220
+ */
221
+ matrix?: ZarrMatrixLayoutDef;
222
+
223
+ /**
224
+ * Identifier arrays used to resolve user queries to columns.
225
+ *
226
+ * If omitted, only primary column ids are used for lookup.
227
+ */
228
+ identifiers?: ColumnIdentifierField[];
229
+ }
230
+
231
+ export interface ParquetBackendDef {
232
+ backend: "parquet";
233
+
234
+ /**
235
+ * URL to a Parquet metadata source.
236
+ *
237
+ * Reserved for future use.
238
+ */
239
+ url: string;
240
+
241
+ /**
242
+ * Field containing sample ids.
243
+ */
244
+ sampleIdField: string;
245
+ }
246
+
247
+ export interface ArrowBackendDef {
248
+ backend: "arrow";
249
+
250
+ /**
251
+ * URL to an Arrow metadata source.
252
+ *
253
+ * Reserved for future use.
254
+ */
255
+ url: string;
256
+
257
+ /**
258
+ * Field containing sample ids.
259
+ */
260
+ sampleIdField: string;
261
+ }
262
+
263
+ export type MetadataBackendDef =
264
+ | DataBackendDef
265
+ | ZarrBackendDef
266
+ | ParquetBackendDef
267
+ | ArrowBackendDef;
268
+
269
+ export interface MetadataSourceDef {
270
+ /**
271
+ * Stable source identifier.
272
+ *
273
+ * Should remain stable across spec revisions if bookmarks/provenance replay
274
+ * must keep working.
275
+ */
276
+ id?: string;
277
+
278
+ /**
279
+ * User-facing label shown in menus and dialogs.
280
+ *
281
+ * If omitted, UI falls back to `id`.
282
+ */
283
+ name?: string;
284
+
285
+ /**
286
+ * User-facing description of what this source contains.
287
+ *
288
+ * Can be shown in UI and can help automated agents choose the correct
289
+ * source.
290
+ */
291
+ description?: string;
292
+
293
+ /**
294
+ * Startup loading behavior.
295
+ *
296
+ * - `false`: do not load at startup
297
+ * - `"*"`: load all columns allowed by this source
298
+ * - `string[]`: resolve and load only the listed columns
299
+ *
300
+ * If omitted, data backends load all columns and other backends do not
301
+ * load columns at startup.
302
+ */
303
+ initialLoad?: false | "*" | string[];
304
+
305
+ /**
306
+ * Column ids that must never be imported from this source.
307
+ *
308
+ * The data backend always excludes its `sampleIdField` automatically, so
309
+ * this property is only needed for other helper columns such as display
310
+ * labels.
311
+ */
312
+ excludeColumns?: string[];
313
+
314
+ /**
315
+ * Default destination group path for imported attributes.
316
+ *
317
+ * Imported column names are placed under this path, which effectively
318
+ * creates (or reuses) a metadata hierarchy node.
319
+ *
320
+ * This value is parsed as a path using `attributeGroupSeparator` when that
321
+ * separator is defined for the source. Without an explicit separator, the
322
+ * whole value is treated as one group name (including any `/` characters).
323
+ *
324
+ * Users can override this per import in the dialog.
325
+ */
326
+ groupPath?: string;
327
+
328
+ /**
329
+ * Separator used by source-side attribute names to express hierarchy.
330
+ *
331
+ * Example: if separator is `"."`, column `clinical.OS` is interpreted as
332
+ * group `clinical` and attribute `OS`.
333
+ */
334
+ attributeGroupSeparator?: string;
335
+
336
+ /**
337
+ * Attribute definitions keyed by attribute/column id (and optionally by group path).
338
+ *
339
+ * Special key `""` defines source-level defaults for all imported columns.
340
+ * Path splitting is applied only when `attributeGroupSeparator` is defined.
341
+ */
342
+ attributes?: Record<string, SampleAttributeDef>;
343
+
344
+ /**
345
+ * Source backend configuration.
346
+ */
347
+ backend: MetadataBackendDef;
348
+ }
349
+
350
+ export interface MetadataSourceImportDef {
351
+ /**
352
+ * URL to a standalone metadata source definition file.
353
+ *
354
+ * Imports are shallow: imported files must define exactly one source and
355
+ * cannot contain nested `import` entries.
356
+ */
357
+ url: string;
358
+ }
359
+
360
+ export type MetadataSourceEntry =
361
+ | MetadataSourceDef
362
+ | { import: MetadataSourceImportDef };
363
+
364
+ export interface MetadataDef {
365
+ /**
366
+ * Metadata source definitions used for startup and on-demand imports.
367
+ *
368
+ * Source order is significant for startup loading: eager startup imports
369
+ * are applied in declaration order.
370
+ */
371
+ sources?: MetadataSourceEntry[];
372
+
373
+ /**
374
+ * Default width of metadata columns in pixels.
375
+ *
376
+ * __Default value:__ `10`
377
+ */
378
+ attributeWidth?: number;
379
+
380
+ /**
381
+ * Spacing between metadata columns in pixels.
382
+ *
383
+ * __Default value:__ `1`
384
+ */
385
+ spacing?: number;
386
+
387
+ /**
388
+ * Font typeface for metadata attribute labels.
389
+ *
390
+ * __Default value:__ `"Lato"`
391
+ */
392
+ labelFont?: string;
393
+
394
+ /**
395
+ * Font style for metadata attribute labels.
396
+ *
397
+ * __Default value:__ `"normal"`
398
+ */
399
+ labelFontStyle?: FontStyle;
400
+
401
+ /**
402
+ * Font weight for metadata attribute labels.
403
+ *
404
+ * __Default value:__ `"regular"`
405
+ */
406
+ labelFontWeight?: FontWeight;
407
+
408
+ /**
409
+ * Font size for metadata attribute labels in pixels.
410
+ *
411
+ * __Default value:__ `11`
412
+ */
413
+ labelFontSize?: number;
414
+
415
+ /**
416
+ * Angle of metadata attribute labels in degrees.
417
+ *
418
+ * __Default value:__ `-90`
419
+ */
420
+ labelAngle?: number;
421
+ }
422
+
423
+ export interface SampleDef {
424
+ /**
425
+ * Defines the sample ids and optional display names for the sample view.
426
+ *
427
+ * If omitted, sample ids are inferred from the `sample` channel in the view
428
+ * data.
429
+ */
430
+ identity?: SampleIdentityDef;
431
+
432
+ /**
433
+ * Title shown above sample labels.
434
+ * If omitted, the title defaults to `"Sample"`.
435
+ * Set to `null` to hide the title.
436
+ */
437
+ labelTitle?: string | null;
438
+
439
+ /**
440
+ * Width reserved for sample labels in pixels.
441
+ *
442
+ * If omitted, the width is inferred from the sample labels.
443
+ */
444
+ labelLength?: number;
445
+
446
+ /**
447
+ * The font typeface. GenomeSpy uses [SDF](https://github.com/Chlumsky/msdfgen)
448
+ * versions of [Google Fonts](https://fonts.google.com/). Check their
449
+ * availability at the [A-Frame
450
+ * Fonts](https://github.com/etiennepinchon/aframe-fonts/tree/master/fonts)
451
+ * repository. System fonts are **not** supported.
452
+ *
453
+ * **Default value:** `"Lato"`
454
+ */
455
+ labelFont?: string;
456
+
457
+ /**
458
+ * The font style. Valid values: `"normal"` and `"italic"`.
459
+ *
460
+ * **Default value:** `"normal"`
461
+ */
462
+ labelFontStyle?: FontStyle;
463
+
464
+ /**
465
+ * The font weight. The following strings and numbers are valid values:
466
+ * `"thin"` (`100`), `"light"` (`300`), `"regular"` (`400`),
467
+ * `"normal"` (`400`), `"medium"` (`500`), `"bold"` (`700`),
468
+ * `"black"` (`900`)
469
+ *
470
+ * **Default value:** `"regular"`
471
+ */
472
+ labelFontWeight?: FontWeight;
473
+
474
+ /**
475
+ * The font size in pixels.
476
+ *
477
+ * **Default value:** `11`
478
+ */
479
+ labelFontSize?: number;
480
+
481
+ /**
482
+ * The horizontal alignment of the text. One of `"left"`, `"center"`, or `"right"`.
483
+ *
484
+ * **Default value:** `"left"`
485
+ */
486
+ labelAlign?: Align;
487
+ }