@magmonium/one 0.4.47 → 0.4.48

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 (190) hide show
  1. package/assets/i18n/af.json +53 -11
  2. package/assets/i18n/am.json +61 -15
  3. package/assets/i18n/ar.json +59 -27
  4. package/assets/i18n/as.json +56 -16
  5. package/assets/i18n/az.json +56 -14
  6. package/assets/i18n/ba.json +50 -11
  7. package/assets/i18n/be.json +53 -12
  8. package/assets/i18n/bg.json +54 -13
  9. package/assets/i18n/bn.json +64 -13
  10. package/assets/i18n/br.json +51 -10
  11. package/assets/i18n/brx.json +50 -1
  12. package/assets/i18n/bs.json +55 -14
  13. package/assets/i18n/ca.json +53 -11
  14. package/assets/i18n/ceb.json +57 -14
  15. package/assets/i18n/cnr.json +54 -12
  16. package/assets/i18n/co.json +56 -14
  17. package/assets/i18n/cs.json +54 -11
  18. package/assets/i18n/cy.json +49 -11
  19. package/assets/i18n/da.json +54 -11
  20. package/assets/i18n/de.json +50 -21
  21. package/assets/i18n/doi.json +55 -13
  22. package/assets/i18n/el.json +55 -14
  23. package/assets/i18n/en.json +2 -2
  24. package/assets/i18n/eo.json +55 -12
  25. package/assets/i18n/es.json +51 -24
  26. package/assets/i18n/et.json +50 -8
  27. package/assets/i18n/eu.json +54 -12
  28. package/assets/i18n/fa.json +53 -12
  29. package/assets/i18n/fi.json +53 -11
  30. package/assets/i18n/fr.json +54 -24
  31. package/assets/i18n/fy.json +56 -12
  32. package/assets/i18n/ga.json +50 -11
  33. package/assets/i18n/gd.json +52 -13
  34. package/assets/i18n/gl.json +56 -12
  35. package/assets/i18n/gu.json +64 -13
  36. package/assets/i18n/ha.json +58 -13
  37. package/assets/i18n/haw.json +48 -12
  38. package/assets/i18n/he.json +51 -10
  39. package/assets/i18n/hi.json +61 -26
  40. package/assets/i18n/hmn.json +53 -12
  41. package/assets/i18n/hr.json +54 -11
  42. package/assets/i18n/hu.json +54 -13
  43. package/assets/i18n/hy.json +59 -12
  44. package/assets/i18n/id.json +48 -9
  45. package/assets/i18n/ie.json +48 -2
  46. package/assets/i18n/ig.json +50 -9
  47. package/assets/i18n/ilo.json +40 -9
  48. package/assets/i18n/is.json +53 -11
  49. package/assets/i18n/it.json +50 -21
  50. package/assets/i18n/iw.json +51 -10
  51. package/assets/i18n/ja.json +56 -26
  52. package/assets/i18n/jw.json +48 -10
  53. package/assets/i18n/ka.json +54 -10
  54. package/assets/i18n/kk.json +49 -10
  55. package/assets/i18n/km.json +53 -12
  56. package/assets/i18n/kn.json +62 -11
  57. package/assets/i18n/ko.json +53 -22
  58. package/assets/i18n/kok.json +53 -11
  59. package/assets/i18n/ks.json +49 -1
  60. package/assets/i18n/ku.json +52 -13
  61. package/assets/i18n/ky.json +52 -12
  62. package/assets/i18n/la.json +52 -9
  63. package/assets/i18n/lb.json +54 -9
  64. package/assets/i18n/lo.json +50 -9
  65. package/assets/i18n/lt.json +55 -10
  66. package/assets/i18n/lv.json +54 -9
  67. package/assets/i18n/ma.json +54 -1
  68. package/assets/i18n/mai.json +50 -10
  69. package/assets/i18n/me.json +49 -0
  70. package/assets/i18n/mg.json +55 -10
  71. package/assets/i18n/mi.json +55 -12
  72. package/assets/i18n/mk.json +52 -8
  73. package/assets/i18n/ml.json +59 -8
  74. package/assets/i18n/mn.json +54 -10
  75. package/assets/i18n/mni.json +52 -0
  76. package/assets/i18n/mr.json +61 -10
  77. package/assets/i18n/ms.json +52 -8
  78. package/assets/i18n/mt.json +54 -10
  79. package/assets/i18n/my.json +54 -11
  80. package/assets/i18n/ne.json +53 -10
  81. package/assets/i18n/nl.json +51 -22
  82. package/assets/i18n/no.json +52 -9
  83. package/assets/i18n/ny.json +53 -11
  84. package/assets/i18n/or.json +61 -9
  85. package/assets/i18n/pa.json +61 -9
  86. package/assets/i18n/pl.json +48 -20
  87. package/assets/i18n/ps.json +50 -8
  88. package/assets/i18n/pt.json +50 -20
  89. package/assets/i18n/rm.json +50 -1
  90. package/assets/i18n/ro.json +52 -10
  91. package/assets/i18n/ru.json +50 -20
  92. package/assets/i18n/sa.json +54 -11
  93. package/assets/i18n/sat.json +55 -11
  94. package/assets/i18n/sc.json +50 -1
  95. package/assets/i18n/sd.json +48 -10
  96. package/assets/i18n/si.json +50 -12
  97. package/assets/i18n/sk.json +48 -9
  98. package/assets/i18n/sl.json +46 -7
  99. package/assets/i18n/sm.json +52 -12
  100. package/assets/i18n/sn.json +48 -9
  101. package/assets/i18n/so.json +50 -11
  102. package/assets/i18n/sq.json +57 -9
  103. package/assets/i18n/sr.json +49 -11
  104. package/assets/i18n/st.json +47 -10
  105. package/assets/i18n/su.json +49 -11
  106. package/assets/i18n/sv.json +44 -6
  107. package/assets/i18n/sw.json +33 -10
  108. package/assets/i18n/ta.json +61 -10
  109. package/assets/i18n/te.json +62 -11
  110. package/assets/i18n/tg.json +50 -11
  111. package/assets/i18n/th.json +51 -12
  112. package/assets/i18n/tl.json +51 -9
  113. package/assets/i18n/tr.json +49 -23
  114. package/assets/i18n/uk.json +47 -9
  115. package/assets/i18n/ur.json +54 -11
  116. package/assets/i18n/uz.json +49 -11
  117. package/assets/i18n/vi.json +47 -7
  118. package/assets/i18n/xh.json +50 -13
  119. package/assets/i18n/yi.json +51 -11
  120. package/assets/i18n/yo.json +51 -11
  121. package/assets/i18n/zh.json +52 -25
  122. package/assets/i18n/zu.json +48 -10
  123. package/assets/icons/svg.json +1 -0
  124. package/assets/icons/wrench.svg +3 -0
  125. package/assets/index.json +1 -1
  126. package/assets/modal/authenticate.json +1 -1
  127. package/fesm2022/{magmonium-one-attribute-value-C1lqou2L.mjs → magmonium-one-attribute-value-DnctyCKp.mjs} +3 -3
  128. package/fesm2022/{magmonium-one-attribute-value-C1lqou2L.mjs.map → magmonium-one-attribute-value-DnctyCKp.mjs.map} +1 -1
  129. package/fesm2022/{magmonium-one-base-checkbox-CIxAiA4Q.mjs → magmonium-one-base-checkbox-D3Z1FTXU.mjs} +2 -2
  130. package/fesm2022/{magmonium-one-base-checkbox-CIxAiA4Q.mjs.map → magmonium-one-base-checkbox-D3Z1FTXU.mjs.map} +1 -1
  131. package/fesm2022/{magmonium-one-base-dropdown-XpTWe4Ii.mjs → magmonium-one-base-dropdown-DIaimBpG.mjs} +10 -10
  132. package/fesm2022/{magmonium-one-base-dropdown-XpTWe4Ii.mjs.map → magmonium-one-base-dropdown-DIaimBpG.mjs.map} +1 -1
  133. package/fesm2022/{magmonium-one-base-input-C1Ek0Ezm.mjs → magmonium-one-base-input-CZyIcKrn.mjs} +2 -2
  134. package/fesm2022/{magmonium-one-base-input-C1Ek0Ezm.mjs.map → magmonium-one-base-input-CZyIcKrn.mjs.map} +1 -1
  135. package/fesm2022/{magmonium-one-base-text-Di2V2ojp.mjs → magmonium-one-base-text-6T8KrJbz.mjs} +2 -2
  136. package/fesm2022/{magmonium-one-base-text-Di2V2ojp.mjs.map → magmonium-one-base-text-6T8KrJbz.mjs.map} +1 -1
  137. package/fesm2022/{magmonium-one-button-DZ4wCJgb.mjs → magmonium-one-button-BKGxIBhw.mjs} +7 -7
  138. package/fesm2022/{magmonium-one-button-DZ4wCJgb.mjs.map → magmonium-one-button-BKGxIBhw.mjs.map} +1 -1
  139. package/fesm2022/{magmonium-one-checkbox-R-hPZrCa.mjs → magmonium-one-checkbox-D1W18OGo.mjs} +5 -5
  140. package/fesm2022/{magmonium-one-checkbox-R-hPZrCa.mjs.map → magmonium-one-checkbox-D1W18OGo.mjs.map} +1 -1
  141. package/fesm2022/{magmonium-one-color-utl-DI5p24iQ.mjs → magmonium-one-color-utl-DklqRa3m.mjs} +38 -13
  142. package/fesm2022/magmonium-one-color-utl-DklqRa3m.mjs.map +1 -0
  143. package/fesm2022/{magmonium-one-directives-B93p5bAL.mjs → magmonium-one-directives-R099YTUd.mjs} +217 -217
  144. package/fesm2022/magmonium-one-directives-R099YTUd.mjs.map +1 -0
  145. package/fesm2022/{magmonium-one-group-B7YeUd1u.mjs → magmonium-one-group-Blvejahi.mjs} +7 -7
  146. package/fesm2022/{magmonium-one-group-B7YeUd1u.mjs.map → magmonium-one-group-Blvejahi.mjs.map} +1 -1
  147. package/fesm2022/{magmonium-one-header-DUiBhPUP.mjs → magmonium-one-header-qoXWebFN.mjs} +4 -4
  148. package/fesm2022/{magmonium-one-header-DUiBhPUP.mjs.map → magmonium-one-header-qoXWebFN.mjs.map} +1 -1
  149. package/fesm2022/{magmonium-one-icon-C3jwzbb2.mjs → magmonium-one-icon-Ce44a1mo.mjs} +5 -4
  150. package/fesm2022/magmonium-one-icon-Ce44a1mo.mjs.map +1 -0
  151. package/fesm2022/{magmonium-one-image-editor-BRTk8i4O.mjs → magmonium-one-image-editor-DKiscgQU.mjs} +4 -4
  152. package/fesm2022/{magmonium-one-image-editor-BRTk8i4O.mjs.map → magmonium-one-image-editor-DKiscgQU.mjs.map} +1 -1
  153. package/fesm2022/{magmonium-one-label-D_rU82nD.mjs → magmonium-one-label-lYMBMB7p.mjs} +2 -2
  154. package/fesm2022/{magmonium-one-label-D_rU82nD.mjs.map → magmonium-one-label-lYMBMB7p.mjs.map} +1 -1
  155. package/fesm2022/{magmonium-one-m-ref-CEms7B6-.mjs → magmonium-one-m-ref-DVe-WAYR.mjs} +2 -2
  156. package/fesm2022/{magmonium-one-m-ref-CEms7B6-.mjs.map → magmonium-one-m-ref-DVe-WAYR.mjs.map} +1 -1
  157. package/fesm2022/{magmonium-one-menu-cO34OcJc.mjs → magmonium-one-menu-DcqfcU1p.mjs} +6 -6
  158. package/fesm2022/{magmonium-one-menu-cO34OcJc.mjs.map → magmonium-one-menu-DcqfcU1p.mjs.map} +1 -1
  159. package/fesm2022/{magmonium-one-multi-range-Bq3_3NHg.mjs → magmonium-one-multi-range-m86SzSZO.mjs} +3 -3
  160. package/fesm2022/{magmonium-one-multi-range-Bq3_3NHg.mjs.map → magmonium-one-multi-range-m86SzSZO.mjs.map} +1 -1
  161. package/fesm2022/{magmonium-one-options-asset-BMd7W0Mk.mjs → magmonium-one-options-asset-CIKSNq4B.mjs} +2 -2
  162. package/fesm2022/{magmonium-one-options-asset-BMd7W0Mk.mjs.map → magmonium-one-options-asset-CIKSNq4B.mjs.map} +1 -1
  163. package/fesm2022/{magmonium-one-otp-V2tFztLx.mjs → magmonium-one-otp-BrR0mijm.mjs} +5 -5
  164. package/fesm2022/{magmonium-one-otp-V2tFztLx.mjs.map → magmonium-one-otp-BrR0mijm.mjs.map} +1 -1
  165. package/fesm2022/{magmonium-one-password-IdllPMUw.mjs → magmonium-one-password-CKIAFzs9.mjs} +6 -6
  166. package/fesm2022/{magmonium-one-password-IdllPMUw.mjs.map → magmonium-one-password-CKIAFzs9.mjs.map} +1 -1
  167. package/fesm2022/{magmonium-one-radio-BAL3-3j5.mjs → magmonium-one-radio-6oN9j_F6.mjs} +3 -3
  168. package/fesm2022/{magmonium-one-radio-BAL3-3j5.mjs.map → magmonium-one-radio-6oN9j_F6.mjs.map} +1 -1
  169. package/fesm2022/{magmonium-one-range-Cf7yUnhN.mjs → magmonium-one-range-BmimLpG6.mjs} +4 -4
  170. package/fesm2022/{magmonium-one-range-Cf7yUnhN.mjs.map → magmonium-one-range-BmimLpG6.mjs.map} +1 -1
  171. package/fesm2022/{magmonium-one-selector-DAEI_0JX.mjs → magmonium-one-selector-CLSwVQCJ.mjs} +4 -4
  172. package/fesm2022/{magmonium-one-selector-DAEI_0JX.mjs.map → magmonium-one-selector-CLSwVQCJ.mjs.map} +1 -1
  173. package/fesm2022/{magmonium-one-size-converter-BOBD8nHy.mjs → magmonium-one-size-converter-DFIowQHO.mjs} +13 -2
  174. package/fesm2022/magmonium-one-size-converter-DFIowQHO.mjs.map +1 -0
  175. package/fesm2022/{magmonium-one-text-BnTkYLJe.mjs → magmonium-one-text-evdqwPEz.mjs} +6 -6
  176. package/fesm2022/{magmonium-one-text-BnTkYLJe.mjs.map → magmonium-one-text-evdqwPEz.mjs.map} +1 -1
  177. package/fesm2022/{magmonium-one-text-output-BZU61QIF.mjs → magmonium-one-text-output-BnS5Skz-.mjs} +4 -4
  178. package/fesm2022/{magmonium-one-text-output-BZU61QIF.mjs.map → magmonium-one-text-output-BnS5Skz-.mjs.map} +1 -1
  179. package/fesm2022/magmonium-one-theme-DPBeYB-G.mjs +1 -0
  180. package/fesm2022/{magmonium-one-toggle-V_YnZXx5.mjs → magmonium-one-toggle-BIoiSggh.mjs} +3 -3
  181. package/fesm2022/{magmonium-one-toggle-V_YnZXx5.mjs.map → magmonium-one-toggle-BIoiSggh.mjs.map} +1 -1
  182. package/fesm2022/magmonium-one.mjs +10691 -10487
  183. package/fesm2022/magmonium-one.mjs.map +1 -1
  184. package/package.json +1 -1
  185. package/types/magmonium-one.d.ts +95 -21
  186. package/fesm2022/magmonium-one-color-utl-DI5p24iQ.mjs.map +0 -1
  187. package/fesm2022/magmonium-one-directives-B93p5bAL.mjs.map +0 -1
  188. package/fesm2022/magmonium-one-icon-C3jwzbb2.mjs.map +0 -1
  189. package/fesm2022/magmonium-one-size-converter-BOBD8nHy.mjs.map +0 -1
  190. package/fesm2022/magmonium-one-theme-DYvNIWmo.mjs +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magmonium/one",
