@jbrowse/core 5.0.0-beta.4 → 5.0.0-beta.8

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 (110) hide show
  1. package/README.md +278 -250
  2. package/esm/PluginManager.js +1 -1
  3. package/esm/ReExports/publicUi.d.ts +1 -1
  4. package/esm/ReExports/publicUi.js +1 -1
  5. package/esm/ReExports/publicUtil.d.ts +1 -1
  6. package/esm/ReExports/publicUtil.js +1 -1
  7. package/esm/ReExports/workerNamespaceNames.js +3 -9
  8. package/esm/assemblyManager/assemblyConfigSchema.d.ts +2 -1
  9. package/esm/assemblyManager/assemblyConfigSchema.js +2 -1
  10. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +15 -15
  11. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +34 -18
  12. package/esm/configuration/configurationSchema.d.ts +1 -2
  13. package/esm/configuration/configurationSchema.js +3 -8
  14. package/esm/configuration/configurationSlot.d.ts +0 -47
  15. package/esm/configuration/configurationSlot.js +4 -54
  16. package/esm/configuration/fillLocations.d.ts +14 -0
  17. package/esm/configuration/fillLocations.js +14 -0
  18. package/esm/configuration/fullConfSnapshot.d.ts +0 -15
  19. package/esm/configuration/fullConfSnapshot.js +0 -28
  20. package/esm/configuration/getConf.d.ts +4 -34
  21. package/esm/configuration/getConf.js +3 -38
  22. package/esm/configuration/index.d.ts +3 -4
  23. package/esm/configuration/index.js +3 -2
  24. package/esm/configuration/schemaRegistry.d.ts +1 -2
  25. package/esm/configuration/schemaRegistry.js +1 -2
  26. package/esm/configuration/slotFacade.d.ts +1 -16
  27. package/esm/configuration/slotFacade.js +1 -2
  28. package/esm/configuration/tabixShorthand.js +3 -3
  29. package/esm/configuration/types.d.ts +4 -16
  30. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -4
  31. package/esm/pluggableElementTypes/DisplayType.d.ts +5 -3
  32. package/esm/pluggableElementTypes/DisplayType.js +3 -1
  33. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +30 -0
  34. package/esm/pluggableElementTypes/models/BaseTrackModel.js +45 -17
  35. package/esm/rpc/RpcRegistry.d.ts +7 -1
  36. package/esm/rpc/coreRpcMethods.d.ts +1 -0
  37. package/esm/rpc/coreRpcMethods.js +1 -0
  38. package/esm/rpc/methods/CoreEncodeFeatures.d.ts +15 -0
  39. package/esm/rpc/methods/CoreEncodeFeatures.js +62 -0
  40. package/esm/svg/svgId.d.ts +1 -1
  41. package/esm/svg/svgId.js +1 -1
  42. package/esm/ui/LegendSwatchGlyph.js +26 -21
  43. package/esm/ui/MenuTypes.d.ts +5 -52
  44. package/esm/ui/SizeSliderRow.d.ts +1 -3
  45. package/esm/ui/SizeSliderRow.js +4 -6
  46. package/esm/ui/SvgColorLegend.d.ts +9 -3
  47. package/esm/ui/SvgColorLegend.js +74 -33
  48. package/esm/ui/colorScale.d.ts +64 -0
  49. package/esm/ui/colorScale.js +41 -0
  50. package/esm/ui/colors.d.ts +11 -0
  51. package/esm/ui/colors.js +7 -0
  52. package/esm/ui/index.d.ts +5 -7
  53. package/esm/ui/index.js +3 -13
  54. package/esm/ui/legendMenuItem.d.ts +5 -16
  55. package/esm/ui/legendMenuItem.js +3 -14
  56. package/esm/ui/legendSpec.d.ts +11 -5
  57. package/esm/ui/legendSpec.js +8 -11
  58. package/esm/ui/makeSizeMenu.d.ts +0 -6
  59. package/esm/ui/makeSizeMenu.js +6 -30
  60. package/esm/ui/measureLegendText.js +1 -1
  61. package/esm/ui/menuItemAdornment.d.ts +9 -19
  62. package/esm/ui/menuItemAdornment.js +10 -31
  63. package/esm/ui/menuItems.d.ts +2 -6
  64. package/esm/ui/menuItems.js +0 -4
  65. package/esm/ui/palette.js +2 -1
  66. package/esm/ui/toggleMenuItems.d.ts +6 -13
  67. package/esm/ui/toggleMenuItems.js +13 -29
  68. package/esm/util/colorRamp.d.ts +3 -3
  69. package/esm/util/colorRamp.js +2 -2
  70. package/esm/util/featureTransforms.d.ts +15 -0
  71. package/esm/util/featureTransforms.js +342 -0
  72. package/esm/util/freezeDeep.d.ts +8 -10
  73. package/esm/util/freezeDeep.js +8 -10
  74. package/esm/util/glyphNames.d.ts +8 -0
  75. package/esm/util/glyphNames.js +12 -0
  76. package/esm/util/index.d.ts +0 -1
  77. package/esm/util/index.js +0 -1
  78. package/esm/util/markEncoding.d.ts +76 -0
  79. package/esm/util/markEncoding.js +436 -0
  80. package/esm/util/markEncodingTypes.d.ts +331 -0
  81. package/esm/util/markEncodingTypes.js +8 -0
  82. package/esm/util/renderToStaticMarkup.js +1 -1
  83. package/esm/util/starFusion.d.ts +26 -0
  84. package/esm/util/starFusion.js +37 -0
  85. package/esm/util/trackConfigDelta.d.ts +4 -8
  86. package/esm/util/trackConfigDelta.js +2 -4
  87. package/esm/util/tracks.d.ts +7 -1
  88. package/esm/util/tracks.js +72 -7
  89. package/esm/util/types/index.d.ts +12 -4
  90. package/esm/util/whenViewSettled.d.ts +9 -0
  91. package/esm/util/whenViewSettled.js +12 -4
  92. package/package.json +13 -3
  93. package/esm/configuration/promotableDefaults.d.ts +0 -234
  94. package/esm/configuration/promotableDefaults.js +0 -395
  95. package/esm/configuration/promotablePin.d.ts +0 -65
  96. package/esm/configuration/promotablePin.js +0 -1
  97. package/esm/configuration/promotableResolve.d.ts +0 -108
  98. package/esm/configuration/promotableResolve.js +0 -117
  99. package/esm/configuration/promotableSlots.d.ts +0 -12
  100. package/esm/configuration/promotableSlots.js +0 -45
  101. package/esm/configuration/slotShape.d.ts +0 -12
  102. package/esm/configuration/slotShape.js +0 -84
  103. package/esm/ui/PinAdornment.d.ts +0 -5
  104. package/esm/ui/PinAdornment.js +0 -67
  105. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  106. package/esm/ui/SvgGradientLegend.js +0 -26
  107. package/esm/ui/promotablePinCoverage.d.ts +0 -58
  108. package/esm/ui/promotablePinCoverage.js +0 -124
  109. package/esm/util/openDisplays.d.ts +0 -23
  110. package/esm/util/openDisplays.js +0 -79
