@weasel-js/quantity 1.15.0 → 1.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -613,7 +613,15 @@ interface UnitScope {
613
613
  /** What one of this scope's base units is worth in the enclosing scope's
614
614
  * base units. Absent is 1, which is also what the outermost scope has. */
615
615
  scale?: UnitEntry;
616
+ /** How large the scope's frame is drawn in the enclosing one: a drawer's
617
+ * plan inset at 0.4 says 0.4. It declares a magnification that something
618
+ * else draws (a scale `transform` on the node), so a length measured on
619
+ * screen can be divided back to its true size. Absent is 1. */
620
+ drawnAt?: number;
616
621
  }
622
+ /** How large the innermost scope's frame is drawn in the outermost's: every
623
+ * `drawnAt` of `scopes`, multiplied. */
624
+ declare function magnificationOf(scopes: readonly UnitScope[]): number;
617
625
  /** A measure in the innermost scope's base units, in the outermost's. `scopes` runs outermost first. */
618
626
  declare function toRoot(base: number, scopes: readonly UnitScope[]): number;
619
627
  /** The inverse of {@link toRoot}: an outermost-scope measure in the innermost scope's base units. */
@@ -645,6 +653,37 @@ interface ScopeTree<Id> {
645
653
  */
646
654
  declare function scopesOf<Id>(id: Id, root: UnitScope, tree: ScopeTree<Id>): UnitScope[];
647
655
 
656
+ /** Options for {@link scaleBar}. */
657
+ interface ScaleBarOptions {
658
+ /** Screen pixels one world unit (a root base unit) covers at the view's zoom. */
659
+ pxPerUnit: number;
660
+ /** The unit scopes of the frame the bar measures, outermost first: what
661
+ * `sceneSharedUnitScopes` returns for the nodes it is read beside. */
662
+ scopes: readonly UnitScope[];
663
+ /** The longest the bar may be, in screen pixels. Default 140. */
664
+ maxPx?: number;
665
+ /** The lengths it chooses among, in the innermost scope's units. Default:
666
+ * 1, 2 and 5 of every decade of every unit that scope's system carries. */
667
+ lengths?: readonly UnitValue[];
668
+ }
669
+ /** A scale bar's length and label. */
670
+ interface ScaleBar {
671
+ /** In the innermost scope's base units. */
672
+ length: number;
673
+ /** Its length on screen. */
674
+ px: number;
675
+ /** The length in the largest of the scope's units it is a whole number of. */
676
+ label: string;
677
+ /** How large the frame is drawn in the world: every `drawnAt` of the scopes. */
678
+ magnification: number;
679
+ }
680
+ /**
681
+ * The longest round length that fits in `maxPx` in the frame `scopes` names,
682
+ * or the shortest when none does. It measures the frame's own lengths: inside
683
+ * a scope drawn at 0.4×, a bar labeled 10″ spans 4″ of the world around it.
684
+ */
685
+ declare function scaleBar(opts: ScaleBarOptions): ScaleBar;
686
+
648
687
  /** Options for presenting a range. */
649
688
  interface RangeOptions extends PresentOptions {
650
689
  /** What goes between the ends. Default an en dash, spaced when an end is negative. */
@@ -726,4 +765,4 @@ declare function canSpin(key: string, from: number, bounds: SpinBounds): boolean
726
765
  /** How many steps a coarse key press takes: an arrow with Shift held, or Page Up and Page Down. */
727
766
  declare const COARSE_STEPS = 10;
728
767
 
729
- export { ANGLE_RADIANS, type BytesDisplay, COARSE_STEPS, CONSTANTS, type CompactDisplay, type CurrencyDisplay, type DecimalDisplay, type Display, type DisplayKind, type DurationDisplay, type Endless, type EndlessTrack, type FormatContext, type FractionDisplay, type FractionOptions, IMPERIAL_INCHES, type InfinityText, type IntegerDisplay, METRIC_MM, MINUS_SIGN, type MultiplierDisplay, type NamedConstant, type OrdinalDisplay, PIXELS, type Part, type PerAxis, type PercentDisplay, type PlaneUnits, type PlaneValue, type PresentOptions, type Presentation, type Quantity, QuantityView, type RangeOptions, type RatioDisplay, type RomanDisplay, type ScientificDisplay, type ScopeTree, type SpinBounds, type Tagged, type Unit, type UnitDisplay, type UnitEntry, type UnitExpr, type UnitExprContext, type UnitScale, type UnitScope, type UnitSystem, type UnitTable, type UnitValue, type VectorOptions, type ZoomDisplay, amount, axisUnits, bytes, bytesKind, canSpin, clampToBounds, compact, compactKind, currency, currencyKind, decimal, decimalKind, displayKindOf, displayOf, duration, durationKind, endless, endlessAllows, endlessAt, endlessTrack, entryScale, formatAxes, formatCompact, formatNumber, formatScoped, formatUnit, fraction, fractionKind, fromRoman, fromRoot, integer, integerKind, intlParts, multiplier, multiplierKind, nearestFraction, numberPart, ordinal, ordinalKind, parseAs, parseNumber, parseSignedNumber, parseUnitExpr, partsOf, partsToHtml, percent, percentKind, plural, present, presentRange, presentVector, qty, rangeParts, ratio, ratioKind, registerDisplayKind, resolveAxes, resolveScoped, resolveUnit, resolveUnitExpr, retag, roman, romanKind, scientific, scientificKind, scopesOf, signed, snapToStep, spinKey, spokenSign, tag, textOf, toRoman, toRoot, unit, unitKind, unitOf, unitScale, vectorParts, zoom, zoomKind };
768
+ export { ANGLE_RADIANS, type BytesDisplay, COARSE_STEPS, CONSTANTS, type CompactDisplay, type CurrencyDisplay, type DecimalDisplay, type Display, type DisplayKind, type DurationDisplay, type Endless, type EndlessTrack, type FormatContext, type FractionDisplay, type FractionOptions, IMPERIAL_INCHES, type InfinityText, type IntegerDisplay, METRIC_MM, MINUS_SIGN, type MultiplierDisplay, type NamedConstant, type OrdinalDisplay, PIXELS, type Part, type PerAxis, type PercentDisplay, type PlaneUnits, type PlaneValue, type PresentOptions, type Presentation, type Quantity, QuantityView, type RangeOptions, type RatioDisplay, type RomanDisplay, type ScaleBar, type ScaleBarOptions, type ScientificDisplay, type ScopeTree, type SpinBounds, type Tagged, type Unit, type UnitDisplay, type UnitEntry, type UnitExpr, type UnitExprContext, type UnitScale, type UnitScope, type UnitSystem, type UnitTable, type UnitValue, type VectorOptions, type ZoomDisplay, amount, axisUnits, bytes, bytesKind, canSpin, clampToBounds, compact, compactKind, currency, currencyKind, decimal, decimalKind, displayKindOf, displayOf, duration, durationKind, endless, endlessAllows, endlessAt, endlessTrack, entryScale, formatAxes, formatCompact, formatNumber, formatScoped, formatUnit, fraction, fractionKind, fromRoman, fromRoot, integer, integerKind, intlParts, magnificationOf, multiplier, multiplierKind, nearestFraction, numberPart, ordinal, ordinalKind, parseAs, parseNumber, parseSignedNumber, parseUnitExpr, partsOf, partsToHtml, percent, percentKind, plural, present, presentRange, presentVector, qty, rangeParts, ratio, ratioKind, registerDisplayKind, resolveAxes, resolveScoped, resolveUnit, resolveUnitExpr, retag, roman, romanKind, scaleBar, scientific, scientificKind, scopesOf, signed, snapToStep, spinKey, spokenSign, tag, textOf, toRoman, toRoot, unit, unitKind, unitOf, unitScale, vectorParts, zoom, zoomKind };
package/dist/index.js CHANGED
@@ -1162,6 +1162,11 @@ function resolveUnitExpr(expr, ctx = {}) {
1162
1162
  }
1163
1163
 
1164
1164
  // src/scope.ts
1165
+ function magnificationOf(scopes) {
1166
+ let m = 1;
1167
+ for (const scope of scopes) m *= scope.drawnAt ?? 1;
1168
+ return m;
1169
+ }
1165
1170
  function toRoot(base, scopes) {
1166
1171
  let n = base;
1167
1172
  for (let i = scopes.length - 1; i >= 0; i--) {
@@ -1195,6 +1200,28 @@ function scopesOf(id, root, tree) {
1195
1200
  return [root, ...inner.reverse()];
1196
1201
  }
1197
1202
 
1203
+ // src/scaleBar.ts
1204
+ var STEPS = [1, 2, 5];
1205
+ var DECADES = [-3, -2, -1, 0, 1, 2, 3, 4];
1206
+ var plain = (unit2, entry) => ({ unit: unit2, factor: entry.factor, offset: entry.offset });
1207
+ function scaleBar(opts) {
1208
+ const inner = opts.scopes[opts.scopes.length - 1];
1209
+ if (inner === void 0) throw new Error("scaleBar: scopes is empty; pass at least the root scope");
1210
+ const { system } = inner;
1211
+ const maxPx = opts.maxPx ?? 140;
1212
+ const magnification = magnificationOf(opts.scopes);
1213
+ const pxPerBase = opts.pxPerUnit * (toRoot(1, opts.scopes) - toRoot(0, opts.scopes)) * magnification;
1214
+ const units = Object.entries(system.units).map(([unit3, entry]) => plain(unit3, entryScale(entry))).filter((u) => u.offset === 0 && u.factor > 0).sort((a, b) => a.factor - b.factor);
1215
+ const lengths = opts.lengths?.map((v) => resolveUnit(v, system)) ?? units.flatMap(({ factor }, i) => DECADES.filter((d) => i === 0 || d >= 0).flatMap((d) => STEPS.map((s) => Number((s * 10 ** d * factor).toPrecision(12)))));
1216
+ const sorted = [...new Set(lengths)].sort((a, b) => a - b);
1217
+ let length = sorted[0];
1218
+ for (const l of sorted) if (l * pxPerBase <= maxPx) length = l;
1219
+ const fills = [...units].reverse().filter((u) => length / u.factor >= 1 - 1e-9);
1220
+ const whole = fills.find((u) => Math.abs(length / u.factor - Math.round(length / u.factor)) < 1e-9);
1221
+ const unit2 = (whole ?? fills[0])?.unit ?? system.base;
1222
+ return { length, px: length * pxPerBase, label: formatUnit(length, unit2, system, { precision: 3 }), magnification };
1223
+ }
1224
+
1198
1225
  // src/composite.ts
1199
1226
  var SEPARATOR = "separator";
1200
1227
  var MEASURE = /* @__PURE__ */ new Set(["unit", "percentSign"]);
@@ -1336,6 +1363,6 @@ function finiteSpin(key, from, bounds) {
1336
1363
  }
1337
1364
  }
1338
1365
 
1339
- export { ANGLE_RADIANS, COARSE_STEPS, CONSTANTS, IMPERIAL_INCHES, METRIC_MM, MINUS_SIGN, PIXELS, QuantityView, amount, axisUnits, bytes, bytesKind, canSpin, clampToBounds, compact, compactKind, currency, currencyKind, decimal, decimalKind, displayKindOf, displayOf, duration, durationKind, endless, endlessAllows, endlessAt, endlessTrack, entryScale, formatAxes, formatCompact, formatNumber, formatScoped, formatUnit, fraction, fractionKind, fromRoman, fromRoot, integer, integerKind, intlParts, multiplier, multiplierKind, nearestFraction, numberPart, ordinal, ordinalKind, parseAs, parseNumber, parseSignedNumber, parseUnitExpr, partsOf, partsToHtml, percent, percentKind, plural, present, presentRange, presentVector, qty, rangeParts, ratio, ratioKind, registerDisplayKind, resolveAxes, resolveScoped, resolveUnit, resolveUnitExpr, retag, roman, romanKind, scientific, scientificKind, scopesOf, signed, snapToStep, spinKey, spokenSign, tag, textOf, toRoman, toRoot, unit, unitKind, unitOf, unitScale, vectorParts, zoom, zoomKind };
1366
+ export { ANGLE_RADIANS, COARSE_STEPS, CONSTANTS, IMPERIAL_INCHES, METRIC_MM, MINUS_SIGN, PIXELS, QuantityView, amount, axisUnits, bytes, bytesKind, canSpin, clampToBounds, compact, compactKind, currency, currencyKind, decimal, decimalKind, displayKindOf, displayOf, duration, durationKind, endless, endlessAllows, endlessAt, endlessTrack, entryScale, formatAxes, formatCompact, formatNumber, formatScoped, formatUnit, fraction, fractionKind, fromRoman, fromRoot, integer, integerKind, intlParts, magnificationOf, multiplier, multiplierKind, nearestFraction, numberPart, ordinal, ordinalKind, parseAs, parseNumber, parseSignedNumber, parseUnitExpr, partsOf, partsToHtml, percent, percentKind, plural, present, presentRange, presentVector, qty, rangeParts, ratio, ratioKind, registerDisplayKind, resolveAxes, resolveScoped, resolveUnit, resolveUnitExpr, retag, roman, romanKind, scaleBar, scientific, scientificKind, scopesOf, signed, snapToStep, spinKey, spokenSign, tag, textOf, toRoman, toRoot, unit, unitKind, unitOf, unitScale, vectorParts, zoom, zoomKind };
1340
1367
  //# sourceMappingURL=index.js.map
1341
1368
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/quantity.ts","../src/units.ts","../src/number.ts","../src/kind.ts","../src/kinds/plain.ts","../src/kinds/proportion.ts","../src/kinds/measure.ts","../src/kinds/numeral.ts","../src/kinds/scientific.ts","../src/infinity.ts","../src/present.ts","../src/unitExpr.ts","../src/scope.ts","../src/composite.ts","../src/endless.ts","../src/spin.ts"],"names":["unit","decimal","integer","word","step","scaled","SUPERSCRIPT","SPELLINGS","endless"],"mappings":"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","file":"index.js","sourcesContent":["import type { Unit } from './units';\n\n/**\n * How a number shows, speaks and reads back, as plain data: `{ kind: 'fraction',\n * maxDenominator: 64 }`. Data rather than a function so a tagged value keeps its\n * presentation through JSON, history snapshots and `structuredClone`. The\n * behavior lives on the registered {@link DisplayKind} of the same `kind`.\n */\nexport interface Display {\n readonly kind: string;\n /** What ±Infinity reads as under this display — `'never'` on a timeout.\n * Default `∞`, spoken `infinity`. Honored by every kind. */\n readonly infinity?: InfinityText;\n readonly [option: string]: unknown;\n}\n\n/** A word for infinity. A string is both shown and spoken. `negative` is the\n * word for −Infinity, default `−∞`. */\nexport type InfinityText =\n | string\n | { readonly text: string; readonly spoken?: string; readonly negative?: string | { readonly text: string; readonly spoken?: string } };\n\n/** `display` with `text` as its word for infinity: `endless(unit('ms'), 'never')`. */\nexport function endless<D extends Display>(display: D, text: InfinityText): D {\n return { ...display, infinity: text };\n}\n\n/** A number that carries its unit, its display, or both. */\nexport interface Tagged {\n value: number;\n /** The unit `value` is measured in. Absent is the base unit. */\n unit?: Unit;\n display?: Display;\n}\n\n/**\n * A number anywhere the engine takes one: bare, which costs nothing, or\n * {@link Tagged}, which keeps its unit and display as it moves. Every reader\n * goes through {@link amount}, and every writer through {@link retag}, so a\n * value leaves in the shape it arrived in.\n */\nexport type Quantity = number | Tagged;\n\n/** The number a quantity holds. */\nexport function amount(q: Quantity): number {\n return typeof q === 'number' ? q : q.value;\n}\n\n/**\n * `next` in the shape of `q`: a bare number stays bare, and a tagged one keeps\n * its unit and display. What an editor calls when it changes a value it was\n * handed, so the presentation survives the edit.\n */\nexport function retag<Q extends Quantity>(q: Q, next: number): Q {\n return (typeof q === 'number' ? next : { ...(q as Tagged), value: next }) as Q;\n}\n\n/** A tagged quantity. `display` and `unit` are left off when absent, so the\n * JSON carries only what was set. */\nexport function tag(value: number, display?: Display, unit?: Unit): Tagged {\n const t: Tagged = { value };\n if (unit !== undefined) t.unit = unit;\n if (display !== undefined) t.display = display;\n return t;\n}\n\n/** The display `q` carries, else `fallback`. A value's own tag wins over the\n * default of whatever shows it. */\nexport function displayOf(q: Quantity, fallback?: Display): Display | undefined {\n return (typeof q === 'number' ? undefined : q.display) ?? fallback;\n}\n\n/** The unit `q` is measured in, when it says. */\nexport function unitOf(q: Quantity): Unit | undefined {\n return typeof q === 'number' ? undefined : q.unit;\n}\n","import type { Quantity } from './quantity';\n\n/**\n * Units — a tiny customizable unit system.\n *\n * The kit stores all coordinates as bare numbers in a single base unit\n * chosen by the consumer app. To make API call sites self-documenting,\n * the public surface accepts `UnitValue` — either a bare number (interpreted\n * as base units) or a `{ value, unit }` tag that's resolved against a\n * `UnitSystem` at the API boundary. Internals never see units.\n *\n * An entry is affine — `base = value * factor + offset` — so a scale that\n * puts zero somewhere else (degC against K) is expressible. Arithmetic\n * across units is `resolveUnitExpr`; a plane whose axes measure different\n * things resolves through `resolveAxes`.\n */\n\n/** A unit name (e.g. `'in'`, `'ft'`, `'mm'`). Looked up in a `UnitSystem`. */\nexport type Unit = string;\n\n/** What one unit is worth in base units: `base = value * factor + offset`. */\nexport interface UnitScale {\n factor: number;\n /** Where this unit puts zero, in base units. Absent is 0 — a pure scale. */\n offset?: number;\n}\n\n/** One unit's conversion. A bare number is the `{ factor }` shorthand. */\nexport type UnitEntry = number | UnitScale;\n\n/** Conversion table mapping unit names to their scale against a base unit. */\nexport interface UnitSystem {\n /** Name of the base unit, e.g. 'in'. All conversions resolve to this. */\n base: Unit;\n /** How to reach base units from each unit. The base unit's entry is 1. */\n units: Record<Unit, UnitEntry>;\n}\n\n/**\n * One unit's scale, with the bare-number shorthand widened and the offset\n * defaulted — what every conversion in the kit reads. Throws if the system\n * does not carry the unit.\n */\nexport function unitScale(unitSystem: UnitSystem, unit: Unit): Required<UnitScale> {\n const entry = unitSystem.units[unit];\n if (entry === undefined) {\n const known = Object.keys(unitSystem.units).join(', ') || '(none)';\n throw new Error(\n `unknown unit '${unit}' (system base: '${unitSystem.base}', known units: ${known})`,\n );\n }\n return entryScale(entry);\n}\n\n/** An entry's scale, with the bare-number shorthand widened and the offset defaulted. */\nexport function entryScale(entry: UnitEntry): Required<UnitScale> {\n return typeof entry === 'number'\n ? { factor: entry, offset: 0 }\n : { factor: entry.factor, offset: entry.offset ?? 0 };\n}\n\n/** Value at a unit-aware API boundary: bare number (in base units) or `{ value, unit }` tag. */\nexport type UnitValue = number | { value: number; unit: Unit };\n\n/**\n * Resolve a UnitValue to a number in base units.\n * - bare number, or a quantity tagged with no unit: its value, as base\n * - tagged: looks up factor; throws if unit not in unit system\n */\nexport function resolveUnit(v: UnitValue | Quantity, unitSystem?: UnitSystem): number {\n if (typeof v === 'number') return v;\n if (v.unit === undefined) return v.value;\n if (!unitSystem) {\n throw new Error(\n `resolveUnit: tagged value { value: ${v.value}, unit: '${v.unit}' } requires a UnitSystem`,\n );\n }\n const { factor, offset } = scaleOrThrow('resolveUnit', unitSystem, v.unit);\n return v.value * factor + offset;\n}\n\n/**\n * Format a base-unit number as a string in the named display unit.\n * e.g. formatUnit(36, 'ft', IMPERIAL_INCHES) => '3ft'\n * Default precision: 2. Trailing zeros trimmed.\n */\nexport function formatUnit(\n baseValue: number,\n displayUnit: Unit,\n unitSystem: UnitSystem,\n opts?: { precision?: number; suffix?: boolean },\n): string {\n const { factor, offset } = scaleOrThrow('formatUnit', unitSystem, displayUnit);\n const precision = opts?.precision ?? 2;\n const suffix = opts?.suffix ?? true;\n const display = (baseValue - offset) / factor;\n // Trim trailing zeros (and a dangling decimal point) without losing precision.\n let s = display.toFixed(precision);\n if (Number(s) === 0) s = s.replace(/^-/, '');\n if (s.includes('.')) {\n s = s.replace(/0+$/, '').replace(/\\.$/, '');\n }\n return suffix ? `${s}${displayUnit}` : s;\n}\n\n/** One of something for each axis of a plane. */\nexport interface PerAxis<T> {\n x: T;\n y: T;\n}\n\n/** A plane's units: one system for both axes, or one each — a chart whose x\n * is time and whose y is a value. */\nexport type PlaneUnits = UnitSystem | PerAxis<UnitSystem>;\n\n/** A measure on a plane: one value for both axes, or one each. */\nexport type PlaneValue = UnitValue | Quantity | PerAxis<UnitValue | Quantity>;\n\n/** The unit system `units` gives one axis. */\nexport function axisUnits(units: PlaneUnits | undefined, axis: 'x' | 'y'): UnitSystem | undefined {\n return units === undefined || 'base' in units ? units : units[axis];\n}\n\n/** `v` in base units on each axis, every axis resolved against its own system. */\nexport function resolveAxes(v: PlaneValue, units?: PlaneUnits): PerAxis<number> {\n const perAxis = typeof v === 'object' && 'x' in v;\n const on = (axis: 'x' | 'y'): number => {\n try {\n return resolveUnit(perAxis ? v[axis] : v, axisUnits(units, axis));\n } catch (e) {\n throw new Error(`${axis} axis: ${e instanceof Error ? e.message : String(e)}`);\n }\n };\n return { x: on('x'), y: on('y') };\n}\n\n/** A base-unit point as text, each axis in its own display unit. */\nexport function formatAxes(\n base: PerAxis<number>,\n display: Unit | PerAxis<Unit>,\n units: PlaneUnits,\n opts?: { precision?: number; suffix?: boolean },\n): PerAxis<string> {\n const on = (axis: 'x' | 'y'): string =>\n formatUnit(base[axis], typeof display === 'string' ? display : display[axis], axisUnits(units, axis)!, opts);\n return { x: on('x'), y: on('y') };\n}\n\n/** `unitScale`, with the caller's name in front of the message. */\nfunction scaleOrThrow(caller: string, unitSystem: UnitSystem, unit: Unit): Required<UnitScale> {\n try {\n return unitScale(unitSystem, unit);\n } catch (e) {\n throw new Error(`${caller}: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n/** Imperial unit system with base 'in'. */\nexport const IMPERIAL_INCHES: UnitSystem = {\n base: 'in',\n units: { in: 1, ft: 12, yd: 36, mi: 63360 },\n};\n\n/** Metric unit system with base 'mm'. */\nexport const METRIC_MM: UnitSystem = {\n base: 'mm',\n units: { mm: 1, cm: 10, m: 1000, km: 1_000_000 },\n};\n\n/** Angle unit system with base 'rad'. */\nexport const ANGLE_RADIANS: UnitSystem = {\n base: 'rad',\n units: { rad: 1, deg: Math.PI / 180, turn: Math.PI * 2 },\n};\n\n/** Pixel unit system — sole unit is the base. */\nexport const PIXELS: UnitSystem = {\n base: 'px',\n units: { px: 1 },\n};\n","import { entryScale, type UnitEntry } from './units';\n\n/**\n * The real MINUS SIGN (U+2212), which display formatting uses instead of the\n * ASCII HYPHEN-MINUS (U+002D) that `toLocaleString` and template literals\n * produce. It is the same visual width as `+`, so columns of signed numbers\n * align.\n */\nexport const MINUS_SIGN = '−';\n\n/**\n * Formats a number for display, substituting {@link MINUS_SIGN} for the ASCII\n * hyphen `toLocaleString` emits. Non-finite values stringify as-is.\n */\nexport function formatNumber(value: number, options?: Intl.NumberFormatOptions): string {\n const formatted = Number.isFinite(value)\n ? unsignedZero(value, (n) => n.toLocaleString(undefined, options))\n : String(value);\n return formatted.replace(/^-/, MINUS_SIGN);\n}\n\n/**\n * `value` through `format`, with a negative that rounds to zero shown as the\n * zero it reads as: −0.0004 at two places is `0`, not `−0`.\n */\nexport function unsignedZero(value: number, format: (n: number) => string): string {\n const shown = format(value);\n return value <= 0 && shown === format(-0) ? format(0) : shown;\n}\n\n/**\n * Parses a string that may carry {@link MINUS_SIGN} in place of the ASCII\n * hyphen. The inverse of {@link formatNumber} for any editing surface that\n * renders its value through it and reads the edited text back.\n */\nexport function parseSignedNumber(text: string): number {\n return Number(text.replace(MINUS_SIGN, '-'));\n}\n\n/** One unsigned number in the text `readNumber` sees: digits, with an optional `.` fraction. */\nconst TERM_NUMBER = String.raw`\\d+(?:\\.\\d+)?|\\.\\d+`;\n\nconst DECIMAL_NUMBER = /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?$/i;\n\n/** Powers of ten a typed magnitude suffix stands for. */\nconst EXPONENTS: Record<string, number> = { k: 3, m: 6, b: 9, t: 12 };\n\n/**\n * Formats a number the way a `compact` readout shows it: below 1,000 at\n * `decimals` places, from 1,000 up at three significant figures with a magnitude\n * suffix (`40.0K`, `294K`, `2.00M`), so the readout holds one width whatever the\n * value. Always `en-US`, so {@link parseNumber} reads it back.\n */\nexport function formatCompact(value: number, decimals = 0): string {\n if (!Number.isFinite(value)) return formatNumber(value);\n // Asked of the value as it will be shown: 999.6 reads `1000`, which is a thousand.\n const options: Intl.NumberFormatOptions =\n Number(Math.abs(value).toFixed(decimals)) < 1000\n ? { useGrouping: false, minimumFractionDigits: decimals, maximumFractionDigits: decimals }\n : { notation: 'compact', minimumSignificantDigits: 3, maximumSignificantDigits: 3 };\n return unsignedZero(value, (n) => n.toLocaleString('en-US', options)).replace(/^-/, MINUS_SIGN);\n}\n\n/**\n * Reads a typed number: anything {@link parseSignedNumber} reads, plus the\n * locale's group and decimal separators (`40,000` and `2.5` in `en-US`,\n * `40.000` and `2,5` in `de-DE`) and a `k`/`m`/`b`/`t` suffix in either case\n * (`2.5m` is 2,500,000). Empty text is NaN rather than zero.\n *\n * Text the locale's form does not read is tried as `en-US`, so `1.5` is still\n * one and a half in `de-DE`; where both read, the locale wins. A locale that\n * groups with a space accepts any space there, since a keyboard types a plain\n * one where `Intl` writes a no-break space.\n *\n * Given `units` — a suffix mapped to the factor it scales by — a trailing unit\n * name is read first: the longest match wins, exact case before any case, and\n * a unit beats a magnitude suffix, so with `m` accepted `2m` is `2 * units.m`.\n */\nexport function parseNumber(text: string, units?: Readonly<UnitTable>, locale = 'en-US'): number {\n const n = readNumber(delocalized(text, locale), units);\n return Number.isNaN(n) && locale !== 'en-US' ? readNumber(delocalized(text, 'en-US'), units) : n;\n}\n\n/** `parseNumber` once every number in the text is in `en-US` form with no grouping. */\nfunction readNumber(text: string, units?: Readonly<UnitTable>): number {\n if (units) {\n units = withSpellings(units);\n const trimmed = text.trim();\n const name = unitSuffixOf(trimmed, units);\n if (name !== undefined) {\n const terms = compoundTermsOf(trimmed, units);\n if (terms !== undefined && terms.length > 1) return compoundValue(terms, trimmed, units);\n const { factor, offset } = entryScale(units[name]!);\n return scaled(readNumber(trimmed.slice(0, -name.length)), factor) + offset;\n }\n }\n let t = text.trim().replace(MINUS_SIGN, '-');\n const exponent = EXPONENTS[t.slice(-1).toLowerCase()];\n if (exponent !== undefined) t = t.slice(0, -1).trimEnd();\n // `Number` alone also reads `0x10`, `0b11`, and `1e400`, none of which is a typed amount.\n if (!DECIMAL_NUMBER.test(t)) return Number.NaN;\n // Scaled through the exponent rather than by multiplying: 1.1 * 1000 is 1100.0000000000002.\n const n = Number(exponent === undefined ? t : `${t}e${exponent}`);\n return Number.isFinite(n) ? n : Number.NaN;\n}\n\ninterface NumberShape {\n /** A run of digits and separators in a text, a candidate number. */\n run: RegExp;\n /** Whether a run is a whole number in the locale's form. */\n whole: RegExp;\n group: RegExp;\n decimal: string;\n /** The locale's own digits, where they are not `0`–`9`, each mapped to its Latin one. */\n digits?: { pattern: RegExp; latin: ReadonlyMap<string, string> };\n}\n\nconst shapes = new Map<string, NumberShape>();\n\n/** How `locale` writes a number, read off `Intl`: its separators and group sizes (`12,34,567` in `en-IN`). */\nfunction shapeOf(locale: string): NumberShape {\n const known = shapes.get(locale);\n if (known) return known;\n const parts = new Intl.NumberFormat(locale).formatToParts(123_456_789.5);\n const sizes = parts.filter((p) => p.type === 'integer').map((p) => p.value.length);\n const primary = sizes.at(-1)!;\n const secondary = sizes.length > 2 ? sizes.at(-2)! : primary;\n const groupChar = parts.find((p) => p.type === 'group')?.value ?? ',';\n const decimal = parts.find((p) => p.type === 'decimal')?.value ?? '.';\n // CLDR versions disagree between a straight and a curly apostrophe, as keyboards do.\n const g = /\\s/.test(groupChar) ? String.raw`\\s` : /['’]/.test(groupChar) ? `'’` : escapeClass(groupChar);\n const own = [...new Intl.NumberFormat(locale, { useGrouping: false }).format(9_876_543_210)].reverse();\n const digits = own.join('') === '0123456789'\n ? undefined\n : { pattern: new RegExp(`[${own.join('')}]`, 'gu'), latin: new Map(own.map((c, i) => [c, String(i)])) };\n const d = escapeClass(decimal);\n const integer = String.raw`\\d{1,${secondary}}(?:[${g}]\\d{${secondary}})*[${g}]\\d{${primary}}|\\d*`;\n const shape: NumberShape = {\n run: new RegExp(String.raw`(?:\\d|[${d}]\\d)(?:[\\d${g}${d}]*\\d)?[${d}]?`, 'g'),\n whole: new RegExp(String.raw`^(?:${integer})(?:[${d}]\\d*)?$`),\n group: new RegExp(`[${g}]`, 'g'),\n decimal,\n digits,\n };\n shapes.set(locale, shape);\n return shape;\n}\n\nexport const escapeClass = (c: string) => c.replace(/[\\\\\\]^-]/g, '\\\\$&');\n\n/** `text` with each number in `locale`'s form rewritten ungrouped with a `.` decimal, and the rest untouched. */\nfunction delocalized(text: string, locale: string): string {\n const shape = shapeOf(locale);\n return latinDigits(text, locale).replace(shape.run, (run) =>\n shape.whole.test(run) ? run.replace(shape.group, '').replace(shape.decimal, '.') : run,\n );\n}\n\n/**\n * `text` with `locale`'s own digits written `0`–`9` and the bidi marks `Intl`\n * puts around a sign (`؜-` in `ar-EG`) dropped.\n */\nexport function latinDigits(text: string, locale: string): string {\n const { digits } = shapeOf(locale);\n const t = text.replace(BIDI_MARKS, '');\n return digits ? t.replace(digits.pattern, (c) => digits.latin.get(c)!) : t;\n}\n\nconst BIDI_MARKS = /[\\u061c\\u200e\\u200f]/g;\n\n/**\n * The number inside text that wraps one in symbols, such as a currency sign\n * or code on either side: its sign, its digits in `locale`'s form or\n * `en-US`'s, and a magnitude suffix typed against them, ready for\n * {@link parseNumber}. Empty when the text holds no number.\n */\nexport function numberWithin(text: string, locale: string): string {\n const t = latinDigits(text, locale);\n const m = new RegExp(shapeOf(locale).run.source).exec(t);\n if (!m) return '';\n const around = t.slice(0, m.index) + t.slice(m.index + m[0].length);\n const suffix = /^[kmbt](?!\\p{L})/iu.exec(t.slice(m.index + m[0].length))?.[0] ?? '';\n return `${/[-\\u2212]/.test(around) ? '-' : ''}${m[0]}${suffix}`;\n}\n\n/** The mark `locale` writes before a fraction: `.` in `en-US`, `,` in `de-DE`. */\nexport const decimalOf = (locale: string): string => shapeOf(locale).decimal;\n\n/** Suffixes a person may type, each mapped to its conversion into the shown unit. */\nexport type UnitTable = Record<string, UnitEntry>;\n\n/**\n * Units that are written more than one way. A table accepting any spelling\n * accepts them all: `\"` wherever `in` is, `ft` wherever `'` is. The primes and\n * curly quotes are there because a keyboard substitutes them for the marks.\n */\nconst SPELLINGS: readonly (readonly string[])[] = [\n ['in', '\"', '″', '”'],\n ['ft', \"'\", '′', '’'],\n];\n\nexport function withSpellings(units: Readonly<UnitTable>): Readonly<UnitTable> {\n let out: UnitTable | undefined;\n for (const group of SPELLINGS) {\n const known = group.find((n) => units[n] !== undefined);\n if (known === undefined) continue;\n for (const n of group) {\n if (units[n] !== undefined) continue;\n out ??= { ...units };\n out[n] = units[known]!;\n }\n }\n return out ?? units;\n}\n\n/** Divided by the reciprocal below 1: 12 * 0.1 is 1.2000000000000002, 12 / 10 is 1.2. */\nfunction scaled(n: number, factor: number): number {\n return factor < 1 ? n / (1 / factor) : n * factor;\n}\n\n/**\n * The unit names in `text`, in reading order, when every one of them closes a\n * `<number><unit>` term — which is what tells `5ft 3in` from a malformed\n * `5ft 3`. Undefined when the text is not a run of whole terms.\n */\nfunction compoundTermsOf(text: string, units: Readonly<UnitTable>): string[] | undefined {\n const names: string[] = [];\n let rest = text.trimEnd();\n while (rest !== '') {\n const name = unitSuffixOf(rest, units);\n if (name === undefined) return undefined;\n names.push(name);\n const before = rest.slice(0, -name.length);\n const m = new RegExp(`(?:${TERM_NUMBER})\\\\s*$`).exec(before);\n if (!m) return undefined;\n rest = before.slice(0, m.index).trimEnd();\n // A sign leads the whole value, so it ends the walk rather than a term.\n if (rest === '-' || rest === '+' || rest === MINUS_SIGN) rest = '';\n }\n return names.length === 0 ? undefined : names.reverse();\n}\n\n/**\n * `5ft 3in` as one number in the shown unit. Every term scales and they sum;\n * a leading sign carries across all of them, so `-5ft 3in` is −63in and not\n * −57. Offsets have no meaning in a sum — 1K + 2degC is not a temperature —\n * so a term carrying one makes the whole value unreadable.\n */\nfunction compoundValue(names: string[], text: string, units: Readonly<UnitTable>): number {\n const digits = text.match(new RegExp(TERM_NUMBER, 'g'));\n if (!digits || digits.length !== names.length) return Number.NaN;\n const sign = /^\\s*[-\\u2212]/.test(text) ? -1 : 1;\n let total = 0;\n for (const [i, name] of names.entries()) {\n const { factor, offset } = entryScale(units[name]!);\n if (offset !== 0) return Number.NaN;\n total += scaled(Number(digits[i]), factor);\n }\n return sign * total;\n}\n\n/** The longest unit name `text` ends with — exact case first, then any case. */\nfunction unitSuffixOf(text: string, units: Readonly<UnitTable>): string | undefined {\n const names = Object.keys(units).filter((n) => n !== '').sort((a, b) => b.length - a.length);\n const lower = text.toLowerCase();\n return names.find((n) => text.endsWith(n)) ?? names.find((n) => lower.endsWith(n.toLowerCase()));\n}\n","import type { Display } from './quantity';\nimport type { Unit } from './units';\nimport { MINUS_SIGN, unsignedZero } from './number';\n\n/**\n * One run of a formatted value, named for what it is: `number`, `unit`,\n * `currency`, `numerator`, `literal`. The HTML serialization marks each\n * non-literal run with `data-part`, which is the whole styling surface.\n */\nexport interface Part {\n type: string;\n value: string;\n}\n\n/** What formatting and parsing need beyond the value and its display. */\nexport interface FormatContext {\n /** BCP 47 locale. Default `en-US`. */\n locale: string;\n /** The unit the value is measured in, from its tag. */\n unit?: Unit;\n}\n\n/**\n * The behavior behind one `Display.kind`. `format` is required; `speak`\n * defaults to the formatted text, `parse` to `parseNumber`, and `mathml` to\n * nothing, which means the kind has no MathML form.\n */\nexport interface DisplayKind<D extends Display = Display> {\n kind: D['kind'];\n format(value: number, display: D, ctx: FormatContext): Part[];\n speak?(value: number, display: D, ctx: FormatContext): string;\n parse?(text: string, display: D, ctx: FormatContext): number;\n mathml?(value: number, display: D, ctx: FormatContext): string | undefined;\n}\n\nconst ESCAPES: Record<string, string> = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' };\n\n/** `s` safe to interpolate into the HTML and MathML the kinds write. */\nexport function escapeMarkup(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ESCAPES[c]!);\n}\n\n/** Parts joined into plain text. */\nexport function textOf(parts: readonly Part[]): string {\n return parts.map((p) => p.value).join('');\n}\n\n/** A number run from `Intl`, with the real minus sign. */\nexport function numberPart(value: number, locale: string, options?: Intl.NumberFormatOptions): Part {\n return { type: 'number', value: signed(unsignedZero(value, (n) => n.toLocaleString(locale, options))) };\n}\n\n/** `-` swapped for {@link MINUS_SIGN} at the front of already-formatted text. */\nexport function signed(text: string): string {\n return text.replace(/^-/, MINUS_SIGN);\n}\n\n/** A leading minus sign read aloud: `−3` is spoken `minus 3`, which a screen\n * reader otherwise renders as a dash or drops. */\nexport function spokenSign(text: string): string {\n return text.replace(/^[-−]/, 'minus ');\n}\n\n/** `singular` or `plural` for `value`, by the locale's plural rules. */\nexport function plural(value: number, locale: string, singular: string, pluralForm: string): string {\n return new Intl.PluralRules(locale).select(value) === 'one' ? singular : pluralForm;\n}\n\n/**\n * `Intl.NumberFormat`'s parts, with the digit runs — sign, integer, group,\n * decimal, fraction — merged into one `number` part, so a styling layer sees\n * the number as one thing and its unit or symbol as another.\n */\nexport function intlParts(value: number, locale: string, options: Intl.NumberFormatOptions): Part[] {\n const out: Part[] = [];\n const nf = new Intl.NumberFormat(locale, options);\n const shown = value <= 0 && nf.format(value) === nf.format(-0) ? 0 : value;\n for (const p of nf.formatToParts(shown)) {\n const type = DIGIT_RUNS.has(p.type) ? 'number' : p.type;\n const v = p.type === 'minusSign' ? MINUS_SIGN : p.value;\n const last = out[out.length - 1];\n if (type === 'number' && last?.type === 'number') last.value += v;\n else out.push({ type, value: v });\n }\n return out;\n}\n\nconst DIGIT_RUNS = new Set(['minusSign', 'plusSign', 'integer', 'group', 'decimal', 'fraction']);\n","import { intlParts, spokenSign, textOf, type DisplayKind } from '../kind';\nimport { formatCompact, parseNumber } from '../number';\n\n/** A plain number. `places` fixes the decimals, trailing zeros included;\n * otherwise up to `maxPlaces` (default 3) show and trailing zeros drop. */\nexport type DecimalDisplay = {\n kind: 'decimal';\n places?: number;\n maxPlaces?: number;\n /** Thousands separators. Default true. */\n grouping?: boolean;\n};\n\n/** A {@link DecimalDisplay}. */\nexport function decimal(options: Omit<DecimalDisplay, 'kind'> = {}): DecimalDisplay {\n return { kind: 'decimal', ...options };\n}\n\n/** The built-in `decimal` kind, to spread into a `registerDisplayKind` replacement. */\nexport const decimalKind: DisplayKind<DecimalDisplay> = {\n kind: 'decimal',\n format: (value, d, ctx) => intlParts(value, ctx.locale, decimalOptions(d)),\n speak: (value, d, ctx) => spokenSign(textOf(intlParts(value, ctx.locale, decimalOptions(d)))),\n parse: (text, _d, ctx) => parseNumber(text, undefined, ctx.locale),\n};\n\nfunction decimalOptions(d: DecimalDisplay): Intl.NumberFormatOptions {\n const grouping = d.grouping ?? true;\n return d.places === undefined\n ? { maximumFractionDigits: d.maxPlaces ?? 3, useGrouping: grouping }\n : { minimumFractionDigits: d.places, maximumFractionDigits: d.places, useGrouping: grouping };\n}\n\n/** A whole number, rounded. */\nexport type IntegerDisplay = {\n kind: 'integer';\n grouping?: boolean;\n};\n\n/** An {@link IntegerDisplay}. */\nexport function integer(options: Omit<IntegerDisplay, 'kind'> = {}): IntegerDisplay {\n return { kind: 'integer', ...options };\n}\n\n/** The built-in `integer` kind, to spread into a `registerDisplayKind` replacement. */\nexport const integerKind: DisplayKind<IntegerDisplay> = {\n kind: 'integer',\n format: (value, d, ctx) =>\n intlParts(value, ctx.locale, { maximumFractionDigits: 0, useGrouping: d.grouping ?? true }),\n speak: (value, d, ctx) =>\n spokenSign(textOf(integerKind.format(value, d, ctx))),\n parse: (text, _d, ctx) => Math.round(parseNumber(text, undefined, ctx.locale)),\n};\n\n/**\n * Below 1,000 at `places` decimals, from 1,000 up at three significant figures\n * with a magnitude suffix (`40.0K`, `2.00M`), so a readout holds one width.\n * Spoken long: `2 million`.\n */\nexport type CompactDisplay = {\n kind: 'compact';\n places?: number;\n};\n\n/** A {@link CompactDisplay}. */\nexport function compact(options: Omit<CompactDisplay, 'kind'> = {}): CompactDisplay {\n return { kind: 'compact', ...options };\n}\n\n/** The built-in `compact` kind, to spread into a `registerDisplayKind` replacement. */\nexport const compactKind: DisplayKind<CompactDisplay> = {\n kind: 'compact',\n format: (value, d) => {\n const text = formatCompact(value, d.places ?? 0);\n const m = /^(.*?\\d)([A-Za-z]+)$/.exec(text);\n return m\n ? [\n { type: 'number', value: m[1]! },\n { type: 'compact', value: m[2]! },\n ]\n : [{ type: 'number', value: text }];\n },\n speak: (value, d, ctx) =>\n spokenSign(\n textOf(\n Math.abs(value) < 1000\n ? compactKind.format(value, d, ctx)\n : intlParts(value, ctx.locale, {\n notation: 'compact',\n compactDisplay: 'long',\n maximumSignificantDigits: 3,\n }),\n ),\n ),\n parse: (text) => parseNumber(text),\n};\n","import { escapeMarkup, intlParts, numberPart, spokenSign, textOf, type DisplayKind, type Part } from '../kind';\nimport { latinDigits, MINUS_SIGN, parseNumber, unsignedZero } from '../number';\n\n/** A share of one as a percentage: 0.25 shows `25%`. Typed text reads as\n * percent with or without the sign. */\nexport type PercentDisplay = {\n kind: 'percent';\n /** Most decimals shown. Default 0. */\n places?: number;\n};\n\n/** A {@link PercentDisplay}. */\nexport function percent(options: Omit<PercentDisplay, 'kind'> = {}): PercentDisplay {\n return { kind: 'percent', ...options };\n}\n\n/** The built-in `percent` kind, to spread into a `registerDisplayKind` replacement. */\nexport const percentKind: DisplayKind<PercentDisplay> = {\n kind: 'percent',\n format: (value, d, ctx) =>\n intlParts(value, ctx.locale, { style: 'percent', maximumFractionDigits: d.places ?? 0 }),\n speak: (value, d, ctx) =>\n spokenSign(\n textOf(\n intlParts(value * 100, ctx.locale, {\n style: 'unit',\n unit: 'percent',\n unitDisplay: 'long',\n maximumFractionDigits: d.places ?? 0,\n }),\n ),\n ),\n parse: (text, _d, ctx) => parseNumber(withoutPercentSign(text, ctx.locale), undefined, ctx.locale) / 100,\n};\n\n/**\n * Percent text without its sign, which a locale writes after the number\n * (`25%`), before it (`%25` in `tr-TR`, inside the minus), as `٪`, or wrapped\n * in bidi marks.\n */\nfunction withoutPercentSign(text: string, locale: string): string {\n const m = /^\\s*([-+\\u2212]?)\\s*[%٪]?\\s*(.*?)\\s*[%٪]?\\s*$/su.exec(latinDigits(text, locale));\n return m ? m[1] + m[2] : text;\n}\n\n/**\n * The nearest fraction whose denominator is at most `maxDenominator`, as\n * `[numerator, denominator]` in lowest terms with the sign on the numerator.\n * Walks the continued fraction and settles the last step on the best\n * semiconvergent, which is the closest any denominator in range can get.\n */\nexport function nearestFraction(x: number, maxDenominator: number): [number, number] {\n if (!Number.isFinite(x)) return [x, 1];\n const sign = x < 0 ? -1 : 1;\n const target = Math.abs(x);\n let [h0, h1, k0, k1] = [0, 1, 1, 0];\n let y = target;\n for (let i = 0; i < 64; i++) {\n const a = Math.floor(y);\n const k2 = a * k1 + k0;\n if (k2 > maxDenominator) {\n const t = Math.floor((maxDenominator - k0) / k1);\n const [hs, ks] = [t * h1 + h0, t * k1 + k0];\n if (Math.abs(hs / ks - target) < Math.abs(h1 / k1 - target)) [h1, k1] = [hs, ks];\n break;\n }\n [h0, h1, k0, k1] = [h1, a * h1 + h0, k1, k2];\n const rest = y - a;\n if (rest < 1e-12 || Math.abs(h1 / k1 - target) < 1e-15) break;\n y = 1 / rest;\n }\n return [sign * h1, k1];\n}\n\n/**\n * `nearestFraction` with the denominator budget divided by the value's size, so a fraction never carries more\n * precision than a reader can take in: 749.8 is `750`, not `15746/21`, while values under 1 keep all of it.\n */\nexport function readableFraction(x: number, maxDenominator: number): [number, number] {\n return nearestFraction(x, Math.max(1, Math.floor(maxDenominator / Math.max(1, Math.abs(x)))));\n}\n\n/**\n * A constant a fraction can count in: `π`, so 3π/4 shows as `3π/4` rather\n * than `2.356`. `names` are what may be typed for it besides the symbol.\n */\nexport interface NamedConstant {\n symbol: string;\n value: number;\n /** How it is read aloud: `pi`. */\n spoken: string;\n names?: readonly string[];\n}\n\n/** The constants `fraction({ of })` knows by symbol. */\nexport const CONSTANTS = {\n π: { symbol: 'π', value: Math.PI, spoken: 'pi', names: ['pi'] },\n τ: { symbol: 'τ', value: 2 * Math.PI, spoken: 'tau', names: ['tau'] },\n e: { symbol: 'e', value: Math.E, spoken: 'e' },\n} as const satisfies Record<string, NamedConstant>;\n\n/** How a `fraction` display picks and writes its fraction. */\nexport type FractionOptions = {\n /** Largest denominator for a value under 1, default 64; a larger value gets proportionally fewer. */\n maxDenominator?: number;\n /**\n * `inline` (default) writes `1/12`. `diagonal` writes `¹⁄₁₂` — superscript\n * digits, the fraction slash, subscript digits — so the text itself is\n * diagonal wherever it is drawn, CSS or not. `stacked` writes the text and\n * HTML `inline` does and asks to be drawn as its MathML form, numerator over\n * denominator, wherever a renderer draws MathML (`QuantityText` does).\n */\n form?: 'inline' | 'diagonal' | 'stacked';\n} & (\n | { mixed?: boolean; of?: never }\n | {\n /**\n * Count in a constant: with `π`, 3π/4 shows `3π/4` and is spoken `3 pi\n * over 4`. Excludes `mixed`, since `1 1/2π` reads as 1 + ½π.\n */\n of: keyof typeof CONSTANTS | NamedConstant;\n mixed?: never;\n }\n);\n\n/**\n * A value as the nearest fraction: 1/12 shows `1/12` and is spoken `1 over 12`.\n * `mixed` splits a whole part off (`1 1/2`); a whole value shows as an integer.\n * Has a MathML form, as `<mfrac>`.\n */\nexport type FractionDisplay = { kind: 'fraction' } & FractionOptions;\n\nconst SUPERSCRIPT = '⁰¹²³⁴⁵⁶⁷⁸⁹';\nconst SUBSCRIPT = '₀₁₂₃₄₅₆₇₈₉';\n\nconst inDigits = (n: number, digits: string) => String(n).replace(/\\d/g, (c) => digits[Number(c)]!);\nconst fromDigits = (text: string, digits: string) =>\n Number([...text].map((c) => digits.indexOf(c)).join(''));\n\n/** A {@link FractionDisplay}. */\nexport function fraction(options: FractionOptions = {}): FractionDisplay {\n return { kind: 'fraction', ...options };\n}\n\nfunction constantOf(d: FractionDisplay): NamedConstant | undefined {\n return typeof d.of === 'string' ? CONSTANTS[d.of] : d.of;\n}\n\n/** A fraction's pieces: sign, whole part (mixed only), numerator, denominator,\n * and the constant they count in. */\nfunction fractionPieces(value: number, d: FractionDisplay) {\n const constant = constantOf(d);\n const [n, den] = readableFraction(constant ? value / constant.value : value, d.maxDenominator ?? 64);\n const negative = n < 0;\n const abs = Math.abs(n);\n const whole = d.mixed || den === 1 ? Math.floor(abs / den) : 0;\n return { negative, whole, num: abs - whole * den, den, constant };\n}\n\n/** A fraction typed inline (`1 1/2`) or diagonally (`1¹⁄₂`), else a plain number. */\nfunction parseFraction(text: string): number {\n const inline = /^\\s*([-−+]?)\\s*(?:(\\d+)\\s+)?(\\d+)\\s*[/⁄]\\s*(\\d+)\\s*$/.exec(text);\n const diagonal = /^\\s*([-−+]?)\\s*(\\d+)?\\s*([⁰¹²³⁴⁵⁶⁷⁸⁹]+)\\s*[/⁄]\\s*([₀₁₂₃₄₅₆₇₈₉]+)\\s*$/.exec(text);\n let magnitude: number;\n if (inline) magnitude = Number(inline[2] ?? 0) + Number(inline[3]) / Number(inline[4]);\n else if (diagonal) {\n magnitude = Number(diagonal[2] ?? 0) + fromDigits(diagonal[3]!, SUPERSCRIPT) / fromDigits(diagonal[4]!, SUBSCRIPT);\n } else return parseNumber(text);\n const sign = (inline ?? diagonal)![1];\n return sign === '-' || sign === MINUS_SIGN ? -magnitude : magnitude;\n}\n\nconst escape = (t: string) => t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/** The built-in `fraction` kind, to spread into a `registerDisplayKind` replacement. */\nexport const fractionKind: DisplayKind<FractionDisplay> = {\n kind: 'fraction',\n format: (value, d) => {\n if (!Number.isFinite(value)) return [{ type: 'number', value: String(value) }];\n const { negative, whole, num, den, constant } = fractionPieces(value, d);\n const diagonal = d.form === 'diagonal';\n const symbol: Part[] = constant ? [{ type: 'constant', value: constant.symbol }] : [];\n const parts: Part[] = [];\n if (negative) parts.push({ type: 'sign', value: MINUS_SIGN });\n if (num === 0) {\n if (whole === 0) return [...parts, { type: 'whole', value: '0' }];\n if (!(constant && whole === 1)) parts.push({ type: 'whole', value: String(whole) });\n return [...parts, ...symbol];\n }\n if (whole > 0) {\n parts.push({ type: 'whole', value: String(whole) });\n if (!diagonal) parts.push({ type: 'literal', value: ' ' });\n }\n if (diagonal) {\n parts.push(\n { type: 'numerator', value: inDigits(num, SUPERSCRIPT) },\n { type: 'literal', value: '⁄' },\n { type: 'denominator', value: inDigits(den, SUBSCRIPT) },\n ...symbol,\n );\n } else {\n if (!(constant && num === 1)) parts.push({ type: 'numerator', value: String(num) });\n parts.push(...symbol, { type: 'literal', value: '/' }, { type: 'denominator', value: String(den) });\n }\n return parts;\n },\n speak: (value, d) => {\n if (!Number.isFinite(value)) return String(value);\n const { negative, whole, num, den, constant } = fractionPieces(value, d);\n const counted = (n: number) => (!constant ? String(n) : n === 1 ? constant.spoken : `${n} ${constant.spoken}`);\n const words = [\n whole > 0 ? counted(whole) : num === 0 ? '0' : '',\n whole > 0 && num > 0 ? 'and' : '',\n num > 0 ? `${counted(num)} over ${den}` : '',\n ].filter(Boolean);\n return `${negative ? 'minus ' : ''}${words.join(' ')}`;\n },\n parse: (text, d) => {\n const constant = constantOf(d);\n if (!constant) return parseFraction(text);\n const spellings = [constant.symbol, ...(constant.names ?? [])].sort((a, b) => b.length - a.length);\n const token = new RegExp(spellings.map(escape).join('|'), 'i');\n if (!token.test(text)) return parseFraction(text);\n // With the constant taken out, a bare `/2` or nothing at all counts one of it.\n const coefficient = text.replace(token, '').replace(/^(\\s*[-−+]?\\s*)(?=[/⁄]|\\s*$)/, '$11');\n return parseFraction(coefficient) * constant.value;\n },\n mathml: (value, d) => {\n if (!Number.isFinite(value)) return undefined;\n const { negative, whole, num, den, constant } = fractionPieces(value, d);\n const counted = (n: number) => {\n if (!constant) return `<mn>${n}</mn>`;\n const mi = `<mi>${escapeMarkup(constant.symbol)}</mi>`;\n return n === 1 ? mi : `<mn>${n}</mn>${mi}`;\n };\n const body = [\n negative ? `<mo>${MINUS_SIGN}</mo>` : '',\n whole > 0 ? counted(whole) : num === 0 ? '<mn>0</mn>' : '',\n num > 0 ? `<mfrac>${num === 1 || !constant ? counted(num) : `<mrow>${counted(num)}</mrow>`}<mn>${den}</mn></mfrac>` : '',\n ].join('');\n return `<math>${body}</math>`;\n },\n};\n\n/** A value as a ratio `a:b` — 1/12 shows `1:12`, spoken `1 to 12`. */\nexport type RatioDisplay = {\n kind: 'ratio';\n /** Largest second term for a value under 1, default 64; a larger value gets proportionally fewer. */\n maxDenominator?: number;\n};\n\n/** A {@link RatioDisplay}. */\nexport function ratio(options: Omit<RatioDisplay, 'kind'> = {}): RatioDisplay {\n return { kind: 'ratio', ...options };\n}\n\n/** The built-in `ratio` kind, to spread into a `registerDisplayKind` replacement. */\nexport const ratioKind: DisplayKind<RatioDisplay> = {\n kind: 'ratio',\n format: (value, d) => {\n if (!Number.isFinite(value)) return [{ type: 'number', value: String(value) }];\n const [n, den] = readableFraction(value, d.maxDenominator ?? 64);\n return [\n { type: 'antecedent', value: String(n).replace(/^-/, MINUS_SIGN) },\n { type: 'literal', value: ':' },\n { type: 'consequent', value: String(den) },\n ];\n },\n speak: (value, d) => {\n if (!Number.isFinite(value)) return String(value);\n const [n, den] = readableFraction(value, d.maxDenominator ?? 64);\n return spokenSign(`${String(n).replace(/^-/, MINUS_SIGN)} to ${den}`);\n },\n parse: (text) => {\n const m = /^\\s*(.+?)\\s*:\\s*(.+?)\\s*$/.exec(text);\n return m ? parseNumber(m[1]!) / parseNumber(m[2]!) : parseNumber(text);\n },\n};\n\n/** A factor with a times sign: `2.5×`, spoken `2.5 times`. Typed `x` reads too. */\nexport type MultiplierDisplay = {\n kind: 'multiplier';\n /** Most decimals. Default 2. */\n places?: number;\n /** Default `×`. */\n symbol?: string;\n};\n\n/** A {@link MultiplierDisplay}. */\nexport function multiplier(options: Omit<MultiplierDisplay, 'kind'> = {}): MultiplierDisplay {\n return { kind: 'multiplier', ...options };\n}\n\n/** The built-in `multiplier` kind, to spread into a `registerDisplayKind` replacement. */\nexport const multiplierKind: DisplayKind<MultiplierDisplay> = {\n kind: 'multiplier',\n format: (value, d, ctx) => [\n numberPart(value, ctx.locale, { maximumFractionDigits: d.places ?? 2 }),\n { type: 'symbol', value: d.symbol ?? '×' },\n ],\n speak: (value, d, ctx) =>\n spokenSign(`${numberPart(value, ctx.locale, { maximumFractionDigits: d.places ?? 2 }).value} times`),\n parse: (text, d, ctx) => {\n const own = d.symbol !== undefined && text.trimEnd().endsWith(d.symbol)\n ? text.trimEnd().slice(0, -d.symbol.length)\n : text.replace(/\\s*[x×X]\\s*$/, '');\n return parseNumber(own, undefined, ctx.locale);\n },\n};\n\n/**\n * A zoom factor. At 2x and below a percentage reads naturally; past it a\n * multiplier is what people say, so 2.5 shows `2.5x`. Past 100x a tenth is\n * noise: `1009.74` shows `1,010x`. Typed text without a sign reads as percent.\n */\nexport type ZoomDisplay = {\n kind: 'zoom';\n};\n\n/** A {@link ZoomDisplay}. */\nexport function zoom(): ZoomDisplay {\n return { kind: 'zoom' };\n}\n\nfunction zoomParts(z: number): Part[] {\n if (!Number.isFinite(z)) return [{ type: 'number', value: String(z) }];\n const n = (v: number, grouping = false) =>\n ({\n type: 'number',\n value: unsignedZero(v, (x) => x.toLocaleString('en-US', { useGrouping: grouping, maximumFractionDigits: 1 }))\n .replace(/^-/, MINUS_SIGN),\n });\n if (z <= 2) return [n(Math.round(z * 100)), { type: 'percentSign', value: '%' }];\n if (z >= 100) return [n(Math.round(z), true), { type: 'symbol', value: 'x' }];\n return [n(Math.round(z * 10) / 10), { type: 'symbol', value: 'x' }];\n}\n\n/** The built-in `zoom` kind, to spread into a `registerDisplayKind` replacement. */\nexport const zoomKind: DisplayKind<ZoomDisplay> = {\n kind: 'zoom',\n format: (value) => zoomParts(value),\n speak: (value) =>\n spokenSign(\n zoomParts(value)\n .map((p) => (p.type === 'percentSign' ? ' percent' : p.type === 'symbol' ? ' times' : p.value))\n .join(''),\n ),\n parse: (text) => {\n const t = text.trim();\n if (/[x×X]$/.test(t)) return parseNumber(t.slice(0, -1));\n return parseNumber(t.replace(/%$/, '')) / 100;\n },\n};\n","import { intlParts, numberPart, plural, spokenSign, textOf, type DisplayKind, type Part } from '../kind';\nimport { decimalOf, escapeClass, latinDigits, numberWithin, parseNumber, type UnitTable } from '../number';\n\n/**\n * Units `Intl` can name aloud, by the symbol a field shows. A unit outside it\n * speaks through the display's `spoken` names, else as its symbol.\n */\nconst INTL_UNITS: Record<string, string> = {\n mm: 'millimeter',\n cm: 'centimeter',\n m: 'meter',\n km: 'kilometer',\n in: 'inch',\n '\"': 'inch',\n '″': 'inch',\n ft: 'foot',\n \"'\": 'foot',\n '′': 'foot',\n yd: 'yard',\n mi: 'mile',\n deg: 'degree',\n '°': 'degree',\n ms: 'millisecond',\n s: 'second',\n min: 'minute',\n h: 'hour',\n g: 'gram',\n kg: 'kilogram',\n L: 'liter',\n '%': 'percent',\n};\n\n/** Names for common units `Intl` has none for. */\nconst OWN_UNITS: Record<string, readonly [string, string]> = {\n px: ['pixel', 'pixels'],\n pt: ['point', 'points'],\n rad: ['radian', 'radians'],\n turn: ['turn', 'turns'],\n};\n\n/**\n * A number with its unit: `12mm`, spoken `12 millimeters`. The unit is the\n * display's, else the one the value is tagged with. `accepts` is what a person\n * may type, each unit mapped to its conversion into the shown one; compound\n * text such as `5ft 3in` reads when every term's unit is accepted.\n */\nexport type UnitDisplay = {\n kind: 'unit';\n unit?: string;\n /** Most decimals, trailing zeros dropped. Default 2. */\n places?: number;\n /** A space between number and unit. Default false. */\n space?: boolean;\n accepts?: UnitTable;\n /** Singular and plural names, for a unit `Intl` cannot name. */\n spoken?: readonly [string, string];\n};\n\n/** A {@link UnitDisplay} in `name`. With no name, the unit comes from the value's tag. */\nexport function unit(name?: string, options: Omit<UnitDisplay, 'kind' | 'unit'> = {}): UnitDisplay {\n return name === undefined ? { kind: 'unit', ...options } : { kind: 'unit', unit: name, ...options };\n}\n\n/** The built-in `unit` kind, to spread into a `registerDisplayKind` replacement. */\nexport const unitKind: DisplayKind<UnitDisplay> = {\n kind: 'unit',\n format: (value, d, ctx) => {\n const parts: Part[] = [numberPart(value, ctx.locale, { maximumFractionDigits: d.places ?? 2, useGrouping: false })];\n const name = d.unit ?? ctx.unit;\n if (name) {\n if (d.space) parts.push({ type: 'literal', value: ' ' });\n parts.push({ type: 'unit', value: name });\n }\n return parts;\n },\n speak: (value, d, ctx) => {\n const places = d.places ?? 2;\n const name = d.unit ?? ctx.unit;\n const intl = name === undefined ? undefined : INTL_UNITS[name];\n if (intl !== undefined && d.spoken === undefined) {\n return spokenSign(\n textOf(intlParts(value, ctx.locale, { style: 'unit', unit: intl, unitDisplay: 'long', maximumFractionDigits: places })),\n );\n }\n const number = numberPart(value, ctx.locale, { maximumFractionDigits: places, useGrouping: false }).value;\n const names = d.spoken ?? (name === undefined ? undefined : OWN_UNITS[name]);\n const word = names ? plural(value, ctx.locale, names[0], names[1]) : name;\n return spokenSign(word ? `${number} ${word}` : number);\n },\n parse: (text, d, ctx) => {\n const name = d.unit ?? ctx.unit;\n return parseNumber(text, d.accepts ?? (name ? { [name]: 1 } : undefined), ctx.locale);\n },\n};\n\n/** Money in an ISO 4217 currency: `$12.50`, spoken `12.50 US dollars`. */\nexport type CurrencyDisplay = {\n kind: 'currency';\n currency: string;\n /** Fixed decimals. Defaults to the currency's own (2 for USD, 0 for JPY). */\n places?: number;\n};\n\n/** A {@link CurrencyDisplay} in the ISO 4217 currency `code`. */\nexport function currency(code: string, options: Omit<CurrencyDisplay, 'kind' | 'currency'> = {}): CurrencyDisplay {\n return { kind: 'currency', currency: code, ...options };\n}\n\nfunction currencyOptions(d: CurrencyDisplay): Intl.NumberFormatOptions {\n const options: Intl.NumberFormatOptions = { style: 'currency', currency: d.currency };\n if (d.places !== undefined) {\n options.minimumFractionDigits = d.places;\n options.maximumFractionDigits = d.places;\n }\n return options;\n}\n\n/** The built-in `currency` kind, to spread into a `registerDisplayKind` replacement. */\nexport const currencyKind: DisplayKind<CurrencyDisplay> = {\n kind: 'currency',\n format: (value, d, ctx) => intlParts(value, ctx.locale, currencyOptions(d)),\n speak: (value, d, ctx) =>\n spokenSign(textOf(intlParts(value, ctx.locale, { ...currencyOptions(d), currencyDisplay: 'name' }))),\n parse: (text, _d, ctx) => parseNumber(numberWithin(text, ctx.locale), undefined, ctx.locale),\n};\n\n/**\n * A span of time, the value in seconds. `clock` shows `1:02:03` or `4:05.5`;\n * `units` shows `2h 5m 3s`. Spoken `2 hours, 5 minutes, 3 seconds`. Typed text\n * reads in either form.\n */\nexport type DurationDisplay = {\n kind: 'duration';\n /** Default `'clock'`. */\n style?: 'clock' | 'units';\n /** Decimals on the seconds. Default 0. */\n places?: number;\n};\n\n/** A {@link DurationDisplay}. */\nexport function duration(options: Omit<DurationDisplay, 'kind'> = {}): DurationDisplay {\n return { kind: 'duration', ...options };\n}\n\n/** Hours, minutes and seconds of `value` after rounding to `places`. */\nfunction hms(value: number, places: number) {\n const scale = 10 ** places;\n const total = Math.round(Math.abs(value) * scale) / scale;\n const h = Math.floor(total / 3600);\n const m = Math.floor((total - h * 3600) / 60);\n const s = Math.round((total - h * 3600 - m * 60) * scale) / scale;\n return { negative: value < 0 && total > 0, h, m, s };\n}\n\nconst DURATION_UNITS: UnitTable = { h: 3600, m: 60, min: 60, s: 1, ms: 0.001 };\n\n/** The built-in `duration` kind, to spread into a `registerDisplayKind` replacement. */\nexport const durationKind: DisplayKind<DurationDisplay> = {\n kind: 'duration',\n format: (value, d) => {\n if (!Number.isFinite(value)) return [{ type: 'number', value: String(value) }];\n const places = d.places ?? 0;\n const { negative, h, m, s } = hms(value, places);\n const sec = s.toFixed(places);\n const parts: Part[] = negative ? [{ type: 'sign', value: '−' }] : [];\n if (d.style === 'units') {\n const terms: Part[][] = [];\n if (h > 0) terms.push([{ type: 'hours', value: String(h) }, { type: 'unit', value: 'h' }]);\n if (m > 0) terms.push([{ type: 'minutes', value: String(m) }, { type: 'unit', value: 'm' }]);\n if (s > 0 || terms.length === 0) terms.push([{ type: 'seconds', value: sec }, { type: 'unit', value: 's' }]);\n terms.forEach((t, i) => parts.push(...(i > 0 ? [{ type: 'literal', value: ' ' }] : []), ...t));\n return parts;\n }\n const pad = (n: string) => (n.split('.')[0]!.length < 2 ? `0${n}` : n);\n if (h > 0) {\n parts.push(\n { type: 'hours', value: String(h) },\n { type: 'literal', value: ':' },\n { type: 'minutes', value: pad(String(m)) },\n );\n } else {\n parts.push({ type: 'minutes', value: String(m) });\n }\n parts.push({ type: 'literal', value: ':' }, { type: 'seconds', value: pad(sec) });\n return parts;\n },\n speak: (value, d, ctx) => {\n if (!Number.isFinite(value)) return String(value);\n const { negative, h, m, s } = hms(value, d.places ?? 0);\n const terms: string[] = [];\n if (h > 0) terms.push(`${h} ${plural(h, ctx.locale, 'hour', 'hours')}`);\n if (m > 0) terms.push(`${m} ${plural(m, ctx.locale, 'minute', 'minutes')}`);\n if (s > 0 || terms.length === 0) terms.push(`${s} ${plural(s, ctx.locale, 'second', 'seconds')}`);\n return `${negative ? 'minus ' : ''}${terms.join(', ')}`;\n },\n parse: (text, _d, ctx) => {\n const d = escapeClass(decimalOf(ctx.locale));\n const clock = new RegExp(String.raw`^\\s*([-−+]?)\\s*(?:(\\d+):)?(\\d+):(\\d+)(?:[.${d}](\\d+))?\\s*$`);\n const m = clock.exec(latinDigits(text, ctx.locale));\n if (!m) return parseNumber(text, DURATION_UNITS, ctx.locale);\n const total = Number(m[2] ?? 0) * 3600 + Number(m[3]) * 60 + Number(`${m[4]}.${m[5] ?? 0}`);\n return m[1] === '-' || m[1] === '−' ? -total : total;\n },\n};\n\nconst DECIMAL_BYTES = ['B', 'kB', 'MB', 'GB', 'TB', 'PB'] as const;\nconst BINARY_BYTES = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'] as const;\nconst DECIMAL_NAMES = ['byte', 'kilobyte', 'megabyte', 'gigabyte', 'terabyte', 'petabyte'] as const;\nconst BINARY_NAMES = ['byte', 'kibibyte', 'mebibyte', 'gibibyte', 'tebibyte', 'pebibyte'] as const;\n\n/** A byte count in the largest unit that keeps it at or above 1: `1.2 MB`,\n * spoken `1.2 megabytes`. `base: 1024` uses `KiB`, `MiB`, … */\nexport type BytesDisplay = {\n kind: 'bytes';\n /** Default 1000. */\n base?: 1000 | 1024;\n /** Most decimals. Default 1. */\n places?: number;\n};\n\n/** A {@link BytesDisplay}. */\nexport function bytes(options: Omit<BytesDisplay, 'kind'> = {}): BytesDisplay {\n return { kind: 'bytes', ...options };\n}\n\nfunction byteScale(d: BytesDisplay, value: number): { scaled: number; step: number; places: number } {\n const base = d.base ?? 1000;\n const last = DECIMAL_BYTES.length - 1;\n const placesAt = (step: number): number => (step === 0 ? 0 : (d.places ?? 1));\n let step = 0;\n let scaled = value;\n while (Math.abs(scaled) >= base && step < last) {\n scaled /= base;\n step++;\n }\n // 999,999 B is 999.999 kB, which shows as 1,000 kB: a megabyte.\n if (step < last && Number(Math.abs(scaled).toFixed(placesAt(step))) >= base) {\n scaled /= base;\n step++;\n }\n return { scaled, step, places: placesAt(step) };\n}\n\nconst BYTE_UNITS: UnitTable = Object.fromEntries([\n ...DECIMAL_BYTES.map((u, i) => [u, 1000 ** i] as const),\n ['KB', 1000],\n ...BINARY_BYTES.slice(1).map((u, i) => [u, 1024 ** (i + 1)] as const),\n]);\n\n/** The built-in `bytes` kind, to spread into a `registerDisplayKind` replacement. */\nexport const bytesKind: DisplayKind<BytesDisplay> = {\n kind: 'bytes',\n format: (value, d, ctx) => {\n const { scaled, step, places } = byteScale(d, value);\n const units = d.base === 1024 ? BINARY_BYTES : DECIMAL_BYTES;\n return [\n numberPart(scaled, ctx.locale, { maximumFractionDigits: places }),\n { type: 'literal', value: ' ' },\n { type: 'unit', value: units[step]! },\n ];\n },\n speak: (value, d, ctx) => {\n const { scaled, step, places } = byteScale(d, value);\n const name = (d.base === 1024 ? BINARY_NAMES : DECIMAL_NAMES)[step]!;\n const number = numberPart(scaled, ctx.locale, { maximumFractionDigits: places }).value;\n return spokenSign(`${number} ${plural(Math.abs(parseNumber(number, undefined, ctx.locale)), ctx.locale, name, `${name}s`)}`);\n },\n parse: (text, _d, ctx) => parseNumber(text, BYTE_UNITS, ctx.locale),\n};\n","import { numberPart, spokenSign, type DisplayKind } from '../kind';\nimport { parseNumber } from '../number';\n\n/**\n * A whole number in Roman numerals, `XII`. Spoken as the plain number, since a\n * screen reader otherwise spells the letters out. Outside 1–3999, which the\n * numerals cannot write, it shows as a plain number.\n */\nexport type RomanDisplay = {\n kind: 'roman';\n lower?: boolean;\n};\n\n/** A {@link RomanDisplay}. */\nexport function roman(options: Omit<RomanDisplay, 'kind'> = {}): RomanDisplay {\n return { kind: 'roman', ...options };\n}\n\nconst NUMERALS: readonly [number, string][] = [\n [1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'], [100, 'C'], [90, 'XC'],\n [50, 'L'], [40, 'XL'], [10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'], [1, 'I'],\n];\n\n/** `n` in Roman numerals, or undefined outside 1–3999. */\nexport function toRoman(n: number): string | undefined {\n let rest = Math.round(n);\n if (!(rest >= 1 && rest <= 3999)) return undefined;\n let out = '';\n for (const [v, s] of NUMERALS) {\n while (rest >= v) {\n out += s;\n rest -= v;\n }\n }\n return out;\n}\n\n/** The value of well-formed Roman numerals, either case; NaN otherwise. */\nexport function fromRoman(text: string): number {\n const t = text.trim().toUpperCase();\n if (!/^[MDCLXVI]+$/.test(t)) return Number.NaN;\n let total = 0;\n let i = 0;\n for (const [v, s] of NUMERALS) {\n while (t.startsWith(s, i)) {\n total += v;\n i += s.length;\n }\n }\n // Anything left unread, or a non-canonical spelling such as `IIII`, is not a numeral.\n return i === t.length && toRoman(total) === t ? total : Number.NaN;\n}\n\n/** The built-in `roman` kind, to spread into a `registerDisplayKind` replacement. */\nexport const romanKind: DisplayKind<RomanDisplay> = {\n kind: 'roman',\n format: (value, d, ctx) => {\n const r = toRoman(value);\n if (r === undefined) return [numberPart(value, ctx.locale, { maximumFractionDigits: 0 })];\n return [{ type: 'numeral', value: d.lower ? r.toLowerCase() : r }];\n },\n speak: (value, _d, ctx) => spokenSign(numberPart(Math.round(value), ctx.locale, { maximumFractionDigits: 0, useGrouping: false }).value),\n parse: (text, _d, ctx) => {\n const r = fromRoman(text);\n return Number.isNaN(r) ? parseNumber(text, undefined, ctx.locale) : r;\n },\n};\n\n/** A whole number as an ordinal: `1st`, `22nd`, `113th`. English suffixes;\n * in any other locale the number shows alone. */\nexport type OrdinalDisplay = {\n kind: 'ordinal';\n};\n\n/** An {@link OrdinalDisplay}. */\nexport function ordinal(): OrdinalDisplay {\n return { kind: 'ordinal' };\n}\n\nconst SUFFIXES: Record<string, string> = { one: 'st', two: 'nd', few: 'rd', other: 'th' };\n\n/** The built-in `ordinal` kind, to spread into a `registerDisplayKind` replacement. */\nexport const ordinalKind: DisplayKind<OrdinalDisplay> = {\n kind: 'ordinal',\n format: (value, _d, ctx) => {\n const n = Math.round(value);\n const number = numberPart(n, ctx.locale, { maximumFractionDigits: 0 });\n if (!Number.isFinite(n) || !ctx.locale.startsWith('en')) return [number];\n const rule = new Intl.PluralRules('en-US', { type: 'ordinal' }).select(n);\n return [number, { type: 'ordinal', value: SUFFIXES[rule] ?? 'th' }];\n },\n parse: (text, _d, ctx) => Math.round(parseNumber(text.replace(/(st|nd|rd|th)\\s*$/i, ''), undefined, ctx.locale)),\n};\n","import { escapeMarkup, spokenSign, type DisplayKind, type FormatContext, type Part } from '../kind';\nimport { MINUS_SIGN, parseNumber } from '../number';\n\n/**\n * A mantissa times a power of ten at `digits` significant figures (default 3),\n * trailing zeros kept: `1.23 × 10⁶`. `engineering` keeps the exponent a multiple\n * of three (`12.3 × 10³`); `form: 'e'` writes it the way code does (`1.23e6`).\n * Zero shows as `0`.\n */\nexport type ScientificDisplay = {\n kind: 'scientific';\n digits?: number;\n engineering?: boolean;\n form?: 'superscript' | 'e';\n};\n\n/** A {@link ScientificDisplay}. */\nexport function scientific(options: Omit<ScientificDisplay, 'kind'> = {}): ScientificDisplay {\n return { kind: 'scientific', ...options };\n}\n\nconst SUPERSCRIPT = '⁰¹²³⁴⁵⁶⁷⁸⁹';\nconst superscript = (n: number): string =>\n (n < 0 ? '⁻' : '') + [...String(Math.abs(n))].map((d) => SUPERSCRIPT[Number(d)]).join('');\n\ntype Split = { mantissa: string; exponent: number } | null;\n\n/** The mantissa as the locale writes it and the exponent, or null for zero. */\nfunction split(value: number, d: ScientificDisplay, locale: string): Split {\n if (value === 0) return null;\n const digits = d.digits ?? 3;\n const nf = new Intl.NumberFormat(locale, {\n notation: d.engineering ? 'engineering' : 'scientific',\n minimumSignificantDigits: digits,\n maximumSignificantDigits: digits,\n });\n let mantissa = '';\n let exponent = '';\n for (const p of nf.formatToParts(value)) {\n if (p.type === 'exponentSeparator') continue;\n if (p.type === 'exponentMinusSign') exponent += '-';\n else if (p.type === 'exponentInteger') exponent += p.value;\n else mantissa += p.type === 'minusSign' ? MINUS_SIGN : p.value;\n }\n return { mantissa, exponent: Number(exponent) };\n}\n\nconst zeroParts = (locale: string): Part[] => [{ type: 'number', value: (0).toLocaleString(locale) }];\n\n/** `× 10^n`, `x10^n`, `*10^n`, and the superscript form, rewritten as the `e` form `parseNumber` reads. */\nfunction asENotation(text: string): string {\n const raised = text.replace(/[⁰¹²³⁴⁵⁶⁷⁸⁹⁻]+$/, (s) => `^${[...s].map((c) => (c === '⁻' ? '-' : SUPERSCRIPT.indexOf(c))).join('')}`);\n const m = /^(?:(.*\\d)\\s*[×xX*·]\\s*)?10\\s*\\^\\s*([-−+]?\\d+)$/.exec(raised.trim());\n if (m) return `${m[1] ?? '1'}e${m[2]!.replace(MINUS_SIGN, '-')}`;\n return text.replace(/(\\d)[eE]−/, '$1e-');\n}\n\n/** The built-in `scientific` kind, to spread into a `registerDisplayKind` replacement. */\nexport const scientificKind: DisplayKind<ScientificDisplay> = {\n kind: 'scientific',\n format: (value, d, ctx) => {\n const s = split(value, d, ctx.locale);\n if (s === null) return zeroParts(ctx.locale);\n if (d.form === 'e') {\n const exponent = String(s.exponent).replace('-', MINUS_SIGN);\n return [{ type: 'number', value: s.mantissa }, { type: 'literal', value: 'e' }, { type: 'exponent', value: exponent }];\n }\n return [\n { type: 'number', value: s.mantissa },\n { type: 'literal', value: ' × ' },\n { type: 'base', value: '10' },\n { type: 'exponent', value: superscript(s.exponent) },\n ];\n },\n speak: (value, d, ctx: FormatContext) => {\n const s = split(value, d, ctx.locale);\n if (s === null) return zeroParts(ctx.locale)[0]!.value;\n return spokenSign(`${s.mantissa} times 10 to the power of ${spokenSign(String(s.exponent))}`);\n },\n parse: (text, _d, ctx) => parseNumber(asENotation(text), undefined, ctx.locale),\n mathml: (value, d, ctx) => {\n const s = split(value, d, ctx.locale);\n if (s === null) return undefined;\n const sign = s.mantissa.startsWith(MINUS_SIGN) ? `<mo>${MINUS_SIGN}</mo>` : '';\n const mantissa = `${sign}<mn>${escapeMarkup(s.mantissa.replace(MINUS_SIGN, ''))}</mn>`;\n const power = s.exponent < 0 ? `<mrow><mo>${MINUS_SIGN}</mo><mn>${-s.exponent}</mn></mrow>` : `<mn>${s.exponent}</mn>`;\n return `<math>${mantissa}<mo>×</mo><msup><mn>10</mn>${power}</msup></math>`;\n },\n};\n","import type { Part } from './kind';\nimport { MINUS_SIGN } from './number';\nimport type { Display } from './quantity';\n\ninterface Word {\n text: string;\n spoken: string;\n}\n\nconst POSITIVE: Word = { text: '∞', spoken: 'infinity' };\nconst NEGATIVE: Word = { text: `${MINUS_SIGN}∞`, spoken: 'minus infinity' };\nconst SPELLINGS = ['∞', 'inf', 'infinity', 'infinite'];\n\nfunction word(w: string | { text: string; spoken?: string }): Word {\n return typeof w === 'string' ? { text: w, spoken: w } : { text: w.text, spoken: w.spoken ?? w.text };\n}\n\n/** The word `display` uses for `+Infinity` (`sign` 1) or `−Infinity` (`sign` −1). */\nexport function infinityWord(display: Display | undefined, sign: 1 | -1): Word {\n const w = display?.infinity;\n if (w === undefined) return sign > 0 ? POSITIVE : NEGATIVE;\n if (sign > 0) return word(w);\n return typeof w === 'object' && w.negative !== undefined ? word(w.negative) : NEGATIVE;\n}\n\n/** ±Infinity as its one `infinity` part. No unit or symbol rides along: a word\n * like `never` stands alone, which is how a control knows to drop a suffix. */\nexport function infinityParts(value: number, display: Display | undefined): Part[] {\n return [{ type: 'infinity', value: infinityWord(display, value > 0 ? 1 : -1).text }];\n}\n\n/** Typed text as ±Infinity when it names it — the display's own words, `∞`,\n * `inf`, `infinity` or `infinite`, signed or not — else `undefined`. */\nexport function readInfinity(text: string, display: Display | undefined, locale: string): number | undefined {\n const typed = text.trim().toLocaleLowerCase(locale);\n const is = (w: Word) => w.text.toLocaleLowerCase(locale) === typed || w.spoken.toLocaleLowerCase(locale) === typed;\n if (is(infinityWord(display, 1))) return Infinity;\n if (is(infinityWord(display, -1))) return -Infinity;\n const m = /^([+\\-−]?)\\s*(.*)$/.exec(typed)!;\n if (!SPELLINGS.includes(m[2]!)) return undefined;\n return m[1] === '-' || m[1] === MINUS_SIGN ? -Infinity : Infinity;\n}\n","import { escapeMarkup as escape, textOf, type DisplayKind, type FormatContext, type Part } from './kind';\nimport { compactKind, decimalKind, integerKind } from './kinds/plain';\nimport { fractionKind, multiplierKind, percentKind, ratioKind, zoomKind } from './kinds/proportion';\nimport { bytesKind, currencyKind, durationKind, unitKind } from './kinds/measure';\nimport { ordinalKind, romanKind } from './kinds/numeral';\nimport { scientificKind } from './kinds/scientific';\nimport { infinityParts, infinityWord, readInfinity } from './infinity';\nimport { parseNumber } from './number';\nimport { amount, displayOf, retag, tag, unitOf, type Display, type Quantity, type Tagged } from './quantity';\nimport { unitScale, type Unit, type UnitSystem } from './units';\n\n// A static table rather than registration at import, so the package stays\n// free of side effects and a bundler can drop what nobody imports.\nconst BUILTIN: Record<string, DisplayKind<never>> = Object.fromEntries(\n [\n decimalKind, integerKind, compactKind, scientificKind,\n percentKind, fractionKind, ratioKind, multiplierKind, zoomKind,\n unitKind, currencyKind, durationKind, bytesKind,\n romanKind, ordinalKind,\n ].map((k) => [k.kind, k as DisplayKind<never>]),\n);\n\nconst registered = new Map<string, DisplayKind<never>>();\n\n/**\n * Adds a display kind, or replaces a built-in one — the way to swap in a words\n * library for `fraction`'s spoken form (`{ ...fractionKind, speak }`). Returns\n * a function that removes it again.\n */\nexport function registerDisplayKind<D extends Display>(kind: DisplayKind<D>): () => void {\n const entry = kind as unknown as DisplayKind<never>;\n registered.set(kind.kind, entry);\n return () => {\n if (registered.get(kind.kind) === entry) registered.delete(kind.kind);\n };\n}\n\n/**\n * The kind behind `display`. An unknown kind resolves to `decimal` rather than\n * throwing: a document saved by an app with a custom kind still opens in one\n * without it, and its tag survives untouched.\n */\nexport function displayKindOf(display: Display | undefined): DisplayKind<Display> {\n const kind = display === undefined ? undefined : (registered.get(display.kind) ?? BUILTIN[display.kind]);\n return (kind ?? decimalKind) as unknown as DisplayKind<Display>;\n}\n\n/** Options for presenting or parsing a quantity. */\nexport interface PresentOptions {\n /** BCP 47 locale. Default `en-US`. */\n locale?: string;\n}\n\n/** A quantity as text, spoken text, HTML and, where its kind has one, MathML. */\nexport interface Presentation {\n text: string;\n spoken: string;\n /** Unstyled: a `<data value>` wrapping one `<span data-part>` per named part. */\n html: string;\n mathml?: string;\n /** The display's `form` is `stacked` and there is a `mathml` form: a\n * renderer that draws MathML draws it in place of `html`. */\n stacked?: true;\n}\n\nconst DEFAULT_DISPLAY: Display = { kind: 'decimal' };\n\nfunction contextOf(q: Quantity, options: PresentOptions | undefined): FormatContext {\n const unit = unitOf(q);\n return unit === undefined ? { locale: options?.locale ?? 'en-US' } : { locale: options?.locale ?? 'en-US', unit };\n}\n\n/** Parts as the unstyled HTML fragment {@link Presentation.html} describes. */\nexport function partsToHtml(value: number, parts: readonly Part[]): string {\n const body = parts\n .map((p) => (p.type === 'literal' ? escape(p.value) : `<span data-part=\"${escape(p.type)}\">${escape(p.value)}</span>`))\n .join('');\n return `<data value=\"${escape(String(value))}\">${body}</data>`;\n}\n\n/** Parts of `q` under its own display, else `fallback`, else `decimal`. */\nexport function partsOf(q: Quantity, fallback?: Display, options?: PresentOptions): Part[] {\n const display = displayOf(q, fallback) ?? DEFAULT_DISPLAY;\n const value = amount(q);\n if (isInfinite(value)) return infinityParts(value, display);\n return displayKindOf(display).format(value, display, contextOf(q, options));\n}\n\n/** `q` as text, spoken text, HTML and MathML. See {@link qty} for one at a time. */\nexport function present(q: Quantity, fallback?: Display, options?: PresentOptions): Presentation {\n const display = displayOf(q, fallback) ?? DEFAULT_DISPLAY;\n const kind = displayKindOf(display);\n const value = amount(q);\n if (isInfinite(value)) {\n const word = infinityWord(display, value > 0 ? 1 : -1);\n return { text: word.text, spoken: word.spoken, html: partsToHtml(value, infinityParts(value, display)) };\n }\n const ctx = contextOf(q, options);\n const parts = kind.format(value, display, ctx);\n const text = textOf(parts);\n const out: Presentation = {\n text,\n spoken: kind.speak ? kind.speak(value, display, ctx) : text,\n html: partsToHtml(value, parts),\n };\n const mathml = kind.mathml?.(value, display, ctx);\n if (mathml !== undefined) {\n out.mathml = mathml;\n if (display.form === 'stacked') out.stacked = true;\n }\n return out;\n}\n\nfunction isInfinite(value: number): boolean {\n return value === Infinity || value === -Infinity;\n}\n\n/** Typed text read through `display`: NaN when it does not read. ±Infinity\n * reads from the display's own word for it, and from `∞` or `infinity`. */\nexport function parseAs(text: string, display?: Display, options?: PresentOptions & { unit?: Unit }): number {\n const d = display ?? DEFAULT_DISPLAY;\n const kind = displayKindOf(d);\n const ctx: FormatContext = { locale: options?.locale ?? 'en-US' };\n const infinite = readInfinity(text, d, ctx.locale);\n if (infinite !== undefined) return infinite;\n if (options?.unit !== undefined) ctx.unit = options.unit;\n return kind.parse ? kind.parse(text, d, ctx) : parseNumber(text, undefined, ctx.locale);\n}\n\n/**\n * A short-lived view of a quantity with its presentation as methods. Nothing\n * about it is stored — keep the quantity, and wrap it where it is shown.\n */\nexport class QuantityView<Q extends Quantity = Quantity> {\n constructor(\n /** The quantity as given. */\n readonly raw: Q,\n private readonly fallback?: Display,\n private readonly options?: PresentOptions,\n ) {}\n\n get value(): number {\n return amount(this.raw);\n }\n get unit(): Unit | undefined {\n return unitOf(this.raw);\n }\n /** The display in effect: the value's own, else the fallback. */\n get display(): Display | undefined {\n return displayOf(this.raw, this.fallback);\n }\n get parts(): Part[] {\n return partsOf(this.raw, this.fallback, this.options);\n }\n get text(): string {\n return textOf(this.parts);\n }\n get spoken(): string {\n return present(this.raw, this.fallback, this.options).spoken;\n }\n get html(): string {\n return partsToHtml(this.value, this.parts);\n }\n get mathml(): string | undefined {\n return present(this.raw, this.fallback, this.options).mathml;\n }\n /** `next` in this quantity's shape — see {@link retag}. */\n with(next: number): QuantityView<Q> {\n return new QuantityView(retag(this.raw, next), this.fallback, this.options);\n }\n /** Typed text read through this quantity's display; NaN when it does not read. */\n parse(text: string): number {\n const unit = this.unit;\n return parseAs(text, this.display, unit === undefined ? this.options : { ...this.options, unit });\n }\n /** The same amount in `target`, converted through `system`, tagged with it. */\n to(target: Unit, system: UnitSystem): QuantityView {\n const from = unitScale(system, this.unit ?? system.base);\n const to = unitScale(system, target);\n const base = this.value * from.factor + from.offset;\n const value = (base - to.offset) / to.factor;\n const raw = typeof this.raw === 'number' ? tag(value, undefined, target) : { ...(this.raw as Tagged), value, unit: target };\n return new QuantityView(raw, this.fallback, this.options);\n }\n toJSON(): Q {\n return this.raw;\n }\n}\n\n/** Wraps `q` for display: `qty(band.from, fraction()).text`. `fallback` is the\n * display for a value that carries none of its own. */\nexport function qty<Q extends Quantity>(q: Q, fallback?: Display, options?: PresentOptions): QuantityView<Q> {\n return new QuantityView(q, fallback, options);\n}\n","import { MINUS_SIGN, withSpellings } from './number';\nimport { unitScale, type Unit, type UnitSystem } from './units';\n\n/**\n * Arithmetic over values in different units, as plain data: `50% + 2ft`\n * parses once and resolves against whatever context it is handed, so a stored\n * expression follows a parent that resizes. `value` nodes are the leaves.\n */\nexport type UnitExpr =\n | { op: 'value'; value: number; unit?: Unit }\n | { op: 'neg'; of: UnitExpr }\n | { op: 'add' | 'sub' | 'mul' | 'div'; left: UnitExpr; right: UnitExpr };\n\n/** What a {@link UnitExpr} resolves against. */\nexport interface UnitExprContext {\n unitSystem?: UnitSystem;\n /** What `100%` is, in base units. A `%` term throws without it, unless the\n * unit system carries a `%` unit of its own. */\n percentOf?: number;\n}\n\ntype Token = { kind: 'value'; value: number; unit?: Unit } | { kind: 'op'; op: string };\n\nconst TOKEN = /\\s*(?:(\\d+(?:\\.\\d+)?|\\.\\d+)\\s*([^\\s\\d.+\\-−*×/÷()]+)?|([+\\-−*×/÷()]))/y;\nconst OPS: Record<string, string> = { [MINUS_SIGN]: '-', '×': '*', '÷': '/' };\n\nfunction tokenize(text: string): Token[] {\n const tokens: Token[] = [];\n let at = 0;\n while (text.slice(at).trim() !== '') {\n TOKEN.lastIndex = at;\n const m = TOKEN.exec(text);\n if (!m) throw new Error(`unitExpr: cannot read '${text.slice(at).trim()}' in '${text}'`);\n at = TOKEN.lastIndex;\n if (m[1] === undefined) tokens.push({ kind: 'op', op: OPS[m[3]!] ?? m[3]! });\n else if (m[2] === undefined) tokens.push({ kind: 'value', value: Number(m[1]) });\n else tokens.push({ kind: 'value', value: Number(m[1]), unit: m[2] });\n }\n return tokens;\n}\n\n/**\n * Parse arithmetic over unit-tagged numbers: `+ - * /` (also `− × ÷`),\n * parentheses, and adjacent terms read as one compound value (`5ft 3in`),\n * with a leading sign carried across all of them. Throws on text it cannot\n * read. Unit names are not checked here — resolving does that.\n */\nexport function parseUnitExpr(text: string): UnitExpr {\n const tokens = tokenize(text);\n let i = 0;\n const isOp = (op: string): boolean => {\n const t = tokens[i];\n return t !== undefined && t.kind === 'op' && t.op === op;\n };\n const fail = (): never => {\n throw new Error(`unitExpr: '${text}' is not a complete expression`);\n };\n\n const sum = (): UnitExpr => {\n let left = product();\n while (isOp('+') || isOp('-')) {\n const op = isOp('+') ? 'add' : 'sub';\n i++;\n left = { op, left, right: product() };\n }\n return left;\n };\n const product = (): UnitExpr => {\n let left = unary();\n while (isOp('*') || isOp('/')) {\n const op = isOp('*') ? 'mul' : 'div';\n i++;\n left = { op, left, right: unary() };\n }\n return left;\n };\n const unary = (): UnitExpr => {\n if (isOp('+')) {\n i++;\n return unary();\n }\n if (!isOp('-')) return primary();\n i++;\n const of = unary();\n // Folded into the literal so an offset unit keeps its meaning: −10degC is 263.15K.\n return of.op === 'value' ? { ...of, value: -of.value } : { op: 'neg', of };\n };\n const primary = (): UnitExpr => {\n if (isOp('(')) {\n i++;\n const inner = sum();\n if (!isOp(')')) fail();\n i++;\n return inner;\n }\n let left = literal();\n while (tokens[i]?.kind === 'value') left = { op: 'add', left, right: literal() };\n return left;\n };\n const literal = (): UnitExpr => {\n const t = tokens[i];\n if (t === undefined || t.kind !== 'value') return fail();\n i++;\n return t.unit === undefined\n ? { op: 'value', value: t.value }\n : { op: 'value', value: t.value, unit: t.unit };\n };\n\n const expr = sum();\n if (i !== tokens.length) fail();\n return expr;\n}\n\ninterface Resolved {\n n: number;\n /** A measure, in base units — as against a bare scalar. */\n measure: boolean;\n /** From a unit that puts zero somewhere else, so it is a point and not an amount. */\n offset: boolean;\n}\n\nfunction resolveNode(expr: UnitExpr, ctx: UnitExprContext): Resolved {\n if (expr.op === 'value') return resolveValue(expr.value, expr.unit, ctx);\n if (expr.op === 'neg') {\n const of = amountOf(resolveNode(expr.of, ctx));\n return { ...of, n: -of.n };\n }\n const l = amountOf(resolveNode(expr.left, ctx));\n const r = amountOf(resolveNode(expr.right, ctx));\n switch (expr.op) {\n case 'add':\n return { n: l.n + r.n, measure: l.measure || r.measure, offset: false };\n case 'sub':\n return { n: l.n - r.n, measure: l.measure || r.measure, offset: false };\n case 'mul':\n if (l.measure && r.measure) throw new Error('unitExpr: cannot multiply two measures');\n return { n: l.n * r.n, measure: l.measure || r.measure, offset: false };\n case 'div':\n if (r.measure && !l.measure) throw new Error('unitExpr: cannot divide by a measure');\n return { n: l.n / r.n, measure: l.measure && !r.measure, offset: false };\n }\n}\n\nfunction amountOf(r: Resolved): Resolved {\n if (r.offset) {\n throw new Error('unitExpr: a unit with an offset names a point, and has no place in arithmetic');\n }\n return r;\n}\n\nfunction resolveValue(value: number, unit: Unit | undefined, ctx: UnitExprContext): Resolved {\n if (unit === undefined) return { n: value, measure: false, offset: false };\n const units = ctx.unitSystem ? withSpellings(ctx.unitSystem.units) : undefined;\n if (unit === '%' && units?.['%'] === undefined) {\n if (ctx.percentOf === undefined) {\n throw new Error(`unitExpr: ${value}% needs a percentOf to resolve against`);\n }\n return { n: (value / 100) * ctx.percentOf, measure: true, offset: false };\n }\n if (!ctx.unitSystem || !units) throw new Error(`unitExpr: ${value}${unit} requires a UnitSystem`);\n let scale: ReturnType<typeof unitScale>;\n try {\n scale = unitScale({ base: ctx.unitSystem.base, units }, unit);\n } catch (e) {\n throw new Error(`unitExpr: ${e instanceof Error ? e.message : String(e)}`);\n }\n return { n: value * scale.factor + scale.offset, measure: true, offset: scale.offset !== 0 };\n}\n\n/**\n * An expression's value in base units. A bare number beside `+` or `-` is\n * read as base units, as it is everywhere a `UnitValue` goes, and beside `*`\n * or `/` as a scalar. A measure over a measure is a scalar; a product of two\n * measures, or a scalar over a measure, throws.\n */\nexport function resolveUnitExpr(expr: UnitExpr | string, ctx: UnitExprContext = {}): number {\n return resolveNode(typeof expr === 'string' ? parseUnitExpr(expr) : expr, ctx).n;\n}\n","import type { Quantity } from './quantity';\nimport { entryScale, formatUnit, resolveUnit, type Unit, type UnitEntry, type UnitSystem, type UnitValue } from './units';\n\n/**\n * A unit system nested in another: a sub-assembly drawn in millimeters inside\n * a scene measured in inches. Values inside are read against `system`, and\n * `scale` converts at the boundary.\n */\nexport interface UnitScope {\n system: UnitSystem;\n /** What one of this scope's base units is worth in the enclosing scope's\n * base units. Absent is 1, which is also what the outermost scope has. */\n scale?: UnitEntry;\n}\n\n/** A measure in the innermost scope's base units, in the outermost's. `scopes` runs outermost first. */\nexport function toRoot(base: number, scopes: readonly UnitScope[]): number {\n let n = base;\n for (let i = scopes.length - 1; i >= 0; i--) {\n const { factor, offset } = entryScale(scopes[i]!.scale ?? 1);\n n = n * factor + offset;\n }\n return n;\n}\n\n/** The inverse of {@link toRoot}: an outermost-scope measure in the innermost scope's base units. */\nexport function fromRoot(rootBase: number, scopes: readonly UnitScope[]): number {\n let n = rootBase;\n for (const scope of scopes) {\n const { factor, offset } = entryScale(scope.scale ?? 1);\n n = (n - offset) / factor;\n }\n return n;\n}\n\n/**\n * Resolve `v` where it was written — against the innermost scope's unit\n * system, so `ft` inside a metric sub-assembly is an error rather than a\n * silent inch measure — and return it in the outermost scope's base units.\n */\nexport function resolveScoped(v: UnitValue | Quantity, scopes: readonly UnitScope[]): number {\n return toRoot(resolveUnit(v, scopes[scopes.length - 1]?.system), scopes);\n}\n\n/** A measure in the outermost scope's base units, as text in a unit of the innermost scope. */\nexport function formatScoped(\n rootBase: number,\n displayUnit: Unit,\n scopes: readonly UnitScope[],\n opts?: { precision?: number; suffix?: boolean },\n): string {\n return formatUnit(fromRoot(rootBase, scopes), displayUnit, scopes[scopes.length - 1]!.system, opts);\n}\n\n/** How {@link scopesOf} reads a tree it knows nothing else about. */\nexport interface ScopeTree<Id> {\n parentOf(id: Id): Id | null | undefined;\n /** The scope `id` declares for what it holds, when it declares one. */\n scopeOf(id: Id): UnitScope | undefined;\n /** Count `id`'s own scope too — for a value written inside it rather than\n * one that places it in its parent. Default false. */\n inclusive?: boolean;\n}\n\n/**\n * The scopes enclosing `id`, outermost first, under `root`: what\n * {@link resolveScoped} takes for a value that positions or sizes `id`. A\n * node's own scope covers its children, not itself, unless `inclusive`.\n */\nexport function scopesOf<Id>(id: Id, root: UnitScope, tree: ScopeTree<Id>): UnitScope[] {\n const inner: UnitScope[] = [];\n let at: Id | null | undefined = tree.inclusive ? id : tree.parentOf(id);\n while (at !== null && at !== undefined) {\n const scope = tree.scopeOf(at);\n if (scope) inner.push(scope);\n at = tree.parentOf(at);\n }\n return [root, ...inner.reverse()];\n}\n","import { escapeMarkup as escape, textOf, type Part } from './kind';\nimport { partsOf, partsToHtml, present, type PresentOptions, type Presentation } from './present';\nimport { amount, type Display, type Quantity } from './quantity';\n\n/** Options for presenting a range. */\nexport interface RangeOptions extends PresentOptions {\n /** What goes between the ends. Default an en dash, spaced when an end is negative. */\n separator?: string;\n /** The separator read aloud. Default ` to `. */\n spokenSeparator?: string;\n}\n\n/** Options for presenting a vector. */\nexport interface VectorOptions extends PresentOptions {\n /** What goes between members. Default `, `. */\n separator?: string;\n /** A name before each member, by position: `['x', 'y']`. */\n labels?: readonly string[];\n}\n\nconst SEPARATOR = 'separator';\n\n/** Part types that say what a value is measured in, rather than how much. */\nconst MEASURE = new Set(['unit', 'percentSign']);\n\n/** The trailing parts of a value that name its measure: `ft` in `2ft`, with any space before it. */\nfunction measureTail(parts: readonly Part[]): Part[] {\n let at = parts.length;\n while (at > 0 && (MEASURE.has(parts[at - 1]!.type) || parts[at - 1]!.type === 'literal')) at--;\n const tail = parts.slice(at);\n return tail.some((p) => MEASURE.has(p.type)) ? tail : [];\n}\n\n/** Each end's own parts, with a measure both ends close on left off the first. */\nfunction rangeEnds(from: Quantity, to: Quantity, fallback?: Display, options?: PresentOptions): [Part[], Part[]] {\n const a = partsOf(from, fallback, options);\n const b = partsOf(to, fallback, options);\n const tail = measureTail(a);\n const shared = tail.length > 0 && textOf(tail) === textOf(measureTail(b));\n return [shared ? a.slice(0, a.length - tail.length) : a, b];\n}\n\nfunction rangeSeparator(from: Quantity, to: Quantity, options?: RangeOptions): string {\n return options?.separator ?? (amount(from) < 0 || amount(to) < 0 ? ' – ' : '–');\n}\n\n/**\n * A range as one run of parts: both ends under their own display, else\n * `fallback`, around a `separator` part. A unit or percent sign both ends\n * share is written once, after the second: `2–5ft`.\n */\nexport function rangeParts(from: Quantity, to: Quantity, fallback?: Display, options?: RangeOptions): Part[] {\n const [a, b] = rangeEnds(from, to, fallback, options);\n return [...a, { type: SEPARATOR, value: rangeSeparator(from, to, options) }, ...b];\n}\n\n/** A range as text, spoken text, and HTML: a `data-composite=\"range\"` span\n * holding a `<data value>` for each end and a `separator` part between. */\nexport function presentRange(from: Quantity, to: Quantity, fallback?: Display, options?: RangeOptions): Presentation {\n const [a, b] = rangeEnds(from, to, fallback, options);\n const separator = rangeSeparator(from, to, options);\n const spoken = [from, to].map((q) => present(q, fallback, options).spoken);\n return {\n text: `${textOf(a)}${separator}${textOf(b)}`,\n spoken: spoken.join(options?.spokenSeparator ?? ' to '),\n html: compositeHtml('range', [partsToHtml(amount(from), a), partsToHtml(amount(to), b)], separator),\n };\n}\n\n/** A vector as one run of parts: every member under its own display, else\n * `fallback`, with a `separator` part between and a `label` part before each\n * member that has one. */\nexport function vectorParts(members: readonly Quantity[], fallback?: Display, options?: VectorOptions): Part[] {\n const separator = options?.separator ?? ', ';\n return members.flatMap((q, i) => [\n ...(i > 0 ? [{ type: SEPARATOR, value: separator }] : []),\n ...labelParts(options?.labels?.[i]),\n ...partsOf(q, fallback, options),\n ]);\n}\n\n/** A vector as text, spoken text, and HTML: a `data-composite=\"vector\"` span\n * holding a `<data value>` for each member. */\nexport function presentVector(members: readonly Quantity[], fallback?: Display, options?: VectorOptions): Presentation {\n const separator = options?.separator ?? ', ';\n const label = (i: number): string => textOf(labelParts(options?.labels?.[i]));\n return {\n text: textOf(vectorParts(members, fallback, options)),\n spoken: members.map((q, i) => `${label(i)}${present(q, fallback, options).spoken}`).join(separator),\n html: compositeHtml(\n 'vector',\n members.map((q, i) => `${partsHtml(labelParts(options?.labels?.[i]))}${present(q, fallback, options).html}`),\n separator,\n ),\n };\n}\n\nfunction labelParts(label: string | undefined): Part[] {\n return label === undefined ? [] : [{ type: 'label', value: label }, { type: 'literal', value: ' ' }];\n}\n\nfunction partsHtml(parts: readonly Part[]): string {\n return parts\n .map((p) => (p.type === 'literal' ? escape(p.value) : `<span data-part=\"${escape(p.type)}\">${escape(p.value)}</span>`))\n .join('');\n}\n\nfunction compositeHtml(kind: string, members: readonly string[], separator: string): string {\n const between = partsHtml([{ type: SEPARATOR, value: separator }]);\n return `<span data-composite=\"${kind}\">${members.join(between)}</span>`;\n}\n","/** Which ends of a number's range stand for infinity. */\nexport type Endless = 'min' | 'max' | 'both';\n\n/** Whether the `max` end (`sign` 1) or the `min` end (`sign` −1) is endless. */\nexport function endlessAt(endless: Endless | undefined, sign: 1 | -1): boolean {\n return endless === 'both' || endless === (sign > 0 ? 'max' : 'min');\n}\n\n/** Whether `n` is an infinity that `endless` allows as a value. */\nexport function endlessAllows(endless: Endless | undefined, n: number): boolean {\n return (n === Infinity && endlessAt(endless, 1)) || (n === -Infinity && endlessAt(endless, -1));\n}\n\n/** A slider's track with a stop for infinity added beyond each endless end,\n * so every value from `min` to `max` stays reachable. */\nexport interface EndlessTrack {\n /** The track's own ends: `min` and `max`, each moved out by one stop where endless. */\n min: number;\n max: number;\n /** Where a value sits on the track: ±Infinity at the end it belongs to. */\n toTrack: (value: number) => number;\n /** The value a track position stands for: beyond the range, infinity or the\n * range's end, whichever is nearer. */\n fromTrack: (at: number) => number;\n}\n\n/** The added stop sits one `step` beyond the range, or a twentieth of the\n * range where the track has no step. */\nexport function endlessTrack(min: number, max: number, step: number | undefined, endless: Endless | undefined): EndlessTrack {\n const gap = step !== undefined && step > 0 ? step : (max - min) / 20;\n const lo = endlessAt(endless, -1) ? min - gap : min;\n const hi = endlessAt(endless, 1) ? max + gap : max;\n return {\n min: lo,\n max: hi,\n toTrack: value => (value === Infinity ? hi : value === -Infinity ? lo : value),\n fromTrack: at =>\n at > max ? (hi > max && at - max >= gap / 2 ? Infinity : max)\n : at < min ? (lo < min && min - at >= gap / 2 ? -Infinity : min)\n : at,\n };\n}\n","import { endlessAllows, endlessAt, endlessTrack, type Endless } from './endless';\n\n/** The bounds a spin key moves a value within. */\nexport interface SpinBounds {\n step: number;\n min?: number;\n max?: number;\n /** The ends that stand for infinity: a step past one reaches it, as an endless slider's stop does. */\n endless?: Endless;\n}\n\n/** `n` held within the bounds, except an infinity an endless end stands for. */\nexport function clampToBounds(n: number, { min, max, endless }: SpinBounds): number {\n if (endlessAllows(endless, n)) return n;\n return Math.min(max ?? Infinity, Math.max(min ?? -Infinity, n));\n}\n\n/** Decimal places `n` is written with, up to ten. */\nfunction placesOf(n: number): number {\n if (!Number.isFinite(n)) return 0;\n const text = String(n);\n const e = text.indexOf('e-');\n if (e >= 0) return Math.min(10, Number(text.slice(e + 2)));\n const dot = text.indexOf('.');\n return dot < 0 ? 0 : Math.min(10, text.length - dot - 1);\n}\n\n/**\n * `n` moved to the nearest multiple of `step` counted from `origin`, written\n * with the decimals `step` and `origin` carry, so three steps of `0.1` land on\n * `0.3`. No step, no snap.\n */\nexport function snapToStep(n: number, step: number | undefined, origin = 0): number {\n if (step === undefined || !(step > 0)) return n;\n const places = Math.max(placesOf(step), placesOf(origin));\n return Number((Math.round((n - origin) / step) * step + origin).toFixed(places));\n}\n\n/**\n * The value a spin-button key moves `from` to, or `null` for a key that does\n * not spin: the arrows by a step, Page Up and Page Down by ten, and Home and\n * End to a bound, where there is one. A sum of steps is rounded to the places\n * its operands carry, so `0.1 + 0.2` lands on `0.3`.\n */\nexport function spinKey(key: string, from: number, bounds: SpinBounds): number | null {\n const { endless, step, min, max } = bounds;\n if (endless === undefined) return finiteSpin(key, from, bounds);\n const track = endlessTrack(min ?? -Infinity, max ?? Infinity, step, endless);\n const at = finiteSpin(key, track.toTrack(from), {\n step,\n ...(min === undefined && !endlessAt(endless, -1) ? {} : { min: track.min }),\n ...(max === undefined && !endlessAt(endless, 1) ? {} : { max: track.max }),\n });\n return at === null ? null : track.fromTrack(at);\n}\n\n/** Whether `key` spins `from` anywhere: false for a key that does not spin, and at the bound it heads for. */\nexport function canSpin(key: string, from: number, bounds: SpinBounds): boolean {\n const next = spinKey(key, from, bounds);\n return next !== null && next !== from;\n}\n\n/** How many steps a coarse key press takes: an arrow with Shift held, or Page Up and Page Down. */\nexport const COARSE_STEPS = 10;\n\nfunction finiteSpin(key: string, from: number, bounds: SpinBounds): number | null {\n const by = (n: number) => {\n const places = Math.max(placesOf(from), placesOf(bounds.step));\n return clampToBounds(Number((from + n * bounds.step).toFixed(places)), bounds);\n };\n switch (key) {\n case 'ArrowUp':\n return by(1);\n case 'ArrowDown':\n return by(-1);\n case 'PageUp':\n return by(COARSE_STEPS);\n case 'PageDown':\n return by(-COARSE_STEPS);\n case 'Home':\n return bounds.min ?? null;\n case 'End':\n return bounds.max ?? null;\n default:\n return null;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/quantity.ts","../src/units.ts","../src/number.ts","../src/kind.ts","../src/kinds/plain.ts","../src/kinds/proportion.ts","../src/kinds/measure.ts","../src/kinds/numeral.ts","../src/kinds/scientific.ts","../src/infinity.ts","../src/present.ts","../src/unitExpr.ts","../src/scope.ts","../src/scaleBar.ts","../src/composite.ts","../src/endless.ts","../src/spin.ts"],"names":["unit","decimal","integer","word","step","scaled","SUPERSCRIPT","SPELLINGS","endless"],"mappings":"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","file":"index.js","sourcesContent":["import type { Unit } from './units';\n\n/**\n * How a number shows, speaks and reads back, as plain data: `{ kind: 'fraction',\n * maxDenominator: 64 }`. Data rather than a function so a tagged value keeps its\n * presentation through JSON, history snapshots and `structuredClone`. The\n * behavior lives on the registered {@link DisplayKind} of the same `kind`.\n */\nexport interface Display {\n readonly kind: string;\n /** What ±Infinity reads as under this display — `'never'` on a timeout.\n * Default `∞`, spoken `infinity`. Honored by every kind. */\n readonly infinity?: InfinityText;\n readonly [option: string]: unknown;\n}\n\n/** A word for infinity. A string is both shown and spoken. `negative` is the\n * word for −Infinity, default `−∞`. */\nexport type InfinityText =\n | string\n | { readonly text: string; readonly spoken?: string; readonly negative?: string | { readonly text: string; readonly spoken?: string } };\n\n/** `display` with `text` as its word for infinity: `endless(unit('ms'), 'never')`. */\nexport function endless<D extends Display>(display: D, text: InfinityText): D {\n return { ...display, infinity: text };\n}\n\n/** A number that carries its unit, its display, or both. */\nexport interface Tagged {\n value: number;\n /** The unit `value` is measured in. Absent is the base unit. */\n unit?: Unit;\n display?: Display;\n}\n\n/**\n * A number anywhere the engine takes one: bare, which costs nothing, or\n * {@link Tagged}, which keeps its unit and display as it moves. Every reader\n * goes through {@link amount}, and every writer through {@link retag}, so a\n * value leaves in the shape it arrived in.\n */\nexport type Quantity = number | Tagged;\n\n/** The number a quantity holds. */\nexport function amount(q: Quantity): number {\n return typeof q === 'number' ? q : q.value;\n}\n\n/**\n * `next` in the shape of `q`: a bare number stays bare, and a tagged one keeps\n * its unit and display. What an editor calls when it changes a value it was\n * handed, so the presentation survives the edit.\n */\nexport function retag<Q extends Quantity>(q: Q, next: number): Q {\n return (typeof q === 'number' ? next : { ...(q as Tagged), value: next }) as Q;\n}\n\n/** A tagged quantity. `display` and `unit` are left off when absent, so the\n * JSON carries only what was set. */\nexport function tag(value: number, display?: Display, unit?: Unit): Tagged {\n const t: Tagged = { value };\n if (unit !== undefined) t.unit = unit;\n if (display !== undefined) t.display = display;\n return t;\n}\n\n/** The display `q` carries, else `fallback`. A value's own tag wins over the\n * default of whatever shows it. */\nexport function displayOf(q: Quantity, fallback?: Display): Display | undefined {\n return (typeof q === 'number' ? undefined : q.display) ?? fallback;\n}\n\n/** The unit `q` is measured in, when it says. */\nexport function unitOf(q: Quantity): Unit | undefined {\n return typeof q === 'number' ? undefined : q.unit;\n}\n","import type { Quantity } from './quantity';\n\n/**\n * Units — a tiny customizable unit system.\n *\n * The kit stores all coordinates as bare numbers in a single base unit\n * chosen by the consumer app. To make API call sites self-documenting,\n * the public surface accepts `UnitValue` — either a bare number (interpreted\n * as base units) or a `{ value, unit }` tag that's resolved against a\n * `UnitSystem` at the API boundary. Internals never see units.\n *\n * An entry is affine — `base = value * factor + offset` — so a scale that\n * puts zero somewhere else (degC against K) is expressible. Arithmetic\n * across units is `resolveUnitExpr`; a plane whose axes measure different\n * things resolves through `resolveAxes`.\n */\n\n/** A unit name (e.g. `'in'`, `'ft'`, `'mm'`). Looked up in a `UnitSystem`. */\nexport type Unit = string;\n\n/** What one unit is worth in base units: `base = value * factor + offset`. */\nexport interface UnitScale {\n factor: number;\n /** Where this unit puts zero, in base units. Absent is 0 — a pure scale. */\n offset?: number;\n}\n\n/** One unit's conversion. A bare number is the `{ factor }` shorthand. */\nexport type UnitEntry = number | UnitScale;\n\n/** Conversion table mapping unit names to their scale against a base unit. */\nexport interface UnitSystem {\n /** Name of the base unit, e.g. 'in'. All conversions resolve to this. */\n base: Unit;\n /** How to reach base units from each unit. The base unit's entry is 1. */\n units: Record<Unit, UnitEntry>;\n}\n\n/**\n * One unit's scale, with the bare-number shorthand widened and the offset\n * defaulted — what every conversion in the kit reads. Throws if the system\n * does not carry the unit.\n */\nexport function unitScale(unitSystem: UnitSystem, unit: Unit): Required<UnitScale> {\n const entry = unitSystem.units[unit];\n if (entry === undefined) {\n const known = Object.keys(unitSystem.units).join(', ') || '(none)';\n throw new Error(\n `unknown unit '${unit}' (system base: '${unitSystem.base}', known units: ${known})`,\n );\n }\n return entryScale(entry);\n}\n\n/** An entry's scale, with the bare-number shorthand widened and the offset defaulted. */\nexport function entryScale(entry: UnitEntry): Required<UnitScale> {\n return typeof entry === 'number'\n ? { factor: entry, offset: 0 }\n : { factor: entry.factor, offset: entry.offset ?? 0 };\n}\n\n/** Value at a unit-aware API boundary: bare number (in base units) or `{ value, unit }` tag. */\nexport type UnitValue = number | { value: number; unit: Unit };\n\n/**\n * Resolve a UnitValue to a number in base units.\n * - bare number, or a quantity tagged with no unit: its value, as base\n * - tagged: looks up factor; throws if unit not in unit system\n */\nexport function resolveUnit(v: UnitValue | Quantity, unitSystem?: UnitSystem): number {\n if (typeof v === 'number') return v;\n if (v.unit === undefined) return v.value;\n if (!unitSystem) {\n throw new Error(\n `resolveUnit: tagged value { value: ${v.value}, unit: '${v.unit}' } requires a UnitSystem`,\n );\n }\n const { factor, offset } = scaleOrThrow('resolveUnit', unitSystem, v.unit);\n return v.value * factor + offset;\n}\n\n/**\n * Format a base-unit number as a string in the named display unit.\n * e.g. formatUnit(36, 'ft', IMPERIAL_INCHES) => '3ft'\n * Default precision: 2. Trailing zeros trimmed.\n */\nexport function formatUnit(\n baseValue: number,\n displayUnit: Unit,\n unitSystem: UnitSystem,\n opts?: { precision?: number; suffix?: boolean },\n): string {\n const { factor, offset } = scaleOrThrow('formatUnit', unitSystem, displayUnit);\n const precision = opts?.precision ?? 2;\n const suffix = opts?.suffix ?? true;\n const display = (baseValue - offset) / factor;\n // Trim trailing zeros (and a dangling decimal point) without losing precision.\n let s = display.toFixed(precision);\n if (Number(s) === 0) s = s.replace(/^-/, '');\n if (s.includes('.')) {\n s = s.replace(/0+$/, '').replace(/\\.$/, '');\n }\n return suffix ? `${s}${displayUnit}` : s;\n}\n\n/** One of something for each axis of a plane. */\nexport interface PerAxis<T> {\n x: T;\n y: T;\n}\n\n/** A plane's units: one system for both axes, or one each — a chart whose x\n * is time and whose y is a value. */\nexport type PlaneUnits = UnitSystem | PerAxis<UnitSystem>;\n\n/** A measure on a plane: one value for both axes, or one each. */\nexport type PlaneValue = UnitValue | Quantity | PerAxis<UnitValue | Quantity>;\n\n/** The unit system `units` gives one axis. */\nexport function axisUnits(units: PlaneUnits | undefined, axis: 'x' | 'y'): UnitSystem | undefined {\n return units === undefined || 'base' in units ? units : units[axis];\n}\n\n/** `v` in base units on each axis, every axis resolved against its own system. */\nexport function resolveAxes(v: PlaneValue, units?: PlaneUnits): PerAxis<number> {\n const perAxis = typeof v === 'object' && 'x' in v;\n const on = (axis: 'x' | 'y'): number => {\n try {\n return resolveUnit(perAxis ? v[axis] : v, axisUnits(units, axis));\n } catch (e) {\n throw new Error(`${axis} axis: ${e instanceof Error ? e.message : String(e)}`);\n }\n };\n return { x: on('x'), y: on('y') };\n}\n\n/** A base-unit point as text, each axis in its own display unit. */\nexport function formatAxes(\n base: PerAxis<number>,\n display: Unit | PerAxis<Unit>,\n units: PlaneUnits,\n opts?: { precision?: number; suffix?: boolean },\n): PerAxis<string> {\n const on = (axis: 'x' | 'y'): string =>\n formatUnit(base[axis], typeof display === 'string' ? display : display[axis], axisUnits(units, axis)!, opts);\n return { x: on('x'), y: on('y') };\n}\n\n/** `unitScale`, with the caller's name in front of the message. */\nfunction scaleOrThrow(caller: string, unitSystem: UnitSystem, unit: Unit): Required<UnitScale> {\n try {\n return unitScale(unitSystem, unit);\n } catch (e) {\n throw new Error(`${caller}: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n/** Imperial unit system with base 'in'. */\nexport const IMPERIAL_INCHES: UnitSystem = {\n base: 'in',\n units: { in: 1, ft: 12, yd: 36, mi: 63360 },\n};\n\n/** Metric unit system with base 'mm'. */\nexport const METRIC_MM: UnitSystem = {\n base: 'mm',\n units: { mm: 1, cm: 10, m: 1000, km: 1_000_000 },\n};\n\n/** Angle unit system with base 'rad'. */\nexport const ANGLE_RADIANS: UnitSystem = {\n base: 'rad',\n units: { rad: 1, deg: Math.PI / 180, turn: Math.PI * 2 },\n};\n\n/** Pixel unit system — sole unit is the base. */\nexport const PIXELS: UnitSystem = {\n base: 'px',\n units: { px: 1 },\n};\n","import { entryScale, type UnitEntry } from './units';\n\n/**\n * The real MINUS SIGN (U+2212), which display formatting uses instead of the\n * ASCII HYPHEN-MINUS (U+002D) that `toLocaleString` and template literals\n * produce. It is the same visual width as `+`, so columns of signed numbers\n * align.\n */\nexport const MINUS_SIGN = '−';\n\n/**\n * Formats a number for display, substituting {@link MINUS_SIGN} for the ASCII\n * hyphen `toLocaleString` emits. Non-finite values stringify as-is.\n */\nexport function formatNumber(value: number, options?: Intl.NumberFormatOptions): string {\n const formatted = Number.isFinite(value)\n ? unsignedZero(value, (n) => n.toLocaleString(undefined, options))\n : String(value);\n return formatted.replace(/^-/, MINUS_SIGN);\n}\n\n/**\n * `value` through `format`, with a negative that rounds to zero shown as the\n * zero it reads as: −0.0004 at two places is `0`, not `−0`.\n */\nexport function unsignedZero(value: number, format: (n: number) => string): string {\n const shown = format(value);\n return value <= 0 && shown === format(-0) ? format(0) : shown;\n}\n\n/**\n * Parses a string that may carry {@link MINUS_SIGN} in place of the ASCII\n * hyphen. The inverse of {@link formatNumber} for any editing surface that\n * renders its value through it and reads the edited text back.\n */\nexport function parseSignedNumber(text: string): number {\n return Number(text.replace(MINUS_SIGN, '-'));\n}\n\n/** One unsigned number in the text `readNumber` sees: digits, with an optional `.` fraction. */\nconst TERM_NUMBER = String.raw`\\d+(?:\\.\\d+)?|\\.\\d+`;\n\nconst DECIMAL_NUMBER = /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?$/i;\n\n/** Powers of ten a typed magnitude suffix stands for. */\nconst EXPONENTS: Record<string, number> = { k: 3, m: 6, b: 9, t: 12 };\n\n/**\n * Formats a number the way a `compact` readout shows it: below 1,000 at\n * `decimals` places, from 1,000 up at three significant figures with a magnitude\n * suffix (`40.0K`, `294K`, `2.00M`), so the readout holds one width whatever the\n * value. Always `en-US`, so {@link parseNumber} reads it back.\n */\nexport function formatCompact(value: number, decimals = 0): string {\n if (!Number.isFinite(value)) return formatNumber(value);\n // Asked of the value as it will be shown: 999.6 reads `1000`, which is a thousand.\n const options: Intl.NumberFormatOptions =\n Number(Math.abs(value).toFixed(decimals)) < 1000\n ? { useGrouping: false, minimumFractionDigits: decimals, maximumFractionDigits: decimals }\n : { notation: 'compact', minimumSignificantDigits: 3, maximumSignificantDigits: 3 };\n return unsignedZero(value, (n) => n.toLocaleString('en-US', options)).replace(/^-/, MINUS_SIGN);\n}\n\n/**\n * Reads a typed number: anything {@link parseSignedNumber} reads, plus the\n * locale's group and decimal separators (`40,000` and `2.5` in `en-US`,\n * `40.000` and `2,5` in `de-DE`) and a `k`/`m`/`b`/`t` suffix in either case\n * (`2.5m` is 2,500,000). Empty text is NaN rather than zero.\n *\n * Text the locale's form does not read is tried as `en-US`, so `1.5` is still\n * one and a half in `de-DE`; where both read, the locale wins. A locale that\n * groups with a space accepts any space there, since a keyboard types a plain\n * one where `Intl` writes a no-break space.\n *\n * Given `units` — a suffix mapped to the factor it scales by — a trailing unit\n * name is read first: the longest match wins, exact case before any case, and\n * a unit beats a magnitude suffix, so with `m` accepted `2m` is `2 * units.m`.\n */\nexport function parseNumber(text: string, units?: Readonly<UnitTable>, locale = 'en-US'): number {\n const n = readNumber(delocalized(text, locale), units);\n return Number.isNaN(n) && locale !== 'en-US' ? readNumber(delocalized(text, 'en-US'), units) : n;\n}\n\n/** `parseNumber` once every number in the text is in `en-US` form with no grouping. */\nfunction readNumber(text: string, units?: Readonly<UnitTable>): number {\n if (units) {\n units = withSpellings(units);\n const trimmed = text.trim();\n const name = unitSuffixOf(trimmed, units);\n if (name !== undefined) {\n const terms = compoundTermsOf(trimmed, units);\n if (terms !== undefined && terms.length > 1) return compoundValue(terms, trimmed, units);\n const { factor, offset } = entryScale(units[name]!);\n return scaled(readNumber(trimmed.slice(0, -name.length)), factor) + offset;\n }\n }\n let t = text.trim().replace(MINUS_SIGN, '-');\n const exponent = EXPONENTS[t.slice(-1).toLowerCase()];\n if (exponent !== undefined) t = t.slice(0, -1).trimEnd();\n // `Number` alone also reads `0x10`, `0b11`, and `1e400`, none of which is a typed amount.\n if (!DECIMAL_NUMBER.test(t)) return Number.NaN;\n // Scaled through the exponent rather than by multiplying: 1.1 * 1000 is 1100.0000000000002.\n const n = Number(exponent === undefined ? t : `${t}e${exponent}`);\n return Number.isFinite(n) ? n : Number.NaN;\n}\n\ninterface NumberShape {\n /** A run of digits and separators in a text, a candidate number. */\n run: RegExp;\n /** Whether a run is a whole number in the locale's form. */\n whole: RegExp;\n group: RegExp;\n decimal: string;\n /** The locale's own digits, where they are not `0`–`9`, each mapped to its Latin one. */\n digits?: { pattern: RegExp; latin: ReadonlyMap<string, string> };\n}\n\nconst shapes = new Map<string, NumberShape>();\n\n/** How `locale` writes a number, read off `Intl`: its separators and group sizes (`12,34,567` in `en-IN`). */\nfunction shapeOf(locale: string): NumberShape {\n const known = shapes.get(locale);\n if (known) return known;\n const parts = new Intl.NumberFormat(locale).formatToParts(123_456_789.5);\n const sizes = parts.filter((p) => p.type === 'integer').map((p) => p.value.length);\n const primary = sizes.at(-1)!;\n const secondary = sizes.length > 2 ? sizes.at(-2)! : primary;\n const groupChar = parts.find((p) => p.type === 'group')?.value ?? ',';\n const decimal = parts.find((p) => p.type === 'decimal')?.value ?? '.';\n // CLDR versions disagree between a straight and a curly apostrophe, as keyboards do.\n const g = /\\s/.test(groupChar) ? String.raw`\\s` : /['’]/.test(groupChar) ? `'’` : escapeClass(groupChar);\n const own = [...new Intl.NumberFormat(locale, { useGrouping: false }).format(9_876_543_210)].reverse();\n const digits = own.join('') === '0123456789'\n ? undefined\n : { pattern: new RegExp(`[${own.join('')}]`, 'gu'), latin: new Map(own.map((c, i) => [c, String(i)])) };\n const d = escapeClass(decimal);\n const integer = String.raw`\\d{1,${secondary}}(?:[${g}]\\d{${secondary}})*[${g}]\\d{${primary}}|\\d*`;\n const shape: NumberShape = {\n run: new RegExp(String.raw`(?:\\d|[${d}]\\d)(?:[\\d${g}${d}]*\\d)?[${d}]?`, 'g'),\n whole: new RegExp(String.raw`^(?:${integer})(?:[${d}]\\d*)?$`),\n group: new RegExp(`[${g}]`, 'g'),\n decimal,\n digits,\n };\n shapes.set(locale, shape);\n return shape;\n}\n\nexport const escapeClass = (c: string) => c.replace(/[\\\\\\]^-]/g, '\\\\$&');\n\n/** `text` with each number in `locale`'s form rewritten ungrouped with a `.` decimal, and the rest untouched. */\nfunction delocalized(text: string, locale: string): string {\n const shape = shapeOf(locale);\n return latinDigits(text, locale).replace(shape.run, (run) =>\n shape.whole.test(run) ? run.replace(shape.group, '').replace(shape.decimal, '.') : run,\n );\n}\n\n/**\n * `text` with `locale`'s own digits written `0`–`9` and the bidi marks `Intl`\n * puts around a sign (`؜-` in `ar-EG`) dropped.\n */\nexport function latinDigits(text: string, locale: string): string {\n const { digits } = shapeOf(locale);\n const t = text.replace(BIDI_MARKS, '');\n return digits ? t.replace(digits.pattern, (c) => digits.latin.get(c)!) : t;\n}\n\nconst BIDI_MARKS = /[\\u061c\\u200e\\u200f]/g;\n\n/**\n * The number inside text that wraps one in symbols, such as a currency sign\n * or code on either side: its sign, its digits in `locale`'s form or\n * `en-US`'s, and a magnitude suffix typed against them, ready for\n * {@link parseNumber}. Empty when the text holds no number.\n */\nexport function numberWithin(text: string, locale: string): string {\n const t = latinDigits(text, locale);\n const m = new RegExp(shapeOf(locale).run.source).exec(t);\n if (!m) return '';\n const around = t.slice(0, m.index) + t.slice(m.index + m[0].length);\n const suffix = /^[kmbt](?!\\p{L})/iu.exec(t.slice(m.index + m[0].length))?.[0] ?? '';\n return `${/[-\\u2212]/.test(around) ? '-' : ''}${m[0]}${suffix}`;\n}\n\n/** The mark `locale` writes before a fraction: `.` in `en-US`, `,` in `de-DE`. */\nexport const decimalOf = (locale: string): string => shapeOf(locale).decimal;\n\n/** Suffixes a person may type, each mapped to its conversion into the shown unit. */\nexport type UnitTable = Record<string, UnitEntry>;\n\n/**\n * Units that are written more than one way. A table accepting any spelling\n * accepts them all: `\"` wherever `in` is, `ft` wherever `'` is. The primes and\n * curly quotes are there because a keyboard substitutes them for the marks.\n */\nconst SPELLINGS: readonly (readonly string[])[] = [\n ['in', '\"', '″', '”'],\n ['ft', \"'\", '′', '’'],\n];\n\nexport function withSpellings(units: Readonly<UnitTable>): Readonly<UnitTable> {\n let out: UnitTable | undefined;\n for (const group of SPELLINGS) {\n const known = group.find((n) => units[n] !== undefined);\n if (known === undefined) continue;\n for (const n of group) {\n if (units[n] !== undefined) continue;\n out ??= { ...units };\n out[n] = units[known]!;\n }\n }\n return out ?? units;\n}\n\n/** Divided by the reciprocal below 1: 12 * 0.1 is 1.2000000000000002, 12 / 10 is 1.2. */\nfunction scaled(n: number, factor: number): number {\n return factor < 1 ? n / (1 / factor) : n * factor;\n}\n\n/**\n * The unit names in `text`, in reading order, when every one of them closes a\n * `<number><unit>` term — which is what tells `5ft 3in` from a malformed\n * `5ft 3`. Undefined when the text is not a run of whole terms.\n */\nfunction compoundTermsOf(text: string, units: Readonly<UnitTable>): string[] | undefined {\n const names: string[] = [];\n let rest = text.trimEnd();\n while (rest !== '') {\n const name = unitSuffixOf(rest, units);\n if (name === undefined) return undefined;\n names.push(name);\n const before = rest.slice(0, -name.length);\n const m = new RegExp(`(?:${TERM_NUMBER})\\\\s*$`).exec(before);\n if (!m) return undefined;\n rest = before.slice(0, m.index).trimEnd();\n // A sign leads the whole value, so it ends the walk rather than a term.\n if (rest === '-' || rest === '+' || rest === MINUS_SIGN) rest = '';\n }\n return names.length === 0 ? undefined : names.reverse();\n}\n\n/**\n * `5ft 3in` as one number in the shown unit. Every term scales and they sum;\n * a leading sign carries across all of them, so `-5ft 3in` is −63in and not\n * −57. Offsets have no meaning in a sum — 1K + 2degC is not a temperature —\n * so a term carrying one makes the whole value unreadable.\n */\nfunction compoundValue(names: string[], text: string, units: Readonly<UnitTable>): number {\n const digits = text.match(new RegExp(TERM_NUMBER, 'g'));\n if (!digits || digits.length !== names.length) return Number.NaN;\n const sign = /^\\s*[-\\u2212]/.test(text) ? -1 : 1;\n let total = 0;\n for (const [i, name] of names.entries()) {\n const { factor, offset } = entryScale(units[name]!);\n if (offset !== 0) return Number.NaN;\n total += scaled(Number(digits[i]), factor);\n }\n return sign * total;\n}\n\n/** The longest unit name `text` ends with — exact case first, then any case. */\nfunction unitSuffixOf(text: string, units: Readonly<UnitTable>): string | undefined {\n const names = Object.keys(units).filter((n) => n !== '').sort((a, b) => b.length - a.length);\n const lower = text.toLowerCase();\n return names.find((n) => text.endsWith(n)) ?? names.find((n) => lower.endsWith(n.toLowerCase()));\n}\n","import type { Display } from './quantity';\nimport type { Unit } from './units';\nimport { MINUS_SIGN, unsignedZero } from './number';\n\n/**\n * One run of a formatted value, named for what it is: `number`, `unit`,\n * `currency`, `numerator`, `literal`. The HTML serialization marks each\n * non-literal run with `data-part`, which is the whole styling surface.\n */\nexport interface Part {\n type: string;\n value: string;\n}\n\n/** What formatting and parsing need beyond the value and its display. */\nexport interface FormatContext {\n /** BCP 47 locale. Default `en-US`. */\n locale: string;\n /** The unit the value is measured in, from its tag. */\n unit?: Unit;\n}\n\n/**\n * The behavior behind one `Display.kind`. `format` is required; `speak`\n * defaults to the formatted text, `parse` to `parseNumber`, and `mathml` to\n * nothing, which means the kind has no MathML form.\n */\nexport interface DisplayKind<D extends Display = Display> {\n kind: D['kind'];\n format(value: number, display: D, ctx: FormatContext): Part[];\n speak?(value: number, display: D, ctx: FormatContext): string;\n parse?(text: string, display: D, ctx: FormatContext): number;\n mathml?(value: number, display: D, ctx: FormatContext): string | undefined;\n}\n\nconst ESCAPES: Record<string, string> = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' };\n\n/** `s` safe to interpolate into the HTML and MathML the kinds write. */\nexport function escapeMarkup(s: string): string {\n return s.replace(/[&<>\"]/g, (c) => ESCAPES[c]!);\n}\n\n/** Parts joined into plain text. */\nexport function textOf(parts: readonly Part[]): string {\n return parts.map((p) => p.value).join('');\n}\n\n/** A number run from `Intl`, with the real minus sign. */\nexport function numberPart(value: number, locale: string, options?: Intl.NumberFormatOptions): Part {\n return { type: 'number', value: signed(unsignedZero(value, (n) => n.toLocaleString(locale, options))) };\n}\n\n/** `-` swapped for {@link MINUS_SIGN} at the front of already-formatted text. */\nexport function signed(text: string): string {\n return text.replace(/^-/, MINUS_SIGN);\n}\n\n/** A leading minus sign read aloud: `−3` is spoken `minus 3`, which a screen\n * reader otherwise renders as a dash or drops. */\nexport function spokenSign(text: string): string {\n return text.replace(/^[-−]/, 'minus ');\n}\n\n/** `singular` or `plural` for `value`, by the locale's plural rules. */\nexport function plural(value: number, locale: string, singular: string, pluralForm: string): string {\n return new Intl.PluralRules(locale).select(value) === 'one' ? singular : pluralForm;\n}\n\n/**\n * `Intl.NumberFormat`'s parts, with the digit runs — sign, integer, group,\n * decimal, fraction — merged into one `number` part, so a styling layer sees\n * the number as one thing and its unit or symbol as another.\n */\nexport function intlParts(value: number, locale: string, options: Intl.NumberFormatOptions): Part[] {\n const out: Part[] = [];\n const nf = new Intl.NumberFormat(locale, options);\n const shown = value <= 0 && nf.format(value) === nf.format(-0) ? 0 : value;\n for (const p of nf.formatToParts(shown)) {\n const type = DIGIT_RUNS.has(p.type) ? 'number' : p.type;\n const v = p.type === 'minusSign' ? MINUS_SIGN : p.value;\n const last = out[out.length - 1];\n if (type === 'number' && last?.type === 'number') last.value += v;\n else out.push({ type, value: v });\n }\n return out;\n}\n\nconst DIGIT_RUNS = new Set(['minusSign', 'plusSign', 'integer', 'group', 'decimal', 'fraction']);\n","import { intlParts, spokenSign, textOf, type DisplayKind } from '../kind';\nimport { formatCompact, parseNumber } from '../number';\n\n/** A plain number. `places` fixes the decimals, trailing zeros included;\n * otherwise up to `maxPlaces` (default 3) show and trailing zeros drop. */\nexport type DecimalDisplay = {\n kind: 'decimal';\n places?: number;\n maxPlaces?: number;\n /** Thousands separators. Default true. */\n grouping?: boolean;\n};\n\n/** A {@link DecimalDisplay}. */\nexport function decimal(options: Omit<DecimalDisplay, 'kind'> = {}): DecimalDisplay {\n return { kind: 'decimal', ...options };\n}\n\n/** The built-in `decimal` kind, to spread into a `registerDisplayKind` replacement. */\nexport const decimalKind: DisplayKind<DecimalDisplay> = {\n kind: 'decimal',\n format: (value, d, ctx) => intlParts(value, ctx.locale, decimalOptions(d)),\n speak: (value, d, ctx) => spokenSign(textOf(intlParts(value, ctx.locale, decimalOptions(d)))),\n parse: (text, _d, ctx) => parseNumber(text, undefined, ctx.locale),\n};\n\nfunction decimalOptions(d: DecimalDisplay): Intl.NumberFormatOptions {\n const grouping = d.grouping ?? true;\n return d.places === undefined\n ? { maximumFractionDigits: d.maxPlaces ?? 3, useGrouping: grouping }\n : { minimumFractionDigits: d.places, maximumFractionDigits: d.places, useGrouping: grouping };\n}\n\n/** A whole number, rounded. */\nexport type IntegerDisplay = {\n kind: 'integer';\n grouping?: boolean;\n};\n\n/** An {@link IntegerDisplay}. */\nexport function integer(options: Omit<IntegerDisplay, 'kind'> = {}): IntegerDisplay {\n return { kind: 'integer', ...options };\n}\n\n/** The built-in `integer` kind, to spread into a `registerDisplayKind` replacement. */\nexport const integerKind: DisplayKind<IntegerDisplay> = {\n kind: 'integer',\n format: (value, d, ctx) =>\n intlParts(value, ctx.locale, { maximumFractionDigits: 0, useGrouping: d.grouping ?? true }),\n speak: (value, d, ctx) =>\n spokenSign(textOf(integerKind.format(value, d, ctx))),\n parse: (text, _d, ctx) => Math.round(parseNumber(text, undefined, ctx.locale)),\n};\n\n/**\n * Below 1,000 at `places` decimals, from 1,000 up at three significant figures\n * with a magnitude suffix (`40.0K`, `2.00M`), so a readout holds one width.\n * Spoken long: `2 million`.\n */\nexport type CompactDisplay = {\n kind: 'compact';\n places?: number;\n};\n\n/** A {@link CompactDisplay}. */\nexport function compact(options: Omit<CompactDisplay, 'kind'> = {}): CompactDisplay {\n return { kind: 'compact', ...options };\n}\n\n/** The built-in `compact` kind, to spread into a `registerDisplayKind` replacement. */\nexport const compactKind: DisplayKind<CompactDisplay> = {\n kind: 'compact',\n format: (value, d) => {\n const text = formatCompact(value, d.places ?? 0);\n const m = /^(.*?\\d)([A-Za-z]+)$/.exec(text);\n return m\n ? [\n { type: 'number', value: m[1]! },\n { type: 'compact', value: m[2]! },\n ]\n : [{ type: 'number', value: text }];\n },\n speak: (value, d, ctx) =>\n spokenSign(\n textOf(\n Math.abs(value) < 1000\n ? compactKind.format(value, d, ctx)\n : intlParts(value, ctx.locale, {\n notation: 'compact',\n compactDisplay: 'long',\n maximumSignificantDigits: 3,\n }),\n ),\n ),\n parse: (text) => parseNumber(text),\n};\n","import { escapeMarkup, intlParts, numberPart, spokenSign, textOf, type DisplayKind, type Part } from '../kind';\nimport { latinDigits, MINUS_SIGN, parseNumber, unsignedZero } from '../number';\n\n/** A share of one as a percentage: 0.25 shows `25%`. Typed text reads as\n * percent with or without the sign. */\nexport type PercentDisplay = {\n kind: 'percent';\n /** Most decimals shown. Default 0. */\n places?: number;\n};\n\n/** A {@link PercentDisplay}. */\nexport function percent(options: Omit<PercentDisplay, 'kind'> = {}): PercentDisplay {\n return { kind: 'percent', ...options };\n}\n\n/** The built-in `percent` kind, to spread into a `registerDisplayKind` replacement. */\nexport const percentKind: DisplayKind<PercentDisplay> = {\n kind: 'percent',\n format: (value, d, ctx) =>\n intlParts(value, ctx.locale, { style: 'percent', maximumFractionDigits: d.places ?? 0 }),\n speak: (value, d, ctx) =>\n spokenSign(\n textOf(\n intlParts(value * 100, ctx.locale, {\n style: 'unit',\n unit: 'percent',\n unitDisplay: 'long',\n maximumFractionDigits: d.places ?? 0,\n }),\n ),\n ),\n parse: (text, _d, ctx) => parseNumber(withoutPercentSign(text, ctx.locale), undefined, ctx.locale) / 100,\n};\n\n/**\n * Percent text without its sign, which a locale writes after the number\n * (`25%`), before it (`%25` in `tr-TR`, inside the minus), as `٪`, or wrapped\n * in bidi marks.\n */\nfunction withoutPercentSign(text: string, locale: string): string {\n const m = /^\\s*([-+\\u2212]?)\\s*[%٪]?\\s*(.*?)\\s*[%٪]?\\s*$/su.exec(latinDigits(text, locale));\n return m ? m[1] + m[2] : text;\n}\n\n/**\n * The nearest fraction whose denominator is at most `maxDenominator`, as\n * `[numerator, denominator]` in lowest terms with the sign on the numerator.\n * Walks the continued fraction and settles the last step on the best\n * semiconvergent, which is the closest any denominator in range can get.\n */\nexport function nearestFraction(x: number, maxDenominator: number): [number, number] {\n if (!Number.isFinite(x)) return [x, 1];\n const sign = x < 0 ? -1 : 1;\n const target = Math.abs(x);\n let [h0, h1, k0, k1] = [0, 1, 1, 0];\n let y = target;\n for (let i = 0; i < 64; i++) {\n const a = Math.floor(y);\n const k2 = a * k1 + k0;\n if (k2 > maxDenominator) {\n const t = Math.floor((maxDenominator - k0) / k1);\n const [hs, ks] = [t * h1 + h0, t * k1 + k0];\n if (Math.abs(hs / ks - target) < Math.abs(h1 / k1 - target)) [h1, k1] = [hs, ks];\n break;\n }\n [h0, h1, k0, k1] = [h1, a * h1 + h0, k1, k2];\n const rest = y - a;\n if (rest < 1e-12 || Math.abs(h1 / k1 - target) < 1e-15) break;\n y = 1 / rest;\n }\n return [sign * h1, k1];\n}\n\n/**\n * `nearestFraction` with the denominator budget divided by the value's size, so a fraction never carries more\n * precision than a reader can take in: 749.8 is `750`, not `15746/21`, while values under 1 keep all of it.\n */\nexport function readableFraction(x: number, maxDenominator: number): [number, number] {\n return nearestFraction(x, Math.max(1, Math.floor(maxDenominator / Math.max(1, Math.abs(x)))));\n}\n\n/**\n * A constant a fraction can count in: `π`, so 3π/4 shows as `3π/4` rather\n * than `2.356`. `names` are what may be typed for it besides the symbol.\n */\nexport interface NamedConstant {\n symbol: string;\n value: number;\n /** How it is read aloud: `pi`. */\n spoken: string;\n names?: readonly string[];\n}\n\n/** The constants `fraction({ of })` knows by symbol. */\nexport const CONSTANTS = {\n π: { symbol: 'π', value: Math.PI, spoken: 'pi', names: ['pi'] },\n τ: { symbol: 'τ', value: 2 * Math.PI, spoken: 'tau', names: ['tau'] },\n e: { symbol: 'e', value: Math.E, spoken: 'e' },\n} as const satisfies Record<string, NamedConstant>;\n\n/** How a `fraction` display picks and writes its fraction. */\nexport type FractionOptions = {\n /** Largest denominator for a value under 1, default 64; a larger value gets proportionally fewer. */\n maxDenominator?: number;\n /**\n * `inline` (default) writes `1/12`. `diagonal` writes `¹⁄₁₂` — superscript\n * digits, the fraction slash, subscript digits — so the text itself is\n * diagonal wherever it is drawn, CSS or not. `stacked` writes the text and\n * HTML `inline` does and asks to be drawn as its MathML form, numerator over\n * denominator, wherever a renderer draws MathML (`QuantityText` does).\n */\n form?: 'inline' | 'diagonal' | 'stacked';\n} & (\n | { mixed?: boolean; of?: never }\n | {\n /**\n * Count in a constant: with `π`, 3π/4 shows `3π/4` and is spoken `3 pi\n * over 4`. Excludes `mixed`, since `1 1/2π` reads as 1 + ½π.\n */\n of: keyof typeof CONSTANTS | NamedConstant;\n mixed?: never;\n }\n);\n\n/**\n * A value as the nearest fraction: 1/12 shows `1/12` and is spoken `1 over 12`.\n * `mixed` splits a whole part off (`1 1/2`); a whole value shows as an integer.\n * Has a MathML form, as `<mfrac>`.\n */\nexport type FractionDisplay = { kind: 'fraction' } & FractionOptions;\n\nconst SUPERSCRIPT = '⁰¹²³⁴⁵⁶⁷⁸⁹';\nconst SUBSCRIPT = '₀₁₂₃₄₅₆₇₈₉';\n\nconst inDigits = (n: number, digits: string) => String(n).replace(/\\d/g, (c) => digits[Number(c)]!);\nconst fromDigits = (text: string, digits: string) =>\n Number([...text].map((c) => digits.indexOf(c)).join(''));\n\n/** A {@link FractionDisplay}. */\nexport function fraction(options: FractionOptions = {}): FractionDisplay {\n return { kind: 'fraction', ...options };\n}\n\nfunction constantOf(d: FractionDisplay): NamedConstant | undefined {\n return typeof d.of === 'string' ? CONSTANTS[d.of] : d.of;\n}\n\n/** A fraction's pieces: sign, whole part (mixed only), numerator, denominator,\n * and the constant they count in. */\nfunction fractionPieces(value: number, d: FractionDisplay) {\n const constant = constantOf(d);\n const [n, den] = readableFraction(constant ? value / constant.value : value, d.maxDenominator ?? 64);\n const negative = n < 0;\n const abs = Math.abs(n);\n const whole = d.mixed || den === 1 ? Math.floor(abs / den) : 0;\n return { negative, whole, num: abs - whole * den, den, constant };\n}\n\n/** A fraction typed inline (`1 1/2`) or diagonally (`1¹⁄₂`), else a plain number. */\nfunction parseFraction(text: string): number {\n const inline = /^\\s*([-−+]?)\\s*(?:(\\d+)\\s+)?(\\d+)\\s*[/⁄]\\s*(\\d+)\\s*$/.exec(text);\n const diagonal = /^\\s*([-−+]?)\\s*(\\d+)?\\s*([⁰¹²³⁴⁵⁶⁷⁸⁹]+)\\s*[/⁄]\\s*([₀₁₂₃₄₅₆₇₈₉]+)\\s*$/.exec(text);\n let magnitude: number;\n if (inline) magnitude = Number(inline[2] ?? 0) + Number(inline[3]) / Number(inline[4]);\n else if (diagonal) {\n magnitude = Number(diagonal[2] ?? 0) + fromDigits(diagonal[3]!, SUPERSCRIPT) / fromDigits(diagonal[4]!, SUBSCRIPT);\n } else return parseNumber(text);\n const sign = (inline ?? diagonal)![1];\n return sign === '-' || sign === MINUS_SIGN ? -magnitude : magnitude;\n}\n\nconst escape = (t: string) => t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/** The built-in `fraction` kind, to spread into a `registerDisplayKind` replacement. */\nexport const fractionKind: DisplayKind<FractionDisplay> = {\n kind: 'fraction',\n format: (value, d) => {\n if (!Number.isFinite(value)) return [{ type: 'number', value: String(value) }];\n const { negative, whole, num, den, constant } = fractionPieces(value, d);\n const diagonal = d.form === 'diagonal';\n const symbol: Part[] = constant ? [{ type: 'constant', value: constant.symbol }] : [];\n const parts: Part[] = [];\n if (negative) parts.push({ type: 'sign', value: MINUS_SIGN });\n if (num === 0) {\n if (whole === 0) return [...parts, { type: 'whole', value: '0' }];\n if (!(constant && whole === 1)) parts.push({ type: 'whole', value: String(whole) });\n return [...parts, ...symbol];\n }\n if (whole > 0) {\n parts.push({ type: 'whole', value: String(whole) });\n if (!diagonal) parts.push({ type: 'literal', value: ' ' });\n }\n if (diagonal) {\n parts.push(\n { type: 'numerator', value: inDigits(num, SUPERSCRIPT) },\n { type: 'literal', value: '⁄' },\n { type: 'denominator', value: inDigits(den, SUBSCRIPT) },\n ...symbol,\n );\n } else {\n if (!(constant && num === 1)) parts.push({ type: 'numerator', value: String(num) });\n parts.push(...symbol, { type: 'literal', value: '/' }, { type: 'denominator', value: String(den) });\n }\n return parts;\n },\n speak: (value, d) => {\n if (!Number.isFinite(value)) return String(value);\n const { negative, whole, num, den, constant } = fractionPieces(value, d);\n const counted = (n: number) => (!constant ? String(n) : n === 1 ? constant.spoken : `${n} ${constant.spoken}`);\n const words = [\n whole > 0 ? counted(whole) : num === 0 ? '0' : '',\n whole > 0 && num > 0 ? 'and' : '',\n num > 0 ? `${counted(num)} over ${den}` : '',\n ].filter(Boolean);\n return `${negative ? 'minus ' : ''}${words.join(' ')}`;\n },\n parse: (text, d) => {\n const constant = constantOf(d);\n if (!constant) return parseFraction(text);\n const spellings = [constant.symbol, ...(constant.names ?? [])].sort((a, b) => b.length - a.length);\n const token = new RegExp(spellings.map(escape).join('|'), 'i');\n if (!token.test(text)) return parseFraction(text);\n // With the constant taken out, a bare `/2` or nothing at all counts one of it.\n const coefficient = text.replace(token, '').replace(/^(\\s*[-−+]?\\s*)(?=[/⁄]|\\s*$)/, '$11');\n return parseFraction(coefficient) * constant.value;\n },\n mathml: (value, d) => {\n if (!Number.isFinite(value)) return undefined;\n const { negative, whole, num, den, constant } = fractionPieces(value, d);\n const counted = (n: number) => {\n if (!constant) return `<mn>${n}</mn>`;\n const mi = `<mi>${escapeMarkup(constant.symbol)}</mi>`;\n return n === 1 ? mi : `<mn>${n}</mn>${mi}`;\n };\n const body = [\n negative ? `<mo>${MINUS_SIGN}</mo>` : '',\n whole > 0 ? counted(whole) : num === 0 ? '<mn>0</mn>' : '',\n num > 0 ? `<mfrac>${num === 1 || !constant ? counted(num) : `<mrow>${counted(num)}</mrow>`}<mn>${den}</mn></mfrac>` : '',\n ].join('');\n return `<math>${body}</math>`;\n },\n};\n\n/** A value as a ratio `a:b` — 1/12 shows `1:12`, spoken `1 to 12`. */\nexport type RatioDisplay = {\n kind: 'ratio';\n /** Largest second term for a value under 1, default 64; a larger value gets proportionally fewer. */\n maxDenominator?: number;\n};\n\n/** A {@link RatioDisplay}. */\nexport function ratio(options: Omit<RatioDisplay, 'kind'> = {}): RatioDisplay {\n return { kind: 'ratio', ...options };\n}\n\n/** The built-in `ratio` kind, to spread into a `registerDisplayKind` replacement. */\nexport const ratioKind: DisplayKind<RatioDisplay> = {\n kind: 'ratio',\n format: (value, d) => {\n if (!Number.isFinite(value)) return [{ type: 'number', value: String(value) }];\n const [n, den] = readableFraction(value, d.maxDenominator ?? 64);\n return [\n { type: 'antecedent', value: String(n).replace(/^-/, MINUS_SIGN) },\n { type: 'literal', value: ':' },\n { type: 'consequent', value: String(den) },\n ];\n },\n speak: (value, d) => {\n if (!Number.isFinite(value)) return String(value);\n const [n, den] = readableFraction(value, d.maxDenominator ?? 64);\n return spokenSign(`${String(n).replace(/^-/, MINUS_SIGN)} to ${den}`);\n },\n parse: (text) => {\n const m = /^\\s*(.+?)\\s*:\\s*(.+?)\\s*$/.exec(text);\n return m ? parseNumber(m[1]!) / parseNumber(m[2]!) : parseNumber(text);\n },\n};\n\n/** A factor with a times sign: `2.5×`, spoken `2.5 times`. Typed `x` reads too. */\nexport type MultiplierDisplay = {\n kind: 'multiplier';\n /** Most decimals. Default 2. */\n places?: number;\n /** Default `×`. */\n symbol?: string;\n};\n\n/** A {@link MultiplierDisplay}. */\nexport function multiplier(options: Omit<MultiplierDisplay, 'kind'> = {}): MultiplierDisplay {\n return { kind: 'multiplier', ...options };\n}\n\n/** The built-in `multiplier` kind, to spread into a `registerDisplayKind` replacement. */\nexport const multiplierKind: DisplayKind<MultiplierDisplay> = {\n kind: 'multiplier',\n format: (value, d, ctx) => [\n numberPart(value, ctx.locale, { maximumFractionDigits: d.places ?? 2 }),\n { type: 'symbol', value: d.symbol ?? '×' },\n ],\n speak: (value, d, ctx) =>\n spokenSign(`${numberPart(value, ctx.locale, { maximumFractionDigits: d.places ?? 2 }).value} times`),\n parse: (text, d, ctx) => {\n const own = d.symbol !== undefined && text.trimEnd().endsWith(d.symbol)\n ? text.trimEnd().slice(0, -d.symbol.length)\n : text.replace(/\\s*[x×X]\\s*$/, '');\n return parseNumber(own, undefined, ctx.locale);\n },\n};\n\n/**\n * A zoom factor. At 2x and below a percentage reads naturally; past it a\n * multiplier is what people say, so 2.5 shows `2.5x`. Past 100x a tenth is\n * noise: `1009.74` shows `1,010x`. Typed text without a sign reads as percent.\n */\nexport type ZoomDisplay = {\n kind: 'zoom';\n};\n\n/** A {@link ZoomDisplay}. */\nexport function zoom(): ZoomDisplay {\n return { kind: 'zoom' };\n}\n\nfunction zoomParts(z: number): Part[] {\n if (!Number.isFinite(z)) return [{ type: 'number', value: String(z) }];\n const n = (v: number, grouping = false) =>\n ({\n type: 'number',\n value: unsignedZero(v, (x) => x.toLocaleString('en-US', { useGrouping: grouping, maximumFractionDigits: 1 }))\n .replace(/^-/, MINUS_SIGN),\n });\n if (z <= 2) return [n(Math.round(z * 100)), { type: 'percentSign', value: '%' }];\n if (z >= 100) return [n(Math.round(z), true), { type: 'symbol', value: 'x' }];\n return [n(Math.round(z * 10) / 10), { type: 'symbol', value: 'x' }];\n}\n\n/** The built-in `zoom` kind, to spread into a `registerDisplayKind` replacement. */\nexport const zoomKind: DisplayKind<ZoomDisplay> = {\n kind: 'zoom',\n format: (value) => zoomParts(value),\n speak: (value) =>\n spokenSign(\n zoomParts(value)\n .map((p) => (p.type === 'percentSign' ? ' percent' : p.type === 'symbol' ? ' times' : p.value))\n .join(''),\n ),\n parse: (text) => {\n const t = text.trim();\n if (/[x×X]$/.test(t)) return parseNumber(t.slice(0, -1));\n return parseNumber(t.replace(/%$/, '')) / 100;\n },\n};\n","import { intlParts, numberPart, plural, spokenSign, textOf, type DisplayKind, type Part } from '../kind';\nimport { decimalOf, escapeClass, latinDigits, numberWithin, parseNumber, type UnitTable } from '../number';\n\n/**\n * Units `Intl` can name aloud, by the symbol a field shows. A unit outside it\n * speaks through the display's `spoken` names, else as its symbol.\n */\nconst INTL_UNITS: Record<string, string> = {\n mm: 'millimeter',\n cm: 'centimeter',\n m: 'meter',\n km: 'kilometer',\n in: 'inch',\n '\"': 'inch',\n '″': 'inch',\n ft: 'foot',\n \"'\": 'foot',\n '′': 'foot',\n yd: 'yard',\n mi: 'mile',\n deg: 'degree',\n '°': 'degree',\n ms: 'millisecond',\n s: 'second',\n min: 'minute',\n h: 'hour',\n g: 'gram',\n kg: 'kilogram',\n L: 'liter',\n '%': 'percent',\n};\n\n/** Names for common units `Intl` has none for. */\nconst OWN_UNITS: Record<string, readonly [string, string]> = {\n px: ['pixel', 'pixels'],\n pt: ['point', 'points'],\n rad: ['radian', 'radians'],\n turn: ['turn', 'turns'],\n};\n\n/**\n * A number with its unit: `12mm`, spoken `12 millimeters`. The unit is the\n * display's, else the one the value is tagged with. `accepts` is what a person\n * may type, each unit mapped to its conversion into the shown one; compound\n * text such as `5ft 3in` reads when every term's unit is accepted.\n */\nexport type UnitDisplay = {\n kind: 'unit';\n unit?: string;\n /** Most decimals, trailing zeros dropped. Default 2. */\n places?: number;\n /** A space between number and unit. Default false. */\n space?: boolean;\n accepts?: UnitTable;\n /** Singular and plural names, for a unit `Intl` cannot name. */\n spoken?: readonly [string, string];\n};\n\n/** A {@link UnitDisplay} in `name`. With no name, the unit comes from the value's tag. */\nexport function unit(name?: string, options: Omit<UnitDisplay, 'kind' | 'unit'> = {}): UnitDisplay {\n return name === undefined ? { kind: 'unit', ...options } : { kind: 'unit', unit: name, ...options };\n}\n\n/** The built-in `unit` kind, to spread into a `registerDisplayKind` replacement. */\nexport const unitKind: DisplayKind<UnitDisplay> = {\n kind: 'unit',\n format: (value, d, ctx) => {\n const parts: Part[] = [numberPart(value, ctx.locale, { maximumFractionDigits: d.places ?? 2, useGrouping: false })];\n const name = d.unit ?? ctx.unit;\n if (name) {\n if (d.space) parts.push({ type: 'literal', value: ' ' });\n parts.push({ type: 'unit', value: name });\n }\n return parts;\n },\n speak: (value, d, ctx) => {\n const places = d.places ?? 2;\n const name = d.unit ?? ctx.unit;\n const intl = name === undefined ? undefined : INTL_UNITS[name];\n if (intl !== undefined && d.spoken === undefined) {\n return spokenSign(\n textOf(intlParts(value, ctx.locale, { style: 'unit', unit: intl, unitDisplay: 'long', maximumFractionDigits: places })),\n );\n }\n const number = numberPart(value, ctx.locale, { maximumFractionDigits: places, useGrouping: false }).value;\n const names = d.spoken ?? (name === undefined ? undefined : OWN_UNITS[name]);\n const word = names ? plural(value, ctx.locale, names[0], names[1]) : name;\n return spokenSign(word ? `${number} ${word}` : number);\n },\n parse: (text, d, ctx) => {\n const name = d.unit ?? ctx.unit;\n return parseNumber(text, d.accepts ?? (name ? { [name]: 1 } : undefined), ctx.locale);\n },\n};\n\n/** Money in an ISO 4217 currency: `$12.50`, spoken `12.50 US dollars`. */\nexport type CurrencyDisplay = {\n kind: 'currency';\n currency: string;\n /** Fixed decimals. Defaults to the currency's own (2 for USD, 0 for JPY). */\n places?: number;\n};\n\n/** A {@link CurrencyDisplay} in the ISO 4217 currency `code`. */\nexport function currency(code: string, options: Omit<CurrencyDisplay, 'kind' | 'currency'> = {}): CurrencyDisplay {\n return { kind: 'currency', currency: code, ...options };\n}\n\nfunction currencyOptions(d: CurrencyDisplay): Intl.NumberFormatOptions {\n const options: Intl.NumberFormatOptions = { style: 'currency', currency: d.currency };\n if (d.places !== undefined) {\n options.minimumFractionDigits = d.places;\n options.maximumFractionDigits = d.places;\n }\n return options;\n}\n\n/** The built-in `currency` kind, to spread into a `registerDisplayKind` replacement. */\nexport const currencyKind: DisplayKind<CurrencyDisplay> = {\n kind: 'currency',\n format: (value, d, ctx) => intlParts(value, ctx.locale, currencyOptions(d)),\n speak: (value, d, ctx) =>\n spokenSign(textOf(intlParts(value, ctx.locale, { ...currencyOptions(d), currencyDisplay: 'name' }))),\n parse: (text, _d, ctx) => parseNumber(numberWithin(text, ctx.locale), undefined, ctx.locale),\n};\n\n/**\n * A span of time, the value in seconds. `clock` shows `1:02:03` or `4:05.5`;\n * `units` shows `2h 5m 3s`. Spoken `2 hours, 5 minutes, 3 seconds`. Typed text\n * reads in either form.\n */\nexport type DurationDisplay = {\n kind: 'duration';\n /** Default `'clock'`. */\n style?: 'clock' | 'units';\n /** Decimals on the seconds. Default 0. */\n places?: number;\n};\n\n/** A {@link DurationDisplay}. */\nexport function duration(options: Omit<DurationDisplay, 'kind'> = {}): DurationDisplay {\n return { kind: 'duration', ...options };\n}\n\n/** Hours, minutes and seconds of `value` after rounding to `places`. */\nfunction hms(value: number, places: number) {\n const scale = 10 ** places;\n const total = Math.round(Math.abs(value) * scale) / scale;\n const h = Math.floor(total / 3600);\n const m = Math.floor((total - h * 3600) / 60);\n const s = Math.round((total - h * 3600 - m * 60) * scale) / scale;\n return { negative: value < 0 && total > 0, h, m, s };\n}\n\nconst DURATION_UNITS: UnitTable = { h: 3600, m: 60, min: 60, s: 1, ms: 0.001 };\n\n/** The built-in `duration` kind, to spread into a `registerDisplayKind` replacement. */\nexport const durationKind: DisplayKind<DurationDisplay> = {\n kind: 'duration',\n format: (value, d) => {\n if (!Number.isFinite(value)) return [{ type: 'number', value: String(value) }];\n const places = d.places ?? 0;\n const { negative, h, m, s } = hms(value, places);\n const sec = s.toFixed(places);\n const parts: Part[] = negative ? [{ type: 'sign', value: '−' }] : [];\n if (d.style === 'units') {\n const terms: Part[][] = [];\n if (h > 0) terms.push([{ type: 'hours', value: String(h) }, { type: 'unit', value: 'h' }]);\n if (m > 0) terms.push([{ type: 'minutes', value: String(m) }, { type: 'unit', value: 'm' }]);\n if (s > 0 || terms.length === 0) terms.push([{ type: 'seconds', value: sec }, { type: 'unit', value: 's' }]);\n terms.forEach((t, i) => parts.push(...(i > 0 ? [{ type: 'literal', value: ' ' }] : []), ...t));\n return parts;\n }\n const pad = (n: string) => (n.split('.')[0]!.length < 2 ? `0${n}` : n);\n if (h > 0) {\n parts.push(\n { type: 'hours', value: String(h) },\n { type: 'literal', value: ':' },\n { type: 'minutes', value: pad(String(m)) },\n );\n } else {\n parts.push({ type: 'minutes', value: String(m) });\n }\n parts.push({ type: 'literal', value: ':' }, { type: 'seconds', value: pad(sec) });\n return parts;\n },\n speak: (value, d, ctx) => {\n if (!Number.isFinite(value)) return String(value);\n const { negative, h, m, s } = hms(value, d.places ?? 0);\n const terms: string[] = [];\n if (h > 0) terms.push(`${h} ${plural(h, ctx.locale, 'hour', 'hours')}`);\n if (m > 0) terms.push(`${m} ${plural(m, ctx.locale, 'minute', 'minutes')}`);\n if (s > 0 || terms.length === 0) terms.push(`${s} ${plural(s, ctx.locale, 'second', 'seconds')}`);\n return `${negative ? 'minus ' : ''}${terms.join(', ')}`;\n },\n parse: (text, _d, ctx) => {\n const d = escapeClass(decimalOf(ctx.locale));\n const clock = new RegExp(String.raw`^\\s*([-−+]?)\\s*(?:(\\d+):)?(\\d+):(\\d+)(?:[.${d}](\\d+))?\\s*$`);\n const m = clock.exec(latinDigits(text, ctx.locale));\n if (!m) return parseNumber(text, DURATION_UNITS, ctx.locale);\n const total = Number(m[2] ?? 0) * 3600 + Number(m[3]) * 60 + Number(`${m[4]}.${m[5] ?? 0}`);\n return m[1] === '-' || m[1] === '−' ? -total : total;\n },\n};\n\nconst DECIMAL_BYTES = ['B', 'kB', 'MB', 'GB', 'TB', 'PB'] as const;\nconst BINARY_BYTES = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'] as const;\nconst DECIMAL_NAMES = ['byte', 'kilobyte', 'megabyte', 'gigabyte', 'terabyte', 'petabyte'] as const;\nconst BINARY_NAMES = ['byte', 'kibibyte', 'mebibyte', 'gibibyte', 'tebibyte', 'pebibyte'] as const;\n\n/** A byte count in the largest unit that keeps it at or above 1: `1.2 MB`,\n * spoken `1.2 megabytes`. `base: 1024` uses `KiB`, `MiB`, … */\nexport type BytesDisplay = {\n kind: 'bytes';\n /** Default 1000. */\n base?: 1000 | 1024;\n /** Most decimals. Default 1. */\n places?: number;\n};\n\n/** A {@link BytesDisplay}. */\nexport function bytes(options: Omit<BytesDisplay, 'kind'> = {}): BytesDisplay {\n return { kind: 'bytes', ...options };\n}\n\nfunction byteScale(d: BytesDisplay, value: number): { scaled: number; step: number; places: number } {\n const base = d.base ?? 1000;\n const last = DECIMAL_BYTES.length - 1;\n const placesAt = (step: number): number => (step === 0 ? 0 : (d.places ?? 1));\n let step = 0;\n let scaled = value;\n while (Math.abs(scaled) >= base && step < last) {\n scaled /= base;\n step++;\n }\n // 999,999 B is 999.999 kB, which shows as 1,000 kB: a megabyte.\n if (step < last && Number(Math.abs(scaled).toFixed(placesAt(step))) >= base) {\n scaled /= base;\n step++;\n }\n return { scaled, step, places: placesAt(step) };\n}\n\nconst BYTE_UNITS: UnitTable = Object.fromEntries([\n ...DECIMAL_BYTES.map((u, i) => [u, 1000 ** i] as const),\n ['KB', 1000],\n ...BINARY_BYTES.slice(1).map((u, i) => [u, 1024 ** (i + 1)] as const),\n]);\n\n/** The built-in `bytes` kind, to spread into a `registerDisplayKind` replacement. */\nexport const bytesKind: DisplayKind<BytesDisplay> = {\n kind: 'bytes',\n format: (value, d, ctx) => {\n const { scaled, step, places } = byteScale(d, value);\n const units = d.base === 1024 ? BINARY_BYTES : DECIMAL_BYTES;\n return [\n numberPart(scaled, ctx.locale, { maximumFractionDigits: places }),\n { type: 'literal', value: ' ' },\n { type: 'unit', value: units[step]! },\n ];\n },\n speak: (value, d, ctx) => {\n const { scaled, step, places } = byteScale(d, value);\n const name = (d.base === 1024 ? BINARY_NAMES : DECIMAL_NAMES)[step]!;\n const number = numberPart(scaled, ctx.locale, { maximumFractionDigits: places }).value;\n return spokenSign(`${number} ${plural(Math.abs(parseNumber(number, undefined, ctx.locale)), ctx.locale, name, `${name}s`)}`);\n },\n parse: (text, _d, ctx) => parseNumber(text, BYTE_UNITS, ctx.locale),\n};\n","import { numberPart, spokenSign, type DisplayKind } from '../kind';\nimport { parseNumber } from '../number';\n\n/**\n * A whole number in Roman numerals, `XII`. Spoken as the plain number, since a\n * screen reader otherwise spells the letters out. Outside 1–3999, which the\n * numerals cannot write, it shows as a plain number.\n */\nexport type RomanDisplay = {\n kind: 'roman';\n lower?: boolean;\n};\n\n/** A {@link RomanDisplay}. */\nexport function roman(options: Omit<RomanDisplay, 'kind'> = {}): RomanDisplay {\n return { kind: 'roman', ...options };\n}\n\nconst NUMERALS: readonly [number, string][] = [\n [1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'], [100, 'C'], [90, 'XC'],\n [50, 'L'], [40, 'XL'], [10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'], [1, 'I'],\n];\n\n/** `n` in Roman numerals, or undefined outside 1–3999. */\nexport function toRoman(n: number): string | undefined {\n let rest = Math.round(n);\n if (!(rest >= 1 && rest <= 3999)) return undefined;\n let out = '';\n for (const [v, s] of NUMERALS) {\n while (rest >= v) {\n out += s;\n rest -= v;\n }\n }\n return out;\n}\n\n/** The value of well-formed Roman numerals, either case; NaN otherwise. */\nexport function fromRoman(text: string): number {\n const t = text.trim().toUpperCase();\n if (!/^[MDCLXVI]+$/.test(t)) return Number.NaN;\n let total = 0;\n let i = 0;\n for (const [v, s] of NUMERALS) {\n while (t.startsWith(s, i)) {\n total += v;\n i += s.length;\n }\n }\n // Anything left unread, or a non-canonical spelling such as `IIII`, is not a numeral.\n return i === t.length && toRoman(total) === t ? total : Number.NaN;\n}\n\n/** The built-in `roman` kind, to spread into a `registerDisplayKind` replacement. */\nexport const romanKind: DisplayKind<RomanDisplay> = {\n kind: 'roman',\n format: (value, d, ctx) => {\n const r = toRoman(value);\n if (r === undefined) return [numberPart(value, ctx.locale, { maximumFractionDigits: 0 })];\n return [{ type: 'numeral', value: d.lower ? r.toLowerCase() : r }];\n },\n speak: (value, _d, ctx) => spokenSign(numberPart(Math.round(value), ctx.locale, { maximumFractionDigits: 0, useGrouping: false }).value),\n parse: (text, _d, ctx) => {\n const r = fromRoman(text);\n return Number.isNaN(r) ? parseNumber(text, undefined, ctx.locale) : r;\n },\n};\n\n/** A whole number as an ordinal: `1st`, `22nd`, `113th`. English suffixes;\n * in any other locale the number shows alone. */\nexport type OrdinalDisplay = {\n kind: 'ordinal';\n};\n\n/** An {@link OrdinalDisplay}. */\nexport function ordinal(): OrdinalDisplay {\n return { kind: 'ordinal' };\n}\n\nconst SUFFIXES: Record<string, string> = { one: 'st', two: 'nd', few: 'rd', other: 'th' };\n\n/** The built-in `ordinal` kind, to spread into a `registerDisplayKind` replacement. */\nexport const ordinalKind: DisplayKind<OrdinalDisplay> = {\n kind: 'ordinal',\n format: (value, _d, ctx) => {\n const n = Math.round(value);\n const number = numberPart(n, ctx.locale, { maximumFractionDigits: 0 });\n if (!Number.isFinite(n) || !ctx.locale.startsWith('en')) return [number];\n const rule = new Intl.PluralRules('en-US', { type: 'ordinal' }).select(n);\n return [number, { type: 'ordinal', value: SUFFIXES[rule] ?? 'th' }];\n },\n parse: (text, _d, ctx) => Math.round(parseNumber(text.replace(/(st|nd|rd|th)\\s*$/i, ''), undefined, ctx.locale)),\n};\n","import { escapeMarkup, spokenSign, type DisplayKind, type FormatContext, type Part } from '../kind';\nimport { MINUS_SIGN, parseNumber } from '../number';\n\n/**\n * A mantissa times a power of ten at `digits` significant figures (default 3),\n * trailing zeros kept: `1.23 × 10⁶`. `engineering` keeps the exponent a multiple\n * of three (`12.3 × 10³`); `form: 'e'` writes it the way code does (`1.23e6`).\n * Zero shows as `0`.\n */\nexport type ScientificDisplay = {\n kind: 'scientific';\n digits?: number;\n engineering?: boolean;\n form?: 'superscript' | 'e';\n};\n\n/** A {@link ScientificDisplay}. */\nexport function scientific(options: Omit<ScientificDisplay, 'kind'> = {}): ScientificDisplay {\n return { kind: 'scientific', ...options };\n}\n\nconst SUPERSCRIPT = '⁰¹²³⁴⁵⁶⁷⁸⁹';\nconst superscript = (n: number): string =>\n (n < 0 ? '⁻' : '') + [...String(Math.abs(n))].map((d) => SUPERSCRIPT[Number(d)]).join('');\n\ntype Split = { mantissa: string; exponent: number } | null;\n\n/** The mantissa as the locale writes it and the exponent, or null for zero. */\nfunction split(value: number, d: ScientificDisplay, locale: string): Split {\n if (value === 0) return null;\n const digits = d.digits ?? 3;\n const nf = new Intl.NumberFormat(locale, {\n notation: d.engineering ? 'engineering' : 'scientific',\n minimumSignificantDigits: digits,\n maximumSignificantDigits: digits,\n });\n let mantissa = '';\n let exponent = '';\n for (const p of nf.formatToParts(value)) {\n if (p.type === 'exponentSeparator') continue;\n if (p.type === 'exponentMinusSign') exponent += '-';\n else if (p.type === 'exponentInteger') exponent += p.value;\n else mantissa += p.type === 'minusSign' ? MINUS_SIGN : p.value;\n }\n return { mantissa, exponent: Number(exponent) };\n}\n\nconst zeroParts = (locale: string): Part[] => [{ type: 'number', value: (0).toLocaleString(locale) }];\n\n/** `× 10^n`, `x10^n`, `*10^n`, and the superscript form, rewritten as the `e` form `parseNumber` reads. */\nfunction asENotation(text: string): string {\n const raised = text.replace(/[⁰¹²³⁴⁵⁶⁷⁸⁹⁻]+$/, (s) => `^${[...s].map((c) => (c === '⁻' ? '-' : SUPERSCRIPT.indexOf(c))).join('')}`);\n const m = /^(?:(.*\\d)\\s*[×xX*·]\\s*)?10\\s*\\^\\s*([-−+]?\\d+)$/.exec(raised.trim());\n if (m) return `${m[1] ?? '1'}e${m[2]!.replace(MINUS_SIGN, '-')}`;\n return text.replace(/(\\d)[eE]−/, '$1e-');\n}\n\n/** The built-in `scientific` kind, to spread into a `registerDisplayKind` replacement. */\nexport const scientificKind: DisplayKind<ScientificDisplay> = {\n kind: 'scientific',\n format: (value, d, ctx) => {\n const s = split(value, d, ctx.locale);\n if (s === null) return zeroParts(ctx.locale);\n if (d.form === 'e') {\n const exponent = String(s.exponent).replace('-', MINUS_SIGN);\n return [{ type: 'number', value: s.mantissa }, { type: 'literal', value: 'e' }, { type: 'exponent', value: exponent }];\n }\n return [\n { type: 'number', value: s.mantissa },\n { type: 'literal', value: ' × ' },\n { type: 'base', value: '10' },\n { type: 'exponent', value: superscript(s.exponent) },\n ];\n },\n speak: (value, d, ctx: FormatContext) => {\n const s = split(value, d, ctx.locale);\n if (s === null) return zeroParts(ctx.locale)[0]!.value;\n return spokenSign(`${s.mantissa} times 10 to the power of ${spokenSign(String(s.exponent))}`);\n },\n parse: (text, _d, ctx) => parseNumber(asENotation(text), undefined, ctx.locale),\n mathml: (value, d, ctx) => {\n const s = split(value, d, ctx.locale);\n if (s === null) return undefined;\n const sign = s.mantissa.startsWith(MINUS_SIGN) ? `<mo>${MINUS_SIGN}</mo>` : '';\n const mantissa = `${sign}<mn>${escapeMarkup(s.mantissa.replace(MINUS_SIGN, ''))}</mn>`;\n const power = s.exponent < 0 ? `<mrow><mo>${MINUS_SIGN}</mo><mn>${-s.exponent}</mn></mrow>` : `<mn>${s.exponent}</mn>`;\n return `<math>${mantissa}<mo>×</mo><msup><mn>10</mn>${power}</msup></math>`;\n },\n};\n","import type { Part } from './kind';\nimport { MINUS_SIGN } from './number';\nimport type { Display } from './quantity';\n\ninterface Word {\n text: string;\n spoken: string;\n}\n\nconst POSITIVE: Word = { text: '∞', spoken: 'infinity' };\nconst NEGATIVE: Word = { text: `${MINUS_SIGN}∞`, spoken: 'minus infinity' };\nconst SPELLINGS = ['∞', 'inf', 'infinity', 'infinite'];\n\nfunction word(w: string | { text: string; spoken?: string }): Word {\n return typeof w === 'string' ? { text: w, spoken: w } : { text: w.text, spoken: w.spoken ?? w.text };\n}\n\n/** The word `display` uses for `+Infinity` (`sign` 1) or `−Infinity` (`sign` −1). */\nexport function infinityWord(display: Display | undefined, sign: 1 | -1): Word {\n const w = display?.infinity;\n if (w === undefined) return sign > 0 ? POSITIVE : NEGATIVE;\n if (sign > 0) return word(w);\n return typeof w === 'object' && w.negative !== undefined ? word(w.negative) : NEGATIVE;\n}\n\n/** ±Infinity as its one `infinity` part. No unit or symbol rides along: a word\n * like `never` stands alone, which is how a control knows to drop a suffix. */\nexport function infinityParts(value: number, display: Display | undefined): Part[] {\n return [{ type: 'infinity', value: infinityWord(display, value > 0 ? 1 : -1).text }];\n}\n\n/** Typed text as ±Infinity when it names it — the display's own words, `∞`,\n * `inf`, `infinity` or `infinite`, signed or not — else `undefined`. */\nexport function readInfinity(text: string, display: Display | undefined, locale: string): number | undefined {\n const typed = text.trim().toLocaleLowerCase(locale);\n const is = (w: Word) => w.text.toLocaleLowerCase(locale) === typed || w.spoken.toLocaleLowerCase(locale) === typed;\n if (is(infinityWord(display, 1))) return Infinity;\n if (is(infinityWord(display, -1))) return -Infinity;\n const m = /^([+\\-−]?)\\s*(.*)$/.exec(typed)!;\n if (!SPELLINGS.includes(m[2]!)) return undefined;\n return m[1] === '-' || m[1] === MINUS_SIGN ? -Infinity : Infinity;\n}\n","import { escapeMarkup as escape, textOf, type DisplayKind, type FormatContext, type Part } from './kind';\nimport { compactKind, decimalKind, integerKind } from './kinds/plain';\nimport { fractionKind, multiplierKind, percentKind, ratioKind, zoomKind } from './kinds/proportion';\nimport { bytesKind, currencyKind, durationKind, unitKind } from './kinds/measure';\nimport { ordinalKind, romanKind } from './kinds/numeral';\nimport { scientificKind } from './kinds/scientific';\nimport { infinityParts, infinityWord, readInfinity } from './infinity';\nimport { parseNumber } from './number';\nimport { amount, displayOf, retag, tag, unitOf, type Display, type Quantity, type Tagged } from './quantity';\nimport { unitScale, type Unit, type UnitSystem } from './units';\n\n// A static table rather than registration at import, so the package stays\n// free of side effects and a bundler can drop what nobody imports.\nconst BUILTIN: Record<string, DisplayKind<never>> = Object.fromEntries(\n [\n decimalKind, integerKind, compactKind, scientificKind,\n percentKind, fractionKind, ratioKind, multiplierKind, zoomKind,\n unitKind, currencyKind, durationKind, bytesKind,\n romanKind, ordinalKind,\n ].map((k) => [k.kind, k as DisplayKind<never>]),\n);\n\nconst registered = new Map<string, DisplayKind<never>>();\n\n/**\n * Adds a display kind, or replaces a built-in one — the way to swap in a words\n * library for `fraction`'s spoken form (`{ ...fractionKind, speak }`). Returns\n * a function that removes it again.\n */\nexport function registerDisplayKind<D extends Display>(kind: DisplayKind<D>): () => void {\n const entry = kind as unknown as DisplayKind<never>;\n registered.set(kind.kind, entry);\n return () => {\n if (registered.get(kind.kind) === entry) registered.delete(kind.kind);\n };\n}\n\n/**\n * The kind behind `display`. An unknown kind resolves to `decimal` rather than\n * throwing: a document saved by an app with a custom kind still opens in one\n * without it, and its tag survives untouched.\n */\nexport function displayKindOf(display: Display | undefined): DisplayKind<Display> {\n const kind = display === undefined ? undefined : (registered.get(display.kind) ?? BUILTIN[display.kind]);\n return (kind ?? decimalKind) as unknown as DisplayKind<Display>;\n}\n\n/** Options for presenting or parsing a quantity. */\nexport interface PresentOptions {\n /** BCP 47 locale. Default `en-US`. */\n locale?: string;\n}\n\n/** A quantity as text, spoken text, HTML and, where its kind has one, MathML. */\nexport interface Presentation {\n text: string;\n spoken: string;\n /** Unstyled: a `<data value>` wrapping one `<span data-part>` per named part. */\n html: string;\n mathml?: string;\n /** The display's `form` is `stacked` and there is a `mathml` form: a\n * renderer that draws MathML draws it in place of `html`. */\n stacked?: true;\n}\n\nconst DEFAULT_DISPLAY: Display = { kind: 'decimal' };\n\nfunction contextOf(q: Quantity, options: PresentOptions | undefined): FormatContext {\n const unit = unitOf(q);\n return unit === undefined ? { locale: options?.locale ?? 'en-US' } : { locale: options?.locale ?? 'en-US', unit };\n}\n\n/** Parts as the unstyled HTML fragment {@link Presentation.html} describes. */\nexport function partsToHtml(value: number, parts: readonly Part[]): string {\n const body = parts\n .map((p) => (p.type === 'literal' ? escape(p.value) : `<span data-part=\"${escape(p.type)}\">${escape(p.value)}</span>`))\n .join('');\n return `<data value=\"${escape(String(value))}\">${body}</data>`;\n}\n\n/** Parts of `q` under its own display, else `fallback`, else `decimal`. */\nexport function partsOf(q: Quantity, fallback?: Display, options?: PresentOptions): Part[] {\n const display = displayOf(q, fallback) ?? DEFAULT_DISPLAY;\n const value = amount(q);\n if (isInfinite(value)) return infinityParts(value, display);\n return displayKindOf(display).format(value, display, contextOf(q, options));\n}\n\n/** `q` as text, spoken text, HTML and MathML. See {@link qty} for one at a time. */\nexport function present(q: Quantity, fallback?: Display, options?: PresentOptions): Presentation {\n const display = displayOf(q, fallback) ?? DEFAULT_DISPLAY;\n const kind = displayKindOf(display);\n const value = amount(q);\n if (isInfinite(value)) {\n const word = infinityWord(display, value > 0 ? 1 : -1);\n return { text: word.text, spoken: word.spoken, html: partsToHtml(value, infinityParts(value, display)) };\n }\n const ctx = contextOf(q, options);\n const parts = kind.format(value, display, ctx);\n const text = textOf(parts);\n const out: Presentation = {\n text,\n spoken: kind.speak ? kind.speak(value, display, ctx) : text,\n html: partsToHtml(value, parts),\n };\n const mathml = kind.mathml?.(value, display, ctx);\n if (mathml !== undefined) {\n out.mathml = mathml;\n if (display.form === 'stacked') out.stacked = true;\n }\n return out;\n}\n\nfunction isInfinite(value: number): boolean {\n return value === Infinity || value === -Infinity;\n}\n\n/** Typed text read through `display`: NaN when it does not read. ±Infinity\n * reads from the display's own word for it, and from `∞` or `infinity`. */\nexport function parseAs(text: string, display?: Display, options?: PresentOptions & { unit?: Unit }): number {\n const d = display ?? DEFAULT_DISPLAY;\n const kind = displayKindOf(d);\n const ctx: FormatContext = { locale: options?.locale ?? 'en-US' };\n const infinite = readInfinity(text, d, ctx.locale);\n if (infinite !== undefined) return infinite;\n if (options?.unit !== undefined) ctx.unit = options.unit;\n return kind.parse ? kind.parse(text, d, ctx) : parseNumber(text, undefined, ctx.locale);\n}\n\n/**\n * A short-lived view of a quantity with its presentation as methods. Nothing\n * about it is stored — keep the quantity, and wrap it where it is shown.\n */\nexport class QuantityView<Q extends Quantity = Quantity> {\n constructor(\n /** The quantity as given. */\n readonly raw: Q,\n private readonly fallback?: Display,\n private readonly options?: PresentOptions,\n ) {}\n\n get value(): number {\n return amount(this.raw);\n }\n get unit(): Unit | undefined {\n return unitOf(this.raw);\n }\n /** The display in effect: the value's own, else the fallback. */\n get display(): Display | undefined {\n return displayOf(this.raw, this.fallback);\n }\n get parts(): Part[] {\n return partsOf(this.raw, this.fallback, this.options);\n }\n get text(): string {\n return textOf(this.parts);\n }\n get spoken(): string {\n return present(this.raw, this.fallback, this.options).spoken;\n }\n get html(): string {\n return partsToHtml(this.value, this.parts);\n }\n get mathml(): string | undefined {\n return present(this.raw, this.fallback, this.options).mathml;\n }\n /** `next` in this quantity's shape — see {@link retag}. */\n with(next: number): QuantityView<Q> {\n return new QuantityView(retag(this.raw, next), this.fallback, this.options);\n }\n /** Typed text read through this quantity's display; NaN when it does not read. */\n parse(text: string): number {\n const unit = this.unit;\n return parseAs(text, this.display, unit === undefined ? this.options : { ...this.options, unit });\n }\n /** The same amount in `target`, converted through `system`, tagged with it. */\n to(target: Unit, system: UnitSystem): QuantityView {\n const from = unitScale(system, this.unit ?? system.base);\n const to = unitScale(system, target);\n const base = this.value * from.factor + from.offset;\n const value = (base - to.offset) / to.factor;\n const raw = typeof this.raw === 'number' ? tag(value, undefined, target) : { ...(this.raw as Tagged), value, unit: target };\n return new QuantityView(raw, this.fallback, this.options);\n }\n toJSON(): Q {\n return this.raw;\n }\n}\n\n/** Wraps `q` for display: `qty(band.from, fraction()).text`. `fallback` is the\n * display for a value that carries none of its own. */\nexport function qty<Q extends Quantity>(q: Q, fallback?: Display, options?: PresentOptions): QuantityView<Q> {\n return new QuantityView(q, fallback, options);\n}\n","import { MINUS_SIGN, withSpellings } from './number';\nimport { unitScale, type Unit, type UnitSystem } from './units';\n\n/**\n * Arithmetic over values in different units, as plain data: `50% + 2ft`\n * parses once and resolves against whatever context it is handed, so a stored\n * expression follows a parent that resizes. `value` nodes are the leaves.\n */\nexport type UnitExpr =\n | { op: 'value'; value: number; unit?: Unit }\n | { op: 'neg'; of: UnitExpr }\n | { op: 'add' | 'sub' | 'mul' | 'div'; left: UnitExpr; right: UnitExpr };\n\n/** What a {@link UnitExpr} resolves against. */\nexport interface UnitExprContext {\n unitSystem?: UnitSystem;\n /** What `100%` is, in base units. A `%` term throws without it, unless the\n * unit system carries a `%` unit of its own. */\n percentOf?: number;\n}\n\ntype Token = { kind: 'value'; value: number; unit?: Unit } | { kind: 'op'; op: string };\n\nconst TOKEN = /\\s*(?:(\\d+(?:\\.\\d+)?|\\.\\d+)\\s*([^\\s\\d.+\\-−*×/÷()]+)?|([+\\-−*×/÷()]))/y;\nconst OPS: Record<string, string> = { [MINUS_SIGN]: '-', '×': '*', '÷': '/' };\n\nfunction tokenize(text: string): Token[] {\n const tokens: Token[] = [];\n let at = 0;\n while (text.slice(at).trim() !== '') {\n TOKEN.lastIndex = at;\n const m = TOKEN.exec(text);\n if (!m) throw new Error(`unitExpr: cannot read '${text.slice(at).trim()}' in '${text}'`);\n at = TOKEN.lastIndex;\n if (m[1] === undefined) tokens.push({ kind: 'op', op: OPS[m[3]!] ?? m[3]! });\n else if (m[2] === undefined) tokens.push({ kind: 'value', value: Number(m[1]) });\n else tokens.push({ kind: 'value', value: Number(m[1]), unit: m[2] });\n }\n return tokens;\n}\n\n/**\n * Parse arithmetic over unit-tagged numbers: `+ - * /` (also `− × ÷`),\n * parentheses, and adjacent terms read as one compound value (`5ft 3in`),\n * with a leading sign carried across all of them. Throws on text it cannot\n * read. Unit names are not checked here — resolving does that.\n */\nexport function parseUnitExpr(text: string): UnitExpr {\n const tokens = tokenize(text);\n let i = 0;\n const isOp = (op: string): boolean => {\n const t = tokens[i];\n return t !== undefined && t.kind === 'op' && t.op === op;\n };\n const fail = (): never => {\n throw new Error(`unitExpr: '${text}' is not a complete expression`);\n };\n\n const sum = (): UnitExpr => {\n let left = product();\n while (isOp('+') || isOp('-')) {\n const op = isOp('+') ? 'add' : 'sub';\n i++;\n left = { op, left, right: product() };\n }\n return left;\n };\n const product = (): UnitExpr => {\n let left = unary();\n while (isOp('*') || isOp('/')) {\n const op = isOp('*') ? 'mul' : 'div';\n i++;\n left = { op, left, right: unary() };\n }\n return left;\n };\n const unary = (): UnitExpr => {\n if (isOp('+')) {\n i++;\n return unary();\n }\n if (!isOp('-')) return primary();\n i++;\n const of = unary();\n // Folded into the literal so an offset unit keeps its meaning: −10degC is 263.15K.\n return of.op === 'value' ? { ...of, value: -of.value } : { op: 'neg', of };\n };\n const primary = (): UnitExpr => {\n if (isOp('(')) {\n i++;\n const inner = sum();\n if (!isOp(')')) fail();\n i++;\n return inner;\n }\n let left = literal();\n while (tokens[i]?.kind === 'value') left = { op: 'add', left, right: literal() };\n return left;\n };\n const literal = (): UnitExpr => {\n const t = tokens[i];\n if (t === undefined || t.kind !== 'value') return fail();\n i++;\n return t.unit === undefined\n ? { op: 'value', value: t.value }\n : { op: 'value', value: t.value, unit: t.unit };\n };\n\n const expr = sum();\n if (i !== tokens.length) fail();\n return expr;\n}\n\ninterface Resolved {\n n: number;\n /** A measure, in base units — as against a bare scalar. */\n measure: boolean;\n /** From a unit that puts zero somewhere else, so it is a point and not an amount. */\n offset: boolean;\n}\n\nfunction resolveNode(expr: UnitExpr, ctx: UnitExprContext): Resolved {\n if (expr.op === 'value') return resolveValue(expr.value, expr.unit, ctx);\n if (expr.op === 'neg') {\n const of = amountOf(resolveNode(expr.of, ctx));\n return { ...of, n: -of.n };\n }\n const l = amountOf(resolveNode(expr.left, ctx));\n const r = amountOf(resolveNode(expr.right, ctx));\n switch (expr.op) {\n case 'add':\n return { n: l.n + r.n, measure: l.measure || r.measure, offset: false };\n case 'sub':\n return { n: l.n - r.n, measure: l.measure || r.measure, offset: false };\n case 'mul':\n if (l.measure && r.measure) throw new Error('unitExpr: cannot multiply two measures');\n return { n: l.n * r.n, measure: l.measure || r.measure, offset: false };\n case 'div':\n if (r.measure && !l.measure) throw new Error('unitExpr: cannot divide by a measure');\n return { n: l.n / r.n, measure: l.measure && !r.measure, offset: false };\n }\n}\n\nfunction amountOf(r: Resolved): Resolved {\n if (r.offset) {\n throw new Error('unitExpr: a unit with an offset names a point, and has no place in arithmetic');\n }\n return r;\n}\n\nfunction resolveValue(value: number, unit: Unit | undefined, ctx: UnitExprContext): Resolved {\n if (unit === undefined) return { n: value, measure: false, offset: false };\n const units = ctx.unitSystem ? withSpellings(ctx.unitSystem.units) : undefined;\n if (unit === '%' && units?.['%'] === undefined) {\n if (ctx.percentOf === undefined) {\n throw new Error(`unitExpr: ${value}% needs a percentOf to resolve against`);\n }\n return { n: (value / 100) * ctx.percentOf, measure: true, offset: false };\n }\n if (!ctx.unitSystem || !units) throw new Error(`unitExpr: ${value}${unit} requires a UnitSystem`);\n let scale: ReturnType<typeof unitScale>;\n try {\n scale = unitScale({ base: ctx.unitSystem.base, units }, unit);\n } catch (e) {\n throw new Error(`unitExpr: ${e instanceof Error ? e.message : String(e)}`);\n }\n return { n: value * scale.factor + scale.offset, measure: true, offset: scale.offset !== 0 };\n}\n\n/**\n * An expression's value in base units. A bare number beside `+` or `-` is\n * read as base units, as it is everywhere a `UnitValue` goes, and beside `*`\n * or `/` as a scalar. A measure over a measure is a scalar; a product of two\n * measures, or a scalar over a measure, throws.\n */\nexport function resolveUnitExpr(expr: UnitExpr | string, ctx: UnitExprContext = {}): number {\n return resolveNode(typeof expr === 'string' ? parseUnitExpr(expr) : expr, ctx).n;\n}\n","import type { Quantity } from './quantity';\nimport { entryScale, formatUnit, resolveUnit, type Unit, type UnitEntry, type UnitSystem, type UnitValue } from './units';\n\n/**\n * A unit system nested in another: a sub-assembly drawn in millimeters inside\n * a scene measured in inches. Values inside are read against `system`, and\n * `scale` converts at the boundary.\n */\nexport interface UnitScope {\n system: UnitSystem;\n /** What one of this scope's base units is worth in the enclosing scope's\n * base units. Absent is 1, which is also what the outermost scope has. */\n scale?: UnitEntry;\n /** How large the scope's frame is drawn in the enclosing one: a drawer's\n * plan inset at 0.4 says 0.4. It declares a magnification that something\n * else draws (a scale `transform` on the node), so a length measured on\n * screen can be divided back to its true size. Absent is 1. */\n drawnAt?: number;\n}\n\n/** How large the innermost scope's frame is drawn in the outermost's: every\n * `drawnAt` of `scopes`, multiplied. */\nexport function magnificationOf(scopes: readonly UnitScope[]): number {\n let m = 1;\n for (const scope of scopes) m *= scope.drawnAt ?? 1;\n return m;\n}\n\n/** A measure in the innermost scope's base units, in the outermost's. `scopes` runs outermost first. */\nexport function toRoot(base: number, scopes: readonly UnitScope[]): number {\n let n = base;\n for (let i = scopes.length - 1; i >= 0; i--) {\n const { factor, offset } = entryScale(scopes[i]!.scale ?? 1);\n n = n * factor + offset;\n }\n return n;\n}\n\n/** The inverse of {@link toRoot}: an outermost-scope measure in the innermost scope's base units. */\nexport function fromRoot(rootBase: number, scopes: readonly UnitScope[]): number {\n let n = rootBase;\n for (const scope of scopes) {\n const { factor, offset } = entryScale(scope.scale ?? 1);\n n = (n - offset) / factor;\n }\n return n;\n}\n\n/**\n * Resolve `v` where it was written — against the innermost scope's unit\n * system, so `ft` inside a metric sub-assembly is an error rather than a\n * silent inch measure — and return it in the outermost scope's base units.\n */\nexport function resolveScoped(v: UnitValue | Quantity, scopes: readonly UnitScope[]): number {\n return toRoot(resolveUnit(v, scopes[scopes.length - 1]?.system), scopes);\n}\n\n/** A measure in the outermost scope's base units, as text in a unit of the innermost scope. */\nexport function formatScoped(\n rootBase: number,\n displayUnit: Unit,\n scopes: readonly UnitScope[],\n opts?: { precision?: number; suffix?: boolean },\n): string {\n return formatUnit(fromRoot(rootBase, scopes), displayUnit, scopes[scopes.length - 1]!.system, opts);\n}\n\n/** How {@link scopesOf} reads a tree it knows nothing else about. */\nexport interface ScopeTree<Id> {\n parentOf(id: Id): Id | null | undefined;\n /** The scope `id` declares for what it holds, when it declares one. */\n scopeOf(id: Id): UnitScope | undefined;\n /** Count `id`'s own scope too — for a value written inside it rather than\n * one that places it in its parent. Default false. */\n inclusive?: boolean;\n}\n\n/**\n * The scopes enclosing `id`, outermost first, under `root`: what\n * {@link resolveScoped} takes for a value that positions or sizes `id`. A\n * node's own scope covers its children, not itself, unless `inclusive`.\n */\nexport function scopesOf<Id>(id: Id, root: UnitScope, tree: ScopeTree<Id>): UnitScope[] {\n const inner: UnitScope[] = [];\n let at: Id | null | undefined = tree.inclusive ? id : tree.parentOf(id);\n while (at !== null && at !== undefined) {\n const scope = tree.scopeOf(at);\n if (scope) inner.push(scope);\n at = tree.parentOf(at);\n }\n return [root, ...inner.reverse()];\n}\n","import { magnificationOf, toRoot, type UnitScope } from './scope';\nimport { entryScale, formatUnit, resolveUnit, type Unit, type UnitValue } from './units';\n\n/** Options for {@link scaleBar}. */\nexport interface ScaleBarOptions {\n /** Screen pixels one world unit (a root base unit) covers at the view's zoom. */\n pxPerUnit: number;\n /** The unit scopes of the frame the bar measures, outermost first: what\n * `sceneSharedUnitScopes` returns for the nodes it is read beside. */\n scopes: readonly UnitScope[];\n /** The longest the bar may be, in screen pixels. Default 140. */\n maxPx?: number;\n /** The lengths it chooses among, in the innermost scope's units. Default:\n * 1, 2 and 5 of every decade of every unit that scope's system carries. */\n lengths?: readonly UnitValue[];\n}\n\n/** A scale bar's length and label. */\nexport interface ScaleBar {\n /** In the innermost scope's base units. */\n length: number;\n /** Its length on screen. */\n px: number;\n /** The length in the largest of the scope's units it is a whole number of. */\n label: string;\n /** How large the frame is drawn in the world: every `drawnAt` of the scopes. */\n magnification: number;\n}\n\nconst STEPS = [1, 2, 5];\nconst DECADES = [-3, -2, -1, 0, 1, 2, 3, 4];\nconst plain = (unit: Unit, entry: ReturnType<typeof entryScale>) => ({ unit, factor: entry.factor, offset: entry.offset });\n\n/**\n * The longest round length that fits in `maxPx` in the frame `scopes` names,\n * or the shortest when none does. It measures the frame's own lengths: inside\n * a scope drawn at 0.4×, a bar labeled 10″ spans 4″ of the world around it.\n */\nexport function scaleBar(opts: ScaleBarOptions): ScaleBar {\n const inner = opts.scopes[opts.scopes.length - 1];\n if (inner === undefined) throw new Error('scaleBar: scopes is empty; pass at least the root scope');\n const { system } = inner;\n const maxPx = opts.maxPx ?? 140;\n const magnification = magnificationOf(opts.scopes);\n const pxPerBase = opts.pxPerUnit * (toRoot(1, opts.scopes) - toRoot(0, opts.scopes)) * magnification;\n const units = Object.entries(system.units)\n .map(([unit, entry]) => plain(unit, entryScale(entry)))\n .filter((u) => u.offset === 0 && u.factor > 0)\n .sort((a, b) => a.factor - b.factor);\n // Below one of a unit only the smallest unit counts: a tenth of a foot is 1.2″.\n const lengths = opts.lengths?.map((v) => resolveUnit(v, system))\n ?? units.flatMap(({ factor }, i) => DECADES.filter((d) => i === 0 || d >= 0)\n .flatMap((d) => STEPS.map((s) => Number((s * 10 ** d * factor).toPrecision(12)))));\n const sorted = [...new Set(lengths)].sort((a, b) => a - b);\n let length = sorted[0]!;\n for (const l of sorted) if (l * pxPerBase <= maxPx) length = l;\n const fills = [...units].reverse().filter((u) => length / u.factor >= 1 - 1e-9);\n const whole = fills.find((u) => Math.abs(length / u.factor - Math.round(length / u.factor)) < 1e-9);\n const unit = (whole ?? fills[0])?.unit ?? system.base;\n return { length, px: length * pxPerBase, label: formatUnit(length, unit, system, { precision: 3 }), magnification };\n}\n","import { escapeMarkup as escape, textOf, type Part } from './kind';\nimport { partsOf, partsToHtml, present, type PresentOptions, type Presentation } from './present';\nimport { amount, type Display, type Quantity } from './quantity';\n\n/** Options for presenting a range. */\nexport interface RangeOptions extends PresentOptions {\n /** What goes between the ends. Default an en dash, spaced when an end is negative. */\n separator?: string;\n /** The separator read aloud. Default ` to `. */\n spokenSeparator?: string;\n}\n\n/** Options for presenting a vector. */\nexport interface VectorOptions extends PresentOptions {\n /** What goes between members. Default `, `. */\n separator?: string;\n /** A name before each member, by position: `['x', 'y']`. */\n labels?: readonly string[];\n}\n\nconst SEPARATOR = 'separator';\n\n/** Part types that say what a value is measured in, rather than how much. */\nconst MEASURE = new Set(['unit', 'percentSign']);\n\n/** The trailing parts of a value that name its measure: `ft` in `2ft`, with any space before it. */\nfunction measureTail(parts: readonly Part[]): Part[] {\n let at = parts.length;\n while (at > 0 && (MEASURE.has(parts[at - 1]!.type) || parts[at - 1]!.type === 'literal')) at--;\n const tail = parts.slice(at);\n return tail.some((p) => MEASURE.has(p.type)) ? tail : [];\n}\n\n/** Each end's own parts, with a measure both ends close on left off the first. */\nfunction rangeEnds(from: Quantity, to: Quantity, fallback?: Display, options?: PresentOptions): [Part[], Part[]] {\n const a = partsOf(from, fallback, options);\n const b = partsOf(to, fallback, options);\n const tail = measureTail(a);\n const shared = tail.length > 0 && textOf(tail) === textOf(measureTail(b));\n return [shared ? a.slice(0, a.length - tail.length) : a, b];\n}\n\nfunction rangeSeparator(from: Quantity, to: Quantity, options?: RangeOptions): string {\n return options?.separator ?? (amount(from) < 0 || amount(to) < 0 ? ' – ' : '–');\n}\n\n/**\n * A range as one run of parts: both ends under their own display, else\n * `fallback`, around a `separator` part. A unit or percent sign both ends\n * share is written once, after the second: `2–5ft`.\n */\nexport function rangeParts(from: Quantity, to: Quantity, fallback?: Display, options?: RangeOptions): Part[] {\n const [a, b] = rangeEnds(from, to, fallback, options);\n return [...a, { type: SEPARATOR, value: rangeSeparator(from, to, options) }, ...b];\n}\n\n/** A range as text, spoken text, and HTML: a `data-composite=\"range\"` span\n * holding a `<data value>` for each end and a `separator` part between. */\nexport function presentRange(from: Quantity, to: Quantity, fallback?: Display, options?: RangeOptions): Presentation {\n const [a, b] = rangeEnds(from, to, fallback, options);\n const separator = rangeSeparator(from, to, options);\n const spoken = [from, to].map((q) => present(q, fallback, options).spoken);\n return {\n text: `${textOf(a)}${separator}${textOf(b)}`,\n spoken: spoken.join(options?.spokenSeparator ?? ' to '),\n html: compositeHtml('range', [partsToHtml(amount(from), a), partsToHtml(amount(to), b)], separator),\n };\n}\n\n/** A vector as one run of parts: every member under its own display, else\n * `fallback`, with a `separator` part between and a `label` part before each\n * member that has one. */\nexport function vectorParts(members: readonly Quantity[], fallback?: Display, options?: VectorOptions): Part[] {\n const separator = options?.separator ?? ', ';\n return members.flatMap((q, i) => [\n ...(i > 0 ? [{ type: SEPARATOR, value: separator }] : []),\n ...labelParts(options?.labels?.[i]),\n ...partsOf(q, fallback, options),\n ]);\n}\n\n/** A vector as text, spoken text, and HTML: a `data-composite=\"vector\"` span\n * holding a `<data value>` for each member. */\nexport function presentVector(members: readonly Quantity[], fallback?: Display, options?: VectorOptions): Presentation {\n const separator = options?.separator ?? ', ';\n const label = (i: number): string => textOf(labelParts(options?.labels?.[i]));\n return {\n text: textOf(vectorParts(members, fallback, options)),\n spoken: members.map((q, i) => `${label(i)}${present(q, fallback, options).spoken}`).join(separator),\n html: compositeHtml(\n 'vector',\n members.map((q, i) => `${partsHtml(labelParts(options?.labels?.[i]))}${present(q, fallback, options).html}`),\n separator,\n ),\n };\n}\n\nfunction labelParts(label: string | undefined): Part[] {\n return label === undefined ? [] : [{ type: 'label', value: label }, { type: 'literal', value: ' ' }];\n}\n\nfunction partsHtml(parts: readonly Part[]): string {\n return parts\n .map((p) => (p.type === 'literal' ? escape(p.value) : `<span data-part=\"${escape(p.type)}\">${escape(p.value)}</span>`))\n .join('');\n}\n\nfunction compositeHtml(kind: string, members: readonly string[], separator: string): string {\n const between = partsHtml([{ type: SEPARATOR, value: separator }]);\n return `<span data-composite=\"${kind}\">${members.join(between)}</span>`;\n}\n","/** Which ends of a number's range stand for infinity. */\nexport type Endless = 'min' | 'max' | 'both';\n\n/** Whether the `max` end (`sign` 1) or the `min` end (`sign` −1) is endless. */\nexport function endlessAt(endless: Endless | undefined, sign: 1 | -1): boolean {\n return endless === 'both' || endless === (sign > 0 ? 'max' : 'min');\n}\n\n/** Whether `n` is an infinity that `endless` allows as a value. */\nexport function endlessAllows(endless: Endless | undefined, n: number): boolean {\n return (n === Infinity && endlessAt(endless, 1)) || (n === -Infinity && endlessAt(endless, -1));\n}\n\n/** A slider's track with a stop for infinity added beyond each endless end,\n * so every value from `min` to `max` stays reachable. */\nexport interface EndlessTrack {\n /** The track's own ends: `min` and `max`, each moved out by one stop where endless. */\n min: number;\n max: number;\n /** Where a value sits on the track: ±Infinity at the end it belongs to. */\n toTrack: (value: number) => number;\n /** The value a track position stands for: beyond the range, infinity or the\n * range's end, whichever is nearer. */\n fromTrack: (at: number) => number;\n}\n\n/** The added stop sits one `step` beyond the range, or a twentieth of the\n * range where the track has no step. */\nexport function endlessTrack(min: number, max: number, step: number | undefined, endless: Endless | undefined): EndlessTrack {\n const gap = step !== undefined && step > 0 ? step : (max - min) / 20;\n const lo = endlessAt(endless, -1) ? min - gap : min;\n const hi = endlessAt(endless, 1) ? max + gap : max;\n return {\n min: lo,\n max: hi,\n toTrack: value => (value === Infinity ? hi : value === -Infinity ? lo : value),\n fromTrack: at =>\n at > max ? (hi > max && at - max >= gap / 2 ? Infinity : max)\n : at < min ? (lo < min && min - at >= gap / 2 ? -Infinity : min)\n : at,\n };\n}\n","import { endlessAllows, endlessAt, endlessTrack, type Endless } from './endless';\n\n/** The bounds a spin key moves a value within. */\nexport interface SpinBounds {\n step: number;\n min?: number;\n max?: number;\n /** The ends that stand for infinity: a step past one reaches it, as an endless slider's stop does. */\n endless?: Endless;\n}\n\n/** `n` held within the bounds, except an infinity an endless end stands for. */\nexport function clampToBounds(n: number, { min, max, endless }: SpinBounds): number {\n if (endlessAllows(endless, n)) return n;\n return Math.min(max ?? Infinity, Math.max(min ?? -Infinity, n));\n}\n\n/** Decimal places `n` is written with, up to ten. */\nfunction placesOf(n: number): number {\n if (!Number.isFinite(n)) return 0;\n const text = String(n);\n const e = text.indexOf('e-');\n if (e >= 0) return Math.min(10, Number(text.slice(e + 2)));\n const dot = text.indexOf('.');\n return dot < 0 ? 0 : Math.min(10, text.length - dot - 1);\n}\n\n/**\n * `n` moved to the nearest multiple of `step` counted from `origin`, written\n * with the decimals `step` and `origin` carry, so three steps of `0.1` land on\n * `0.3`. No step, no snap.\n */\nexport function snapToStep(n: number, step: number | undefined, origin = 0): number {\n if (step === undefined || !(step > 0)) return n;\n const places = Math.max(placesOf(step), placesOf(origin));\n return Number((Math.round((n - origin) / step) * step + origin).toFixed(places));\n}\n\n/**\n * The value a spin-button key moves `from` to, or `null` for a key that does\n * not spin: the arrows by a step, Page Up and Page Down by ten, and Home and\n * End to a bound, where there is one. A sum of steps is rounded to the places\n * its operands carry, so `0.1 + 0.2` lands on `0.3`.\n */\nexport function spinKey(key: string, from: number, bounds: SpinBounds): number | null {\n const { endless, step, min, max } = bounds;\n if (endless === undefined) return finiteSpin(key, from, bounds);\n const track = endlessTrack(min ?? -Infinity, max ?? Infinity, step, endless);\n const at = finiteSpin(key, track.toTrack(from), {\n step,\n ...(min === undefined && !endlessAt(endless, -1) ? {} : { min: track.min }),\n ...(max === undefined && !endlessAt(endless, 1) ? {} : { max: track.max }),\n });\n return at === null ? null : track.fromTrack(at);\n}\n\n/** Whether `key` spins `from` anywhere: false for a key that does not spin, and at the bound it heads for. */\nexport function canSpin(key: string, from: number, bounds: SpinBounds): boolean {\n const next = spinKey(key, from, bounds);\n return next !== null && next !== from;\n}\n\n/** How many steps a coarse key press takes: an arrow with Shift held, or Page Up and Page Down. */\nexport const COARSE_STEPS = 10;\n\nfunction finiteSpin(key: string, from: number, bounds: SpinBounds): number | null {\n const by = (n: number) => {\n const places = Math.max(placesOf(from), placesOf(bounds.step));\n return clampToBounds(Number((from + n * bounds.step).toFixed(places)), bounds);\n };\n switch (key) {\n case 'ArrowUp':\n return by(1);\n case 'ArrowDown':\n return by(-1);\n case 'PageUp':\n return by(COARSE_STEPS);\n case 'PageDown':\n return by(-COARSE_STEPS);\n case 'Home':\n return bounds.min ?? null;\n case 'End':\n return bounds.max ?? null;\n default:\n return null;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weasel-js/quantity",
3
- "version": "1.15.0",
3
+ "version": "1.15.2",
4
4
  "description": "Numbers with units and a display: fractions, ratios, currency, durations and more, as text, spoken text, HTML and MathML. No React, no DOM.",
5
5
  "license": "MIT",
6
6
  "type": "module",