@magmonium/one 0.4.87 → 0.4.89

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.
@@ -4967,7 +4967,7 @@ export declare class SectionFilterGroupComponent {
4967
4967
  readonly paddingX: import("@angular/core").InputSignal<boolean | undefined>;
4968
4968
  readonly paddingY: import("@angular/core").InputSignal<boolean | undefined>;
4969
4969
  readonly maxWidth: import("@angular/core").InputSignal<string | undefined>;
4970
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center" | undefined>;
4970
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right" | undefined>;
4971
4971
  readonly config: import("@angular/core").InputSignal<SectionFilterGroupConfig | undefined>;
4972
4972
  /**
4973
4973
  * The whole group's selection, keyed by each Filter's `name` — one key per
@@ -4985,7 +4985,7 @@ export declare class SectionFilterGroupComponent {
4985
4985
  protected readonly resolvedPadding: import("@angular/core").Signal<boolean>;
4986
4986
  protected readonly resolvedPaddingX: import("@angular/core").Signal<boolean>;
4987
4987
  protected readonly resolvedPaddingY: import("@angular/core").Signal<boolean>;
4988
- protected readonly resolvedAlign: import("@angular/core").Signal<"left" | "right" | "center">;
4988
+ protected readonly resolvedAlign: import("@angular/core").Signal<"center" | "left" | "right">;
4989
4989
  protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
4990
4990
  protected readonly noBorder: import("@angular/core").Signal<boolean>;
4991
4991
  /**
@@ -5164,7 +5164,7 @@ export declare class SectionStepperComponent implements OnDestroy {
5164
5164
  export declare class SectionBadgesComponent {
5165
5165
  readonly wrap: import("@angular/core").InputSignal<boolean>;
5166
5166
  readonly border: import("@angular/core").InputSignal<boolean>;
5167
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center">;
5167
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right">;
5168
5168
  private readonly sectionContext;
5169
5169
  protected readonly hasBorder: import("@angular/core").Signal<boolean>;
5170
5170
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionBadgesComponent, never>;
@@ -5312,7 +5312,7 @@ export declare class SectionPaginationComponent {
5312
5312
  * Entries that are not positive numbers drop rather than throw.
5313
5313
  */
5314
5314
  readonly perPageOptions: import("@angular/core").InputSignal<string | undefined>;
5315
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center">;
5315
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right">;
5316
5316
  readonly showPerPage: import("@angular/core").InputSignal<boolean>;
5317
5317
  /** Hides the band outright once everything fits one page. */
5318
5318
  readonly hideOnSinglePage: import("@angular/core").InputSignal<boolean>;
@@ -5820,8 +5820,8 @@ export declare class SectionHeaderComponent {
5820
5820
  readonly visibilityRule: import("@angular/core").InputSignal<((key: string, data?: unknown) => boolean) | undefined>;
5821
5821
  readonly disableRule: import("@angular/core").InputSignal<((key: string, data?: unknown) => boolean) | undefined>;
5822
5822
  readonly extraData: import("@angular/core").InputSignal<unknown>;
5823
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center" | undefined>;
5824
- readonly alignment: import("@angular/core").Signal<"left" | "right" | "center">;
5823
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right" | undefined>;
5824
+ readonly alignment: import("@angular/core").Signal<"center" | "left" | "right">;
5825
5825
  readonly badge: import("@angular/core").InputSignal<BadgeCount | undefined>;
5826
5826
  readonly showBack: import("@angular/core").InputSignal<boolean>;
5827
5827
  readonly actionButton: import("@angular/core").InputSignal<string | undefined>;
@@ -5839,7 +5839,7 @@ export declare class SectionHeaderComponent {
5839
5839
  protected readonly sidepanel: import("@angular/core").Signal<boolean>;
5840
5840
  protected readonly noBorder: import("@angular/core").Signal<boolean>;
5841
5841
  protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
5842
- protected readonly boxAlign: import("@angular/core").Signal<"left" | "right" | "center">;
5842
+ protected readonly boxAlign: import("@angular/core").Signal<"center" | "left" | "right">;
5843
5843
  protected readonly iconBox: import("@angular/core").Signal<string>;
5844
5844
  protected readonly isSticky: import("@angular/core").Signal<boolean>;
5845
5845
  protected readonly hasMenu: import("@angular/core").Signal<boolean>;
@@ -5994,7 +5994,7 @@ export declare class SectionButtonGroupComponent extends ConfigComponent<Section
5994
5994
  protected readonly resolvedFullWidth: import("@angular/core").Signal<boolean>;
5995
5995
  protected readonly resolvedVertical: import("@angular/core").Signal<boolean>;
5996
5996
  protected readonly resolvedVariant: import("@angular/core").Signal<"spaced" | "joined">;
5997
- protected readonly resolvedAlign: import("@angular/core").Signal<"left" | "right" | "top" | "bottom" | "center">;
5997
+ protected readonly resolvedAlign: import("@angular/core").Signal<"center" | "left" | "right" | "bottom" | "top">;
5998
5998
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionButtonGroupComponent, never>;
5999
5999
  static ɵcmp: i0.ɵɵComponentDeclaration<SectionButtonGroupComponent, "m-section-button-group", never, {
6000
6000
  "vertical": {
@@ -6026,7 +6026,7 @@ export declare class SectionButtonGroupComponent extends ConfigComponent<Section
6026
6026
  }
6027
6027
  export declare class SectionFooterComponent {
6028
6028
  readonly sticky: import("@angular/core").InputSignal<boolean>;
6029
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center">;
6029
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right">;
6030
6030
  readonly maxWidth: import("@angular/core").InputSignal<string | undefined>;
6031
6031
  readonly fullWidth: import("@angular/core").InputSignal<boolean>;
6032
6032
  private readonly scrollSticky;
@@ -6035,7 +6035,7 @@ export declare class SectionFooterComponent {
6035
6035
  protected readonly sidepanel: import("@angular/core").Signal<boolean>;
6036
6036
  protected readonly noBorder: import("@angular/core").Signal<boolean>;
6037
6037
  protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
6038
- protected readonly boxAlign: import("@angular/core").Signal<"left" | "right" | "center">;
6038
+ protected readonly boxAlign: import("@angular/core").Signal<"center" | "left" | "right">;
6039
6039
  static ɵfac: i0.ɵɵFactoryDeclaration<SectionFooterComponent, never>;
6040
6040
  static ɵcmp: i0.ɵɵComponentDeclaration<SectionFooterComponent, "m-section-footer", never, {
6041
6041
  "sticky": {
@@ -8400,7 +8400,7 @@ declare class DropdownBoxComponent {
8400
8400
  }
8401
8401
  /** The trigger both option Fields draw: a searchable text input and a chevron. */
8402
8402
  declare const DROPDOWN_TEMPLATE = "\n @if (config(); as dropdown) {\n @if (dropdown.label) {\n <m-label\n [for]=\"dropdown.name ?? ''\"\n [placeholder]=\"dropdown.label\"\n [params]=\"dropdown.params\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n }\n <div\n class=\"trigger-wrap\"\n #wrapper\n [mSelector]=\"selectorConfig()\"\n [disabled]=\"disabled() || readonly() || !!config()?.readonly\"\n (opened)=\"onOpened()\"\n (closed)=\"onClosed()\"\n (focusin)=\"isFocused.set(true)\"\n (focusout)=\"isFocused.set(false)\"\n >\n <m-text-input\n [config]=\"triggerInputConfig()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [invalid]=\"invalid()\"\n [hideErrors]=\"true\"\n [(touched)]=\"touched\"\n [focused]=\"focused()\"\n (valueChange)=\"onInput($event)\"\n (click)=\"preventToggleWhenOpen($event)\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown.enter)=\"onEnter($event)\"\n (keydown.arrowdown)=\"onArrow($event, 1)\"\n (keydown.arrowup)=\"onArrow($event, -1)\"\n (keydown.tab)=\"$event.stopPropagation()\"\n />\n <m-button [disabled]=\"disabled()\" [config]=\"chevron()\" />\n </div>\n @if (showErrors()) {\n @for (error of errors(); track $index) {\n <m-text-output\n variant=\"footer\"\n color=\"error\"\n [label]=\"error.message\"\n />\n }\n }\n }\n";
8403
- declare const DROPDOWN_IMPORTS: (typeof ButtonComponent | typeof TextOutputComponent | typeof LabelComponent | typeof SelectorDirective | typeof TextInputComponent)[];
8403
+ declare const DROPDOWN_IMPORTS: (typeof ButtonComponent | typeof LabelComponent | typeof SelectorDirective | typeof TextOutputComponent | typeof TextInputComponent)[];
8404
8404
  /**
8405
8405
  * Everything a Dropdown and a Multiselect share: the options, the search, the
8406
8406
  * keyboard walk and the panel. What differs is only what the Field holds — one
@@ -8584,7 +8584,7 @@ declare class ColorPickerBoxComponent implements AfterViewInit, OnDestroy {
8584
8584
  protected readonly _eyedropperConfig: import("@magmonium/one").Button;
8585
8585
  protected readonly _headerContextMenu: ContextMenu;
8586
8586
  protected readonly themeSwatches: import("@angular/core").Signal<{
8587
- key: "error" | "background" | "border" | "text" | "textSecondary" | "mm" | "mmLite" | "mmDark" | "focus" | "errorLight" | "warning" | "successLite" | "success" | "highlight" | "wealth";
8587
+ key: "text" | "error" | "focus" | "mm" | "mmLite" | "mmDark" | "background" | "border" | "textSecondary" | "errorLight" | "warning" | "successLite" | "success" | "highlight" | "wealth";
8588
8588
  color: string;
8589
8589
  }[]>;
8590
8590
  hue: import("@angular/core").WritableSignal<number>;
@@ -9786,7 +9786,7 @@ export declare class SectionFormComponent<T extends object = Record<string, unkn
9786
9786
  readonly heightMode: import("@angular/core").InputSignal<"fixed" | "full" | undefined>;
9787
9787
  readonly maxHeight: import("@angular/core").InputSignal<string | number | undefined>;
9788
9788
  readonly height: import("@angular/core").InputSignal<string | number | undefined>;
9789
- readonly align: import("@angular/core").InputSignal<"left" | "right" | "center" | undefined>;
9789
+ readonly align: import("@angular/core").InputSignal<"center" | "left" | "right" | undefined>;
9790
9790
  readonly padding: import("@angular/core").InputSignal<string | number | undefined>;
9791
9791
  readonly paddingX: import("@angular/core").InputSignal<string | number | undefined>;
9792
9792
  readonly paddingY: import("@angular/core").InputSignal<string | number | undefined>;
@@ -9838,7 +9838,7 @@ export declare class SectionFormComponent<T extends object = Record<string, unkn
9838
9838
  protected readonly handleSubmit: (event: Event) => void;
9839
9839
  readonly resolvedSize: import("@angular/core").Signal<Size>;
9840
9840
  protected readonly sizeLength: import("@angular/core").Signal<string | null>;
9841
- readonly resolvedAlign: import("@angular/core").Signal<"left" | "right" | "center">;
9841
+ readonly resolvedAlign: import("@angular/core").Signal<"center" | "left" | "right">;
9842
9842
  readonly resolvedVariant: import("@angular/core").Signal<string | undefined>;
9843
9843
  readonly resolvedMaxWidth: import("@angular/core").Signal<string | number | undefined>;
9844
9844
  private readonly resolvedPadding;
@@ -12123,7 +12123,7 @@ export declare class ScoreSetItemComponent {
12123
12123
  private readonly themeStore;
12124
12124
  protected readonly tipId: string;
12125
12125
  protected readonly tipDismissed: import("@angular/core").WritableSignal<boolean>;
12126
- protected readonly shape: import("@angular/core").Signal<"primary" | "none" | "row">;
12126
+ protected readonly shape: import("@angular/core").Signal<"none" | "row" | "primary">;
12127
12127
  protected readonly tone: import("@angular/core").Signal<string | null>;
12128
12128
  protected readonly model: import("@angular/core").Signal<{
12129
12129
  value: number | null;
@@ -12261,7 +12261,7 @@ export declare class ScoreSetComponent implements ScoreSetHost {
12261
12261
  "scoreSelect": "scoreSelect";
12262
12262
  }, ["items"], ["m-score-set-item"], true, never>;
12263
12263
  }
12264
- /** A level as a percent change from the current value: 110 vs 100 → +10. */
12264
+ /** A level as a percent change from a reference value: 110 vs 100 → +10. */
12265
12265
  export declare const gapPct: (level: number, value: number) => number;
12266
12266
  /** A gap as signed text, one decimal: +12.7%, −1.6%, 0.0%. */
12267
12267
  export declare const formatGap: (gap: number) => string;
@@ -12345,6 +12345,9 @@ interface LadderSignal {
12345
12345
  * Every predefined rule the levels match, read from one snapshot. A golden or
12346
12346
  * death cross here is the regime — SMA 50 above or below SMA 200 now — not the
12347
12347
  * crossing itself: a snapshot holds no date it happened on.
12348
+ * @deprecated Use `m-scale` (ScaleComponent) with the price relations in
12349
+ * PRICE_SCALE_RELATIONS; the editor migrates stored ladders (v31). Removed
12350
+ * in the next release.
12348
12351
  */
12349
12352
  export declare const ladderSignals: (levels: LadderLevels, symbol?: string) => LadderSignal[];
12350
12353
  /** Whether a name is one of the predefined rules — `custom` and '' are not. */
@@ -12366,7 +12369,7 @@ interface LadderLevel {
12366
12369
  export declare const PRICE_LADDER_LEVELS: readonly LadderLevel[];
12367
12370
  /** The fixed level a key names, or undefined for a key off the list. */
12368
12371
  export declare const ladderLevelOf: (key: string) => LadderLevel | undefined;
12369
- interface Mark {
12372
+ interface Mark$1 {
12370
12373
  key: string;
12371
12374
  name: string;
12372
12375
  value: number;
@@ -12387,6 +12390,9 @@ interface Chip {
12387
12390
  * `rank`, bounds as end-caps, the estimate as a dashed tick or a band. Shape,
12388
12391
  * not colour alone, says which is past and which is forward. Finance-agnostic:
12389
12392
  * what the levels mean arrives as `m-price-ladder-signal` tags from the host.
12393
+ * @deprecated Use `m-scale` (ScaleComponent) with the price relations in
12394
+ * PRICE_SCALE_RELATIONS; the editor migrates stored ladders (v31). Removed
12395
+ * in the next release.
12390
12396
  */
12391
12397
  export declare class PriceLadderComponent {
12392
12398
  /** The featured value — current price. `null` draws a dash. */
@@ -12427,11 +12433,11 @@ export declare class PriceLadderComponent {
12427
12433
  protected readonly current: import("@angular/core").Signal<number | null>;
12428
12434
  /** The forecast point: a `forecast` mark, else the `target` input. */
12429
12435
  private readonly targetPoint;
12430
- protected readonly shownAs: import("@angular/core").Signal<"list" | "line">;
12436
+ protected readonly shownAs: import("@angular/core").Signal<"line" | "list">;
12431
12437
  /** Every drawable mark, the `current` and `forecast` stand-ins included. */
12432
12438
  private readonly everyMark;
12433
12439
  /** The reference levels drawn as ticks and labels. */
12434
- protected readonly marks: import("@angular/core").Signal<Mark[]>;
12440
+ protected readonly marks: import("@angular/core").Signal<Mark$1[]>;
12435
12441
  /** Every predefined rule the drawn levels match, by rule. */
12436
12442
  private readonly matched;
12437
12443
  /** The indicators picked by `signals`: every rule for `all`. */
@@ -12601,6 +12607,9 @@ export declare class PriceLadderComponent {
12601
12607
  * One reference level of a price ladder, written as a tag inside
12602
12608
  * `m-price-ladder` so the levels are markup rather than an array literal. It
12603
12609
  * draws nothing itself: the ladder reads it and places it on the shared axis.
12610
+ * @deprecated Use `m-scale` (ScaleComponent) with the price relations in
12611
+ * PRICE_SCALE_RELATIONS; the editor migrates stored ladders (v31). Removed
12612
+ * in the next release.
12604
12613
  */
12605
12614
  export declare class PriceLadderMarkComponent {
12606
12615
  /**
@@ -12656,6 +12665,9 @@ export declare class PriceLadderMarkComponent {
12656
12665
  * A reading the host draws from the levels (a golden cross, a 52-week
12657
12666
  * breakout), shown as a chip above the ladder. The ladder does not decide what
12658
12667
  * the levels mean — that stays with the host, which writes one tag per signal.
12668
+ * @deprecated Use `m-scale` (ScaleComponent) with the price relations in
12669
+ * PRICE_SCALE_RELATIONS; the editor migrates stored ladders (v31). Removed
12670
+ * in the next release.
12659
12671
  */
12660
12672
  export declare class PriceLadderSignalComponent {
12661
12673
  readonly key: import("@angular/core").InputSignal<string>;
@@ -12700,6 +12712,454 @@ export declare class PriceLadderSignalComponent {
12700
12712
  };
12701
12713
  }, {}, never, never, true, never>;
12702
12714
  }
12715
+ /** `auto` — vertical while the scale's own width is under its `breakpoint`. */
12716
+ type ScaleOrientation = 'auto' | 'horizontal' | 'vertical';
12717
+ /** A grid breakpoint key, read against the scale's own width, not the viewport. */
12718
+ type ScaleBreakpoint = 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
12719
+ type ScaleFormat = 'number' | 'currency' | 'percent';
12720
+ /** `level` — a tick. `bound` — an end-cap; two bounds shade the range between.
12721
+ * `target` — a dashed tick, with `low`/`high` a hatched band. */
12722
+ type ScaleMarkKind = 'level' | 'bound' | 'target';
12723
+ /** How a relation's chip and bracket read. `gold` is a golden cross. */
12724
+ type ScaleTone = 'up' | 'down' | 'warn' | 'gold' | 'neutral';
12725
+ /** `compare` — a mark against a mark, a fixed value or a % of a mark.
12726
+ * `combine` — other relations joined by `mode`. `always` — holds whatever
12727
+ * the marks say: a fixed chip. */
12728
+ type ScaleRelationType = 'compare' | 'combine' | 'always';
12729
+ /** `within`/`beyond` read the gap % between left and right against `n`. */
12730
+ type ScaleCompareOp = 'gt' | 'gte' | 'lt' | 'lte' | 'within' | 'beyond';
12731
+ /** What a compare's right side is: the mark `right`, `rightValue` itself,
12732
+ * or `rightValue` % of the mark `right`. */
12733
+ type ScaleOperandKind = 'mark' | 'fixed' | 'pct';
12734
+ type ScaleCombineMode = 'all' | 'any' | 'not';
12735
+ interface Mark {
12736
+ key: string;
12737
+ name: string;
12738
+ value: number;
12739
+ kind: ScaleMarkKind;
12740
+ low: number | null;
12741
+ high: number | null;
12742
+ primary: boolean;
12743
+ }
12744
+ /**
12745
+ * Several values of one quantity on one linear axis — current, min, ideal,
12746
+ * max — so where one sits against the others reads at a glance. The scale's
12747
+ * `label` names the quantity and its `primary` mark is the main reading,
12748
+ * shown large beside it. Relations (`m-scale-relation`) name what the marks
12749
+ * mean together and show as chips while they hold. Horizontal on a wide
12750
+ * container, vertical under `breakpoint`, read off the scale's own width.
12751
+ */
12752
+ export declare class ScaleComponent {
12753
+ /** TranslationAsset key naming the quantity, e.g. `stock-qty`. */
12754
+ readonly label: import("@angular/core").InputSignal<string>;
12755
+ readonly format: import("@angular/core").InputSignal<ScaleFormat>;
12756
+ /** ISO code for `currency`. */
12757
+ readonly currency: import("@angular/core").InputSignal<string>;
12758
+ /** Suffix after every `number` value, e.g. `kg`. */
12759
+ readonly unit: import("@angular/core").InputSignal<string>;
12760
+ /** Under this width (of the scale, not the screen) `auto` turns vertical. */
12761
+ readonly breakpoint: import("@angular/core").InputSignal<ScaleBreakpoint>;
12762
+ readonly orientation: import("@angular/core").InputSignal<ScaleOrientation>;
12763
+ /** Pin the axis ends; unset, they fit the marks. */
12764
+ readonly min: import("@angular/core").InputSignal<number | null | undefined>;
12765
+ readonly max: import("@angular/core").InputSignal<number | null | undefined>;
12766
+ /** A mark further than this % from the primary is pinned to the edge. Unset, none is. */
12767
+ readonly maxSpanPct: import("@angular/core").InputSignal<number | null | undefined>;
12768
+ private readonly markTags;
12769
+ private readonly relationTags;
12770
+ private readonly translateService;
12771
+ private readonly width;
12772
+ constructor();
12773
+ private readonly t;
12774
+ private readonly formatter;
12775
+ /** A value as text: a `percent` value is already in percent (12.5 → 12.5%). */
12776
+ readonly formatValue: (v: number) => string;
12777
+ protected readonly shownAs: import("@angular/core").Signal<"vertical" | "horizontal">;
12778
+ private readonly marks;
12779
+ protected readonly primary: import("@angular/core").Signal<Mark | null>;
12780
+ private readonly relations;
12781
+ private readonly results;
12782
+ /** One chip per relation that holds and is not hidden. */
12783
+ protected readonly chips: import("@angular/core").Signal<{
12784
+ key: string;
12785
+ label: string;
12786
+ tone: ScaleTone;
12787
+ detail: string;
12788
+ }[]>;
12789
+ private readonly domain;
12790
+ /** Height of a vertical scale: one row per mark, never under the minimum. */
12791
+ protected readonly verticalPx: import("@angular/core").Signal<number>;
12792
+ /**
12793
+ * Everything the plot places, in % from the axis start — the left edge, or
12794
+ * the top on a vertical scale, where the highest value sits.
12795
+ */
12796
+ protected readonly plot: import("@angular/core").Signal<{
12797
+ ticks: {
12798
+ key: string;
12799
+ kind: ScaleMarkKind;
12800
+ primary: boolean;
12801
+ at: number;
12802
+ pin: string;
12803
+ }[];
12804
+ bands: {
12805
+ from: number;
12806
+ size: number;
12807
+ key: string;
12808
+ }[];
12809
+ range: {
12810
+ from: number;
12811
+ size: number;
12812
+ } | null;
12813
+ brackets: {
12814
+ row: number;
12815
+ from: number;
12816
+ size: number;
12817
+ key: string;
12818
+ tone: ScaleTone;
12819
+ label: string;
12820
+ }[];
12821
+ labels: {
12822
+ name: string;
12823
+ valueText: string;
12824
+ primary: boolean;
12825
+ target: boolean;
12826
+ key: string;
12827
+ lane: number;
12828
+ at: number;
12829
+ }[];
12830
+ lanes: number;
12831
+ }>;
12832
+ protected readonly summary: import("@angular/core").Signal<string>;
12833
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScaleComponent, never>;
12834
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScaleComponent, "m-scale", never, {
12835
+ "label": {
12836
+ "alias": "label";
12837
+ "required": false;
12838
+ "isSignal": true;
12839
+ };
12840
+ "format": {
12841
+ "alias": "format";
12842
+ "required": false;
12843
+ "isSignal": true;
12844
+ };
12845
+ "currency": {
12846
+ "alias": "currency";
12847
+ "required": false;
12848
+ "isSignal": true;
12849
+ };
12850
+ "unit": {
12851
+ "alias": "unit";
12852
+ "required": false;
12853
+ "isSignal": true;
12854
+ };
12855
+ "breakpoint": {
12856
+ "alias": "breakpoint";
12857
+ "required": false;
12858
+ "isSignal": true;
12859
+ };
12860
+ "orientation": {
12861
+ "alias": "orientation";
12862
+ "required": false;
12863
+ "isSignal": true;
12864
+ };
12865
+ "min": {
12866
+ "alias": "min";
12867
+ "required": false;
12868
+ "isSignal": true;
12869
+ };
12870
+ "max": {
12871
+ "alias": "max";
12872
+ "required": false;
12873
+ "isSignal": true;
12874
+ };
12875
+ "maxSpanPct": {
12876
+ "alias": "maxSpanPct";
12877
+ "required": false;
12878
+ "isSignal": true;
12879
+ };
12880
+ }, {}, ["markTags", "relationTags"], never, true, never>;
12881
+ }
12882
+ /**
12883
+ * One value on a scale (`min`, `ideal`, `current`), written as a tag inside
12884
+ * `m-scale`. It draws nothing itself: the scale reads it and places it on the
12885
+ * shared axis; relations name it by `key`.
12886
+ */
12887
+ export declare class ScaleMarkComponent {
12888
+ /** What relations name the mark by. */
12889
+ readonly key: import("@angular/core").InputSignal<string>;
12890
+ /** TranslationAsset key naming the mark; unset, its key. */
12891
+ readonly label: import("@angular/core").InputSignal<string>;
12892
+ /** Missing or NaN → the mark is left out, and relations reading it do not hold. */
12893
+ readonly value: import("@angular/core").InputSignal<number | null | undefined>;
12894
+ readonly kind: import("@angular/core").InputSignal<ScaleMarkKind>;
12895
+ /** A `target`'s band ends; both set draw a hatched band. */
12896
+ readonly low: import("@angular/core").InputSignal<number | null | undefined>;
12897
+ readonly high: import("@angular/core").InputSignal<number | null | undefined>;
12898
+ /** The main reading: drawn as the dot and shown beside the scale's label. First one wins. */
12899
+ readonly primary: import("@angular/core").InputSignal<boolean>;
12900
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScaleMarkComponent, never>;
12901
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScaleMarkComponent, "m-scale-mark", never, {
12902
+ "key": {
12903
+ "alias": "key";
12904
+ "required": false;
12905
+ "isSignal": true;
12906
+ };
12907
+ "label": {
12908
+ "alias": "label";
12909
+ "required": false;
12910
+ "isSignal": true;
12911
+ };
12912
+ "value": {
12913
+ "alias": "value";
12914
+ "required": false;
12915
+ "isSignal": true;
12916
+ };
12917
+ "kind": {
12918
+ "alias": "kind";
12919
+ "required": false;
12920
+ "isSignal": true;
12921
+ };
12922
+ "low": {
12923
+ "alias": "low";
12924
+ "required": false;
12925
+ "isSignal": true;
12926
+ };
12927
+ "high": {
12928
+ "alias": "high";
12929
+ "required": false;
12930
+ "isSignal": true;
12931
+ };
12932
+ "primary": {
12933
+ "alias": "primary";
12934
+ "required": false;
12935
+ "isSignal": true;
12936
+ };
12937
+ }, {}, never, never, true, never>;
12938
+ }
12939
+ /**
12940
+ * A named reading of a scale's marks (a golden cross, "reorder soon"), shown
12941
+ * as a chip above the scale while it holds. A `compare` sets mark `left`
12942
+ * against the mark `right`, the fixed `rightValue`, or `rightValue` % of
12943
+ * `right`; a `combine` joins other relations named in `of`; an `always` is
12944
+ * a fixed chip. Draws nothing.
12945
+ */
12946
+ export declare class ScaleRelationComponent {
12947
+ /** What other relations name it by in `of`. */
12948
+ readonly key: import("@angular/core").InputSignal<string>;
12949
+ /** TranslationAsset key for the chip; unset, the key. */
12950
+ readonly label: import("@angular/core").InputSignal<string>;
12951
+ readonly tone: import("@angular/core").InputSignal<ScaleTone>;
12952
+ /** TranslationAsset key for the chip's title, filled from `<left>`, `<right>`, `<gap>`. */
12953
+ readonly detail: import("@angular/core").InputSignal<string>;
12954
+ readonly type: import("@angular/core").InputSignal<ScaleRelationType>;
12955
+ readonly left: import("@angular/core").InputSignal<string>;
12956
+ readonly op: import("@angular/core").InputSignal<ScaleCompareOp>;
12957
+ readonly right: import("@angular/core").InputSignal<string>;
12958
+ readonly rightKind: import("@angular/core").InputSignal<ScaleOperandKind>;
12959
+ readonly rightValue: import("@angular/core").InputSignal<number | null | undefined>;
12960
+ /** Gap % that `within`/`beyond` read against. */
12961
+ readonly n: import("@angular/core").InputSignal<number | null | undefined>;
12962
+ readonly mode: import("@angular/core").InputSignal<ScaleCombineMode>;
12963
+ /** Relation keys a combine joins, comma- or space-separated. */
12964
+ readonly of: import("@angular/core").InputSignal<string | readonly string[] | undefined>;
12965
+ /** Evaluated and usable in a combine, but no chip. */
12966
+ readonly hidden: import("@angular/core").InputSignal<boolean>;
12967
+ /** While it holds, bracket the two operands on the axis. */
12968
+ readonly bracket: import("@angular/core").InputSignal<boolean>;
12969
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScaleRelationComponent, never>;
12970
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScaleRelationComponent, "m-scale-relation", never, {
12971
+ "key": {
12972
+ "alias": "key";
12973
+ "required": false;
12974
+ "isSignal": true;
12975
+ };
12976
+ "label": {
12977
+ "alias": "label";
12978
+ "required": false;
12979
+ "isSignal": true;
12980
+ };
12981
+ "tone": {
12982
+ "alias": "tone";
12983
+ "required": false;
12984
+ "isSignal": true;
12985
+ };
12986
+ "detail": {
12987
+ "alias": "detail";
12988
+ "required": false;
12989
+ "isSignal": true;
12990
+ };
12991
+ "type": {
12992
+ "alias": "type";
12993
+ "required": false;
12994
+ "isSignal": true;
12995
+ };
12996
+ "left": {
12997
+ "alias": "left";
12998
+ "required": false;
12999
+ "isSignal": true;
13000
+ };
13001
+ "op": {
13002
+ "alias": "op";
13003
+ "required": false;
13004
+ "isSignal": true;
13005
+ };
13006
+ "right": {
13007
+ "alias": "right";
13008
+ "required": false;
13009
+ "isSignal": true;
13010
+ };
13011
+ "rightKind": {
13012
+ "alias": "rightKind";
13013
+ "required": false;
13014
+ "isSignal": true;
13015
+ };
13016
+ "rightValue": {
13017
+ "alias": "rightValue";
13018
+ "required": false;
13019
+ "isSignal": true;
13020
+ };
13021
+ "n": {
13022
+ "alias": "n";
13023
+ "required": false;
13024
+ "isSignal": true;
13025
+ };
13026
+ "mode": {
13027
+ "alias": "mode";
13028
+ "required": false;
13029
+ "isSignal": true;
13030
+ };
13031
+ "of": {
13032
+ "alias": "of";
13033
+ "required": false;
13034
+ "isSignal": true;
13035
+ };
13036
+ "hidden": {
13037
+ "alias": "hidden";
13038
+ "required": false;
13039
+ "isSignal": true;
13040
+ };
13041
+ "bracket": {
13042
+ "alias": "bracket";
13043
+ "required": false;
13044
+ "isSignal": true;
13045
+ };
13046
+ }, {}, never, never, true, never>;
13047
+ }
13048
+ interface ScaleDomainInput {
13049
+ /** Every value the scale draws: marks and target band ends. */
13050
+ values: readonly number[];
13051
+ /** The primary mark's value, which `maxSpanPct` is read from. */
13052
+ primary: number | null;
13053
+ /** A value further than this % from the primary is pinned to the edge. */
13054
+ maxSpanPct: number | null;
13055
+ /** Pins the axis ends; unset, they fit the values. */
13056
+ min: number | null;
13057
+ max: number | null;
13058
+ }
13059
+ interface ScaleDomain {
13060
+ lo: number;
13061
+ hi: number;
13062
+ /** −1 pinned to the low edge, 1 to the high edge, 0 on the axis. */
13063
+ pin: (v: number) => -1 | 0 | 1;
13064
+ /** Position along the axis, 0–100 (%), a pinned value at its edge. */
13065
+ pos: (v: number) => number;
13066
+ }
13067
+ /**
13068
+ * One linear axis fitted to the values. A value past `maxSpanPct` from the
13069
+ * primary is left off the fit and pinned to its edge, so one far mark cannot
13070
+ * squeeze the rest together; so is any value outside a pinned `min`/`max`.
13071
+ */
13072
+ export declare const scaleDomain: ({ values, primary, maxSpanPct, min, max }: ScaleDomainInput) => ScaleDomain;
13073
+ /** A relation as the scale evaluates it, read off one `m-scale-relation` tag. */
13074
+ interface ScaleRelationDef {
13075
+ key: string;
13076
+ type: ScaleRelationType;
13077
+ /** compare: the left mark's key. */
13078
+ left: string;
13079
+ op: ScaleCompareOp;
13080
+ /** compare: the right mark's key, for `mark` and `pct`. */
13081
+ right: string;
13082
+ rightKind: ScaleOperandKind;
13083
+ /** The fixed value, or the % of `right`. */
13084
+ rightValue: number | null;
13085
+ /** Gap % that `within`/`beyond` read against. */
13086
+ n: number | null;
13087
+ /** combine: how `of` joins. */
13088
+ mode: ScaleCombineMode;
13089
+ /** combine: keys of the relations joined. */
13090
+ of: readonly string[];
13091
+ }
13092
+ interface ScaleRelationResult {
13093
+ holds: boolean;
13094
+ /** compare: the operands and their gap %, null where missing. */
13095
+ left: number | null;
13096
+ right: number | null;
13097
+ gap: number | null;
13098
+ }
13099
+ /** A keys list as a tag gives it: comma- or space-separated, or an array. */
13100
+ export declare const parseKeys: (raw: string | readonly string[] | null | undefined) => string[];
13101
+ /**
13102
+ * Every relation's reading against the marks' values, by key. A missing
13103
+ * operand, an unknown relation or a cycle does not hold — never an error — so
13104
+ * a combine over it reads it as false.
13105
+ */
13106
+ export declare const evaluateRelations: (defs: readonly ScaleRelationDef[], values: ReadonlyMap<string, number>) => Map<string, ScaleRelationResult>;
13107
+ interface SpreadItem {
13108
+ key: string;
13109
+ /** Where the item sits along the axis, in px. */
13110
+ y: number;
13111
+ }
13112
+ /**
13113
+ * Pushes labels apart along one axis so no two stand closer than `gapPx`,
13114
+ * keeping their order, then pulls the run back inside `0…lengthPx`. Each label
13115
+ * moves as little as its neighbours allow.
13116
+ */
13117
+ export declare const spreadLabels: (items: readonly SpreadItem[], gapPx: number, lengthPx: number) => SpreadItem[];
13118
+ /**
13119
+ * The PriceLadder's predefined readings written as ScaleRelations (GLOSSARY.md
13120
+ * Scale, ScaleRelation) over the mark keys `current`, `sma10`, `sma50`,
13121
+ * `sma100`, `sma200`, `low52w`, `high52w` and `forecast`.
13122
+ *
13123
+ * One list, read three times: a host draws a price Scale's relations from it,
13124
+ * the editor's v31 migration turns a stored ladder's `signals` into these, and
13125
+ * the shipped `price-scale` ControlGroup carries every one (its spec holds the
13126
+ * two equal). A rule's key is its old PRICE_LADDER_RULES name, so its
13127
+ * TranslationAsset is the chip's words as before. Angular-free, so codegen
13128
+ * reads it too.
13129
+ */
13130
+ /** One relation as an `m-scale-relation` tag's inputs — and as a stored
13131
+ * `scale_relation` Control's `configs`. Only what it sets is present. */
13132
+ interface PriceRelation {
13133
+ key: string;
13134
+ label?: string;
13135
+ tone: ScaleTone;
13136
+ type: ScaleRelationType;
13137
+ left?: string;
13138
+ op?: ScaleCompareOp;
13139
+ rightKind?: ScaleOperandKind;
13140
+ right?: string;
13141
+ rightValue?: number;
13142
+ n?: number;
13143
+ mode?: ScaleCombineMode;
13144
+ of?: string[];
13145
+ hidden?: boolean;
13146
+ bracket?: boolean;
13147
+ }
13148
+ /** The nineteen readings, in PRICE_LADDER_RULES order. */
13149
+ export declare const PRICE_RULES: readonly PriceRelation[];
13150
+ /** The hidden building blocks the readings combine. */
13151
+ export declare const PRICE_HELPERS: readonly PriceRelation[];
13152
+ export declare const isPriceRule: (name: unknown) => name is string;
13153
+ /**
13154
+ * Every relation the named readings need: each one as written, then every
13155
+ * relation a combine among them names, transitively. A reading pulled in only
13156
+ * because a combine names it comes hidden — `golden-cross-near` alone shows
13157
+ * one chip, not a `death-cross` chip beside it, as the ladder did. Unknown
13158
+ * names are skipped.
13159
+ */
13160
+ export declare const priceRelationsFor: (rules: readonly string[]) => PriceRelation[];
13161
+ /** Every reading and helper, each once: what `price-scale` carries. */
13162
+ export declare const PRICE_SCALE_RELATIONS: readonly PriceRelation[];
12703
13163
  export declare class ImgComponent {
12704
13164
  #private;
12705
13165
  readonly src: import("@angular/core").InputSignal<string | null | undefined>;
@@ -13065,7 +13525,7 @@ export type DocAiPhase = 'idle' | 'asking' | 'question' | 'outline' | 'writing'
13065
13525
  */
13066
13526
  export declare class DocEditorComponent implements ControlValueAccessor {
13067
13527
  protected readonly groups: readonly import("@magmonium/one").DocToolbarGroup[];
13068
- protected readonly icons: Record<"code" | "link" | "list" | "table" | "strike" | "bold" | "heading" | "italic" | "quote", string>;
13528
+ protected readonly icons: Record<"code" | "link" | "table" | "strike" | "list" | "bold" | "heading" | "italic" | "quote", string>;
13069
13529
  protected readonly docActionKey: typeof docActionKey;
13070
13530
  private readonly translate;
13071
13531
  protected readonly value: import("@angular/core").WritableSignal<string>;
@@ -15091,8 +15551,8 @@ export declare class ConfirmComponent {
15091
15551
  cancelLabel: import("@angular/core").InputSignal<string>;
15092
15552
  protected readonly confirmText: import("@angular/core").Signal<string>;
15093
15553
  protected readonly cancelText: import("@angular/core").Signal<string>;
15094
- protected readonly accent: import("@angular/core").Signal<"warning" | "error" | "success" | "mm">;
15095
- protected readonly iconName: import("@angular/core").Signal<"info" | "exclamation-triangle" | "trash" | "check-circle">;
15554
+ protected readonly accent: import("@angular/core").Signal<"error" | "mm" | "success" | "warning">;
15555
+ protected readonly iconName: import("@angular/core").Signal<"exclamation-triangle" | "info" | "trash" | "check-circle">;
15096
15556
  protected accept(): void;
15097
15557
  protected decline(): void;
15098
15558
  static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmComponent, never>;
@@ -18875,4 +19335,4 @@ export declare const toggleUid: (audience: Audience, uid: string) => Audience;
18875
19335
  export declare const toggleGroup: (audience: Audience, groupId: string) => Audience;
18876
19336
  /** How many Users and Groups an Audience names. */
18877
19337
  export declare const pickCount: (audience: Audience) => number;
18878
- export type { Accordion, AccordionGroup, AccordionVariant, AppCardData, AppCardInputs, AppCardVariant, AppLogoTone, AppLogoVariant, AppManifest, AppTileData, AssetOption, Audience, AudienceLevel, AudienceMember, AudiencePicker, AuthResult, Badge, BadgeCount, BadgePosition, BadgeVariant, Button, ButtonGroup, CellChangeEvent, CellClickEvent, ColBreakpoint, ColSpan, ColorPallet, ColumnDef, Comment, CommentItem, Config, ContextMenu, ContextMenuEvent, Cursor, CustomIcon, DragListReorder, Draggable, DraggableState, FileUploadConfig, FileUploadEvent, FilterGroupContext, FilterGroupMember, FilterOption, FilterPanel, FilterPanelIo, FilterRangeMode, FilterSelectionMap, FilterValue, FilterVariant, FilteredTreeGrid, FlatTreeGridRow, FlexAlign, FlexAlignSelf, FlexConfig, FlexDirection, FlexItemConfig, FlexJustify, FlexVariant, GridAlignX, GridAlignY, GroupActionEvent, GroupDropEvent, GroupKind, GroupMenuEvent, Header, HeaderLevel, HeatSwatchRadius, Icon, KeyValueVariant, LabelSegment, LadderLevel, LadderLevels, LadderSignal, ListConfig, ListContext, ListItem, ListOrientation, ListVariant, MenuItem, MoneySystem, NavCountConfig, NavInstanceConfig, NavMenuConfig, NavRowsConfig, NavVisibilityConfig, NavVisibleAnswer, NavWidgetConfig, NavWidgetEntry, NavWidgetMap, OverlayWidgetLoader, OverlayWidgetMap, PageChangeEvent, Pagination, PaginationWindow, PriceLadderMarkKind, PriceLadderRule, PriceLadderTone, PriceLadderVariant, ResolvedUserTab, RowDropEvent, ScoreBand, ScoreSetVariant, SearchChangeEvent, SectionAccordion, SectionAccordionGroup, SectionAccordionGroupContext, SectionAccordionRef, SectionButtonGroupConfig, SectionChartCategories, SectionChartConfig, SectionChartMark, SectionChartPanel, SectionChartPoints, SectionChartScale, SectionChartWindow, SectionFilterGroupConfig, SectionHero, SectionHeroVariant, SectionTableAlign, SectionTableColumn, SectionTableConfig, SectionTableDataType, SectionTableSort, SectionTableVariant, SectionToggleItem, SectionToggleItemContext, SelectionAction, SelectionActionEvent, SelectionChangeEvent, SelectorConfig, SharingClient, SharingGroup, SocketMessage, Sort, SortChange, SortChangeEvent, SortOption, SortOrder, SourceAudience, SpacingInward, SqueezeMode, StatAlign, StatCornerEdge, StatCornerPosition, StatCornerSide, StatSurface, StatVariant, TabGroup, TableConfig, TableFilterCondition, TableFilterDef, TableGroup, TextOrNumberInput, Timeline, TimelineItem, TreeGridCellClickEvent, TreeGridLoadChildrenEvent, TreeGridRow, TreeGridRowSelectEvent, TreeGridToggleEvent, User };
19338
+ export type { Accordion, AccordionGroup, AccordionVariant, AppCardData, AppCardInputs, AppCardVariant, AppLogoTone, AppLogoVariant, AppManifest, AppTileData, AssetOption, Audience, AudienceLevel, AudienceMember, AudiencePicker, AuthResult, Badge, BadgeCount, BadgePosition, BadgeVariant, Button, ButtonGroup, CellChangeEvent, CellClickEvent, ColBreakpoint, ColSpan, ColorPallet, ColumnDef, Comment, CommentItem, Config, ContextMenu, ContextMenuEvent, Cursor, CustomIcon, DragListReorder, Draggable, DraggableState, FileUploadConfig, FileUploadEvent, FilterGroupContext, FilterGroupMember, FilterOption, FilterPanel, FilterPanelIo, FilterRangeMode, FilterSelectionMap, FilterValue, FilterVariant, FilteredTreeGrid, FlatTreeGridRow, FlexAlign, FlexAlignSelf, FlexConfig, FlexDirection, FlexItemConfig, FlexJustify, FlexVariant, GridAlignX, GridAlignY, GroupActionEvent, GroupDropEvent, GroupKind, GroupMenuEvent, Header, HeaderLevel, HeatSwatchRadius, Icon, KeyValueVariant, LabelSegment, LadderLevel, LadderLevels, LadderSignal, ListConfig, ListContext, ListItem, ListOrientation, ListVariant, MenuItem, MoneySystem, NavCountConfig, NavInstanceConfig, NavMenuConfig, NavRowsConfig, NavVisibilityConfig, NavVisibleAnswer, NavWidgetConfig, NavWidgetEntry, NavWidgetMap, OverlayWidgetLoader, OverlayWidgetMap, PageChangeEvent, Pagination, PaginationWindow, PriceLadderMarkKind, PriceLadderRule, PriceLadderTone, PriceLadderVariant, PriceRelation, ResolvedUserTab, RowDropEvent, ScaleBreakpoint, ScaleCombineMode, ScaleCompareOp, ScaleDomain, ScaleDomainInput, ScaleFormat, ScaleMarkKind, ScaleOperandKind, ScaleOrientation, ScaleRelationDef, ScaleRelationResult, ScaleRelationType, ScaleTone, ScoreBand, ScoreSetVariant, SearchChangeEvent, SectionAccordion, SectionAccordionGroup, SectionAccordionGroupContext, SectionAccordionRef, SectionButtonGroupConfig, SectionChartCategories, SectionChartConfig, SectionChartMark, SectionChartPanel, SectionChartPoints, SectionChartScale, SectionChartWindow, SectionFilterGroupConfig, SectionHero, SectionHeroVariant, SectionTableAlign, SectionTableColumn, SectionTableConfig, SectionTableDataType, SectionTableSort, SectionTableVariant, SectionToggleItem, SectionToggleItemContext, SelectionAction, SelectionActionEvent, SelectionChangeEvent, SelectorConfig, SharingClient, SharingGroup, SocketMessage, Sort, SortChange, SortChangeEvent, SortOption, SortOrder, SourceAudience, SpacingInward, SpreadItem, SqueezeMode, StatAlign, StatCornerEdge, StatCornerPosition, StatCornerSide, StatSurface, StatVariant, TabGroup, TableConfig, TableFilterCondition, TableFilterDef, TableGroup, TextOrNumberInput, Timeline, TimelineItem, TreeGridCellClickEvent, TreeGridLoadChildrenEvent, TreeGridRow, TreeGridRowSelectEvent, TreeGridToggleEvent, User };