package/README.md CHANGED
@@ -25,6 +25,22 @@ Apache-2.0 © Evolutionary Software Foundation
25
25
 
26
26
  Auto-generated from `#api` JSDoc tags in this package. Do not edit by hand.
27
27
 
28
+ ### AggregateOp
29
+
30
+ One summary over a group: `count` needs no field; `sum`, `mean`, `min` and `max`
31
+ read one, skipping values that are not numbers. The output field is `as`, else
32
+ `count` or `<op>_<field>`.
33
+
34
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
35
+
36
+ ### AggregateStep
37
+
38
+ One feature per distinct `groupby` value set (one for the whole region with
39
+ none), spanning its members' extent, carrying the group's fields and every `ops`
40
+ entry.
41
+
42
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
43
+
28
44
  ### Band
29
45
 
30
46
  One band of a display's vertical stack — a coverage histogram, an arc strip, a
@@ -37,6 +53,15 @@ historically drifted.
37
53
 
38
54
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/bandLayout.ts)
39
55
 
56
+ ### BinStep
57
+
58
+ Snap every feature to the genome-aligned bin of `step` bp its `field` (`start`
59
+ by default) falls in, writing the bin's edges over the fields `as` names —
60
+ `start` and `end` by default, so an `aggregate` grouped by those counts per bin
61
+ and the bar spans the bin.
62
+
63
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
64
+
40
65
  ### boundBandHeight
41
66
 
42
67
  Bound a band height to its legal range — a config value, a menu choice, or a
@@ -113,6 +138,26 @@ refName at all before this is the right question to ask of it.
113
138
 
114
139
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/mstUtils.ts)
115
140
 
141
+ ### CategoricalRef
142
+
143
+ A field bound to a categorical scale: each distinct value takes one entry of the
144
+ channel's range — a palette entry for `color`, a glyph name for `glyph`. With a
145
+ `domain`, the listed values take the range in that order and whatever else the
146
+ region meets follows, sorted; without one each value derives its entry from
147
+ itself (an integer takes the slot it names, anything else hashes in), so every
148
+ region agrees on a value it shares with another at the cost of an occasional
149
+ collision, and `domain` is the way to spend the range deliberately.
150
+
151
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
152
+
153
+ ### ChannelReader
154
+
155
+ A channel read per feature: the compiled form of a FieldRef, and what a
156
+ display's own worker method hands the encoder for a channel no field name can
157
+ say — a join against a second adapter, a lookup table, a rule over two fields.
158
+
159
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncoding.ts)
160
+
116
161
  ### clampBandHeight
