@welldot/render 0.1.0-next.20260509.039db95 → 0.2.2

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/README.md CHANGED
@@ -56,27 +56,51 @@ new WellRenderer(svgs: SvgInstance[], options?: {
56
56
  renderConfig?: DeepPartial<RenderConfig>;
57
57
  theme?: DeepPartial<WellTheme>;
58
58
  units?: Units;
59
+ locale?: 'en' | 'pt';
59
60
  classNames?: DeepPartial<ComponentsClassNames>;
60
61
  onError?: (err: Error) => void;
62
+ onZoom?: (scale: number) => void;
61
63
  })
62
64
  ```
63
65
 
64
- | Option | Type | Description |
65
- |--------|------|-------------|
66
- | `svgs` | `SvgInstance[]` | One or more SVG panel descriptors (`{ selector, height, width, margins }`) |
67
- | `renderConfig` | `DeepPartial<RenderConfig>` | Controls zoom, pan, animation, labels, tooltips, layout |
68
- | `theme` | `DeepPartial<WellTheme>` | Visual style overrides (merged with `DEFAULT_WELL_THEME`) |
69
- | `units` | `Units` | `{ length: 'm' \| 'ft'; diameter: 'mm' \| 'inches' }` |
70
- | `classNames` | `DeepPartial<ComponentsClassNames>` | Override CSS class names for any SVG element |
71
- | `onError` | `(err: Error) => void` | Error callback |
66
+ | Option | Type | Description |
67
+ | -------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
68
+ | `svgs` | `SvgInstance[]` | One or more SVG panel descriptors (`{ selector, height, width, margins }`) |
69
+ | `renderConfig` | `DeepPartial<RenderConfig>` | Controls zoom, pan, animation, labels, tooltips, layout |
70
+ | `theme` | `DeepPartial<WellTheme>` | Visual style overrides (merged with `DEFAULT_WELL_THEME`) |
71
+ | `units` | `Units` | `{ length: 'm' \| 'ft'; diameter: 'mm' \| 'inches' }` |
72
+ | `locale` | `'en' \| 'pt'` | Locale for renderer-drawn text (diameter symbol, and any labels resolved via `applyRenderLocale`). Defaults to `'pt'` (the package's historical output) |
73
+ | `classNames` | `DeepPartial<ComponentsClassNames>` | Override CSS class names for any SVG element |
74
+ | `onError` | `(err: Error) => void` | Error callback |
75
+ | `onZoom` | `(scale: number) => void` | Called with the current zoom scale (`1` = initial/fit) on every wheel/drag zoom-pan tick, and on `zoomBy`/`resetZoom` calls |
72
76
 
73
77
  #### Methods
74
78
 
75
- | Method | Description |
76
- |--------|-------------|
77
- | `prepareSvg(): Promise<void>` | Initialise SVG DOM structure and preload FGDC textures. Call once before the first `draw`. |
78
- | `draw(profile: Well, options?: { units?: Units; highlights?: Highlights }): void` | Render or re-render the full well profile. |
79
- | `renderLegend(selector: string, profile: Well): void` | Render a standalone legend into a separate SVG. |
79
+ | Method | Description |
80
+ | ------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- |
81
+ | `prepareSvg(): Promise<void>` | Initialise SVG DOM structure and preload FGDC textures. Call once before the first `draw`. |
82
+ | `draw(profile: RenderableWell, options?: { units?: Units; locale?: 'en' \| 'pt'; highlights?: Highlights }): void` | Render or re-render the full well profile. |
83
+ | `renderLegend(selector: string, profile: Well): void` | Render a standalone legend into a separate SVG. |
84
+ | `zoomBy(factor: number): void` | Multiply the current zoom scale by `factor` (e.g. `1.25` in, `1 / 1.25` out). No-op if `zoom`/`pan` are both disabled. |
85
+ | `resetZoom(): void` | Reset zoom/pan back to `renderConfig.zoomLevel` (default `1` — the initial fit-to-container view). |
86
+ | `getZoomScale(): number` | Current zoom scale of the first panel (`1` = initial/fit). |
87
+
88
+ `RenderableWell` extends `Well` with an optional `key` field on each feature array element, enabling stable D3 data-join keys across re-renders. A plain `Well` object is directly assignable to `RenderableWell`. **`key` is runtime-only** — keep it in memory across edits for stable animation, but strip it before serializing to a `.well` file.
89
+
90
+ #### Driving zoom from your own UI (zoom in/out/fit buttons)
91
+
92
+ `zoom`/`pan` (when enabled in `renderConfig`) already wire up mouse wheel and drag directly on the SVG. `zoomBy`/`resetZoom`/`getZoomScale` operate on that same internal zoom behavior, so wheel/drag and a custom toolbar stay in sync — including through the `onZoom` callback, which fires for both interaction sources. `renderConfig.minZoomScale`/`maxZoomScale` (default `0`–`150`, i.e. 0%–15000%) bound the scale for wheel, drag, and `zoomBy`/`resetZoom` alike, since they're enforced on the shared d3-zoom behavior itself rather than by any one call site.
93
+
94
+ ```ts
95
+ const renderer = new WellRenderer(svgs, {
96
+ renderConfig: { ...INTERACTIVE_RENDER_CONFIG, zoom: true, pan: true },
97
+ onZoom: scale => updateScaleLabel(scale),
98
+ });
99
+
100
+ zoomInButton.onclick = () => renderer.zoomBy(1.25);
101
+ zoomOutButton.onclick = () => renderer.zoomBy(1 / 1.25);
102
+ fitButton.onclick = () => renderer.resetZoom();
103
+ ```
80
104
 
81
105
  ---
82
106
 
@@ -89,8 +113,10 @@ drawWellLegend(
89
113
  selector: string,
90
114
  profile: Well,
91
115
  options?: {
92
- config?: Partial<LegendRenderConfig>;
93
- cssVars?: Partial<CssVarsConfig>;
116
+ config?: Partial<LegendRenderConfig>;
117
+ theme?: Partial<WellTheme>;
118
+ classNames?: ComponentsClassNames['legend'];
119
+ textures?: TexturesConfig;
94
120
  }
95
121
  ): void
96
122
  ```
