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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/standalone.js", "../src/gaugeit.css", "../src/core/utils.js", "../src/geometry/scale.js", "../src/geometry/linear.js", "../src/geometry/tape.js", "../src/geometry/light.js", "../src/geometry/bounds.js", "../src/renderer/svg.js", "../src/core/easing.js", "../src/core/defaults.js", "../src/core/options.js", "../src/core/gauge.js", "../src/core/registry.js", "../src/layers/face.js", "../src/layers/zones.js", "../src/layers/ticks.js", "../src/layers/labels.js", "../src/layers/pointer.js", "../src/layers/readout.js", "../src/layers/light.js", "../src/types/arc.js", "../src/types/classic.js", "../src/types/line-scale.js", "../src/types/heritage-round.js", "../src/layers/linear-zones.js", "../src/layers/linear-ticks.js", "../src/layers/linear-labels.js", "../src/layers/linear-indicator.js", "../src/types/instrument-sizing.js", "../src/types/classic-linear.js", "../src/layers/zero-marker.js", "../src/types/classic-linear-zero.js", "../src/types/center-zero.js", "../src/layers/rolling-tape.js", "../src/types/rolling-tape.js", "../src/types/register-builtins.js", "../src/core/auto-mount.js", "../src/web-component.js", "../src/index.js"],
4
+ "sourcesContent": ["import css from './gaugeit.css';\nimport Gaugeit from './index.js';\n\nexport * from './index.js';\n\nconst STYLE_ID = 'gaugeit-styles';\n\nif (typeof document !== 'undefined' && !document.getElementById(STYLE_ID)) {\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.dataset.gaugeitStyles = 'standalone';\n style.textContent = css;\n (document.head || document.documentElement).append(style);\n}\n\nexport default Gaugeit;\n", "/* Gaugeit.js baseline styles. Visual geometry is rendered by SVG; CSS only handles layout and integration. */\n.gaugeit-host {\n display: block;\n min-width: 0;\n width: var(--gaugeit-width, auto);\n height: var(--gaugeit-height, auto);\n aspect-ratio: var(--gaugeit-aspect-ratio, auto);\n}\n\n.gaugeit {\n display: block;\n width: 100%;\n min-width: 0;\n color: var(--gaugeit-text-color, inherit);\n font-family: var(--gaugeit-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);\n contain: layout style;\n}\n\n.gaugeit__svg {\n display: block;\n width: 100%;\n max-width: 100%;\n height: auto;\n overflow: hidden;\n user-select: none;\n -webkit-user-select: none;\n touch-action: pan-y;\n}\n\n.gaugeit__pointer-rotating,\n.gaugeit__linear-indicator-moving,\n.gaugeit__tape-slot {\n will-change: transform;\n}\n\n.gaugeit__pointer,\n.gaugeit__pointer-cap,\n.gaugeit__linear-indicator,\n.gaugeit__linear-indicator-cap,\n.gaugeit__tape-window,\n.gaugeit__tape-window-inner,\n.gaugeit__tape-indicator,\n.gaugeit__zero-marker,\n.gaugeit__ticks,\n.gaugeit__zone,\n.gaugeit__track {\n shape-rendering: geometricPrecision;\n}\n\n.gaugeit__label,\n.gaugeit__readout,\n.gaugeit__tape-label {\n paint-order: stroke fill;\n font-variant-numeric: tabular-nums;\n}\n\ngauge-it {\n display: block;\n min-width: 0;\n}\n\n.gaugeit-element__mount {\n display: block;\n width: 100%;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .gaugeit__pointer-rotating,\n .gaugeit__linear-indicator-moving,\n .gaugeit__tape-slot {\n will-change: auto;\n }\n}\n\n@media (forced-colors: active) {\n .gaugeit__pointer,\n .gaugeit__pointer-cap,\n .gaugeit__linear-indicator,\n .gaugeit__linear-indicator-cap,\n .gaugeit__tape-window,\n .gaugeit__tape-window-inner,\n .gaugeit__tape-indicator,\n .gaugeit__zero-marker,\n .gaugeit__ticks,\n .gaugeit__label,\n .gaugeit__readout,\n .gaugeit__light {\n forced-color-adjust: auto;\n }\n}\n\n/* Intrinsic mode grows with the computed SVG viewBox; contain mode fits a fixed host box. */\n.gaugeit--layout-intrinsic {\n height: auto;\n}\n\n.gaugeit--layout-contain {\n width: 100%;\n height: 100%;\n min-height: 0;\n}\n\n.gaugeit--layout-contain .gaugeit__svg {\n width: 100%;\n height: 100%;\n max-height: 100%;\n}\n\n/* Shared SVG annunciator lamp. Colors are themeable through CSS variables or light.customColor. */\n.gaugeit__light {\n --gaugeit-light-core: #f59e0b;\n --gaugeit-light-highlight: #fde68a;\n --gaugeit-light-glow: #fbbf24;\n --gaugeit-light-rim: #92400e;\n --gaugeit-light-off: #3f2d12;\n --gaugeit-light-opacity: 1;\n pointer-events: none;\n opacity: var(--gaugeit-light-opacity);\n}\n\n.gaugeit__light--red {\n --gaugeit-light-core: #ef4444;\n --gaugeit-light-highlight: #fecaca;\n --gaugeit-light-glow: #f87171;\n --gaugeit-light-rim: #7f1d1d;\n --gaugeit-light-off: #3f1c1c;\n}\n\n.gaugeit__light--green {\n --gaugeit-light-core: #22c55e;\n --gaugeit-light-highlight: #bbf7d0;\n --gaugeit-light-glow: #4ade80;\n --gaugeit-light-rim: #14532d;\n --gaugeit-light-off: #182c1e;\n}\n\n.gaugeit__light--blue {\n --gaugeit-light-core: #3b82f6;\n --gaugeit-light-highlight: #bfdbfe;\n --gaugeit-light-glow: #60a5fa;\n --gaugeit-light-rim: #1e3a8a;\n --gaugeit-light-off: #1b2438;\n}\n\n.gaugeit__light--amber {\n --gaugeit-light-core: #f59e0b;\n --gaugeit-light-highlight: #fde68a;\n --gaugeit-light-glow: #fbbf24;\n --gaugeit-light-rim: #92400e;\n --gaugeit-light-off: #3f2d12;\n}\n\n.gaugeit__light--yellow {\n --gaugeit-light-core: #fde047;\n --gaugeit-light-highlight: #fef9c3;\n --gaugeit-light-glow: #facc15;\n --gaugeit-light-rim: #a16207;\n --gaugeit-light-off: #443a16;\n}\n\n.gaugeit__light--orange {\n --gaugeit-light-core: #f97316;\n --gaugeit-light-highlight: #fed7aa;\n --gaugeit-light-glow: #fb923c;\n --gaugeit-light-rim: #9a3412;\n --gaugeit-light-off: #462515;\n}\n\n.gaugeit__light--white {\n --gaugeit-light-core: #f8fafc;\n --gaugeit-light-highlight: #ffffff;\n --gaugeit-light-glow: #e2e8f0;\n --gaugeit-light-rim: #64748b;\n --gaugeit-light-off: #3f4955;\n}\n\n.gaugeit__light--halogen {\n --gaugeit-light-core: #fff2bf;\n --gaugeit-light-highlight: #fffdf0;\n --gaugeit-light-glow: #ffe79a;\n --gaugeit-light-rim: #9a7b24;\n --gaugeit-light-off: #4d4326;\n}\n\n.gaugeit__light--cyan {\n --gaugeit-light-core: #22d3ee;\n --gaugeit-light-highlight: #cffafe;\n --gaugeit-light-glow: #67e8f9;\n --gaugeit-light-rim: #155e75;\n --gaugeit-light-off: #18343a;\n}\n\n.gaugeit__light--brown {\n --gaugeit-light-core: #a16207;\n --gaugeit-light-highlight: #f5d0a1;\n --gaugeit-light-glow: #d6a56b;\n --gaugeit-light-rim: #5b3b10;\n --gaugeit-light-off: #332617;\n}\n\n.gaugeit__light-emission {\n pointer-events: none;\n transition: opacity 150ms ease;\n}\n\n.gaugeit__light-emission--off {\n opacity: var(--gaugeit-light-opacity, 1);\n}\n\n.gaugeit__light-emission--on {\n opacity: 0;\n}\n\n.gaugeit__light-glow {\n opacity: 0.76;\n transform-box: fill-box;\n transform-origin: center;\n}\n\n.gaugeit__light:not(.has-glow) .gaugeit__light-glow {\n display: none;\n}\n\n.gaugeit__light-bezel,\n.gaugeit__light-bezel-highlight,\n.gaugeit__light-bulb,\n.gaugeit__light-lens-shade,\n.gaugeit__light-sparkle {\n shape-rendering: geometricPrecision;\n}\n\n.gaugeit__light-bulb {\n transform-box: fill-box;\n transform-origin: center;\n transition: filter 150ms ease;\n}\n\n.gaugeit__light.is-on:not(.is-blinking) .gaugeit__light-emission--off {\n opacity: 0;\n}\n\n.gaugeit__light.is-on:not(.is-blinking) .gaugeit__light-emission--on {\n opacity: var(--gaugeit-light-opacity, 1);\n}\n\n.gaugeit__light.is-on .gaugeit__light-bulb--on {\n filter: saturate(1.08) brightness(1.05);\n}\n\n.gaugeit__light.is-pulsing .gaugeit__light-glow {\n animation: gaugeit-light-pulse-glow var(--gaugeit-light-pulse-duration, 2600ms) ease-in-out infinite;\n}\n\n.gaugeit__light.is-pulsing .gaugeit__light-bulb--on {\n animation: gaugeit-light-pulse-lens var(--gaugeit-light-pulse-duration, 2600ms) ease-in-out infinite;\n}\n\n.gaugeit__light.is-on.is-blinking .gaugeit__light-emission--on {\n animation: gaugeit-light-blink-on var(--gaugeit-light-blink-duration, 1000ms) step-end infinite;\n}\n\n.gaugeit__light.is-on.is-blinking .gaugeit__light-emission--off {\n animation: gaugeit-light-blink-off var(--gaugeit-light-blink-duration, 1000ms) step-end infinite;\n}\n\n@keyframes gaugeit-light-pulse-glow {\n 0%, 100% { opacity: 0.72; transform: scale(0.99); }\n 50% { opacity: 0.8; transform: scale(1.015); }\n}\n\n@keyframes gaugeit-light-pulse-lens {\n 0%, 100% { filter: saturate(1.06) brightness(1.04); }\n 50% { filter: saturate(1.1) brightness(1.07); }\n}\n\n@keyframes gaugeit-light-blink-on {\n 0%, 48% { opacity: var(--gaugeit-light-opacity, 1); }\n 49%, 100% { opacity: 0; }\n}\n\n@keyframes gaugeit-light-blink-off {\n 0%, 48% { opacity: 0; }\n 49%, 100% { opacity: var(--gaugeit-light-opacity, 1); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .gaugeit__light.is-blinking .gaugeit__light-emission,\n .gaugeit__light.is-pulsing .gaugeit__light-glow,\n .gaugeit__light.is-pulsing .gaugeit__light-bulb--on {\n animation: none;\n }\n\n .gaugeit__light.is-on.is-blinking .gaugeit__light-emission--off {\n opacity: 0;\n }\n\n .gaugeit__light.is-on.is-blinking .gaugeit__light-emission--on {\n opacity: var(--gaugeit-light-opacity, 1);\n }\n}\n", "/** Returns true when a value is a plain object, including objects from another realm. */\nexport function isPlainObject(value) {\n if (value === null || typeof value !== 'object') return false;\n if (Object.prototype.toString.call(value) !== '[object Object]') return false;\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype === null || prototype === Object.prototype) return true;\n\n // Objects created in an iframe or another Window have a different Object.prototype.\n // Constructor identity therefore cannot be compared directly across realms.\n const constructor = Object.prototype.hasOwnProperty.call(prototype, 'constructor')\n ? prototype.constructor\n : null;\n return typeof constructor === 'function' && constructor.name === 'Object';\n}\n\n/** Deeply merges plain objects. Arrays are replaced, not concatenated. */\nexport function deepMerge(base, override) {\n if (!isPlainObject(base)) return cloneValue(override);\n const result = { ...base };\n if (!isPlainObject(override)) return result;\n\n for (const [key, value] of Object.entries(override)) {\n if (isUnsafeObjectKey(key)) continue;\n if (isPlainObject(value) && isPlainObject(result[key])) {\n result[key] = deepMerge(result[key], value);\n } else {\n result[key] = cloneValue(value);\n }\n }\n\n return result;\n}\n\n/** Clones configuration data while preserving callback functions. */\nexport function cloneValue(value) {\n if (Array.isArray(value)) return value.map(cloneValue);\n if (isPlainObject(value)) {\n const copy = {};\n for (const [key, child] of Object.entries(value)) {\n if (!isUnsafeObjectKey(key)) copy[key] = cloneValue(child);\n }\n return copy;\n }\n return value;\n}\n\nfunction isUnsafeObjectKey(key) {\n return key === '__proto__' || key === 'prototype' || key === 'constructor';\n}\n\n/** Clamps a number to an inclusive range. */\nexport function clamp(value, min, max) {\n return Math.min(max, Math.max(min, value));\n}\n\n/** Returns a finite number or the supplied fallback. */\nexport function finiteNumber(value, fallback) {\n const number = Number(value);\n return Number.isFinite(number) ? number : fallback;\n}\n\n/** Returns a unique, stable identifier for generated SVG definitions. */\nlet idCounter = 0;\nexport function uniqueId(prefix = 'gaugeit') {\n idCounter += 1;\n return `${prefix}-${idCounter}`;\n}\n\n/** Resolves either an element or a CSS selector into an element. */\nexport function resolveElement(target) {\n if (typeof target === 'string') {\n const element = document.querySelector(target);\n if (!element) throw new Error(`Gaugeit target not found: ${target}`);\n return element;\n }\n\n if (target && typeof target === 'object' && target.nodeType === 1) return target;\n throw new TypeError('Gaugeit target must be an Element or a valid CSS selector.');\n}\n\n/** Returns true for transparent CSS color values supported by Gaugeit. */\nexport function isTransparentColor(color) {\n if (color === null || color === undefined) return true;\n const normalized = String(color).trim().toLowerCase();\n return normalized === '' || normalized === 'transparent' || normalized === 'none';\n}\n\n/** Performs a shallow equality check for small state objects. */\nexport function shallowEqual(left, right) {\n if (left === right) return true;\n if (!left || !right) return false;\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n if (leftKeys.length !== rightKeys.length) return false;\n return leftKeys.every((key) => Object.is(left[key], right[key]));\n}\n\n/** Defers a callback to the next animation frame with a safe fallback. */\nexport function requestFrame(callback) {\n if (typeof requestAnimationFrame === 'function') return requestAnimationFrame(callback);\n return setTimeout(() => callback(Date.now()), 16);\n}\n\n/** Cancels a scheduled animation frame or fallback timer. */\nexport function cancelFrame(handle) {\n if (handle === null || handle === undefined) return;\n if (typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(handle);\n return;\n }\n clearTimeout(handle);\n}\n\n/** Dispatches a namespaced CustomEvent when the platform supports it. */\nexport function dispatchGaugeEvent(target, name, detail) {\n if (!target || typeof target.dispatchEvent !== 'function' || typeof CustomEvent !== 'function') return;\n target.dispatchEvent(new CustomEvent(`gaugeit:${name}`, { detail }));\n}\n\n/** Parses a JSON object without throwing on malformed data attributes. */\nexport function parseJsonObject(value, fallback = {}) {\n if (typeof value !== 'string' || value.trim() === '') return fallback;\n try {\n const parsed = JSON.parse(value);\n return isPlainObject(parsed) ? parsed : fallback;\n } catch {\n return fallback;\n }\n}\n", "import { clamp, finiteNumber } from '../core/utils.js';\n\n/** Converts degrees to radians. */\nexport function degreesToRadians(degrees) {\n return degrees * Math.PI / 180;\n}\n\n/** Converts a polar coordinate into an SVG coordinate. */\nexport function polarPoint(centerX, centerY, radius, angleDegrees) {\n const radians = degreesToRadians(angleDegrees);\n return {\n x: centerX + radius * Math.cos(radians),\n y: centerY + radius * Math.sin(radians)\n };\n}\n\n/** Returns the configured angular sweep in degrees. */\nexport function gaugeSweep(options) {\n return options.geometry.endAngle - options.geometry.startAngle;\n}\n\n/**\n * Creates start/end angles from a developer-facing center angle.\n * Center angle 0 preserves Gaugeit.js's upright default orientation, which is\n * SVG angle 270. Positive values rotate the complete sweep clockwise.\n */\nexport function centeredArcAngles(sweep, centerAngle = 0) {\n const safeSweep = Math.min(360, Math.max(0.001, Math.abs(finiteNumber(sweep, 180))));\n const svgCenter = 270 + finiteNumber(centerAngle, 0);\n const halfSweep = safeSweep / 2;\n return {\n startAngle: svgCenter - halfSweep,\n endAngle: svgCenter + halfSweep\n };\n}\n\n/** Maps a gauge value to an angle. */\nexport function valueToAngle(value, options, clampValue = true) {\n const min = options.min;\n const max = options.max;\n const normalizedValue = clampValue ? clamp(value, min, max) : value;\n const valueRatio = (normalizedValue - min) / (max - min);\n const visualRatio = options.invert ? 1 - valueRatio : valueRatio;\n return options.geometry.startAngle + gaugeSweep(options) * visualRatio;\n}\n\n/** Maps an angle back to a gauge value. */\nexport function angleToValue(angle, options, clampResult = true) {\n const sweep = gaugeSweep(options);\n const visualRatio = (angle - options.geometry.startAngle) / sweep;\n const valueRatio = options.invert ? 1 - visualRatio : visualRatio;\n const value = options.min + valueRatio * (options.max - options.min);\n return clampResult ? clamp(value, options.min, options.max) : value;\n}\n\n/** Builds an SVG arc path between two angles. */\nexport function arcPath(centerX, centerY, radius, startAngle, endAngle) {\n const start = polarPoint(centerX, centerY, radius, startAngle);\n const end = polarPoint(centerX, centerY, radius, endAngle);\n const delta = endAngle - startAngle;\n const sweepFlag = delta >= 0 ? 1 : 0;\n\n // SVG cannot represent a complete circle with one arc command because the\n // start and end points coincide. Two half-arcs keep 360-degree tracks and\n // zones visible in every browser.\n if (Math.abs(delta) >= 360 - 0.001) {\n const midpoint = polarPoint(centerX, centerY, radius, startAngle + delta / 2);\n return [\n `M ${roundSvg(start.x)} ${roundSvg(start.y)}`,\n `A ${roundSvg(radius)} ${roundSvg(radius)} 0 1 ${sweepFlag} ${roundSvg(midpoint.x)} ${roundSvg(midpoint.y)}`,\n `A ${roundSvg(radius)} ${roundSvg(radius)} 0 1 ${sweepFlag} ${roundSvg(end.x)} ${roundSvg(end.y)}`\n ].join(' ');\n }\n\n const largeArcFlag = Math.abs(delta) > 180 ? 1 : 0;\n return [\n `M ${roundSvg(start.x)} ${roundSvg(start.y)}`,\n `A ${roundSvg(radius)} ${roundSvg(radius)} 0 ${largeArcFlag} ${sweepFlag} ${roundSvg(end.x)} ${roundSvg(end.y)}`\n ].join(' ');\n}\n\n\n/**\n * Builds a filled annular segment whose thickness changes smoothly from\n * startWidth to endWidth. SVG strokes cannot vary width along one path, so the\n * tapered zone is represented by sampled outer and inner boundaries.\n */\nexport function taperedArcPath(\n centerX,\n centerY,\n radius,\n startAngle,\n endAngle,\n startWidth,\n endWidth,\n segments = 48\n) {\n const delta = endAngle - startAngle;\n const sampleCount = Math.max(2, Math.min(256, Math.ceil(finiteNumber(segments, 48))));\n const safeRadius = Math.max(0, finiteNumber(radius, 0));\n const firstWidth = Math.max(0, finiteNumber(startWidth, 0));\n const lastWidth = Math.max(0, finiteNumber(endWidth, firstWidth));\n const outer = [];\n const inner = [];\n\n for (let index = 0; index <= sampleCount; index += 1) {\n const ratio = index / sampleCount;\n const angle = startAngle + delta * ratio;\n const width = firstWidth + (lastWidth - firstWidth) * ratio;\n outer.push(polarPoint(centerX, centerY, safeRadius + width / 2, angle));\n inner.push(polarPoint(centerX, centerY, Math.max(0, safeRadius - width / 2), angle));\n }\n\n const commands = [`M ${roundSvg(outer[0].x)} ${roundSvg(outer[0].y)}`];\n for (let index = 1; index < outer.length; index += 1) {\n commands.push(`L ${roundSvg(outer[index].x)} ${roundSvg(outer[index].y)}`);\n }\n for (let index = inner.length - 1; index >= 0; index -= 1) {\n commands.push(`L ${roundSvg(inner[index].x)} ${roundSvg(inner[index].y)}`);\n }\n commands.push('Z');\n return commands.join(' ');\n}\n\n/** Selects a human-friendly interval for a numeric range. */\nexport function niceInterval(range, desiredDivisions = 5) {\n const safeRange = Math.abs(finiteNumber(range, 1)) || 1;\n const raw = safeRange / Math.max(1, desiredDivisions);\n const exponent = Math.floor(Math.log10(raw));\n const fraction = raw / Math.pow(10, exponent);\n let niceFraction;\n if (fraction <= 1) niceFraction = 1;\n else if (fraction <= 2) niceFraction = 2;\n else if (fraction <= 2.5) niceFraction = 2.5;\n else if (fraction <= 5) niceFraction = 5;\n else niceFraction = 10;\n return niceFraction * Math.pow(10, exponent);\n}\n\n/** Builds inclusive values for ticks or labels without floating-point drift. */\nexport function buildScaleValues(min, max, interval) {\n const safeInterval = Math.abs(finiteNumber(interval, 0));\n if (safeInterval <= 0 || max <= min) return [min, max];\n\n const precision = Math.min(12, Math.max(0, decimalPlaces(safeInterval) + 2));\n const epsilon = safeInterval / 1_000_000;\n const values = [];\n let current = min;\n let guard = 0;\n\n while (current <= max + epsilon && guard < 10_000) {\n values.push(roundTo(current, precision));\n current += safeInterval;\n guard += 1;\n }\n\n if (values.length === 0 || Math.abs(values[values.length - 1] - max) > epsilon) {\n values.push(max);\n } else {\n values[values.length - 1] = max;\n }\n\n return values;\n}\n\n/** Builds minor tick values between major values. */\nexport function buildMinorValues(majorValues, subdivisions) {\n const count = Math.max(0, Math.floor(finiteNumber(subdivisions, 0)));\n if (count === 0 || majorValues.length < 2) return [];\n\n const values = [];\n for (let index = 0; index < majorValues.length - 1; index += 1) {\n const start = majorValues[index];\n const end = majorValues[index + 1];\n const step = (end - start) / (count + 1);\n for (let subdivision = 1; subdivision <= count; subdivision += 1) {\n values.push(start + step * subdivision);\n }\n }\n return values;\n}\n\n/** Produces non-overlapping visual segments, allowing transparent zones to create true gaps. */\nexport function resolveZoneSegments(min, max, zones) {\n const normalized = Array.isArray(zones)\n ? zones\n .filter((zone) => zone && typeof zone === 'object')\n .map((zone, index) => ({\n ...zone,\n min: clamp(finiteNumber(zone.min, min), min, max),\n max: clamp(finiteNumber(zone.max, max), min, max),\n _index: index\n }))\n .filter((zone) => zone.max > zone.min)\n : [];\n\n const breakpoints = new Set([min, max]);\n for (const zone of normalized) {\n breakpoints.add(zone.min);\n breakpoints.add(zone.max);\n }\n\n const points = [...breakpoints].sort((left, right) => left - right);\n const segments = [];\n\n for (let index = 0; index < points.length - 1; index += 1) {\n const segmentMin = points[index];\n const segmentMax = points[index + 1];\n const midpoint = (segmentMin + segmentMax) / 2;\n const candidates = normalized.filter((zone) => midpoint >= zone.min && midpoint <= zone.max);\n const zone = candidates.length ? candidates[candidates.length - 1] : null;\n segments.push({ min: segmentMin, max: segmentMax, zone });\n }\n\n return segments;\n}\n\n/** Returns the last configured zone that contains a value. */\nexport function findZoneForValue(value, zones) {\n if (!Array.isArray(zones)) return null;\n let match = null;\n for (const zone of zones) {\n if (!zone || typeof zone !== 'object') continue;\n if (value >= Number(zone.min) && value <= Number(zone.max)) match = zone;\n }\n return match;\n}\n\n/** Rounds coordinates to keep generated SVG markup compact. */\nexport function roundSvg(value) {\n return Math.round(value * 1000) / 1000;\n}\n\nfunction roundTo(value, precision) {\n const factor = Math.pow(10, precision);\n return Math.round(value * factor) / factor;\n}\n\nfunction decimalPlaces(value) {\n const text = String(value).toLowerCase();\n if (text.includes('e-')) return Number(text.split('e-')[1]);\n const decimal = text.split('.')[1];\n return decimal ? decimal.length : 0;\n}\n", "import { clamp, finiteNumber } from '../core/utils.js';\n\n/** Converts a public Cartesian-style linear Y coordinate to SVG space. */\nexport function linearYToSvg(y, options) {\n const linear = options.linear || {};\n const originY = finiteNumber(linear.originY, 140);\n return originY - finiteNumber(y, 0);\n}\n\n/** Returns a normalized two-dimensional axis for a linear gauge. */\nexport function linearAxis(options) {\n const linear = options.linear || {};\n const startX = finiteNumber(linear.startX, 36);\n const startY = linearYToSvg(linear.startY, options);\n let endX = finiteNumber(linear.endX, 284);\n let endY = linearYToSvg(linear.endY, options);\n let dx = endX - startX;\n let dy = endY - startY;\n let length = Math.hypot(dx, dy);\n\n if (length < 0.001) {\n endX = startX + 1;\n endY = startY;\n dx = 1;\n dy = 0;\n length = 1;\n }\n\n const tangentX = dx / length;\n const tangentY = dy / length;\n return {\n startX,\n startY,\n endX,\n endY,\n dx,\n dy,\n length,\n tangentX,\n tangentY,\n normalX: -tangentY,\n normalY: tangentX,\n angle: Math.atan2(dy, dx) * 180 / Math.PI\n };\n}\n\n/** Maps a value to a normalized position along a linear gauge. */\nexport function valueToLinearRatio(value, options, clampValue = true) {\n const normalizedValue = clampValue ? clamp(value, options.min, options.max) : value;\n const valueRatio = (normalizedValue - options.min) / (options.max - options.min);\n return options.invert ? 1 - valueRatio : valueRatio;\n}\n\n/** Maps a value to a point on the configured linear axis. */\nexport function valueToLinearPoint(value, options, clampValue = true) {\n const axis = linearAxis(options);\n const ratio = valueToLinearRatio(value, options, clampValue);\n return {\n x: axis.startX + axis.dx * ratio,\n y: axis.startY + axis.dy * ratio\n };\n}\n\n/** Maps an arbitrary point back to a value by projecting it onto the linear axis. */\nexport function linearPointToValue(x, y, options, clampResult = true) {\n const axis = linearAxis(options);\n const relativeX = finiteNumber(x, axis.startX) - axis.startX;\n const relativeY = finiteNumber(y, axis.startY) - axis.startY;\n const visualRatio = (relativeX * axis.tangentX + relativeY * axis.tangentY) / axis.length;\n const boundedVisualRatio = clampResult ? clamp(visualRatio, 0, 1) : visualRatio;\n const valueRatio = options.invert ? 1 - boundedVisualRatio : boundedVisualRatio;\n const value = options.min + valueRatio * (options.max - options.min);\n return clampResult ? clamp(value, options.min, options.max) : value;\n}\n\n/** Offsets a point along the axis normal. Negative values use the upper side of a left-to-right axis. */\nexport function offsetLinearPoint(point, axis, distance) {\n const amount = finiteNumber(distance, 0);\n return {\n x: point.x + axis.normalX * amount,\n y: point.y + axis.normalY * amount\n };\n}\n\n/** Converts a public positive-up normal offset to the internal SVG axis normal. */\nexport function linearNormalOffset(value) {\n return -finiteNumber(value, 0);\n}\n\n/** Converts the public positive-up indicator center offset to the SVG axis normal. */\nexport function linearIndicatorNormalOffset(indicator) {\n return linearNormalOffset(indicator?.centerOffset);\n}\n\n/** Resolves a one-sided or centered span along the axis normal. */\nexport function linearNormalSpan(length, position = 'cross', offset = 0) {\n const size = Math.max(0, finiteNumber(length, 0));\n const shift = finiteNumber(offset, 0);\n if (position === 'negative') return { start: shift - size, end: shift };\n if (position === 'positive') return { start: shift, end: shift + size };\n return { start: shift - size / 2, end: shift + size / 2 };\n}\n", "import { finiteNumber } from '../core/utils.js';\nimport { niceInterval } from './scale.js';\n\n/** Returns the fixed viewport rectangle used by a rolling tape gauge. */\nexport function tapeWindowBox(options) {\n const tape = options.tape || {};\n return {\n x: finiteNumber(tape.x, 64),\n y: finiteNumber(tape.y, 58),\n width: Math.max(20, finiteNumber(tape.width, 192)),\n height: Math.max(20, finiteNumber(tape.height, 210))\n };\n}\n\n/** Resolves the major labelled interval for the moving scale. */\nexport function resolveTapeInterval(options) {\n const explicit = finiteNumber(options.tape?.interval, 0);\n if (explicit > 0) return explicit;\n return niceInterval(options.max - options.min, Math.max(2, options.scale?.major?.divisions || 5));\n}\n\n/** Returns the value step represented by one rendered tape slot. */\nexport function tapeMinorStep(options) {\n const subdivisions = Math.max(0, Math.floor(finiteNumber(options.tape?.minorSubdivisions, 4)));\n return resolveTapeInterval(options) / (subdivisions + 1);\n}\n\n/** Returns the visual spacing between adjacent minor tape slots. */\nexport function tapeMinorSpacing(options) {\n const subdivisions = Math.max(0, Math.floor(finiteNumber(options.tape?.minorSubdivisions, 4)));\n return Math.max(2, finiteNumber(options.tape?.majorSpacing, 54)) / (subdivisions + 1);\n}\n\n/** Maps a tape value to its signed pixel displacement from the fixed reference line. */\nexport function tapeValueOffset(value, currentValue, options) {\n const step = tapeMinorStep(options);\n const spacing = tapeMinorSpacing(options);\n const direction = options.invert ? -1 : 1;\n return (Number(value) - Number(currentValue)) / step * spacing * direction;\n}\n", "import { finiteNumber } from '../core/utils.js';\nimport { linearYToSvg } from './linear.js';\n\n/** Resolves a lamp position in the gauge type's logical coordinate system. */\nexport function resolveLightPosition(light, options) {\n return {\n x: finiteNumber(light?.x, options.geometry.width / 2),\n y: options.geometry.mode === 'linear'\n ? linearYToSvg(light?.y, options)\n : finiteNumber(light?.y, options.geometry.height / 2)\n };\n}\n\n/** Returns whether a lamp condition is active for a displayed gauge value. */\nexport function lightIsActive(light, value) {\n if (!light?.visible) return false;\n const trigger = light.trigger || {};\n const sample = finiteNumber(value, 0);\n\n switch (trigger.mode) {\n case 'below':\n return sample <= finiteNumber(trigger.value, 0);\n case 'above':\n return sample >= finiteNumber(trigger.value, 0);\n case 'between': {\n const first = finiteNumber(trigger.min, 0);\n const second = finiteNumber(trigger.max, first);\n return sample >= Math.min(first, second) && sample <= Math.max(first, second);\n }\n case 'manual':\n default:\n return light.on === true;\n }\n}\n", "import { buildScaleValues, gaugeSweep, polarPoint, valueToAngle } from './scale.js';\nimport { finiteNumber, isTransparentColor } from '../core/utils.js';\nimport {\n linearAxis,\n linearIndicatorNormalOffset,\n linearNormalOffset,\n linearNormalSpan,\n linearYToSvg,\n offsetLinearPoint,\n valueToLinearPoint\n} from './linear.js';\nimport { tapeWindowBox } from './tape.js';\nimport { resolveLightPosition } from './light.js';\n\nconst EPSILON = 0.001;\n\n/** Returns an immutable-looking bounds object suitable for SVG viewBox calculations. */\nexport function createBounds(x = Infinity, y = Infinity, width = -Infinity, height = -Infinity) {\n if (Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(width) && Number.isFinite(height)) {\n return { x, y, width, height };\n }\n return { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity };\n}\n\n/** Expands a mutable accumulator with one point. */\nexport function includePoint(bounds, x, y) {\n if (!Number.isFinite(x) || !Number.isFinite(y)) return bounds;\n bounds.minX = Math.min(bounds.minX, x);\n bounds.minY = Math.min(bounds.minY, y);\n bounds.maxX = Math.max(bounds.maxX, x);\n bounds.maxY = Math.max(bounds.maxY, y);\n return bounds;\n}\n\n/** Expands a mutable accumulator with a rectangle. */\nexport function includeRect(bounds, x, y, width, height) {\n includePoint(bounds, x, y);\n includePoint(bounds, x + Math.max(0, width), y + Math.max(0, height));\n return bounds;\n}\n\n/** Converts an accumulator to a finite SVG rectangle. */\nexport function finalizeBounds(bounds, fallback = { x: 0, y: 0, width: 1, height: 1 }) {\n if (!bounds || !Number.isFinite(bounds.minX) || !Number.isFinite(bounds.minY)\n || !Number.isFinite(bounds.maxX) || !Number.isFinite(bounds.maxY)) {\n return { ...fallback };\n }\n return {\n x: bounds.minX,\n y: bounds.minY,\n width: Math.max(1, bounds.maxX - bounds.minX),\n height: Math.max(1, bounds.maxY - bounds.minY)\n };\n}\n\n/** Returns a bounds rectangle padded on every side. */\nexport function padBounds(bounds, padding = 0) {\n const amount = Math.max(0, finiteNumber(padding, 0));\n return {\n x: bounds.x - amount,\n y: bounds.y - amount,\n width: Math.max(1, bounds.width + amount * 2),\n height: Math.max(1, bounds.height + amount * 2)\n };\n}\n\n/** Returns the union of any finite bounds rectangles. */\nexport function unionBounds(...rectangles) {\n const accumulator = createBounds();\n for (const rectangle of rectangles) {\n if (!rectangle) continue;\n includeRect(accumulator, rectangle.x, rectangle.y, rectangle.width, rectangle.height);\n }\n return finalizeBounds(accumulator);\n}\n\n/** True when the configured sweep closes the scale on itself. */\nexport function isClosedGauge(options) {\n return Math.abs(gaugeSweep(options)) >= 360 - EPSILON;\n}\n\n/** Removes the duplicate maximum endpoint from a closed scale unless explicitly requested. */\nexport function resolveScaleEndpointValues(values, options) {\n const mode = options.scale?.endpointMode || 'auto';\n if (values.length < 2 || mode === 'both') return values;\n if (mode === 'dedupe' || (mode === 'auto' && isClosedGauge(options))) return values.slice(0, -1);\n return values;\n}\n\n/** Resolves a readout part's automatic position without overloading coordinate zero. */\nexport function resolveReadoutPosition(part, options) {\n const reference = readoutReferenceBox(options);\n const fontSize = Math.max(1, finiteNumber(part.fontSize, 12));\n const margin = Math.max(0, finiteNumber(part.margin, 12));\n const position = part.position || 'top';\n const automaticX = part.x === 'auto';\n const automaticY = part.y === 'auto';\n const x = automaticX\n ? reference.x + reference.width / 2\n : finiteNumber(part.x, reference.x + reference.width / 2);\n let y;\n if (automaticY) {\n if (position === 'bottom') y = reference.y + reference.height - margin - fontSize / 2;\n else if (position === 'center') y = reference.y + reference.height / 2;\n else y = reference.y + margin + fontSize / 2;\n } else if (options.geometry.mode === 'linear') {\n y = linearYToSvg(part.y, options);\n } else {\n y = finiteNumber(part.y, reference.y + margin + fontSize / 2);\n }\n return {\n // Offsets refine automatic placement. Numeric coordinates are final, absolute\n // SVG positions and therefore do not inherit a type preset's auto offset.\n x: x + (automaticX ? finiteNumber(part.offsetX, 0) : 0),\n y: y + (automaticY ? finiteNumber(part.offsetY, 0) : 0)\n };\n}\n\n/** Resolves the actual face rectangle, including content-fitted panel faces. */\nexport function resolveFaceBox(options, contentBounds = null) {\n const face = options.face;\n const geometry = options.geometry;\n if (face.fit !== 'content' || !contentBounds) {\n return {\n x: face.x,\n y: face.y,\n width: face.width,\n height: face.height\n };\n }\n\n const padding = Math.max(0, finiteNumber(face.contentPadding, 8));\n const configured = { x: face.x, y: face.y, width: face.width, height: face.height };\n const minimumWidth = face.minWidth ?? configured.width;\n const minimumHeight = face.minHeight ?? configured.height;\n if (face.shape === 'circle') {\n const cx = geometry.centerX;\n const cy = geometry.centerY;\n const configuredRadius = Math.min(minimumWidth, minimumHeight) / 2;\n const contentRadius = Math.max(\n cx - contentBounds.x,\n contentBounds.x + contentBounds.width - cx,\n cy - contentBounds.y,\n contentBounds.y + contentBounds.height - cy\n ) + padding;\n const radius = Math.max(1, configuredRadius, contentRadius);\n return { x: cx - radius, y: cy - radius, width: radius * 2, height: radius * 2 };\n }\n\n // A content-fitted panel follows the rendered dial instead of permanently\n // retaining its original top-left corner. This keeps top and bottom margins\n // balanced when a title or another readout is moved, while the configured\n // configured face dimensions remain the default minimum instrument size,\n // while minWidth/minHeight may override that floor for compact presets.\n const padded = {\n x: contentBounds.x - padding,\n y: contentBounds.y - padding,\n width: contentBounds.width + padding * 2,\n height: contentBounds.height + padding * 2\n };\n const horizontalExtent = Math.max(\n geometry.centerX - padded.x,\n padded.x + padded.width - geometry.centerX\n );\n const width = Math.max(1, minimumWidth, horizontalExtent * 2);\n const height = Math.max(1, minimumHeight, padded.height);\n const contentCenterY = padded.y + padded.height / 2;\n return {\n x: geometry.centerX - width / 2,\n y: contentCenterY - height / 2,\n width,\n height\n };\n}\n\n/** Calculates conservative visual bounds for every built-in layer. */\nexport function calculateGaugeBounds(options, configuration = {}) {\n const includeFace = configuration.includeFace !== false;\n const includeBase = configuration.includeBase === undefined\n ? options.layout?.includeGeometry !== false\n : configuration.includeBase === true;\n const contentBounds = configuration.contentBounds || null;\n const geometry = options.geometry;\n const bounds = createBounds();\n\n if (includeBase) includeRect(bounds, 0, 0, geometry.width, geometry.height);\n\n if (includeFace && options.face.visible) {\n const box = resolveFaceBox(options, contentBounds);\n const expansion = options.face.shadow ? 10 : Math.max(0, options.face.strokeWidth / 2);\n includeRect(bounds, box.x - expansion, box.y - expansion, box.width + expansion * 2, box.height + expansion * 2);\n // A clipped framed instrument cannot affect layout outside its bezel. The\n // content bounds were already used to size content-fitted faces above.\n if (options.face.clipContent) {\n return finalizeBounds(bounds, { x: 0, y: 0, width: geometry.width, height: geometry.height });\n }\n }\n\n if (geometry.mode === 'linear') {\n includeLinearTrackAndZones(bounds, options);\n includeLinearScale(bounds, options);\n includeLinearLabels(bounds, options);\n includeLinearIndicator(bounds, options);\n includeZeroMarker(bounds, options);\n } else if (geometry.mode === 'tape') {\n includeTape(bounds, options);\n } else {\n includeTrackAndZones(bounds, options);\n includeScale(bounds, options);\n includeLabels(bounds, options);\n includeZeroMarker(bounds, options);\n includePointer(bounds, options);\n }\n includeReadout(bounds, options);\n includeLight(bounds, options);\n\n return finalizeBounds(bounds, { x: 0, y: 0, width: geometry.width, height: geometry.height });\n}\n\nfunction includeTrackAndZones(bounds, options) {\n const { geometry, track } = options;\n if (track.visible) {\n includeArc(bounds, geometry.centerX, geometry.centerY, track.radius, track.width, geometry.startAngle, geometry.endAngle);\n }\n for (const zone of options.zones || []) {\n if (isTransparentColor(zone.color)) continue;\n includeArc(\n bounds,\n geometry.centerX,\n geometry.centerY,\n zone.radius ?? track.radius ?? geometry.radius,\n zoneMaximumWidth(zone, track.width),\n valueToAngle(zone.min, options),\n valueToAngle(zone.max, options)\n );\n }\n}\n\n\nfunction zoneMaximumWidth(zone, fallbackWidth) {\n if (!zone?.taper) return zone?.width ?? fallbackWidth;\n return Math.max(\n 0,\n finiteNumber(zone.taper.startWidth, zone.width ?? fallbackWidth),\n finiteNumber(zone.taper.endWidth, zone.width ?? fallbackWidth)\n );\n}\n\nfunction includeScale(bounds, options) {\n const { geometry, scale } = options;\n const lengths = [];\n if (scale.major.visible) lengths.push(scale.major.length);\n if (scale.minor.visible) lengths.push(scale.minor.length);\n if (!lengths.length) return;\n const length = Math.max(...lengths, 0);\n let inner = scale.radius;\n let outer = scale.radius;\n if (scale.position === 'outside') outer += length;\n else if (scale.position === 'cross') {\n inner -= length / 2;\n outer += length / 2;\n } else inner -= length;\n includeArcSector(bounds, geometry.centerX, geometry.centerY, Math.max(0, inner), outer, geometry.startAngle, geometry.endAngle);\n}\n\nfunction includeLabels(bounds, options) {\n const labels = options.labels;\n if (!labels.visible) return;\n const interval = Number(labels.interval) > 0\n ? Number(labels.interval)\n : Math.abs(options.max - options.min) / Math.max(1, options.scale.major.divisions || 5);\n const values = resolveScaleEndpointValues(buildScaleValues(options.min, options.max, interval), options);\n for (const value of values) {\n const point = polarPoint(options.geometry.centerX, options.geometry.centerY, labels.radius, valueToAngle(value, options));\n let rendered = Number(value).toFixed(labels.fractionDigits);\n if (typeof labels.formatter === 'function') {\n try {\n rendered = String(labels.formatter(value, { min: options.min, max: options.max, options }));\n } catch {\n // Bounds must stay deterministic even when a user formatter fails during estimation.\n }\n }\n const halfWidth = Math.max(labels.fontSize * 0.55, rendered.length * labels.fontSize * 0.34);\n const halfHeight = labels.fontSize * 0.68;\n includeRect(bounds, point.x - halfWidth, point.y - halfHeight, halfWidth * 2, halfHeight * 2);\n }\n}\n\nfunction includePointer(bounds, options) {\n const { geometry, pointer } = options;\n if (!pointer.visible) return;\n const expansion = Math.max(pointer.width / 2, pointer.strokeWidth / 2, 1);\n includeArcSector(\n bounds,\n geometry.centerX,\n geometry.centerY,\n 0,\n pointer.length + expansion,\n geometry.startAngle,\n geometry.endAngle\n );\n if (pointer.tailLength > 0) {\n includeArcSector(\n bounds,\n geometry.centerX,\n geometry.centerY,\n 0,\n pointer.tailLength + expansion,\n geometry.startAngle + 180,\n geometry.endAngle + 180\n );\n }\n if (pointer.cap.visible) {\n const radius = pointer.cap.radius + pointer.cap.strokeWidth / 2;\n includeRect(bounds, geometry.centerX - radius, geometry.centerY - radius, radius * 2, radius * 2);\n }\n}\n\n\nfunction includeLinearTrackAndZones(bounds, options) {\n const axis = linearAxis(options);\n if (options.track.visible) {\n includeLinearStroke(\n bounds,\n axis,\n valueToLinearPoint(options.min, options),\n valueToLinearPoint(options.max, options),\n linearNormalOffset(options.linear.zoneOffset),\n options.track.width\n );\n }\n\n for (const zone of options.zones || []) {\n if (isTransparentColor(zone.color)) continue;\n includeLinearStroke(\n bounds,\n axis,\n valueToLinearPoint(zone.min, options),\n valueToLinearPoint(zone.max, options),\n linearNormalOffset(zone.offset ?? options.linear.zoneOffset),\n zone.width ?? options.track.width\n );\n }\n}\n\nfunction includeLinearScale(bounds, options) {\n const axis = linearAxis(options);\n const lengths = [];\n if (options.scale.major.visible) lengths.push(options.scale.major.length);\n if (options.scale.minor.visible) lengths.push(options.scale.minor.length);\n if (!lengths.length) return;\n\n const span = linearNormalSpan(Math.max(...lengths, 0), options.linear.tickSide);\n includeLinearExtent(bounds, axis, span.start, span.end);\n}\n\nfunction includeLinearLabels(bounds, options) {\n const labels = options.labels;\n if (!labels.visible) return;\n const interval = Number(labels.interval) > 0\n ? Number(labels.interval)\n : Math.abs(options.max - options.min) / Math.max(1, options.scale.major.divisions || 5);\n const values = buildScaleValues(options.min, options.max, interval);\n const axis = linearAxis(options);\n\n for (const value of values) {\n const point = offsetLinearPoint(\n valueToLinearPoint(value, options),\n axis,\n linearNormalOffset(options.linear.labelOffset)\n );\n let rendered = Number(value).toFixed(labels.fractionDigits);\n if (typeof labels.formatter === 'function') {\n try {\n rendered = String(labels.formatter(value, { min: options.min, max: options.max, options }));\n } catch {\n // Bounds remain deterministic even when a user formatter fails.\n }\n }\n const halfWidth = Math.max(labels.fontSize * 0.55, rendered.length * labels.fontSize * 0.34);\n const halfHeight = labels.fontSize * 0.68;\n includeRect(bounds, point.x - halfWidth, point.y - halfHeight, halfWidth * 2, halfHeight * 2);\n }\n}\n\nfunction includeLinearIndicator(bounds, options) {\n const indicator = options.indicator;\n if (!indicator.visible) return;\n const axis = linearAxis(options);\n const span = linearNormalSpan(\n indicator.length,\n indicator.position,\n linearIndicatorNormalOffset(indicator)\n );\n const strokeExpansion = Math.max(indicator.width / 2, indicator.strokeWidth / 2, 1);\n const normalStart = Math.min(span.start, span.end) - strokeExpansion;\n const normalEnd = Math.max(span.start, span.end) + strokeExpansion;\n let tangentExpansion = strokeExpansion;\n\n if (indicator.type === 'marker') tangentExpansion = Math.max(tangentExpansion, indicator.markerSize);\n if (indicator.type === 'carriage') tangentExpansion = Math.max(tangentExpansion, indicator.carriageWidth / 2);\n if (indicator.cap.visible) tangentExpansion = Math.max(tangentExpansion, indicator.cap.radius + indicator.cap.strokeWidth / 2);\n\n includeLinearExtent(bounds, axis, normalStart, normalEnd, tangentExpansion);\n}\n\nfunction includeZeroMarker(bounds, options) {\n const marker = options.centerZero?.marker;\n if (!marker?.visible) return;\n const expansion = Math.max(marker.width / 2, 0.5);\n\n if (options.geometry.mode === 'linear') {\n const axis = linearAxis(options);\n const point = valueToLinearPoint(options.centerZero.zeroValue, options);\n const span = linearNormalSpan(\n marker.length,\n marker.position,\n linearNormalOffset(marker.centerOffset)\n );\n const start = offsetLinearPoint(point, axis, span.start);\n const end = offsetLinearPoint(point, axis, span.end);\n includeRect(\n bounds,\n Math.min(start.x, end.x) - expansion,\n Math.min(start.y, end.y) - expansion,\n Math.abs(end.x - start.x) + expansion * 2,\n Math.abs(end.y - start.y) + expansion * 2\n );\n return;\n }\n\n const angle = valueToAngle(options.centerZero.zeroValue, options);\n const radius = marker.radius ?? options.scale.radius;\n const start = polarPoint(\n options.geometry.centerX,\n options.geometry.centerY,\n Math.max(0, radius - marker.length),\n angle\n );\n const end = polarPoint(options.geometry.centerX, options.geometry.centerY, radius, angle);\n includeRect(\n bounds,\n Math.min(start.x, end.x) - expansion,\n Math.min(start.y, end.y) - expansion,\n Math.abs(end.x - start.x) + expansion * 2,\n Math.abs(end.y - start.y) + expansion * 2\n );\n}\n\nfunction includeLinearStroke(bounds, axis, startPoint, endPoint, offset, width) {\n const halfWidth = Math.max(0, finiteNumber(width, 0)) / 2;\n const start = offsetLinearPoint(startPoint, axis, offset);\n const end = offsetLinearPoint(endPoint, axis, offset);\n const minX = Math.min(start.x, end.x) - halfWidth;\n const minY = Math.min(start.y, end.y) - halfWidth;\n includeRect(\n bounds,\n minX,\n minY,\n Math.abs(end.x - start.x) + halfWidth * 2,\n Math.abs(end.y - start.y) + halfWidth * 2\n );\n}\n\nfunction includeLinearExtent(bounds, axis, normalStart, normalEnd, tangentExpansion = 0) {\n for (const base of [\n { x: axis.startX, y: axis.startY },\n { x: axis.endX, y: axis.endY }\n ]) {\n for (const normal of [normalStart, normalEnd]) {\n const point = offsetLinearPoint(base, axis, normal);\n includePoint(\n bounds,\n point.x - axis.tangentX * tangentExpansion,\n point.y - axis.tangentY * tangentExpansion\n );\n includePoint(\n bounds,\n point.x + axis.tangentX * tangentExpansion,\n point.y + axis.tangentY * tangentExpansion\n );\n }\n }\n}\n\n\nfunction includeTape(bounds, options) {\n const box = tapeWindowBox(options);\n const expansion = Math.max(\n options.tape.windowStrokeWidth / 2,\n options.tape.windowInnerStrokeWidth / 2\n );\n includeRect(\n bounds,\n box.x - expansion,\n box.y - expansion,\n box.width + expansion * 2,\n box.height + expansion * 2\n );\n}\n\nfunction includeLight(bounds, options) {\n const light = options.light;\n if (!light?.visible) return;\n const point = resolveLightPosition(light, options);\n const radius = Math.max(1, finiteNumber(light.radius, 8));\n // The glow circle extends to 1.82r and its 0.38r Gaussian blur remains\n // visibly relevant for roughly another three standard deviations.\n const halo = light.glow ? radius * 2.96 : radius;\n const bezel = radius + Math.max(1.5, radius * 0.18);\n const extent = Math.max(halo, bezel);\n includeRect(bounds, point.x - extent, point.y - extent, extent * 2, extent * 2);\n}\n\nfunction includeReadout(bounds, options) {\n if (!options.readout.visible) return;\n for (const [kind, part] of Object.entries(options.readout)) {\n if (kind === 'visible' || !part?.visible) continue;\n const text = kind === 'value'\n ? `${part.prefix || ''}${options.max}${part.suffix || ''}`\n : String(part.text || '');\n if (!text && kind !== 'value') continue;\n const point = resolveReadoutPosition(part, options);\n const halfWidth = Math.max(part.fontSize * 0.55, text.length * part.fontSize * 0.34);\n const halfHeight = part.fontSize * 0.68;\n includeRect(bounds, point.x - halfWidth, point.y - halfHeight, halfWidth * 2, halfHeight * 2);\n }\n}\n\nfunction readoutReferenceBox(options) {\n const face = options.face;\n if (face.visible && face.fit !== 'content') return { x: face.x, y: face.y, width: face.width, height: face.height };\n return { x: 0, y: 0, width: options.geometry.width, height: options.geometry.height };\n}\n\nfunction includeArc(bounds, cx, cy, radius, width, startAngle, endAngle) {\n const halfWidth = Math.max(0, finiteNumber(width, 0)) / 2;\n includeArcSector(bounds, cx, cy, Math.max(0, radius - halfWidth), radius + halfWidth, startAngle, endAngle);\n}\n\nfunction includeArcSector(bounds, cx, cy, innerRadius, outerRadius, startAngle, endAngle) {\n const angles = [startAngle, endAngle];\n for (const cardinal of [0, 90, 180, 270]) {\n if (angleIsWithinSweep(cardinal, startAngle, endAngle)) angles.push(cardinal);\n }\n if (innerRadius <= EPSILON) includePoint(bounds, cx, cy);\n for (const angle of angles) {\n const outer = polarPoint(cx, cy, Math.max(0, outerRadius), angle);\n includePoint(bounds, outer.x, outer.y);\n if (innerRadius > EPSILON) {\n const inner = polarPoint(cx, cy, innerRadius, angle);\n includePoint(bounds, inner.x, inner.y);\n }\n }\n}\n\nfunction angleIsWithinSweep(angle, startAngle, endAngle) {\n const delta = endAngle - startAngle;\n if (Math.abs(delta) >= 360 - EPSILON) return true;\n if (delta >= 0) return positiveModulo(angle - startAngle, 360) <= delta + EPSILON;\n return positiveModulo(startAngle - angle, 360) <= -delta + EPSILON;\n}\n\nfunction positiveModulo(value, divisor) {\n return ((value % divisor) + divisor) % divisor;\n}\n", "import { uniqueId } from '../core/utils.js';\nimport { calculateGaugeBounds, padBounds, unionBounds } from '../geometry/bounds.js';\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/** Creates an SVG element and applies attributes without using innerHTML. */\nexport function svgElement(tagName, attributes = {}, text = null) {\n const element = document.createElementNS(SVG_NAMESPACE, tagName);\n setSvgAttributes(element, attributes);\n if (text !== null && text !== undefined) element.textContent = String(text);\n return element;\n}\n\n/** Applies SVG attributes, omitting null and undefined values. */\nexport function setSvgAttributes(element, attributes) {\n for (const [name, value] of Object.entries(attributes || {})) {\n if (value === null || value === undefined || value === false) continue;\n if (name === 'className') element.setAttribute('class', String(value));\n else element.setAttribute(name, String(value));\n }\n return element;\n}\n\n/** Owns the generated SVG tree and small dynamic reference registry. */\nexport class SvgRenderer {\n constructor(host, options) {\n this.host = host;\n this.options = options;\n this.id = uniqueId('gaugeit');\n this.controllers = [];\n this.references = new Map();\n this.root = null;\n this.svg = null;\n this.content = null;\n this.contentBounds = null;\n this.layoutBounds = null;\n this.contentClipPathId = null;\n }\n\n /** Creates a clean SVG root for a full render. */\n begin() {\n this.destroyControllers();\n this.references.clear();\n this.contentClipPathId = null;\n\n const root = document.createElement('div');\n root.className = [\n 'gaugeit',\n `gaugeit--${this.options.type}`,\n `gaugeit--layout-${this.options.layout.mode}`,\n this.options.className\n ].filter(Boolean).join(' ');\n root.dataset.gaugeitRoot = 'true';\n root.dataset.gaugeitLayout = this.options.layout.mode;\n\n this.contentBounds = calculateGaugeBounds(this.options, { includeFace: false, includeBase: false });\n this.layoutBounds = calculateGaugeBounds(this.options, { contentBounds: this.contentBounds });\n const initialViewport = padBounds(this.layoutBounds, this.options.layout.padding);\n\n const geometry = this.options.geometry;\n const svg = svgElement('svg', {\n class: 'gaugeit__svg',\n viewBox: viewBoxValue(initialViewport),\n preserveAspectRatio: geometry.preserveAspectRatio,\n focusable: 'false'\n });\n\n const title = svgElement('title', { id: `${this.id}-title` }, this.options.accessibility.label);\n svg.append(title);\n\n if (this.options.accessibility.description) {\n const description = svgElement(\n 'desc',\n { id: `${this.id}-description` },\n this.options.accessibility.description\n );\n svg.append(description);\n svg.setAttribute('aria-describedby', description.id);\n }\n\n svg.setAttribute('aria-labelledby', title.id);\n const content = svgElement('g', {\n class: 'gaugeit__viewport',\n 'data-gaugeit-viewport': 'true'\n });\n svg.append(content);\n root.append(svg);\n this.host.replaceChildren(root);\n this.host.classList.add('gaugeit-host');\n\n this.root = root;\n this.svg = svg;\n this.content = content;\n this.applySizing(initialViewport);\n return svg;\n }\n\n /** Finalizes the responsive viewBox after all layers have been rendered. */\n finish() {\n if (!this.svg || !this.content) return null;\n const measured = measureContent(this.content);\n const contentIsClipped = this.options.face.visible && this.options.face.clipContent;\n const combined = measured && !contentIsClipped\n ? unionBounds(this.layoutBounds, measured)\n : this.layoutBounds;\n const viewport = padBounds(combined, this.options.layout.padding);\n this.layoutBounds = combined;\n this.svg.setAttribute('viewBox', viewBoxValue(viewport));\n this.applySizing(viewport);\n this.root.dataset.gaugeitViewBox = viewBoxValue(viewport);\n return viewport;\n }\n\n /** Creates an SVG group for one logical layer. */\n group(name, attributes = {}) {\n const clipPath = name !== 'face' && this.contentClipPathId\n ? `url(#${this.contentClipPathId})`\n : undefined;\n const group = svgElement('g', {\n class: `gaugeit__layer gaugeit__layer--${name}`,\n 'data-gaugeit-layer': name,\n 'clip-path': clipPath,\n ...attributes\n });\n this.content.append(group);\n return group;\n }\n\n /** Clips subsequently created non-face layers to a reusable SVG clip path. */\n setContentClipPath(clipPathId) {\n this.contentClipPathId = clipPathId ? String(clipPathId) : null;\n }\n\n /** Returns conservative content bounds available before layer rendering. */\n getContentBounds() {\n return this.contentBounds;\n }\n\n /** Stores a generated node or value for later dynamic updates. */\n setReference(name, value) {\n this.references.set(name, value);\n return value;\n }\n\n getReference(name) {\n return this.references.get(name);\n }\n\n addController(controller) {\n if (controller && typeof controller.update === 'function') this.controllers.push(controller);\n }\n\n update(value, state) {\n for (const controller of this.controllers) controller.update(value, state);\n }\n\n destroyControllers() {\n for (const controller of this.controllers) {\n if (typeof controller.destroy === 'function') controller.destroy();\n }\n this.controllers = [];\n }\n\n destroy() {\n this.destroyControllers();\n this.references.clear();\n if (this.root && this.root.parentNode === this.host) this.root.remove();\n this.host.classList.remove('gaugeit-host');\n this.root = null;\n this.svg = null;\n this.content = null;\n this.contentBounds = null;\n this.layoutBounds = null;\n this.contentClipPathId = null;\n }\n\n applySizing(viewport) {\n const responsive = this.options.responsive;\n const contain = this.options.layout.mode === 'contain';\n this.root.style.width = responsive ? '100%' : `${viewport.width}px`;\n this.root.style.maxWidth = '100%';\n this.root.style.height = contain ? '100%' : 'auto';\n this.svg.style.display = 'block';\n this.svg.style.width = responsive ? '100%' : `${viewport.width}px`;\n this.svg.style.height = contain ? '100%' : 'auto';\n this.svg.style.maxWidth = '100%';\n this.svg.style.maxHeight = contain ? '100%' : 'none';\n this.svg.style.overflow = 'hidden';\n }\n}\n\nfunction viewBoxValue(bounds) {\n return `${round(bounds.x)} ${round(bounds.y)} ${round(bounds.width)} ${round(bounds.height)}`;\n}\n\nfunction round(value) {\n return Math.round(value * 1000) / 1000;\n}\n\nfunction measureContent(content) {\n if (typeof content.getBBox !== 'function') return null;\n try {\n const box = content.getBBox();\n if (![box.x, box.y, box.width, box.height].every(Number.isFinite)) return null;\n if (box.width <= 0 && box.height <= 0) return null;\n return { x: box.x, y: box.y, width: Math.max(1, box.width), height: Math.max(1, box.height) };\n } catch {\n return null;\n }\n}\n", "const EASINGS = {\n linear: (t) => t,\n easeInQuad: (t) => t * t,\n easeOutQuad: (t) => t * (2 - t),\n easeInOutQuad: (t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeOutCubic: (t) => 1 - Math.pow(1 - t, 3),\n easeInOutCubic: (t) => (t < 0.5\n ? 4 * t * t * t\n : 1 - Math.pow(-2 * t + 2, 3) / 2),\n easeOutBack: (t) => {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2);\n }\n};\n\n/** Resolves a named easing or accepts a custom easing callback. */\nexport function resolveEasing(easing) {\n if (typeof easing === 'function') return easing;\n return EASINGS[easing] || EASINGS.easeOutCubic;\n}\n\nexport const easingNames = Object.freeze(Object.keys(EASINGS));\n", "export const BASE_DEFAULTS = Object.freeze({\n type: 'arc',\n min: 0,\n max: 100,\n value: 0,\n invert: false,\n overflow: 'clamp',\n precision: 3,\n className: '',\n layout: {\n mode: 'intrinsic',\n padding: 8,\n includeGeometry: true\n },\n geometry: {\n mode: 'radial',\n width: 320,\n height: 220,\n centerX: 160,\n centerY: 174,\n radius: 120,\n startAngle: 180,\n endAngle: 360,\n preserveAspectRatio: 'xMidYMid meet',\n aspectRatio: null\n },\n linear: {\n originY: 140,\n startX: 36,\n startY: 0,\n endX: 284,\n endY: 0,\n tickSide: 'negative',\n labelOffset: 34,\n zoneOffset: -12\n },\n face: {\n visible: false,\n shape: 'panel',\n fit: 'geometry',\n contentPadding: 8,\n minWidth: null,\n minHeight: null,\n clipContent: false,\n x: 6,\n y: 6,\n width: 308,\n height: 208,\n cornerRadius: 18,\n color: '#ffffff',\n strokeColor: '#d1d5db',\n strokeWidth: 2,\n innerStrokeColor: '#f3f4f6',\n innerStrokeWidth: 1,\n shadow: false,\n glass: false\n },\n track: {\n visible: true,\n color: '#e5e7eb',\n width: 28,\n radius: 112,\n opacity: 1,\n lineCap: 'butt',\n showUnderZones: false\n },\n zones: [],\n scale: {\n endpointMode: 'auto',\n radius: 112,\n position: 'inside',\n major: {\n visible: true,\n interval: null,\n divisions: 5,\n length: 13,\n width: 2,\n color: '#111827',\n opacity: 1\n },\n minor: {\n visible: true,\n subdivisions: 4,\n length: 7,\n width: 1,\n color: '#6b7280',\n opacity: 0.9\n }\n },\n labels: {\n visible: true,\n interval: null,\n radius: 84,\n color: '#111827',\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n fontSize: 11,\n fontWeight: 500,\n fractionDigits: 0,\n rotation: 'horizontal',\n formatter: null\n },\n pointer: {\n visible: true,\n type: 'needle',\n length: 94,\n shaftLength: null,\n tailLength: 13,\n width: 8,\n color: '#111827',\n strokeColor: 'none',\n strokeWidth: 0,\n opacity: 1,\n colorByZone: false,\n cap: {\n visible: true,\n stackOrder: 'above',\n radius: 8,\n color: '#111827',\n strokeColor: '#ffffff',\n strokeWidth: 2\n }\n },\n indicator: {\n visible: false,\n type: 'hairline',\n position: 'cross',\n length: 76,\n centerOffset: null,\n offset: 0,\n width: 2,\n color: '#b91c1c',\n strokeColor: 'none',\n strokeWidth: 0,\n opacity: 1,\n lineCap: 'round',\n colorByZone: false,\n markerSize: 8,\n carriageWidth: 14,\n carriageRadius: 4,\n cap: {\n visible: false,\n stackOrder: 'above',\n radius: 4,\n color: '#b91c1c',\n strokeColor: '#ffffff',\n strokeWidth: 1\n }\n },\n centerZero: {\n zeroValue: 0,\n symmetric: false,\n marker: {\n visible: false,\n radius: null,\n position: 'cross',\n centerOffset: 0,\n length: 20,\n width: 3,\n color: '#111827',\n opacity: 1,\n lineCap: 'round'\n }\n },\n tape: {\n orientation: 'vertical',\n x: 64,\n y: 58,\n width: 192,\n height: 210,\n cornerRadius: 12,\n windowColor: '#e5e7eb',\n windowStrokeColor: '#475569',\n windowStrokeWidth: 2,\n windowInnerStrokeColor: '#d1d5db',\n windowInnerStrokeWidth: 1,\n stripColor: '#ffffff',\n textColor: '#111827',\n tickColor: '#334155',\n minorTickColor: '#64748b',\n minorTickOpacity: 0.85,\n majorTickWidth: 2,\n minorTickWidth: 1,\n majorTickLength: 24,\n minorTickLength: 12,\n tickInset: 64,\n labelOffset: 10,\n interval: null,\n minorSubdivisions: 4,\n majorSpacing: 52,\n indicatorColor: '#b91c1c',\n indicatorWidth: 2.5,\n fadeSize: 32,\n fadeColor: '#ffffff',\n colorByZone: false\n },\n light: {\n visible: false,\n x: 160,\n y: 110,\n radius: 8,\n color: 'amber',\n customColor: '',\n offColor: '#f3ead6',\n offEdgeColor: '#817768',\n bezelColor: '#4b5563',\n bezelHighlightColor: '#f8fafc',\n opacity: 1,\n on: false,\n glow: true,\n pulse: true,\n pulseInterval: 2600,\n blink: false,\n blinkInterval: 1000,\n trigger: {\n mode: 'manual',\n source: 'target',\n value: 0,\n min: 0,\n max: 0\n }\n },\n readout: {\n visible: true,\n title: {\n visible: false,\n text: '',\n x: 'auto',\n y: 'auto',\n position: 'top',\n margin: 12,\n offsetX: 0,\n offsetY: 0,\n color: '#374151',\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n fontSize: 14,\n fontWeight: 700,\n letterSpacing: 0.8\n },\n value: {\n visible: false,\n x: 'auto',\n y: 54,\n position: 'center',\n margin: 12,\n offsetX: 0,\n offsetY: 0,\n color: '#111827',\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n fontSize: 38,\n fontWeight: 750,\n fractionDigits: 0,\n prefix: '',\n suffix: '',\n locale: undefined,\n formatter: null\n },\n unit: {\n visible: false,\n text: '',\n x: 'auto',\n y: 76,\n position: 'bottom',\n margin: 12,\n offsetX: 0,\n offsetY: 0,\n color: '#6b7280',\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n fontSize: 12,\n fontWeight: 600\n }\n },\n animation: {\n enabled: true,\n duration: 850,\n easing: 'easeOutCubic',\n animateOnInit: true,\n startFrom: 'min',\n respectReducedMotion: true\n },\n effects: {\n jitter: {\n enabled: false,\n amplitude: 0.45,\n amplitudeUnit: 'value',\n frequency: 4,\n smoothing: 0.86,\n whenIdleOnly: true\n }\n },\n accessibility: {\n label: 'Gauge',\n description: '',\n valueText: null\n },\n performance: {\n pauseWhenHidden: true,\n pauseWhenOffscreen: true\n },\n responsive: true\n});\n", "import { BASE_DEFAULTS } from './defaults.js';\nimport { cloneValue, deepMerge, finiteNumber, isPlainObject } from './utils.js';\nimport { niceInterval } from '../geometry/scale.js';\n\nconst VALID_OVERFLOW = new Set(['clamp', 'expand', 'allow']);\nconst VALID_POINTERS = new Set(['needle', 'line', 'arrow', 'spear']);\nconst VALID_POSITIONS = new Set(['inside', 'outside', 'cross']);\nconst VALID_ROTATIONS = new Set(['horizontal', 'radial', 'tangent']);\nconst VALID_LAYOUT_MODES = new Set(['intrinsic', 'contain']);\nconst VALID_FACE_FITS = new Set(['geometry', 'content']);\nconst VALID_FACE_SHAPES = new Set(['panel', 'circle']);\nconst VALID_ENDPOINT_MODES = new Set(['auto', 'both', 'dedupe']);\nconst VALID_READOUT_POSITIONS = new Set(['top', 'center', 'bottom']);\nconst VALID_GEOMETRY_MODES = new Set(['radial', 'linear', 'tape']);\nconst VALID_LINEAR_TICK_SIDES = new Set(['negative', 'positive', 'cross']);\nconst VALID_INDICATOR_TYPES = new Set(['hairline', 'marker', 'carriage']);\nconst VALID_INDICATOR_POSITIONS = new Set(['negative', 'positive', 'cross']);\nconst VALID_CAP_STACK_ORDERS = new Set(['above', 'below']);\nconst VALID_ORIENTATIONS = new Set(['vertical', 'horizontal']);\nconst VALID_LIGHT_COLORS = new Set([\n 'red', 'green', 'blue', 'amber', 'yellow',\n 'orange', 'white', 'halogen', 'cyan', 'brown'\n]);\nconst VALID_LIGHT_TRIGGER_MODES = new Set(['manual', 'below', 'above', 'between']);\nconst VALID_LIGHT_TRIGGER_SOURCES = new Set(['target', 'displayed', 'pointer']);\n\n/** Resolves base defaults, type defaults, and user options into validated runtime options. */\nexport function resolveGaugeOptions(userOptions, registry) {\n const requested = isPlainObject(userOptions) ? userOptions : {};\n const requestedType = String(requested.type || BASE_DEFAULTS.type);\n const typeDefinition = registry.get(requestedType);\n\n const fallbacks = deepMerge(BASE_DEFAULTS, typeDefinition.defaults);\n let options = deepMerge(fallbacks, requested);\n options.type = requestedType;\n options = restoreOptionShape(options, fallbacks);\n\n if (typeof typeDefinition.configure === 'function') {\n const configured = typeDefinition.configure(options, {\n requested,\n typeDefaults: typeDefinition.defaults\n });\n if (isPlainObject(configured)) options = configured;\n }\n\n options = restoreOptionShape(options, fallbacks);\n options.min = finiteNumber(options.min, 0);\n options.max = finiteNumber(options.max, 100);\n if (options.max <= options.min) options.max = options.min + 1;\n options.value = finiteNumber(options.value, options.min);\n options.invert = options.invert === true;\n options.precision = Math.max(0, Math.min(12, Math.floor(finiteNumber(options.precision, 3))));\n options.overflow = VALID_OVERFLOW.has(options.overflow) ? options.overflow : 'clamp';\n\n validateLayout(options.layout);\n validateGeometry(options.geometry);\n validateLinear(options.linear);\n validateFace(options.face);\n validateScale(options);\n validatePointer(options.pointer);\n validateIndicator(options.indicator, requested.indicator);\n validateCenterZero(options.centerZero, options);\n validateTape(options.tape);\n validateLight(options.light);\n validateLabels(options.labels);\n validateReadout(options.readout);\n validateAnimation(options.animation);\n validateJitter(options.effects.jitter);\n options.zones = normalizeZones(options.zones, options.min, options.max, options.track.width);\n\n return options;\n}\n\n/** Returns a useful major interval from explicit interval or desired divisions. */\nexport function resolveMajorInterval(options) {\n const explicit = finiteNumber(options.scale.major.interval, 0);\n if (explicit > 0) return explicit;\n const divisions = Math.max(1, Math.floor(finiteNumber(options.scale.major.divisions, 5)));\n return niceInterval(options.max - options.min, divisions);\n}\n\n/** Merges a partial runtime update into the original user options. */\nexport function mergeUserOptions(currentUserOptions, patch) {\n return deepMerge(currentUserOptions || {}, patch || {});\n}\n\nfunction validateLayout(layout) {\n layout.mode = VALID_LAYOUT_MODES.has(layout.mode) ? layout.mode : 'intrinsic';\n layout.padding = Math.max(0, finiteNumber(layout.padding, 8));\n layout.includeGeometry = layout.includeGeometry !== false;\n}\n\nfunction validateGeometry(geometry) {\n geometry.mode = VALID_GEOMETRY_MODES.has(geometry.mode) ? geometry.mode : 'radial';\n geometry.width = Math.max(40, finiteNumber(geometry.width, 320));\n geometry.height = Math.max(40, finiteNumber(geometry.height, 220));\n geometry.centerX = finiteNumber(geometry.centerX, geometry.width / 2);\n geometry.centerY = finiteNumber(geometry.centerY, geometry.height * 0.78);\n geometry.radius = Math.max(1, finiteNumber(geometry.radius, Math.min(geometry.width, geometry.height) * 0.4));\n geometry.startAngle = finiteNumber(geometry.startAngle, 180);\n geometry.endAngle = finiteNumber(geometry.endAngle, 360);\n if (Math.abs(geometry.endAngle - geometry.startAngle) < 0.001) geometry.endAngle = geometry.startAngle + 180;\n if (Math.abs(geometry.endAngle - geometry.startAngle) > 360) {\n geometry.endAngle = geometry.startAngle + Math.sign(geometry.endAngle - geometry.startAngle) * 360;\n }\n geometry.preserveAspectRatio = String(geometry.preserveAspectRatio || 'xMidYMid meet');\n geometry.aspectRatio = geometry.aspectRatio === null || geometry.aspectRatio === undefined\n ? null\n : Math.max(0.000001, finiteNumber(geometry.aspectRatio, geometry.width / geometry.height));\n}\n\nfunction validateLinear(linear) {\n linear.originY = finiteNumber(linear.originY, 140);\n linear.startX = finiteNumber(linear.startX, 36);\n linear.startY = finiteNumber(linear.startY, 0);\n linear.endX = finiteNumber(linear.endX, 284);\n linear.endY = finiteNumber(linear.endY, linear.startY);\n if (Math.hypot(linear.endX - linear.startX, linear.endY - linear.startY) < 0.001) {\n linear.endX = linear.startX + 1;\n linear.endY = linear.startY;\n }\n linear.tickSide = VALID_LINEAR_TICK_SIDES.has(linear.tickSide) ? linear.tickSide : 'negative';\n linear.labelOffset = finiteNumber(linear.labelOffset, 34);\n linear.zoneOffset = finiteNumber(linear.zoneOffset, -12);\n}\n\nfunction validateFace(face) {\n face.shape = VALID_FACE_SHAPES.has(face.shape) ? face.shape : 'panel';\n face.fit = VALID_FACE_FITS.has(face.fit) ? face.fit : 'geometry';\n face.contentPadding = Math.max(0, finiteNumber(face.contentPadding, 8));\n face.minWidth = face.minWidth === null || face.minWidth === undefined\n ? null\n : Math.max(1, finiteNumber(face.minWidth, 1));\n face.minHeight = face.minHeight === null || face.minHeight === undefined\n ? null\n : Math.max(1, finiteNumber(face.minHeight, 1));\n face.clipContent = face.clipContent === true;\n face.x = finiteNumber(face.x, 6);\n face.y = finiteNumber(face.y, 6);\n face.width = Math.max(1, finiteNumber(face.width, 308));\n face.height = Math.max(1, finiteNumber(face.height, 208));\n face.cornerRadius = Math.max(0, finiteNumber(face.cornerRadius, 18));\n face.strokeWidth = Math.max(0, finiteNumber(face.strokeWidth, 2));\n face.innerStrokeWidth = Math.max(0, finiteNumber(face.innerStrokeWidth, 1));\n}\n\nfunction validateScale(options) {\n options.scale.endpointMode = VALID_ENDPOINT_MODES.has(options.scale.endpointMode)\n ? options.scale.endpointMode\n : 'auto';\n options.scale.radius = Math.max(1, finiteNumber(options.scale.radius, options.geometry.radius));\n options.scale.position = VALID_POSITIONS.has(options.scale.position) ? options.scale.position : 'inside';\n options.scale.major.divisions = Math.max(1, Math.floor(finiteNumber(options.scale.major.divisions, 5)));\n options.scale.major.length = Math.max(0, finiteNumber(options.scale.major.length, 13));\n options.scale.major.width = Math.max(0, finiteNumber(options.scale.major.width, 2));\n options.scale.minor.subdivisions = Math.max(0, Math.floor(finiteNumber(options.scale.minor.subdivisions, 4)));\n options.scale.minor.length = Math.max(0, finiteNumber(options.scale.minor.length, 7));\n options.scale.minor.width = Math.max(0, finiteNumber(options.scale.minor.width, 1));\n}\n\nfunction validatePointer(pointer) {\n pointer.type = VALID_POINTERS.has(pointer.type) ? pointer.type : 'needle';\n pointer.length = Math.max(0, finiteNumber(pointer.length, 94));\n pointer.shaftLength = pointer.shaftLength === null || pointer.shaftLength === undefined\n ? null\n : Math.min(pointer.length, Math.max(0, finiteNumber(pointer.shaftLength, pointer.length)));\n pointer.tailLength = Math.max(0, finiteNumber(pointer.tailLength, 13));\n pointer.width = Math.max(0.5, finiteNumber(pointer.width, 8));\n pointer.strokeWidth = Math.max(0, finiteNumber(pointer.strokeWidth, 0));\n pointer.cap.radius = Math.max(0, finiteNumber(pointer.cap.radius, 8));\n pointer.cap.strokeWidth = Math.max(0, finiteNumber(pointer.cap.strokeWidth, 2));\n pointer.cap.stackOrder = VALID_CAP_STACK_ORDERS.has(pointer.cap.stackOrder)\n ? pointer.cap.stackOrder\n : 'above';\n}\n\nfunction validateIndicator(indicator, requestedIndicator = {}) {\n indicator.visible = indicator.visible === true;\n indicator.type = VALID_INDICATOR_TYPES.has(indicator.type) ? indicator.type : 'hairline';\n indicator.position = VALID_INDICATOR_POSITIONS.has(indicator.position) ? indicator.position : 'cross';\n indicator.length = Math.max(0, finiteNumber(indicator.length, 76));\n // centerOffset is the public orientation-independent control: positive values\n // move a left-to-right horizontal indicator upward. The older signed offset\n // remains accepted and is converted without changing its previous behaviour.\n const explicitCenterOffset = isPlainObject(requestedIndicator)\n && Object.prototype.hasOwnProperty.call(requestedIndicator, 'centerOffset');\n const explicitLegacyOffset = isPlainObject(requestedIndicator)\n && Object.prototype.hasOwnProperty.call(requestedIndicator, 'offset');\n if (explicitCenterOffset) indicator.centerOffset = finiteNumber(requestedIndicator.centerOffset, 0);\n else if (explicitLegacyOffset) indicator.centerOffset = -finiteNumber(requestedIndicator.offset, 0);\n else if (indicator.centerOffset === null || indicator.centerOffset === undefined) {\n indicator.centerOffset = -finiteNumber(indicator.offset, 0);\n } else indicator.centerOffset = finiteNumber(indicator.centerOffset, 0);\n indicator.offset = -indicator.centerOffset;\n indicator.width = Math.max(0.5, finiteNumber(indicator.width, 2));\n indicator.strokeWidth = Math.max(0, finiteNumber(indicator.strokeWidth, 0));\n indicator.opacity = Math.min(1, Math.max(0, finiteNumber(indicator.opacity, 1)));\n indicator.markerSize = Math.max(1, finiteNumber(indicator.markerSize, 8));\n indicator.carriageWidth = Math.max(1, finiteNumber(indicator.carriageWidth, 14));\n indicator.carriageRadius = Math.max(0, finiteNumber(indicator.carriageRadius, 4));\n indicator.cap.radius = Math.max(0, finiteNumber(indicator.cap.radius, 4));\n indicator.cap.strokeWidth = Math.max(0, finiteNumber(indicator.cap.strokeWidth, 1));\n indicator.cap.stackOrder = VALID_CAP_STACK_ORDERS.has(indicator.cap.stackOrder)\n ? indicator.cap.stackOrder\n : 'above';\n}\n\nfunction validateCenterZero(centerZero, options) {\n centerZero.zeroValue = finiteNumber(centerZero.zeroValue, 0);\n centerZero.symmetric = centerZero.symmetric === true;\n if (centerZero.symmetric) {\n const magnitude = Math.max(\n Math.abs(options.min - centerZero.zeroValue),\n Math.abs(options.max - centerZero.zeroValue),\n 1\n );\n options.min = centerZero.zeroValue - magnitude;\n options.max = centerZero.zeroValue + magnitude;\n }\n centerZero.marker.visible = centerZero.marker.visible === true;\n centerZero.marker.radius = centerZero.marker.radius === null || centerZero.marker.radius === undefined\n ? null\n : Math.max(0, finiteNumber(centerZero.marker.radius, options.scale.radius));\n centerZero.marker.position = VALID_INDICATOR_POSITIONS.has(centerZero.marker.position)\n ? centerZero.marker.position\n : 'cross';\n centerZero.marker.centerOffset = finiteNumber(centerZero.marker.centerOffset, 0);\n centerZero.marker.length = Math.max(0, finiteNumber(centerZero.marker.length, 20));\n centerZero.marker.width = Math.max(0.5, finiteNumber(centerZero.marker.width, 3));\n centerZero.marker.opacity = Math.min(1, Math.max(0, finiteNumber(centerZero.marker.opacity, 1)));\n centerZero.marker.lineCap = String(centerZero.marker.lineCap || 'round');\n}\n\nfunction validateTape(tape) {\n tape.orientation = VALID_ORIENTATIONS.has(tape.orientation) ? tape.orientation : 'vertical';\n tape.x = finiteNumber(tape.x, 64);\n tape.y = finiteNumber(tape.y, 58);\n tape.width = Math.max(20, finiteNumber(tape.width, 192));\n tape.height = Math.max(20, finiteNumber(tape.height, 210));\n tape.cornerRadius = Math.max(0, finiteNumber(tape.cornerRadius, 12));\n tape.windowStrokeWidth = Math.max(0, finiteNumber(tape.windowStrokeWidth, 2));\n tape.windowInnerStrokeWidth = Math.max(0, finiteNumber(tape.windowInnerStrokeWidth, 1));\n tape.minorTickOpacity = Math.min(1, Math.max(0, finiteNumber(tape.minorTickOpacity, 0.85)));\n tape.majorTickWidth = Math.max(0.5, finiteNumber(tape.majorTickWidth, 2));\n tape.minorTickWidth = Math.max(0.5, finiteNumber(tape.minorTickWidth, 1));\n tape.majorTickLength = Math.max(0, finiteNumber(tape.majorTickLength, 24));\n tape.minorTickLength = Math.max(0, finiteNumber(tape.minorTickLength, 12));\n tape.tickInset = finiteNumber(tape.tickInset, 64);\n tape.labelOffset = finiteNumber(tape.labelOffset, 10);\n tape.interval = tape.interval === null || tape.interval === undefined\n ? null\n : Math.max(0.000001, finiteNumber(tape.interval, 1));\n tape.minorSubdivisions = Math.max(0, Math.floor(finiteNumber(tape.minorSubdivisions, 4)));\n tape.majorSpacing = Math.max(2, finiteNumber(tape.majorSpacing, 52));\n tape.indicatorWidth = Math.max(0.5, finiteNumber(tape.indicatorWidth, 2.5));\n const fadeAxisSize = tape.orientation === 'horizontal' ? tape.width : tape.height;\n tape.fadeSize = Math.min(fadeAxisSize / 2, Math.max(0, finiteNumber(tape.fadeSize, 32)));\n tape.colorByZone = tape.colorByZone === true;\n}\n\nfunction validateLight(light) {\n light.visible = light.visible === true;\n light.x = finiteNumber(light.x, 160);\n light.y = finiteNumber(light.y, 110);\n light.radius = Math.max(1, finiteNumber(light.radius, 8));\n light.color = VALID_LIGHT_COLORS.has(light.color) ? light.color : 'amber';\n light.customColor = light.customColor === null || light.customColor === undefined\n ? ''\n : String(light.customColor).trim();\n light.offColor = normalizeColor(light.offColor, '#f3ead6');\n light.offEdgeColor = normalizeColor(light.offEdgeColor, '#817768');\n light.bezelColor = normalizeColor(light.bezelColor, '#4b5563');\n light.bezelHighlightColor = normalizeColor(light.bezelHighlightColor, '#f8fafc');\n light.opacity = Math.min(1, Math.max(0, finiteNumber(light.opacity, 1)));\n light.on = light.on === true;\n light.glow = light.glow !== false;\n light.pulse = light.pulse !== false;\n light.pulseInterval = Math.max(400, finiteNumber(light.pulseInterval, 2600));\n light.blink = light.blink === true;\n light.blinkInterval = Math.max(100, finiteNumber(light.blinkInterval, 1000));\n light.trigger = isPlainObject(light.trigger) ? light.trigger : {};\n light.trigger.mode = VALID_LIGHT_TRIGGER_MODES.has(light.trigger.mode)\n ? light.trigger.mode\n : 'manual';\n light.trigger.source = VALID_LIGHT_TRIGGER_SOURCES.has(light.trigger.source)\n ? light.trigger.source\n : 'target';\n light.trigger.value = finiteNumber(light.trigger.value, 0);\n light.trigger.min = finiteNumber(light.trigger.min, light.trigger.value);\n light.trigger.max = finiteNumber(light.trigger.max, light.trigger.value);\n if (light.trigger.max < light.trigger.min) {\n [light.trigger.min, light.trigger.max] = [light.trigger.max, light.trigger.min];\n }\n}\n\nfunction normalizeColor(value, fallback) {\n if (value === null || value === undefined) return fallback;\n const normalized = String(value).trim();\n return normalized || fallback;\n}\n\nfunction validateLabels(labels) {\n labels.radius = Math.max(0, finiteNumber(labels.radius, 84));\n labels.fontSize = Math.max(1, finiteNumber(labels.fontSize, 11));\n labels.fractionDigits = Math.max(0, Math.min(12, Math.floor(finiteNumber(labels.fractionDigits, 0))));\n labels.rotation = VALID_ROTATIONS.has(labels.rotation) ? labels.rotation : 'horizontal';\n}\n\nfunction validateReadout(readout) {\n readout.visible = readout.visible !== false;\n validateReadoutPart(readout.title, 14);\n validateReadoutPart(readout.value, 38);\n validateReadoutPart(readout.unit, 12);\n readout.value.fractionDigits = Math.max(\n 0,\n Math.min(12, Math.floor(finiteNumber(readout.value.fractionDigits, 0)))\n );\n}\n\nfunction validateReadoutPart(part, defaultFontSize) {\n part.visible = part.visible === true;\n part.x = part.x === 'auto' ? 'auto' : finiteNumber(part.x, 160);\n part.y = part.y === 'auto' ? 'auto' : finiteNumber(part.y, 0);\n part.position = VALID_READOUT_POSITIONS.has(part.position) ? part.position : 'top';\n part.margin = Math.max(0, finiteNumber(part.margin, 12));\n part.offsetX = finiteNumber(part.offsetX, 0);\n part.offsetY = finiteNumber(part.offsetY, 0);\n part.fontSize = Math.max(1, finiteNumber(part.fontSize, defaultFontSize));\n part.letterSpacing = finiteNumber(part.letterSpacing, 0);\n}\n\nfunction validateAnimation(animation) {\n animation.duration = Math.max(0, finiteNumber(animation.duration, 850));\n if (typeof animation.startFrom !== 'number' && !['min', 'max', 'value'].includes(animation.startFrom)) {\n animation.startFrom = 'min';\n }\n}\n\nfunction validateJitter(jitter) {\n jitter.amplitude = Math.max(0, finiteNumber(jitter.amplitude, 0.45));\n jitter.amplitudeUnit = jitter.amplitudeUnit === 'percent' ? 'percent' : 'value';\n jitter.frequency = Math.max(0.1, finiteNumber(jitter.frequency, 4));\n jitter.smoothing = Math.min(0.999, Math.max(0, finiteNumber(jitter.smoothing, 0.86)));\n}\n\nfunction normalizeZones(zones, min, max, defaultWidth) {\n if (!Array.isArray(zones)) return [];\n return zones\n .filter(isPlainObject)\n .map((zone) => {\n const width = zone.width === undefined ? undefined : Math.max(0, finiteNumber(zone.width, 0));\n const taper = normalizeZoneTaper(zone.taper, width ?? defaultWidth);\n return {\n ...zone,\n min: Math.max(min, finiteNumber(zone.min, min)),\n max: Math.min(max, finiteNumber(zone.max, max)),\n color: zone.color ?? zone.strokeStyle ?? 'transparent',\n width,\n taper,\n radius: zone.radius === undefined ? undefined : Math.max(0, finiteNumber(zone.radius, 0)),\n offset: zone.offset === undefined ? undefined : finiteNumber(zone.offset, 0),\n opacity: zone.opacity === undefined ? 1 : Math.min(1, Math.max(0, finiteNumber(zone.opacity, 1)))\n };\n })\n .filter((zone) => zone.max > zone.min);\n}\n\nfunction restoreOptionShape(options, fallbacks) {\n if (!isPlainObject(options)) return cloneValue(fallbacks);\n for (const [key, fallback] of Object.entries(fallbacks)) {\n if (!isPlainObject(fallback)) continue;\n options[key] = restoreOptionShape(options[key], fallback);\n }\n return options;\n}\n\nfunction normalizeZoneTaper(taper, fallbackWidth) {\n if (!isPlainObject(taper)) return undefined;\n const startWidth = taper.startWidth === undefined\n ? fallbackWidth\n : Math.max(0, finiteNumber(taper.startWidth, fallbackWidth ?? 0));\n const endWidth = taper.endWidth === undefined\n ? fallbackWidth\n : Math.max(0, finiteNumber(taper.endWidth, fallbackWidth ?? startWidth ?? 0));\n return {\n startWidth,\n endWidth,\n segments: Math.max(2, Math.min(256, Math.floor(finiteNumber(taper.segments, 48))))\n };\n}\n", "import { SvgRenderer } from '../renderer/svg.js';\nimport { resolveEasing } from './easing.js';\nimport { mergeUserOptions, resolveGaugeOptions } from './options.js';\nimport {\n cancelFrame,\n clamp,\n dispatchGaugeEvent,\n finiteNumber,\n requestFrame,\n resolveElement\n} from './utils.js';\n\n/**\n * Main Gaugeit instance.\n *\n * The class owns configuration, lifecycle, animation, jitter, accessibility,\n * and a renderer. Gauge types remain declarative layer collections in the registry.\n */\nexport class Gauge {\n constructor(target, userOptions, registry, lifecycle = {}) {\n this.host = resolveElement(target);\n this.registry = registry;\n this._onDestroy = typeof lifecycle.onDestroy === 'function' ? lifecycle.onDestroy : null;\n this.userOptions = mergeUserOptions({}, userOptions || {});\n this.options = resolveGaugeOptions(this.userOptions, registry);\n this.renderer = new SvgRenderer(this.host, this.options);\n\n this._destroyed = false;\n this._paused = false;\n this._pausedAt = 0;\n this._lifecycleSuspendedAt = 0;\n this._onscreen = true;\n this._frameHandle = null;\n this._animation = null;\n this._targetValue = this._normalizeIncomingValue(this.options.value);\n this._baseValue = this._targetValue;\n this._displayValue = this._targetValue;\n this._pointerValue = this._targetValue;\n this._jitterOffset = 0;\n this._jitterTarget = 0;\n this._lastJitterTargetAt = 0;\n this._lastFrameAt = 0;\n this._visibilityHandler = null;\n this._intersectionObserver = null;\n\n this._syncLifecycleObservers();\n this.render();\n this._initializeValue();\n }\n\n /** Fully rebuilds static layers and dynamic controllers. */\n render() {\n this._assertAlive();\n this.renderer.options = this.options;\n this.renderer.begin();\n\n const definition = this.registry.get(this.options.type);\n const context = {\n gauge: this,\n options: this.options,\n renderer: this.renderer,\n registry: this.registry\n };\n\n for (const layer of definition.layers) {\n const controller = layer.render(context);\n this.renderer.addController(controller);\n }\n\n this._updateDynamic(this._displayValue, true, this._pointerValue);\n this.renderer.finish();\n dispatchGaugeEvent(this.host, 'render', {\n gauge: this,\n type: this.options.type,\n value: this._targetValue\n });\n return this;\n }\n\n /** Sets a new gauge value. */\n setValue(value, updateOptions = {}) {\n this._assertAlive();\n const normalized = this._normalizeIncomingValue(value);\n const duration = Math.max(0, finiteNumber(updateOptions.duration, this.options.animation.duration));\n const animate = updateOptions.animate !== false\n && this.options.animation.enabled\n && duration > 0\n && !this._prefersReducedMotion();\n\n this._targetValue = normalized;\n this.options.value = normalized;\n\n if (!animate) {\n this._animation = null;\n this._baseValue = normalized;\n this._displayValue = normalized;\n this._pointerValue = normalized;\n this._jitterOffset = 0;\n this._updateDynamic(normalized, true, normalized);\n this._ensureLoop();\n this._emitChange();\n return this;\n }\n\n const easing = resolveEasing(updateOptions.easing || this.options.animation.easing);\n const now = performanceNow();\n this._animation = {\n from: this._baseValue,\n to: normalized,\n startedAt: now,\n duration,\n easing\n };\n dispatchGaugeEvent(this.host, 'animationstart', {\n gauge: this,\n from: this._animation.from,\n to: normalized,\n duration\n });\n this._ensureLoop();\n this._emitChange();\n return this;\n }\n\n /** Gauge.js-compatible convenience alias. */\n set(value, updateOptions = {}) {\n return this.setValue(value, updateOptions);\n }\n\n /** Updates options by recursively merging a partial patch into the current user options. */\n updateOptions(patch, behavior = {}) {\n this._assertAlive();\n const requested = patch || {};\n return this._applyUserOptions(\n mergeUserOptions(this.userOptions, requested),\n Object.prototype.hasOwnProperty.call(requested, 'value'),\n behavior\n );\n }\n\n /** Replaces the complete user-option object while preserving the current value unless supplied. */\n replaceOptions(options = {}, behavior = {}) {\n this._assertAlive();\n const requested = options || {};\n return this._applyUserOptions(\n mergeUserOptions({}, requested),\n Object.prototype.hasOwnProperty.call(requested, 'value'),\n behavior\n );\n }\n\n /** Gauge.js-style alias for updateOptions. */\n setOptions(patch, behavior = {}) {\n return this.updateOptions(patch, behavior);\n }\n\n _applyUserOptions(nextUserOptions, hadExplicitValue, behavior) {\n const previousType = this.options.type;\n this.userOptions = nextUserOptions;\n this.options = resolveGaugeOptions(this.userOptions, this.registry);\n this.renderer.options = this.options;\n this._syncLifecycleObservers();\n\n const value = hadExplicitValue ? this.options.value : this._targetValue;\n this._targetValue = this._normalizeIncomingValue(value);\n\n if (hadExplicitValue && !behavior.animateToValue) {\n this._animation = null;\n this._baseValue = this._targetValue;\n this._displayValue = this._targetValue;\n this._pointerValue = this._targetValue;\n this._jitterOffset = 0;\n } else {\n this._baseValue = this._normalizeIncomingValue(this._baseValue);\n this._displayValue = this._normalizeIncomingValue(this._displayValue);\n this._pointerValue = this._displayClamp(this._baseValue + this._jitterOffset);\n }\n\n this.options.value = this._targetValue;\n this.render();\n\n if (behavior.animateToValue) this.setValue(this._targetValue, { animate: true });\n else this._updateDynamic(this._displayValue, true, this._pointerValue);\n\n if (previousType !== this.options.type) {\n dispatchGaugeEvent(this.host, 'typechange', {\n gauge: this,\n previousType,\n type: this.options.type\n });\n }\n this._ensureLoop();\n return this;\n }\n\n /** Returns the last requested stable value. */\n getValue() {\n return this._targetValue;\n }\n\n /** Returns the currently rendered base value; visual pointer jitter is excluded. */\n getDisplayedValue() {\n return this._displayValue;\n }\n\n /** Temporarily stops animation and jitter work. */\n pause() {\n if (this._destroyed || this._paused) return this;\n this._paused = true;\n this._pausedAt = performanceNow();\n cancelFrame(this._frameHandle);\n this._frameHandle = null;\n dispatchGaugeEvent(this.host, 'pause', { gauge: this });\n return this;\n }\n\n /** Resumes pending animation and jitter work. */\n resume() {\n if (this._destroyed || !this._paused) return this;\n const now = performanceNow();\n const suspensionStartedAt = this._lifecycleSuspendedAt > 0\n ? Math.min(this._pausedAt, this._lifecycleSuspendedAt)\n : this._pausedAt;\n this._paused = false;\n if (this._animation && suspensionStartedAt > 0) {\n this._animation.startedAt += Math.max(0, now - suspensionStartedAt);\n }\n this._pausedAt = 0;\n this._lifecycleSuspendedAt = this._isLifecycleBlocked() ? now : 0;\n this._lastFrameAt = 0;\n this._ensureLoop();\n dispatchGaugeEvent(this.host, 'resume', { gauge: this });\n return this;\n }\n\n /** Re-renders after custom CSS variables, fonts, or plugin state changed. */\n refresh() {\n return this.render();\n }\n\n /** Releases frames, observers, listeners, and generated DOM. */\n destroy() {\n if (this._destroyed) return;\n this._destroyed = true;\n cancelFrame(this._frameHandle);\n this._frameHandle = null;\n this._animation = null;\n\n this._removeLifecycleObservers();\n this.renderer.destroy();\n const onDestroy = this._onDestroy;\n this._onDestroy = null;\n if (onDestroy) onDestroy(this);\n dispatchGaugeEvent(this.host, 'destroy', { gauge: this });\n }\n\n _initializeValue() {\n const animation = this.options.animation;\n if (!animation.enabled || !animation.animateOnInit || animation.duration <= 0 || this._prefersReducedMotion()) {\n this._baseValue = this._targetValue;\n this._displayValue = this._targetValue;\n this._pointerValue = this._targetValue;\n this._updateDynamic(this._targetValue, true, this._targetValue);\n this._ensureLoop();\n return;\n }\n\n const start = this._resolveInitialValue(animation.startFrom);\n if (Object.is(start, this._targetValue)) {\n this._updateDynamic(this._targetValue, true);\n this._ensureLoop();\n return;\n }\n\n const target = this._targetValue;\n this._baseValue = start;\n this._displayValue = start;\n this._pointerValue = start;\n this._updateDynamic(start, true, start);\n this.setValue(target, { animate: true });\n }\n\n _resolveInitialValue(startFrom) {\n if (typeof startFrom === 'number') return this._normalizeIncomingValue(startFrom);\n if (startFrom === 'max') return this.options.max;\n if (startFrom === 'value') return this._targetValue;\n return this.options.min;\n }\n\n _normalizeIncomingValue(value) {\n const number = finiteNumber(value, this.options.min);\n if (this.options.overflow === 'allow') return number;\n if (this.options.overflow === 'expand') {\n let changed = false;\n if (number < this.options.min) {\n this.userOptions.min = number;\n changed = true;\n }\n if (number > this.options.max) {\n this.userOptions.max = number;\n changed = true;\n }\n if (changed) {\n this.options = resolveGaugeOptions(this.userOptions, this.registry);\n if (this.renderer) {\n this.renderer.options = this.options;\n if (this.renderer.svg) this.render();\n }\n }\n return number;\n }\n return clamp(number, this.options.min, this.options.max);\n }\n\n _ensureLoop() {\n if (this._destroyed || this._paused || this._frameHandle !== null) return;\n if (!this._shouldRun()) return;\n this._frameHandle = requestFrame((timestamp) => this._frame(timestamp));\n }\n\n _frame(timestamp) {\n this._frameHandle = null;\n if (this._destroyed || this._paused || !this._shouldRun()) return;\n\n const now = Number.isFinite(timestamp) ? timestamp : performanceNow();\n const delta = this._lastFrameAt > 0 ? Math.min(100, Math.max(0, now - this._lastFrameAt)) : 16.667;\n this._lastFrameAt = now;\n let animationCompleted = false;\n\n if (this._animation) {\n const elapsed = now - this._animation.startedAt;\n const progress = this._animation.duration <= 0 ? 1 : clamp(elapsed / this._animation.duration, 0, 1);\n const eased = this._animation.easing(progress);\n this._baseValue = this._animation.from + (this._animation.to - this._animation.from) * eased;\n if (progress >= 1) {\n const completed = this._animation;\n this._baseValue = completed.to;\n this._animation = null;\n animationCompleted = true;\n dispatchGaugeEvent(this.host, 'animationend', {\n gauge: this,\n value: completed.to\n });\n }\n }\n\n const jitter = this.options.effects.jitter;\n const jitterActive = jitter.enabled && (!jitter.whenIdleOnly || !this._animation);\n if (jitterActive) {\n const interval = 1000 / jitter.frequency;\n if (this._lastJitterTargetAt === 0 || now - this._lastJitterTargetAt >= interval) {\n this._jitterTarget = (Math.random() * 2 - 1) * this._jitterAmplitude();\n this._lastJitterTargetAt = now;\n }\n const smoothingFactor = 1 - Math.pow(jitter.smoothing, delta / 16.667);\n this._jitterOffset += (this._jitterTarget - this._jitterOffset) * smoothingFactor;\n } else {\n this._jitterTarget = 0;\n const smoothingFactor = 1 - Math.pow(jitter.smoothing, delta / 16.667);\n this._jitterOffset += (0 - this._jitterOffset) * smoothingFactor;\n if (Math.abs(this._jitterOffset) < 0.000001) this._jitterOffset = 0;\n }\n\n const nextDisplay = this._displayClamp(this._baseValue);\n const nextPointer = this._displayClamp(this._baseValue + this._jitterOffset);\n this._updateDynamic(nextDisplay, false, nextPointer);\n\n if (animationCompleted) this._emitSettled();\n if (this._needsAnotherFrame()) this._ensureLoop();\n }\n\n _needsAnotherFrame() {\n if (this._animation) return true;\n const jitter = this.options.effects.jitter;\n if (jitter.enabled) return true;\n return Math.abs(this._jitterOffset) > 0.000001;\n }\n\n _jitterAmplitude() {\n const jitter = this.options.effects.jitter;\n if (jitter.amplitudeUnit === 'percent') {\n return (this.options.max - this.options.min) * jitter.amplitude / 100;\n }\n return jitter.amplitude;\n }\n\n _displayClamp(value) {\n return this.options.overflow === 'allow' ? value : clamp(value, this.options.min, this.options.max);\n }\n\n _updateDynamic(value, force, pointerValue = value) {\n const rounded = roundValue(value, this.options.precision);\n const displayChanged = !Object.is(rounded, this._displayValue);\n const pointerChanged = !Object.is(pointerValue, this._pointerValue);\n if (!force && !displayChanged && !pointerChanged) return;\n this._displayValue = rounded;\n this._pointerValue = pointerValue;\n this.renderer.update(rounded, {\n gauge: this,\n targetValue: this._targetValue,\n baseValue: this._baseValue,\n pointerValue,\n animated: Boolean(this._animation),\n jitterOffset: this._jitterOffset\n });\n if (force || displayChanged) {\n this._updateAccessibility(rounded);\n dispatchGaugeEvent(this.host, 'displaychange', {\n gauge: this,\n value: this._targetValue,\n displayedValue: rounded\n });\n }\n }\n\n _updateAccessibility(value) {\n const root = this.renderer.root;\n if (!root) return;\n root.setAttribute('role', 'meter');\n root.setAttribute('aria-label', this.options.accessibility.label);\n root.setAttribute('aria-valuemin', String(this.options.min));\n root.setAttribute('aria-valuemax', String(this.options.max));\n root.setAttribute('aria-valuenow', String(value));\n\n const valueText = this.options.accessibility.valueText;\n if (typeof valueText === 'function') {\n root.setAttribute('aria-valuetext', String(valueText(value, this.options)));\n } else if (typeof valueText === 'string' && valueText) {\n root.setAttribute('aria-valuetext', valueText);\n } else {\n root.removeAttribute('aria-valuetext');\n }\n }\n\n _emitChange() {\n dispatchGaugeEvent(this.host, 'change', {\n gauge: this,\n value: this._targetValue,\n displayedValue: this._displayValue\n });\n }\n\n _emitSettled() {\n dispatchGaugeEvent(this.host, 'settled', {\n gauge: this,\n value: this._targetValue,\n displayedValue: this._displayValue\n });\n }\n\n _syncLifecycleObservers() {\n this._removeLifecycleObservers();\n this._onscreen = true;\n this._lifecycleSuspendedAt = 0;\n this._installLifecycleObservers();\n }\n\n _removeLifecycleObservers() {\n if (this._visibilityHandler && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this._visibilityHandler);\n }\n this._visibilityHandler = null;\n if (this._intersectionObserver) this._intersectionObserver.disconnect();\n this._intersectionObserver = null;\n }\n\n _installLifecycleObservers() {\n if (typeof document !== 'undefined' && this.options.performance.pauseWhenHidden) {\n this._visibilityHandler = () => {\n if (document.hidden) {\n this._suspendForLifecycle();\n return;\n }\n this._resumeFromLifecycle();\n };\n document.addEventListener('visibilitychange', this._visibilityHandler, { passive: true });\n if (document.hidden) this._suspendForLifecycle();\n }\n\n if (typeof IntersectionObserver === 'function' && this.options.performance.pauseWhenOffscreen) {\n this._intersectionObserver = new IntersectionObserver((entries) => {\n const entry = entries[0];\n this._onscreen = Boolean(entry && entry.isIntersecting);\n if (!this._onscreen) {\n this._suspendForLifecycle();\n } else {\n this._resumeFromLifecycle();\n }\n }, { rootMargin: '100px' });\n this._intersectionObserver.observe(this.host);\n }\n }\n\n _shouldRun() {\n if (this._isLifecycleBlocked()) return false;\n return this._needsAnotherFrame();\n }\n\n _isLifecycleBlocked() {\n if (typeof document !== 'undefined' && this.options.performance.pauseWhenHidden && document.hidden) return true;\n return this.options.performance.pauseWhenOffscreen && !this._onscreen;\n }\n\n _suspendForLifecycle() {\n if (this._lifecycleSuspendedAt === 0) this._lifecycleSuspendedAt = performanceNow();\n cancelFrame(this._frameHandle);\n this._frameHandle = null;\n }\n\n _resumeFromLifecycle() {\n if (typeof document !== 'undefined' && this.options.performance.pauseWhenHidden && document.hidden) return;\n if (this.options.performance.pauseWhenOffscreen && !this._onscreen) return;\n if (this._paused) return;\n if (this._lifecycleSuspendedAt > 0 && this._animation) {\n this._animation.startedAt += Math.max(0, performanceNow() - this._lifecycleSuspendedAt);\n }\n this._lifecycleSuspendedAt = 0;\n this._lastFrameAt = 0;\n this._ensureLoop();\n }\n\n _prefersReducedMotion() {\n if (!this.options.animation.respectReducedMotion || typeof matchMedia !== 'function') return false;\n return matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n\n _assertAlive() {\n if (this._destroyed) throw new Error('This Gaugeit instance has been destroyed.');\n }\n}\n\nfunction performanceNow() {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') return performance.now();\n return Date.now();\n}\n\nfunction roundValue(value, precision) {\n const factor = Math.pow(10, precision);\n return Math.round(value * factor) / factor;\n}\n", "import { cloneValue, isPlainObject } from './utils.js';\n\n/** Registry for built-in and application-defined gauge types. */\nexport class GaugeTypeRegistry {\n constructor() {\n this._types = new Map();\n }\n\n /** Registers or replaces a gauge type. */\n register(name, definition) {\n const normalizedName = String(name || '').trim();\n if (!normalizedName) throw new TypeError('Gauge type name must be a non-empty string.');\n if (!isPlainObject(definition)) throw new TypeError(`Gauge type \"${normalizedName}\" must be an object.`);\n if (!Array.isArray(definition.layers) || definition.layers.length === 0) {\n throw new TypeError(`Gauge type \"${normalizedName}\" must define at least one layer.`);\n }\n\n const normalizedLayers = definition.layers.map((layer, index) => {\n if (!layer || typeof layer.render !== 'function') {\n throw new TypeError(`Layer ${index} in gauge type \"${normalizedName}\" must expose render(context).`);\n }\n return layer;\n });\n\n this._types.set(normalizedName, {\n name: normalizedName,\n defaults: cloneValue(definition.defaults || {}),\n layers: normalizedLayers,\n description: String(definition.description || ''),\n configure: typeof definition.configure === 'function' ? definition.configure : null\n });\n\n return this;\n }\n\n /** Returns a registered gauge type definition. */\n get(name) {\n const definition = this._types.get(String(name));\n if (!definition) throw new Error(`Unknown Gaugeit gauge type: ${name}`);\n return definition;\n }\n\n /** Returns whether a type exists. */\n has(name) {\n return this._types.has(String(name));\n }\n\n /** Returns registered type names. */\n names() {\n return [...this._types.keys()];\n }\n\n /** Returns a serializable description of the registry. */\n describe() {\n return [...this._types.values()].map((definition) => ({\n name: definition.name,\n description: definition.description\n }));\n }\n}\n\nexport const gaugeTypeRegistry = new GaugeTypeRegistry();\n", "import { svgElement } from '../renderer/svg.js';\nimport { resolveFaceBox } from '../geometry/bounds.js';\n\n/** Draws an optional classic instrument face, bezel, shadow, glass, and content clip. */\nexport const faceLayer = {\n id: 'face',\n render(context) {\n const { options, renderer } = context;\n const face = options.face;\n if (!face.visible) return null;\n\n const group = renderer.group('face', { 'aria-hidden': 'true' });\n const box = resolveFaceBox(options, renderer.getContentBounds());\n const shadowId = `${renderer.id}-face-shadow`;\n const glassId = `${renderer.id}-glass`;\n const clipId = `${renderer.id}-face-content-clip`;\n const inset = Math.max(3, face.strokeWidth + 2);\n const innerBox = insetFaceBox(box, inset);\n const defs = svgElement('defs');\n\n if (face.shadow) {\n const filter = svgElement('filter', {\n id: shadowId,\n x: '-20%',\n y: '-20%',\n width: '140%',\n height: '140%'\n });\n filter.append(svgElement('feDropShadow', {\n dx: 0,\n dy: 3,\n stdDeviation: 4,\n 'flood-color': '#000000',\n 'flood-opacity': 0.18\n }));\n defs.append(filter);\n }\n\n if (face.glass) {\n const gradient = svgElement('linearGradient', {\n id: glassId,\n x1: '0%',\n y1: '0%',\n x2: '0%',\n y2: '100%'\n });\n gradient.append(\n svgElement('stop', { offset: '0%', 'stop-color': '#ffffff', 'stop-opacity': 0.38 }),\n svgElement('stop', { offset: '48%', 'stop-color': '#ffffff', 'stop-opacity': 0.06 }),\n svgElement('stop', { offset: '100%', 'stop-color': '#ffffff', 'stop-opacity': 0 })\n );\n defs.append(gradient);\n }\n\n if (face.clipContent) {\n const clipPath = svgElement('clipPath', {\n id: clipId,\n clipPathUnits: 'userSpaceOnUse'\n });\n clipPath.append(createFaceShape(face, innerBox, {\n fill: '#ffffff',\n stroke: 'none'\n }, Math.max(0, face.cornerRadius - inset)));\n defs.append(clipPath);\n renderer.setContentClipPath(clipId);\n }\n\n if (defs.children.length > 0) group.append(defs);\n\n const base = createFaceShape(face, box, {\n fill: face.color,\n stroke: face.strokeColor,\n 'stroke-width': face.strokeWidth,\n filter: face.shadow ? `url(#${shadowId})` : undefined\n });\n base.classList.add('gaugeit__face');\n group.append(base);\n\n group.append(createFaceShape(face, innerBox, {\n class: 'gaugeit__face-inner',\n fill: 'none',\n stroke: face.innerStrokeColor,\n 'stroke-width': face.innerStrokeWidth\n }, Math.max(0, face.cornerRadius - inset)));\n\n if (face.glass) {\n if (face.shape === 'circle') {\n const radius = Math.min(box.width, box.height) / 2;\n group.append(svgElement('ellipse', {\n class: 'gaugeit__glass',\n cx: box.x + box.width / 2,\n cy: box.y + box.height / 2 - radius * 0.27,\n rx: radius * 0.68,\n ry: radius * 0.32,\n fill: `url(#${glassId})`,\n 'pointer-events': 'none'\n }));\n } else {\n group.append(svgElement('path', {\n class: 'gaugeit__glass',\n d: `M ${box.x + 14} ${box.y + 14} H ${box.x + box.width - 14} `\n + `V ${box.y + box.height * 0.52} Q ${box.x + box.width / 2} ${box.y + box.height * 0.38} `\n + `${box.x + 14} ${box.y + box.height * 0.52} Z`,\n fill: `url(#${glassId})`,\n 'pointer-events': 'none'\n }));\n }\n }\n\n return null;\n }\n};\n\nfunction insetFaceBox(box, inset) {\n return {\n x: box.x + inset,\n y: box.y + inset,\n width: Math.max(1, box.width - inset * 2),\n height: Math.max(1, box.height - inset * 2)\n };\n}\n\nfunction createFaceShape(face, box, attributes = {}, cornerRadius = face.cornerRadius) {\n if (face.shape === 'circle') {\n return svgElement('circle', {\n cx: box.x + box.width / 2,\n cy: box.y + box.height / 2,\n r: Math.max(1, Math.min(box.width, box.height) / 2),\n ...attributes\n });\n }\n\n const radius = Math.max(0, Math.min(cornerRadius, box.width / 2, box.height / 2));\n return svgElement('rect', {\n x: box.x,\n y: box.y,\n width: box.width,\n height: box.height,\n rx: radius,\n ry: radius,\n ...attributes\n });\n}\n", "import {\n arcPath,\n polarPoint,\n resolveZoneSegments,\n taperedArcPath,\n valueToAngle\n} from '../geometry/scale.js';\nimport { finiteNumber, isTransparentColor } from '../core/utils.js';\nimport { svgElement } from '../renderer/svg.js';\n\n/** Draws the base arc and value zones. Transparent zones become real visual gaps. */\nexport const zonesLayer = {\n id: 'zones',\n render(context) {\n const { options, renderer } = context;\n const group = renderer.group('zones', { 'aria-hidden': 'true' });\n const segments = resolveZoneSegments(options.min, options.max, options.zones);\n\n if (options.track.showUnderZones && options.track.visible) {\n appendArc(group, options.min, options.max, options.track, 'gaugeit__track');\n }\n\n for (const segment of segments) {\n const style = segment.zone || options.track;\n const shouldDraw = segment.zone\n ? !isTransparentColor(segment.zone.color)\n : options.track.visible && !options.track.showUnderZones;\n\n if (!shouldDraw) continue;\n appendArc(\n group,\n segment.min,\n segment.max,\n style,\n segment.zone ? 'gaugeit__zone' : 'gaugeit__track'\n );\n }\n\n return null;\n\n function appendArc(parent, min, max, style, className) {\n const nodes = createArcNodes(min, max, style, className, options);\n for (const node of nodes) {\n if (style.className) node.classList.add(String(style.className));\n parent.append(node);\n }\n }\n }\n};\n\nfunction createArcNodes(min, max, style, className, options) {\n const geometry = options.geometry;\n const radius = style.radius ?? options.track.radius ?? geometry.radius;\n const fallbackWidth = style.width ?? options.track.width;\n const color = style.color ?? options.track.color;\n const opacity = style.opacity ?? 1;\n const lineCap = style.lineCap || options.track.lineCap || 'butt';\n const startAngle = valueToAngle(min, options);\n const endAngle = valueToAngle(max, options);\n\n if (!style.taper) {\n return [svgElement('path', {\n class: className,\n d: arcPath(geometry.centerX, geometry.centerY, radius, startAngle, endAngle),\n fill: 'none',\n stroke: color,\n 'stroke-width': fallbackWidth,\n 'stroke-linecap': lineCap,\n opacity\n })];\n }\n\n const startWidth = widthAtValue(style, min, fallbackWidth);\n const endWidth = widthAtValue(style, max, fallbackWidth);\n const nodes = [svgElement('path', {\n class: `${className} ${className}--tapered`,\n d: taperedArcPath(\n geometry.centerX,\n geometry.centerY,\n radius,\n startAngle,\n endAngle,\n startWidth,\n endWidth,\n style.taper.segments\n ),\n fill: color,\n stroke: 'none',\n opacity\n })];\n\n if (lineCap === 'round') {\n const start = polarPoint(geometry.centerX, geometry.centerY, radius, startAngle);\n const end = polarPoint(geometry.centerX, geometry.centerY, radius, endAngle);\n const atZoneStart = Math.abs(min - style.min) < 1e-9;\n const atZoneEnd = Math.abs(max - style.max) < 1e-9;\n if (atZoneStart && startWidth > 0) nodes.push(capNode(className, start, startWidth, color, opacity, 'start'));\n if (atZoneEnd && endWidth > 0) nodes.push(capNode(className, end, endWidth, color, opacity, 'end'));\n }\n\n return nodes;\n}\n\nfunction widthAtValue(zone, value, fallbackWidth) {\n const taper = zone.taper || {};\n const startWidth = Math.max(0, finiteNumber(taper.startWidth, fallbackWidth));\n const endWidth = Math.max(0, finiteNumber(taper.endWidth, fallbackWidth));\n const range = Math.max(1e-12, zone.max - zone.min);\n const ratio = Math.min(1, Math.max(0, (value - zone.min) / range));\n return startWidth + (endWidth - startWidth) * ratio;\n}\n\nfunction capNode(className, point, width, color, opacity, edge) {\n return svgElement('circle', {\n class: `${className} ${className}--taper-cap`,\n 'data-gaugeit-zone-cap': edge,\n cx: point.x,\n cy: point.y,\n r: width / 2,\n fill: color,\n opacity\n });\n}\n", "import { buildMinorValues, buildScaleValues, polarPoint, roundSvg, valueToAngle } from '../geometry/scale.js';\nimport { resolveScaleEndpointValues } from '../geometry/bounds.js';\nimport { resolveMajorInterval } from '../core/options.js';\nimport { svgElement } from '../renderer/svg.js';\n\n/** Draws major and minor ticks as two compact SVG paths. */\nexport const ticksLayer = {\n id: 'ticks',\n render(context) {\n const { options, renderer } = context;\n const scale = options.scale;\n if (!scale.major.visible && !scale.minor.visible) return null;\n\n const group = renderer.group('ticks', { 'aria-hidden': 'true' });\n const interval = resolveMajorInterval(options);\n const completeMajorValues = buildScaleValues(options.min, options.max, interval);\n const majorValues = resolveScaleEndpointValues(completeMajorValues, options);\n const minorValues = buildMinorValues(completeMajorValues, scale.minor.subdivisions);\n\n if (scale.minor.visible && scale.minor.length > 0 && scale.minor.width > 0 && minorValues.length) {\n group.append(svgElement('path', {\n class: 'gaugeit__ticks gaugeit__ticks--minor',\n d: tickPath(minorValues, scale.minor.length),\n fill: 'none',\n stroke: scale.minor.color,\n 'stroke-width': scale.minor.width,\n 'stroke-linecap': 'butt',\n opacity: scale.minor.opacity,\n }));\n }\n\n if (scale.major.visible && scale.major.length > 0 && scale.major.width > 0) {\n group.append(svgElement('path', {\n class: 'gaugeit__ticks gaugeit__ticks--major',\n d: tickPath(majorValues, scale.major.length),\n fill: 'none',\n stroke: scale.major.color,\n 'stroke-width': scale.major.width,\n 'stroke-linecap': 'butt',\n opacity: scale.major.opacity,\n }));\n }\n\n renderer.setReference('majorValues', majorValues);\n return null;\n\n function tickPath(values, length) {\n const commands = [];\n for (const value of values) {\n const angle = valueToAngle(value, options);\n const radii = tickRadii(scale.radius, length, scale.position);\n const start = polarPoint(options.geometry.centerX, options.geometry.centerY, radii.start, angle);\n const end = polarPoint(options.geometry.centerX, options.geometry.centerY, radii.end, angle);\n commands.push(`M ${roundSvg(start.x)} ${roundSvg(start.y)} L ${roundSvg(end.x)} ${roundSvg(end.y)}`);\n }\n return commands.join(' ');\n }\n }\n};\n\nfunction tickRadii(radius, length, position) {\n if (position === 'outside') return { start: radius, end: radius + length };\n if (position === 'cross') return { start: radius - length / 2, end: radius + length / 2 };\n return { start: radius, end: radius - length };\n}\n", "import { buildScaleValues, polarPoint, valueToAngle } from '../geometry/scale.js';\nimport { resolveMajorInterval } from '../core/options.js';\nimport { resolveScaleEndpointValues } from '../geometry/bounds.js';\nimport { svgElement } from '../renderer/svg.js';\n\n/** Draws static numeric labels around the scale. */\nexport const labelsLayer = {\n id: 'labels',\n render(context) {\n const { options, renderer } = context;\n const labels = options.labels;\n if (!labels.visible) return null;\n\n const group = renderer.group('labels', { 'aria-hidden': 'true' });\n const interval = Number(labels.interval) > 0 ? Number(labels.interval) : resolveMajorInterval(options);\n const values = resolveScaleEndpointValues(\n buildScaleValues(options.min, options.max, interval),\n options\n );\n\n for (const value of values) {\n const angle = valueToAngle(value, options);\n const point = polarPoint(options.geometry.centerX, options.geometry.centerY, labels.radius, angle);\n const text = svgElement('text', {\n class: 'gaugeit__label',\n x: point.x,\n y: point.y,\n fill: labels.color,\n 'font-family': labels.fontFamily,\n 'font-size': labels.fontSize,\n 'font-weight': labels.fontWeight,\n 'text-anchor': 'middle',\n 'dominant-baseline': 'middle',\n transform: labelTransform(labels.rotation, angle, point)\n }, formatLabel(value, labels, options));\n group.append(text);\n }\n\n return null;\n }\n};\n\nfunction labelTransform(rotation, angle, point) {\n if (rotation === 'radial') return `rotate(${angle} ${point.x} ${point.y})`;\n if (rotation === 'tangent') return `rotate(${angle + 90} ${point.x} ${point.y})`;\n return undefined;\n}\n\nfunction formatLabel(value, labels, options) {\n if (typeof labels.formatter === 'function') {\n return labels.formatter(value, { min: options.min, max: options.max, options });\n }\n return Number(value).toFixed(labels.fractionDigits);\n}\n", "import { findZoneForValue, valueToAngle } from '../geometry/scale.js';\nimport { isTransparentColor } from '../core/utils.js';\nimport { svgElement, setSvgAttributes } from '../renderer/svg.js';\n\n/** Draws and updates the analog pointer. */\nexport const pointerLayer = {\n id: 'pointer',\n render(context) {\n const { options, renderer } = context;\n const pointer = options.pointer;\n if (!pointer.visible) return null;\n\n const geometry = options.geometry;\n const group = renderer.group('pointer', { 'aria-hidden': 'true' });\n const rotating = svgElement('g', { class: 'gaugeit__pointer-rotating' });\n const shape = createPointerShape(pointer, geometry);\n rotating.append(shape);\n\n let cap = null;\n if (pointer.cap.visible) {\n cap = svgElement('circle', {\n class: 'gaugeit__pointer-cap',\n cx: geometry.centerX,\n cy: geometry.centerY,\n r: pointer.cap.radius,\n fill: pointer.cap.color,\n stroke: pointer.cap.strokeColor,\n 'stroke-width': pointer.cap.strokeWidth,\n });\n }\n appendVisualStack(group, rotating, cap, pointer.cap.stackOrder);\n\n return {\n update(value, state = {}) {\n const pointerValue = Number.isFinite(state.pointerValue) ? state.pointerValue : value;\n const angle = valueToAngle(pointerValue, options, options.overflow !== 'allow');\n rotating.setAttribute('transform', `rotate(${angle} ${geometry.centerX} ${geometry.centerY})`);\n\n if (pointer.colorByZone) {\n const zone = findZoneForValue(pointerValue, options.zones);\n const color = zone && !isTransparentColor(zone.color) ? zone.color : pointer.color;\n if (shape.tagName.toLowerCase() === 'line') shape.setAttribute('stroke', color);\n else shape.setAttribute('fill', color);\n }\n }\n };\n }\n};\n\nfunction appendVisualStack(group, pointer, cap, capStackOrder) {\n if (cap && capStackOrder === 'below') group.append(cap, pointer);\n else if (cap) group.append(pointer, cap);\n else group.append(pointer);\n}\n\nfunction createPointerShape(pointer, geometry) {\n const cx = geometry.centerX;\n const cy = geometry.centerY;\n const front = pointer.length;\n const tail = pointer.tailLength;\n const half = pointer.width / 2;\n const shaft = resolveShaftLength(pointer);\n let shape;\n\n if (pointer.type === 'line') {\n shape = svgElement('line', {\n class: 'gaugeit__pointer gaugeit__pointer--line',\n x1: cx - tail,\n y1: cy,\n x2: cx + front,\n y2: cy,\n stroke: pointer.color,\n 'stroke-width': pointer.width,\n 'stroke-linecap': 'round'\n });\n } else {\n let points;\n if (pointer.type === 'arrow') {\n points = [\n [cx - tail, cy - half * 0.55],\n [cx + shaft, cy - half * 0.55],\n [cx + shaft, cy - half * 1.5],\n [cx + front, cy],\n [cx + shaft, cy + half * 1.5],\n [cx + shaft, cy + half * 0.55],\n [cx - tail, cy + half * 0.55]\n ];\n } else if (pointer.type === 'spear') {\n const shoulder = shaft + (front - shaft) * 0.56;\n points = [\n [cx - tail, cy - half * 0.45],\n [cx + shaft, cy - half * 0.38],\n [cx + shoulder, cy - half * 0.85],\n [cx + front, cy],\n [cx + shoulder, cy + half * 0.85],\n [cx + shaft, cy + half * 0.38],\n [cx - tail, cy + half * 0.45]\n ];\n } else {\n points = [\n [cx - tail, cy - half * 0.65],\n [cx + shaft, cy - half * 0.22],\n [cx + front, cy],\n [cx + shaft, cy + half * 0.22],\n [cx - tail, cy + half * 0.65]\n ];\n }\n\n const path = points.map((point, index) => `${index === 0 ? 'M' : 'L'} ${point[0]} ${point[1]}`).join(' ');\n shape = svgElement('path', {\n class: `gaugeit__pointer gaugeit__pointer--${pointer.type}`,\n d: `${path} Z`,\n fill: pointer.color\n });\n }\n\n setSvgAttributes(shape, {\n opacity: pointer.opacity,\n stroke: pointer.type === 'line' ? pointer.color : pointer.strokeColor,\n 'stroke-width': pointer.type === 'line' ? pointer.width : pointer.strokeWidth,\n });\n return shape;\n}\nfunction resolveShaftLength(pointer) {\n if (Number.isFinite(pointer.shaftLength)) return Math.min(pointer.length, Math.max(0, pointer.shaftLength));\n if (pointer.type === 'arrow') return pointer.length * 0.70;\n if (pointer.type === 'spear') return pointer.length * 0.68;\n return pointer.length * 0.86;\n}\n", "import { svgElement } from '../renderer/svg.js';\nimport { resolveReadoutPosition } from '../geometry/bounds.js';\n\n/** Draws title, value, and unit text; only the value node changes during animation. */\nexport const readoutLayer = {\n id: 'readout',\n render(context) {\n const { options, renderer } = context;\n const readout = options.readout;\n if (!readout.visible) return null;\n\n const group = renderer.group('readout');\n if (readout.title.visible && readout.title.text) {\n group.append(textNode('title', readout.title, readout.title.text, options));\n }\n\n let valueNode = null;\n const valueFormatter = createValueFormatter(readout.value, options);\n if (readout.value.visible) {\n valueNode = textNode('value', readout.value, '', options);\n valueNode.setAttribute('aria-hidden', 'true');\n group.append(valueNode);\n }\n\n if (readout.unit.visible && readout.unit.text) {\n group.append(textNode('unit', readout.unit, readout.unit.text, options));\n }\n\n return {\n update(value) {\n if (valueNode) valueNode.textContent = valueFormatter(value);\n }\n };\n }\n};\n\nfunction textNode(kind, config, value, options) {\n const position = resolveReadoutPosition(config, options);\n return svgElement('text', {\n class: `gaugeit__readout gaugeit__readout--${kind}`,\n x: position.x,\n y: position.y,\n fill: config.color,\n 'font-family': config.fontFamily,\n 'font-size': config.fontSize,\n 'font-weight': config.fontWeight,\n 'letter-spacing': config.letterSpacing,\n 'text-anchor': 'middle',\n 'dominant-baseline': 'middle'\n }, value);\n}\n\nfunction createValueFormatter(config, options) {\n if (typeof config.formatter === 'function') {\n return (value) => String(config.formatter(value, { min: options.min, max: options.max, options }));\n }\n\n const formatter = new Intl.NumberFormat(config.locale, {\n minimumFractionDigits: config.fractionDigits,\n maximumFractionDigits: config.fractionDigits\n });\n return (value) => `${config.prefix || ''}${formatter.format(value)}${config.suffix || ''}`;\n}\n", "import { lightIsActive, resolveLightPosition } from '../geometry/light.js';\nimport { svgElement } from '../renderer/svg.js';\n\nconst LIGHT_PALETTES = Object.freeze({\n red: { core: '#ef4444', highlight: '#fecaca', glow: '#f87171', rim: '#7f1d1d' },\n green: { core: '#22c55e', highlight: '#bbf7d0', glow: '#4ade80', rim: '#14532d' },\n blue: { core: '#3b82f6', highlight: '#bfdbfe', glow: '#60a5fa', rim: '#1e3a8a' },\n amber: { core: '#f59e0b', highlight: '#fde68a', glow: '#fb923c', rim: '#92400e' },\n yellow: { core: '#fde047', highlight: '#fef9c3', glow: '#facc15', rim: '#a16207' },\n orange: { core: '#f97316', highlight: '#fed7aa', glow: '#fb923c', rim: '#9a3412' },\n white: { core: '#f8fafc', highlight: '#ffffff', glow: '#e2e8f0', rim: '#64748b' },\n halogen: { core: '#fff2bf', highlight: '#fffdf0', glow: '#ffe79a', rim: '#9a7b24' },\n cyan: { core: '#22d3ee', highlight: '#cffafe', glow: '#67e8f9', rim: '#155e75' },\n brown: { core: '#a16207', highlight: '#f5d0a1', glow: '#d6a56b', rim: '#5b3b10' }\n});\n\n/** Draws an optional realistic SVG annunciator lamp. */\nexport const lightLayer = {\n id: 'light',\n render({ options, renderer }) {\n const light = options.light;\n if (!light?.visible) return null;\n\n const { x, y } = resolveLightPosition(light, options);\n const palette = resolvePalette(light);\n const colorName = Object.prototype.hasOwnProperty.call(LIGHT_PALETTES, light.color) ? light.color : 'amber';\n const glowFilterId = `${renderer.id}-light-glow`;\n const onGradientId = `${renderer.id}-light-on`;\n const offGradientId = `${renderer.id}-light-off`;\n const bezelGradientId = `${renderer.id}-light-bezel`;\n\n const defs = svgElement('defs');\n defs.append(\n createGlowFilter(glowFilterId, light.radius),\n createBulbGradient(onGradientId, {\n center: '#ffffff',\n highlight: palette.highlight,\n middle: palette.core,\n edge: palette.rim\n }),\n createBulbGradient(offGradientId, {\n center: '#fffdf7',\n highlight: light.offColor,\n middle: light.offColor,\n edge: light.offEdgeColor\n }),\n createBezelGradient(bezelGradientId, light)\n );\n\n const group = renderer.group('light', { 'aria-hidden': 'true' });\n group.append(defs);\n\n const lamp = svgElement('g', {\n class: `gaugeit__light gaugeit__light--${colorName}`,\n transform: `translate(${x} ${y})`,\n 'data-gaugeit-light-color': colorName,\n 'data-gaugeit-light-state': 'off'\n });\n lamp.style.setProperty('--gaugeit-light-blink-duration', `${light.blinkInterval}ms`);\n lamp.style.setProperty('--gaugeit-light-pulse-duration', `${light.pulseInterval}ms`);\n lamp.style.setProperty('--gaugeit-light-opacity', String(light.opacity));\n\n const bezel = svgElement('circle', {\n class: 'gaugeit__light-bezel',\n cx: 0,\n cy: 0,\n r: light.radius + Math.max(1.8, light.radius * 0.2),\n fill: `url(#${bezelGradientId})`\n });\n\n const bezelHighlight = svgElement('circle', {\n class: 'gaugeit__light-bezel-highlight',\n cx: 0,\n cy: 0,\n r: light.radius + Math.max(0.75, light.radius * 0.08),\n fill: 'none',\n stroke: light.bezelHighlightColor,\n 'stroke-width': Math.max(0.55, light.radius * 0.075),\n 'stroke-opacity': 0.65\n });\n\n // The off and on appearances are separate stacked SVG groups. During a blink,\n // CSS alternates between them instead of fading the whole lamp to transparency.\n const offVisual = createLampVisual({\n state: 'off',\n radius: light.radius,\n gradientId: offGradientId,\n edgeColor: light.offEdgeColor,\n glowColor: null,\n glowFilterId: null,\n sparkleOpacity: 0.58,\n shadeOpacity: 0.14\n });\n\n const onVisual = createLampVisual({\n state: 'on',\n radius: light.radius,\n gradientId: onGradientId,\n edgeColor: palette.rim,\n glowColor: palette.glow,\n glowFilterId,\n sparkleOpacity: 0.72,\n shadeOpacity: 0.1\n });\n\n lamp.append(bezel, bezelHighlight, offVisual, onVisual);\n group.append(lamp);\n\n return {\n update(value, state = {}) {\n const sample = resolveTriggerSample(light.trigger?.source, value, state);\n const active = lightIsActive(light, sample);\n const blinking = active && light.blink;\n const pulsing = active && light.pulse && !blinking;\n\n lamp.classList.toggle('is-on', active);\n lamp.classList.toggle('is-blinking', blinking);\n lamp.classList.toggle('is-pulsing', pulsing);\n lamp.classList.toggle('has-glow', light.glow);\n lamp.setAttribute('data-gaugeit-light-state', active ? 'on' : 'off');\n }\n };\n }\n};\n\nfunction createLampVisual({\n state,\n radius,\n gradientId,\n edgeColor,\n glowColor,\n glowFilterId,\n sparkleOpacity,\n shadeOpacity\n}) {\n const visual = svgElement('g', {\n class: `gaugeit__light-emission gaugeit__light-emission--${state}`,\n 'data-gaugeit-light-visual': state\n });\n\n if (glowColor && glowFilterId) {\n visual.append(svgElement('circle', {\n class: 'gaugeit__light-glow',\n cx: 0,\n cy: 0,\n r: radius * 1.82,\n fill: glowColor,\n filter: `url(#${glowFilterId})`\n }));\n }\n\n visual.append(\n svgElement('circle', {\n class: `gaugeit__light-bulb gaugeit__light-bulb--${state}`,\n cx: 0,\n cy: 0,\n r: radius,\n fill: `url(#${gradientId})`,\n stroke: edgeColor,\n 'stroke-width': Math.max(0.8, radius * 0.13)\n }),\n svgElement('path', {\n class: `gaugeit__light-lens-shade gaugeit__light-lens-shade--${state}`,\n d: lowerLensShadePath(radius),\n fill: edgeColor,\n opacity: shadeOpacity\n }),\n svgElement('ellipse', {\n class: `gaugeit__light-sparkle gaugeit__light-sparkle--${state}`,\n cx: -radius * 0.29,\n cy: -radius * 0.35,\n rx: Math.max(0.8, radius * 0.36),\n ry: Math.max(0.6, radius * 0.2),\n fill: '#ffffff',\n opacity: sparkleOpacity\n })\n );\n\n return visual;\n}\n\nfunction resolvePalette(light) {\n const named = LIGHT_PALETTES[light.color] || LIGHT_PALETTES.amber;\n const custom = String(light.customColor || '').trim();\n if (!custom) return named;\n return {\n core: custom,\n highlight: '#ffffff',\n glow: custom,\n rim: custom\n };\n}\n\nfunction createGlowFilter(id, radius) {\n const filter = svgElement('filter', {\n id,\n x: '-120%',\n y: '-120%',\n width: '340%',\n height: '340%'\n });\n filter.append(svgElement('feGaussianBlur', {\n stdDeviation: Math.max(1.4, radius * 0.38)\n }));\n return filter;\n}\n\nfunction createBulbGradient(id, colors) {\n const gradient = svgElement('radialGradient', {\n id,\n cx: '31%',\n cy: '27%',\n r: '74%'\n });\n gradient.append(\n svgElement('stop', { offset: '0%', 'stop-color': colors.center, 'stop-opacity': 0.98 }),\n svgElement('stop', { offset: '23%', 'stop-color': colors.highlight, 'stop-opacity': 0.96 }),\n svgElement('stop', { offset: '62%', 'stop-color': colors.middle, 'stop-opacity': 1 }),\n svgElement('stop', { offset: '100%', 'stop-color': colors.edge, 'stop-opacity': 1 })\n );\n return gradient;\n}\n\nfunction createBezelGradient(id, light) {\n const gradient = svgElement('linearGradient', {\n id,\n x1: '0%',\n y1: '0%',\n x2: '100%',\n y2: '100%'\n });\n gradient.append(\n svgElement('stop', { offset: '0%', 'stop-color': light.bezelHighlightColor, 'stop-opacity': 0.92 }),\n svgElement('stop', { offset: '34%', 'stop-color': light.bezelColor, 'stop-opacity': 0.9 }),\n svgElement('stop', { offset: '72%', 'stop-color': light.bezelColor, 'stop-opacity': 1 }),\n svgElement('stop', { offset: '100%', 'stop-color': '#1f2937', 'stop-opacity': 0.92 })\n );\n return gradient;\n}\n\nfunction lowerLensShadePath(radius) {\n const r = Math.max(1, radius);\n return [\n `M ${-r * 0.86} ${r * 0.42}`,\n `A ${r} ${r} 0 0 0 ${r * 0.86} ${r * 0.42}`,\n `A ${r} ${r} 0 0 1 ${-r * 0.86} ${r * 0.42}`,\n 'Z'\n ].join(' ');\n}\n\nfunction resolveTriggerSample(source, displayedValue, state) {\n if (source === 'pointer' && Number.isFinite(state.pointerValue)) return state.pointerValue;\n if (source === 'displayed') return displayedValue;\n if (Number.isFinite(state.targetValue)) return state.targetValue;\n return displayedValue;\n}\n", "import { faceLayer } from '../layers/face.js';\nimport { zonesLayer } from '../layers/zones.js';\nimport { ticksLayer } from '../layers/ticks.js';\nimport { labelsLayer } from '../layers/labels.js';\nimport { pointerLayer } from '../layers/pointer.js';\nimport { readoutLayer } from '../layers/readout.js';\nimport { lightLayer } from '../layers/light.js';\n\n/** Minimal semicircular arc gauge with configurable colored sectors. */\nexport const arcGaugeType = {\n description: 'A lightweight semicircular arc with zones, labels, and an animated pointer.',\n defaults: {\n geometry: {\n width: 320,\n height: 220,\n centerX: 160,\n centerY: 176,\n radius: 120,\n startAngle: 180,\n endAngle: 360\n },\n face: { visible: false },\n track: {\n visible: true,\n color: '#e5e7eb',\n width: 28,\n radius: 112,\n lineCap: 'butt'\n },\n scale: {\n radius: 112,\n position: 'inside',\n major: { visible: false },\n minor: { visible: false }\n },\n labels: {\n visible: true,\n radius: 82,\n fontSize: 11,\n fontWeight: 600\n },\n pointer: {\n type: 'needle',\n length: 91,\n tailLength: 12,\n width: 8,\n cap: { radius: 7, stackOrder: 'above' }\n },\n light: {\n visible: false,\n x: 160,\n y: 142,\n radius: 7,\n color: 'amber'\n },\n readout: {\n title: { visible: false, x: 'auto', y: 35 },\n value: { visible: false, x: 160, y: 130, fontSize: 30 },\n unit: { visible: false, x: 160, y: 150 }\n }\n },\n // SVG paint order: readout first, pointer above it, cap above the pointer.\n layers: [faceLayer, zonesLayer, ticksLayer, labelsLayer, lightLayer, readoutLayer, pointerLayer]\n};\n", "import { faceLayer } from '../layers/face.js';\nimport { zonesLayer } from '../layers/zones.js';\nimport { ticksLayer } from '../layers/ticks.js';\nimport { labelsLayer } from '../layers/labels.js';\nimport { pointerLayer } from '../layers/pointer.js';\nimport { readoutLayer } from '../layers/readout.js';\nimport { lightLayer } from '../layers/light.js';\n\n/** White, framed old-style instrument gauge with a traditional needle. */\nexport const classicGaugeType = {\n description: 'A framed white analog instrument inspired by vintage electrical and pressure meters.',\n defaults: {\n layout: {\n includeGeometry: false\n },\n geometry: {\n width: 320,\n height: 260,\n centerX: 160,\n centerY: 183,\n radius: 124,\n startAngle: 195,\n endAngle: 345\n },\n face: {\n visible: true,\n shape: 'panel',\n fit: 'content',\n clipContent: true,\n x: 7,\n y: 7,\n width: 306,\n height: 246,\n cornerRadius: 20,\n color: '#fffef8',\n strokeColor: '#4b5563',\n strokeWidth: 3,\n innerStrokeColor: '#d1d5db',\n innerStrokeWidth: 1.2,\n shadow: true,\n glass: true\n },\n track: {\n visible: false,\n width: 8,\n radius: 119\n },\n scale: {\n radius: 119,\n position: 'inside',\n major: {\n visible: true,\n divisions: 5,\n length: 17,\n width: 2.4,\n color: '#111827'\n },\n minor: {\n visible: true,\n subdivisions: 4,\n length: 9,\n width: 1,\n color: '#4b5563'\n }\n },\n labels: {\n visible: true,\n radius: 89,\n fontSize: 12,\n fontWeight: 650\n },\n pointer: {\n type: 'spear',\n length: 99,\n tailLength: 15,\n width: 9,\n color: '#111827',\n cap: {\n visible: true,\n stackOrder: 'above',\n radius: 10,\n color: '#20242a',\n strokeColor: '#d1d5db',\n strokeWidth: 2\n }\n },\n light: {\n visible: false,\n x: 112,\n y: 112,\n radius: 8,\n color: 'amber'\n },\n readout: {\n title: {\n visible: true,\n text: 'ANALOG',\n x: 'auto',\n y: 'auto',\n position: 'top',\n margin: 12,\n offsetY: 18,\n fontSize: 13,\n letterSpacing: 1.6\n },\n value: {\n visible: false,\n x: 160,\n y: 224,\n fontSize: 24,\n fontWeight: 750\n },\n unit: {\n visible: false,\n x: 160,\n y: 242,\n fontSize: 10\n }\n }\n },\n // SVG paint order: readout first, pointer above it, cap above the pointer.\n layers: [faceLayer, zonesLayer, ticksLayer, labelsLayer, lightLayer, readoutLayer, pointerLayer]\n};\n", "import { faceLayer } from '../layers/face.js';\nimport { zonesLayer } from '../layers/zones.js';\nimport { ticksLayer } from '../layers/ticks.js';\nimport { labelsLayer } from '../layers/labels.js';\nimport { pointerLayer } from '../layers/pointer.js';\nimport { readoutLayer } from '../layers/readout.js';\nimport { lightLayer } from '../layers/light.js';\n\n/** Tick-focused gauge for highly configurable major and minor line scales. */\nexport const lineScaleGaugeType = {\n description: 'A dense line-scale gauge with independently configurable major and minor ticks.',\n defaults: {\n geometry: {\n width: 320,\n height: 225,\n centerX: 160,\n centerY: 184,\n radius: 127,\n startAngle: 180,\n endAngle: 360\n },\n face: { visible: false },\n track: {\n visible: true,\n color: '#cbd5e1',\n width: 2,\n radius: 126,\n lineCap: 'round'\n },\n scale: {\n radius: 124,\n position: 'inside',\n major: {\n visible: true,\n divisions: 8,\n length: 23,\n width: 2.4,\n color: '#0f172a'\n },\n minor: {\n visible: true,\n subdivisions: 4,\n length: 11,\n width: 1,\n color: '#475569'\n }\n },\n labels: {\n visible: true,\n radius: 88,\n fontSize: 10,\n fontWeight: 650\n },\n pointer: {\n type: 'line',\n length: 101,\n tailLength: 10,\n width: 4,\n color: '#b91c1c',\n cap: {\n visible: true,\n stackOrder: 'above',\n radius: 7,\n color: '#b91c1c',\n strokeColor: '#ffffff',\n strokeWidth: 2\n }\n },\n light: {\n visible: false,\n x: 160,\n y: 151,\n radius: 7,\n color: 'amber'\n },\n readout: {\n title: { visible: false, x: 'auto', y: 140 },\n value: { visible: false, x: 160, y: 220, fontSize: 33 },\n unit: { visible: false, x: 160, y: 240 }\n }\n },\n // SVG paint order: readout first, pointer above it, cap above the pointer.\n layers: [faceLayer, zonesLayer, ticksLayer, labelsLayer, lightLayer, readoutLayer, pointerLayer]\n};\n", "import { faceLayer } from '../layers/face.js';\nimport { zonesLayer } from '../layers/zones.js';\nimport { ticksLayer } from '../layers/ticks.js';\nimport { labelsLayer } from '../layers/labels.js';\nimport { pointerLayer } from '../layers/pointer.js';\nimport { readoutLayer } from '../layers/readout.js';\nimport { lightLayer } from '../layers/light.js';\n\n/** Circular vintage instrument preset built from the same reusable classic layers. */\nexport const heritageRoundGaugeType = {\n description: 'A circular, glass-fronted vintage instrument with a 270-degree scale.',\n defaults: {\n geometry: {\n width: 320,\n height: 320,\n centerX: 160,\n centerY: 160,\n radius: 132,\n startAngle: 225,\n endAngle: 495\n },\n face: {\n visible: true,\n shape: 'circle',\n fit: 'geometry',\n clipContent: true,\n x: 8,\n y: 8,\n width: 304,\n height: 304,\n cornerRadius: 0,\n color: '#fffdf5',\n strokeColor: '#374151',\n strokeWidth: 4,\n innerStrokeColor: '#c7bfae',\n innerStrokeWidth: 1.4,\n shadow: true,\n glass: true\n },\n track: {\n visible: false,\n width: 7,\n radius: 124\n },\n scale: {\n endpointMode: 'auto',\n radius: 124,\n position: 'inside',\n major: {\n visible: true,\n divisions: 9,\n length: 18,\n width: 2.6,\n color: '#171717'\n },\n minor: {\n visible: true,\n subdivisions: 4,\n length: 9,\n width: 1,\n color: '#57534e'\n }\n },\n labels: {\n visible: true,\n radius: 92,\n fontSize: 11,\n fontWeight: 700\n },\n pointer: {\n type: 'spear',\n length: 104,\n tailLength: 18,\n width: 9,\n color: '#7f1d1d',\n cap: {\n visible: true,\n stackOrder: 'above',\n radius: 11,\n color: '#292524',\n strokeColor: '#d6d3d1',\n strokeWidth: 2\n }\n },\n light: {\n visible: false,\n x: 108,\n y: 110,\n radius: 10,\n color: 'amber',\n blink: false,\n blinkInterval: 1000,\n trigger: { mode: 'below', source: 'target', value: 15, min: 0, max: 15 }\n },\n readout: {\n title: {\n visible: true,\n text: 'HERITAGE',\n x: 'auto',\n y: 'auto',\n position: 'top',\n margin: 14,\n offsetY: 85,\n fontSize: 13,\n letterSpacing: 1.8\n },\n value: {\n visible: false,\n x: 'auto',\n y: 224,\n fontSize: 25,\n fontWeight: 750\n },\n unit: {\n visible: false,\n x: 'auto',\n y: 244,\n fontSize: 10\n }\n }\n },\n // SVG paint order: readout first, pointer above it, cap above the pointer.\n layers: [faceLayer, zonesLayer, ticksLayer, labelsLayer, lightLayer, readoutLayer, pointerLayer]\n};\n", "import { resolveZoneSegments } from '../geometry/scale.js';\nimport {\n linearAxis,\n linearNormalOffset,\n offsetLinearPoint,\n valueToLinearPoint\n} from '../geometry/linear.js';\nimport { isTransparentColor } from '../core/utils.js';\nimport { svgElement } from '../renderer/svg.js';\n\n/** Draws the track and value zones along a straight two-dimensional axis. */\nexport const linearZonesLayer = {\n id: 'linear-zones',\n render(context) {\n const { options, renderer } = context;\n const group = renderer.group('linear-zones', { 'aria-hidden': 'true' });\n const segments = resolveZoneSegments(options.min, options.max, options.zones);\n\n if (options.track.showUnderZones && options.track.visible) {\n group.append(createSegment(options.min, options.max, options.track, 'gaugeit__track'));\n }\n\n for (const segment of segments) {\n const style = segment.zone || options.track;\n const shouldDraw = segment.zone\n ? !isTransparentColor(segment.zone.color)\n : options.track.visible && !options.track.showUnderZones;\n\n if (!shouldDraw) continue;\n const className = segment.zone ? 'gaugeit__zone' : 'gaugeit__track';\n const line = createSegment(segment.min, segment.max, style, className);\n if (segment.zone && segment.zone.className) line.classList.add(String(segment.zone.className));\n group.append(line);\n }\n\n return null;\n\n function createSegment(min, max, style, className) {\n const axis = linearAxis(options);\n const offset = linearNormalOffset(style.offset ?? options.linear.zoneOffset);\n const start = offsetLinearPoint(valueToLinearPoint(min, options), axis, offset);\n const end = offsetLinearPoint(valueToLinearPoint(max, options), axis, offset);\n return svgElement('line', {\n class: className,\n x1: start.x,\n y1: start.y,\n x2: end.x,\n y2: end.y,\n stroke: style.color ?? options.track.color,\n 'stroke-width': style.width ?? options.track.width,\n 'stroke-linecap': style.lineCap || options.track.lineCap || 'butt',\n opacity: style.opacity ?? 1\n });\n }\n }\n};\n", "import { buildMinorValues, buildScaleValues, roundSvg } from '../geometry/scale.js';\nimport { linearAxis, linearNormalSpan, offsetLinearPoint, valueToLinearPoint } from '../geometry/linear.js';\nimport { resolveMajorInterval } from '../core/options.js';\nimport { svgElement } from '../renderer/svg.js';\n\n/** Draws compact major and minor tick paths along a straight scale. */\nexport const linearTicksLayer = {\n id: 'linear-ticks',\n render(context) {\n const { options, renderer } = context;\n const scale = options.scale;\n if (!scale.major.visible && !scale.minor.visible) return null;\n\n const group = renderer.group('linear-ticks', { 'aria-hidden': 'true' });\n const interval = resolveMajorInterval(options);\n const majorValues = buildScaleValues(options.min, options.max, interval);\n const minorValues = buildMinorValues(majorValues, scale.minor.subdivisions);\n\n if (scale.minor.visible && scale.minor.length > 0 && scale.minor.width > 0 && minorValues.length) {\n group.append(svgElement('path', {\n class: 'gaugeit__ticks gaugeit__ticks--minor gaugeit__linear-ticks',\n d: tickPath(minorValues, scale.minor.length),\n fill: 'none',\n stroke: scale.minor.color,\n 'stroke-width': scale.minor.width,\n 'stroke-linecap': 'butt',\n opacity: scale.minor.opacity\n }));\n }\n\n if (scale.major.visible && scale.major.length > 0 && scale.major.width > 0) {\n group.append(svgElement('path', {\n class: 'gaugeit__ticks gaugeit__ticks--major gaugeit__linear-ticks',\n d: tickPath(majorValues, scale.major.length),\n fill: 'none',\n stroke: scale.major.color,\n 'stroke-width': scale.major.width,\n 'stroke-linecap': 'butt',\n opacity: scale.major.opacity\n }));\n }\n\n renderer.setReference('majorValues', majorValues);\n return null;\n\n function tickPath(values, length) {\n const axis = linearAxis(options);\n const span = linearNormalSpan(length, options.linear.tickSide);\n const commands = [];\n for (const value of values) {\n const point = valueToLinearPoint(value, options);\n const start = offsetLinearPoint(point, axis, span.start);\n const end = offsetLinearPoint(point, axis, span.end);\n commands.push(`M ${roundSvg(start.x)} ${roundSvg(start.y)} L ${roundSvg(end.x)} ${roundSvg(end.y)}`);\n }\n return commands.join(' ');\n }\n }\n};\n", "import { buildScaleValues } from '../geometry/scale.js';\nimport {\n linearAxis,\n linearNormalOffset,\n offsetLinearPoint,\n valueToLinearPoint\n} from '../geometry/linear.js';\nimport { resolveMajorInterval } from '../core/options.js';\nimport { svgElement } from '../renderer/svg.js';\n\n/** Draws numeric labels along a straight scale. */\nexport const linearLabelsLayer = {\n id: 'linear-labels',\n render(context) {\n const { options, renderer } = context;\n const labels = options.labels;\n if (!labels.visible) return null;\n\n const group = renderer.group('linear-labels', { 'aria-hidden': 'true' });\n const interval = Number(labels.interval) > 0 ? Number(labels.interval) : resolveMajorInterval(options);\n const values = buildScaleValues(options.min, options.max, interval);\n const axis = linearAxis(options);\n\n for (const value of values) {\n const point = offsetLinearPoint(\n valueToLinearPoint(value, options),\n axis,\n linearNormalOffset(options.linear.labelOffset)\n );\n const text = svgElement('text', {\n class: 'gaugeit__label gaugeit__linear-label',\n x: point.x,\n y: point.y,\n fill: labels.color,\n 'font-family': labels.fontFamily,\n 'font-size': labels.fontSize,\n 'font-weight': labels.fontWeight,\n 'text-anchor': 'middle',\n 'dominant-baseline': 'middle',\n transform: labelTransform(labels.rotation, axis.angle, point)\n }, formatLabel(value, labels, options));\n group.append(text);\n }\n\n return null;\n }\n};\n\nfunction labelTransform(rotation, axisAngle, point) {\n if (rotation === 'radial') return `rotate(${axisAngle + 90} ${point.x} ${point.y})`;\n if (rotation === 'tangent') return `rotate(${axisAngle} ${point.x} ${point.y})`;\n return undefined;\n}\n\nfunction formatLabel(value, labels, options) {\n if (typeof labels.formatter === 'function') {\n return labels.formatter(value, { min: options.min, max: options.max, options });\n }\n return Number(value).toFixed(labels.fractionDigits);\n}\n", "import { findZoneForValue } from '../geometry/scale.js';\nimport {\n linearAxis,\n linearIndicatorNormalOffset,\n linearNormalSpan,\n valueToLinearPoint\n} from '../geometry/linear.js';\nimport { isTransparentColor } from '../core/utils.js';\nimport { setSvgAttributes, svgElement } from '../renderer/svg.js';\n\n/** Draws and updates a straight hairline, marker, or carriage indicator. */\nexport const linearIndicatorLayer = {\n id: 'linear-indicator',\n render(context) {\n const { options, renderer } = context;\n const indicator = options.indicator;\n if (!indicator.visible) return null;\n\n const axis = linearAxis(options);\n const normalOffset = linearIndicatorNormalOffset(indicator);\n const group = renderer.group('linear-indicator', { 'aria-hidden': 'true' });\n const moving = svgElement('g', {\n class: 'gaugeit__linear-indicator-moving'\n });\n const shape = createIndicatorShape(indicator, normalOffset);\n moving.append(shape);\n\n let cap = null;\n if (indicator.cap.visible) {\n cap = svgElement('circle', {\n class: 'gaugeit__linear-indicator-cap',\n cx: 0,\n cy: normalOffset,\n r: indicator.cap.radius,\n fill: indicator.cap.color,\n stroke: indicator.cap.strokeColor,\n 'stroke-width': indicator.cap.strokeWidth\n });\n if (indicator.cap.stackOrder === 'below') moving.prepend(cap);\n else moving.append(cap);\n }\n\n group.append(moving);\n\n return {\n update(value, state = {}) {\n const visualValue = Number.isFinite(state.pointerValue) ? state.pointerValue : value;\n const point = valueToLinearPoint(visualValue, options, options.overflow !== 'allow');\n moving.setAttribute('transform', `translate(${point.x} ${point.y}) rotate(${axis.angle})`);\n\n if (indicator.colorByZone) {\n const zone = findZoneForValue(visualValue, options.zones);\n const color = zone && !isTransparentColor(zone.color) ? zone.color : indicator.color;\n setIndicatorColor(shape, indicator, color);\n }\n }\n };\n }\n};\n\nfunction createIndicatorShape(indicator, normalOffset) {\n const span = linearNormalSpan(indicator.length, indicator.position, normalOffset);\n let shape;\n\n if (indicator.type === 'marker') {\n const direction = markerDirection(indicator.position);\n if (direction === 0) {\n const size = indicator.markerSize;\n const centerY = normalOffset;\n shape = svgElement('path', {\n class: 'gaugeit__linear-indicator gaugeit__linear-indicator--marker',\n d: `M 0 ${centerY - size} L ${size * 0.72} ${centerY} L 0 ${centerY + size} L ${-size * 0.72} ${centerY} Z`,\n fill: indicator.color\n });\n } else {\n const tipY = normalOffset;\n const baseY = tipY + direction * indicator.markerSize;\n const halfWidth = indicator.markerSize * 0.72;\n shape = svgElement('path', {\n class: 'gaugeit__linear-indicator gaugeit__linear-indicator--marker',\n d: `M 0 ${tipY} L ${halfWidth} ${baseY} L ${-halfWidth} ${baseY} Z`,\n fill: indicator.color\n });\n }\n } else if (indicator.type === 'carriage') {\n const y = Math.min(span.start, span.end);\n shape = svgElement('rect', {\n class: 'gaugeit__linear-indicator gaugeit__linear-indicator--carriage',\n x: -indicator.carriageWidth / 2,\n y,\n width: indicator.carriageWidth,\n height: Math.max(1, Math.abs(span.end - span.start)),\n rx: indicator.carriageRadius,\n ry: indicator.carriageRadius,\n fill: indicator.color\n });\n } else {\n shape = svgElement('line', {\n class: 'gaugeit__linear-indicator gaugeit__linear-indicator--hairline',\n x1: 0,\n y1: span.start,\n x2: 0,\n y2: span.end,\n stroke: indicator.color,\n 'stroke-width': indicator.width,\n 'stroke-linecap': indicator.lineCap\n });\n }\n\n setSvgAttributes(shape, {\n opacity: indicator.opacity,\n stroke: indicator.type === 'hairline' ? indicator.color : indicator.strokeColor,\n 'stroke-width': indicator.type === 'hairline' ? indicator.width : indicator.strokeWidth\n });\n return shape;\n}\n\nfunction markerDirection(position) {\n if (position === 'negative') return -1;\n if (position === 'positive') return 1;\n return 0;\n}\n\nfunction setIndicatorColor(shape, indicator, color) {\n if (indicator.type === 'hairline') shape.setAttribute('stroke', color);\n else shape.setAttribute('fill', color);\n}\n", "import { finiteNumber, isPlainObject } from '../core/utils.js';\n\n/**\n * Resolves an optional intrinsic aspect ratio before a type-specific resize pass.\n * CSS controls the rendered host size; geometry width and height control the\n * instrument's internal design ratio.\n */\nexport function resolveIntrinsicGeometrySize(options, context) {\n const requestedGeometry = isPlainObject(context.requested?.geometry)\n ? context.requested.geometry\n : {};\n const typeGeometry = context.typeDefaults?.geometry || {};\n const widthExplicit = hasOwn(requestedGeometry, 'width');\n const heightExplicit = hasOwn(requestedGeometry, 'height');\n const ratioExplicit = hasOwn(requestedGeometry, 'aspectRatio');\n const ratio = finiteNumber(requestedGeometry.aspectRatio, 0);\n\n if (ratioExplicit && ratio > 0) {\n if (widthExplicit && !heightExplicit) options.geometry.height = options.geometry.width / ratio;\n else if (heightExplicit && !widthExplicit) options.geometry.width = options.geometry.height * ratio;\n else if (!widthExplicit && !heightExplicit) {\n const baseWidth = finiteNumber(typeGeometry.width, options.geometry.width);\n options.geometry.width = baseWidth;\n options.geometry.height = baseWidth / ratio;\n }\n }\n\n options.geometry.aspectRatio = ratioExplicit && ratio > 0 ? ratio : null;\n return {\n requestedGeometry,\n widthExplicit: widthExplicit || (ratioExplicit && ratio > 0 && !heightExplicit),\n heightExplicit: heightExplicit || (ratioExplicit && ratio > 0),\n baseWidth: Math.max(1, finiteNumber(typeGeometry.width, options.geometry.width)),\n baseHeight: Math.max(1, finiteNumber(typeGeometry.height, options.geometry.height))\n };\n}\n\n/** Resizes a classic linear preset while preserving explicitly supplied coordinates. */\nexport function configureClassicLinearSize(options, context) {\n const sizing = resolveIntrinsicGeometrySize(options, context);\n if (!sizing.widthExplicit && !sizing.heightExplicit) return options;\n\n const scaleX = options.geometry.width / sizing.baseWidth;\n const scaleY = options.geometry.height / sizing.baseHeight;\n const uniform = Math.min(scaleX, scaleY);\n\n scalePaths(options, context, scaleX, [\n 'geometry.centerX',\n 'face.x', 'face.width', 'face.minWidth',\n 'linear.startX', 'linear.endX',\n 'readout.title.x', 'readout.value.x', 'readout.unit.x'\n ]);\n scalePaths(options, context, scaleY, [\n 'geometry.centerY',\n 'face.y', 'face.height', 'face.minHeight',\n 'linear.originY', 'linear.startY', 'linear.endY',\n 'linear.labelOffset', 'linear.zoneOffset',\n 'scale.major.length', 'scale.minor.length',\n 'indicator.length', 'indicator.centerOffset', 'indicator.markerSize',\n 'indicator.carriageWidth', 'indicator.carriageRadius',\n 'indicator.cap.radius',\n 'centerZero.marker.length', 'centerZero.marker.centerOffset',\n 'readout.title.y', 'readout.value.y', 'readout.unit.y'\n ]);\n scalePaths(options, context, uniform, [\n 'face.contentPadding', 'face.cornerRadius'\n ]);\n return options;\n}\n\n/** Resizes a rolling tape preset without stretching text or stroke widths. */\nexport function configureRollingTapeSize(options, context) {\n const sizing = resolveIntrinsicGeometrySize(options, context);\n if (!sizing.widthExplicit && !sizing.heightExplicit) return options;\n\n const scaleX = options.geometry.width / sizing.baseWidth;\n const scaleY = options.geometry.height / sizing.baseHeight;\n const uniform = Math.min(scaleX, scaleY);\n const vertical = options.tape.orientation !== 'horizontal';\n\n scalePaths(options, context, scaleX, [\n 'geometry.centerX',\n 'face.x', 'face.width', 'face.minWidth',\n 'tape.x', 'tape.width',\n 'readout.title.x', 'readout.value.x', 'readout.unit.x'\n ]);\n scalePaths(options, context, scaleY, [\n 'geometry.centerY',\n 'face.y', 'face.height', 'face.minHeight',\n 'tape.y', 'tape.height',\n 'readout.title.y', 'readout.value.y', 'readout.unit.y'\n ]);\n scalePaths(options, context, vertical ? scaleX : scaleY, [\n 'tape.tickInset', 'tape.labelOffset',\n 'tape.majorTickLength', 'tape.minorTickLength'\n ]);\n scalePaths(options, context, vertical ? scaleY : scaleX, [\n 'tape.majorSpacing', 'tape.fadeSize'\n ]);\n scalePaths(options, context, uniform, [\n 'face.cornerRadius', 'tape.cornerRadius'\n ]);\n return options;\n}\n\nfunction scalePaths(options, context, factor, paths) {\n if (!Number.isFinite(factor) || factor <= 0 || Math.abs(factor - 1) < 1e-9) return;\n for (const path of paths) {\n if (hasPath(context.requested, path)) continue;\n const baseValue = getPath(context.typeDefaults, path);\n if (!Number.isFinite(baseValue)) continue;\n setPath(options, path, baseValue * factor);\n }\n}\n\nfunction hasOwn(value, key) {\n return isPlainObject(value) && Object.prototype.hasOwnProperty.call(value, key);\n}\n\nfunction hasPath(value, path) {\n const keys = path.split('.');\n let cursor = value;\n for (const key of keys) {\n if (!isPlainObject(cursor) || !Object.prototype.hasOwnProperty.call(cursor, key)) return false;\n cursor = cursor[key];\n }\n return true;\n}\n\nfunction getPath(value, path) {\n let cursor = value;\n for (const key of path.split('.')) {\n if (cursor === null || cursor === undefined) return undefined;\n cursor = cursor[key];\n }\n return cursor;\n}\n\nfunction setPath(value, path, nextValue) {\n const keys = path.split('.');\n let cursor = value;\n for (let index = 0; index < keys.length - 1; index += 1) {\n const key = keys[index];\n if (!isPlainObject(cursor[key])) cursor[key] = {};\n cursor = cursor[key];\n }\n cursor[keys[keys.length - 1]] = nextValue;\n}\n", "import { faceLayer } from '../layers/face.js';\nimport { linearZonesLayer } from '../layers/linear-zones.js';\nimport { linearTicksLayer } from '../layers/linear-ticks.js';\nimport { linearLabelsLayer } from '../layers/linear-labels.js';\nimport { linearIndicatorLayer } from '../layers/linear-indicator.js';\nimport { readoutLayer } from '../layers/readout.js';\nimport { lightLayer } from '../layers/light.js';\nimport { configureClassicLinearSize } from './instrument-sizing.js';\n\n/** Shared classic-linear defaults used by compatible preset variants. */\nexport const classicLinearDefaults = {\n layout: {\n includeGeometry: false\n },\n geometry: {\n mode: 'linear',\n width: 320,\n height: 220,\n centerX: 160,\n centerY: 110\n },\n face: {\n visible: true,\n shape: 'panel',\n fit: 'content',\n contentPadding: 14,\n minWidth: 1,\n minHeight: 1,\n clipContent: true,\n x: 7,\n y: 7,\n width: 306,\n height: 206,\n cornerRadius: 20,\n color: '#fffef8',\n strokeColor: '#4b5563',\n strokeWidth: 3,\n innerStrokeColor: '#d1d5db',\n innerStrokeWidth: 1.2,\n shadow: true,\n glass: true\n },\n linear: {\n originY: 142,\n startX: 38,\n startY: 0,\n endX: 282,\n endY: 0,\n tickSide: 'negative',\n labelOffset: 38,\n zoneOffset: -16\n },\n track: {\n visible: true,\n color: '#a8a29e',\n width: 5,\n opacity: 0.85,\n lineCap: 'round',\n showUnderZones: false\n },\n scale: {\n major: {\n visible: true,\n divisions: 5,\n length: 20,\n width: 2.4,\n color: '#111827'\n },\n minor: {\n visible: true,\n subdivisions: 4,\n length: 10,\n width: 1,\n color: '#57534e'\n }\n },\n labels: {\n visible: true,\n fontSize: 11,\n fontWeight: 700,\n rotation: 'horizontal'\n },\n pointer: {\n visible: false\n },\n indicator: {\n visible: true,\n type: 'hairline',\n position: 'cross',\n length: 84,\n centerOffset: 0,\n width: 2.4,\n color: '#991b1b',\n strokeColor: '#fffef8',\n strokeWidth: 0.8,\n cap: {\n visible: false,\n stackOrder: 'above',\n radius: 4.5,\n color: '#991b1b',\n strokeColor: '#fffef8',\n strokeWidth: 1.2\n }\n },\n light: {\n visible: false,\n x: 72,\n y: 60,\n radius: 8,\n color: 'amber'\n },\n readout: {\n title: {\n visible: true,\n text: 'LINEAR',\n x: 'auto',\n y: 60,\n fontSize: 13,\n letterSpacing: 1.6\n },\n value: {\n visible: false,\n x: 'auto',\n y: -42,\n fontSize: 24,\n fontWeight: 750\n },\n unit: {\n visible: false,\n x: 'auto',\n y: -60,\n fontSize: 10\n }\n }\n};\n\n/** Shared layer sequence for framed travelling-indicator instruments. */\nexport const classicLinearLayers = [\n faceLayer,\n linearZonesLayer,\n linearTicksLayer,\n linearLabelsLayer,\n lightLayer,\n readoutLayer,\n linearIndicatorLayer\n];\n\n/** Cream-faced vintage instrument with a horizontally travelling indicator. */\nexport const classicLinearGaugeType = {\n description: 'A framed vintage linear instrument with zones, ticks, labels, and a moving hairline.',\n defaults: classicLinearDefaults,\n configure: configureClassicLinearSize,\n layers: classicLinearLayers\n};\n", "import { linearAxis, linearNormalOffset, linearNormalSpan, offsetLinearPoint, valueToLinearPoint } from '../geometry/linear.js';\nimport { polarPoint, valueToAngle } from '../geometry/scale.js';\nimport { svgElement } from '../renderer/svg.js';\n\n/** Draws an emphasized radial or linear reference line at the configured zero value. */\nexport const zeroMarkerLayer = {\n id: 'zero-marker',\n render(context) {\n const { options, renderer } = context;\n const marker = options.centerZero?.marker;\n if (!marker?.visible) return null;\n\n const group = renderer.group('zero-marker', { 'aria-hidden': 'true' });\n const line = options.geometry.mode === 'linear'\n ? linearZeroLine(options, marker)\n : radialZeroLine(options, marker);\n group.append(svgElement('line', {\n class: 'gaugeit__zero-marker',\n ...line,\n stroke: marker.color,\n 'stroke-width': marker.width,\n 'stroke-linecap': marker.lineCap,\n opacity: marker.opacity\n }));\n return null;\n }\n};\n\nfunction radialZeroLine(options, marker) {\n const angle = valueToAngle(options.centerZero.zeroValue, options);\n const radius = marker.radius ?? options.scale.radius;\n const start = polarPoint(\n options.geometry.centerX,\n options.geometry.centerY,\n Math.max(0, radius - marker.length),\n angle\n );\n const end = polarPoint(options.geometry.centerX, options.geometry.centerY, radius, angle);\n return { x1: start.x, y1: start.y, x2: end.x, y2: end.y };\n}\n\nfunction linearZeroLine(options, marker) {\n const axis = linearAxis(options);\n const point = valueToLinearPoint(options.centerZero.zeroValue, options);\n const span = linearNormalSpan(\n marker.length,\n marker.position,\n linearNormalOffset(marker.centerOffset)\n );\n const start = offsetLinearPoint(point, axis, span.start);\n const end = offsetLinearPoint(point, axis, span.end);\n return { x1: start.x, y1: start.y, x2: end.x, y2: end.y };\n}\n", "import { deepMerge } from '../core/utils.js';\nimport { zeroMarkerLayer } from '../layers/zero-marker.js';\nimport {\n classicLinearDefaults,\n classicLinearLayers\n} from './classic-linear.js';\nimport { configureClassicLinearSize } from './instrument-sizing.js';\n\nconst defaults = deepMerge(classicLinearDefaults, {\n min: -100,\n max: 100,\n value: 0,\n centerZero: {\n zeroValue: 0,\n symmetric: true,\n marker: {\n visible: true,\n position: 'cross',\n centerOffset: 0,\n length: 34,\n width: 3.2,\n color: '#111827',\n opacity: 1,\n lineCap: 'butt'\n }\n },\n zones: [\n { min: -100, max: -35, color: '#b91c1c', width: 7 },\n { min: -35, max: 35, color: 'transparent' },\n { min: 35, max: 100, color: '#15803d', width: 7 }\n ],\n readout: {\n title: {\n visible: true,\n text: 'DEVIATION'\n }\n }\n});\n\n/** Classic framed linear gauge with a fixed, reusable zero reference. */\nexport const classicLinearZeroGaugeType = {\n description: 'A classic linear instrument with a fixed center-zero reference and signed travel.',\n defaults,\n configure: configureClassicLinearSize,\n layers: [\n ...classicLinearLayers.slice(0, 3),\n zeroMarkerLayer,\n ...classicLinearLayers.slice(3)\n ]\n};\n", "import { faceLayer } from '../layers/face.js';\nimport { zonesLayer } from '../layers/zones.js';\nimport { ticksLayer } from '../layers/ticks.js';\nimport { labelsLayer } from '../layers/labels.js';\nimport { zeroMarkerLayer } from '../layers/zero-marker.js';\nimport { readoutLayer } from '../layers/readout.js';\nimport { lightLayer } from '../layers/light.js';\nimport { pointerLayer } from '../layers/pointer.js';\n\n/** Heritage bidirectional radial gauge with a resting zero at the top. */\nexport const centerZeroGaugeType = {\n description: 'A heritage-styled bidirectional center-zero dial for deviation, balance, and signed values.',\n defaults: {\n min: -100,\n max: 100,\n value: 0,\n geometry: {\n width: 320,\n height: 320,\n centerX: 160,\n centerY: 160,\n radius: 132,\n startAngle: 150,\n endAngle: 390\n },\n centerZero: {\n zeroValue: 0,\n symmetric: true,\n marker: {\n visible: true,\n radius: 124,\n length: 25,\n width: 3.2,\n color: '#292524',\n opacity: 1,\n lineCap: 'round'\n }\n },\n face: {\n visible: true,\n shape: 'circle',\n fit: 'geometry',\n clipContent: true,\n x: 8,\n y: 8,\n width: 304,\n height: 304,\n color: '#fffdf5',\n strokeColor: '#374151',\n strokeWidth: 4,\n innerStrokeColor: '#c7bfae',\n innerStrokeWidth: 1.4,\n shadow: true,\n glass: true\n },\n track: {\n visible: true,\n color: '#d6d0c2',\n width: 10,\n radius: 123,\n opacity: 1,\n lineCap: 'round',\n showUnderZones: true\n },\n zones: [\n { min: -100, max: -35, color: '#b91c1c', width: 8, radius: 123, opacity: 0.92, lineCap: 'round' },\n { min: -35, max: 35, color: 'transparent' },\n { min: 35, max: 100, color: '#b45309', width: 8, radius: 123, opacity: 0.92, lineCap: 'round' }\n ],\n scale: {\n radius: 119,\n position: 'inside',\n major: {\n visible: true,\n interval: 25,\n divisions: 8,\n length: 18,\n width: 2.4,\n color: '#292524'\n },\n minor: {\n visible: true,\n subdivisions: 4,\n length: 9,\n width: 1,\n color: '#78716c'\n }\n },\n labels: {\n visible: true,\n interval: 25,\n radius: 88,\n color: '#292524',\n fontSize: 11,\n fontWeight: 700\n },\n pointer: {\n type: 'spear',\n length: 101,\n shaftLength: 78,\n tailLength: 18,\n width: 8,\n color: '#7f1d1d',\n strokeColor: '#fffdf5',\n strokeWidth: 0.8,\n cap: {\n visible: true,\n stackOrder: 'above',\n radius: 10,\n color: '#292524',\n strokeColor: '#d6d3d1',\n strokeWidth: 2\n }\n },\n light: {\n visible: false,\n x: 112,\n y: 205,\n radius: 8,\n color: 'amber'\n },\n readout: {\n title: {\n visible: true,\n text: 'BALANCE',\n x: 'auto',\n y: 205,\n color: '#44403c',\n fontSize: 13,\n letterSpacing: 1.8\n },\n value: {\n visible: true,\n x: 'auto',\n y: 238,\n color: '#292524',\n fontSize: 28,\n fontWeight: 760,\n prefix: ''\n },\n unit: {\n visible: false,\n text: '',\n x: 'auto',\n y: 258,\n color: '#78716c',\n fontSize: 10\n }\n }\n },\n layers: [faceLayer, zonesLayer, ticksLayer, labelsLayer, zeroMarkerLayer, lightLayer, readoutLayer, pointerLayer]\n};\n", "import { findZoneForValue } from '../geometry/scale.js';\nimport {\n resolveTapeInterval,\n tapeMinorSpacing,\n tapeMinorStep,\n tapeValueOffset,\n tapeWindowBox\n} from '../geometry/tape.js';\nimport { isTransparentColor } from '../core/utils.js';\nimport { setSvgAttributes, svgElement } from '../renderer/svg.js';\n\n/** Draws a fixed-pointer moving numeric tape inspired by aircraft instruments. */\nexport const rollingTapeLayer = {\n id: 'rolling-tape',\n render(context) {\n const { options, renderer } = context;\n const tape = options.tape;\n const windowBox = tapeWindowBox(options);\n const vertical = tape.orientation !== 'horizontal';\n const group = renderer.group('rolling-tape', { 'aria-hidden': 'true' });\n const clipId = `${renderer.id}-rolling-tape-clip`;\n const fadeStartId = `${renderer.id}-rolling-tape-fade-start`;\n const fadeEndId = `${renderer.id}-rolling-tape-fade-end`;\n\n const defs = svgElement('defs');\n const clip = svgElement('clipPath', { id: clipId, clipPathUnits: 'userSpaceOnUse' });\n clip.append(svgElement('rect', {\n x: windowBox.x,\n y: windowBox.y,\n width: windowBox.width,\n height: windowBox.height,\n rx: tape.cornerRadius,\n ry: tape.cornerRadius\n }));\n defs.append(clip);\n defs.append(fadeGradient(fadeStartId, vertical, true, tape.fadeColor));\n defs.append(fadeGradient(fadeEndId, vertical, false, tape.fadeColor));\n group.append(defs);\n\n group.append(svgElement('rect', {\n class: 'gaugeit__tape-window-background',\n x: windowBox.x,\n y: windowBox.y,\n width: windowBox.width,\n height: windowBox.height,\n rx: tape.cornerRadius,\n ry: tape.cornerRadius,\n fill: tape.windowColor,\n stroke: 'none'\n }));\n\n const strip = svgElement('g', {\n class: 'gaugeit__tape-strip',\n 'clip-path': `url(#${clipId})`\n });\n strip.append(svgElement('rect', {\n x: windowBox.x,\n y: windowBox.y,\n width: windowBox.width,\n height: windowBox.height,\n fill: tape.stripColor\n }));\n group.append(strip);\n\n const minorStep = tapeMinorStep(options);\n const minorSpacing = tapeMinorSpacing(options);\n const majorEvery = Math.max(1, Math.floor(resolveTapeInterval(options) / minorStep + 0.5));\n const visibleLength = vertical ? windowBox.height : windowBox.width;\n const slotCount = Math.max(9, Math.ceil(visibleLength / minorSpacing) + 8);\n const halfSlots = Math.ceil(slotCount / 2);\n const slots = [];\n\n for (let index = 0; index < slotCount; index += 1) {\n const slot = createSlot(vertical, options);\n strip.append(slot.group);\n slots.push(slot);\n }\n\n drawFades(group, windowBox, tape, fadeStartId, fadeEndId, vertical);\n drawFixedIndicator(group, windowBox, tape, vertical);\n drawWindowBorder(group, windowBox, tape);\n\n return {\n update(value, state = {}) {\n const current = Number.isFinite(state.pointerValue) ? state.pointerValue : value;\n const centerIndex = Math.floor((current - options.min) / minorStep);\n for (let slotIndex = 0; slotIndex < slots.length; slotIndex += 1) {\n const tapeIndex = centerIndex + slotIndex - halfSlots;\n const slotValue = options.min + tapeIndex * minorStep;\n const slot = slots[slotIndex];\n if (slotValue < options.min - minorStep * 0.25 || slotValue > options.max + minorStep * 0.25) {\n slot.group.setAttribute('display', 'none');\n continue;\n }\n\n const offset = tapeValueOffset(slotValue, current, options);\n const coordinate = vertical\n ? { x: windowBox.x + windowBox.width / 2, y: windowBox.y + windowBox.height / 2 - offset }\n : { x: windowBox.x + windowBox.width / 2 + offset, y: windowBox.y + windowBox.height / 2 };\n slot.group.removeAttribute('display');\n slot.group.setAttribute('transform', `translate(${coordinate.x} ${coordinate.y})`);\n\n const isMajor = positiveModulo(tapeIndex, majorEvery) === 0;\n updateSlot(slot, slotValue, isMajor, options);\n }\n }\n };\n }\n};\n\nfunction createSlot(vertical, options) {\n const group = svgElement('g', { class: 'gaugeit__tape-slot' });\n const tick = svgElement('line', { class: 'gaugeit__tape-tick' });\n const text = svgElement('text', {\n class: 'gaugeit__label gaugeit__tape-label',\n fill: options.tape.textColor,\n 'font-family': options.labels.fontFamily,\n 'font-size': options.labels.fontSize,\n 'font-weight': options.labels.fontWeight,\n 'text-anchor': 'middle',\n 'dominant-baseline': 'middle'\n });\n group.append(tick, text);\n group.dataset.vertical = vertical ? 'true' : 'false';\n return { group, tick, text, vertical };\n}\n\nfunction updateSlot(slot, value, major, options) {\n const tape = options.tape;\n const tickLength = major ? tape.majorTickLength : tape.minorTickLength;\n const zone = tape.colorByZone ? findZoneForValue(value, options.zones) : null;\n const zoneColor = zone && !isTransparentColor(zone.color) ? zone.color : null;\n const tickColor = zoneColor || (major ? tape.tickColor : tape.minorTickColor);\n const textColor = zoneColor || tape.textColor;\n const lineWidth = major ? tape.majorTickWidth : tape.minorTickWidth;\n\n if (slot.vertical) {\n setSvgAttributes(slot.tick, {\n x1: -tape.tickInset,\n y1: 0,\n x2: -tape.tickInset - tickLength,\n y2: 0\n });\n setSvgAttributes(slot.text, { x: tape.labelOffset, y: 0 });\n } else {\n setSvgAttributes(slot.tick, {\n x1: 0,\n y1: tape.tickInset,\n x2: 0,\n y2: tape.tickInset + tickLength\n });\n setSvgAttributes(slot.text, { x: 0, y: -tape.labelOffset });\n }\n\n setSvgAttributes(slot.tick, {\n stroke: tickColor,\n 'stroke-width': lineWidth,\n 'stroke-linecap': 'butt',\n opacity: major ? 1 : tape.minorTickOpacity\n });\n slot.text.setAttribute('fill', textColor);\n slot.text.style.display = major && options.labels.visible ? '' : 'none';\n slot.text.textContent = formatLabel(value, options);\n}\n\nfunction drawFixedIndicator(group, box, tape, vertical) {\n const centerX = box.x + box.width / 2;\n const centerY = box.y + box.height / 2;\n const edgeInset = Math.max(0, tape.windowStrokeWidth / 2);\n if (vertical) {\n group.append(svgElement('line', {\n class: 'gaugeit__tape-indicator',\n x1: box.x + edgeInset,\n y1: centerY,\n x2: box.x + box.width - edgeInset,\n y2: centerY,\n stroke: tape.indicatorColor,\n 'stroke-width': tape.indicatorWidth,\n 'stroke-linecap': 'butt'\n }));\n } else {\n group.append(svgElement('line', {\n class: 'gaugeit__tape-indicator',\n x1: centerX,\n y1: box.y + edgeInset,\n x2: centerX,\n y2: box.y + box.height - edgeInset,\n stroke: tape.indicatorColor,\n 'stroke-width': tape.indicatorWidth,\n 'stroke-linecap': 'butt'\n }));\n }\n}\n\nfunction drawWindowBorder(group, box, tape) {\n const outerRadius = Math.max(0, Math.min(tape.cornerRadius, box.width / 2, box.height / 2));\n const innerInset = Math.max(tape.windowStrokeWidth, tape.windowInnerStrokeWidth, 0);\n group.append(svgElement('rect', {\n class: 'gaugeit__tape-window',\n x: box.x,\n y: box.y,\n width: box.width,\n height: box.height,\n rx: outerRadius,\n ry: outerRadius,\n fill: 'none',\n stroke: tape.windowStrokeColor,\n 'stroke-width': tape.windowStrokeWidth\n }));\n if (tape.windowInnerStrokeWidth > 0 && box.width > innerInset * 2 && box.height > innerInset * 2) {\n group.append(svgElement('rect', {\n class: 'gaugeit__tape-window-inner',\n x: box.x + innerInset,\n y: box.y + innerInset,\n width: box.width - innerInset * 2,\n height: box.height - innerInset * 2,\n rx: Math.max(0, outerRadius - innerInset),\n ry: Math.max(0, outerRadius - innerInset),\n fill: 'none',\n stroke: tape.windowInnerStrokeColor,\n 'stroke-width': tape.windowInnerStrokeWidth,\n 'pointer-events': 'none'\n }));\n }\n}\n\nfunction drawFades(group, box, tape, startId, endId, vertical) {\n if (tape.fadeSize <= 0) return;\n if (vertical) {\n group.append(\n svgElement('rect', { x: box.x, y: box.y, width: box.width, height: tape.fadeSize, fill: `url(#${startId})`, 'pointer-events': 'none' }),\n svgElement('rect', { x: box.x, y: box.y + box.height - tape.fadeSize, width: box.width, height: tape.fadeSize, fill: `url(#${endId})`, 'pointer-events': 'none' })\n );\n } else {\n group.append(\n svgElement('rect', { x: box.x, y: box.y, width: tape.fadeSize, height: box.height, fill: `url(#${startId})`, 'pointer-events': 'none' }),\n svgElement('rect', { x: box.x + box.width - tape.fadeSize, y: box.y, width: tape.fadeSize, height: box.height, fill: `url(#${endId})`, 'pointer-events': 'none' })\n );\n }\n}\n\nfunction fadeGradient(id, vertical, start, color) {\n const gradient = svgElement('linearGradient', {\n id,\n x1: '0%',\n y1: '0%',\n x2: vertical ? '0%' : '100%',\n y2: vertical ? '100%' : '0%'\n });\n const firstOpacity = start ? 0.96 : 0;\n const secondOpacity = start ? 0 : 0.96;\n gradient.append(\n svgElement('stop', { offset: '0%', 'stop-color': color, 'stop-opacity': firstOpacity }),\n svgElement('stop', { offset: '100%', 'stop-color': color, 'stop-opacity': secondOpacity })\n );\n return gradient;\n}\n\nfunction formatLabel(value, options) {\n if (typeof options.labels.formatter === 'function') {\n return String(options.labels.formatter(value, { min: options.min, max: options.max, options }));\n }\n return Number(value).toFixed(options.labels.fractionDigits);\n}\n\nfunction positiveModulo(value, divisor) {\n return ((value % divisor) + divisor) % divisor;\n}\n", "import { faceLayer } from '../layers/face.js';\nimport { rollingTapeLayer } from '../layers/rolling-tape.js';\nimport { readoutLayer } from '../layers/readout.js';\nimport { lightLayer } from '../layers/light.js';\nimport { configureRollingTapeSize } from './instrument-sizing.js';\n\n/** Heritage aircraft-style moving numerical tape with a fixed reference line. */\nexport const rollingTapeGaugeType = {\n description: 'A cream-faced rolling numeric tape with a fixed edge-to-edge aircraft reference line.',\n defaults: {\n geometry: {\n mode: 'tape',\n width: 320,\n height: 340,\n centerX: 160,\n centerY: 170\n },\n face: {\n visible: true,\n shape: 'panel',\n fit: 'geometry',\n clipContent: true,\n x: 8,\n y: 8,\n width: 304,\n height: 324,\n cornerRadius: 23,\n color: '#fffdf4',\n strokeColor: '#4b5563',\n strokeWidth: 4,\n innerStrokeColor: '#c8bfaa',\n innerStrokeWidth: 1.4,\n shadow: true,\n glass: true\n },\n pointer: { visible: false },\n indicator: { visible: false },\n track: { visible: false },\n tape: {\n orientation: 'vertical',\n x: 62,\n y: 69,\n width: 196,\n height: 212,\n cornerRadius: 12,\n windowColor: '#fff9ea',\n windowStrokeColor: '#544f45',\n windowStrokeWidth: 2,\n windowInnerStrokeColor: '#d8cfbd',\n windowInnerStrokeWidth: 1,\n stripColor: '#fff9ea',\n textColor: '#211f1a',\n tickColor: '#3f3a32',\n minorTickColor: '#817867',\n minorTickOpacity: 0.86,\n majorTickWidth: 2.2,\n minorTickWidth: 1,\n majorTickLength: 26,\n minorTickLength: 13,\n tickInset: 66,\n labelOffset: 10,\n interval: 20,\n minorSubdivisions: 4,\n majorSpacing: 54,\n indicatorColor: '#991b1b',\n indicatorWidth: 2.8,\n fadeSize: 38,\n fadeColor: '#fffdf4',\n colorByZone: true\n },\n scale: {\n major: { visible: true, interval: 20, divisions: 5 },\n minor: { visible: true, subdivisions: 4 }\n },\n labels: {\n visible: true,\n color: '#211f1a',\n fontSize: 15,\n fontWeight: 760,\n fractionDigits: 0\n },\n zones: [\n { min: 0, max: 20, color: '#b91c1c' },\n { min: 20, max: 80, color: 'transparent' },\n { min: 80, max: 100, color: '#15803d' }\n ],\n light: {\n visible: false,\n x: 72,\n y: 46,\n radius: 8,\n color: 'amber'\n },\n readout: {\n title: {\n visible: true,\n text: 'ALTITUDE',\n x: 'auto',\n y: 42,\n color: '#3f3a32',\n fontSize: 13,\n letterSpacing: 1.8\n },\n value: {\n visible: false,\n x: 'auto',\n y: 303,\n color: '#211f1a',\n fontSize: 24,\n fontWeight: 760\n },\n unit: {\n visible: true,\n text: 'FT',\n x: 'auto',\n y: 307,\n color: '#6b6253',\n fontSize: 10,\n letterSpacing: 1.2\n }\n }\n },\n configure: configureRollingTapeSize,\n layers: [faceLayer, rollingTapeLayer, lightLayer, readoutLayer]\n};\n", "import { arcGaugeType } from './arc.js';\nimport { classicGaugeType } from './classic.js';\nimport { lineScaleGaugeType } from './line-scale.js';\nimport { heritageRoundGaugeType } from './heritage-round.js';\nimport { classicLinearGaugeType } from './classic-linear.js';\nimport { classicLinearZeroGaugeType } from './classic-linear-zero.js';\nimport { centerZeroGaugeType } from './center-zero.js';\nimport { rollingTapeGaugeType } from './rolling-tape.js';\n\n/** Registers the built-in types on a supplied registry. */\nexport function registerBuiltInTypes(registry) {\n registry\n .register('arc', arcGaugeType)\n .register('classic', classicGaugeType)\n .register('classic-linear', classicLinearGaugeType)\n .register('classic-linear-zero', classicLinearZeroGaugeType)\n .register('center-zero', centerZeroGaugeType)\n .register('heritage-round', heritageRoundGaugeType)\n .register('rolling-tape', rollingTapeGaugeType)\n .register('line-scale', lineScaleGaugeType);\n return registry;\n}\n\nexport const builtInTypes = Object.freeze({\n arc: arcGaugeType,\n classic: classicGaugeType,\n 'classic-linear': classicLinearGaugeType,\n 'classic-linear-zero': classicLinearZeroGaugeType,\n 'center-zero': centerZeroGaugeType,\n 'heritage-round': heritageRoundGaugeType,\n 'rolling-tape': rollingTapeGaugeType,\n 'line-scale': lineScaleGaugeType\n});\n", "import { parseJsonObject } from './utils.js';\n\nconst mountedInstances = new WeakMap();\n\n/** Creates one gauge and remembers it for duplicate-safe auto mounting. */\nexport function createManagedGauge(target, options, GaugeClass, registry) {\n const existing = mountedInstances.get(target);\n if (existing) existing.destroy();\n const gauge = new GaugeClass(target, options, registry, managedLifecycle(target));\n mountedInstances.set(target, gauge);\n return gauge;\n}\n\n/** Initializes all matching data-gaugeit elements. */\nexport function autoMountElements(selector, GaugeClass, registry, root = document) {\n const elements = [...root.querySelectorAll(selector || '[data-gaugeit]')];\n return elements.map((element) => {\n const existing = mountedInstances.get(element);\n if (existing) return existing;\n const options = optionsFromDataset(element);\n const gauge = new GaugeClass(element, options, registry, managedLifecycle(element));\n mountedInstances.set(element, gauge);\n return gauge;\n });\n}\n\n/** Returns the managed instance mounted on an element, when present. */\nexport function getMountedGauge(element) {\n return mountedInstances.get(element) || null;\n}\n\n/** Destroys a managed instance and removes it from the mount registry. */\nexport function unmountGauge(element) {\n const gauge = mountedInstances.get(element);\n if (!gauge) return false;\n gauge.destroy();\n mountedInstances.delete(element);\n return true;\n}\n\nfunction optionsFromDataset(element) {\n const options = parseJsonObject(element.dataset.gaugeitOptions, {});\n if (element.dataset.gaugeitType) options.type = element.dataset.gaugeitType;\n if (element.dataset.gaugeitValue !== undefined) options.value = Number(element.dataset.gaugeitValue);\n if (element.dataset.gaugeitMin !== undefined) options.min = Number(element.dataset.gaugeitMin);\n if (element.dataset.gaugeitMax !== undefined) options.max = Number(element.dataset.gaugeitMax);\n return options;\n}\n\nfunction managedLifecycle(element) {\n return {\n onDestroy(gauge) {\n if (mountedInstances.get(element) === gauge) mountedInstances.delete(element);\n }\n };\n}\n", "import { parseJsonObject } from './core/utils.js';\n\n/** Defines an optional <gauge-it> custom element without requiring a framework. */\nexport function defineCustomElement(createGauge, tagName = 'gauge-it') {\n if (typeof customElements === 'undefined' || typeof HTMLElement === 'undefined') return null;\n if (customElements.get(tagName)) return customElements.get(tagName);\n\n class GaugeitElement extends HTMLElement {\n static get observedAttributes() {\n return ['value', 'min', 'max', 'type', 'options'];\n }\n\n constructor() {\n super();\n this._gauge = null;\n this._mount = document.createElement('div');\n this._mount.className = 'gaugeit-element__mount';\n }\n\n connectedCallback() {\n if (!this._mount.isConnected) this.append(this._mount);\n if (!this._gauge) this._gauge = createGauge(this._mount, this._readOptions());\n }\n\n disconnectedCallback() {\n if (this._gauge) {\n this._gauge.destroy();\n this._gauge = null;\n }\n }\n\n attributeChangedCallback() {\n if (this._gauge) this._gauge.replaceOptions(this._readOptions());\n }\n\n get value() {\n return this._gauge ? this._gauge.getValue() : Number(this.getAttribute('value') || 0);\n }\n\n set value(nextValue) {\n this.setAttribute('value', String(nextValue));\n }\n\n get gauge() {\n return this._gauge;\n }\n\n _readOptions() {\n const options = parseJsonObject(this.getAttribute('options'), {});\n if (this.hasAttribute('type')) options.type = this.getAttribute('type');\n if (this.hasAttribute('value')) options.value = Number(this.getAttribute('value'));\n if (this.hasAttribute('min')) options.min = Number(this.getAttribute('min'));\n if (this.hasAttribute('max')) options.max = Number(this.getAttribute('max'));\n return options;\n }\n }\n\n customElements.define(tagName, GaugeitElement);\n return GaugeitElement;\n}\n", "import { Gauge } from './core/gauge.js';\nimport { gaugeTypeRegistry, GaugeTypeRegistry } from './core/registry.js';\nimport { registerBuiltInTypes, builtInTypes } from './types/register-builtins.js';\nimport {\n autoMountElements,\n createManagedGauge,\n getMountedGauge,\n unmountGauge\n} from './core/auto-mount.js';\nimport { defineCustomElement } from './web-component.js';\nimport { faceLayer } from './layers/face.js';\nimport { zonesLayer } from './layers/zones.js';\nimport { ticksLayer } from './layers/ticks.js';\nimport { labelsLayer } from './layers/labels.js';\nimport { pointerLayer } from './layers/pointer.js';\nimport { readoutLayer } from './layers/readout.js';\nimport { linearZonesLayer } from './layers/linear-zones.js';\nimport { linearTicksLayer } from './layers/linear-ticks.js';\nimport { linearLabelsLayer } from './layers/linear-labels.js';\nimport { linearIndicatorLayer } from './layers/linear-indicator.js';\nimport { zeroMarkerLayer } from './layers/zero-marker.js';\nimport { rollingTapeLayer } from './layers/rolling-tape.js';\nimport { lightLayer } from './layers/light.js';\nimport {\n angleToValue,\n arcPath,\n buildMinorValues,\n buildScaleValues,\n centeredArcAngles,\n findZoneForValue,\n gaugeSweep,\n niceInterval,\n polarPoint,\n resolveZoneSegments,\n taperedArcPath,\n valueToAngle\n} from './geometry/scale.js';\nimport {\n calculateGaugeBounds,\n isClosedGauge,\n padBounds,\n resolveFaceBox,\n resolveReadoutPosition,\n resolveScaleEndpointValues,\n unionBounds\n} from './geometry/bounds.js';\nimport {\n linearAxis,\n linearIndicatorNormalOffset,\n linearNormalOffset,\n linearNormalSpan,\n linearYToSvg,\n linearPointToValue,\n offsetLinearPoint,\n valueToLinearPoint,\n valueToLinearRatio\n} from './geometry/linear.js';\nimport {\n resolveTapeInterval,\n tapeMinorSpacing,\n tapeMinorStep,\n tapeValueOffset,\n tapeWindowBox\n} from './geometry/tape.js';\nimport { lightIsActive, resolveLightPosition } from './geometry/light.js';\nimport { deepMerge } from './core/utils.js';\nimport { easingNames } from './core/easing.js';\n\nregisterBuiltInTypes(gaugeTypeRegistry);\n\n/** Creates a duplicate-safe Gaugeit instance. */\nexport function createGauge(target, options = {}) {\n const element = typeof target === 'string' ? document.querySelector(target) : target;\n if (!element) throw new Error(`Gaugeit target not found: ${target}`);\n return createManagedGauge(element, options, Gauge, gaugeTypeRegistry);\n}\n\n/** Registers or replaces a gauge type in the default registry. */\nexport function registerGaugeType(name, definition) {\n gaugeTypeRegistry.register(name, definition);\n return Gaugeit;\n}\n\n/** Initializes all [data-gaugeit] elements, or a custom selector. */\nexport function autoMount(selector = '[data-gaugeit]', root = document) {\n return autoMountElements(selector, Gauge, gaugeTypeRegistry, root);\n}\n\n/** Defines the optional <gauge-it> custom element. */\nexport function defineGaugeitElement(tagName = 'gauge-it') {\n return defineCustomElement(createGauge, tagName);\n}\n\nexport {\n Gauge,\n GaugeTypeRegistry,\n gaugeTypeRegistry,\n getMountedGauge,\n unmountGauge,\n deepMerge,\n easingNames\n};\n\nexport const layers = Object.freeze({\n face: faceLayer,\n zones: zonesLayer,\n ticks: ticksLayer,\n labels: labelsLayer,\n pointer: pointerLayer,\n readout: readoutLayer,\n linearZones: linearZonesLayer,\n linearTicks: linearTicksLayer,\n linearLabels: linearLabelsLayer,\n linearIndicator: linearIndicatorLayer,\n zeroMarker: zeroMarkerLayer,\n rollingTape: rollingTapeLayer,\n light: lightLayer\n});\n\nexport const geometry = Object.freeze({\n angleToValue,\n arcPath,\n calculateGaugeBounds,\n buildMinorValues,\n buildScaleValues,\n centeredArcAngles,\n findZoneForValue,\n gaugeSweep,\n isClosedGauge,\n linearAxis,\n linearIndicatorNormalOffset,\n linearNormalOffset,\n linearNormalSpan,\n linearYToSvg,\n linearPointToValue,\n niceInterval,\n offsetLinearPoint,\n padBounds,\n polarPoint,\n resolveFaceBox,\n resolveReadoutPosition,\n resolveScaleEndpointValues,\n resolveZoneSegments,\n taperedArcPath,\n unionBounds,\n valueToAngle,\n valueToLinearPoint,\n valueToLinearRatio,\n resolveTapeInterval,\n tapeMinorSpacing,\n tapeMinorStep,\n tapeValueOffset,\n tapeWindowBox,\n lightIsActive,\n resolveLightPosition\n});\n\nexport const types = builtInTypes;\n\nexport const VERSION = '0.1.0';\n\nconst Gaugeit = Object.freeze({\n VERSION,\n Gauge,\n GaugeTypeRegistry,\n createGauge,\n registerGaugeType,\n autoMount,\n defineGaugeitElement,\n getMountedGauge,\n unmountGauge,\n registry: gaugeTypeRegistry,\n types,\n layers,\n geometry,\n deepMerge,\n easingNames\n});\n\nexport default Gaugeit;\n"],
5
+ "mappings": "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",
6
+ "names": ["standalone_exports", "__export", "Gauge", "GaugeTypeRegistry", "VERSION", "autoMount", "createGauge", "deepMerge", "standalone_default", "defineGaugeitElement", "easingNames", "gaugeTypeRegistry", "geometry", "getMountedGauge", "layers", "registerGaugeType", "types", "unmountGauge", "gaugeit_default", "isPlainObject", "value", "prototype", "constructor", "deepMerge", "base", "override", "cloneValue", "result", "key", "isUnsafeObjectKey", "copy", "child", "clamp", "min", "max", "finiteNumber", "fallback", "number", "idCounter", "uniqueId", "prefix", "resolveElement", "target", "element", "isTransparentColor", "color", "normalized", "requestFrame", "callback", "cancelFrame", "handle", "dispatchGaugeEvent", "target", "name", "detail", "parseJsonObject", "value", "fallback", "parsed", "isPlainObject", "e", "degreesToRadians", "degrees", "polarPoint", "centerX", "centerY", "radius", "angleDegrees", "radians", "gaugeSweep", "options", "centeredArcAngles", "sweep", "centerAngle", "safeSweep", "finiteNumber", "svgCenter", "halfSweep", "valueToAngle", "value", "clampValue", "min", "max", "valueRatio", "clamp", "visualRatio", "angleToValue", "angle", "clampResult", "arcPath", "startAngle", "endAngle", "start", "end", "delta", "sweepFlag", "midpoint", "roundSvg", "largeArcFlag", "taperedArcPath", "startWidth", "endWidth", "segments", "sampleCount", "safeRadius", "firstWidth", "lastWidth", "outer", "inner", "index", "ratio", "width", "commands", "niceInterval", "range", "desiredDivisions", "raw", "exponent", "fraction", "niceFraction", "buildScaleValues", "interval", "safeInterval", "precision", "decimalPlaces", "epsilon", "values", "current", "guard", "roundTo", "buildMinorValues", "majorValues", "subdivisions", "count", "step", "subdivision", "resolveZoneSegments", "zones", "normalized", "zone", "breakpoints", "points", "left", "right", "segmentMin", "segmentMax", "candidates", "findZoneForValue", "match", "factor", "text", "decimal", "linearYToSvg", "y", "options", "linear", "finiteNumber", "linearAxis", "startX", "startY", "endX", "endY", "dx", "dy", "length", "tangentX", "tangentY", "valueToLinearRatio", "value", "clampValue", "valueRatio", "clamp", "valueToLinearPoint", "axis", "ratio", "linearPointToValue", "x", "clampResult", "relativeX", "relativeY", "visualRatio", "boundedVisualRatio", "offsetLinearPoint", "point", "distance", "amount", "linearNormalOffset", "linearIndicatorNormalOffset", "indicator", "linearNormalSpan", "position", "offset", "size", "shift", "tapeWindowBox", "options", "tape", "finiteNumber", "resolveTapeInterval", "_a", "_b", "_c", "explicit", "niceInterval", "tapeMinorStep", "subdivisions", "tapeMinorSpacing", "tapeValueOffset", "value", "currentValue", "step", "spacing", "direction", "resolveLightPosition", "light", "options", "finiteNumber", "linearYToSvg", "lightIsActive", "value", "trigger", "sample", "first", "second", "EPSILON", "createBounds", "x", "y", "width", "height", "includePoint", "bounds", "includeRect", "finalizeBounds", "fallback", "padBounds", "padding", "amount", "finiteNumber", "unionBounds", "rectangles", "accumulator", "rectangle", "isClosedGauge", "options", "gaugeSweep", "resolveScaleEndpointValues", "values", "_a", "mode", "resolveReadoutPosition", "part", "reference", "readoutReferenceBox", "fontSize", "margin", "position", "automaticX", "automaticY", "linearYToSvg", "resolveFaceBox", "contentBounds", "_b", "face", "geometry", "configured", "minimumWidth", "minimumHeight", "cx", "cy", "configuredRadius", "contentRadius", "radius", "padded", "horizontalExtent", "contentCenterY", "calculateGaugeBounds", "configuration", "includeFace", "includeBase", "box", "expansion", "includeLinearTrackAndZones", "includeLinearScale", "includeLinearLabels", "includeLinearIndicator", "includeZeroMarker", "includeTape", "includeTrackAndZones", "includeScale", "includeLabels", "includePointer", "includeReadout", "includeLight", "track", "includeArc", "zone", "isTransparentColor", "zoneMaximumWidth", "valueToAngle", "fallbackWidth", "_c", "scale", "lengths", "length", "inner", "outer", "includeArcSector", "labels", "interval", "buildScaleValues", "value", "point", "polarPoint", "rendered", "e", "halfWidth", "halfHeight", "pointer", "axis", "linearAxis", "includeLinearStroke", "valueToLinearPoint", "linearNormalOffset", "span", "linearNormalSpan", "includeLinearExtent", "offsetLinearPoint", "indicator", "linearIndicatorNormalOffset", "strokeExpansion", "normalStart", "normalEnd", "tangentExpansion", "marker", "start", "end", "angle", "startPoint", "endPoint", "offset", "minX", "minY", "base", "normal", "tapeWindowBox", "light", "resolveLightPosition", "halo", "bezel", "extent", "kind", "text", "startAngle", "endAngle", "innerRadius", "outerRadius", "angles", "cardinal", "angleIsWithinSweep", "delta", "positiveModulo", "divisor", "SVG_NAMESPACE", "svgElement", "tagName", "attributes", "text", "element", "setSvgAttributes", "name", "value", "SvgRenderer", "host", "options", "uniqueId", "root", "calculateGaugeBounds", "initialViewport", "padBounds", "geometry", "svg", "viewBoxValue", "title", "description", "content", "measured", "measureContent", "contentIsClipped", "combined", "unionBounds", "viewport", "clipPath", "group", "clipPathId", "controller", "state", "responsive", "contain", "bounds", "round", "box", "e", "EASINGS", "t", "resolveEasing", "easing", "easingNames", "BASE_DEFAULTS", "VALID_OVERFLOW", "VALID_POINTERS", "VALID_POSITIONS", "VALID_ROTATIONS", "VALID_LAYOUT_MODES", "VALID_FACE_FITS", "VALID_FACE_SHAPES", "VALID_ENDPOINT_MODES", "VALID_READOUT_POSITIONS", "VALID_GEOMETRY_MODES", "VALID_LINEAR_TICK_SIDES", "VALID_INDICATOR_TYPES", "VALID_INDICATOR_POSITIONS", "VALID_CAP_STACK_ORDERS", "VALID_ORIENTATIONS", "VALID_LIGHT_COLORS", "VALID_LIGHT_TRIGGER_MODES", "VALID_LIGHT_TRIGGER_SOURCES", "resolveGaugeOptions", "userOptions", "registry", "requested", "isPlainObject", "requestedType", "BASE_DEFAULTS", "typeDefinition", "fallbacks", "deepMerge", "options", "restoreOptionShape", "configured", "finiteNumber", "validateLayout", "validateGeometry", "validateLinear", "validateFace", "validateScale", "validatePointer", "validateIndicator", "validateCenterZero", "validateTape", "validateLight", "validateLabels", "validateReadout", "validateAnimation", "validateJitter", "normalizeZones", "resolveMajorInterval", "explicit", "divisions", "niceInterval", "mergeUserOptions", "currentUserOptions", "patch", "layout", "geometry", "linear", "face", "pointer", "indicator", "requestedIndicator", "explicitCenterOffset", "explicitLegacyOffset", "centerZero", "magnitude", "tape", "fadeAxisSize", "light", "normalizeColor", "value", "fallback", "labels", "readout", "validateReadoutPart", "part", "defaultFontSize", "animation", "jitter", "zones", "min", "max", "defaultWidth", "zone", "_a", "_b", "width", "taper", "normalizeZoneTaper", "cloneValue", "key", "fallbackWidth", "startWidth", "endWidth", "Gauge", "target", "userOptions", "registry", "lifecycle", "resolveElement", "mergeUserOptions", "resolveGaugeOptions", "SvgRenderer", "definition", "context", "layer", "controller", "dispatchGaugeEvent", "value", "updateOptions", "normalized", "duration", "finiteNumber", "animate", "easing", "resolveEasing", "now", "performanceNow", "patch", "behavior", "requested", "options", "nextUserOptions", "hadExplicitValue", "previousType", "cancelFrame", "suspensionStartedAt", "onDestroy", "animation", "start", "startFrom", "number", "changed", "clamp", "requestFrame", "timestamp", "delta", "animationCompleted", "elapsed", "progress", "eased", "completed", "jitter", "interval", "smoothingFactor", "nextDisplay", "nextPointer", "force", "pointerValue", "rounded", "roundValue", "displayChanged", "pointerChanged", "root", "valueText", "entries", "entry", "precision", "factor", "GaugeTypeRegistry", "name", "definition", "normalizedName", "isPlainObject", "normalizedLayers", "layer", "index", "cloneValue", "gaugeTypeRegistry", "faceLayer", "context", "options", "renderer", "face", "group", "box", "resolveFaceBox", "shadowId", "glassId", "clipId", "inset", "innerBox", "insetFaceBox", "defs", "svgElement", "filter", "gradient", "clipPath", "createFaceShape", "base", "radius", "attributes", "cornerRadius", "zonesLayer", "context", "options", "renderer", "group", "segments", "resolveZoneSegments", "appendArc", "segment", "style", "isTransparentColor", "parent", "min", "max", "className", "nodes", "createArcNodes", "node", "_a", "_b", "_c", "_d", "_e", "geometry", "radius", "fallbackWidth", "color", "opacity", "lineCap", "startAngle", "valueToAngle", "endAngle", "svgElement", "arcPath", "startWidth", "widthAtValue", "endWidth", "taperedArcPath", "start", "polarPoint", "end", "atZoneStart", "atZoneEnd", "capNode", "zone", "value", "taper", "finiteNumber", "range", "ratio", "point", "width", "edge", "ticksLayer", "context", "options", "renderer", "scale", "group", "interval", "resolveMajorInterval", "completeMajorValues", "buildScaleValues", "majorValues", "resolveScaleEndpointValues", "minorValues", "buildMinorValues", "svgElement", "tickPath", "values", "length", "commands", "value", "angle", "valueToAngle", "radii", "tickRadii", "start", "polarPoint", "end", "roundSvg", "radius", "position", "labelsLayer", "context", "options", "renderer", "labels", "group", "interval", "resolveMajorInterval", "values", "resolveScaleEndpointValues", "buildScaleValues", "value", "angle", "valueToAngle", "point", "polarPoint", "text", "svgElement", "labelTransform", "formatLabel", "rotation", "pointerLayer", "context", "options", "renderer", "pointer", "geometry", "group", "rotating", "svgElement", "shape", "createPointerShape", "cap", "appendVisualStack", "value", "state", "pointerValue", "angle", "valueToAngle", "zone", "findZoneForValue", "color", "isTransparentColor", "capStackOrder", "cx", "cy", "front", "tail", "half", "shaft", "resolveShaftLength", "points", "shoulder", "path", "point", "index", "setSvgAttributes", "readoutLayer", "context", "options", "renderer", "readout", "group", "textNode", "valueNode", "valueFormatter", "createValueFormatter", "value", "kind", "config", "position", "resolveReadoutPosition", "svgElement", "formatter", "LIGHT_PALETTES", "lightLayer", "options", "renderer", "light", "x", "y", "resolveLightPosition", "palette", "resolvePalette", "colorName", "glowFilterId", "onGradientId", "offGradientId", "bezelGradientId", "defs", "svgElement", "createGlowFilter", "createBulbGradient", "createBezelGradient", "group", "lamp", "bezel", "bezelHighlight", "offVisual", "createLampVisual", "onVisual", "value", "state", "_a", "sample", "resolveTriggerSample", "active", "lightIsActive", "blinking", "pulsing", "radius", "gradientId", "edgeColor", "glowColor", "sparkleOpacity", "shadeOpacity", "visual", "lowerLensShadePath", "named", "custom", "id", "filter", "colors", "gradient", "r", "source", "displayedValue", "arcGaugeType", "faceLayer", "zonesLayer", "ticksLayer", "labelsLayer", "lightLayer", "readoutLayer", "pointerLayer", "classicGaugeType", "faceLayer", "zonesLayer", "ticksLayer", "labelsLayer", "lightLayer", "readoutLayer", "pointerLayer", "lineScaleGaugeType", "faceLayer", "zonesLayer", "ticksLayer", "labelsLayer", "lightLayer", "readoutLayer", "pointerLayer", "heritageRoundGaugeType", "faceLayer", "zonesLayer", "ticksLayer", "labelsLayer", "lightLayer", "readoutLayer", "pointerLayer", "linearZonesLayer", "context", "options", "renderer", "group", "segments", "resolveZoneSegments", "createSegment", "segment", "style", "isTransparentColor", "className", "line", "min", "max", "_a", "_b", "_c", "_d", "axis", "linearAxis", "offset", "linearNormalOffset", "start", "offsetLinearPoint", "valueToLinearPoint", "end", "svgElement", "linearTicksLayer", "context", "options", "renderer", "scale", "group", "interval", "resolveMajorInterval", "majorValues", "buildScaleValues", "minorValues", "buildMinorValues", "svgElement", "tickPath", "values", "length", "axis", "linearAxis", "span", "linearNormalSpan", "commands", "value", "point", "valueToLinearPoint", "start", "offsetLinearPoint", "end", "roundSvg", "linearLabelsLayer", "context", "options", "renderer", "labels", "group", "interval", "resolveMajorInterval", "values", "buildScaleValues", "axis", "linearAxis", "value", "point", "offsetLinearPoint", "valueToLinearPoint", "linearNormalOffset", "text", "svgElement", "labelTransform", "formatLabel", "rotation", "axisAngle", "linearIndicatorLayer", "context", "options", "renderer", "indicator", "axis", "linearAxis", "normalOffset", "linearIndicatorNormalOffset", "group", "moving", "svgElement", "shape", "createIndicatorShape", "cap", "value", "state", "visualValue", "point", "valueToLinearPoint", "zone", "findZoneForValue", "color", "isTransparentColor", "setIndicatorColor", "span", "linearNormalSpan", "direction", "markerDirection", "size", "centerY", "tipY", "baseY", "halfWidth", "y", "setSvgAttributes", "position", "resolveIntrinsicGeometrySize", "options", "context", "_a", "_b", "requestedGeometry", "isPlainObject", "typeGeometry", "widthExplicit", "hasOwn", "heightExplicit", "ratioExplicit", "ratio", "finiteNumber", "baseWidth", "configureClassicLinearSize", "sizing", "scaleX", "scaleY", "uniform", "scalePaths", "configureRollingTapeSize", "vertical", "factor", "paths", "path", "hasPath", "baseValue", "getPath", "setPath", "value", "key", "keys", "cursor", "nextValue", "index", "classicLinearDefaults", "classicLinearLayers", "faceLayer", "linearZonesLayer", "linearTicksLayer", "linearLabelsLayer", "lightLayer", "readoutLayer", "linearIndicatorLayer", "classicLinearGaugeType", "configureClassicLinearSize", "zeroMarkerLayer", "context", "_a", "options", "renderer", "marker", "group", "line", "linearZeroLine", "radialZeroLine", "svgElement", "angle", "valueToAngle", "radius", "start", "polarPoint", "end", "axis", "linearAxis", "point", "valueToLinearPoint", "span", "linearNormalSpan", "linearNormalOffset", "offsetLinearPoint", "defaults", "deepMerge", "classicLinearDefaults", "classicLinearZeroGaugeType", "configureClassicLinearSize", "classicLinearLayers", "zeroMarkerLayer", "centerZeroGaugeType", "faceLayer", "zonesLayer", "ticksLayer", "labelsLayer", "zeroMarkerLayer", "lightLayer", "readoutLayer", "pointerLayer", "rollingTapeLayer", "context", "options", "renderer", "tape", "windowBox", "tapeWindowBox", "vertical", "group", "clipId", "fadeStartId", "fadeEndId", "defs", "svgElement", "clip", "fadeGradient", "strip", "minorStep", "tapeMinorStep", "minorSpacing", "tapeMinorSpacing", "majorEvery", "resolveTapeInterval", "visibleLength", "slotCount", "halfSlots", "slots", "index", "slot", "createSlot", "drawFades", "drawFixedIndicator", "drawWindowBorder", "value", "state", "current", "centerIndex", "slotIndex", "tapeIndex", "slotValue", "offset", "tapeValueOffset", "coordinate", "isMajor", "positiveModulo", "updateSlot", "tick", "text", "major", "tickLength", "zone", "findZoneForValue", "zoneColor", "isTransparentColor", "tickColor", "textColor", "lineWidth", "setSvgAttributes", "formatLabel", "box", "centerX", "centerY", "edgeInset", "outerRadius", "innerInset", "startId", "endId", "id", "start", "color", "gradient", "firstOpacity", "secondOpacity", "divisor", "rollingTapeGaugeType", "configureRollingTapeSize", "faceLayer", "rollingTapeLayer", "lightLayer", "readoutLayer", "registerBuiltInTypes", "registry", "arcGaugeType", "classicGaugeType", "classicLinearGaugeType", "classicLinearZeroGaugeType", "centerZeroGaugeType", "heritageRoundGaugeType", "rollingTapeGaugeType", "lineScaleGaugeType", "builtInTypes", "mountedInstances", "createManagedGauge", "target", "options", "GaugeClass", "registry", "existing", "gauge", "managedLifecycle", "autoMountElements", "selector", "root", "element", "optionsFromDataset", "getMountedGauge", "unmountGauge", "parseJsonObject", "defineCustomElement", "createGauge", "tagName", "GaugeitElement", "nextValue", "options", "parseJsonObject", "registerBuiltInTypes", "gaugeTypeRegistry", "createGauge", "target", "options", "element", "createManagedGauge", "Gauge", "registerGaugeType", "name", "definition", "Gaugeit", "autoMount", "selector", "root", "autoMountElements", "defineGaugeitElement", "tagName", "defineCustomElement", "layers", "faceLayer", "zonesLayer", "ticksLayer", "labelsLayer", "pointerLayer", "readoutLayer", "linearZonesLayer", "linearTicksLayer", "linearLabelsLayer", "linearIndicatorLayer", "zeroMarkerLayer", "rollingTapeLayer", "lightLayer", "geometry", "angleToValue", "arcPath", "calculateGaugeBounds", "buildMinorValues", "buildScaleValues", "centeredArcAngles", "findZoneForValue", "gaugeSweep", "isClosedGauge", "linearAxis", "linearIndicatorNormalOffset", "linearNormalOffset", "linearNormalSpan", "linearYToSvg", "linearPointToValue", "niceInterval", "offsetLinearPoint", "padBounds", "polarPoint", "resolveFaceBox", "resolveReadoutPosition", "resolveScaleEndpointValues", "resolveZoneSegments", "taperedArcPath", "unionBounds", "valueToAngle", "valueToLinearPoint", "valueToLinearRatio", "resolveTapeInterval", "tapeMinorSpacing", "tapeMinorStep", "tapeValueOffset", "tapeWindowBox", "lightIsActive", "resolveLightPosition", "types", "builtInTypes", "VERSION", "Gaugeit", "Gauge", "GaugeTypeRegistry", "createGauge", "registerGaugeType", "autoMount", "defineGaugeitElement", "getMountedGauge", "unmountGauge", "gaugeTypeRegistry", "deepMerge", "easingNames", "index_default", "STYLE_ID", "style", "gaugeit_default", "standalone_default", "index_default"]
7
+ }