@magmonium/one 0.4.55 → 0.4.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/assets/i18n/af.json +103 -47
  2. package/assets/i18n/am.json +111 -59
  3. package/assets/i18n/ar.json +84 -59
  4. package/assets/i18n/as.json +105 -50
  5. package/assets/i18n/az.json +106 -50
  6. package/assets/i18n/ba.json +94 -45
  7. package/assets/i18n/be.json +105 -49
  8. package/assets/i18n/bg.json +99 -43
  9. package/assets/i18n/bn.json +104 -54
  10. package/assets/i18n/br.json +91 -43
  11. package/assets/i18n/brx.json +97 -29
  12. package/assets/i18n/bs.json +100 -43
  13. package/assets/i18n/ca.json +103 -47
  14. package/assets/i18n/ceb.json +99 -40
  15. package/assets/i18n/cnr.json +83 -43
  16. package/assets/i18n/co.json +105 -47
  17. package/assets/i18n/cs.json +98 -43
  18. package/assets/i18n/cy.json +83 -48
  19. package/assets/i18n/da.json +89 -35
  20. package/assets/i18n/de.json +75 -53
  21. package/assets/i18n/doi.json +107 -45
  22. package/assets/i18n/el.json +93 -44
  23. package/assets/i18n/en.json +2 -1
  24. package/assets/i18n/eo.json +98 -44
  25. package/assets/i18n/es.json +59 -46
  26. package/assets/i18n/et.json +97 -42
  27. package/assets/i18n/eu.json +106 -48
  28. package/assets/i18n/fa.json +79 -43
  29. package/assets/i18n/fi.json +91 -37
  30. package/assets/i18n/fr.json +78 -53
  31. package/assets/i18n/fy.json +96 -43
  32. package/assets/i18n/ga.json +89 -45
  33. package/assets/i18n/gd.json +84 -47
  34. package/assets/i18n/gl.json +95 -45
  35. package/assets/i18n/gu.json +103 -52
  36. package/assets/i18n/ha.json +93 -45
  37. package/assets/i18n/haw.json +95 -45
  38. package/assets/i18n/he.json +84 -34
  39. package/assets/i18n/hi.json +84 -61
  40. package/assets/i18n/hmn.json +88 -38
  41. package/assets/i18n/hr.json +100 -43
  42. package/assets/i18n/hu.json +90 -45
  43. package/assets/i18n/hy.json +106 -51
  44. package/assets/i18n/id.json +77 -31
  45. package/assets/i18n/ie.json +78 -24
  46. package/assets/i18n/ig.json +88 -40
  47. package/assets/i18n/ilo.json +86 -29
  48. package/assets/i18n/is.json +89 -44
  49. package/assets/i18n/it.json +69 -48
  50. package/assets/i18n/iw.json +85 -38
  51. package/assets/i18n/ja.json +67 -48
  52. package/assets/i18n/jw.json +81 -34
  53. package/assets/i18n/ka.json +93 -43
  54. package/assets/i18n/kk.json +87 -42
  55. package/assets/i18n/km.json +85 -41
  56. package/assets/i18n/kn.json +105 -51
  57. package/assets/i18n/ko.json +68 -51
  58. package/assets/i18n/kok.json +104 -42
  59. package/assets/i18n/ks.json +94 -27
  60. package/assets/i18n/ku.json +84 -40
  61. package/assets/i18n/ky.json +84 -41
  62. package/assets/i18n/la.json +81 -37
  63. package/assets/i18n/lb.json +80 -39
  64. package/assets/i18n/lo.json +81 -39
  65. package/assets/i18n/lt.json +82 -43
  66. package/assets/i18n/lv.json +81 -42
  67. package/assets/i18n/ma.json +93 -28
  68. package/assets/i18n/mai.json +98 -35
  69. package/assets/i18n/me.json +67 -20
  70. package/assets/i18n/mg.json +82 -39
  71. package/assets/i18n/mi.json +86 -42
  72. package/assets/i18n/mk.json +81 -40
  73. package/assets/i18n/ml.json +98 -42
  74. package/assets/i18n/mn.json +81 -40
  75. package/assets/i18n/mni.json +92 -27
  76. package/assets/i18n/mr.json +100 -44
  77. package/assets/i18n/ms.json +77 -35
  78. package/assets/i18n/mt.json +79 -37
  79. package/assets/i18n/my.json +80 -39
  80. package/assets/i18n/ne.json +76 -35
  81. package/assets/i18n/nl.json +80 -47
  82. package/assets/i18n/no.json +71 -30
  83. package/assets/i18n/ny.json +100 -37
  84. package/assets/i18n/or.json +105 -49
  85. package/assets/i18n/pa.json +100 -45
  86. package/assets/i18n/pl.json +65 -45
  87. package/assets/i18n/ps.json +75 -33
  88. package/assets/i18n/pt.json +61 -44
  89. package/assets/i18n/rm.json +71 -26
  90. package/assets/i18n/ro.json +74 -34
  91. package/assets/i18n/ru.json +62 -45
  92. package/assets/i18n/sa.json +98 -36
  93. package/assets/i18n/sat.json +98 -37
  94. package/assets/i18n/sc.json +70 -25
  95. package/assets/i18n/sd.json +95 -31
  96. package/assets/i18n/si.json +72 -34
  97. package/assets/i18n/sk.json +71 -31
  98. package/assets/i18n/sl.json +70 -32
  99. package/assets/i18n/sm.json +71 -30
  100. package/assets/i18n/sn.json +66 -25
  101. package/assets/i18n/so.json +66 -26
  102. package/assets/i18n/sq.json +95 -39
  103. package/assets/i18n/sr.json +68 -29
  104. package/assets/i18n/st.json +68 -27
  105. package/assets/i18n/su.json +64 -24
  106. package/assets/i18n/sv.json +66 -25
  107. package/assets/i18n/sw.json +60 -20
  108. package/assets/i18n/ta.json +92 -42
  109. package/assets/i18n/te.json +95 -39
  110. package/assets/i18n/tg.json +69 -31
  111. package/assets/i18n/th.json +65 -27
  112. package/assets/i18n/tl.json +86 -26
  113. package/assets/i18n/tr.json +63 -46
  114. package/assets/i18n/uk.json +64 -26
  115. package/assets/i18n/ur.json +93 -33
  116. package/assets/i18n/uz.json +64 -25
  117. package/assets/i18n/vi.json +64 -26
  118. package/assets/i18n/xh.json +65 -25
  119. package/assets/i18n/yi.json +66 -28
  120. package/assets/i18n/yo.json +65 -26
  121. package/assets/i18n/zh.json +71 -37
  122. package/assets/i18n/zu.json +63 -25
  123. package/fesm2022/{magmonium-one-base-dropdown-Tf6PltuH.mjs → magmonium-one-base-dropdown-BgLka4oB.mjs} +5 -5
  124. package/fesm2022/{magmonium-one-base-dropdown-Tf6PltuH.mjs.map → magmonium-one-base-dropdown-BgLka4oB.mjs.map} +1 -1
  125. package/fesm2022/{magmonium-one-checkbox-CbEdjmtz.mjs → magmonium-one-checkbox-CyVd_a7p.mjs} +2 -2
  126. package/fesm2022/{magmonium-one-checkbox-CbEdjmtz.mjs.map → magmonium-one-checkbox-CyVd_a7p.mjs.map} +1 -1
  127. package/fesm2022/{magmonium-one-directives-C_i3gUFT.mjs → magmonium-one-directives-Dbe0pfCf.mjs} +2 -2
  128. package/fesm2022/magmonium-one-directives-Dbe0pfCf.mjs.map +1 -0
  129. package/fesm2022/{magmonium-one-file.service-Bo06pU3_.mjs → magmonium-one-file.service-D39FjShR.mjs} +2 -1
  130. package/fesm2022/magmonium-one-file.service-D39FjShR.mjs.map +1 -0
  131. package/fesm2022/{magmonium-one-group-C7alQqSj.mjs → magmonium-one-group-BPhM2IIa.mjs} +2 -2
  132. package/fesm2022/{magmonium-one-group-C7alQqSj.mjs.map → magmonium-one-group-BPhM2IIa.mjs.map} +1 -1
  133. package/fesm2022/{magmonium-one-image-editor-DHlktZ6z.mjs → magmonium-one-image-editor-CKx7BRVF.mjs} +2 -2
  134. package/fesm2022/{magmonium-one-image-editor-DHlktZ6z.mjs.map → magmonium-one-image-editor-CKx7BRVF.mjs.map} +1 -1
  135. package/fesm2022/magmonium-one-input-DqHPorA1.mjs.map +1 -1
  136. package/fesm2022/{magmonium-one-label-B95NhEzQ.mjs → magmonium-one-label-B8WJHiU4.mjs} +12 -2
  137. package/fesm2022/magmonium-one-label-B8WJHiU4.mjs.map +1 -0
  138. package/fesm2022/{magmonium-one-menu-DmZJi88Y.mjs → magmonium-one-menu-CxswmD0O.mjs} +2 -2
  139. package/fesm2022/{magmonium-one-menu-DmZJi88Y.mjs.map → magmonium-one-menu-CxswmD0O.mjs.map} +1 -1
  140. package/fesm2022/{magmonium-one-multi-range-BnWtK-O0.mjs → magmonium-one-multi-range-mv5rz3uW.mjs} +3 -3
  141. package/fesm2022/{magmonium-one-multi-range-BnWtK-O0.mjs.map → magmonium-one-multi-range-mv5rz3uW.mjs.map} +1 -1
  142. package/fesm2022/{magmonium-one-otp-BOiv-9eT.mjs → magmonium-one-otp-BlP0t9w1.mjs} +2 -2
  143. package/fesm2022/{magmonium-one-otp-BOiv-9eT.mjs.map → magmonium-one-otp-BlP0t9w1.mjs.map} +1 -1
  144. package/fesm2022/{magmonium-one-password-Bsv1wUIJ.mjs → magmonium-one-password-CTnJ9M7d.mjs} +2 -2
  145. package/fesm2022/{magmonium-one-password-Bsv1wUIJ.mjs.map → magmonium-one-password-CTnJ9M7d.mjs.map} +1 -1
  146. package/fesm2022/{magmonium-one-radio-BsQv0Wof.mjs → magmonium-one-radio-BanML2y5.mjs} +2 -2
  147. package/fesm2022/{magmonium-one-radio-BsQv0Wof.mjs.map → magmonium-one-radio-BanML2y5.mjs.map} +1 -1
  148. package/fesm2022/{magmonium-one-range-DPR659yG.mjs → magmonium-one-range-B_3WiQR7.mjs} +5 -3
  149. package/fesm2022/magmonium-one-range-B_3WiQR7.mjs.map +1 -0
  150. package/fesm2022/{magmonium-one-selector-CXZMCqmO.mjs → magmonium-one-selector-Do0PsJBx.mjs} +2 -2
  151. package/fesm2022/{magmonium-one-selector-CXZMCqmO.mjs.map → magmonium-one-selector-Do0PsJBx.mjs.map} +1 -1
  152. package/fesm2022/{magmonium-one-text-Bo4XPBXB.mjs → magmonium-one-text-DDA0gCOd.mjs} +4 -2
  153. package/fesm2022/magmonium-one-text-DDA0gCOd.mjs.map +1 -0
  154. package/fesm2022/magmonium-one.mjs +422 -99
  155. package/fesm2022/magmonium-one.mjs.map +1 -1
  156. package/package.json +1 -1
  157. package/types/magmonium-one.d.ts +132 -3
  158. package/fesm2022/magmonium-one-directives-C_i3gUFT.mjs.map +0 -1
  159. package/fesm2022/magmonium-one-file.service-Bo06pU3_.mjs.map +0 -1
  160. package/fesm2022/magmonium-one-label-B95NhEzQ.mjs.map +0 -1
  161. package/fesm2022/magmonium-one-range-DPR659yG.mjs.map +0 -1
  162. package/fesm2022/magmonium-one-text-Bo4XPBXB.mjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magmonium/one",