3
- "version": "0.4.47",
3
+ "version": "0.4.48",
4
4
  "description": "Magmonium One — Angular design-system primitives for mm Apps",
5
5
  "author": "magmonium",
6
6
  "license": "MIT",
@@ -711,6 +711,11 @@ export interface LoadingActionsApi {
711
711
  reset: () => void;
712
712
  cancelLoading: () => void;
713
713
  }
714
+ /**
715
+ * Renews the session the LoginStore holds — the refresh token, else the login
716
+ * modal — settling once fresh tokens are in it, rejecting when it cannot.
717
+ */
718
+ export type SessionRenewal = () => Promise<void>;
714
719
  export declare class SharedStoreRegistry {
715
720
  static setNavStore(store: unknown): void;
716
721
  static getNavStore(): unknown;
@@ -718,6 +723,13 @@ export declare class SharedStoreRegistry {
718
723
  static getAppLogoState(): unknown;
719
724
  static setLoginStore(store: unknown): void;
720
725
  static getLoginStore(): unknown;
726
+ /**
727
+ * First-write-wins: the app that owns the LoginStore registers how it renews
728
+ * it. A WC bundle mounted in that app shares its tokens, so it renews through
729
+ * this — never through its own Auth URL, which may not know them.
730
+ */
731
+ static setSessionRenewal(renew: SessionRenewal): void;
732
+ static getSessionRenewal(): SessionRenewal | undefined;
721
733
  /** First-write-wins: host registers its store; WC bundles reuse it so popups render in the host outlet. */
722
734
  static setNotificationStore(store: unknown): void;
723
735
  static getNotificationStore(): unknown;
@@ -741,6 +753,12 @@ export declare class SharedStoreRegistry {
741
753
  * honours a Declared Permission only for the App it names.
742
754
  */
743
755
  export declare const CALLING_APP_HEADER = "X-Mag-App";
756
+ /**
757
+ * Hands this app's session renewal to the WC bundles mounted in it
758
+ * (`HOST_SESSION`). They share its LoginStore, so its tokens; only this app's
759
+ * Auth URL is sure to know them.
760
+ */
761
+ export declare function registerSessionRenewal(): void;
744
762
  export declare const mInterceptor: (incoming: HttpRequest<unknown>, next: HttpHandlerFn) => Observable<HttpEvent<unknown>>;
745
763
  export interface RemoteSelectorConfig {
746
764
  appName: string;
@@ -1028,6 +1046,12 @@ export declare const LOGIN_STORE: InjectionToken<LoginStoreContract>;
1028
1046
  * is the host's MountPattern, so the base href no longer tells a Remote apart.
1029
1047
  */
1030
1048
  export declare const WC_BUNDLE: InjectionToken<boolean>;
1049
+ /**
1050
+ * The session renewal of the app this one is mounted in, or `null` when this
1051
+ * app owns its session. Set, the session is that host's: this app never calls
1052
+ * `auth/*` itself — no `init`, no `refresh` — and renews through the host.
1053
+ */
1054
+ export declare const HOST_SESSION: InjectionToken<SessionRenewal | null>;
1031
1055
  export declare const ASSET_BASE_URL: InjectionToken<string>;
1032
1056
  export declare const ONE_ASSET_BASE_URL: InjectionToken<string>;
1033
1057
  export declare const SEARCH_QUERY: InjectionToken<WritableSignal<string>>;
@@ -2627,12 +2651,25 @@ export declare function rebuildLogoGlyph(markup: string): LogoGlyphResult;
2627
2651
  export declare const normalizeAppColor: (value: string) => string | undefined;
2628
2652
  /** The AppLogo's shadow: App Color mixed with 20% black. */
2629
2653
  export declare const appLogoShadowColor: (color: string) => string;
2654
+ /**
2655
+ * Whether `color` reads on `ground` (3:1). Either not one hex — nothing to
2656
+ * measure — counts as reading.
2657
+ */
2658
+ export declare const isReadableOn: (color: string, ground: string | undefined) => boolean;
2659
+ /**
2660
+ * App Color as a mark standing on `ground` (the theme's background) draws it:
2661
+ * itself where it reads, else moved toward whichever of white or black stands
2662
+ * further from the ground, only as far as it takes to read — a dark App Color
2663
+ * on a dark theme lifts, a pale one on a light theme deepens.
2664
+ */
2665
+ export declare const readableAppColor: (color: string, ground: string | undefined) => string;
2630
2666
  /**
2631
2667
  * The theme's brand tokens (`mm`, `mmLite`, `mmDark`) as one App Color draws
2632
2668
  * them — what an app's own boundary paints its `mm` with in place of the
2633
- * theme's.
2669
+ * theme's. `mm` stands on the theme's background (`ground`), so it is the
2670
+ * App Color made readable there; the theme's own `mm` is picked per mode.
2634
2671
  */
2635
- export declare const appColorBrand: (color: string) => {
2672
+ export declare const appColorBrand: (color: string, ground?: string) => {
2636
2673
  mm: string;
2637
2674
  mmLite: string;
2638
2675
  mmDark: string;
@@ -2712,8 +2749,9 @@ export declare const appThemeColorFactory: () => Signal<string | undefined>;
2712
2749
  /**
2713
2750
  * Paints an App Color's brand tokens onto the element that bounds the app —
2714
2751
  * every `m.$mm` inside it reads them — or clears them, leaving the theme's.
2752
+ * `ground` is the theme's background, which the brand must read on.
2715
2753
  */
2716
- export declare const paintAppColor: (element: HTMLElement, color: string | undefined) => void;
2754
+ export declare const paintAppColor: (element: HTMLElement, color: string | undefined, ground: string | undefined) => void;
2717
2755
  /**
2718
2756
  * The element id of a page's Splash (GLOSSARY.md Splash). `OneApp` hides it
2719
2757
  * once the theme is ready, so an emitted page only has to carry it.
@@ -7286,7 +7324,7 @@ declare class DropdownBoxComponent {
7286
7324
  }
7287
7325
  /** The trigger both option Fields draw: a searchable text input and a chevron. */
7288
7326
  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";
7289
- declare const DROPDOWN_IMPORTS: (typeof ButtonComponent | typeof LabelComponent | typeof TextOutputComponent | typeof SelectorDirective | typeof TextInputComponent)[];
7327
+ declare const DROPDOWN_IMPORTS: (typeof ButtonComponent | typeof LabelComponent | typeof SelectorDirective | typeof TextOutputComponent | typeof TextInputComponent)[];
7290
7328
  /**
7291
7329
  * Everything a Dropdown and a Multiselect share: the options, the search, the
7292
7330
  * keyboard walk and the panel. What differs is only what the Field holds — one
@@ -9836,8 +9874,8 @@ export declare class LogoComponent {
9836
9874
  protected readonly resolvedBorder: import("@angular/core").Signal<string | null>;
9837
9875
  protected readonly resolvedColor: import("@angular/core").Signal<string | null>;
9838
9876
  private readonly grain;
9839
- protected readonly topGrain: import("@angular/core").Signal<string | null>;
9840
- protected readonly bottomGrain: import("@angular/core").Signal<string | null>;
9877
+ protected readonly darkGrain: import("@angular/core").Signal<string | null>;
9878
+ protected readonly lightGrain: import("@angular/core").Signal<string | null>;
9841
9879
  darkGradient: import("@angular/core").Signal<string>;
9842
9880
  lightGradient: import("@angular/core").Signal<string>;
9843
9881
  darkGradientInv: import("@angular/core").Signal<string>;
@@ -10332,7 +10370,14 @@ export declare class RemoteComponent implements OnDestroy {
10332
10370
  private readonly reloadPage;
10333
10371
  private readonly assetStore;
10334
10372
  private readonly appLogoState;
10373
+ private readonly handoff;
10335
10374
  private loadedElement?;
10375
+ /** The config the element was loaded from, handed on with it. */
10376
+ private loadedConfig?;
10377
+ /** Where the element parks when this mount goes ({@link RemoteHandoff}). */
10378
+ private handoffKey?;
10379
+ /** The key this mount has told the handoff it holds an element under. */
10380
+ private heldKey?;
10336
10381
  /** Bumped per load, so an answer for a link since replaced is dropped. */
10337
10382
  private loadId;
10338
10383
  /** The link whose segment the URL holds now, cleared when another replaces it. */
@@ -10343,6 +10388,8 @@ export declare class RemoteComponent implements OnDestroy {
10343
10388
  private replaceNext;
10344
10389
  /** The remote's own last word on where it stands, never echoed back to it. */
10345
10390
  private lastReported?;
10391
+ /** The Nav that report stood on — the next mount of the element starts from it. */
10392
+ private lastRoute?;
10346
10393
  private lastSent?;
10347
10394
  /**
10348
10395
  * Set while a load handed the remote an `extra` path it has not confirmed
@@ -10419,6 +10466,17 @@ export declare class RemoteComponent implements OnDestroy {
10419
10466
  }>;
10420
10467
  constructor();
10421
10468
  ngOnDestroy(): void;
10469
+ /**
10470
+ * An App that has drawn goes to the next mount of it rather than away: a
10471
+ * Side App expanded or swapped arrives as it stood ({@link RemoteHandoff}).
10472
+ */
10473
+ private park;
10474
+ /**
10475
+ * The App another mount just left, mounted here as it stood — no Splash, no
10476
+ * boot. The move that brought it wrote the URL, so its next report is a move
10477
+ * of its own, and the host path it is handed is one it already stands on.
10478
+ */
10479
+ private adopt;
10422
10480
  private mountName;
10423
10481
  /** The host page that mounts this app, asked for at its beta tier. */
10424
10482
  protected openBeta: () => void;
@@ -10452,6 +10510,8 @@ export declare class RemoteComponent implements OnDestroy {
10452
10510
  */
10453
10511
  private reloadForTier;
10454
10512
  private dismountElement;
10513
+ private holdAs;
10514
+ private releaseHeld;
10455
10515
  static ɵfac: i0.ɵɵFactoryDeclaration<RemoteComponent, never>;
10456
10516
  static ɵcmp: i0.ɵɵComponentDeclaration<RemoteComponent, "m-remote", never, {
10457
10517
  "config": {
@@ -12366,6 +12426,13 @@ export declare class AppLogoComponent {
12366
12426
  protected readonly color: import("@angular/core").Signal<string | null>;
12367
12427
  protected readonly label: import("@angular/core").Signal<string>;
12368
12428
  protected readonly shadow: import("@angular/core").Signal<string | null>;
12429
+ /**
12430
+ * A `glow` mark has no tile under it, so its colour must read on the theme's
12431
+ * background: App Color (or the theme's `mm`) made readable there; `light`
12432
+ * keeps its white wherever white reads and takes that colour where it
12433
+ * cannot, as on a light theme. Null leaves the sass default.
12434
+ */
12435
+ protected readonly mark: import("@angular/core").Signal<string | null>;
12369
12436
  protected readonly mask: import("@angular/core").Signal<string | undefined>;
12370
12437
  protected readonly letter: import("@angular/core").Signal<string>;
12371
12438
  static ɵfac: i0.ɵɵFactoryDeclaration<AppLogoComponent, never>;
@@ -12729,6 +12796,8 @@ export type Modal = Config & {
12729
12796
  resizable?: true;
12730
12797
  noBackdrop?: true;
12731
12798
  fullscreen?: true;
12799
+ /** Edge to edge below the tablet width; the ordinary card above it. */
12800
+ fullscreenOnMobile?: true;
12732
12801
  backdropClose?: boolean;
12733
12802
  maxWidth?: number | string;
12734
12803
  };
@@ -13171,7 +13240,8 @@ export declare class ConfirmComponent {
13171
13240
  cancelLabel: import("@angular/core").InputSignal<string>;
13172
13241
  protected readonly confirmText: import("@angular/core").Signal<string>;
13173
13242
  protected readonly cancelText: import("@angular/core").Signal<string>;
13174
- protected readonly iconName: import("@angular/core").Signal<"info" | "exclamation-triangle" | "trash" | "check-circle">;
13243
+ protected readonly accent: import("@angular/core").Signal<"error" | "mm" | "success" | "warning">;
13244
+ protected readonly iconName: import("@angular/core").Signal<"exclamation-triangle" | "info" | "trash" | "check-circle">;
13175
13245
  protected accept(): void;
13176
13246
  protected decline(): void;
13177
13247
  static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmComponent, never>;
@@ -13256,10 +13326,6 @@ export type BreadCrumb = {
13256
13326
  trail?: BreadcrumbTrail[];
13257
13327
  header: BreadcrumbTrail;
13258
13328
  };
13259
- /**
13260
- * Nav model — see libs/one/GLOSSARY.md (NavId, NavKind, Address, Anchor, NavRef)
13261
- * and docs/adr/0014.
13262
- */
13263
13329
  /** How a Nav is reached. A property of the node, never of the link. */
13264
13330
  export type NavKind = 'url' | 'murl';
13265
13331
  /** How a Nav fills its panel. Orthogonal to whether it has children. */
@@ -13315,6 +13381,8 @@ export type NavRow = {
13315
13381
  value: string;
13316
13382
  label: string;
13317
13383
  icon?: string;
13384
+ /** A row standing for an app draws its AppLogo instead of `icon`. */
13385
+ appLogo?: BreadcrumbTrail['appLogo'];
13318
13386
  };
13319
13387
  /**
13320
13388
  * The parameter name a `dynamic` Nav carries when it authored none. One
@@ -13582,11 +13650,11 @@ export declare class FrameComponent {
13582
13650
  navOpenedByUser: import("@angular/core").Signal<boolean>;
13583
13651
  menuNavId: import("@angular/core").Signal<string | undefined>;
13584
13652
  menuParams: import("@angular/core").Signal<Record<string, string | number> | undefined>;
13585
- browsedApp: import("@ngrx/signals").DeepSignal<{
13653
+ browsedApp: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<{
13586
13654
  name: string;
13587
13655
  appNavId: string;
13588
13656
  slot: "main" | "side";
13589
- }> | import("@angular/core").Signal<undefined>;
13657
+ }>;
13590
13658
  keepPanelOnPathChange: import("@angular/core").Signal<boolean>;
13591
13659
  panelPushed: import("@angular/core").Signal<boolean>;
13592
13660
  navScrolledDown: import("@angular/core").Signal<boolean>;
@@ -14005,11 +14073,11 @@ export declare const NavStore: import("@angular/core").Type<{
14005
14073
  navOpenedByUser: Signal<boolean>;
14006
14074
  menuNavId: Signal<string | undefined>;
14007
14075
  menuParams: Signal<Record<string, string | number> | undefined>;
14008
- browsedApp: import("@ngrx/signals").DeepSignal<{
14076
+ browsedApp: Signal<undefined> | import("@ngrx/signals").DeepSignal<{
14009
14077
  name: string;
14010
14078
  appNavId: string;
14011
14079
  slot: AppSlot;
14012
- }> | Signal<undefined>;
14080
+ }>;
14013
14081
  keepPanelOnPathChange: Signal<boolean>;
14014
14082
  panelPushed: Signal<boolean>;
14015
14083
  navScrolledDown: Signal<boolean>;
@@ -14497,11 +14565,11 @@ export declare class NavDetailsComponent {
14497
14565
  navOpenedByUser: import("@angular/core").Signal<boolean>;
14498
14566
  menuNavId: import("@angular/core").Signal<string | undefined>;
14499
14567
  menuParams: import("@angular/core").Signal<Record<string, string | number> | undefined>;
14500
- browsedApp: import("@ngrx/signals").DeepSignal<{
14568
+ browsedApp: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<{
14501
14569
  name: string;
14502
14570
  appNavId: string;
14503
14571
  slot: "main" | "side";
14504
- }> | import("@angular/core").Signal<undefined>;
14572
+ }>;
14505
14573
  keepPanelOnPathChange: import("@angular/core").Signal<boolean>;
14506
14574
  panelPushed: import("@angular/core").Signal<boolean>;
14507
14575
  navScrolledDown: import("@angular/core").Signal<boolean>;
@@ -14758,11 +14826,11 @@ export declare class NavHeaderComponent {
14758
14826
  navOpenedByUser: import("@angular/core").Signal<boolean>;
14759
14827
  menuNavId: import("@angular/core").Signal<string | undefined>;
14760
14828
  menuParams: import("@angular/core").Signal<Record<string, string | number> | undefined>;
14761
- browsedApp: import("@ngrx/signals").DeepSignal<{
14829
+ browsedApp: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<{
14762
14830
  name: string;
14763
14831
  appNavId: string;
14764
14832
  slot: "main" | "side";
14765
- }> | import("@angular/core").Signal<undefined>;
14833
+ }>;
14766
14834
  keepPanelOnPathChange: import("@angular/core").Signal<boolean>;
14767
14835
  panelPushed: import("@angular/core").Signal<boolean>;
14768
14836
  navScrolledDown: import("@angular/core").Signal<boolean>;
@@ -14952,6 +15020,12 @@ export declare class NavHeaderComponent {
14952
15020
  * has a header of its own never also draws the breadcrumb's.
14953
15021
  */
14954
15022
  _header: import("@angular/core").Signal<import("@magmonium/one").BreadcrumbTrail | null>;
15023
+ /**
15024
+ * Follows the Nav the header titles, the way a menu row naming it would: to
15025
+ * its Page, or — already standing there — only closing the panel. A dynamic
15026
+ * header carries no instance of its own, so the panel's is the one it names.
15027
+ */
15028
+ _followHeader: () => void;
14955
15029
  constructor();
14956
15030
  static ɵfac: i0.ɵɵFactoryDeclaration<NavHeaderComponent, never>;
14957
15031
  static ɵcmp: i0.ɵɵComponentDeclaration<NavHeaderComponent, "m-nav-header", never, {}, {}, never, never, true, never>;
@@ -16284,7 +16358,7 @@ export declare class AuthActivityPageComponent {
16284
16358
  showTerms: import("@angular/core").Signal<boolean | undefined>;
16285
16359
  signUp: import("@angular/core").Signal<boolean | undefined>;
16286
16360
  tokens: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@magmonium/one").Tokens>;
16287
- user: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@magmonium/one").AuthUser>;
16361
+ user: import("@ngrx/signals").DeepSignal<import("@magmonium/one").AuthUser> | import("@angular/core").Signal<undefined>;
16288
16362
  wrongPassword: import("@angular/core").Signal<boolean | undefined>;
16289
16363
  deployToken: import("@angular/core").Signal<string | undefined>;
16290
16364
  hostUserTabs: Record<string, import("@angular/core").Type<unknown>>;
@@ -16464,7 +16538,7 @@ export declare const AuthStore: Type<{
16464
16538
  showTerms: import("@angular/core").Signal<boolean | undefined>;
16465
16539
  signUp: import("@angular/core").Signal<boolean | undefined>;
16466
16540
  tokens: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<Tokens>;
16467
- user: import("@angular/core").Signal<undefined> | import("@ngrx/signals").DeepSignal<import("@magmonium/one").AuthUser>;
16541
+ user: import("@ngrx/signals").DeepSignal<import("@magmonium/one").AuthUser> | import("@angular/core").Signal<undefined>;
16468
16542
  wrongPassword: import("@angular/core").Signal<boolean | undefined>;
16469
16543
  deployToken: import("@angular/core").Signal<string | undefined>;
16470
16544
  hostUserTabs: Record<string, Type<unknown>>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"magmonium-one-color-utl-DI5p24iQ.mjs","names":["map","switchMap"],"sources":["../../../../libs/one/src/lib/shared/lib/theme/api/theme-data.ts","../../../../libs/one/src/lib/shared/lib/theme/lib/theme-detector.ts","../../../../libs/one/src/lib/shared/lib/theme/type/state.ts","../../../../libs/one/src/lib/shared/lib/app-identity/logo-glyph.ts","../../../../libs/one/src/lib/shared/lib/app-identity/app-logo-source.ts","../../../../libs/one/src/lib/shared/lib/theme/lib/theme-store.ts","../../../../libs/one/src/lib/shared/functions/css/property-names.ts","../../../../libs/one/src/lib/shared/functions/color/parsers.ts","../../../../libs/one/src/lib/shared/functions/color/converters.ts","../../../../libs/one/src/lib/shared/functions/color/operations.ts","../../../../libs/one/src/lib/shared/lib/theme/lib/color-utl.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { catchError, forkJoin, map, of } from 'rxjs';\nimport { Theme, ThemeList } from '@magmonium/cli';\nimport { AssetStore } from '../../../stores/asset.store';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ThemeDataService {\n private readonly assetStore = inject(AssetStore);\n\n public fetchThemeList = (source: 'one' | 'host') =>\n this.assetStore\n .resolve<ThemeList>('theme', 'theme', source === 'one')\n .pipe(catchError(() => of(<ThemeList>[])));\n\n public fetchThemes = () =>\n forkJoin({\n one: this.fetchThemeList('one'),\n local: this.fetchThemeList('host'),\n }).pipe(\n map(({ one, local }) => {\n const themeMap: Record<string, Theme & { sources: string[] }> = {};\n\n const processList = (list: ThemeList, sourceKey: string) => {\n if (!list || !Array.isArray(list)) return;\n list.forEach((t) => {\n const name = t.name || t.fileName;\n if (name) {\n if (themeMap[name]) {\n if (!themeMap[name].sources.includes(sourceKey)) {\n themeMap[name].sources.push(sourceKey);\n }\n } else {\n themeMap[name] = { ...t, sources: [sourceKey] } as Theme & {\n sources: string[];\n };\n }\n }\n });\n };\n\n processList(one, 'one');\n processList(local, 'host');\n\n return themeMap;\n })\n );\n\n public fetchTheme = (theme: Theme, isOne = false) =>\n theme.fileName\n ? this.assetStore\n .resolve<Theme>('theme', theme.fileName, isOne)\n .pipe(map((data: Theme) => ({ ...theme, ...data })))\n : of(theme);\n}\n","import { Injectable, signal } from '@angular/core';\nimport { OsTheme } from '../type/state';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ThemeDetector {\n public readonly osTheme = signal<OsTheme>('dark');\n private mediaQueryList!: MediaQueryList;\n\n public onInit(): void {\n this.mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');\n this.osTheme.set(this.mediaQueryList.matches ? 'dark' : 'light');\n this.mediaQueryList.addEventListener('change', this.listener);\n }\n\n public onDestroy(): void {\n this.mediaQueryList.removeEventListener('change', this.listener);\n }\n\n private listener = (event: MediaQueryListEvent) => {\n this.osTheme.set(event.matches ? 'dark' : 'light');\n };\n}\n","import { Theme } from '@magmonium/cli';\n\nexport type OsTheme = 'light' | 'dark';\n\nexport type ThemeState = {\n themeMap: Record<string, Theme>;\n selected: string | undefined;\n userAdopted: true | undefined;\n // The theme the app declares it boots with — `theme:` on its\n // WebComponentConfig, read out of `app-wc.json` at bootstrap. Stands in for\n // the OS auto-match rather than for the person's own pick: `userAdopted`\n // still wins, and an app that declares nothing keeps the OS behaviour.\n configDefault: string | undefined;\n sources: string[];\n isReady: boolean;\n};\n\nexport const initialState: ThemeState = {\n themeMap: {},\n selected: 'light',\n userAdopted: undefined,\n configDefault: undefined,\n sources: [],\n isReady: false,\n};\n","/**\n * LogoGlyph rules (nx ADR 0007) — the same allowlist rebuild api runs on\n * save, so the editor refuses what api would refuse before anything is sent.\n * api's rebuild is the rule; this one is the early answer.\n */\n\n/** The size bound on a LogoGlyph's markup, in UTF-8 bytes. */\nexport const LOGO_GLYPH_MAX_BYTES = 16 * 1024;\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nconst SHAPE_TAGS = new Set([\n 'path',\n 'circle',\n 'ellipse',\n 'line',\n 'polyline',\n 'polygon',\n 'rect',\n]);\n\n/** Geometry only — no attribute here can carry a script or a link. */\nconst GEOMETRY = new Set([\n 'd',\n 'cx',\n 'cy',\n 'r',\n 'rx',\n 'ry',\n 'x',\n 'y',\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'width',\n 'height',\n 'points',\n 'transform',\n]);\n\nconst ENUMS: Record<string, ReadonlySet<string>> = {\n 'stroke-linecap': new Set(['butt', 'round', 'square']),\n 'stroke-linejoin': new Set(['miter', 'round', 'bevel']),\n 'fill-rule': new Set(['nonzero', 'evenodd']),\n 'clip-rule': new Set(['nonzero', 'evenodd']),\n};\n\nconst GEOMETRY_VALUE = /^[0-9A-Za-z.,\\s+\\-()%]*$/;\nconst NUMBER = /^\\s*[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?\\s*$/;\nconst APP_COLOR = /^#[0-9a-fA-F]{6}$/;\n\n/** Why a glyph was refused — the codes api answers with. */\nexport type LogoGlyphError = '' | 'logo_invalid' | 'logo_too_large';\n\n/**\n * A rebuilt glyph. Flat rather than a union: the wc build does not narrow\n * discriminated unions. `error` is empty on success, `svg` empty on refusal.\n */\nexport type LogoGlyphResult = { svg: string; error: LogoGlyphError };\n\nconst escapeAttribute = (value: string): string =>\n value.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;');\n\n/**\n * Paint survives only as on/off: the AppLogo paints the glyph white, so a\n * colour is kept as `#fff` and `none` as `none` — never a `url(...)`.\n */\nconst paint = (element: Element): string => {\n let out = '';\n for (const name of ['fill', 'stroke']) {\n const value = element.getAttribute(name);\n if (value !== null) {\n out += ` ${name}=\"${value.trim() === 'none' ? 'none' : '#fff'}\"`;\n }\n }\n const width = element.getAttribute('stroke-width');\n if (width !== null && NUMBER.test(width)) {\n out += ` stroke-width=\"${width.trim()}\"`;\n }\n for (const [name, allowed] of Object.entries(ENUMS)) {\n const value = element.getAttribute(name)?.trim();\n if (value && allowed.has(value)) out += ` ${name}=\"${value}\"`;\n }\n return out;\n};\n\nconst shape = (element: Element): string => {\n const tag = element.localName;\n if (tag === 'g') {\n const children = Array.from(element.children).map(shape).join('');\n if (!children) return '';\n const transform = element.getAttribute('transform');\n const attrs =\n transform && GEOMETRY_VALUE.test(transform)\n ? ` transform=\"${escapeAttribute(transform)}\"`\n : '';\n return `<g${attrs}${paint(element)}>${children}</g>`;\n }\n if (!SHAPE_TAGS.has(tag)) return '';\n const geometry = Array.from(element.attributes)\n .filter(({ name, value }) => GEOMETRY.has(name) && GEOMETRY_VALUE.test(value))\n .map(({ name, value }) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n return geometry ? `<${tag}${geometry}${paint(element)}/>` : '';\n};\n\nconst viewBoxOf = (root: Element): string | undefined => {\n const viewBox = root.getAttribute('viewBox');\n if (viewBox !== null) {\n const parts = viewBox.replace(/,/g, ' ').trim().split(/\\s+/);\n const ok =\n parts.length === 4 &&\n parts.every((part) => NUMBER.test(part)) &&\n Number(parts[2]) > 0 &&\n Number(parts[3]) > 0;\n return ok ? parts.join(' ') : undefined;\n }\n const width = root.getAttribute('width') ?? '';\n const height = root.getAttribute('height') ?? '';\n return NUMBER.test(width) && NUMBER.test(height)\n ? `0 0 ${width.trim()} ${height.trim()}`\n : undefined;\n};\n\nconst refused = (error: LogoGlyphError): LogoGlyphResult => ({\n svg: '',\n error,\n});\n\n/**\n * The LogoGlyph as it will be stored: shape elements, their geometry and\n * on/off paint inside a fresh `<svg>` root. Refuses `logo_too_large` over\n * the size bound and `logo_invalid` for anything not a drawable SVG.\n */\nexport function rebuildLogoGlyph(markup: string): LogoGlyphResult {\n if (!markup.trim()) return refused('logo_invalid');\n if (new TextEncoder().encode(markup).length > LOGO_GLYPH_MAX_BYTES) {\n return refused('logo_too_large');\n }\n const lowered = markup.toLowerCase();\n if (lowered.includes('<!doctype') || lowered.includes('<!entity')) {\n return refused('logo_invalid');\n }\n const doc = new DOMParser().parseFromString(markup, 'image/svg+xml');\n const root = doc.documentElement;\n if (root.localName !== 'svg' || doc.getElementsByTagName('parsererror').length) {\n return refused('logo_invalid');\n }\n const viewBox = viewBoxOf(root);\n const body = Array.from(root.children).map(shape).join('');\n if (!viewBox || !body) return refused('logo_invalid');\n return {\n svg: `<svg xmlns=\"${SVG_NS}\" viewBox=\"${viewBox}\"${paint(root)}>${body}</svg>`,\n error: '',\n };\n}\n\n/** App Color as stored: `#rrggbb`, lowercased — or undefined when it is not one. */\nexport const normalizeAppColor = (value: string): string | undefined =>\n APP_COLOR.test(value.trim()) ? value.trim().toLowerCase() : undefined;\n\nconst channels = (color: string): [number, number, number] => {\n const hex = color.replace('#', '');\n return [0, 2, 4].map((i) => parseInt(hex.slice(i, i + 2), 16)) as [\n number,\n number,\n number,\n ];\n};\n\n/** App Color moved `amount` of the way toward white (255) or black (0). */\nconst mixAppColor = (color: string, toward: 0 | 255, amount: number): string =>\n `#${channels(color)\n .map((channel) =>\n Math.round(channel + (toward - channel) * amount)\n .toString(16)\n .padStart(2, '0')\n )\n .join('')}`;\n\n/** The AppLogo's shadow: App Color mixed with 20% black. */\nexport const appLogoShadowColor = (color: string): string =>\n mixAppColor(color, 0, 0.2);\n\n/**\n * The theme's brand tokens (`mm`, `mmLite`, `mmDark`) as one App Color draws\n * them — what an app's own boundary paints its `mm` with in place of the\n * theme's.\n */\nexport const appColorBrand = (\n color: string\n): { mm: string; mmLite: string; mmDark: string } => ({\n mm: color,\n mmLite: mixAppColor(color, 255, 0.35),\n mmDark: mixAppColor(color, 0, 0.2),\n});\n\n/**\n * Whether a white glyph reads poorly over this App Color: contrast under 3:1,\n * the WCAG floor for graphical objects. A warning, never a refusal.\n */\nexport const isLightAppColor = (color: string): boolean => {\n const [r, g, b] = channels(color).map((channel) => {\n const c = channel / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n });\n const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n return 1.05 / (luminance + 0.05) < 3;\n};\n\n/** A LogoGlyph as a CSS `url(...)`, for painting it through a mask. */\nexport const logoGlyphMaskUrl = (svg: string): string =>\n `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n","import {\n computed,\n inject,\n Injectable,\n InjectionToken,\n Signal,\n signal,\n} from '@angular/core';\nimport { AssetStore } from '../../stores/asset.store';\nimport { APP_LINK } from '../../config/tokens';\nimport { appColorBrand, normalizeAppColor } from './logo-glyph';\n\n/**\n * The running app's AppLogo as an icon draws it. `glyph` is a Store App's\n * LogoGlyph (already rebuilt from the allowlist); `src` is the host's\n * file-based AppLogo; neither is the first letter of `name`.\n */\nexport type AppLogoSource = {\n glyph?: string | null;\n src?: string;\n name?: string | null;\n /** App Color, `#rrggbb`, as Store holds it; null until the Owner sets one. */\n color?: string | null;\n};\n\n/**\n * Where NavStore publishes the AppLogo. Shared rather than read off NavStore\n * because `m-icon` sits below features and cannot import it — and handed to a\n * mounted WC through SharedStoreRegistry, since a WC reads the host's NavStore.\n * `logos` is every app NavStore knows the identity of, by AppLink: a host may\n * mount several at once, so each WC looks up its own. `source` is the fallback.\n */\n@Injectable({ providedIn: 'root' })\nexport class AppLogoState {\n readonly #source = signal<AppLogoSource | undefined>(undefined);\n readonly #logos = signal<Record<string, AppLogoSource>>({});\n readonly source = this.#source.asReadonly();\n readonly logos = this.#logos.asReadonly();\n readonly set = (source: AppLogoSource | undefined): void =>\n this.#source.set(source);\n readonly setLogos = (logos: Record<string, AppLogoSource>): void =>\n this.#logos.set(logos);\n}\n\n/**\n * What `m-icon name=\"app_logo\"` draws: this app's own entry, by the AppLink\n * AssetStore holds (a mounted WC's, from `bindApp`), else the fallback. A\n * visual editor provides its own so the Canvas shows the AppTarget's logo.\n */\nexport const APP_LOGO_SOURCE = new InjectionToken<\n Signal<AppLogoSource | undefined>\n>('APP_LOGO_SOURCE', {\n providedIn: 'root',\n factory: () => {\n const state = inject(AppLogoState);\n const assets = inject(AssetStore);\n return computed(() => {\n const link = assets.appLink();\n const own = link ? state.logos()[link] : undefined;\n // An entry with no `glyph` key carries only an Open App's App Color:\n // its logo is the host's, so it falls back like an unknown app.\n return own && own.glyph !== undefined ? own : state.source();\n });\n },\n});\n\n/**\n * This app's App Color, which its own boundary paints as the theme's `mm`\n * (ThemeStore `color`). Unset at the host's root, so the host's chrome keeps\n * the theme's brand; a WC and a standalone Run provide it from\n * `appThemeColorFactory`. Unset too while the Owner has set none, and the\n * theme's own `mm` stands.\n */\nexport const APP_THEME_COLOR = new InjectionToken<Signal<string | undefined>>(\n 'APP_THEME_COLOR',\n { providedIn: 'root', factory: () => signal<string | undefined>(undefined) }\n);\n\n/** This app's App Color off the identities NavStore publishes, by its AppLink. */\nexport const appThemeColorFactory = (): Signal<string | undefined> => {\n const state = inject(AppLogoState);\n const appLink = inject(APP_LINK);\n const assets = inject(AssetStore);\n return computed(() => {\n const link = appLink() ?? assets.appLink();\n const color = link ? state.logos()[link]?.color : undefined;\n return color ? normalizeAppColor(color) : undefined;\n });\n};\n\nconst BRAND_VARS = [\n ['mm', '--m-mm'],\n ['mmLite', '--m-mm-lite'],\n ['mmDark', '--m-mm-dark'],\n] as const;\n\n/**\n * Paints an App Color's brand tokens onto the element that bounds the app —\n * every `m.$mm` inside it reads them — or clears them, leaving the theme's.\n */\nexport const paintAppColor = (\n element: HTMLElement,\n color: string | undefined\n): void => {\n const brand = color ? appColorBrand(color) : undefined;\n for (const [key, cssVar] of BRAND_VARS) {\n if (brand) element.style.setProperty(cssVar, brand[key]);\n else element.style.removeProperty(cssVar);\n }\n};\n","import {\n patchState,\n signalStore,\n withComputed,\n withHooks,\n withMethods,\n withState,\n} from '@ngrx/signals';\nimport { computed, DOCUMENT, inject } from '@angular/core';\nimport { ThemeDataService } from '../api/theme-data';\nimport { rxMethod } from '@ngrx/signals/rxjs-interop';\nimport { forkJoin, of, pipe, tap, catchError } from 'rxjs';\nimport { switchMap, map } from 'rxjs/operators';\nimport { Theme } from '@magmonium/cli';\nimport { ThemeDetector } from './theme-detector';\nimport { initialState } from '../type/state';\nimport { ASSET_BASE_URL, ONE_ASSET_BASE_URL } from '../../../config/tokens';\nimport { APP_THEME_COLOR } from '../../app-identity/app-logo-source';\nimport { appColorBrand } from '../../app-identity/logo-glyph';\n\nfunction toThemeCssVar(key: string): string {\n return '--m-' + key.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\nfunction applyThemeVars(\n colors: Record<string, string>,\n target: HTMLElement\n): void {\n Object.entries(colors).forEach(([key, value]) => {\n target.style.setProperty(toThemeCssVar(key), value);\n });\n}\n\nexport const ThemeStore = signalStore(\n { providedIn: 'root' },\n withState(initialState),\n withComputed(\n (\n state,\n themeDetector = inject(ThemeDetector),\n appColor = inject(APP_THEME_COLOR)\n ) => {\n const osTheme = computed(themeDetector.osTheme);\n const theme = computed<Theme | undefined>(() => {\n const themeMap = state.themeMap();\n const selected = state.selected();\n return selected ? themeMap[selected] : undefined;\n });\n // Inside an app's own boundary its App Color is the brand: every `mm` a\n // component resolves here draws it. Only the JS read — `renderTheme`\n // paints the raw theme, since a WC's document root is the host's.\n const color = computed(() => {\n const themeColor = theme()?.color;\n const app = appColor();\n return themeColor && app\n ? { ...themeColor, ...appColorBrand(app) }\n : themeColor;\n });\n return {\n theme,\n color,\n osTheme,\n };\n }\n ),\n withMethods(\n (\n state,\n themeDataService = inject(ThemeDataService),\n document = inject(DOCUMENT),\n themeDetector = inject(ThemeDetector),\n oneAssetBaseUrl = inject(ONE_ASSET_BASE_URL, { optional: true }) ||\n '/assets/one',\n assetBaseUrl = inject(ASSET_BASE_URL, { optional: true }) || '/assets'\n ) => {\n const renderTheme = (colors: Record<string, string>) => {\n applyThemeVars(colors, document.documentElement);\n };\n\n const normalizeThemeSources = (\n themeMap: Record<string, Theme & { sources: string[] }>\n ) => {\n const normalized: Record<string, Theme & { sources: string[] }> = {};\n for (const [name, theme] of Object.entries(themeMap)) {\n normalized[name] = {\n ...theme,\n sources: theme.sources.map((s) =>\n s === 'one' ? oneAssetBaseUrl : s === 'host' ? assetBaseUrl : s\n ),\n };\n }\n return normalized;\n };\n\n const fetchAndMergeTheme = (themeName: string) => {\n const themeEntry = state.themeMap()[themeName] as\n | (Theme & { sources: string[] })\n | undefined;\n if (!themeEntry || !themeEntry.sources.length) return of(undefined);\n\n const requests = themeEntry.sources.map((source) =>\n themeDataService\n .fetchTheme(themeEntry, source === oneAssetBaseUrl)\n .pipe(catchError(() => of(undefined)))\n );\n\n return forkJoin(requests).pipe(\n map((results) => {\n const validResults = results.filter((r) => !!r) as Theme[];\n if (validResults.length === 0) return undefined;\n\n const mergedColor = validResults.reduce(\n (acc, curr) => ({\n ...acc,\n ...(curr.color || {}),\n }),\n {} as Record<string, unknown>\n );\n\n return {\n ...validResults[validResults.length - 1],\n color: mergedColor,\n sources: themeEntry.sources,\n } as Theme & { sources: string[] };\n })\n );\n };\n\n return {\n /**\n * Paints a set of DesignTokens straight onto the page without a theme\n * behind them. What a visual editor needs to show a theme it holds in\n * memory and has not written anywhere yet — every other path here\n * resolves a name against an asset first, and an unsaved theme has no\n * asset to resolve.\n */\n applyTheme(colors: Record<string, string>): void {\n renderTheme(colors);\n },\n /**\n * The theme the app declares it boots with (`theme:` on its\n * WebComponentConfig). Read out of `app-wc.json` after bootstrap, so it\n * lands either side of `init` finishing — hence both halves: it is\n * recorded for `init` to prefer, and applied now in case `init` has\n * already chosen the OS theme.\n *\n * Never overrides a person who has picked for themselves: `userAdopted`\n * is checked here the same way `init` checks it.\n */\n setConfigDefault(name: string | undefined): void {\n patchState(state, { configDefault: name });\n if (!name || state.userAdopted()) return;\n if (!state.themeMap()[name] || state.selected() === name) return;\n patchState(state, { selected: name });\n fetchAndMergeTheme(name).subscribe((fullTheme) => {\n if (!fullTheme?.name) return;\n patchState(state, {\n themeMap: { ...state.themeMap(), [fullTheme.name]: fullTheme },\n isReady: true,\n });\n if (fullTheme.color) {\n renderTheme(fullTheme.color as Record<string, string>);\n }\n });\n },\n setTheme: rxMethod<string | undefined>(\n pipe(\n tap((selected) => patchState(state, { selected })),\n switchMap((selected) => {\n if (!selected) return of(undefined);\n return fetchAndMergeTheme(selected);\n }),\n tap((fullTheme: (Theme & { sources: string[] }) | undefined) => {\n if (fullTheme && fullTheme.name) {\n patchState(state, {\n themeMap: {\n ...state.themeMap(),\n [fullTheme.name]: fullTheme as Theme,\n },\n });\n if (fullTheme.color) {\n renderTheme(fullTheme.color as Record<string, string>);\n }\n }\n })\n )\n ),\n addSource: rxMethod<string>(\n pipe(\n tap((baseUrl) => {\n const sources = state.sources();\n if (!sources.includes(baseUrl)) {\n patchState(state, { sources: [...sources, baseUrl] });\n }\n }),\n switchMap((baseUrl) => {\n const source = baseUrl === oneAssetBaseUrl ? 'one' : 'host';\n return themeDataService\n .fetchThemeList(source)\n .pipe(map((list) => ({ list, baseUrl })));\n }),\n tap(({ list, baseUrl }) => {\n const themeMap = { ...state.themeMap() } as Record<\n string,\n Theme & { sources: string[] }\n >;\n list.forEach((t) => {\n const name = t.name || t.fileName;\n if (name) {\n if (themeMap[name]) {\n if (!themeMap[name].sources.includes(baseUrl)) {\n themeMap[name].sources.push(baseUrl);\n }\n } else {\n themeMap[name] = { ...t, sources: [baseUrl] } as Theme & {\n sources: string[];\n };\n }\n }\n });\n patchState(state, {\n themeMap: themeMap as Record<string, Theme>,\n });\n\n const selected = state.selected();\n if (selected && themeMap[selected]?.sources.includes(baseUrl)) {\n fetchAndMergeTheme(selected).subscribe(\n (fullTheme: (Theme & { sources: string[] }) | undefined) => {\n if (fullTheme && fullTheme.name) {\n patchState(state, {\n themeMap: {\n ...state.themeMap(),\n [fullTheme.name]: fullTheme as Theme,\n },\n });\n if (fullTheme.color) {\n renderTheme(fullTheme.color as Record<string, string>);\n }\n }\n }\n );\n }\n })\n )\n ),\n init$: () => {\n return themeDataService.fetchThemes().pipe(\n map((themeMap) =>\n normalizeThemeSources(\n themeMap as Record<string, Theme & { sources: string[] }>\n )\n ),\n tap((themeMap) => {\n patchState(state, {\n themeMap: themeMap as Record<string, Theme>,\n });\n })\n );\n },\n init: rxMethod<void>(\n pipe(\n switchMap(() => themeDataService.fetchThemes()),\n map((map) =>\n normalizeThemeSources(\n map as Record<string, Theme & { sources: string[] }>\n )\n ),\n tap((map) =>\n patchState(state, { themeMap: map as Record<string, Theme> })\n ),\n switchMap((map) => {\n if (state.userAdopted()) return of(undefined);\n // The app's own declaration stands in for the OS auto-match, and\n // only for it — a name naming nothing falls through to the OS\n // rather than leaving the app unthemed.\n const declared = state.configDefault();\n const preferred = themeDetector.osTheme();\n const name =\n declared && map[declared]\n ? declared\n : preferred && map[preferred]\n ? preferred\n : Object.keys(map)[0];\n if (!name) return of(undefined);\n patchState(state, { selected: name });\n return fetchAndMergeTheme(name);\n }),\n tap((fullTheme: (Theme & { sources: string[] }) | undefined) => {\n if (fullTheme && fullTheme.name) {\n patchState(state, {\n themeMap: {\n ...state.themeMap(),\n [fullTheme.name]: fullTheme as Theme,\n },\n });\n if (fullTheme.color) {\n renderTheme(fullTheme.color as Record<string, string>);\n }\n patchState(state, { isReady: true });\n }\n })\n )\n ),\n };\n }\n ),\n withHooks((store) => {\n const themeDetector = inject(ThemeDetector);\n return {\n onInit() {\n themeDetector.onInit();\n\n store.init$().subscribe((map) => {\n if (!store.userAdopted()) {\n const declared = store.configDefault();\n const preferred = store.osTheme();\n const name =\n declared && map[declared]\n ? declared\n : preferred && map[preferred]\n ? preferred\n : Object.keys(map)[0];\n if (name) store.setTheme(name);\n }\n });\n },\n onDestroy() {\n themeDetector.onDestroy();\n },\n };\n })\n);\n","export type ColorPropertyType = 'color' | 'color-contrast' | 'color-opposite';\n\nexport function derivePropertyName(\n inputString: string,\n type: ColorPropertyType\n): string {\n const tagName = inputString.toLowerCase();\n\n const match = tagName.match(/^m(?:-one)?-(.+)$/);\n\n if (match) {\n const componentName = match[1];\n return `--m-${componentName}-${type}`;\n } else {\n return `--m-${type}`;\n }\n}\n\nexport function setProperty(\n element: HTMLElement,\n key: string,\n value: string | null\n) {\n element.style.setProperty(key, value);\n}\n\nexport function getProperty(element: HTMLElement, key: string) {\n return getComputedStyle(element).getPropertyValue(key);\n}\n","import { RgbColor, HslColor } from './types';\n\nexport function parseColor(color: string): RgbColor | null {\n const trimmedColor = color.trim();\n\n // Handle hex colors\n if (trimmedColor.startsWith('#')) {\n return hexToRgb(trimmedColor);\n }\n\n // Handle rgb() colors\n const rgbMatch = trimmedColor.match(\n /rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/\n );\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n };\n }\n\n // Handle rgba() colors (ignore alpha)\n const rgbaMatch = trimmedColor.match(\n /rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*[\\d.]+\\s*\\)/\n );\n if (rgbaMatch) {\n return {\n r: parseInt(rgbaMatch[1], 10),\n g: parseInt(rgbaMatch[2], 10),\n b: parseInt(rgbaMatch[3], 10),\n };\n }\n\n // Handle hsl() colors\n const hslMatch = trimmedColor.match(\n /hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/\n );\n if (hslMatch) {\n const hsl: HslColor = {\n h: parseInt(hslMatch[1], 10),\n s: parseInt(hslMatch[2], 10),\n l: parseInt(hslMatch[3], 10),\n };\n return hslToRgb(hsl);\n }\n\n return null;\n}\n\nexport function hexToRgb(hex: string): RgbColor | null {\n const cleanHex = hex.replace('#', '');\n\n if (cleanHex.length === 3) {\n // Short hex format (e.g., #fff)\n return {\n r: parseInt(cleanHex[0] + cleanHex[0], 16),\n g: parseInt(cleanHex[1] + cleanHex[1], 16),\n b: parseInt(cleanHex[2] + cleanHex[2], 16),\n };\n } else if (cleanHex.length === 6) {\n // Long hex format (e.g., #ffffff)\n return {\n r: parseInt(cleanHex.slice(0, 2), 16),\n g: parseInt(cleanHex.slice(2, 4), 16),\n b: parseInt(cleanHex.slice(4, 6), 16),\n };\n }\n\n return null;\n}\n\nexport function hslToRgb(hsl: HslColor): RgbColor {\n // Normalize HSL values - handle both integer (0-360, 0-100, 0-100) and float inputs\n const h = (hsl.h % 360) / 360; // Ensure hue is in 0-1 range\n const s = Math.max(0, Math.min(100, hsl.s)) / 100; // Clamp saturation to 0-100, then normalize\n const l = Math.max(0, Math.min(100, hsl.l)) / 100; // Clamp lightness to 0-100, then normalize\n\n const hue2rgb = (p: number, q: number, t: number): number => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return {\n r: Math.round(Math.max(0, Math.min(255, r * 255))),\n g: Math.round(Math.max(0, Math.min(255, g * 255))),\n b: Math.round(Math.max(0, Math.min(255, b * 255))),\n };\n}\n","import { RgbColor, HslColor } from './types';\n\nexport function rgbToHex(rgb: RgbColor): string {\n const toHex = (n: number) => {\n const hex = Math.round(Math.max(0, Math.min(255, n))).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;\n}\n\nexport function rgbToHsl(rgb: RgbColor): HslColor {\n const r = rgb.r / 255;\n const g = rgb.g / 255;\n const b = rgb.b / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return {\n h: h * 360,\n s: s * 100,\n l: l * 100,\n };\n}\n\nexport function calculateLuminance(rgb: RgbColor): number {\n // Convert to linear RGB\n const toLinear = (c: number): number => {\n const normalized = c / 255;\n return normalized <= 0.03928\n ? normalized / 12.92\n : Math.pow((normalized + 0.055) / 1.055, 2.4);\n };\n\n const r = toLinear(rgb.r);\n const g = toLinear(rgb.g);\n const b = toLinear(rgb.b);\n\n // Calculate relative luminance using WCAG formula\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n","import { parseColor } from './parsers';\nimport { rgbToHex, rgbToHsl, calculateLuminance } from './converters';\nimport { hslToRgb } from './parsers';\n\nexport function deriveContrastColor(color: string): string {\n try {\n // Input validation\n if (!color || color.trim() === '') {\n return '#ffffff'; // fallback to white for invalid input\n }\n\n const rgb = parseColor(color);\n if (!rgb) {\n return '#ffffff'; // fallback to white if parsing fails\n }\n\n // Validate RGB values\n if (\n rgb.r < 0 ||\n rgb.r > 255 ||\n rgb.g < 0 ||\n rgb.g > 255 ||\n rgb.b < 0 ||\n rgb.b > 255\n ) {\n return '#ffffff'; // fallback to white for invalid RGB values\n }\n\n // Calculate relative luminance using WCAG formula\n const luminance = calculateLuminance(rgb);\n\n // WCAG contrast ratio threshold: use white text on dark backgrounds, black on light\n return luminance > 0.5 ? '#000000' : '#ffffff';\n } catch (error) {\n console.warn('Error in deriveContrastColor:', error);\n return '#ffffff'; // fallback to white on error\n }\n}\n\nexport function deriveOppositeColor(color: string): string {\n try {\n // Input validation\n if (!color || color.trim() === '') {\n return color; // return original for invalid input\n }\n\n const rgb = parseColor(color);\n if (!rgb) {\n return color; // return original if parsing fails\n }\n\n // Validate RGB values\n if (\n rgb.r < 0 ||\n rgb.r > 255 ||\n rgb.g < 0 ||\n rgb.g > 255 ||\n rgb.b < 0 ||\n rgb.b > 255\n ) {\n return color; // return original if invalid RGB values\n }\n\n const hsl = rgbToHsl(rgb);\n\n // Rotate hue 180 degrees for complementary color\n // Handle the floating-point hue value properly\n const oppositeHsl = {\n h: (hsl.h + 180) % 360,\n s: hsl.s,\n l: hsl.l,\n };\n\n const oppositeRgb = hslToRgb(oppositeHsl);\n return rgbToHex(oppositeRgb);\n } catch (error) {\n console.warn('Error in deriveOppositeColor:', error);\n return color; // return original on error\n }\n}\n","import { ThemeColor } from '@magmonium/cli';\nimport {\n ColorPropertyType,\n derivePropertyName,\n} from '../../../functions/css/property-names';\nimport {\n deriveContrastColor,\n deriveOppositeColor,\n} from '../../../functions/color/operations';\n\nconst colorPalletMap = new Map();\n\nexport interface ColorPallet {\n color: string;\n contrastColor: string;\n oppositeColor: string;\n}\n\nexport function resolvePallet(\n currentColor: string | keyof ThemeColor,\n themeColors?: ThemeColor\n): ColorPallet {\n // An unset colour is `mm` *before* the theme lookup, not after: falling back\n // afterwards leaves the literal key `mm` as the resolved colour, which is not\n // a CSS colour — the element then keeps whatever it painted last, and picking\n // `default` in a colour dropdown reads as the change not landing.\n const key = (currentColor || 'mm') as keyof ThemeColor;\n let color = (themeColors?.[key] ?? key) as string;\n\n // Prepend # if it's a hex code without the hash\n if (/^[0-9a-fA-F]{3}$|^[0-9a-fA-F]{6}$/.test(color)) {\n color = `#${color}`;\n }\n\n const savedPallet = colorPalletMap.get(color);\n if (savedPallet) {\n return savedPallet;\n }\n const pallet = {\n color,\n contrastColor: deriveContrastColor(color),\n oppositeColor: deriveOppositeColor(color),\n };\n colorPalletMap.set(color, pallet);\n return pallet;\n}\n\nexport function applyColorsToElement(\n inputColor: keyof ThemeColor | string = 'mm',\n themeColors: ThemeColor | undefined,\n element: HTMLElement\n): ColorPallet | undefined {\n const pallet = resolvePallet(inputColor, themeColors),\n { color, contrastColor, oppositeColor } = pallet;\n \n const colorProp = derivePropertyName(element.tagName, 'color');\n const contrastProp = derivePropertyName(element.tagName, 'color-contrast');\n const oppositeProp = derivePropertyName(element.tagName, 'color-opposite');\n\n element.style.setProperty(colorProp, color);\n element.style.setProperty(contrastProp, contrastColor);\n element.style.setProperty(oppositeProp, oppositeColor);\n\n return pallet;\n}\n\nexport function addColorProperty(\n key: ColorPropertyType,\n value: string,\n element: HTMLElement\n): void {\n const inputString = element.tagName;\n element.style.setProperty(derivePropertyName(inputString, key), value);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"magmonium-one-directives-B93p5bAL.mjs","names":[],"sources":["../../../../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","../../../../libs/one/src/lib/shared/directives/spacing/spacing.ts"],"sourcesContent":["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, [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","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"],"mappings":"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"}