gaugeit.js 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CONTRIBUTING.md +36 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE.md +5 -0
  4. package/README.md +894 -0
  5. package/SECURITY.md +24 -0
  6. package/adapters/react/Gaugeit.d.ts +11 -0
  7. package/adapters/react/Gaugeit.js +66 -0
  8. package/adapters/react/Gaugeit.jsx +1 -0
  9. package/dist/gaugeit.cjs +4686 -0
  10. package/dist/gaugeit.cjs.map +7 -0
  11. package/dist/gaugeit.css +300 -0
  12. package/dist/gaugeit.d.ts +442 -0
  13. package/dist/gaugeit.esm.js +4683 -0
  14. package/dist/gaugeit.esm.js.map +7 -0
  15. package/dist/gaugeit.esm.min.js +2 -0
  16. package/dist/gaugeit.esm.min.js.map +7 -0
  17. package/dist/gaugeit.min.cjs +2 -0
  18. package/dist/gaugeit.min.cjs.map +7 -0
  19. package/dist/gaugeit.min.css +1 -0
  20. package/dist/gaugeit.standalone.js +4720 -0
  21. package/dist/gaugeit.standalone.js.map +7 -0
  22. package/dist/gaugeit.standalone.min.js +302 -0
  23. package/dist/gaugeit.standalone.min.js.map +7 -0
  24. package/dist/gaugeit.umd.js +4713 -0
  25. package/dist/gaugeit.umd.js.map +7 -0
  26. package/dist/gaugeit.umd.min.js +4 -0
  27. package/dist/gaugeit.umd.min.js.map +7 -0
  28. package/dist/manifest.json +24 -0
  29. package/docs/api.md +456 -0
  30. package/docs/architecture.md +224 -0
  31. package/docs/assets/arc_zones.png +0 -0
  32. package/docs/assets/center_zero.png +0 -0
  33. package/docs/assets/classic_instrument.png +0 -0
  34. package/docs/assets/classic_linear_center_zero.png +0 -0
  35. package/docs/assets/classic_linear_instrument.png +0 -0
  36. package/docs/assets/heritage_rolling_tape.png +0 -0
  37. package/docs/assets/heritage_round.png +0 -0
  38. package/docs/assets/line_scale.png +0 -0
  39. package/docs/assets/rose_balance.png +0 -0
  40. package/docs/creating-gauge-types.md +286 -0
  41. package/docs/development.md +56 -0
  42. package/docs/framework-integration.md +84 -0
  43. package/package.json +114 -0