@@ -101,42 +127,63 @@ Does nothing if the profile contains no fractures or caves.
101
127
 
102
128
  ### Config presets
103
129
 
104
- | Export | Description |
105
- |--------|-------------|
130
+ | Export | Description |
131
+ | --------------------------- | -------------------------------------------------- |
106
132
  | `INTERACTIVE_RENDER_CONFIG` | Full-featured preset: zoom, pan, animation enabled |
107
- | `STATIC_RENDER_CONFIG` | Zoom and pan disabled; suitable for static exports |
108
- | `DEFAULT_WELL_THEME` | Complete default visual theme |
133
+ | `STATIC_RENDER_CONFIG` | Zoom and pan disabled; suitable for static exports |
134
+ | `DEFAULT_WELL_THEME` | Complete default visual theme |
109
135
 
110
136
  ---
111
137
 
112
138
  ### Format utilities
113
139
 
114
- | Export | Signature | Description |
115
- |--------|-----------|-------------|
116
- | `formatLength` | `(m: number, units: LengthUnits) => string` | Depth in metres → unit-aware string |
117
- | `formatDiameter` | `(mm: number, units: DiameterUnits) => string` | Diameter in mm → unit-aware string |
118
- | `getLengthUnit` | `(units: LengthUnits) => string` | Returns `'m'` or `'ft'` |
119
- | `getDiameterUnit` | `(units: DiameterUnits) => string` | Returns `'mm'` or `'"'` |
140
+ | Export | Signature | Description |
141
+ | -------------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
142
+ | `formatLength` | `(m: number, units: LengthUnits) => string` | Depth in metres → unit-aware string |
143
+ | `formatDiameter` | `(mm: number, units: DiameterUnits) => string` | Diameter in mm → unit-aware string |
144
+ | `getLengthUnit` | `(units: LengthUnits) => string` | Returns `'m'` or `'ft'` |
145
+ | `getDiameterUnit` | `(units: DiameterUnits, locale?: 'en' \| 'pt') => string` | Returns `'mm'`, or `'"'`/`'in.'` for `inches` depending on `locale` (defaults to `'"'`) |
146
+ | `resolveRenderLabel` | `(value: RenderLocalizedText, locale: 'en' \| 'pt') => string` | Resolves a paired-locale label to a plain string, falling back to `pt` |
147
+
148
+ ---
149
+
150
+ ### Locale
151
+
152
+ Every string `@welldot/render` draws (tooltip titles/fields, construction-label prefixes, fracture/cave type words, legend entries) is sourced from `RenderConfig` — the `locale` constructor/`draw()` option only controls the diameter unit symbol (`getDiameterUnit`) directly. To get fully English-rendered text, resolve the package's built-in English label pack into your `RenderConfig` with `applyRenderLocale`:
153
+
154
+ ```ts
155
+ import {
156
+ WellRenderer,
157
+ INTERACTIVE_RENDER_CONFIG,
158
+ applyRenderLocale,
159
+ } from '@welldot/render';
160
+
161
+ const renderer = new WellRenderer(svgs, {
162
+ units: { length: 'ft', diameter: 'inches' },
163
+ locale: 'en',
164
+ renderConfig: applyRenderLocale(INTERACTIVE_RENDER_CONFIG, 'en'),
165
+ });
166
+ ```
167
+
168
+ `applyRenderLocale(config, locale)` returns a copy of `config` with `constructionLabels.labels`, `legend.labels`, `tooltipLabels`, and `labels.typeLabels` resolved from the package's canonical `RENDER_LABELS` pack — every other field of `config` is unchanged. `RENDER_LABELS` (and the `RenderLocalizedText`/`RenderLabelPack`/`TooltipLabels` types describing its shape) are also exported directly for consumers who want to resolve labels themselves. Omitting `locale`/`applyRenderLocale` entirely preserves the package's historical Portuguese-only output.
120
169
 
