@welldot/render 0.2.3 → 0.3.0-next.20261015.d7c7365

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.ts 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.js';
2
3
 
3
4
  type PadTextureConfig = {
4
5
  background: string;
@@ -129,12 +130,30 @@ 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;
135
139
  stroke: string;
136
140
  strokeWidth: number;
137
141
  };
142
+ centralizer: {
143
+ fill: string;
144
+ stroke: string;
145
+ strokeWidth: number;
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
+ };
138
157
  conflict: {
139
158
  stroke: string;
140
159
  strokeWidth: number;
@@ -180,6 +199,46 @@ type LabelsTheme = {
180
199
  caveLabelFontSize?: number;
181
200
  };
182
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
+ };
183
242
  type LegendTheme = {
184
243
  borderStrokeWidth: number;
185
244
  fractureStrokeWidth: number;
@@ -198,6 +257,10 @@ type WellTheme = {
198
257
  fracture: FractureTheme;
199
258
  } & ConstructionTheme & LabelsTheme & {
200
259
  legend: LegendTheme;
260
+ overview: OverviewTheme;
261
+ columnHeaders: ColumnHeadersTheme;
262
+ markers: MarkersTheme;
263
+ overlap: OverlapTheme;
201
264
  };
202
265
  type ComponentsClassNames = {
203
266
  tooltip: {
@@ -266,6 +329,14 @@ type ComponentsClassNames = {
266
329
  group: string;
267
330
  item: string;
268
331
  };
332
+ centralizer: {
333
+ group: string;
334
+ item: string;
335
+ };
336
+ pump: {
337
+ group: string;
338
+ item: string;
339
+ };
269
340
  conflict: {
270
341
  group: string;
271
342
  rect: string;
@@ -285,6 +356,26 @@ type ComponentsClassNames = {
285
356
  caveFill: string;
286
357
  constructionRect: string;
287
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
+ };
288
379
  highlights: {
289
380
  geologicGroup: string;
290
381
  constructionGroup: string;
@@ -296,17 +387,14 @@ type ComponentsClassNames = {
296
387
  };
297
388
  };
298
389
  /** Keys identifying which tooltip types are active. Pass to `RenderConfig.tooltips` to control visibility. */
299
- type TooltipKey = 'geology' | 'hole' | 'surfaceCase' | 'holeFill' | 'wellCase' | 'wellScreen' | 'reduction' | 'conflict' | 'fracture' | 'cementPad' | 'cave';
390
+ type TooltipKey = 'geology' | 'hole' | 'surfaceCase' | 'holeFill' | 'wellCase' | 'wellScreen' | 'reduction' | 'centralizer' | 'pump' | 'conflict' | 'fracture' | 'cementPad' | 'cave';
300
391
  /**
301
- * A paired-locale string for renderer-drawn text, or a bare string when the
302
- * value doesn't vary by locale. `pt` is the required fallback locale in the
303
- * object form; `en` is optional. Resolve via `resolveRenderLabel()` — never
304
- * 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.
305
396
  */
306
- type RenderLocalizedText = {
307
- pt: string;
308
- en?: string;
309
- } | string;
397
+ type RenderLocalizedText = LanguageText<'pt'> | string;
310
398
  /**
311
399
  * Shape shared by `RenderConfig.tooltipLabels` (resolved, `T = string`) and
312
400
  * `RenderLabelPack.tooltipLabels` (authoring, `T = RenderLocalizedText`) —
@@ -340,10 +428,30 @@ type TooltipLabels<T = string> = {
340
428
  wellScreen: {
341
429
  title: T;
342
430
  slot: T;
431
+ material: T;
432
+ slotType: T;
343
433
  };
344
434
  reduction: {
345
435
  title: T;
346
436
  };
437
+ centralizer: {
438
+ title: T;
439
+ depth: T;
440
+ spacing: T;
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
+ };
347
455
  conflict: {
348
456
  title: T;
349
457
  };
@@ -388,7 +496,22 @@ type RenderLabelPack = {
388
496
  cave: RenderLocalizedText;
389
497
  caveWater: RenderLocalizedText;
390
498
  };
499
+ columnHeaders: Record<keyof RenderConfig['columnHeaders']['labels'], RenderLocalizedText>;
500
+ continuation: {
501
+ prefix: RenderLocalizedText;
502
+ };
503
+ overlap: {
504
+ label: RenderLocalizedText;
505
+ };
391
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';
392
515
  /** Full rendering behaviour configuration. Use `INTERACTIVE_RENDER_CONFIG` or `STATIC_RENDER_CONFIG` as a starting point. */
393
516
  type RenderConfig = {
394
517
  zoom: boolean;
@@ -436,17 +559,63 @@ type RenderConfig = {
436
559
  };
437
560
  };
438
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
+ */
439
568
  cementPad: {
440
- widthMultiplier: number;
441
- 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;
442
590
  };
443
591
  surfaceCase: {
444
592
  diameterPaddingRatio: number;
445
593
  };
594
+ centralizer: {
595
+ /** Half the marker height in pixels (constant regardless of zoom). */
596
+ markerHalfHeight: number;
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
+ };
446
609
  };
447
610
  textures?: TexturesConfig;
448
611
  constructionLabels: {
449
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';
450
619
  xOffset: number;
451
620
  labelRadius: number;
452
621
  labelMaxWidth?: number;
@@ -459,8 +628,17 @@ type RenderConfig = {
459
628
  labels: {
460
629
  /** false = hide all; true = show all; array = show only listed types */
461
630
  active: boolean | ('lithology' | 'fractures' | 'caves')[];
462
- /** Fine-grained lithology sub-item control; defaults to true when lithology is active */
463
- 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
+ };
464
642
  typeLabels?: {
465
643
  fracture?: string;
466
644
  fractureWater?: string;
@@ -492,6 +670,46 @@ type RenderConfig = {
492
670
  outerEdgeWidth: number;
493
671
  };
494
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
+ };
495
713
  highlights: {
496
714
  stroke: string;
497
715
  strokeWidth: number;
@@ -526,6 +744,8 @@ type LegendRenderConfig = {
526
744
  wellCase: string;
527
745
  wellScreen: string;
528
746
  reduction: string;
747
+ centralizer: string;
748
+ pump: string;
529
749
  cementPad: string;
530
750
  conflict: string;
531
751
  };
@@ -547,6 +767,18 @@ type SvgInstance = {
547
767
  top: number;
548
768
  bottom: number;
549
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;
550
782
  };
551
783
  /**
552
784
  * Attaches an optional stable render identity to any feature type.
@@ -592,21 +824,56 @@ type RenderableWell = Omit<Well, 'lithology' | 'fractures' | 'caves' | 'bore_hol
592
824
  declare const RENDER_LABELS: RenderLabelPack;
593
825
  /**
594
826
  * Returns a copy of `config` with `constructionLabels.labels`, `legend.labels`,
595
- * `tooltipLabels`, and `labels.typeLabels` resolved from `RENDER_LABELS` for
596
- * `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.
597
830
  */
598
831
  declare function applyRenderLocale(config: RenderConfig, locale: 'en' | 'pt'): RenderConfig;
599
832
  declare const DEFAULT_WELL_THEME: WellTheme;
600
833
  declare const STATIC_RENDER_CONFIG: RenderConfig;
601
834
  declare const INTERACTIVE_RENDER_CONFIG: RenderConfig;
602
835
 
836
+ type LegendLabelKey = keyof LegendRenderConfig['labels'];
603
837
  /**
604
- * Dynamically imports the FGDC texture registry (SVG path data keyed by texture code).
605
- * Useful for external UIs that need to display texture thumbnails in selection controls.
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.
606
840
  */
607
- declare function importFgdcTextures(): Promise<{
608
- [code: TextureCode]: string;
609
- }>;
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'>;
859
+ /**
860
+ * Lists the legend entries `profile` needs, in display order, labeled from
861
+ * `labels` (defaults to the built-in Portuguese labels).
862
+ */
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;
610
877
 
611
878
  /**
612
879
  * SVG-based renderer for geological well profiles.
@@ -658,6 +925,20 @@ declare class WellRenderer {
658
925
  private initInstanceSvg;
659
926
  /** Renders a standalone legend into the element matched by `selector`. */
660
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;
661
942
  /**
662
943
  * Multiplies the current zoom scale by `factor` (e.g. `1.25` to zoom in,
663
944
  * `1 / 1.25` to zoom out) on every panel. No-op if both `renderConfig.zoom`
@@ -674,13 +955,21 @@ declare class WellRenderer {
674
955
  * Returns `1` if zoom/pan is disabled or `prepareSvg()` hasn't run yet.
675
956
  */
676
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;
677
964
  /**
678
965
  * Initialises the SVG DOM structure and preloads FGDC textures.
679
966
  * Must be called once before the first `draw()`.
680
967
  */
681
968
  prepareSvg(): Promise<void>;
682
969
  /**
683
- * 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}).
684
973
  * @param profile - The well data to render.
685
974
  * @param options.units - Override the instance-level measurement units for this render.
686
975
  * @param options.locale - Override the instance-level locale for this render.
@@ -694,13 +983,6 @@ declare class WellRenderer {
694
983
  private drawLogToInstance;
695
984
  }
696
985
 
697
- declare function drawWellLegend(selector: string, profile: Well, options?: {
698
- config?: Partial<LegendRenderConfig>;
699
- theme?: Partial<WellTheme>;
700
- classNames?: ComponentsClassNames['legend'];
701
- textures?: TexturesConfig;
702
- }): void;
703
-
704
986
  /**
705
987
  * Formats a depth value in metres to the active length unit string, rounded
706
988
  * (never raw floating-point) and using the target locale's decimal separator.
@@ -721,10 +1003,27 @@ declare function getLengthUnit(units: LengthUnits): string;
721
1003
  */
722
1004
  declare function getDiameterUnit(units: DiameterUnits, locale?: 'en' | 'pt'): string;
723
1005
  /**
724
- * Resolves a paired-locale render label to a plain string. A bare string is
725
- * returned as-is (locale-invariant); for the `{ pt, en }` object form, `pt`
726
- * 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).
727
1009
  */
728
1010
  declare function resolveRenderLabel(value: RenderLocalizedText, locale: 'en' | 'pt'): string;
729
1011
 
730
- 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 };