@@ -0,0 +1,442 @@
1
+ export type GaugeTarget = Element | string;
2
+ export type GaugeOverflow = 'clamp' | 'expand' | 'allow';
3
+ export type GaugePointerType = 'needle' | 'line' | 'arrow' | 'spear';
4
+ export type GaugeScalePosition = 'inside' | 'outside' | 'cross';
5
+ export type GaugeLabelRotation = 'horizontal' | 'radial' | 'tangent';
6
+ export type GaugeLayoutMode = 'intrinsic' | 'contain';
7
+ export type GaugeGeometryMode = 'radial' | 'linear' | 'tape';
8
+ export type GaugeLinearTickSide = 'negative' | 'positive' | 'cross';
9
+ export type GaugeLinearIndicatorType = 'hairline' | 'marker' | 'carriage';
10
+ export type GaugeLinearIndicatorPosition = 'negative' | 'positive' | 'cross';
11
+ export type GaugeScaleEndpointMode = 'auto' | 'both' | 'dedupe';
12
+ export type GaugeReadoutPosition = 'top' | 'center' | 'bottom';
13
+ export type GaugeCapStackOrder = 'above' | 'below';
14
+ export type GaugeOrientation = 'vertical' | 'horizontal';
15
+ export type GaugeLightColor = 'red' | 'green' | 'blue' | 'amber' | 'yellow' | 'orange' | 'white' | 'halogen' | 'cyan' | 'brown';
16
+ export type GaugeLightTriggerMode = 'manual' | 'below' | 'above' | 'between';
17
+ export type GaugeLightTriggerSource = 'target' | 'displayed' | 'pointer';
18
+ export type GaugeEasing = string | ((progress: number) => number);
19
+
20
+ export interface GaugeReadoutTextOptions {
21
+ visible?: boolean;
22
+ text?: string;
23
+ x?: number | 'auto';
24
+ y?: number | 'auto';
25
+ position?: GaugeReadoutPosition;
26
+ margin?: number;
27
+ offsetX?: number;
28
+ offsetY?: number;
29
+ color?: string;
30
+ fontFamily?: string;
31
+ fontSize?: number;
32
+ fontWeight?: string | number;
33
+ letterSpacing?: number;
34
+ }
35
+
36
+ export interface GaugeReadoutValueOptions extends GaugeReadoutTextOptions {
37
+ fractionDigits?: number;
38
+ prefix?: string;
39
+ suffix?: string;
40
+ locale?: string | string[];
41
+ formatter?: (value: number, context: GaugeFormatterContext) => string;
42
+ }
43
+
44
+ export interface GaugeLightOptions {
45
+ visible?: boolean;
46
+ x?: number;
47
+ y?: number;
48
+ radius?: number;
49
+ color?: GaugeLightColor;
50
+ customColor?: string;
51
+ /** Cream-toned unlit lens color. */
52
+ offColor?: string;
53
+ /** Darker unlit lens edge color. */
54
+ offEdgeColor?: string;
55
+ bezelColor?: string;
56
+ bezelHighlightColor?: string;
57
+ opacity?: number;
58
+ on?: boolean;
59
+ glow?: boolean;
60
+ /** Enables a very subtle steady-light breathing effect. */
61
+ pulse?: boolean;
62
+ pulseInterval?: number;
63
+ blink?: boolean;
64
+ blinkInterval?: number;
65
+ trigger?: {
66
+ mode?: GaugeLightTriggerMode;
67
+ /** Value stream used by threshold evaluation. Defaults to the requested target value. */
68
+ source?: GaugeLightTriggerSource;
69
+ value?: number;
70
+ min?: number;
71
+ max?: number;
72
+ };
73
+ }
74
+
75
+ export interface GaugeZone {
76
+ min: number;
77
+ max: number;
78
+ color?: string;
79
+ strokeStyle?: string;
80
+ width?: number;
81
+ /** Optional variable-width radial segment. Widths are measured at min and max. */
82
+ taper?: {
83
+ startWidth?: number;
84
+ endWidth?: number;
85
+ segments?: number;
86
+ };
87
+ radius?: number;
88
+ opacity?: number;
89
+ lineCap?: string;
90
+ className?: string;
91
+ offset?: number;
92
+ }
93
+
94
+ export interface GaugeOptions {
95
+ type?: string;
96
+ min?: number;
97
+ max?: number;
98
+ value?: number;
99
+ invert?: boolean;
100
+ overflow?: GaugeOverflow;
101
+ precision?: number;
102
+ className?: string;
103
+ layout?: {
104
+ mode?: GaugeLayoutMode;
105
+ padding?: number;
106
+ includeGeometry?: boolean;
107
+ };
108
+ geometry?: {
109
+ mode?: GaugeGeometryMode;
110
+ width?: number;
111
+ height?: number;
112
+ centerX?: number;
113
+ centerY?: number;
114
+ radius?: number;
115
+ startAngle?: number;
116
+ endAngle?: number;
117
+ preserveAspectRatio?: string;
118
+ /** Optional intrinsic design ratio. Resizable presets derive a missing dimension from it. */
119
+ aspectRatio?: number | null;
120
+ };
121
+ linear?: {
122
+ /** SVG Y coordinate used as the public Cartesian y=0 baseline. */
123
+ originY?: number;
124
+ startX?: number;
125
+ /** Positive values move upward from originY. */
126
+ startY?: number;
127
+ endX?: number;
128
+ /** Positive values move upward from originY. */
129
+ endY?: number;
130
+ tickSide?: GaugeLinearTickSide;
131
+ /** Positive values move toward the visual upper side of a left-to-right axis. */
132
+ labelOffset?: number;
133
+ /** Positive values move toward the visual upper side of a left-to-right axis. */
134
+ zoneOffset?: number;
135
+ };
136
+ centerZero?: {
137
+ zeroValue?: number;
138
+ symmetric?: boolean;
139
+ marker?: {
140
+ visible?: boolean;
141
+ radius?: number | null;
142
+ position?: GaugeLinearIndicatorPosition;
143
+ /** Positive values move upward on a left-to-right linear axis. */
144
+ centerOffset?: number;
145
+ length?: number;
146
+ width?: number;
147
+ color?: string;
148
+ opacity?: number;
149
+ lineCap?: string;
150
+ };
151
+ };
152
+ tape?: {
153
+ orientation?: GaugeOrientation;
154
+ x?: number;
155
+ y?: number;
156
+ width?: number;
157
+ height?: number;
158
+ cornerRadius?: number;
159
+ windowColor?: string;
160
+ windowStrokeColor?: string;
161
+ windowStrokeWidth?: number;
162
+ windowInnerStrokeColor?: string;
163
+ windowInnerStrokeWidth?: number;
164
+ stripColor?: string;
165
+ textColor?: string;
166
+ tickColor?: string;
167
+ minorTickColor?: string;
168
+ minorTickOpacity?: number;
169
+ majorTickWidth?: number;
170
+ minorTickWidth?: number;
171
+ majorTickLength?: number;
172
+ minorTickLength?: number;
173
+ tickInset?: number;
174
+ labelOffset?: number;
175
+ interval?: number | null;
176
+ minorSubdivisions?: number;
177
+ majorSpacing?: number;
178
+ indicatorColor?: string;
179
+ indicatorWidth?: number;
180
+ fadeSize?: number;
181
+ fadeColor?: string;
182
+ colorByZone?: boolean;
183
+ };
184
+ face?: {
185
+ visible?: boolean;
186
+ shape?: 'panel' | 'circle';
187
+ fit?: 'geometry' | 'content';
188
+ contentPadding?: number;
189
+ minWidth?: number | null;
190
+ minHeight?: number | null;
191
+ clipContent?: boolean;
192
+ x?: number;
193
+ y?: number;
194
+ width?: number;
195
+ height?: number;
196
+ cornerRadius?: number;
197
+ color?: string;
198
+ strokeColor?: string;
199
+ strokeWidth?: number;
200
+ innerStrokeColor?: string;
201
+ innerStrokeWidth?: number;
202
+ shadow?: boolean;
203
+ glass?: boolean;
204
+ };
205
+ track?: {
206
+ visible?: boolean;
207
+ color?: string;
208
+ width?: number;
209
+ radius?: number;
210
+ opacity?: number;
211
+ lineCap?: string;
212
+ showUnderZones?: boolean;
213
+ };
214
+ zones?: GaugeZone[];
215
+ scale?: {
216
+ endpointMode?: GaugeScaleEndpointMode;
217
+ radius?: number;
218
+ position?: GaugeScalePosition;
219
+ major?: {
220
+ visible?: boolean;
221
+ interval?: number | null;
222
+ divisions?: number;
223
+ length?: number;
224
+ width?: number;
225
+ color?: string;
226
+ opacity?: number;
227
+ };
228
+ minor?: {
229
+ visible?: boolean;
230
+ subdivisions?: number;
231
+ length?: number;
232
+ width?: number;
233
+ color?: string;
234
+ opacity?: number;
235
+ };
236
+ };
237
+ labels?: {
238
+ visible?: boolean;
239
+ interval?: number | null;
240
+ radius?: number;
241
+ color?: string;
242
+ fontFamily?: string;
243
+ fontSize?: number;
244
+ fontWeight?: string | number;
245
+ fractionDigits?: number;
246
+ rotation?: GaugeLabelRotation;
247
+ formatter?: (value: number, context: GaugeFormatterContext) => string;
248
+ };
249
+ pointer?: {
250
+ visible?: boolean;
251
+ type?: GaugePointerType;
252
+ length?: number;
253
+ shaftLength?: number | null;
254
+ tailLength?: number;
255
+ width?: number;
256
+ color?: string;
257
+ strokeColor?: string;
258
+ strokeWidth?: number;
259
+ opacity?: number;
260
+ colorByZone?: boolean;
261
+ cap?: {
262
+ visible?: boolean;
263
+ /** SVG paint order relative to the pointer shape. */
264
+ stackOrder?: GaugeCapStackOrder;
265
+ radius?: number;
266
+ color?: string;
267
+ strokeColor?: string;
268
+ strokeWidth?: number;
269
+ };
270
+ };
271
+ indicator?: {
272
+ visible?: boolean;
273
+ type?: GaugeLinearIndicatorType;
274
+ position?: GaugeLinearIndicatorPosition;
275
+ length?: number;
276
+ centerOffset?: number;
277
+ /** @deprecated Use centerOffset. Positive legacy offsets moved toward the positive axis normal. */
278
+ offset?: number;
279
+ width?: number;
280
+ color?: string;
281
+ strokeColor?: string;
282
+ strokeWidth?: number;
283
+ opacity?: number;
284
+ lineCap?: string;
285
+ colorByZone?: boolean;
286
+ markerSize?: number;
287
+ carriageWidth?: number;
288
+ carriageRadius?: number;
289
+ cap?: {
290
+ visible?: boolean;
291
+ /** SVG paint order relative to the linear indicator shape. */
292
+ stackOrder?: GaugeCapStackOrder;
293
+ radius?: number;
294
+ color?: string;
295
+ strokeColor?: string;
296
+ strokeWidth?: number;
297
+ };
298
+ };
299
+ light?: GaugeLightOptions;
300
+ readout?: {
301
+ visible?: boolean;
302
+ title?: GaugeReadoutTextOptions;
303
+ value?: GaugeReadoutValueOptions;
304
+ unit?: GaugeReadoutTextOptions;
305
+ };
306
+ animation?: {
307
+ enabled?: boolean;
308
+ duration?: number;
309
+ easing?: GaugeEasing;
310
+ animateOnInit?: boolean;
311
+ startFrom?: 'min' | 'max' | 'value' | number;
312
+ respectReducedMotion?: boolean;
313
+ };
314
+ effects?: {
315
+ jitter?: {
316
+ enabled?: boolean;
317
+ amplitude?: number;
318
+ amplitudeUnit?: 'value' | 'percent';
319
+ frequency?: number;
320
+ smoothing?: number;
321
+ whenIdleOnly?: boolean;
322
+ };
323
+ };
324
+ accessibility?: {
325
+ label?: string;
326
+ description?: string;
327
+ valueText?: string | ((value: number, options: GaugeOptions) => string);
328
+ };
329
+ performance?: {
330
+ pauseWhenHidden?: boolean;
331
+ pauseWhenOffscreen?: boolean;
332
+ };
333
+ responsive?: boolean;
334
+ }
335
+
336
+ export interface GaugeFormatterContext {
337
+ min: number;
338
+ max: number;
339
+ options: GaugeOptions;
340
+ }
341
+
342
+ export interface GaugeValueUpdateOptions {
343
+ animate?: boolean;
344
+ duration?: number;
345
+ easing?: GaugeEasing;
346
+ }
347
+
348
+ export interface GaugeLayer {
349
+ id?: string;
350
+ render(context: GaugeRenderContext): void | GaugeLayerController;
351
+ }
352
+
353
+ export interface GaugeLayerController {
354
+ update(value: number, state: GaugeRenderState): void;
355
+ destroy?(): void;
356
+ }
357
+
358
+ export interface GaugeRenderState {
359
+ gauge: Gauge;
360
+ targetValue: number;
361
+ baseValue: number;
362
+ pointerValue: number;
363
+ animated: boolean;
364
+ jitterOffset: number;
365
+ }
366
+
367
+ export interface GaugeTypeDefinition {
368
+ description?: string;
369
+ defaults?: GaugeOptions;
370
+ /** Optional type-level normalization hook used by resizable or specialized presets. */
371
+ configure?: (
372
+ options: GaugeOptions,
373
+ context: { requested: GaugeOptions; typeDefaults: GaugeOptions }
374
+ ) => GaugeOptions | void;
375
+ layers: GaugeLayer[];
376
+ }
377
+
378
+ export interface GaugeRenderContext {
379
+ gauge: Gauge;
380
+ options: GaugeOptions;
381
+ renderer: unknown;
382
+ registry: GaugeTypeRegistry;
383
+ }
384
+
385
+ export class Gauge {
386
+ constructor(target: GaugeTarget, options: GaugeOptions, registry: GaugeTypeRegistry);
387
+ render(): this;
388
+ setValue(value: number, options?: GaugeValueUpdateOptions): this;
389
+ set(value: number, options?: GaugeValueUpdateOptions): this;
390
+ updateOptions(options: GaugeOptions, behavior?: { animateToValue?: boolean }): this;
391
+ replaceOptions(options: GaugeOptions, behavior?: { animateToValue?: boolean }): this;
392
+ setOptions(options: GaugeOptions, behavior?: { animateToValue?: boolean }): this;
393
+ getValue(): number;
394
+ getDisplayedValue(): number;
395
+ pause(): this;
396
+ resume(): this;
397
+ refresh(): this;
398
+ destroy(): void;
399
+ }
400
+
401
+ export class GaugeTypeRegistry {
402
+ register(name: string, definition: GaugeTypeDefinition): this;
403
+ get(name: string): GaugeTypeDefinition;
404
+ has(name: string): boolean;
405
+ names(): string[];
406
+ describe(): Array<{ name: string; description: string }>;
407
+ }
408
+
409
+ export function createGauge(target: GaugeTarget, options?: GaugeOptions): Gauge;
410
+ export function registerGaugeType(name: string, definition: GaugeTypeDefinition): typeof Gaugeit;
411
+ export function autoMount(selector?: string, root?: ParentNode): Gauge[];
412
+ export function defineGaugeitElement(tagName?: string): CustomElementConstructor | null;
413
+ export function getMountedGauge(element: Element): Gauge | null;
414
+ export function unmountGauge(element: Element): boolean;
415
+
416
+ export const VERSION: string;
417
+ export const layers: Record<string, GaugeLayer>;
418
+ export const types: Record<string, GaugeTypeDefinition>;
419
+ export const geometry: Record<string, (...args: any[]) => any>;
420
+ export const easingNames: readonly string[];
421
+ export const gaugeTypeRegistry: GaugeTypeRegistry;
422
+ export const deepMerge: (base: unknown, override: unknown) => unknown;
423
+
424
+ declare const Gaugeit: {
425
+ VERSION: string;
426
+ Gauge: typeof Gauge;
427
+ GaugeTypeRegistry: typeof GaugeTypeRegistry;
428
+ createGauge: typeof createGauge;
429
+ registerGaugeType: typeof registerGaugeType;
430
+ autoMount: typeof autoMount;
431
+ defineGaugeitElement: typeof defineGaugeitElement;
432
+ getMountedGauge: typeof getMountedGauge;
433
+ unmountGauge: typeof unmountGauge;
434
+ registry: GaugeTypeRegistry;
435
+ types: typeof types;
436
+ layers: typeof layers;
437
+ geometry: typeof geometry;
438
+ deepMerge: typeof deepMerge;
439
+ easingNames: typeof easingNames;
440
+ };
441
+
442
+ export default Gaugeit;