3
- "version": "0.4.55",
3
+ "version": "0.4.57",
4
4
  "description": "Magmonium One — Angular design-system primitives for mm Apps",
5
5
  "author": "magmonium",
6
6
  "license": "MIT",
@@ -415,6 +415,8 @@ interface FileUploadConfig {
415
415
  accept?: string[];
416
416
  multiple?: boolean;
417
417
  maxSize?: number;
418
+ /** Picks a folder and answers every file inside it; `accept` is ignored. */
419
+ directory?: boolean;
418
420
  }
419
421
  interface FileUploadEvent {
420
422
  files: File[];
@@ -572,6 +574,13 @@ type SectionTableColumn = {
572
574
  span?: number;
573
575
  sortable?: boolean;
574
576
  dataType?: SectionTableDataType;
577
+ /**
578
+ * The rows start sorted by this column. Needs a written `id`, as `sortable`
579
+ * does; the first such column wins.
580
+ */
581
+ defaultSort?: boolean;
582
+ /** The default sort's direction: ascending when set, descending when not. */
583
+ ascending?: boolean;
575
584
  /** Freezes this column and every column before it to the left edge. */
576
585
  freeze?: boolean;
577
586
  /** Starts folded, with a toggle in its heading (GLOSSARY.md Squeeze). */
@@ -3905,6 +3914,14 @@ export type PatternRule = {
3905
3914
  export type Input = Config & {
3906
3915
  type: InputType;
3907
3916
  label: string;
3917
+ /**
3918
+ * The label is authored text, not an i18n key: a control or option name the
3919
+ * dictionary has never heard of (`Look strength`, `Zoom`). `m-label` draws it
3920
+ * verbatim instead of resolving it. Set it where the words are ours to write
3921
+ * and no asset exists yet — a control name that reads as English is better
3922
+ * than a key that reads as nothing.
3923
+ */
3924
+ noTranslate?: boolean;
3908
3925
  required?: true;
3909
3926
  /**
3910
3927
  * Accepted shapes, any one of which passes (libs/one ADR 0017). Authored as
@@ -4074,6 +4091,7 @@ export type DropdownInput = Input & {
4074
4091
  };
4075
4092
  export type ColorInput = Input & {
4076
4093
  type: InputType.COLOR;
4094
+ themeKeys?: boolean;
4077
4095
  };
4078
4096
  export type RangeInput = Input & {
4079
4097
  type: InputType.RANGE;
@@ -5931,9 +5949,13 @@ export declare class SectionTableComponent extends ConfigComponent<SectionTableC
5931
5949
  * `formInitialized` is bound.
5932
5950
  */
5933
5951
  readonly tableInitialized: import("@angular/core").OutputEmitterRef<void>;
5934
- /** The sort in force, read by `sectionTableSort` around each Repeat's source. */
5935
- readonly sort: import("@angular/core").WritableSignal<SectionTableSort | null>;
5936
5952
  readonly columns: import("@angular/core").Signal<SectionTableColumn[]>;
5953
+ /**
5954
+ * The sort in force, read by `sectionTableSort` around each Repeat's source.
5955
+ * Starts at the columns' default sort — not reported, nothing was clicked —
5956
+ * and goes back to it whenever the columns change.
5957
+ */
5958
+ readonly sort: import("@angular/core").WritableSignal<SectionTableSort | null>;
5937
5959
  protected readonly resolvedSticky: import("@angular/core").Signal<boolean>;
5938
5960
  protected readonly resolvedMargin: import("@angular/core").Signal<boolean>;
5939
5961
  protected readonly resolvedVariant: import("@angular/core").Signal<SectionTableVariant>;
@@ -6031,6 +6053,8 @@ export declare const sectionTableColumnWidths: (columns: readonly SectionTableCo
6031
6053
  export declare const sectionTableFrozenCount: (columns: readonly SectionTableColumn[]) => number;
6032
6054
  /** The next sort after a click on the column with `id`. */
6033
6055
  export declare const nextSectionTableSort: (current: SectionTableSort | null, id: string, dataType: SectionTableSort["dataType"]) => SectionTableSort;
6056
+ /** The sort a table starts with: its first `defaultSort` column's, if any. */
6057
+ declare const defaultSectionTableSort: (columns: readonly SectionTableColumn[]) => SectionTableSort | null;
6034
6058
  /**
6035
6059
  * A copy of `rows` ordered by `sort`, the input untouched. Missing values sink
6036
6060
  * to the end in either direction — an empty cell is not the smallest value.
@@ -7547,6 +7571,13 @@ declare class ColorPickerBoxComponent implements AfterViewInit, OnDestroy {
7547
7571
  #private;
7548
7572
  private readonly themeStore;
7549
7573
  selected: import("@angular/core").InputSignal<string | undefined>;
7574
+ /**
7575
+ * Offers the theme's tones as swatches above the free picker; picking one
7576
+ * emits its ThemeColor key rather than a hex, so the colour follows the
7577
+ * theme. Off for a field whose value must be a literal colour — a theme's
7578
+ * own token values, which a key would make circular.
7579
+ */
7580
+ readonly themeKeys: import("@angular/core").InputSignal<boolean>;
7550
7581
  readonly selectColorChange: import("@angular/core").OutputEmitterRef<string>;
7551
7582
  imageColors: import("@angular/core").WritableSignal<ExtractedColor[]>;
7552
7583
  colorArea: ElementRef<HTMLDivElement>;
@@ -7555,6 +7586,10 @@ declare class ColorPickerBoxComponent implements AfterViewInit, OnDestroy {
7555
7586
  protected readonly _fileUploadConfig: import("@magmonium/one").FileUploadConfig;
7556
7587
  protected readonly _eyedropperConfig: import("@magmonium/one").Button;
7557
7588
  protected readonly _headerContextMenu: ContextMenu;
7589
+ protected readonly themeSwatches: import("@angular/core").Signal<{
7590
+ key: "text" | "error" | "focus" | "mm" | "mmLite" | "mmDark" | "background" | "border" | "textSecondary" | "errorLight" | "warning" | "successLite" | "success" | "highlight" | "wealth";
7591
+ color: string;
7592
+ }[]>;
7558
7593
  hue: import("@angular/core").WritableSignal<number>;
7559
7594
  saturation: import("@angular/core").WritableSignal<number>;
7560
7595
  lightness: import("@angular/core").WritableSignal<number>;
@@ -7562,6 +7597,7 @@ declare class ColorPickerBoxComponent implements AfterViewInit, OnDestroy {
7562
7597
  opacityTip: import("@angular/core").Signal<string>;
7563
7598
  _opacityGradient: import("@angular/core").Signal<string>;
7564
7599
  _selected: import("@angular/core").Signal<string>;
7600
+ private formatHsla;
7565
7601
  colorFormat: import("@angular/core").WritableSignal<string>;
7566
7602
  maxArea: import("@angular/core").WritableSignal<Position>;
7567
7603
  hueArea: import("@angular/core").WritableSignal<Position>;
@@ -7608,6 +7644,11 @@ declare class ColorPickerBoxComponent implements AfterViewInit, OnDestroy {
7608
7644
  "required": false;
7609
7645
  "isSignal": true;
7610
7646
  };
7647
+ "themeKeys": {
7648
+ "alias": "themeKeys";
7649
+ "required": false;
7650
+ "isSignal": true;
7651
+ };
7611
7652
  }, {
7612
7653
  "selectColorChange": "selectColorChange";
7613
7654
  }, never, never, true, never>;
@@ -7625,6 +7666,7 @@ export declare class ColorPickerInputComponent extends BaseTextInputComponent<Co
7625
7666
  type: "button";
7626
7667
  tabindex: number;
7627
7668
  }>;
7669
+ private readonly themeKeys;
7628
7670
  protected readonly selectorConfig: import("@angular/core").Signal<import("@magmonium/one").SelectorConfig<ColorPickerBoxComponent>>;
7629
7671
  protected readonly onOpened: () => void;
7630
7672
  protected readonly onClosed: () => void;
@@ -7864,6 +7906,12 @@ export interface FileUploadInput extends Omit<TextInput, 'type'> {
7864
7906
  maxSize?: number;
7865
7907
  /** Holds a list, and a new pick appends to it rather than replacing it. */
7866
7908
  multiple?: boolean;
7909
+ /**
7910
+ * A `multiple` Field that also takes folders: a dropped folder brings every
7911
+ * file inside it, and a **Choose folder** button picks one. What `accept`
7912
+ * refuses inside a folder is skipped, not reported.
7913
+ */
7914
+ folders?: boolean;
7867
7915
  /** Renders a DropZone in place of the picker button. */
7868
7916
  dropZone?: boolean;
7869
7917
  /**
@@ -8272,6 +8320,7 @@ export declare class FileUploadInputComponent extends BaseInputComponent<FileUpl
8272
8320
  private readonly syncPickedNames;
8273
8321
  private readonly isFolderMode;
8274
8322
  protected readonly isMultiple: import("@angular/core").Signal<boolean>;
8323
+ protected readonly takesFolders: import("@angular/core").Signal<boolean>;
8275
8324
  protected readonly hasDropZone: import("@angular/core").Signal<boolean>;
8276
8325
  private readonly readsText;
8277
8326
  private readonly accept;
@@ -8293,6 +8342,7 @@ export declare class FileUploadInputComponent extends BaseInputComponent<FileUpl
8293
8342
  private readonly acceptLabel;
8294
8343
  protected readonly dropPlaceholder: import("@angular/core").Signal<string>;
8295
8344
  protected readonly removeButton: import("@angular/core").Signal<Button>;
8345
+ protected readonly folderButton: import("@angular/core").Signal<Button>;
8296
8346
  protected readonly rejectionMessages: import("@angular/core").Signal<RejectionMessage[]>;
8297
8347
  protected readonly buttonConfig: import("@angular/core").Signal<Button>;
8298
8348
  protected openPicker: () => void;
@@ -8301,6 +8351,11 @@ export declare class FileUploadInputComponent extends BaseInputComponent<FileUpl
8301
8351
  protected onDrop: (event: DragEvent) => void;
8302
8352
  protected removeAt: (index: number, event: Event) => void;
8303
8353
  private pickFiles;
8354
+ protected openFolderPicker: () => void;
8355
+ /**
8356
+ * `incoming` was picked or dropped as itself, so a refusal is reported;
8357
+ * `nested` came inside a folder, where a file `accept` refuses is skipped.
8358
+ */
8304
8359
  private take;
8305
8360
  /**
8306
8361
  * The files this Field keeps. Without an ImageEditor, `accept` and `maxSize`
@@ -9005,6 +9060,7 @@ export declare class SectionFormItemComponent extends ConfigComponent<Input> imp
9005
9060
  variant?: string;
9006
9061
  type?: InputType | undefined;
9007
9062
  label?: string | undefined;
9063
+ noTranslate?: boolean;
9008
9064
  required?: true;
9009
9065
  patterns?: PatternRule[];
9010
9066
  patternMessage?: string;
@@ -12766,6 +12822,70 @@ export declare class StatComponent {
12766
12822
  */
12767
12823
  export declare const cornerSide: (position: StatCornerPosition) => StatCornerSide;
12768
12824
  export declare const cornerEdge: (position: StatCornerPosition) => StatCornerEdge;
12825
+ /**
12826
+ * How round a HeatSwatch's corners are. The only shape setting it takes: the
12827
+ * block fills whatever holds it, so size is the holder's to give.
12828
+ */
12829
+ type HeatSwatchRadius = 'none' | 'sm' | 'md' | 'full';
12830
+ /**
12831
+ * A solid block whose colour says where a value sits between 0 and 100
12832
+ * (GLOSSARY.md HeatSwatch): `fromColor` at 0, `toColor` at 100, the blend of
12833
+ * the two in between. A leaf that fills whatever holds it and says nothing —
12834
+ * a figure a reader needs is a TextOutput beside it — so it is hidden from
12835
+ * assistive technology rather than given a name.
12836
+ */
12837
+ export declare class HeatSwatchComponent {
12838
+ /**
12839
+ * Where the swatch sits, 0–100; outside that it paints as the nearer end.
12840
+ * Takes a string too, a tag written by codegen spelling a typed figure as a
12841
+ * plain attribute. Missing — unset, `null`, not a number — paints neutral.
12842
+ */
12843
+ readonly value: import("@angular/core").InputSignalWithTransform<number, unknown>;
12844
+ /** A ThemeColor key or any CSS colour: what the swatch is at 0. */
12845
+ readonly fromColor: import("@angular/core").InputSignal<string | undefined>;
12846
+ /** Same, at 100. */
12847
+ readonly toColor: import("@angular/core").InputSignal<string | undefined>;
12848
+ readonly radius: import("@angular/core").InputSignal<HeatSwatchRadius>;
12849
+ private readonly themeStore;
12850
+ protected readonly paint: import("@angular/core").Signal<string | undefined>;
12851
+ private resolve;
12852
+ static ɵfac: i0.ɵɵFactoryDeclaration<HeatSwatchComponent, never>;
12853
+ static ɵcmp: i0.ɵɵComponentDeclaration<HeatSwatchComponent, "m-heat-swatch", never, {
12854
+ "value": {
12855
+ "alias": "value";
12856
+ "required": false;
12857
+ "isSignal": true;
12858
+ };
12859
+ "fromColor": {
12860
+ "alias": "fromColor";
12861
+ "required": false;
12862
+ "isSignal": true;
12863
+ };
12864
+ "toColor": {
12865
+ "alias": "toColor";
12866
+ "required": false;
12867
+ "isSignal": true;
12868
+ };
12869
+ "radius": {
12870
+ "alias": "radius";
12871
+ "required": false;
12872
+ "isSignal": true;
12873
+ };
12874
+ }, {}, never, never, true, never>;
12875
+ }
12876
+ /**
12877
+ * The share of `toColor` in a HeatSwatch's blend, as a whole percentage — the
12878
+ * value clamped to 0–100, or `undefined` where there is no value to place.
12879
+ * Missing is its own answer rather than 0: a swatch whose StateProperty has not
12880
+ * loaded paints neutral, never as the `fromColor` end.
12881
+ */
12882
+ export declare const heatShare: (value: number) => number | undefined;
12883
+ /**
12884
+ * The CSS colour a HeatSwatch paints: the two resolved endpoints mixed in
12885
+ * `oklab` in proportion to the value, so a red-to-green swatch passes through
12886
+ * an even midpoint rather than the muddy brown an `srgb` mix gives.
12887
+ */
12888
+ export declare const heatColor: (value: number, from: string, to: string) => string | undefined;
12769
12889
  interface PwaManifest {
12770
12890
  name: string;
12771
12891
  short_name: string;
@@ -13348,6 +13468,11 @@ export type NavBadge = {
13348
13468
  count: number;
13349
13469
  variant?: 'default' | 'primary' | 'danger';
13350
13470
  };
13471
+ /**
13472
+ * How a row's subject stands, worn as a dot beside its label — a status, not a
13473
+ * count, so it has no figure and the tones a NavBadge lacks.
13474
+ */
13475
+ export type NavTone = 'info' | 'warning' | 'error' | 'success';
13351
13476
  export type BreadcrumbTrail = {
13352
13477
  label: string;
13353
13478
  icon?: string;
@@ -13391,6 +13516,8 @@ export type BreadcrumbTrail = {
13391
13516
  * registration words a Nav the same wherever it is drawn.
13392
13517
  */
13393
13518
  badge?: NavBadge;
13519
+ /** The tone its NavRow named, drawn as a dot beside the label. */
13520
+ tone?: NavTone;
13394
13521
  };
13395
13522
  export type BreadCrumb = {
13396
13523
  trail?: BreadcrumbTrail[];
@@ -13453,6 +13580,8 @@ export type NavRow = {
13453
13580
  icon?: string;
13454
13581
  /** A row standing for an app draws its AppLogo instead of `icon`. */
13455
13582
  appLogo?: BreadcrumbTrail['appLogo'];
13583
+ /** How the row's subject stands, as the dot its menu row wears. */
13584
+ tone?: BreadcrumbTrail['tone'];
13456
13585
  };
13457
13586
  /**
13458
13587
  * The parameter name a `dynamic` Nav carries when it authored none. One
@@ -17067,4 +17196,4 @@ export declare const toggleUid: (audience: Audience, uid: string) => Audience;
17067
17196
  export declare const toggleGroup: (audience: Audience, groupId: string) => Audience;
17068
17197
  /** How many Users and Groups an Audience names. */
17069
17198
  export declare const pickCount: (audience: Audience) => number;
17070
- 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, Icon, KeyValueVariant, LabelSegment, ListConfig, ListContext, ListItem, ListOrientation, ListVariant, MenuItem, MoneySystem, NavCountConfig, NavInstanceConfig, NavMenuConfig, NavRowsConfig, NavVisibilityConfig, NavVisibleAnswer, NavWidgetConfig, NavWidgetEntry, NavWidgetMap, OverlayWidgetLoader, OverlayWidgetMap, PageChangeEvent, Pagination, PaginationWindow, ResolvedUserTab, RowDropEvent, SearchChangeEvent, SectionAccordion, SectionAccordionGroup, SectionAccordionGroupContext, SectionAccordionRef, SectionButtonGroupConfig, SectionFilterGroupConfig, SectionHero, SectionHeroVariant, SectionTableAlign, SectionTableColumn, SectionTableConfig, SectionTableDataType, SectionTableSort, SectionTableSortDirection, 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 };
17199
+ 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, ListConfig, ListContext, ListItem, ListOrientation, ListVariant, MenuItem, MoneySystem, NavCountConfig, NavInstanceConfig, NavMenuConfig, NavRowsConfig, NavVisibilityConfig, NavVisibleAnswer, NavWidgetConfig, NavWidgetEntry, NavWidgetMap, OverlayWidgetLoader, OverlayWidgetMap, PageChangeEvent, Pagination, PaginationWindow, ResolvedUserTab, RowDropEvent, SearchChangeEvent, SectionAccordion, SectionAccordionGroup, SectionAccordionGroupContext, SectionAccordionRef, SectionButtonGroupConfig, SectionFilterGroupConfig, SectionHero, SectionHeroVariant, SectionTableAlign, SectionTableColumn, SectionTableConfig, SectionTableDataType, SectionTableSort, SectionTableSortDirection, 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 };
@@ -1 +0,0 @@
1
- {"version":3,"file":"magmonium-one-directives-C_i3gUFT.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/directives/spacing/spacing.ts","../../../../libs/one/src/lib/shared/directives/draggable/lib/function/position.ts","../../../../libs/one/src/lib/shared/directives/draggable/lib/function/cursor.ts","../../../../libs/one/src/lib/shared/directives/draggable/draggable.ts","../../../../libs/one/src/lib/shared/directives/drag-list/drag-list.ts","../../../../libs/one/src/lib/shared/directives/drag-list/drag-list-item.ts","../../../../libs/one/src/lib/shared/directives/autosize/autosize.ts","../../../../libs/one/src/lib/shared/directives/file-upload/file-upload.ts","../../../../libs/one/src/lib/shared/directives/tooltip/tooltip.ts","../../../../libs/one/src/lib/shared/directives/position/position.ts","../../../../libs/one/src/lib/shared/ui/table/lib/directives/highlight.ts","../../../../libs/one/src/lib/shared/functions/string/color.ts","../../../../libs/one/src/lib/shared/directives/color/m-hero-color.directive.ts"],"sourcesContent":["import {\n computed,\n Directive,\n inject,\n InjectionToken,\n input,\n} from '@angular/core';\nimport { resolveSpacing } from '../../functions/size/size-converter';\n\ntype SpacingValue = number | string | undefined | null;\n\n/**\n * Which of the two spacings a primitive takes inward rather than on its host.\n * Provided in a component's own `providers`, so the directive on that host\n * reads it from the same element and nowhere else.\n *\n * `padding` — the primitive draws a box of its own inside the host (a Card's\n * header, main and footer) and pads that box from `--m-padding-inline` /\n * `--m-padding-block` in place of its built-in padding. Padding the host too\n * would pad it twice.\n *\n * `margin` — the primitive stretches to its container's width, so a margin on\n * the host pushes it past the edge. It reads `--m-margin-inline` and narrows\n * itself instead.\n */\nexport type SpacingInward = { padding?: boolean; margin?: boolean };\n\nexport const SPACING_INWARD = new InjectionToken<SpacingInward>(\n 'SPACING_INWARD'\n);\n\n// A blank axis is unset, not a value: an inspector form hands back every\n// untouched text field as `''`, and `??` alone would let it blank the\n// shorthand the User did type.\nconst isBlank = (value: SpacingValue): boolean =>\n value === undefined ||\n value === null ||\n (typeof value === 'string' && value.trim() === '');\n\nconst axis = (own: SpacingValue, shorthand: SpacingValue): string | undefined =>\n resolveSpacing(isBlank(own) ? shorthand : own);\n\n/**\n * Space inside any element. A bare number is `em`, any other CSS length\n * passes through; the axis inputs win over the shorthand on their own axis.\n * Always writes the resolved lengths as `--m-padding-inline` /\n * `--m-padding-block`, and pads the host itself unless the host takes padding\n * inward (`SPACING_INWARD`).\n */\n@Directive({\n selector: '[mPadding],[mPaddingX],[mPaddingY]',\n host: {\n class: 'm-padded',\n '[style.--m-padding-inline]': 'inline()',\n '[style.--m-padding-block]': 'block()',\n '[style.padding-inline]': 'inward ? null : inline()',\n '[style.padding-block]': 'inward ? null : block()',\n },\n})\nexport class PaddingDirective {\n readonly mPadding = input<SpacingValue>(undefined);\n readonly mPaddingX = input<SpacingValue>(undefined);\n readonly mPaddingY = input<SpacingValue>(undefined);\n\n protected readonly inward = !!inject(SPACING_INWARD, {\n self: true,\n optional: true,\n })?.padding;\n\n protected readonly inline = computed(() =>\n axis(this.mPaddingX(), this.mPadding())\n );\n protected readonly block = computed(() =>\n axis(this.mPaddingY(), this.mPadding())\n );\n}\n\n/**\n * Space around any element, on `PaddingDirective`'s scale. Writes\n * `--m-margin-inline` / `--m-margin-block` always; the block margin is set on\n * the host always, the inline one only when the host does not take it inward\n * (`SPACING_INWARD`) — a full-width host narrows by it instead.\n */\n@Directive({\n selector: '[mMargin],[mMarginX],[mMarginY]',\n host: {\n class: 'm-spaced',\n '[style.--m-margin-inline]': 'inline()',\n '[style.--m-margin-block]': 'block()',\n '[style.margin-inline]': 'inward ? null : inline()',\n '[style.margin-block]': 'block()',\n },\n})\nexport class MarginDirective {\n readonly mMargin = input<SpacingValue>(undefined);\n readonly mMarginX = input<SpacingValue>(undefined);\n readonly mMarginY = input<SpacingValue>(undefined);\n\n protected readonly inward = !!inject(SPACING_INWARD, {\n self: true,\n optional: true,\n })?.margin;\n\n protected readonly inline = computed(() =>\n axis(this.mMarginX(), this.mMargin())\n );\n protected readonly block = computed(() =>\n axis(this.mMarginY(), this.mMargin())\n );\n}\n","import { Draggable } from '../../type';\nimport { Position } from '../../../../type/screen/position';\n\nfunction isWithinBoundary(\n value: number,\n draggable: Draggable,\n axis: 'x' | 'y'\n): boolean {\n const maxVal =\n draggable.max?.[axis] ??\n (axis === 'x' ? window.innerWidth : window.innerHeight);\n const minVal = draggable.min?.[axis] ?? 0;\n return value <= maxVal && value >= minVal;\n}\n\nexport function getNewPosition(\n draggable: Draggable,\n event: MouseEvent | TouchEvent,\n delta: Position\n): Position {\n let { x, y } = draggable.position;\n\n const isTouch = 'touches' in event;\n const touch = isTouch ? event.touches[0] || event.changedTouches[0] : null;\n const screenX = touch ? touch.screenX : (event as MouseEvent).screenX;\n const screenY = touch ? touch.screenY : (event as MouseEvent).screenY;\n\n if (draggable.direction !== 'y') {\n const dx = screenX - (delta.x ?? 0);\n if (isWithinBoundary(dx, draggable, 'x')) {\n x = dx;\n }\n }\n\n if (draggable.direction !== 'x') {\n const dy = screenY - (delta.y ?? 0);\n if (isWithinBoundary(dy, draggable, 'y')) {\n y = dy;\n }\n }\n\n return { x, y };\n}\n","import { Draggable } from '../../type';\n\nexport function getCursor({ direction }: Draggable) {\n switch (direction) {\n case 'x':\n return 'ew-resize';\n case 'y':\n return 'ns-resize';\n default:\n return 'move';\n }\n}\n","import { computed, Directive, HostListener, Input, model, input, output } from '@angular/core';\nimport { Draggable, DraggableState } from './type';\nimport { getCursor, getNewPosition } from './lib';\n// The type's own file rather than the shared barrel: that barrel reaches every\n// UI slice, so a directive importing it is a cycle back into the components\n// that declare this directive — and a half-initialised cycle leaves\n// `DraggableDirective` undefined in whichever of them is evaluated first.\nimport { Position } from '../../type/screen/position';\n\n/** Buttons/links inside a handle must keep their click — not start a drag. */\nconst INTERACTIVE_SELECTOR =\n 'button, a, input, textarea, select, [role=\"button\"], [contenteditable=\"true\"]';\n\nconst shouldIgnorePointer = (target: HTMLElement): boolean =>\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'SELECT' ||\n target.isContentEditable ||\n !!target.closest(INTERACTIVE_SELECTOR);\n\n@Directive({\n selector: '[mDraggable]',\n host: {\n '[class.draggable]': \"mDraggable()?.direction !== 'none'\",\n '[class.dragging]': 'this.state.dragging',\n '[style.position]':\n \"mDraggable()?.direction !== 'none' ? (mDraggable()?.positionType ?? 'absolute') : null\",\n '[style.top.px]':\n \"mDraggable()?.direction !== 'none' && mDraggable()?.direction !== 'x' ? mDraggable()?.position?.y : null\",\n '[style.left.px]':\n \"mDraggable()?.direction !== 'none' && mDraggable()?.direction !== 'y' ? mDraggable()?.position?.x : null\",\n '[style.cursor]': \"mDraggable()?.direction !== 'none' ? cursor() : null\",\n },\n})\nexport class DraggableDirective {\n mDraggable = model.required<Draggable>();\n handleSelector = input<string>();\n\n /**\n * The bounds, read at drag time and never written into `mDraggable`.\n *\n * They used to be merged in by a setter, which lost them the moment a parent\n * replaced its Draggable — a `linkedSignal` recomputed from the value the\n * drag itself writes back, which is what both Ranges do. Angular memoizes an\n * inline object literal in a template, so `[min]=\"{ x: 0, y: 3 }\"` is the\n * same reference on the next pass and its setter never fires again to put\n * the bound back. The config then had no `max`, `isWithinBoundary` fell\n * through to `window.innerWidth`, and the thumb slid off the track.\n *\n * A bound is what the caller says the drag may not pass, not state the drag\n * mutates — so it stays an input and the two never share an object.\n */\n readonly min = input<Position | undefined>(undefined);\n readonly max = input<Position | undefined>(undefined);\n\n readonly dragStart = output<void>();\n readonly dragEnd = output<void>();\n\n protected readonly cursor = computed(() => getCursor(this.mDraggable()));\n protected state = <DraggableState>{\n dragging: false,\n delta: { x: 0, y: 0 },\n };\n\n @Input() set pos(position: Position) {\n this.mDraggable.update((config) => ({\n ...config,\n position,\n }));\n }\n\n /**\n * The config a move is clamped against: the bounds on the tag win, and a\n * caller that carries them inside its own Draggable keeps working.\n */\n private readonly bounded = (config: Draggable): Draggable => ({\n ...config,\n min: this.min() ?? config.min,\n max: this.max() ?? config.max,\n });\n\n @HostListener('mousedown', ['$event'])\n protected handleMouseDown(event: MouseEvent) {\n const target = event.target as HTMLElement;\n if (\n this.mDraggable()?.direction === 'none' ||\n shouldIgnorePointer(target)\n ) {\n return;\n }\n const selector = this.handleSelector();\n if (selector && !target.closest(selector)) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n this.state.dragging = true;\n this.dragStart.emit();\n const { screenX, screenY } = event;\n const { x, y } = this.mDraggable()?.position ?? {};\n this.state.delta.x = screenX - (x ?? 0);\n this.state.delta.y = screenY - (y ?? 0);\n }\n\n @HostListener('window:mousemove', ['$event'])\n protected handleMouseMove(event: MouseEvent): void {\n if (!this.state.dragging) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this.mDraggable.update((config) => ({\n ...config,\n position: getNewPosition(this.bounded(config), event, this.state.delta),\n }));\n }\n\n @HostListener('window:mouseup', ['$event'])\n protected handleMouseUp(event: MouseEvent): void {\n if (!this.state.dragging) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n this.state.dragging = false;\n this.dragEnd.emit();\n }\n\n @HostListener('touchstart', ['$event'])\n protected handleTouchStart(event: TouchEvent) {\n const target = event.target as HTMLElement;\n if (\n this.mDraggable()?.direction === 'none' ||\n shouldIgnorePointer(target)\n ) {\n return;\n }\n const selector = this.handleSelector();\n if (selector && !target.closest(selector)) {\n return;\n }\n event.stopPropagation();\n this.state.dragging = true;\n this.dragStart.emit();\n const touch = event.touches[0];\n const { screenX, screenY } = touch;\n const { x, y } = this.mDraggable()?.position ?? {};\n this.state.delta.x = screenX - (x ?? 0);\n this.state.delta.y = screenY - (y ?? 0);\n }\n\n @HostListener('window:touchmove', ['$event'])\n protected handleTouchMove(event: TouchEvent): void {\n if (!this.state.dragging) {\n return;\n }\n if (event.cancelable) {\n event.preventDefault();\n }\n event.stopPropagation();\n this.mDraggable.update((config) => ({\n ...config,\n position: getNewPosition(this.bounded(config), event, this.state.delta),\n }));\n }\n\n @HostListener('window:touchend', ['$event'])\n protected handleTouchEnd(event: TouchEvent): void {\n if (!this.state.dragging) {\n return;\n }\n event.stopPropagation();\n event.preventDefault();\n this.state.dragging = false;\n this.dragEnd.emit();\n }\n}\n","import {\n booleanAttribute,\n Directive,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\n\nexport interface DragListReorder {\n from: number;\n to: number;\n}\n\n/**\n * Container side of HTML5 drag-to-reorder. Put on the element wrapping the\n * items, pair with [mDragListItem] on each item. Emits (reordered) with\n * {from, to} — the consumer owns the array move. Auto-scrolls any scrollable\n * ancestor (and the viewport) while the pointer is within 150px of its edge.\n * With removeOnDragOut, dropping an item outside the container emits\n * (removed) with its index — the consumer owns the actual removal.\n */\n@Directive({\n selector: '[mDragList]',\n host: {\n '(dragover)': 'onContainerDragOver($event)',\n },\n})\nexport class DragListDirective implements OnDestroy {\n readonly removeOnDragOut = input(false, { transform: booleanAttribute });\n\n readonly reordered = output<DragListReorder>();\n readonly removed = output<number>();\n\n readonly draggedIndex = signal<number | null>(null);\n readonly dragOverIndex = signal<number | null>(null);\n\n readonly #elementRef = inject(ElementRef);\n\n #scrollAnimationFrameId: number | null = null;\n #dragPointerX = 0;\n #dragPointerY = 0;\n #scrollContainers: HTMLElement[] = [];\n\n readonly startDrag = (index: number, clientX: number, clientY: number): void => {\n this.draggedIndex.set(index);\n this.#dragPointerX = clientX;\n this.#dragPointerY = clientY;\n this.#startScrollLoop();\n };\n\n readonly trackPointer = (clientX: number, clientY: number): void => {\n // Firefox reports client coords 0 on drag events — ignore those samples.\n if (clientX !== 0 || clientY !== 0) {\n this.#dragPointerX = clientX;\n this.#dragPointerY = clientY;\n }\n };\n\n readonly endDrag = (): void => {\n this.draggedIndex.set(null);\n this.dragOverIndex.set(null);\n this.#stopScrollLoop();\n };\n\n // Called on dragend — fires only when no drop() consumed the drag (drop on\n // an item clears draggedIndex first). Pointer outside the container at\n // release means the item was dragged out.\n readonly dragEnded = (event: DragEvent): void => {\n const from = this.draggedIndex();\n if (from !== null && this.removeOnDragOut() && this.#isPointerOutside(event)) {\n this.endDrag();\n this.removed.emit(from);\n return;\n }\n this.endDrag();\n };\n\n readonly #isPointerOutside = (event: DragEvent): boolean => {\n const x = event.clientX || this.#dragPointerX;\n const y = event.clientY || this.#dragPointerY;\n const rect = (this.#elementRef.nativeElement as HTMLElement).getBoundingClientRect();\n return x < rect.left || x > rect.right || y < rect.top || y > rect.bottom;\n };\n\n readonly drop = (index: number): void => {\n const from = this.draggedIndex();\n this.endDrag();\n if (from !== null && from !== index) {\n this.reordered.emit({ from, to: index });\n }\n };\n\n protected readonly onContainerDragOver = (event: DragEvent): void => {\n event.preventDefault();\n this.trackPointer(event.clientX, event.clientY);\n };\n\n readonly #getScrollContainers = (): HTMLElement[] => {\n const list: HTMLElement[] = [];\n let el: HTMLElement | null = this.#elementRef.nativeElement;\n while (el && el !== document.body) {\n const style = window.getComputedStyle(el);\n const overflowY = style.overflowY || style.overflow;\n const isScrollable =\n overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'hidden';\n if (isScrollable && el.scrollHeight > el.clientHeight) {\n list.push(el);\n }\n el = el.parentElement;\n }\n list.push(document.documentElement);\n return list;\n };\n\n readonly #startScrollLoop = (): void => {\n this.#stopScrollLoop();\n this.#scrollContainers = this.#getScrollContainers();\n\n window.addEventListener('dragover', this.#onGlobalDragOver, true);\n window.addEventListener('drag', this.#onGlobalDrag, true);\n\n const loop = (): void => {\n if (this.draggedIndex() === null) {\n this.#stopScrollLoop();\n return;\n }\n\n for (const container of this.#scrollContainers) {\n const isRoot = container === document.documentElement;\n const rect = container.getBoundingClientRect();\n const topThreshold = isRoot ? 150 : rect.top + 150;\n const bottomThreshold = isRoot\n ? window.innerHeight - 150\n : rect.bottom - 150;\n\n if (this.#dragPointerY < topThreshold) {\n const diff = topThreshold - this.#dragPointerY;\n const speed = Math.min(25, Math.max(2, Math.floor(diff / 4)));\n if (isRoot) {\n window.scrollBy(0, -speed);\n } else {\n container.scrollTop -= speed;\n }\n } else if (this.#dragPointerY > bottomThreshold) {\n const diff = this.#dragPointerY - bottomThreshold;\n const speed = Math.min(25, Math.max(2, Math.floor(diff / 4)));\n if (isRoot) {\n window.scrollBy(0, speed);\n } else {\n container.scrollTop += speed;\n }\n }\n }\n\n this.#scrollAnimationFrameId = requestAnimationFrame(loop);\n };\n\n this.#scrollAnimationFrameId = requestAnimationFrame(loop);\n };\n\n readonly #stopScrollLoop = (): void => {\n window.removeEventListener('dragover', this.#onGlobalDragOver, true);\n window.removeEventListener('drag', this.#onGlobalDrag, true);\n if (this.#scrollAnimationFrameId !== null) {\n cancelAnimationFrame(this.#scrollAnimationFrameId);\n this.#scrollAnimationFrameId = null;\n }\n this.#scrollContainers = [];\n };\n\n // Global listeners: dragover fires reliably everywhere once preventDefault'd,\n // drag covers browsers that skip dragover outside drop targets.\n readonly #onGlobalDragOver = (event: DragEvent): void => {\n event.preventDefault();\n this.trackPointer(event.clientX, event.clientY);\n };\n\n readonly #onGlobalDrag = (event: DragEvent): void => {\n this.trackPointer(event.clientX, event.clientY);\n };\n\n ngOnDestroy(): void {\n this.#stopScrollLoop();\n }\n}\n","import { computed, Directive, ElementRef, inject, input } from '@angular/core';\nimport { DragListDirective } from './drag-list';\n\n/**\n * Item side of HTML5 drag-to-reorder. Put on each repeated element inside an\n * [mDragList] container, bound to the item's index: [mDragListItem]=\"i\".\n * Adds `is-dragging` on the dragged item and `is-drag-over` on the current\n * drop target — style them in the consumer.\n */\n@Directive({\n selector: '[mDragListItem]',\n host: {\n draggable: 'true',\n '[class.is-dragging]': 'isDragging()',\n '[class.is-drag-over]': 'isDragOver()',\n '(dragstart)': 'onDragStart($event)',\n '(dragover)': 'onDragOver($event)',\n '(dragenter)': 'onDragEnter()',\n '(dragleave)': 'onDragLeave()',\n '(dragend)': 'onDragEnd($event)',\n '(drop)': 'onDrop($event)',\n '(drag)': 'onDrag($event)',\n },\n})\nexport class DragListItemDirective {\n readonly mDragListItem = input.required<number>();\n\n readonly #list = inject(DragListDirective);\n readonly #elementRef = inject(ElementRef);\n\n protected readonly isDragging = computed(\n () => this.#list.draggedIndex() === this.mDragListItem()\n );\n protected readonly isDragOver = computed(\n () => this.#list.dragOverIndex() === this.mDragListItem()\n );\n\n protected readonly onDragStart = (event: DragEvent): void => {\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', this.mDragListItem().toString());\n this.#setDragGhost(event);\n }\n this.#list.startDrag(this.mDragListItem(), event.clientX, event.clientY);\n };\n\n // Replaces the browser's flat snapshot ghost with a lifted, tilted clone so\n // the item visibly \"picks up\". Clone keeps _ngcontent attributes, so the\n // consumer's scoped styles still apply to it.\n readonly #setDragGhost = (event: DragEvent): void => {\n const host = this.#elementRef.nativeElement as HTMLElement;\n const rect = host.getBoundingClientRect();\n const padding = 24;\n\n const ghost = host.cloneNode(true) as HTMLElement;\n ghost.style.width = `${rect.width}px`;\n ghost.style.margin = '0';\n ghost.style.transform = 'rotate(2.5deg) scale(1.04)';\n ghost.style.boxShadow = '0 16px 40px rgba(0, 0, 0, 0.4)';\n ghost.style.opacity = '0.95';\n\n // Wrapper gives the rotation and shadow room to render without clipping;\n // must be in the document (offscreen) for setDragImage to rasterize it.\n const wrapper = document.createElement('div');\n wrapper.style.position = 'fixed';\n wrapper.style.top = '-10000px';\n wrapper.style.left = '-10000px';\n wrapper.style.padding = `${padding}px`;\n wrapper.style.pointerEvents = 'none';\n wrapper.appendChild(ghost);\n document.body.appendChild(wrapper);\n\n event.dataTransfer?.setDragImage(\n wrapper,\n event.clientX - rect.left + padding,\n event.clientY - rect.top + padding\n );\n\n // Browser rasterizes the ghost synchronously within dragstart — safe to\n // drop the DOM node right after.\n setTimeout(() => wrapper.remove(), 0);\n };\n\n protected readonly onDrag = (event: DragEvent): void => {\n this.#list.trackPointer(event.clientX, event.clientY);\n };\n\n protected readonly onDragOver = (event: DragEvent): void => {\n if (this.#list.draggedIndex() === this.mDragListItem()) return;\n event.preventDefault();\n this.#list.trackPointer(event.clientX, event.clientY);\n };\n\n protected readonly onDragEnter = (): void => {\n if (this.#list.draggedIndex() === this.mDragListItem()) return;\n this.#list.dragOverIndex.set(this.mDragListItem());\n };\n\n protected readonly onDragLeave = (): void => {\n if (this.#list.dragOverIndex() === this.mDragListItem()) {\n this.#list.dragOverIndex.set(null);\n }\n };\n\n protected readonly onDragEnd = (event: DragEvent): void => {\n this.#list.dragEnded(event);\n };\n\n protected readonly onDrop = (event: DragEvent): void => {\n event.preventDefault();\n this.#list.drop(this.mDragListItem());\n };\n}\n","import {\n AfterViewChecked,\n Directive,\n ElementRef,\n HostListener,\n inject,\n} from '@angular/core';\nimport { IS_DESIGN_MODE } from '../../config/tokens';\n\n@Directive({\n selector: '[mAutosize]',\n})\nexport class AutosizeDirective implements AfterViewChecked {\n readonly _el = inject(ElementRef);\n\n // DesignMode: the canvas runs change detection on every hover, select and\n // drag, and each pass re-measured the field — collapsing it to `0px` and\n // growing it back — so the editor's overlay chased a box that kept\n // resizing and flickered. On the canvas the field keeps its intrinsic\n // `rows` height and is never resized.\n readonly #isDesignMode = !!inject(IS_DESIGN_MODE, { optional: true });\n\n // What the height was last measured against. Outside the canvas, change\n // detection still runs on every hover, select and drag; re-measuring on each\n // pass collapsed the field to `0px` for a moment, which clamps the scrollTop\n // of any scrolling ancestor — the panel jumped and the field flickered. Only\n // a new value or a new width can change the height, so nothing else measures.\n #measuredValue: string | null = null;\n #measuredWidth = -1;\n\n @HostListener('input', [])\n @HostListener('window:resize', [])\n onInput(): void {\n if (!this.#isDesignMode) this.#adjust();\n }\n\n ngAfterViewChecked(): void {\n if (this.#isDesignMode) return;\n if (this._el.nativeElement.offsetParent != null) setTimeout(this.#adjust);\n }\n\n // `0px`, not `auto`, as the height the text is measured against. `auto` is an\n // indefinite cross size, so any ancestor that stretches its children —\n // `.m-section__body` is `align-items: stretch`, and a Screen nests those —\n // resolves it to the stretched box, and `scrollHeight` then reports that\n // box rather than the text in it. Written back on every `ngAfterViewChecked`,\n // that ratchets the field up to whatever caps the chain: inside a Modal, the\n // pop-up's own `max-height`, at which point the field *is* the modal and the\n // Screen around it is scrolled out of reach. `0px` is definite, so nothing\n // stretches it and `scrollHeight` is the content alone.\n #adjust = (): void => {\n const el = this._el.nativeElement as HTMLTextAreaElement;\n const width = el.clientWidth;\n if (el.value === this.#measuredValue && width === this.#measuredWidth) {\n return;\n }\n this.#measuredValue = el.value;\n this.#measuredWidth = width;\n el.style.overflow = 'hidden';\n el.style.height = '0px';\n el.style.height = `${el.scrollHeight}px`;\n };\n}\n","import {\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n output,\n} from '@angular/core';\n\nexport interface FileUploadConfig {\n accept?: string[];\n multiple?: boolean;\n maxSize?: number;\n}\n\nexport interface FileUploadEvent {\n files: File[];\n}\n\n@Directive({\n selector: '[mFileUpload]',\n host: {\n '[style.cursor]': '\"pointer\"',\n },\n})\nexport class FileUploadDirective {\n mFileUpload = input<FileUploadConfig>({});\n readonly fileSelect = output<FileUploadEvent>();\n\n private readonly elementRef = inject(ElementRef);\n private fileInput: HTMLInputElement | null = null;\n\n @HostListener('click')\n protected openFilePicker(): void {\n if (!this.fileInput) {\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.style.display = 'none';\n this.fileInput.addEventListener('change', this.onFileChange);\n this.elementRef.nativeElement.appendChild(this.fileInput);\n }\n\n const config = this.mFileUpload();\n this.fileInput.accept = config.accept?.join(',') ?? '*';\n this.fileInput.multiple = config.multiple ?? false;\n this.fileInput.click();\n }\n\n private readonly onFileChange = (event: Event): void => {\n const input = event.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n\n if (files.length === 0) return;\n\n const config = this.mFileUpload();\n const maxSize = config.maxSize;\n\n const validFiles = maxSize ? files.filter((f) => f.size <= maxSize) : files;\n\n if (validFiles.length > 0) {\n this.fileSelect.emit({ files: validFiles });\n }\n\n input.value = '';\n };\n}\n","import {\n Directive,\n ElementRef,\n HostListener,\n inject,\n input,\n OnDestroy,\n} from '@angular/core';\n\n@Directive({\n selector: '[mToolTip]',\n})\nexport class ToolTipDirective implements OnDestroy {\n mToolTip = input<string>('');\n\n private readonly elementRef = inject(ElementRef);\n private tooltipElement: HTMLElement | null = null;\n\n @HostListener('mouseenter')\n protected showTooltip(): void {\n const text = this.mToolTip();\n if (!text) return;\n\n this.tooltipElement = document.createElement('div');\n this.tooltipElement.textContent = text;\n Object.assign(this.tooltipElement.style, {\n position: 'fixed',\n background: 'rgba(0, 0, 0, 0.8)',\n color: '#fff',\n padding: '4px 8px',\n borderRadius: '4px',\n fontSize: '12px',\n zIndex: '10000',\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n });\n\n document.body.appendChild(this.tooltipElement);\n this.positionTooltip();\n }\n\n @HostListener('mouseleave')\n protected hideTooltip(): void {\n this.removeTooltip();\n }\n\n ngOnDestroy(): void {\n this.removeTooltip();\n }\n\n private positionTooltip(): void {\n if (!this.tooltipElement) return;\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\n const tooltipRect = this.tooltipElement.getBoundingClientRect();\n this.tooltipElement.style.left = `${rect.left + rect.width / 2 - tooltipRect.width / 2}px`;\n this.tooltipElement.style.top = `${rect.top - tooltipRect.height - 6}px`;\n }\n\n private removeTooltip(): void {\n this.tooltipElement?.remove();\n this.tooltipElement = null;\n }\n}\n","import {\n Directive,\n ElementRef,\n HostListener,\n inject,\n signal,\n} from '@angular/core';\n\ntype Direction = 'above' | 'below' | 'left' | 'right';\n\n@Directive({\n selector: '[mPosition]',\n host: {\n '[class.m-pos--above]': 'direction() === \"above\"',\n '[class.m-pos--below]': 'direction() === \"below\"',\n '[class.m-pos--left]': 'direction() === \"left\"',\n '[class.m-pos--right]': 'direction() === \"right\"',\n },\n})\nexport class PositionDirective {\n private readonly el = inject(ElementRef<HTMLElement>);\n protected readonly direction = signal<Direction>('below');\n\n @HostListener('mouseenter')\n detect(): void {\n const rect = this.el.nativeElement.getBoundingClientRect();\n const spaces: Record<Direction, number> = {\n below: window.innerHeight - rect.bottom,\n above: rect.top,\n right: window.innerWidth - rect.right,\n left: rect.left,\n };\n const best = (Object.entries(spaces) as [Direction, number][]).reduce(\n (best, [dir, space]) => (space > best.space ? { dir, space } : best),\n { dir: 'below' as Direction, space: spaces.below }\n );\n this.direction.set(best.dir);\n }\n}\n","import {\n afterRenderEffect,\n Directive,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\n\n@Directive({\n selector: '[mHighlight]',\n})\nexport class HighlightDirective {\n readonly mHighlight = input<string>('');\n readonly mHighlightText = input<string>('');\n\n private readonly el = inject(ElementRef);\n\n constructor() {\n afterRenderEffect(() => {\n const query = this.mHighlight().trim();\n const text = this.mHighlightText();\n if (!query) {\n this.el.nativeElement.innerHTML = this.escapeHtml(text);\n return;\n }\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`(${escaped})`, 'gi');\n this.el.nativeElement.innerHTML = this.escapeHtml(text).replace(\n regex,\n '<mark class=\"m-table__highlight\">$1</mark>'\n );\n });\n }\n\n private readonly escapeHtml = (str: string): string =>\n String(str ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n","/**\n * Generates a consistent HSL color based on the input string.\n * Used for wallet backgrounds and other items where visual consistency is needed.\n */\nexport function stringToColor(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (Math.imul(31, hash) + str.charCodeAt(i)) | 0;\n }\n\n // Use hash to generate H, S, L\n const h = Math.abs(hash) % 360;\n const s = 65 + (Math.abs(hash >> 8) % 20); // 65-85% saturation for vibrancy\n const l = 45 + (Math.abs(hash >> 16) % 15); // 45-60% lightness for readability\n\n return `hsl(${h}, ${s}%, ${l}%)`;\n}\n","import {\n Directive,\n ElementRef,\n inject,\n input,\n effect,\n Renderer2,\n} from '@angular/core';\nimport { stringToColor } from '../../functions/string/color';\n\n@Directive({\n selector: '[mHeroColor]',\n})\nexport class MHeroColorDirective {\n /** The string to generate the color from (e.g., coin name, wallet name) */\n mHeroColor = input.required<string>();\n\n /** The CSS variable name to set (defaults to --hero-accent-color) */\n mHeroColorVar = input<string>('--hero-accent-color');\n\n #el = inject(ElementRef);\n #renderer = inject(Renderer2);\n\n constructor() {\n effect(() => {\n const source = this.mHeroColor();\n const varName = this.mHeroColorVar();\n\n if (source) {\n const color = stringToColor(source);\n this.#renderer.setStyle(this.#el.nativeElement, varName, color);\n }\n });\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"magmonium-one-file.service-Bo06pU3_.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/services/file.service.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport {\n FileUploadConfig,\n FileUploadEvent,\n} from '../directives/file-upload/file-upload';\n\nexport type { FileUploadConfig, FileUploadEvent };\n\ntype PickerWindow = Window & {\n showDirectoryPicker?: (options?: {\n mode?: 'read' | 'readwrite';\n }) => Promise<{ name: string }>;\n};\n\nexport type FolderPickResult = {\n name: string;\n handle: unknown;\n};\n\n@Injectable({ providedIn: 'root' })\nexport class FileService {\n folderPickSupported(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof (window as PickerWindow).showDirectoryPicker === 'function'\n );\n }\n\n async pickFolder(): Promise<FolderPickResult | undefined> {\n const picker = (window as PickerWindow).showDirectoryPicker;\n if (!picker) return undefined;\n try {\n const handle = await picker({ mode: 'read' });\n return { name: handle.name, handle };\n } catch {\n return undefined;\n }\n }\n\n async getFiles(config?: FileUploadConfig): Promise<FileUploadEvent> {\n return new Promise((resolve) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = config?.accept?.join(',') ?? '*';\n input.multiple = config?.multiple ?? false;\n input.style.display = 'none';\n\n input.addEventListener('change', () => {\n const files = Array.from(input.files ?? []);\n const maxSize = config?.maxSize;\n const validFiles = maxSize\n ? files.filter((f) => f.size <= maxSize)\n : files;\n resolve({ files: validFiles });\n input.remove();\n });\n\n document.body.appendChild(input);\n input.click();\n });\n }\n}\n"],"mappings":";;AAoBA,IAAa,cAAb,MAAa,YAAW;CACtB,sBAAmB;EACjB,OACE,OAAO,WAAW,eAClB,OAAQ,OAAwB,wBAAwB;CAE5D;CAEA,MAAM,aAAU;EACd,MAAM,SAAU,OAAwB;EACxC,IAAI,CAAC,QAAQ,OAAO;EACpB,IAAI;GACF,MAAM,SAAS,MAAM,OAAO,EAAE,MAAM,OAAM,CAAE;GAC5C,OAAO;IAAE,MAAM,OAAO;IAAM;GAAM;EACpC,QAAQ;GACN;EACF;CACF;CAEA,MAAM,SAAS,QAAyB;EACtC,OAAO,IAAI,SAAS,YAAW;GAC7B,MAAM,QAAQ,SAAS,cAAc,OAAO;GAC5C,MAAM,OAAO;GACb,MAAM,SAAS,QAAQ,QAAQ,KAAK,GAAG,KAAK;GAC5C,MAAM,WAAW,QAAQ,YAAY;GACrC,MAAM,MAAM,UAAU;GAEtB,MAAM,iBAAiB,gBAAe;IACpC,MAAM,QAAQ,MAAM,KAAK,MAAM,SAAS,CAAA,CAAE;IAC1C,MAAM,UAAU,QAAQ;IAIxB,QAAQ,EAAE,OAHS,UACf,MAAM,QAAQ,MAAM,EAAE,QAAQ,OAAO,IACrC,MACuB,CAAE;IAC7B,MAAM,OAAM;GACd,CAAC;GAED,SAAS,KAAK,YAAY,KAAK;GAC/B,MAAM,MAAK;EACb,CAAC;CACH;CAxCW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAW,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAX,OAAA,QAAA,GAAA,sBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAW,YADE;CAAM,CAAA;;AACnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAW,YAAA,CAAA;EADvB,MAAA;EAAW,MAAA,CAAA,EAAE,YAAY,OAAM,CAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"magmonium-one-label-B95NhEzQ.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/pipe/time-ago.ts","../../../../libs/one/src/lib/shared/pipe/money.fn.ts","../../../../libs/one/src/lib/shared/pipe/money.ts","../../../../libs/one/src/lib/shared/pipe/percentage.ts","../../../../libs/one/src/lib/shared/pipe/compact-number.ts","../../../../libs/one/src/lib/shared/pipe/asset-url.ts","../../../../libs/one/src/lib/shared/ui/section/lib/functions/section-table.ts","../../../../libs/one/src/lib/shared/pipe/section-table-sort.ts","../../../../libs/one/src/lib/shared/ui/input/ui/label.ts"],"sourcesContent":["import { ChangeDetectorRef, inject, OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate';\nimport { interval, Subscription } from 'rxjs';\n\nconst SECONDS_IN_MINUTE = 60;\nconst SECONDS_IN_HOUR = 3600;\nconst SECONDS_IN_DAY = 86400;\nconst SECONDS_IN_MONTH = 2592000;\nconst SECONDS_IN_YEAR = 31536000;\n\n@Pipe({\n name: 'timeAgo',\n pure: false,\n})\nexport class TimeAgoPipe implements PipeTransform, OnDestroy {\n private readonly translateService = inject(TranslateService);\n private readonly cdr = inject(ChangeDetectorRef);\n private timerSubscription: Subscription | null = null;\n private lastValue: string | Date | undefined = undefined;\n\n transform(value: string | Date | undefined): string {\n if (!value) return '';\n\n if (value !== this.lastValue) {\n this.lastValue = value;\n this.setupTimer();\n }\n\n const date = typeof value === 'string' ? new Date(value) : value;\n const now = new Date();\n const seconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n if (seconds < SECONDS_IN_MINUTE) {\n return this.translateService.translate('just-now');\n }\n\n let count: number;\n let unit: string;\n\n if (seconds < SECONDS_IN_HOUR) {\n count = Math.floor(seconds / SECONDS_IN_MINUTE);\n unit = count === 1 ? 'minute' : 'minutes';\n } else if (seconds < SECONDS_IN_DAY) {\n count = Math.floor(seconds / SECONDS_IN_HOUR);\n unit = count === 1 ? 'hour' : 'hours';\n } else if (seconds < SECONDS_IN_MONTH) {\n count = Math.floor(seconds / SECONDS_IN_DAY);\n unit = count === 1 ? 'day' : 'days';\n } else if (seconds < SECONDS_IN_YEAR) {\n count = Math.floor(seconds / SECONDS_IN_MONTH);\n unit = count === 1 ? 'month' : 'months';\n } else {\n count = Math.floor(seconds / SECONDS_IN_YEAR);\n unit = count === 1 ? 'year' : 'years';\n }\n\n return this.translateService.translate(\n `time-ago?count=${count}&unit=${unit}`\n );\n }\n\n private setupTimer(): void {\n this.clearTimer();\n // Update every 30 seconds to keep the display fresh without overloading change detection.\n this.timerSubscription = interval(30000).subscribe(() => {\n this.cdr.detectChanges();\n });\n }\n\n private clearTimer(): void {\n if (this.timerSubscription) {\n this.timerSubscription.unsubscribe();\n this.timerSubscription = null;\n }\n }\n\n ngOnDestroy(): void {\n this.clearTimer();\n }\n}\n","export type MoneySystem = 'IN' | 'INTL';\n\nexport interface MoneyResult {\n amount: string;\n labelKey: string;\n}\n\ninterface Threshold {\n min: number;\n labelKey: string;\n overflowAt: number;\n}\n\nconst IN_THRESHOLDS: Threshold[] = [\n { min: 1_00_00_000, labelKey: 'cr', overflowAt: Infinity },\n { min: 1_00_000, labelKey: 'l', overflowAt: 100 },\n { min: 1_000, labelKey: 'k', overflowAt: 100 },\n];\n\nconst INTL_THRESHOLDS: Threshold[] = [\n { min: 1_000_000_000_000, labelKey: 't', overflowAt: Infinity },\n { min: 1_000_000_000, labelKey: 'b', overflowAt: 1_000 },\n { min: 1_000_000, labelKey: 'm', overflowAt: 1_000 },\n { min: 1_000, labelKey: 'k', overflowAt: 1_000 },\n];\n\n/**\n * Formats a non-negative finite number into a compact denomination result.\n * @param value Must be a non-negative finite number. Negative values and NaN\n * should be handled by the caller before invoking this function.\n */\nexport const formatMoney = (\n value: number,\n system: MoneySystem\n): MoneyResult => {\n const thresholds = system === 'IN' ? IN_THRESHOLDS : INTL_THRESHOLDS;\n\n for (let i = 0; i < thresholds.length; i++) {\n const { min, labelKey, overflowAt } = thresholds[i];\n if (value >= min) {\n const rounded = parseFloat((value / min).toFixed(1));\n if (rounded >= overflowAt && i > 0) {\n const higher = thresholds[i - 1];\n return {\n amount: parseFloat((value / higher.min).toFixed(1)).toString(),\n labelKey: higher.labelKey,\n };\n }\n return { amount: rounded.toString(), labelKey };\n }\n }\n\n return { amount: parseFloat(value.toFixed(2)).toString(), labelKey: '' };\n};\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate';\nimport { formatMoney, MoneySystem } from './money.fn';\n\n@Pipe({\n name: 'money',\n pure: false,\n})\nexport class MoneyPipe implements PipeTransform {\n private readonly translateService = inject(TranslateService);\n\n transform(\n value: number | undefined | null,\n system: MoneySystem = 'IN',\n symbol = '₹',\n forceSign = false\n ): string {\n if (value == null || isNaN(value)) return '';\n if (value === 0) return `${symbol}0`;\n\n const isNegative = value < 0;\n const absValue = Math.abs(value);\n const { amount, labelKey } = formatMoney(absValue, system);\n const label = labelKey\n ? ` ${this.translateService.translate(labelKey)}`\n : '';\n\n const sign = isNegative ? '-' : forceSign ? '+' : '';\n return `${sign}${symbol}${amount}${label}`;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Renders a number already expressed in percent units as a `%` reading —\n * `42` becomes `42.00%`, never `4200%`. A ratio is the caller's to multiply,\n * the way `MoneyPipe` takes an amount rather than a currency object.\n *\n * Two decimals by default: a percentage carries the fraction that separates\n * two near-equal readings, and a caller wanting the whole number asks for\n * `decimals: 0`.\n *\n * Pure, unlike the other three: it reads no language and no clock, so its\n * output depends on its arguments alone.\n */\n@Pipe({\n name: 'percentage',\n})\nexport class PercentagePipe implements PipeTransform {\n transform(\n value: number | undefined | null,\n decimals = 2,\n forceSign = false\n ): string {\n if (value == null || isNaN(value)) return '';\n\n const digits = Math.max(0, Math.trunc(decimals));\n const rendered = Math.abs(value).toFixed(digits);\n // A rounded-to-zero negative would otherwise print `-0%`.\n const isNegative = value < 0 && Number(rendered) !== 0;\n\n const sign = isNegative\n ? '-'\n : forceSign && Number(rendered) !== 0\n ? '+'\n : '';\n return `${sign}${rendered}%`;\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate';\nimport { formatMoney, MoneySystem } from './money.fn';\n\n/**\n * Renders a large number as a compact denominated reading — `12500` becomes\n * `12.5 k`, `1250000` becomes `12.5 l` (or `1.3 m` on the `INTL` ladder).\n * `MoneyPipe` without the currency symbol: a count of views, rows or users is\n * no amount of money, but it climbs the same thresholds.\n *\n * Named `compactNumber` rather than `number` so it never collides with\n * Angular's own `DecimalPipe` in a template that imports both.\n *\n * Impure for `MoneyPipe`'s reason: the denomination label is a translation key\n * resolved in the active language.\n */\n@Pipe({\n name: 'compactNumber',\n pure: false,\n})\nexport class CompactNumberPipe implements PipeTransform {\n private readonly translateService = inject(TranslateService);\n\n transform(\n value: number | undefined | null,\n system: MoneySystem = 'IN',\n forceSign = false\n ): string {\n if (value == null || isNaN(value)) return '';\n if (value === 0) return '0';\n\n const { amount, labelKey } = formatMoney(Math.abs(value), system);\n // Below the first threshold a tiny value can still round to `0`.\n if (Number(amount) === 0) return '0';\n\n const label = labelKey\n ? ` ${this.translateService.translate(labelKey)}`\n : '';\n const sign = value < 0 ? '-' : forceSign ? '+' : '';\n return `${sign}${amount}${label}`;\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { HttpService } from '../services/http';\n\n@Pipe({\n name: 'assetUrl',\n})\nexport class AssetUrlPipe implements PipeTransform {\n private readonly http = inject(HttpService);\n\n transform(value: string | null | undefined): string {\n return this.http.getAssetUrl(value);\n }\n}\n","import {\n SectionTableColumn,\n SectionTableSort,\n} from '../../type/section-table';\n\n/** A column's id, falling back to its position (m-one-ui ADR 0148). */\nexport const sectionTableColumnId = (\n column: SectionTableColumn,\n index: number\n): string => column.id || String(index);\n\n/**\n * Each column's width as a CSS length: a `span` is its twelfth-share of the\n * table, and a column without one gets `undefined` so the `<table>` divides\n * what the spanned columns left.\n */\nexport const sectionTableColumnWidths = (\n columns: readonly SectionTableColumn[]\n): (string | undefined)[] =>\n columns.map(({ span }) => {\n if (span == null || !Number.isFinite(span)) return undefined;\n const clamped = Math.min(12, Math.max(1, Math.round(span)));\n return `${(clamped * 100) / 12}%`;\n });\n\n/**\n * How many leading columns are frozen: freezing a column freezes every column\n * before it, because a frozen column pinned past an unfrozen one would slide\n * over it.\n */\nexport const sectionTableFrozenCount = (\n columns: readonly SectionTableColumn[]\n): number => {\n let last = -1;\n columns.forEach((column, i) => {\n if (column.freeze) last = i;\n });\n return last + 1;\n};\n\n/** The next sort after a click on the column with `id`. */\nexport const nextSectionTableSort = (\n current: SectionTableSort | null,\n id: string,\n dataType: SectionTableSort['dataType']\n): SectionTableSort =>\n current?.id === id\n ? { id, dataType, direction: current.direction === 'asc' ? 'desc' : 'asc' }\n : { id, dataType, direction: 'asc' };\n\nconst readPath = (row: unknown, path: string): unknown =>\n path\n .split('.')\n .reduce<unknown>(\n (value, key) =>\n value != null && typeof value === 'object'\n ? (value as Record<string, unknown>)[key]\n : undefined,\n row\n );\n\nconst comparable = (\n value: unknown,\n dataType: SectionTableSort['dataType']\n): number | string | undefined => {\n if (value == null || value === '') return undefined;\n if (dataType === 'number') {\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isNaN(n) ? undefined : n;\n }\n if (dataType === 'date') {\n const t =\n value instanceof Date ? value.getTime() : new Date(String(value)).getTime();\n return Number.isNaN(t) ? undefined : t;\n }\n return String(value).toLocaleLowerCase();\n};\n\n/**\n * A copy of `rows` ordered by `sort`, the input untouched. Missing values sink\n * to the end in either direction — an empty cell is not the smallest value.\n */\nexport const sortSectionTableRows = <T>(\n rows: readonly T[] | null | undefined,\n sort: SectionTableSort | null | undefined\n): T[] => {\n const list = [...(rows ?? [])];\n if (!sort) return list;\n const sign = sort.direction === 'asc' ? 1 : -1;\n return list\n .map((row, i) => ({ row, i, key: comparable(readPath(row, sort.id), sort.dataType) }))\n .sort((a, b) => {\n if (a.key === undefined || b.key === undefined) {\n if (a.key === b.key) return a.i - b.i;\n return a.key === undefined ? 1 : -1;\n }\n const diff =\n typeof a.key === 'number' && typeof b.key === 'number'\n ? a.key - b.key\n : String(a.key).localeCompare(String(b.key));\n return diff === 0 ? a.i - b.i : diff * sign;\n })\n .map(({ row }) => row);\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport type { SectionTableSort } from '../ui/section/type/section-table';\nimport { sortSectionTableRows } from '../ui/section/lib/functions/section-table';\n\n/**\n * A SectionTable's sort applied to a Repeat's collection:\n * `@for (row of (rows | sectionTableSort: table.sort()); …)`. The `@for` is the\n * Repeat's, not the table's, so the table reorders a collection it does not\n * own through this and nothing else (m-one-ui ADR 0148).\n *\n * Pure: a new order needs a new sort or a new collection, never a mutated one.\n */\n@Pipe({\n name: 'sectionTableSort',\n})\nexport class SectionTableSortPipe implements PipeTransform {\n transform<T>(\n rows: readonly T[] | null | undefined,\n sort: SectionTableSort | null | undefined\n ): T[] {\n return sortSectionTableRows(rows, sort);\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { TranslatePipe } from '../../../pipe';\n\n@Component({\n selector: 'm-label',\n template: `\n <label\n [class.required]=\"required()\"\n [class.disabled]=\"disabled()\"\n [attr.for]=\"for() || null\"\n >\n @if (color()) {\n <span class=\"label__swatch\" [style.background]=\"color()\"></span>\n }\n @if (noTranslate()) {\n {{ placeholder() }}\n } @else {\n {{ placeholder() | translate: params() }}\n }\n </label>\n `,\n imports: [TranslatePipe],\n styleUrl: './label.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LabelComponent {\n for = input<string>();\n placeholder = input<string>();\n // The label's [MessageVariable] values — a Field whose label is a sentence\n // with a datum in it (m-one-ui ADR 0066).\n params = input<Record<string, string> | undefined>();\n required = input<boolean>();\n disabled = input<boolean>();\n color = input<string>();\n // Authored text rather than an i18n key — an option label mapped from a row\n // the app holds, which the dictionary has never heard of.\n noTranslate = input<boolean>();\n}\n\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"magmonium-one-range-DPR659yG.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/range/range.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n HostListener,\n linkedSignal,\n signal,\n viewChild,\n} from '@angular/core';\nimport { BaseTextInputComponent } from '../text/base-text';\nimport { DraggableDirective, Draggable } from '../../../../directives';\nimport { LabelComponent } from '../label';\nimport { RangeInput } from '../../model/input';\nimport { Direction } from '../../../../type';\n\n@Component({\n selector: 'm-range',\n imports: [DraggableDirective, LabelComponent],\n template: `\n @if (config(); as range) {\n <div class=\"m-range\">\n <m-label\n class=\"m-range__label\"\n [placeholder]=\"range.label\"\n [params]=\"range.params\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n <div class=\"m-range__control\">\n <div class=\"m-range__track\" #track>\n <div\n class=\"m-range__fill\"\n [style.width.px]=\"thumbDraggable().position.x\"\n ></div>\n <div\n class=\"m-range__thumb\"\n [(mDraggable)]=\"thumbDraggable\"\n [min]=\"{ x: 0, y: _TRACK_HALF_H }\"\n [max]=\"{ x: _trackWidth(), y: _TRACK_HALF_H }\"\n ></div>\n </div>\n <span class=\"m-range__value\" [class.hidden]=\"_displayValue() === 0\">{{ _displayValue() !== 0 ? _displayValue() : '' }}</span>\n </div>\n </div>\n }\n `,\n styleUrl: './range.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RangeInputComponent extends BaseTextInputComponent<RangeInput> {\n private readonly _track = viewChild<ElementRef<HTMLDivElement>>('track');\n protected readonly _trackWidth = signal(0);\n protected readonly _TRACK_HALF_H = 3;\n\n /**\n * Measured live rather than once. The track shares its row with the value\n * readout and opens inside panels that animate in, and a width read mid\n * animation is the scaled one — `getBoundingClientRect` counts transforms\n * where a ResizeObserver's box does not. A stale width is a thumb that stops\n * short of the track's end or, before the bounds became inputs on the\n * Draggable, ran clean past it.\n */\n private readonly _measure = effect((onCleanup) => {\n const track = this._track();\n if (!track) return;\n\n const el = track.nativeElement;\n this._trackWidth.set(el.getBoundingClientRect().width);\n\n // Absent under jsdom, where the window resize below is the only signal.\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(([entry]) =>\n this._trackWidth.set(entry.contentRect.width)\n );\n observer.observe(el);\n onCleanup(() => observer.disconnect());\n });\n\n thumbDraggable = linkedSignal({\n source: () => ({\n val: this.value(),\n tw: this._trackWidth(),\n cfg: this.config(),\n }),\n computation: ({\n val,\n tw,\n cfg,\n }: {\n val: string;\n tw: number;\n cfg: unknown;\n }): Draggable => {\n const rangeCfg = cfg as RangeInput | undefined;\n const min = rangeCfg?.min ?? 0;\n const max = rangeCfg?.max ?? 100;\n const numVal = Number(val) || min;\n const x = tw > 0 ? (tw * (numVal - min)) / (max - min) : 0;\n return {\n direction: 'x' as Direction,\n position: { x, y: this._TRACK_HALF_H },\n };\n },\n });\n\n readonly _displayValue = computed(() => {\n const cfg = this.config() as RangeInput | undefined;\n const min = cfg?.min ?? 0;\n const max = cfg?.max ?? 100;\n const tw = this._trackWidth();\n if (tw === 0) return Number(this.value()) || min;\n const x = this.thumbDraggable().position.x ?? 0;\n return Math.round(min + ((max - min) * x) / tw);\n });\n\n constructor() {\n super();\n effect(() => {\n const pos = this.thumbDraggable().position;\n const cfg = this.config() as RangeInput | undefined;\n const min = cfg?.min ?? 0;\n const max = cfg?.max ?? 100;\n const tw = this._trackWidth();\n if (tw === 0) return;\n const numVal = Number(this.value()) || min;\n const expectedX = tw > 0 ? (tw * (numVal - min)) / (max - min) : 0;\n if (pos.x !== expectedX) {\n const val = Math.round(min + ((max - min) * (pos.x ?? 0)) / tw);\n this.setValue(String(val));\n }\n });\n }\n\n @HostListener('window:resize')\n protected _onResize(): void {\n const track = this._track();\n if (track) {\n this._trackWidth.set(track.nativeElement.getBoundingClientRect().width);\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"magmonium-one-text-Bo4XPBXB.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/text/text.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n} from '@angular/core';\nimport { LabelComponent } from '../label';\nimport { TextOutputComponent } from '../../../text-output';\nimport { BaseTextInputComponent } from './base-text';\nimport { IconComponent } from '../../../icon';\nimport { TranslatePipe } from '../../../../pipe';\nimport { Input, InputType, NumberInput } from '../../model/input';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\n\n/**\n * What this one component draws: a line of text, or the same line typed\n * `number`. WrapperInputComponent has no case for a `number` Field, so it\n * lands here — and the figures a NumberInput carries have to be readable off\n * the config the template already holds.\n */\nexport type TextOrNumberInput = Omit<Input, 'type'> &\n Pick<NumberInput, 'min' | 'max' | 'step'> & {\n type: InputType.TEXT | InputType.NUMBER;\n };\n\n@Component({\n selector: 'm-text-input',\n template: `\n @if (config(); as text) {\n @if (text.label) {\n <m-label\n [for]=\"text.name ?? ''\"\n [placeholder]=\"text.label\"\n [params]=\"text.params\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n }\n <div class=\"input-wrapper\">\n @if (text.icon) {\n <m-icon\n [name]=\"text.icon\"\n [color]=\"iconColor()\"\n [one]=\"text.one\"\n />\n }\n @if (text.prefix) {\n <span class=\"input-prefix\">{{ text.prefix }}</span>\n }\n <input\n [id]=\"text.name ?? ''\"\n [attr.data-testid]=\"text.testid ?? (text.name ? text.name + '-input' : null)\"\n [value]=\"value()\"\n #inputElement\n [class.error]=\"showErrors()\"\n [class.has-icon]=\"!!text.icon\"\n [class.has-prefix]=\"!!text.prefix\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly() || config()?.readonly\"\n [placeholder]=\"text.placeholder ?? '' | translate: text.params\"\n (input)=\"onInput($event)\"\n (focus)=\"isFocused.set(true)\"\n (blur)=\"isFocused.set(false); touched.set(true)\"\n [type]=\"isNumber() ? 'number' : 'text'\"\n [attr.min]=\"isNumber() ? text.min ?? null : null\"\n [attr.max]=\"isNumber() ? text.max ?? null : null\"\n [attr.step]=\"isNumber() ? text.step ?? null : null\"\n />\n @if (config()?.status; as status) {\n <div class=\"input-indicator\" [class]=\"'input-indicator--' + status\">\n @if (status === 'checking') {\n <span class=\"spinner\"></span>\n } @else if (status === 'available') {\n <m-icon name=\"check\" color=\"success\" />\n }\n </div>\n }\n @if (text.suffix) {\n <span class=\"input-suffix\">{{ text.suffix }}</span>\n }\n </div>\n @if (showErrors() && !hideErrors()) {\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 `,\n imports: [LabelComponent, TextOutputComponent, IconComponent, TranslatePipe],\n styleUrl: './text.sass',\n host: {\n '[class]': \"config()?.variant ? 'm-input--' + config()?.variant : ''\",\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TextInputComponent extends BaseTextInputComponent<TextOrNumberInput> {\n public override value = model<string>('');\n public override config = input<Partial<TextOrNumberInput> | undefined>();\n public override required = input<boolean>(false);\n public override disabled = input<boolean>(false);\n public override invalid = input<boolean>(false);\n public override touched = model<boolean>(false);\n public override focused = input<boolean>(false);\n public override errors = input<readonly WithOptionalFieldTree<ValidationError>[]>(\n []\n );\n public override showErrors = computed(() => this.touched() && this.invalid());\n readonly hideErrors = input<boolean>(false);\n\n // A `number` Field draws this same component (WrapperInputComponent has no\n // case of its own for it), so the type it declares decides the element it\n // draws. What *leaves* the field is coerced a level up, in the wrapper: an\n // `<input>` reads its value as text whatever its type, and every other\n // component on this base is a string field.\n protected readonly isNumber = computed(() => {\n const config = this.config();\n return !!config && config.type === InputType.NUMBER;\n });\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.setValue(target?.value ?? '');\n }\n}\n"],"mappings":"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"}