@welldot/render 0.3.0 → 0.4.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.
package/dist/index.d.cts CHANGED
@@ -1,4 +1,5 @@
1
- import { Well, Lithology, Fracture, Cave, BoreHole, WellCase, WellScreen, HoleFill, SurfaceCase, Reduction, Units, DiameterUnits, LengthUnits } from '@welldot/core';
1
+ import { LanguageText, Well, Lithology, Fracture, Cave, BoreHole, WellCase, WellScreen, HoleFill, SurfaceCase, Reduction, Units, DiameterUnits, LengthUnits } from '@welldot/core';
2
+ export { importFgdcTextures } from './textures.cjs';
2
3
 
3
4
  type PadTextureConfig = {
4
5
  background: string;
@@ -129,6 +130,9 @@ type ConstructionTheme = {
129
130
  wellScreen: {
130
131
  stroke: string;
131
132
  strokeWidth: number;
133
+ /** Width of the dashed line at each screen's top and base. */
134
+ endStrokeWidth: number;
135
+ endDasharray: string;
132
136
  };
133
137
  reduction: {
134
138
  fill: string;
@@ -140,6 +144,16 @@ type ConstructionTheme = {
140
144
  stroke: string;
141
145
  strokeWidth: number;
142
146
  };
147
+ /** Current pump body and its riser pipe (`.well` v2.3 `pump_installations`). */
148
+ pump: {
149
+ fill: string;
150
+ stroke: string;
151
+ strokeWidth: number;
152
+ /** Riser interior: a tone between the casing's and the body's, so the riser reads as part of the pump, not as a casing. */
153
+ riserFill: string;
154
+ riserStroke: string;
155
+ riserStrokeWidth: number;
156
+ };
143
157
  conflict: {
144
158
  stroke: string;
145
159
  strokeWidth: number;
@@ -185,6 +199,46 @@ type LabelsTheme = {
185
199
  caveLabelFontSize?: number;
186
200
  };
187
201
  };
202
+ /** Mini-map drawn by `RenderConfig.overview`. */
203
+ type OverviewTheme = {
204
+ stroke: string;
205
+ strokeWidth: number;
206
+ /** Fill of layers without a `color`. */
207
+ emptyFill: string;
208
+ /** Outline of the window marking the panel's depth range. */
209
+ windowStroke: string;
210
+ windowStrokeWidth: number;
211
+ };
212
+ /** Column titles drawn by `RenderConfig.columnHeaders`. */
213
+ type ColumnHeadersTheme = {
214
+ fontSize: number;
215
+ color: string;
216
+ fontFamily?: string;
217
+ fontWeight?: string | number;
218
+ ruleStroke: string;
219
+ ruleStrokeWidth: number;
220
+ };
221
+ /** Layer and fracture markers drawn by `RenderConfig.markers`. */
222
+ type MarkersTheme = {
223
+ fill: string;
224
+ stroke: string;
225
+ strokeWidth: number;
226
+ color: string;
227
+ fontSize: number;
228
+ fontFamily?: string;
229
+ fontWeight?: string | number;
230
+ };
231
+ /** Hatched band drawn over the depths a panel repeats from the previous one. */
232
+ type OverlapTheme = {
233
+ stroke: string;
234
+ strokeWidth: number;
235
+ /** Spacing of the hatch lines in pixels. */
236
+ size: number;
237
+ ruleStroke: string;
238
+ labelColor: string;
239
+ fontSize: number;
240
+ fontFamily?: string;
241
+ };
188
242
  type LegendTheme = {
189
243
  borderStrokeWidth: number;
190
244
  fractureStrokeWidth: number;
@@ -203,6 +257,10 @@ type WellTheme = {
203
257
  fracture: FractureTheme;
204
258
  } & ConstructionTheme & LabelsTheme & {
205
259
  legend: LegendTheme;
260
+ overview: OverviewTheme;
261
+ columnHeaders: ColumnHeadersTheme;
262
+ markers: MarkersTheme;
263
+ overlap: OverlapTheme;
206
264
  };
207
265
  type ComponentsClassNames = {
208
266
  tooltip: {
@@ -275,6 +333,10 @@ type ComponentsClassNames = {
275
333
  group: string;
276
334
  item: string;
277
335
  };
336
+ pump: {
337
+ group: string;
338
+ item: string;
339
+ };
278
340
  conflict: {
279
341
  group: string;
280
342
  rect: string;
@@ -294,6 +356,26 @@ type ComponentsClassNames = {
294
356
  caveFill: string;
295
357
  constructionRect: string;
296
358
  };
359
+ overview: {
360
+ group: string;
361
+ item: string;
362
+ window: string;
363
+ };
364
+ columnHeaders: {
365
+ group: string;
366
+ text: string;
367
+ rule: string;
368
+ };
369
+ markers: {
370
+ group: string;
371
+ lithology: string;
372
+ fracture: string;
373
+ };
374
+ overlap: {
375
+ group: string;
376
+ band: string;
377
+ label: string;
378
+ };
297
379
  highlights: {
298
380
  geologicGroup: string;
299
381
  constructionGroup: string;
@@ -305,17 +387,14 @@ type ComponentsClassNames = {
305
387
  };
306
388
  };
307
389
  /** Keys identifying which tooltip types are active. Pass to `RenderConfig.tooltips` to control visibility. */
308
- type TooltipKey = 'geology' | 'hole' | 'surfaceCase' | 'holeFill' | 'wellCase' | 'wellScreen' | 'reduction' | 'centralizer' | 'conflict' | 'fracture' | 'cementPad' | 'cave';
390
+ type TooltipKey = 'geology' | 'hole' | 'surfaceCase' | 'holeFill' | 'wellCase' | 'wellScreen' | 'reduction' | 'centralizer' | 'pump' | 'conflict' | 'fracture' | 'cementPad' | 'cave';
309
391
  /**
310
- * A paired-locale string for renderer-drawn text, or a bare string when the
311
- * value doesn't vary by locale. `pt` is the required fallback locale in the
312
- * object form; `en` is optional. Resolve via `resolveRenderLabel()` — never
313
- * read `.pt`/`.en` directly, since the value may be a plain string.
392
+ * Renderer-drawn text: a core `LanguageText` with `pt` required (the fallback
393
+ * locale; `en` and any other tag optional), or a bare string when the value
394
+ * doesn't vary by locale. Resolve via `resolveRenderLabel()` — never read a
395
+ * tag directly, since the value may be a plain string.
314
396
  */
315
- type RenderLocalizedText = {
316
- pt: string;
317
- en?: string;
318
- } | string;
397
+ type RenderLocalizedText = LanguageText<'pt'> | string;
319
398
  /**
320
399
  * Shape shared by `RenderConfig.tooltipLabels` (resolved, `T = string`) and
321
400
  * `RenderLabelPack.tooltipLabels` (authoring, `T = RenderLocalizedText`) —
@@ -349,6 +428,8 @@ type TooltipLabels<T = string> = {
349
428
  wellScreen: {
350
429
  title: T;
351
430
  slot: T;
431
+ material: T;
432
+ slotType: T;
352
433
  };
353
434
  reduction: {
354
435
  title: T;
@@ -358,6 +439,19 @@ type TooltipLabels<T = string> = {
358
439
  depth: T;
359
440
  spacing: T;
360
441
  };
442
+ pump: {
443
+ title: T;
444
+ intakeDepth: T;
445
+ model: T;
446
+ power: T;
447
+ riser: T;
448
+ type_submersible: T;
449
+ type_vertical_turbine: T;
450
+ type_jet: T;
451
+ type_progressive_cavity: T;
452
+ type_hand_pump: T;
453
+ type_compressor_airlift: T;
454
+ };
361
455
  conflict: {
362
456
  title: T;
363
457
  };
@@ -402,7 +496,22 @@ type RenderLabelPack = {
402
496
  cave: RenderLocalizedText;
403
497
  caveWater: RenderLocalizedText;
404
498
  };
499
+ columnHeaders: Record<keyof RenderConfig['columnHeaders']['labels'], RenderLocalizedText>;
500
+ continuation: {
501
+ prefix: RenderLocalizedText;
502
+ };
503
+ overlap: {
504
+ label: RenderLocalizedText;
505
+ };
405
506
  };
507
+ /** Sub-items of the lithology annotations (`RenderConfig.labels.lithology`). */
508
+ type LithologyLabelItem = 'depth' | 'description' | 'dividers'
509
+ /** Bold `geologic_unit` line and italic `aquifer_unit` line. */
510
+ | 'units'
511
+ /** Square of the layer's fill before the depth range. */
512
+ | 'swatch'
513
+ /** Rule above each annotation, as wide as the annotation. */
514
+ | 'rules';
406
515
  /** Full rendering behaviour configuration. Use `INTERACTIVE_RENDER_CONFIG` or `STATIC_RENDER_CONFIG` as a starting point. */
407
516
  type RenderConfig = {
408
517
  zoom: boolean;
@@ -450,9 +559,34 @@ type RenderConfig = {
450
559
  };
451
560
  };
452
561
  construction: {
562
+ /**
563
+ * Fixed-size pad drawn above the surface as two slabs around the
564
+ * outermost pipe, with break lines at the outer ends (not to scale). The
565
+ * profile's `cement_pad` width and thickness don't change it (they only
566
+ * show in the tooltip).
567
+ */
453
568
  cementPad: {
454
- widthMultiplier: number;
455
- thicknessMultiplier: number;
569
+ /** Pad width as a ratio of the construction column width; widened when the pipe opening needs it. */
570
+ widthRatio: number;
571
+ /** Pad height in pixels (constant regardless of zoom). */
572
+ height: number;
573
+ };
574
+ /**
575
+ * Casing shoe: a filled triangle outside each wall where the casing /
576
+ * screen string really ends (not at panel cuts or joints).
577
+ */
578
+ casingShoe: {
579
+ active: boolean;
580
+ /** Triangle leg in pixels (constant regardless of zoom). */
581
+ size: number;
582
+ };
583
+ /**
584
+ * Screen ends: a dashed line across the pipe at the top and base of
585
+ * every screen (not at panel cuts). Styled by `theme.wellScreen`
586
+ * `endStrokeWidth` / `endDasharray`.
587
+ */
588
+ screenEnds: {
589
+ active: boolean;
456
590
  };
457
591
  surfaceCase: {
458
592
  diameterPaddingRatio: number;
@@ -461,10 +595,27 @@ type RenderConfig = {
461
595
  /** Half the marker height in pixels (constant regardless of zoom). */
462
596
  markerHalfHeight: number;
463
597
  };
598
+ /** Current pump + riser layer (`.well` v2.3 `pump_installations`). */
599
+ pump: {
600
+ /** Whether the current pump is drawn. */
601
+ active: boolean;
602
+ /** Pump body height in pixels (constant regardless of zoom); the body ends at `intake_depth`. */
603
+ bodyHeight: number;
604
+ /** Pump body width as a fraction of the casing/screen diameter at the intake. */
605
+ bodyWidthRatio: number;
606
+ /** Riser width as a fraction of the casing diameter, used when `riser_diameter` is absent. */
607
+ riserWidthRatio: number;
608
+ };
464
609
  };
465
610
  textures?: TexturesConfig;
466
611
  constructionLabels: {
467
612
  active: boolean;
613
+ /**
614
+ * `left` (default): each label ends `xOffset` px left of its own casing
615
+ * wall. `right`: labels start `xOffset` px right of the construction
616
+ * column, in one aligned column.
617
+ */
618
+ side?: 'left' | 'right';
468
619
  xOffset: number;
469
620
  labelRadius: number;
470
621
  labelMaxWidth?: number;
@@ -477,8 +628,17 @@ type RenderConfig = {
477
628
  labels: {
478
629
  /** false = hide all; true = show all; array = show only listed types */
479
630
  active: boolean | ('lithology' | 'fractures' | 'caves')[];
480
- /** Fine-grained lithology sub-item control; defaults to true when lithology is active */
481
- lithology?: boolean | ('depth' | 'description' | 'dividers')[];
631
+ /** Fine-grained lithology sub-item control; `true` = depth, description and dividers */
632
+ lithology?: boolean | LithologyLabelItem[];
633
+ /**
634
+ * Marks layers and construction items that start above the panel (they
635
+ * continue from the previous one): `↑ {prefix} · from–to` on lithology
636
+ * annotations, a leading `↑` on construction labels.
637
+ */
638
+ continuation: {
639
+ active: boolean;
640
+ prefix: string;
641
+ };
482
642
  typeLabels?: {
483
643
  fracture?: string;
484
644
  fractureWater?: string;
@@ -510,6 +670,46 @@ type RenderConfig = {
510
670
  outerEdgeWidth: number;
511
671
  };
512
672
  legend: LegendRenderConfig;
673
+ /**
674
+ * Mini-map: the whole well's lithology drawn as a thin column in the
675
+ * panel's left margin, with a window outlining the panel's depth range.
676
+ */
677
+ overview: {
678
+ active: boolean;
679
+ /** Left edge in SVG coordinates. */
680
+ x: number;
681
+ width: number;
682
+ /** Height in pixels; capped at the panel's drawing height. */
683
+ height: number;
684
+ };
685
+ /**
686
+ * Column titles drawn in the panel's top margin, over a rule that sits
687
+ * `construction.cementPad.height` px above the drawing area (clear of the
688
+ * pad). The top margin must hold `height` plus that.
689
+ */
690
+ columnHeaders: {
691
+ active: boolean;
692
+ /** Height of the header row, taken from the top margin. */
693
+ height: number;
694
+ labels: {
695
+ depth: string;
696
+ lithology: string;
697
+ construction: string;
698
+ /** Shown only when lithology annotations are drawn. */
699
+ description: string;
700
+ };
701
+ };
702
+ /** Circled 1-based index on each lithology layer, `F{n}` next to each fracture. */
703
+ markers: {
704
+ lithology: boolean;
705
+ fractures: boolean;
706
+ radius: number;
707
+ };
708
+ /** Band over the depths a panel repeats (`SvgInstance.repeatedTo`). */
709
+ overlap: {
710
+ /** `{range}` is replaced by the repeated depth range, e.g. `116–124 m`. */
711
+ label: string;
712
+ };
513
713
  highlights: {
514
714
  stroke: string;
515
715
  strokeWidth: number;
@@ -545,6 +745,7 @@ type LegendRenderConfig = {
545
745
  wellScreen: string;
546
746
  reduction: string;
547
747
  centralizer: string;
748
+ pump: string;
548
749
  cementPad: string;
549
750
  conflict: string;
550
751
  };
@@ -566,6 +767,18 @@ type SvgInstance = {
566
767
  top: number;
567
768
  bottom: number;
568
769
  };
770
+ /**
771
+ * Depth window `[from, to]` (m) drawn in this panel. When every panel has
772
+ * one, `draw()` uses them instead of splitting the depth in proportion to
773
+ * the panel heights, so panels may overlap or skip depths.
774
+ */
775
+ depthRange?: [number, number];
776
+ /**
777
+ * Depth (m) down to which the panel repeats the bottom of the previous
778
+ * one. The repeated band `[depthRange[0], repeatedTo]` is hatched and
779
+ * labelled with `RenderConfig.overlap.label`.
780
+ */
781
+ repeatedTo?: number;
569
782
  };
570
783
  /**
571
784
  * Attaches an optional stable render identity to any feature type.
@@ -611,21 +824,56 @@ type RenderableWell = Omit<Well, 'lithology' | 'fractures' | 'caves' | 'bore_hol
611
824
  declare const RENDER_LABELS: RenderLabelPack;
612
825
  /**
613
826
  * Returns a copy of `config` with `constructionLabels.labels`, `legend.labels`,
614
- * `tooltipLabels`, and `labels.typeLabels` resolved from `RENDER_LABELS` for
615
- * `locale`. Every other field of `config` is preserved unchanged.
827
+ * `tooltipLabels`, `labels.typeLabels`, `labels.continuation.prefix`,
828
+ * `columnHeaders.labels` and `overlap.label` resolved from `RENDER_LABELS`
829
+ * for `locale`. Every other field of `config` is preserved unchanged.
616
830
  */
617
831
  declare function applyRenderLocale(config: RenderConfig, locale: 'en' | 'pt'): RenderConfig;
618
832
  declare const DEFAULT_WELL_THEME: WellTheme;
619
833
  declare const STATIC_RENDER_CONFIG: RenderConfig;
620
834
  declare const INTERACTIVE_RENDER_CONFIG: RenderConfig;
621
835
 
836
+ type LegendLabelKey = keyof LegendRenderConfig['labels'];
837
+ /**
838
+ * One entry of a well's legend: `key` names the entry (and its label in
839
+ * `LegendRenderConfig['labels']`), the other fields select its symbol.
840
+ */
841
+ type WellLegendItem = {
842
+ kind: 'fracture';
843
+ key: 'fractureSingle' | 'fractureSwarm' | 'fractureWater';
844
+ label: string;
845
+ swarm: boolean;
846
+ water_intake: boolean;
847
+ } | {
848
+ kind: 'cave';
849
+ key: 'caveDry' | 'caveWet';
850
+ label: string;
851
+ water_intake: boolean;
852
+ } | {
853
+ kind: 'construction';
854
+ key: ConstructionSubKind;
855
+ label: string;
856
+ subKind: ConstructionSubKind;
857
+ };
858
+ type ConstructionSubKind = Exclude<LegendLabelKey, 'fractureSingle' | 'fractureSwarm' | 'fractureWater' | 'caveDry' | 'caveWet'>;
622
859
  /**
623
- * Dynamically imports the FGDC texture registry (SVG path data keyed by texture code).
624
- * Useful for external UIs that need to display texture thumbnails in selection controls.
860
+ * Lists the legend entries `profile` needs, in display order, labeled from
861
+ * `labels` (defaults to the built-in Portuguese labels).
625
862
  */
626
- declare function importFgdcTextures(): Promise<{
627
- [code: TextureCode]: string;
628
- }>;
863
+ declare function getWellLegendItems(profile: Well, labels?: LegendRenderConfig['labels']): WellLegendItem[];
864
+ type LegendOptions = {
865
+ config?: Partial<LegendRenderConfig>;
866
+ theme?: Partial<WellTheme>;
867
+ classNames?: ComponentsClassNames['legend'];
868
+ textures?: TexturesConfig;
869
+ };
870
+ /**
871
+ * Draws a single legend symbol into its own `<svg>` (matched by `selector`),
872
+ * sized to the symbol plus a small margin, with the textures it needs
873
+ * defined inside — so the markup renders standalone, e.g. in a PDF table.
874
+ */
875
+ declare function drawWellLegendSymbol(selector: string, item: WellLegendItem, options?: Omit<LegendOptions, 'config'>): void;
876
+ declare function drawWellLegend(selector: string, profile: Well, options?: LegendOptions): void;
629
877
 
630
878
  /**
631
879
  * SVG-based renderer for geological well profiles.
@@ -677,6 +925,20 @@ declare class WellRenderer {
677
925
  private initInstanceSvg;
678
926
  /** Renders a standalone legend into the element matched by `selector`. */
679
927
  renderLegend(selector: string, profile: Well): void;
928
+ /** Lists the legend entries `profile` needs, labeled from `renderConfig.legend.labels`. */
929
+ getLegendItems(profile: Well): WellLegendItem[];
930
+ /**
931
+ * Renders one legend entry's symbol (see {@link getLegendItems}) into its
932
+ * own SVG matched by `selector`, with the textures it needs defined inside.
933
+ */
934
+ renderLegendSymbol(selector: string, item: WellLegendItem): void;
935
+ /**
936
+ * Renders one lithology layer's fill as a `size`×`size` square into its
937
+ * own SVG matched by `selector`, with its texture defined inside (e.g. for
938
+ * a swatch in a PDF table). Call after `prepareSvg()`, which loads the
939
+ * FGDC textures.
940
+ */
941
+ renderLithologySwatch(selector: string, layer: Lithology, size?: number): void;
680
942
  /**
681
943
  * Multiplies the current zoom scale by `factor` (e.g. `1.25` to zoom in,
682
944
  * `1 / 1.25` to zoom out) on every panel. No-op if both `renderConfig.zoom`
@@ -693,13 +955,21 @@ declare class WellRenderer {
693
955
  * Returns `1` if zoom/pan is disabled or `prepareSvg()` hasn't run yet.
694
956
  */
695
957
  getZoomScale(): number;
958
+ /**
959
+ * Removes everything drawn on every panel (layers, labels, axis,
960
+ * highlights) and keeps the structure `prepareSvg()` built, so the next
961
+ * `draw()` needs no new `prepareSvg()`. `draw()` calls it for an empty well.
962
+ */
963
+ clear(): void;
696
964
  /**
697
965
  * Initialises the SVG DOM structure and preloads FGDC textures.
698
966
  * Must be called once before the first `draw()`.
699
967
  */
700
968
  prepareSvg(): Promise<void>;
701
969
  /**
702
- * Renders the well profile into all configured SVG panels.
970
+ * Renders the well profile into all configured SVG panels. Layers the
971
+ * profile no longer has are removed; an empty well (`isWellEmpty`) clears
972
+ * the panels (see {@link clear}).
703
973
  * @param profile - The well data to render.
704
974
  * @param options.units - Override the instance-level measurement units for this render.
705
975
  * @param options.locale - Override the instance-level locale for this render.
@@ -713,13 +983,6 @@ declare class WellRenderer {
713
983
  private drawLogToInstance;
714
984
  }
715
985
 
716
- declare function drawWellLegend(selector: string, profile: Well, options?: {
717
- config?: Partial<LegendRenderConfig>;
718
- theme?: Partial<WellTheme>;
719
- classNames?: ComponentsClassNames['legend'];
720
- textures?: TexturesConfig;
721
- }): void;
722
-
723
986
  /**
724
987
  * Formats a depth value in metres to the active length unit string, rounded
725
988
  * (never raw floating-point) and using the target locale's decimal separator.
@@ -740,10 +1003,27 @@ declare function getLengthUnit(units: LengthUnits): string;
740
1003
  */
741
1004
  declare function getDiameterUnit(units: DiameterUnits, locale?: 'en' | 'pt'): string;
742
1005
  /**
743
- * Resolves a paired-locale render label to a plain string. A bare string is
744
- * returned as-is (locale-invariant); for the `{ pt, en }` object form, `pt`
745
- * is always the fallback — mirrors the org-wide `resolveLanguageText()` contract.
1006
+ * Resolves a render label to a plain string: core `resolveLanguageText()`
1007
+ * with `pt` as the fallback locale. A bare string is returned as-is
1008
+ * (locale-invariant).
746
1009
  */
747
1010
  declare function resolveRenderLabel(value: RenderLocalizedText, locale: 'en' | 'pt'): string;
748
1011
 
749
- export { type CaveTheme, type ComponentsClassNames, type ConstructionTheme, DEFAULT_WELL_THEME, type DeepPartial, type FractureTheme, type HighlightItem, type Highlights, INTERACTIVE_RENDER_CONFIG, type LabelsTheme, type LegendRenderConfig, type LegendTheme, type LithologyTextureTheme, type LithologyTheme, RENDER_LABELS, type RenderConfig, type RenderLabelPack, type RenderLocalizedText, type RenderableWell, STATIC_RENDER_CONFIG, type SvgInstance, type TooltipKey, type TooltipLabels, WellRenderer, type WellTheme, type WithKey, applyRenderLocale, drawWellLegend, formatDiameter, formatLength, getDiameterUnit, getLengthUnit, importFgdcTextures, resolveRenderLabel };
1012
+ /**
1013
+ * Topmost depth (m) the profile draws: `0` (the surface), or above it when
1014
+ * a casing, screen or surface case starts at a negative depth (pipe
1015
+ * stick-up above the ground).
1016
+ */
1017
+ declare function getProfileTopDepth(profile: {
1018
+ surface_case?: {
1019
+ from: number;
1020
+ }[];
1021
+ well_case?: {
1022
+ from: number;
1023
+ }[];
1024
+ well_screen?: {
1025
+ from: number;
1026
+ }[];
1027
+ }): number;
1028
+
1029
+ export { type CaveTheme, type ColumnHeadersTheme, type ComponentsClassNames, type ConstructionTheme, DEFAULT_WELL_THEME, type DeepPartial, type FractureTheme, type HighlightItem, type Highlights, INTERACTIVE_RENDER_CONFIG, type LabelsTheme, type LegendRenderConfig, type LegendTheme, type LithologyLabelItem, type LithologyTextureTheme, type LithologyTheme, type MarkersTheme, type OverlapTheme, type OverviewTheme, RENDER_LABELS, type RenderConfig, type RenderLabelPack, type RenderLocalizedText, type RenderableWell, STATIC_RENDER_CONFIG, type SvgInstance, type TooltipKey, type TooltipLabels, type WellLegendItem, WellRenderer, type WellTheme, type WithKey, applyRenderLocale, drawWellLegend, drawWellLegendSymbol, formatDiameter, formatLength, getDiameterUnit, getLengthUnit, getProfileTopDepth, getWellLegendItems, resolveRenderLabel };