117
162
 
118
163
  Clamp one _resize_ of a drag-resizable band: boundBandHeight, plus the one rule
@@ -140,27 +185,136 @@ lands before React re-renders.
140
185
 
141
186
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/bandHeight.ts)
142
187
 
143
- ### clearPromotedDefaults
188
+ ### ColorEncoding
189
+
190
+ How a mark's `color` channel resolves. A CSS colour or a `jexl:` expression
191
+ returning one paints per feature with no scale; the two object forms bind a
192
+ field to a scale, which is what a legend can describe. A continuous scale reads
193
+ the field through `domain` (the region's own extremes when absent) into `ramp`,
194
+ and there a listed `domain` is what pins the answer across a whole view.
195
+
196
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
197
+
198
+ ### colorEvaluator
199
+
200
+ A CSS colour or `jexl:` colour expression as a per-feature packed ABGR — the
201
+ unscaled arm of ColorEncoding, on its own for a display that carries a plain
202
+ `color` slot.
203
+
204
+ ```js
205
+ // type signature
206
+ (color: string, jexl: JexlInstance | undefined) => (feature: Feature) => number
207
+ ```
208
+
209
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncoding.ts)
210
+
211
+ ### ColorScaleTable
212
+
213
+ The scale a colour channel was resolved through, as the legend reads it — the
214
+ same table the colours in the payload came from, so the key cannot disagree with
215
+ the painting.
216
+
217
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
218
+
219
+ ### CoverageStep
220
+
221
+ Replace the features with runs of constant depth: how many of them overlap each
222
+ stretch of the region, in a field `as` (`coverage` by default), with the
223
+ stretches nothing overlaps left out.
224
+
225
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
226
+
227
+ ### EncodeContext
228
+
229
+ What surrounds an encode: the jexl instance a `jexl:` channel compiles against —
230
+ a caller whose channels are all readers or field names passes none — and a
231
+ progress reporter.
232
+
233
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncoding.ts)
234
+
235
+ ### Encoded
144
236
 
145
- Clear the named promoted defaults for this display type, so every track
146
- following one reverts to its own config value. Backs the badge's "clear session
147
- default" action, which passes the slots it actually listed
148
- (`getDisplayTypeDefaultChanges`).
237
+ EncodedChannels with the lanes in `L` present — what `encodeFeatures` answers a
238
+ caller that named them.
149
239
 
150
- **`slots` is required, and an all-slots default is not the convenience it looks
151
- like.** It reaches further than any list a dialog can have shown: a promoted
152
- default the track _customized_ over is `inherited: false` and so appears in no
153
- row, yet still governs sibling tracks — so clearing it from a dialog that never
154
- showed it moves tracks other than the one whose badge was clicked. Clearing
155
- every promoted default at once is a preferences-scope action, and Preferences →
156
- "Reset to defaults" is where it lives (`clearPreferenceOverrides`).
240
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
241
+
242
+ ### EncodedChannels
243
+
244
+ One encoding's channels over one region's features, dense and index-aligned:
245
+ instance `i` of every array is the same feature, and `featureIndex[i]` says
246
+ which one of the input list it was. A lane is present when the caller asked for
247
+ it (LaneName); Encoded is this type with a known lane set required.
248
+
249
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
250
+
251
+ ### encodedChannelTransferables
252
+
253
+ The buffers an EncodedChannels owns, for `rpcResult`'s transfer list.
157
254
 
158
255
  ```js
159
256
  // type signature
160
- (self: ResolvableDisplay, slots: Iterable<string>) => void
257
+ (c: EncodedChannels) => ArrayBufferLike[]
161
258
  ```
162
259
 
163
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotableDefaults.ts)
260
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncoding.ts)
261
+
262
+ ### EncodedFeaturesResult
263
+
264
+ What `CoreEncodeFeatures` answers for one region: `layers[i]` is the request's
265
+ `layers[i]` over the region's features, so a display's mark list indexes
266
+ straight into it.
267
+
268
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
269
+
270
+ ### encodeFeatures
271
+
272
+ Evaluate one encoding over a feature list into dense channel arrays for the
273
+ lanes named, the scale table each scaled channel came from, the `y` extremes and
274
+ — when `index` is among the lanes — a hit index.
275
+
276
+ A feature whose `x`, `x2` or (declared and asked-for) `y` is not finite is
277
+ skipped and counted in `skipped`, so every array stays index-aligned with the
278
+ Flatbush. Pure: the RPC around it owns the adapter, the filters and the
279
+ transferables.
280
+
281
+ ```js
282
+ // type signature
283
+ <L extends LaneName>(features: readonly Feature[], encoding: MarkEncodingInput, lanes: readonly L[], ctx?: EncodeContext) => Encoded<L>
284
+ ```
285
+
286
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncoding.ts)
287
+
288
+ ### FieldRef
289
+
290
+ Where a channel's value comes from: a feature field name, read natively
291
+ (`feature.get(name)`), or a `jexl:` expression over `feature` — the opt-in
292
+ escape, three orders of magnitude slower per feature.
293
+
294
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
295
+
296
+ ### FilterStep
297
+
298
+ Keep the features a `jexl:` expression over `feature` admits.
299
+
300
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
301
+
302
+ ### FlattenStep
303
+
304
+ Fan each feature out into one feature per element of an array-valued field —
305
+ `subfeatures`, so a gene answers its transcripts and a transcript its exons.
306
+ Each answer reads the element's own fields first and the feature it came from
307
+ for everything else, so an exon still knows its gene's name and strand. A
308
+ feature whose field holds no array drops out unless `keepEmpty` says otherwise.
309
+
310
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
311
+
312
+ ### FormulaStep
313
+
314
+ Write a `jexl:` expression's value over `feature` into the field `as` of every
315
+ feature.
316
+
317
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
164
318
 