121
170
  ---
122
171
 
123
172
  ## Theming
124
173
 
125
- Visual appearance is controlled by CSS custom properties (`--wp-*`) defined on `:root`. Import the package stylesheet or override properties inline:
174
+ Visual appearance is controlled by the `theme` option passed to `WellRenderer`. All colors, stroke widths, and opacities are defined as a `WellTheme` object. Use `DEFAULT_WELL_THEME` as a base and pass a `DeepPartial<WellTheme>` to override specific values:
126
175
 
127
176
  ```ts
128
- // Override via renderConfig at construction time
129
177
  new WellRenderer(svgs, {
130
- renderConfig: {
131
- cssVars: {
132
- fractureWetStroke: '#0077cc',
133
- wellCaseFill: '#f5f5f5',
134
- },
178
+ theme: {
179
+ lithology: { stroke: '#222222', strokeWidth: 1.5 },
180
+ wellCase: { fill: '#f5f5f5', stroke: '#333333', strokeWidth: 2 },
181
+ reduction: { fill: '#f5f5f5', stroke: '#333333', strokeWidth: 2 },
135
182
  },
136
183
  });
137
184
  ```
138
185
 
139
- All CSS variables (colors, stroke widths, opacities) are listed in `src/styles/main.css`.
186
+ See `DEFAULT_WELL_THEME` in `src/configs/render.configs.ts` for all available keys.
140
187
 
141
188
  ---
142
189
 
@@ -144,6 +191,8 @@ All CSS variables (colors, stroke widths, opacities) are listed in `src/styles/m
144
191
 
145
192
  `@welldot/render` renders [`Well`](https://www.npmjs.com/package/@welldot/core) objects from `@welldot/core`. See that package for the `.well` file format specification, types, and validators.
146
193
 
194
+ **Version requirement:** Only `.well` v2 (`version: 2`) is supported. Pass raw JSON through `deserializeWell()` from `@welldot/core` before calling `draw()` — it normalizes v1 files to v2 automatically.
195
+
147
196
  ---
148
197
 
149
198
  ## License
@@ -286,4 +286,4 @@ var fgdcTextures_default = {
286
286
  export {
287
287
  fgdcTextures_default as default
288
288
  };
289
- //# sourceMappingURL=fgdcTextures-5IIUV7QV.js.map
289
+ //# sourceMappingURL=fgdcTextures-P5DTFNPT.js.map