165
319
  ### getAssemblyHost
166
320
 
@@ -191,12 +345,6 @@ check, so reaching for the other one does not get a typo past tsc. It does not
191
345
  consult the session and has no per-slot behavior; what you read is what the
192
346
  track stores.
193
347
 
194
- A `promotable` slot read this way therefore yields the raw stored value,
195
- `undefined` included — that `undefined` is the cascade's inherit sentinel, and
196
- `resolveConf` is what turns it into a real value. The read type keeps the
197
- `undefined` on purpose, so reaching for the wrong reader is a compile error
198
- rather than a silent one.
199
-
200
348
  ```js
201
349
  // type signature
202
350
  { (model: {…}): ModelSnapshotType<…>; <…>(model: {…}, slotPath: SLOT, args?: Record<…> | undefined): SLOT extends string ? ConfigurationSlotValue<…> : any; }
@@ -204,30 +352,6 @@ rather than a silent one.
204
352
 
205
353
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/getConf.ts)
206
354
 
207
- ### getConfigSnapshotWithPromotables
208
-
209
- The display's full config snapshot with every `promotable` slot overwritten by
210
- its resolved value in place. For building a worker payload: a promotable slot
211
- serializes as its raw inherit sentinel (`undefined`, since they're all `maybe*`
212
- types), which the worker can't interpret — it has no session to resolve against.
213
- This hands it concrete values instead, with no per-slot bookkeeping, so adding a
214
- promotable worker-consumed slot needs no rpcProps change and can't silently ship
215
- a sentinel. Main-thread only (the cascade consults the session). Display-only
216
- promotable slots the worker never reads (e.g. displayMode) are still excluded by
217
- the caller — resolving them here is a harmless no-op since they're dropped
218
- anyway.
219
-
220
- The return type is branded (`ResolvedConfigSnapshot`) so a payload builder can
221
- demand a snapshot that has been through here. The assertion below is the one
222
- place the brand is applied, and it sits on the line after the resolve.
223
-
224
- ```js
225
- // type signature
226
- (self: ResolvableDisplay) => ResolvedConfigSnapshot
227
- ```
228
-
229
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotableDefaults.ts)
230
-
231
355
  ### getContainingDisplay
232
356
 
233
357
  Returns the display model that contains the given node. Throws if the node has
@@ -275,19 +399,6 @@ Where a display puts a dialog it cannot mount itself.
275
399
 
276
400
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/sessionServices.ts)
277
401
 
278
- ### getDisplayTypeDefaultChanges
279
-
280
- Effective differences a track following the default inherits from session-wide
281
- defaults, one per promotable slot whose inherited value differs from its schema
282
- default. Drives the track-selector "affected by a session default" badge.
283
-
284
- ```js
285
- // type signature
286
- (self: ResolvableDisplay) => TrackConfigChange[]
287
- ```
288
-
289
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotableDefaults.ts)
290
-
291
402
  ### getEnv
292
403
 
293
404
  Returns the MST environment for a node, which carries the `pluginManager`.
@@ -369,16 +480,31 @@ module actually uses.
369
480
 
370
481
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/sessionServices.ts)
371
482
 
372
- ### getTrackConfigWithPromotables
483
+ ### GLYPH_CODES
373
484
 
374
- See TrackConfigWithPromotables.
485
+ The `point` shape's glyph code for each name an encoding can say.
375
486
 
376
487
  ```js
377
488
  // type signature
378
- (session: PromotedDefaultStore, trackConfig: ModelInstanceTypeProps<…> & {…} & IStateTreeNode<…>) => TrackConfigWithPromotables
489
+ Record<GlyphName, number>
379
490
  ```
380
491
 
381
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotableDefaults.ts)
492
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/glyphNames.ts)
493
+
494
+ ### GlyphEncoding
495
+
496
+ A GlyphName, a `jexl:` expression over `feature` returning one, or a field bound
497
+ to a categorical scale whose `range` lists the glyph names handed out — the
498
+ three glyphs, in order, when absent.
499
+
500
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
501
+
502
+ ### GlyphScaleTable
503
+
504
+ The scale a glyph channel was resolved through: which glyph each value of the
505
+ field took.
506
+
507
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
382
508
 
383
509
  ### hydrateTrackConfig
384
510
 
@@ -387,7 +513,7 @@ to find the schema. `session.tracks` holds `types.frozen` plain objects until
387
513
  something references a track (ADR-031), so a caller handed one of those has a
388
514
  config that reads nothing but what was literally authored: a slot at its schema
389
515
  default is absent, `preProcessSnapshot` has not run, and nothing that walks a
390
- live node — the promotable cascade above all — applies to it.
516
+ live node applies to it.
391
517
 
392
518
  For the callers that need the resolved answer rather than the authored one and
393
519
  cannot know which of the two they were handed. The About dialog's "Copy config"
@@ -414,25 +540,15 @@ needs; `CopyConfigEntryPoints.test.ts` pins both halves.
414
540
 
415
541
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/configurationSchema.ts)
416
542
 
417
- ### isSlotCustomized
418
-
419
- Whether this track has customized the slot (holds a non-default value of its
420
- own) rather than following the display type's default. The correct "reset to
421
- default" predicate for a promotable slot: comparing the resolved value to the
422
- base instead reads as at-default for a track merely _following_ a non-base
423
- promoted default, so the reset control lights up on a no-op.
543
+ ### LaneName
424
544
 
425
- `SLOT` is constrained the way `getConf`'s is, and a widened `self` switches the
426
- check off (`HostChecksSlotNames`). A slot name the schema does not declare
427
- throws at the first read (`getSlotDefinition`), and a declared but
428
- non-promotable one throws in `resolveSlotIn`.
545
+ The lanes a caller asks the encoder to fill, beyond `x`, `x2` and
546
+ `featureIndex`, which every payload carries: a shape's channels, and `index` for
547
+ the Flatbush a hover reads. A lane not asked for is neither allocated nor
548
+ transferred, and a caller that never hovers declines the index, which is most of
549
+ the encoder's cost after the walk.
429
550
 
430
- ```js
431
- // type signature
432
- <CONFMODEL extends AnyConfigurationModel, SLOT extends ConfigurationSlotName<ConfigurationSchemaForModel<CONFMODEL>>>(self: ResolvableDisplay<CONFMODEL>, slot: SLOT) => boolean
433
- ```
434
-
435
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotableDefaults.ts)
551
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
436
552
 
437
553
  ### launchOrReplaceView
438
554
 
@@ -446,99 +562,48 @@ synchronous `addOrReplaceView` requires it loaded already.
446
562
 
447
563
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/mstUtils.ts)
448
564
 
449
- ### makePin
565
+ ### LayerRequest
450
566
 
451
- The pin on a radio or slider row: "apply this value to every open track of this
452
- display type", and — via the snackbar it raises — "keep it as the default for
453
- the ones opened later".
567
+ One layer of a `CoreEncodeFeatures` request: the encoding to evaluate and the
568
+ lanes the display's shape reads.
454
569
 
455
- `value` chooses between the subsystem's two meanings, which are otherwise
456
- identical:
570
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
457
571
 
458
- - **Give it** for a per-value pin — "make _compact_ the default" — independent
459
- of what the track currently shows. Use on an always-visible pin so it can
460
- never promote a meaningless value, and so two rows sharing one slot (sashimi
461
- `'down'` vs `'auto'`) stay independent.
462
- - **Omit it** for "whatever I'm showing", resolved through the cascade. Use for
463
- a continuous setting where no fixed on-value makes sense (wiggle point size,
464
- arc line width).
572
+ ### MarkEncoding
465
573
 
466
- A checkbox row takes neither: makeTogglePin.
574
+ The declared mapping from a feature's fields to a mark's channels. `x` defaults
575
+ to `start` and `x2` to `end`; a mark that plots no value leaves `y` off. `glyph`
576
+ is read by the `point` shape alone, `row` — an integer field, 0 where missing —
577
+ by the `span` shape, which stacks a feature on the band it names.
467
578
 
468
- One function with an optional argument, rather than the two exported builders it
469
- replaces — a per-value one and a `…CurrentValue…` one, the second of which was
470
- exactly the first applied to `resolveSlot(self, slot).value`. The pair was one
471
- function plus a doc section explaining which name to reach for; omitting the
472
- argument now says what the longer name said.
579
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
473
580
 
474
- ```js
475
- // type signature
476
- <CONFMODEL extends AnyConfigurationModel, SLOT extends ConfigurationSlotName<…>>(self: ResolvableDisplay<CONFMODEL>, slot: SLOT, ...value: [] | [...]) => ValuePin
477
- ```
581
+ ### MarkEncodingInput
478
582
 
479
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotableDefaults.ts)
583
+ What `encodeFeatures` takes: a MarkEncoding, any channel of which may be a
584
+ ChannelReader in place of its declared form. The declared form is what crosses
585
+ the wire; a reader is built in the worker.
480
586
 
481
- ### makeTogglePin
587
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncoding.ts)
482
588
 
483
- The pin on a checkbox row: the row's own checkbox, acting on every open track of
484
- the display type. `active` mirrors the row, so the pin draws filled exactly when
485
- the box is ticked; a click flips the row's state on every open track and offers
486
- the new state as the display type's default. It never clears a default the way
487
- makePin's filled pin does — flipping back and taking the offer promotes the
488
- other value, and promoting the base value clears the default
489
- (`applyAndOfferDefault`).
589
+ ### NO_VALUE_LABEL
490
590
 
491
- Replaces a symmetric `makePin(self, slot)` on these rows, which carried the
492
- row's current state: beside an unchecked box that applied _off_ everywhere and
493
- visibly did nothing. It also replaces the per-value `makePin` a checkbox row
494
- over a shared enum slot used to carry, which gave two checkbox rows in one
495
- submenu two different pins: one filled when its value was promoted and clearing
496
- on a second click, the other filled when the box was ticked and flipping. With
497
- `states`, a checkbox row is always the toggle kind.
591
+ The key row a feature with nothing in a categorical field lands on, so the
592
+ legend says why a mark is grey, or a disc, rather than listing a blank value.
498
593
 
499
594
  ```js
500
595
  // type signature
501
- <…>(self: ResolvableDisplay<CONFMODEL>, slot: SLOT, ...states: ConfigurationSlotValueResolved<...> extends boolean ? [] | [...] : [...]) => TogglePin
596
+ '(no value)'
502
597
  ```
503
598
 
504
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotableDefaults.ts)
505
-
506
- ### openPromotableDisplays
507
-
508
- Every display on an open track, across all open views — the reach of anything
509
- that acts on "the tracks the user is looking at": a promoted default's "apply to
510
- open tracks", and the share/export bake. One walk so those can't drift apart.
511
-
512
- Recurses into composite views. A display nested in one resolves the cascade like
513
- any other but was invisible to both callers, so the share/export bake didn't
514
- bake its inherited values and a shared session containing a breakpoint-split or
515
- synteny view rendered differently for the recipient. `LGVSyntenyDisplay` is only
516
- ever reached through this branch, so don't flatten the recursion away.
517
- `hasChildViews` names the one composite shape it does not cover.
518
-
519
- A view holding neither (e.g. spreadsheet) drops out via the structural guards. A
520
- view whose displays declare no promotable slot (e.g. dotplot, which does hold
521
- tracks) is walked and contributes nothing — harmless, and cheaper than asking
522
- each display whether it has anything to promote.
523
-
524
- ```js
525
- // type signature
526
- (session: AbstractSessionModel) => ResolvableDisplay[]
527
- ```
528
-
529
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/openDisplays.ts)
530
-
531
- ### Pin
599
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncoding.ts)
532
600
 
533
- The "apply this to every open track of this type" affordance on a menu row — the
534
- trailing `PushPin`, bundled so the row consumes it as one prop.
601
+ ### RampRef
535
602
 
536
- `kind` is what the adornment words itself from and what the row builders check:
537
- a checkbox row takes a TogglePin, a radio or slider row a ValuePin. The two used
538
- to be told apart by `typeof onValue === 'boolean'`, which let a value pin over a
539
- boolean slot compile and read as a toggle while clearing on its second click.
603
+ The ramp a continuous colour scale samples: a named ramp, or evenly spaced CSS
604
+ colour stops.
540
605
 
541
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotablePin.ts)
606
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
542
607
 
543
608
  ### readConfObject
544
609
 
@@ -622,57 +687,6 @@ bound) stated height when on. This is the single spelling of "off spends 0 px".
622
687
 
623
688
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/bandLayout.ts)
624
689
 
625
- ### resolveConf
626
-
627
- Reads a `promotable` slot through the display-type-default cascade — the track's
628
- own value, else the session-wide promoted default for this display type, else
629
- the slot's `promotedBase`. Always yields a real value, never the `undefined`
630
- inherit sentinel, so a display's value getter is
631
- `get displayMode(): DisplayMode { return resolveConf(self, 'displayMode') }`
632
- with no post-guard and no cast.
633
-
634
- Separate from `getConf` rather than folded into it, deliberately: resolution
635
- consults the session, so it is main-thread only and throws on a detached node.
636
- Folding it in was built and reverted — ADR-046.
637
-
638
- Throws if `slot` isn't promotable — the cascade has nothing to say about a plain
639
- slot, and `getConf` is what you want there.
640
-
641
- Takes no jexl `args`, unlike `getConf`: a promotable slot cannot hold a callback
642
- (see `SlotResolution`), so there is no per-feature context to supply.
643
-
644
- ```js
645
- // type signature
646
- <…>(model: ResolvableDisplay<...>, slot: SLOT) => ConfigurationSlotValueResolved<...>
647
- ```
648
-
649
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/getConf.ts)
650
-
651
- ### ResolvedConfigSnapshot
652
-
653
- A display config snapshot whose promotable slots hold RESOLVED values rather
654
- than the inherit sentinel — what a worker payload has to be built from.
655
-
656
- The brand is required and unforgeable, so a plain `Record<string, unknown>` is
657
- not assignable to it and neither is `getSnapshot(self.configuration)`. That is
658
- the whole point. Everything downstream of the resolve is an ERASED container — a
659
- snapshot is `Record<string, unknown>`, and the payload it becomes is an
660
- `as`-asserted interface — so a payload builder handed the RAW snapshot instead
661
- typechecks, ships `undefined` for every promotable slot, and types it as the
662
- resolved value. That was measured, not supposed: the raw spelling in
663
- `LinearBasicDisplay`'s `rpcProps()` passed `pnpm typecheck` and every suite in
664
- `plugins/canvas`, `packages/core/src/configuration` and `products/jbrowse-web`,
665
- while sending the worker `undefined` for chevrons, subfeature labels and feature
666
- height.
667
-
668
- The rest of this subsystem's guarantees are carried by types that stay connected
669
- to the schema: a raw read of a promotable `maybe*` slot is `T | undefined` (see
670
- `ConfigurationSlotValue`), so `getConf` where `resolveConf` was meant is a
671
- compile error at any typed consumer. The brand is that guarantee re-established
672
- at the point where the connection is cut.
673
-
674
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotableDefaults.ts)
675
-
676
690
  ### runLazyAfterAttach
677
691
 
678
692
  Run a display's `afterAttach` body from a module loaded on demand, so the
@@ -691,6 +705,19 @@ displays hand-rolled this IIFE and each drew the lines differently.
691
705
 
692
706
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/lazyAfterAttach.ts)
693
707
 
708
+ ### runTransforms
709
+
710
+ Run the transform steps over a feature list, in order, in the worker. The list a
711
+ step answers is what the next one reads, and the last one is what the encoder
712
+ walks.
713
+
714
+ ```js
715
+ // type signature
716
+ (features: readonly Feature[], steps: readonly TransformStep[], jexl?: JexlInstance | undefined) => readonly Feature[]
717
+ ```
718
+
719
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/featureTransforms.ts)
720
+
694
721
  ### sampleColorRamp
695
722
 
696
723
  The color at `t` in `[0, 1]` across a list of EVENLY SPACED stops, linearly
@@ -704,6 +731,12 @@ than an extrapolation past them, and a one-stop ramp is that stop everywhere.
704
731
 
705
732
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/colorRamp.ts)
706
733
 
734
+ ### ScaleTable
735
+
736
+ Any channel's scale table; the kind names the channel.
737
+
738
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
739
+
707
740
  ### SessionPaletteProvider
708
741
 
709
742
  Make JBrowse follow the host's light/dark state — the whole of it, in one mount:
@@ -760,9 +793,9 @@ cast names a concrete schema instead (`ConfigModelForFields`, or the base schema
760
793
  when the slot is the base's), and `HostChecksSlotNames` pins each one.
761
794
 
762
795
  A wrong _value_ type still throws at runtime (MST type-checks the assignment)
763
- rather than at compile time. `value` is deliberately `unknown` because the
764
- inherit sentinel (`undefined`/`null`) is a legitimate write on every promotable
765
- slot, which the declared slot value type doesn't include.
796
+ rather than at compile time. `value` is deliberately `unknown` because
797
+ `undefined` is a legitimate write — it resets a slot to its schema default — and
798
+ the declared slot value type doesn't include it.
766
799
 
767
800
  ```js
768
801
  // type signature
@@ -790,72 +823,67 @@ carries its own draw rect beside the stack.
790
823
 
791
824
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/bandLayout.ts)
792
825
 
826
+ ### StackStep
827
+
828
+ Assign every feature the lowest row on which it overlaps nothing already there —
829
+ greedy first fit in start order, the packing a pileup is — and write it to the
830
+ field `as` (`row`). `fields` names the interval read (`start`, `end`); `padding`
831
+ is bp of clearance kept between two features sharing a row; `groupby` packs each
832
+ distinct value set on its own rows, each numbered from 0. The answer is the
833
+ input in start order, so a `span` encoding `row` stacks it.
834
+
835
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
836
+
793
837
  ### stopsFromRampLut
794
838
 
795
839
  `n` evenly spaced legend stops read straight out of a buildColorRampLut byte
796
840
  table — the same 256×1 RGBA array `uploadColorRampLut` hands the GPU and the
797
- Canvas2D fillStyle LUTs index — formatted for `SvgGradientLegend`. It holds one
841
+ Canvas2D fillStyle LUTs index — as the stops of a `RampScale`. It holds one
798
842
  claim by construction: the swatch at bar fraction `t` is byte-identical to the
799
843
  ramp entry at `t` on both backends. Alpha rides `opacity` (the juicebox fade),
800
844
  never baked into the color string.
801
845
 
802
846
  ```js
803
847
  // type signature
804
- (lut: Uint8Array<ArrayBufferLike>, n: number) => GradientStop[]
848
+ (lut: Uint8Array<ArrayBufferLike>, n: number) => RampStop[]
805
849
  ```
806
850
 
807
851
  [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/colorRamp.ts)
808
852
 
809
- ### TogglePin
853
+ ### TransformStep
810
854
 
811
- The pin on a checkbox row, built by makeTogglePin: the row's own checkbox over
812
- every open track of the display type. `active` mirrors the row, `onValue` is the
813
- state a click applies (the row's opposite), and `toggle` applies it everywhere
814
- and offers it as the default. It never clears a default on its own — promoting
815
- the slot's base value is what clears one.
855
+ One step over the features before a layer is encoded, named by `type` the way
856
+ GenomeSpy spells a transform; every step runs in order and the next reads what
857
+ the last answered.
816
858
 
817
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotablePin.ts)
859
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
818
860
 
819
- ### TrackConfigWithPromotables
861
+ ### ValueEncoding
820
862
 
821
- A track config snapshot with every display's `promotable` slots resolved, plus
822
- the list of values that came from a session-wide default rather than from the
823
- config itself.
863
+ How a mark's `y` channel resolves: a feature field (or `jexl:` expression) read
864
+ on a linear scale over the loaded regions' extremes, or the same field with the
865
+ scale spelled out — `log` to read the domain logarithmically, `domain` to pin
866
+ `[min, max]` instead of autoscaling. The declaration is the one owner: the
867
+ display's axis, its ticks and the shader's placement are all resolved from it.
824
868
 
825
- For handing a track's config to somewhere that leaves the cascade for good — the
826
- About dialog's "Copy config", whose output a user pastes into a `config.json`. A
827
- raw `getSnapshot` records a slot a track merely _follows_ as absent
828
- (`stripDefault` collapsed it), so the copied config renders differently from the
829
- track it was copied from. This is `getComputedStyle` at that boundary, and
830
- `fromDisplayTypeDefaults` is what lets the UI say so rather than silently
831
- materializing a session preference into a track config.
869
+ `resolve` is which axis the mark reads. `shared` — the default — folds it into
870
+ the display's one y domain with every other mark. `independent` gives it a
871
+ domain folded from its layers alone and a second axis on the right, so a
872
+ coverage run and the raw features can share a plot; one mark per display may ask
873
+ for it.
832
874
 
833
- Resolves from the display _config_ alone, whether or not the track is open.
834
- Everything the cascade takes is on the config node: it is the same node an open
835
- display's `configuration` points at (the hydration cache makes it stable), its
836
- `type` is the display type the session-wide tier is keyed on (every display
837
- schema is `explicitlyTyped` under the display type's own name), and the session
838
- is passed in. So an unopened track — which has no display state at all — still
839
- has an answer to "what would this render as", by the same code path.
875
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncodingTypes.ts)
840
876
 
841
- **Writes every promotable slot, including the ones sitting at `promotedBase`,
842
- and that is the decision — don't "align" it with the share bake.** A pasted
843
- `config.json` is read by a mechanism with no cascade in it at all, so writing
844
- only the inherited values would leave every other slot to pick up whatever the
845
- reader has promoted in their own browser. Pinned by
846
- `products/jbrowse-web/src/tests/CopyConfigPromotedDefaults.test.ts`.
877
+ ### valueField
847
878
 
848
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotableDefaults.ts)
879
+ The field a `y` declaration reads, whichever of its two forms it is written in.
849
880
 
850
- ### ValuePin
851
-
852
- The pin on a radio or slider row, built by makePin: `onValue` is the row's own
853
- value, `active` means that value is the display type's promoted default, and
854
- `toggle` on an outline pin applies the value to every open track and offers it
855
- as the default, while on a filled pin it clears that default and touches no
856
- track (`applyAndOfferDefault` / `clearDefault`).
881
+ ```js
882
+ // type signature
883
+ (y: ValueEncoding) => string
884
+ ```
857
885
 
858
- [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/configuration/promotablePin.ts)
886
+ [Source code](https://github.com/GMOD/jbrowse-components/blob/main/packages/core/src/util/markEncoding.ts)
859
887
 
860
888
  ### VIRIDIS_STOPS
861
889