@magmonium/one 0.4.40 → 0.4.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/assets/fields/app_color.json +5 -0
  2. package/assets/fields/logo_glyph_paste.json +7 -0
  3. package/assets/fields/logo_glyph_upload.json +12 -0
  4. package/assets/forms/logo_glyph_input.json +13 -0
  5. package/assets/i18n/ar.json +8 -0
  6. package/assets/i18n/de.json +8 -0
  7. package/assets/i18n/en.json +8 -0
  8. package/assets/i18n/es.json +8 -0
  9. package/assets/i18n/fr.json +8 -0
  10. package/assets/i18n/hi.json +8 -0
  11. package/assets/i18n/it.json +8 -0
  12. package/assets/i18n/ja.json +8 -0
  13. package/assets/i18n/ko.json +8 -0
  14. package/assets/i18n/nl.json +8 -0
  15. package/assets/i18n/pl.json +8 -0
  16. package/assets/i18n/pt.json +8 -0
  17. package/assets/i18n/ru.json +8 -0
  18. package/assets/i18n/tr.json +8 -0
  19. package/assets/i18n/zh.json +8 -0
  20. package/assets/index.json +1 -1
  21. package/fesm2022/{magmonium-one-base-dropdown-DU4B4w7c.mjs → magmonium-one-base-dropdown-CcZ0lBQv.mjs} +3 -3
  22. package/fesm2022/{magmonium-one-base-dropdown-DU4B4w7c.mjs.map → magmonium-one-base-dropdown-CcZ0lBQv.mjs.map} +1 -1
  23. package/fesm2022/{magmonium-one-button-BWB3ZKIj.mjs → magmonium-one-button-BZQOf-Pm.mjs} +6 -4
  24. package/fesm2022/{magmonium-one-button-BWB3ZKIj.mjs.map → magmonium-one-button-BZQOf-Pm.mjs.map} +1 -1
  25. package/fesm2022/{magmonium-one-group-m41SX_fL.mjs → magmonium-one-group-Dl2bp-y-.mjs} +4 -4
  26. package/fesm2022/{magmonium-one-group-m41SX_fL.mjs.map → magmonium-one-group-Dl2bp-y-.mjs.map} +1 -1
  27. package/fesm2022/{magmonium-one-header-D8CB9CBJ.mjs → magmonium-one-header-DhK9NuZW.mjs} +5 -4
  28. package/fesm2022/{magmonium-one-header-D8CB9CBJ.mjs.map → magmonium-one-header-DhK9NuZW.mjs.map} +1 -1
  29. package/fesm2022/{magmonium-one-icon-BTPHGpEN.mjs → magmonium-one-icon-BgbtOdMv.mjs} +229 -6
  30. package/fesm2022/magmonium-one-icon-BgbtOdMv.mjs.map +1 -0
  31. package/fesm2022/{magmonium-one-image-editor-Dn0ACfH0.mjs → magmonium-one-image-editor-oGxg59hV.mjs} +3 -3
  32. package/fesm2022/{magmonium-one-image-editor-Dn0ACfH0.mjs.map → magmonium-one-image-editor-oGxg59hV.mjs.map} +1 -1
  33. package/fesm2022/{magmonium-one-menu-EIfPlZ4E.mjs → magmonium-one-menu-bI7lVUYI.mjs} +5 -4
  34. package/fesm2022/{magmonium-one-menu-EIfPlZ4E.mjs.map → magmonium-one-menu-bI7lVUYI.mjs.map} +1 -1
  35. package/fesm2022/{magmonium-one-password-BjqYmT1s.mjs → magmonium-one-password-BIs_YxJ5.mjs} +2 -2
  36. package/fesm2022/{magmonium-one-password-BjqYmT1s.mjs.map → magmonium-one-password-BIs_YxJ5.mjs.map} +1 -1
  37. package/fesm2022/{magmonium-one-text-BL-1lWST.mjs → magmonium-one-text-BvXdAX0i.mjs} +4 -3
  38. package/fesm2022/{magmonium-one-text-BL-1lWST.mjs.map → magmonium-one-text-BvXdAX0i.mjs.map} +1 -1
  39. package/fesm2022/magmonium-one.mjs +627 -144
  40. package/fesm2022/magmonium-one.mjs.map +1 -1
  41. package/package.json +1 -1
  42. package/types/magmonium-one.d.ts +283 -31
  43. package/fesm2022/magmonium-one-icon-BTPHGpEN.mjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magmonium/one",
3
- "version": "0.4.40",
3
+ "version": "0.4.42",
4
4
  "description": "Magmonium One — Angular design-system primitives for mm Apps",
5
5
  "author": "magmonium",
6
6
  "license": "MIT",
@@ -747,15 +747,15 @@ export interface RemoteSelectorConfig {
747
747
  prefix?: string;
748
748
  separator?: string;
749
749
  }
750
+ /**
751
+ * A WC app's runtime wiring. Never its name, description, AppLogo or App
752
+ * Color — those are the Store App's (nx ADR 0007, `AppIdentity`).
753
+ */
750
754
  export interface WebComponentConfig {
751
755
  selector?: string;
752
756
  app: string;
753
- /** What the app is called, from Store's App — `app` is its link. */
754
- name?: string;
755
757
  version: string;
756
- company?: string;
757
758
  timestamp?: string;
758
- logo?: string;
759
759
  inputs?: string[];
760
760
  outputs?: string[];
761
761
  autoRegister?: boolean;
@@ -2575,6 +2575,104 @@ export declare abstract class ResizeElementComponent<T extends Config> extends C
2575
2575
  static ɵfac: i0.ɵɵFactoryDeclaration<ResizeElementComponent<any>, never>;
2576
2576
  static ɵcmp: i0.ɵɵComponentDeclaration<ResizeElementComponent<any>, "ng-component", never, {}, {}, never, never, true, never>;
2577
2577
  }
2578
+ /**
2579
+ * LogoGlyph rules (nx ADR 0007) — the same allowlist rebuild api runs on
2580
+ * save, so the editor refuses what api would refuse before anything is sent.
2581
+ * api's rebuild is the rule; this one is the early answer.
2582
+ */
2583
+ /** The size bound on a LogoGlyph's markup, in UTF-8 bytes. */
2584
+ export declare const LOGO_GLYPH_MAX_BYTES: number;
2585
+ /** Why a glyph was refused — the codes api answers with. */
2586
+ export type LogoGlyphError = '' | 'logo_invalid' | 'logo_too_large';
2587
+ /**
2588
+ * A rebuilt glyph. Flat rather than a union: the wc build does not narrow
2589
+ * discriminated unions. `error` is empty on success, `svg` empty on refusal.
2590
+ */
2591
+ export type LogoGlyphResult = {
2592
+ svg: string;
2593
+ error: LogoGlyphError;
2594
+ };
2595
+ /**
2596
+ * The LogoGlyph as it will be stored: shape elements, their geometry and
2597
+ * on/off paint inside a fresh `<svg>` root. Refuses `logo_too_large` over
2598
+ * the size bound and `logo_invalid` for anything not a drawable SVG.
2599
+ */
2600
+ export declare function rebuildLogoGlyph(markup: string): LogoGlyphResult;
2601
+ /** App Color as stored: `#rrggbb`, lowercased — or undefined when it is not one. */
2602
+ export declare const normalizeAppColor: (value: string) => string | undefined;
2603
+ /** The AppLogo's shadow: App Color mixed with 20% black. */
2604
+ export declare const appLogoShadowColor: (color: string) => string;
2605
+ /**
2606
+ * Whether a white glyph reads poorly over this App Color: contrast under 3:1,
2607
+ * the WCAG floor for graphical objects. A warning, never a refusal.
2608
+ */
2609
+ export declare const isLightAppColor: (color: string) => boolean;
2610
+ /** A LogoGlyph as a CSS `url(...)`, for painting it through a mask. */
2611
+ export declare const logoGlyphMaskUrl: (svg: string) => string;
2612
+ /**
2613
+ * What a Store App says about itself (nx ADR 0007), as `GET
2614
+ * store/v1/identity/<link>` answers it. The one source of an app's name,
2615
+ * description, AppLogo and App Color — never a WebComponentConfig.
2616
+ */
2617
+ export type AppIdentity = {
2618
+ id: string;
2619
+ link: string;
2620
+ name: string;
2621
+ description: string | null;
2622
+ /** The LogoGlyph, rebuilt from the shape allowlist; null until the Owner sets one. */
2623
+ logoGlyph: string | null;
2624
+ /** App Color, `#rrggbb`; null until the Owner sets one. */
2625
+ appColor: string | null;
2626
+ /** Availability `open` — AppLogo optional, never released as a PWA. */
2627
+ open: boolean;
2628
+ };
2629
+ /**
2630
+ * Reads App Identity from Store — the one read every surface shares (host
2631
+ * nav, a standalone app's chrome, store cards that hold only a link). One
2632
+ * request per link per session; a failed read is not cached, so the next
2633
+ * ask retries.
2634
+ */
2635
+ export declare class AppIdentityService {
2636
+ #private;
2637
+ readonly identity: (link: string) => Observable<AppIdentity | undefined>;
2638
+ /** Drops a link's held read, after its Owner changed it. */
2639
+ readonly forget: (link: string) => void;
2640
+ static ɵfac: i0.ɵɵFactoryDeclaration<AppIdentityService, never>;
2641
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
2642
+ }
2643
+ /**
2644
+ * The reserved icon name that draws the running app's own AppLogo as a glyph
2645
+ * (GLOSSARY.md AppLogoIcon). Never an IconAsset or a file in `icons/`: `m-icon`
2646
+ * reads it from APP_LOGO_SOURCE instead of fetching anything. Its own file so
2647
+ * codegen can read it without Angular.
2648
+ */
2649
+ export declare const APP_LOGO_ICON = "app_logo";
2650
+ /**
2651
+ * The running app's AppLogo as an icon draws it. `glyph` is a Store App's
2652
+ * LogoGlyph (already rebuilt from the allowlist); `src` is the host's
2653
+ * file-based AppLogo; neither is the first letter of `name`.
2654
+ */
2655
+ export type AppLogoSource = {
2656
+ glyph?: string | null;
2657
+ src?: string;
2658
+ name?: string | null;
2659
+ };
2660
+ /**
2661
+ * Where NavStore publishes the running app's AppLogo. Shared rather than read
2662
+ * off NavStore because `m-icon` sits below features and cannot import it.
2663
+ */
2664
+ export declare class AppLogoState {
2665
+ #private;
2666
+ readonly source: Signal<AppLogoSource | undefined>;
2667
+ readonly set: (source: AppLogoSource | undefined) => void;
2668
+ static ɵfac: i0.ɵɵFactoryDeclaration<AppLogoState, never>;
2669
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
2670
+ }
2671
+ /**
2672
+ * What `m-icon name="app_logo"` draws. Defaults to what NavStore published; a
2673
+ * visual editor provides its own so the Canvas shows the AppTarget's logo.
2674
+ */
2675
+ export declare const APP_LOGO_SOURCE: InjectionToken<Signal<AppLogoSource | undefined>>;
2578
2676
  type ButtonBadge = {
2579
2677
  count?: number;
2580
2678
  variant?: 'default' | 'primary' | 'danger';
@@ -2822,16 +2920,19 @@ type CustomIconEdit = {
2822
2920
  linecap: 'butt' | 'round' | 'square';
2823
2921
  linejoin: 'miter' | 'round' | 'bevel';
2824
2922
  };
2825
- type Icon = Partial<Config>;
2923
+ type Icon = Partial<Config> & {
2924
+ shadow?: boolean;
2925
+ };
2826
2926
  export declare class IconComponent {
2827
- config: import("@angular/core").ModelSignal<Partial<import("@magmonium/one").Config> | undefined>;
2927
+ config: import("@angular/core").ModelSignal<Icon | undefined>;
2828
2928
  readonly name: import("@angular/core").InputSignal<string | undefined>;
2829
2929
  readonly color: import("@angular/core").InputSignal<string | undefined>;
2830
2930
  readonly size: import("@angular/core").InputSignal<string | number | undefined>;
2831
2931
  readonly one: import("@angular/core").InputSignal<boolean | undefined>;
2832
2932
  readonly baseUrl: import("@angular/core").InputSignal<string | undefined>;
2833
2933
  readonly remote: import("@angular/core").InputSignal<string | undefined>;
2834
- protected readonly resolvedConfig: import("@angular/core").Signal<Partial<import("@magmonium/one").Config> | undefined>;
2934
+ readonly shadow: import("@angular/core").InputSignalWithTransform<boolean | undefined, unknown>;
2935
+ protected readonly resolvedConfig: import("@angular/core").Signal<Icon | undefined>;
2835
2936
  private readonly elementRef;
2836
2937
  private readonly sizeContext;
2837
2938
  private readonly assetStore;
@@ -2842,9 +2943,12 @@ export declare class IconComponent {
2842
2943
  private readonly remoteBaseUrl;
2843
2944
  private readonly iconSource;
2844
2945
  private readonly inlineSvg;
2946
+ private readonly appLogoSource;
2947
+ private readonly appLogo;
2845
2948
  private readonly text;
2846
2949
  private readonly pallet;
2847
2950
  constructor();
2951
+ private readonly applyShadow;
2848
2952
  private readonly applySize;
2849
2953
  private readonly updateElement;
2850
2954
  static ɵfac: i0.ɵɵFactoryDeclaration<IconComponent, never>;
@@ -2884,6 +2988,11 @@ export declare class IconComponent {
2884
2988
  "required": false;
2885
2989
  "isSignal": true;
2886
2990
  };
2991
+ "shadow": {
2992
+ "alias": "shadow";
2993
+ "required": false;
2994
+ "isSignal": true;
2995
+ };
2887
2996
  }, {
2888
2997
  "config": "configChange";
2889
2998
  }, never, ["*"], true, never>;
@@ -10588,7 +10697,7 @@ export declare class SortComponent extends ConfigComponent<Sort> {
10588
10697
  protected readonly currentSortLabel: import("@angular/core").Signal<string>;
10589
10698
  protected readonly remainingOptions: import("@angular/core").Signal<import("@magmonium/one").SortOption[]>;
10590
10699
  readonly toggleButtonConfig: import("@angular/core").Signal<Button>;
10591
- readonly menuIconConfig: import("@angular/core").Signal<Partial<Partial<import("@magmonium/one").Config>>>;
10700
+ readonly menuIconConfig: import("@angular/core").Signal<Partial<Icon>>;
10592
10701
  readonly menuItems: import("@angular/core").Signal<MenuItem[][]>;
10593
10702
  readonly menuSelectorConfig: import("@angular/core").Signal<SelectorConfig<ContextMenuBoxComponent>>;
10594
10703
  readonly selectOption: (value: string) => void;
@@ -11943,20 +12052,20 @@ export declare class ScrollComponent implements OnDestroy {
11943
12052
  }
11944
12053
  type AppCardVariant = 'small' | 'row' | 'card' | 'tile';
11945
12054
  /**
11946
- * Deployed app-wc.json manifest. Card consumes only: name, description,
11947
- * company, version, logo, pwa.color (-> AppCardData.accentColor) and
11948
- * timestamp (-> AppCardData.lastUpdated). Remaining fields ignored.
12055
+ * Deployed app-wc.json manifest. Card consumes only version and timestamp
12056
+ * (-> AppCardData.lastUpdated) — never identity, which is the Store App's
12057
+ * (nx ADR 0007).
11949
12058
  */
11950
- interface AppManifest extends WebComponentConfig$1 {
11951
- pwa?: {
11952
- color?: string;
11953
- };
11954
- }
12059
+ type AppManifest = WebComponentConfig$1;
11955
12060
  interface AppCardData {
11956
12061
  id: string;
11957
12062
  name: string;
11958
- iconUrl?: string;
11959
- remote?: string;
12063
+ /** The app's AppLink. */
12064
+ link?: string;
12065
+ /** The Store App's LogoGlyph; the AppLogo draws a letter without one. */
12066
+ logoGlyph?: string | null;
12067
+ /** The Store App's App Color — the AppLogo's ground and the card's accent. */
12068
+ appColor?: string | null;
11960
12069
  notificationsCount?: number;
11961
12070
  lastUsed?: number;
11962
12071
  latestNotification?: string;
@@ -11968,9 +12077,6 @@ interface AppCardData {
11968
12077
  statusLabel?: string;
11969
12078
  created?: string;
11970
12079
  version?: string;
11971
- company?: string;
11972
- /** Accent tint sourced from deployed manifest pwa.color. */
11973
- accentColor?: string;
11974
12080
  /** Deployed build time sourced from manifest timestamp. */
11975
12081
  lastUpdated?: string;
11976
12082
  }
@@ -12029,6 +12135,109 @@ export declare class AppCardComponent {
12029
12135
  "actionClick": "actionClick";
12030
12136
  }, never, never, true, never>;
12031
12137
  }
12138
+ /**
12139
+ * The one renderer of an AppLogo (nx ADR 0007): the LogoGlyph painted white
12140
+ * over App Color, with a shadow in App Color mixed with 20% black. The glyph
12141
+ * is a mask, never inserted markup — its own colours never show and nothing
12142
+ * in it can run. Without a glyph it draws the name's first letter instead.
12143
+ * Fills its box; the caller sizes the host.
12144
+ */
12145
+ export declare class AppLogoComponent {
12146
+ /** The LogoGlyph as Store holds it — already rebuilt from the allowlist. */
12147
+ readonly glyph: import("@angular/core").InputSignal<string | null | undefined>;
12148
+ /** App Color, `#rrggbb`. A neutral ground when unset. */
12149
+ readonly appColor: import("@angular/core").InputSignal<string | null | undefined>;
12150
+ /** The app's name (or AppLink): the accessible label and the letter fallback. */
12151
+ readonly name: import("@angular/core").InputSignal<string | null | undefined>;
12152
+ protected readonly color: import("@angular/core").Signal<string | null>;
12153
+ protected readonly shadow: import("@angular/core").Signal<string | null>;
12154
+ protected readonly mask: import("@angular/core").Signal<string | undefined>;
12155
+ protected readonly letter: import("@angular/core").Signal<string>;
12156
+ static ɵfac: i0.ɵɵFactoryDeclaration<AppLogoComponent, never>;
12157
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppLogoComponent, "m-app-logo", never, {
12158
+ "glyph": {
12159
+ "alias": "glyph";
12160
+ "required": false;
12161
+ "isSignal": true;
12162
+ };
12163
+ "appColor": {
12164
+ "alias": "appColor";
12165
+ "required": false;
12166
+ "isSignal": true;
12167
+ };
12168
+ "name": {
12169
+ "alias": "name";
12170
+ "required": false;
12171
+ "isSignal": true;
12172
+ };
12173
+ }, {}, never, never, true, never>;
12174
+ }
12175
+ /**
12176
+ * Where an Owner sets a LogoGlyph and App Color (libs/one GLOSSARY
12177
+ * LogoGlyphInput): an SVG uploaded or pasted, rebuilt from the shape
12178
+ * allowlist before it is kept, and a colour — picked, or one of the
12179
+ * suggestions a host offers. Previewed live as the AppLogo it becomes. A
12180
+ * host's AI panel rides the `[logoAi]` slot and writes through the same two
12181
+ * models. Nothing here saves: the host decides when.
12182
+ */
12183
+ export declare class LogoGlyphInputComponent {
12184
+ /** The kept LogoGlyph — only ever a rebuilt one. */
12185
+ readonly glyph: import("@angular/core").ModelSignal<string | null>;
12186
+ /** The kept App Color, `#rrggbb`. */
12187
+ readonly appColor: import("@angular/core").ModelSignal<string | null>;
12188
+ /** The app's name: the preview's label and its letter fallback. */
12189
+ readonly name: import("@angular/core").InputSignal<string | null | undefined>;
12190
+ /** Colours a host suggests (an AI's ten); picking one sets App Color. */
12191
+ readonly suggestedColors: import("@angular/core").InputSignal<readonly string[]>;
12192
+ readonly disabled: import("@angular/core").InputSignal<boolean>;
12193
+ /** What was pasted or uploaded, as typed — kept even while it is refused. */
12194
+ protected readonly markup: import("@angular/core").WritableSignal<string>;
12195
+ protected readonly error: import("@angular/core").WritableSignal<LogoGlyphError>;
12196
+ protected readonly errorKey: import("@angular/core").Signal<string | undefined>;
12197
+ protected readonly lightColor: import("@angular/core").Signal<boolean>;
12198
+ protected readonly suggestions: import("@angular/core").Signal<string[]>;
12199
+ /** The form's fields: upload and paste both feed `take`, the colour picker App Color. */
12200
+ protected readonly formData: import("@angular/core").Signal<{
12201
+ logo_glyph_paste: string;
12202
+ app_color: string;
12203
+ }>;
12204
+ private lastUpload;
12205
+ /** Takes markup from any path: kept when it rebuilds, told why when not. */
12206
+ readonly take: (markup: string) => void;
12207
+ protected readonly onForm: (data: Record<string, unknown>) => void;
12208
+ protected readonly pickSuggestion: (color: string) => void;
12209
+ static ɵfac: i0.ɵɵFactoryDeclaration<LogoGlyphInputComponent, never>;
12210
+ static ɵcmp: i0.ɵɵComponentDeclaration<LogoGlyphInputComponent, "m-logo-glyph-input", never, {
12211
+ "glyph": {
12212
+ "alias": "glyph";
12213
+ "required": false;
12214
+ "isSignal": true;
12215
+ };
12216
+ "appColor": {
12217
+ "alias": "appColor";
12218
+ "required": false;
12219
+ "isSignal": true;
12220
+ };
12221
+ "name": {
12222
+ "alias": "name";
12223
+ "required": false;
12224
+ "isSignal": true;
12225
+ };
12226
+ "suggestedColors": {
12227
+ "alias": "suggestedColors";
12228
+ "required": false;
12229
+ "isSignal": true;
12230
+ };
12231
+ "disabled": {
12232
+ "alias": "disabled";
12233
+ "required": false;
12234
+ "isSignal": true;
12235
+ };
12236
+ }, {
12237
+ "glyph": "glyphChange";
12238
+ "appColor": "appColorChange";
12239
+ }, never, ["[logoAi]"], true, never>;
12240
+ }
12032
12241
  export declare class PlaygroundComponent {
12033
12242
  config: import("@angular/core").InputSignal<unknown>;
12034
12243
  copied: import("@angular/core").WritableSignal<boolean>;
@@ -13140,6 +13349,7 @@ export declare class FrameComponent {
13140
13349
  remoteWidgets: import("@angular/core").Signal<Record<string, NavWidgetRegistryEntry>>;
13141
13350
  navMap: import("@angular/core").Signal<import("@magmonium/one").NavMap>;
13142
13351
  wcConfigMap: import("@angular/core").Signal<Record<string, import("dist/libs/cli/src").WebComponentConfig>>;
13352
+ identityMap: import("@angular/core").Signal<Record<string, import("@magmonium/one").AppIdentity>>;
13143
13353
  navLoading: import("@angular/core").Signal<boolean>;
13144
13354
  visibilityAnswers: import("@angular/core").Signal<Record<string, boolean>>;
13145
13355
  navigationEnd: import("@angular/core").Signal<import("@angular/router").RouterStateSnapshot>;
@@ -13174,6 +13384,8 @@ export declare class FrameComponent {
13174
13384
  navMenus: import("@angular/core").Signal<import("@magmonium/one").BreadcrumbTrail[]>;
13175
13385
  navHasContent: import("@angular/core").Signal<boolean>;
13176
13386
  currentWcConfig: import("@angular/core").Signal<import("dist/libs/cli/src").WebComponentConfig | undefined>;
13387
+ currentIdentity: import("@angular/core").Signal<import("@magmonium/one").AppIdentity | undefined>;
13388
+ appLogo: import("@angular/core").Signal<import("@magmonium/one").AppLogoSource | undefined>;
13177
13389
  activeAppOpen: import("@angular/core").Signal<boolean>;
13178
13390
  transparentNavIds: import("@angular/core").Signal<ReadonlySet<string>>;
13179
13391
  resolvedNavMenuConfig: import("@angular/core").Signal<import("@magmonium/one").NavMenuConfig | null>;
@@ -13220,6 +13432,8 @@ export declare class FrameComponent {
13220
13432
  mountOf: (navId: string) => import("@magmonium/one").RemoteMount | undefined;
13221
13433
  setWcConfig: (appLink: string, config: import("dist/libs/cli/src").WebComponentConfig) => void;
13222
13434
  loadWcConfig: import("@ngrx/signals/rxjs-interop").RxMethod<string | undefined>;
13435
+ setIdentity: (identity: import("@magmonium/one").AppIdentity) => void;
13436
+ loadIdentity: import("@ngrx/signals/rxjs-interop").RxMethod<string | undefined>;
13223
13437
  loadNav: import("@ngrx/signals/rxjs-interop").RxMethod<{
13224
13438
  navId: string;
13225
13439
  appNavId: string | undefined;
@@ -13265,6 +13479,7 @@ export declare class FrameComponent {
13265
13479
  remoteWidgets: Record<string, NavWidgetRegistryEntry>;
13266
13480
  navMap: import("@magmonium/one").NavMap;
13267
13481
  wcConfigMap: Record<string, import("dist/libs/cli/src").WebComponentConfig>;
13482
+ identityMap: Record<string, import("@magmonium/one").AppIdentity>;
13268
13483
  navLoading: boolean;
13269
13484
  visibilityAnswers: Record<string, boolean>;
13270
13485
  }>;
@@ -13485,6 +13700,11 @@ interface NavState {
13485
13700
  */
13486
13701
  navMap: NavMap;
13487
13702
  wcConfigMap: Record<string, WebComponentConfig$1>;
13703
+ /**
13704
+ * Each app's name, AppLogo and App Color as Store holds them (nx ADR 0007),
13705
+ * keyed by AppLink — the chrome's only source of an app's identity.
13706
+ */
13707
+ identityMap: Record<string, AppIdentity>;
13488
13708
  navLoading: boolean;
13489
13709
  /**
13490
13710
  * What an **async** NavVisibilityConfig answered, keyed by NavId and the
@@ -13550,6 +13770,7 @@ export declare const NavStore: import("@angular/core").Type<{
13550
13770
  remoteWidgets: Signal<Record<string, NavWidgetRegistryEntry>>;
13551
13771
  navMap: Signal<NavMap>;
13552
13772
  wcConfigMap: Signal<Record<string, WebComponentConfig$1>>;
13773
+ identityMap: Signal<Record<string, AppIdentity>>;
13553
13774
  navLoading: Signal<boolean>;
13554
13775
  visibilityAnswers: Signal<Record<string, boolean>>;
13555
13776
  navigationEnd: Signal<RouterStateSnapshot>;
@@ -13584,6 +13805,8 @@ export declare const NavStore: import("@angular/core").Type<{
13584
13805
  navMenus: Signal<import("@magmonium/one").BreadcrumbTrail[]>;
13585
13806
  navHasContent: Signal<boolean>;
13586
13807
  currentWcConfig: Signal<WebComponentConfig$1 | undefined>;
13808
+ currentIdentity: Signal<AppIdentity | undefined>;
13809
+ appLogo: Signal<AppLogoSource | undefined>;
13587
13810
  activeAppOpen: Signal<boolean>;
13588
13811
  transparentNavIds: Signal<ReadonlySet<string>>;
13589
13812
  resolvedNavMenuConfig: Signal<NavMenuConfig | null>;
@@ -13630,6 +13853,8 @@ export declare const NavStore: import("@angular/core").Type<{
13630
13853
  mountOf: (navId: string) => RemoteMount | undefined;
13631
13854
  setWcConfig: (appLink: string, config: WebComponentConfig$1) => void;
13632
13855
  loadWcConfig: import("@ngrx/signals/rxjs-interop").RxMethod<string | undefined>;
13856
+ setIdentity: (identity: AppIdentity) => void;
13857
+ loadIdentity: import("@ngrx/signals/rxjs-interop").RxMethod<string | undefined>;
13633
13858
  loadNav: import("@ngrx/signals/rxjs-interop").RxMethod<{
13634
13859
  navId: string;
13635
13860
  appNavId: string | undefined;
@@ -13675,6 +13900,7 @@ export declare const NavStore: import("@angular/core").Type<{
13675
13900
  remoteWidgets: Record<string, NavWidgetRegistryEntry>;
13676
13901
  navMap: NavMap;
13677
13902
  wcConfigMap: Record<string, WebComponentConfig$1>;
13903
+ identityMap: Record<string, AppIdentity>;
13678
13904
  navLoading: boolean;
13679
13905
  visibilityAnswers: Record<string, boolean>;
13680
13906
  }>>;
@@ -13925,14 +14151,23 @@ export declare class NavComponent {
13925
14151
  /** An Open App draws as part of the host: the host's logo, no apps button. */
13926
14152
  protected activeAppOpen: import("@angular/core").Signal<boolean>;
13927
14153
  protected logoPending: import("@angular/core").Signal<boolean>;
14154
+ /**
14155
+ * A WC app's AppLogo is drawn from its Store identity (nx ADR 0007) — its
14156
+ * first letter until the identity arrives or while it has no LogoGlyph. The
14157
+ * host, which is not a Store App, keeps its file-based AppLogo.
14158
+ */
13928
14159
  protected logo: import("@angular/core").Signal<{
13929
- src: string;
13930
- alt: string;
13931
14160
  app: string;
13932
- } | {
13933
- src: string;
13934
14161
  alt: string;
14162
+ glyph: string | null;
14163
+ color: string | null;
14164
+ src: undefined;
14165
+ } | {
13935
14166
  app: undefined;
14167
+ alt: string;
14168
+ glyph: null;
14169
+ color: null;
14170
+ src: string;
13936
14171
  } | undefined>;
13937
14172
  /**
13938
14173
  * The App Rail below the AppLogo (GLOSSARY.md App Rail): the Main Slot's App,
@@ -13943,8 +14178,8 @@ export declare class NavComponent {
13943
14178
  key: string;
13944
14179
  appNavId: string;
13945
14180
  pending: boolean;
13946
- src: string | undefined;
13947
- remote: string | undefined;
14181
+ glyph: string | null;
14182
+ color: string | null;
13948
14183
  alt: string;
13949
14184
  active: boolean;
13950
14185
  }[]>;
@@ -14025,6 +14260,7 @@ export declare class NavDetailsComponent {
14025
14260
  remoteWidgets: import("@angular/core").Signal<Record<string, NavWidgetRegistryEntry>>;
14026
14261
  navMap: import("@angular/core").Signal<import("@magmonium/one").NavMap>;
14027
14262
  wcConfigMap: import("@angular/core").Signal<Record<string, import("dist/libs/cli/src").WebComponentConfig>>;
14263
+ identityMap: import("@angular/core").Signal<Record<string, import("@magmonium/one").AppIdentity>>;
14028
14264
  navLoading: import("@angular/core").Signal<boolean>;
14029
14265
  visibilityAnswers: import("@angular/core").Signal<Record<string, boolean>>;
14030
14266
  navigationEnd: import("@angular/core").Signal<import("@angular/router").RouterStateSnapshot>;
@@ -14059,6 +14295,8 @@ export declare class NavDetailsComponent {
14059
14295
  navMenus: import("@angular/core").Signal<import("@magmonium/one").BreadcrumbTrail[]>;
14060
14296
  navHasContent: import("@angular/core").Signal<boolean>;
14061
14297
  currentWcConfig: import("@angular/core").Signal<import("dist/libs/cli/src").WebComponentConfig | undefined>;
14298
+ currentIdentity: import("@angular/core").Signal<import("@magmonium/one").AppIdentity | undefined>;
14299
+ appLogo: import("@angular/core").Signal<import("@magmonium/one").AppLogoSource | undefined>;
14062
14300
  activeAppOpen: import("@angular/core").Signal<boolean>;
14063
14301
  transparentNavIds: import("@angular/core").Signal<ReadonlySet<string>>;
14064
14302
  resolvedNavMenuConfig: import("@angular/core").Signal<import("@magmonium/one").NavMenuConfig | null>;
@@ -14105,6 +14343,8 @@ export declare class NavDetailsComponent {
14105
14343
  mountOf: (navId: string) => import("@magmonium/one").RemoteMount | undefined;
14106
14344
  setWcConfig: (appLink: string, config: import("dist/libs/cli/src").WebComponentConfig) => void;
14107
14345
  loadWcConfig: import("@ngrx/signals/rxjs-interop").RxMethod<string | undefined>;
14346
+ setIdentity: (identity: import("@magmonium/one").AppIdentity) => void;
14347
+ loadIdentity: import("@ngrx/signals/rxjs-interop").RxMethod<string | undefined>;
14108
14348
  loadNav: import("@ngrx/signals/rxjs-interop").RxMethod<{
14109
14349
  navId: string;
14110
14350
  appNavId: string | undefined;
@@ -14150,6 +14390,7 @@ export declare class NavDetailsComponent {
14150
14390
  remoteWidgets: Record<string, NavWidgetRegistryEntry>;
14151
14391
  navMap: import("@magmonium/one").NavMap;
14152
14392
  wcConfigMap: Record<string, import("dist/libs/cli/src").WebComponentConfig>;
14393
+ identityMap: Record<string, import("@magmonium/one").AppIdentity>;
14153
14394
  navLoading: boolean;
14154
14395
  visibilityAnswers: Record<string, boolean>;
14155
14396
  }>;
@@ -14278,6 +14519,7 @@ export declare class NavHeaderComponent {
14278
14519
  remoteWidgets: import("@angular/core").Signal<Record<string, NavWidgetRegistryEntry>>;
14279
14520
  navMap: import("@angular/core").Signal<import("@magmonium/one").NavMap>;
14280
14521
  wcConfigMap: import("@angular/core").Signal<Record<string, import("dist/libs/cli/src").WebComponentConfig>>;
14522
+ identityMap: import("@angular/core").Signal<Record<string, import("@magmonium/one").AppIdentity>>;
14281
14523
  navLoading: import("@angular/core").Signal<boolean>;
14282
14524
  visibilityAnswers: import("@angular/core").Signal<Record<string, boolean>>;
14283
14525
  navigationEnd: import("@angular/core").Signal<import("@angular/router").RouterStateSnapshot>;
@@ -14312,6 +14554,8 @@ export declare class NavHeaderComponent {
14312
14554
  navMenus: import("@angular/core").Signal<import("@magmonium/one").BreadcrumbTrail[]>;
14313
14555
  navHasContent: import("@angular/core").Signal<boolean>;
14314
14556
  currentWcConfig: import("@angular/core").Signal<import("dist/libs/cli/src").WebComponentConfig | undefined>;
14557
+ currentIdentity: import("@angular/core").Signal<import("@magmonium/one").AppIdentity | undefined>;
14558
+ appLogo: import("@angular/core").Signal<import("@magmonium/one").AppLogoSource | undefined>;
14315
14559
  activeAppOpen: import("@angular/core").Signal<boolean>;
14316
14560
  transparentNavIds: import("@angular/core").Signal<ReadonlySet<string>>;
14317
14561
  resolvedNavMenuConfig: import("@angular/core").Signal<import("@magmonium/one").NavMenuConfig | null>;
@@ -14358,6 +14602,8 @@ export declare class NavHeaderComponent {
14358
14602
  mountOf: (navId: string) => import("@magmonium/one").RemoteMount | undefined;
14359
14603
  setWcConfig: (appLink: string, config: import("dist/libs/cli/src").WebComponentConfig) => void;
14360
14604
  loadWcConfig: import("@ngrx/signals/rxjs-interop").RxMethod<string | undefined>;
14605
+ setIdentity: (identity: import("@magmonium/one").AppIdentity) => void;
14606
+ loadIdentity: import("@ngrx/signals/rxjs-interop").RxMethod<string | undefined>;
14361
14607
  loadNav: import("@ngrx/signals/rxjs-interop").RxMethod<{
14362
14608
  navId: string;
14363
14609
  appNavId: string | undefined;
@@ -14403,6 +14649,7 @@ export declare class NavHeaderComponent {
14403
14649
  remoteWidgets: Record<string, NavWidgetRegistryEntry>;
14404
14650
  navMap: import("@magmonium/one").NavMap;
14405
14651
  wcConfigMap: Record<string, import("dist/libs/cli/src").WebComponentConfig>;
14652
+ identityMap: Record<string, import("@magmonium/one").AppIdentity>;
14406
14653
  navLoading: boolean;
14407
14654
  visibilityAnswers: Record<string, boolean>;
14408
14655
  }>;
@@ -14447,6 +14694,11 @@ export declare class NavHeaderComponent {
14447
14694
  _searchLabel: import("@angular/core").Signal<string>;
14448
14695
  _trail: import("@angular/core").Signal<import("@magmonium/one").BreadcrumbTrail[] | null>;
14449
14696
  _user: import("@angular/core").Signal<import("@magmonium/one").AuthUser | null>;
14697
+ /**
14698
+ * The heading a panel draws in its body: null where the panel is the search
14699
+ * one (the bar is its heading) or the user one (the User is), so a panel that
14700
+ * has a header of its own never also draws the breadcrumb's.
14701
+ */
14450
14702
  _header: import("@angular/core").Signal<import("@magmonium/one").BreadcrumbTrail | null>;
14451
14703
  constructor();
14452
14704
  static ɵfac: i0.ɵɵFactoryDeclaration<NavHeaderComponent, never>;
@@ -15717,8 +15969,11 @@ export declare function settingsWidgets(): Record<string, NavWidgetEntry>;
15717
15969
  interface AppTileData {
15718
15970
  id: string;
15719
15971
  name: string;
15972
+ /** An icon name, for a tile that is not an app; an app draws its AppLogo. */
15720
15973
  icon?: string;
15721
- remote?: string;
15974
+ /** The Store App's LogoGlyph and App Color (nx ADR 0007). */
15975
+ logoGlyph?: string | null;
15976
+ appColor?: string | null;
15722
15977
  link: string;
15723
15978
  isDraft: boolean;
15724
15979
  }
@@ -15729,10 +15984,7 @@ export declare class AppTileComponent {
15729
15984
  readonly openApp: import("@angular/core").OutputEmitterRef<AppTileData>;
15730
15985
  readonly clearAll: import("@angular/core").OutputEmitterRef<void>;
15731
15986
  protected readonly expanded: import("@angular/core").WritableSignal<boolean>;
15732
- protected readonly fallback = "apps";
15733
15987
  protected readonly icon: import("@angular/core").Signal<string | undefined>;
15734
- protected readonly remote: import("@angular/core").Signal<string | undefined>;
15735
- protected readonly isUrl: import("@angular/core").Signal<boolean>;
15736
15988
  protected readonly notificationCount: import("@angular/core").Signal<number>;
15737
15989
  protected readonly expandOrNavigate: (_event: Event) => void;
15738
15990
  protected readonly handleAction: (button: Button | undefined) => void;
@@ -1 +0,0 @@
1
- {"version":3,"file":"magmonium-one-icon-BTPHGpEN.mjs","names":["catchError"],"sources":["../../../../libs/one/src/lib/shared/ui/icon/type/magmonium.ts","../../../../libs/one/src/lib/shared/ui/icon/model/shared-icons.ts","../../../../libs/one/src/lib/shared/ui/icon/lib/lib-icon.ts","../../../../libs/one/src/lib/shared/config/size-context.token.ts","../../../../libs/one/src/lib/shared/ui/icon/ui/icon.ts","../../../../libs/one/src/lib/shared/ui/icon/lib/custom-icon.ts","../../../../libs/one/src/lib/shared/ui/icon/ui/custom-icon.ts","../../../../libs/one/src/lib/shared/ui/icon/ui/custom-icon-edit.ts"],"sourcesContent":["export const MAGMONIUM = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-15 -15 120 165\">\n <g>\n <path fill=\"#color\" style=\"opacity: 0.7;\" d=\"M5 5 L5 65 L85 65 Z\" />\n <path fill=\"#color\" style=\"opacity: 0.3;\" d=\"M85 5 L5 65 L85 65 Z\" />\n </g>\n <g>\n <path fill=\"#color\" style=\"opacity: 0.3;\" d=\"M5 70 L85 70 L5 130 Z\" />\n <path fill=\"#color\" style=\"opacity: 0.7;\" d=\"M85 70 L5 70 L85 130 Z\" />\n </g>\n </svg>\n `;\n","// AUTO-GENERATED by assets:compile — do not edit manually\nexport const SHARED_ICONS = [\n 'accordion_chevron',\n 'account_balance_wallet',\n 'activity',\n 'add-image',\n 'adjust',\n 'alert-circle',\n 'analytics',\n 'apps',\n 'arrow-down',\n 'arrow-left',\n 'arrow-left-right',\n 'arrow-right',\n 'arrow-up',\n 'arrow_back',\n 'bell',\n 'bold',\n 'books',\n 'calendar',\n 'calendar-open',\n 'camera',\n 'chat',\n 'check',\n 'chevron-down',\n 'chevron-left',\n 'chevron-right',\n 'chevron-up',\n 'chevron_left',\n 'chevrons-down',\n 'chevrons-left',\n 'chevrons-right',\n 'chevrons-up',\n 'clipboard',\n 'code',\n 'coins',\n 'color-picker',\n 'copy',\n 'copyright',\n 'corner-left-up',\n 'currency_exchange',\n 'dot',\n 'download',\n 'ellipsis-vertical',\n 'exclamation-triangle',\n 'eye',\n 'eye_close',\n 'file-code',\n 'file-data',\n 'file-image',\n 'file-markup',\n 'file-style',\n 'file-text',\n 'fixed',\n 'flower',\n 'folder',\n 'games',\n 'gear',\n 'heading',\n 'heart',\n 'heart_filled',\n 'help',\n 'hero',\n 'info',\n 'install',\n 'instrument',\n 'investments',\n 'italic',\n 'language',\n 'layers',\n 'layouts',\n 'link',\n 'link-broken',\n 'list',\n 'loading',\n 'loading-bars',\n 'loading-dots',\n 'loading-logo',\n 'loading-pulse',\n 'location',\n 'lock',\n 'logo',\n 'magazines',\n 'mail',\n 'menu',\n 'mic',\n 'minus',\n 'monitor',\n 'more',\n 'notification',\n 'notification_off',\n 'open',\n 'pause',\n 'pencil',\n 'play',\n 'plus',\n 'posts',\n 'quote',\n 'redo',\n 'reload',\n 'reset',\n 'save',\n 'scissors',\n 'search',\n 'section',\n 'security',\n 'settings',\n 'shield',\n 'smartphone',\n 'sort-alpha-asc',\n 'sort-alpha-desc',\n 'sparkles',\n 'square',\n 'star',\n 'store',\n 'strategies',\n 'strikethrough',\n 'sun',\n 'table',\n 'tablet',\n 'target',\n 'theme',\n 'trash',\n 'trash-2',\n 'trending-down',\n 'trending-up',\n 'undo',\n 'user',\n 'users',\n 'wallet_manager',\n 'wallet_owner',\n 'wallet_shareholder',\n 'wand',\n 'wifi',\n 'x',\n 'zap',\n];\n","import { Icon, MAGMONIUM } from '../type/icon';\nimport { ElementRef } from '@angular/core';\nimport { SHARED_ICONS } from '../model/shared-icons';\nexport { SHARED_ICONS };\n\nexport function isOneIcon(element: ElementRef<HTMLElement>, config?: Icon) {\n if (typeof config?.one !== 'undefined') {\n return !!config.one;\n }\n\n // cast SHARED_ICONS to a generic string array for runtime includes check\n if (config?.name && (SHARED_ICONS as readonly string[]).includes(config.name)) {\n return true;\n }\n\n const tagName = element.nativeElement.tagName;\n return tagName === 'M-ONE-ICON';\n}\n\nfunction textToSvg(str = MAGMONIUM, color: string): string {\n if (typeof str !== 'string') return str as unknown as string;\n return str.replace(/#color/g, color).replace(/currentColor/g, color);\n}\n\nexport function svgElementFromString(str: string, color: string): SVGElement {\n const parser = new DOMParser();\n const doc = parser.parseFromString(textToSvg(str, color), 'image/svg+xml');\n const svg = doc.documentElement;\n\n if (svg && svg.nodeName === 'svg') {\n return svg as unknown as SVGElement;\n }\n\n const errorSvg = parser.parseFromString(textToSvg(MAGMONIUM, color), 'image/svg+xml');\n return errorSvg.documentElement as unknown as SVGElement;\n}\n","import { inject, InjectionToken, Provider, Signal, Type } from '@angular/core';\nimport { Size } from '../enum/scaling/size';\n\n/**\n * The Size in force for a subtree. Provided by the only components that may\n * declare one — Section, ButtonGroup, and the markup-composed SectionButtonGroup\n * (the last two are one seat, ADR 0008) — and injected `{ optional: true }` by\n * each of them (so a declarer falls back to the nearest one above it) and by\n * the few primitives whose size is a box dimension rather than a font size.\n *\n * Most components need nothing: a declarer also sets `font-size` on its own\n * host, so anything measured in `em` follows through ordinary CSS inheritance.\n * The token exists for what inheritance cannot do — a ButtonGroup or\n * SectionButtonGroup overriding its Section, and Icon sizing a square glyph.\n * See ADR 0008.\n */\nexport interface SizeContext {\n readonly size: Signal<Size>;\n}\n\nexport const SIZE_CONTEXT = new InjectionToken<SizeContext>('SIZE_CONTEXT');\n\nexport interface SizeDeclarer {\n readonly resolvedSize: Signal<Size>;\n}\n\n/**\n * Publishes a declarer's resolved Size to its subtree. Goes in `providers` and\n * never `viewProviders`: a Section's Cols and a ButtonGroup's Buttons are\n * projected content, which only `providers` reaches.\n */\nexport function provideSizeContext(\n declarer: Type<SizeDeclarer>\n): Provider {\n return {\n provide: SIZE_CONTEXT,\n useFactory: (): SizeContext => ({ size: inject(declarer).resolvedSize }),\n };\n}\n\n/**\n * The Size in force above a declarer. `skipSelf` because a declarer provides\n * SIZE_CONTEXT itself, and injecting its own provider would be circular — what\n * it wants is the nearest declarer *above* it, so that a Section with no Size\n * of its own takes its parent Section's and a ButtonGroup takes its Section's.\n */\nexport function injectParentSize(): SizeContext | null {\n return inject(SIZE_CONTEXT, { optional: true, skipSelf: true });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n model,\n untracked,\n} from '@angular/core';\nimport { Icon, MAGMONIUM } from '../type/icon';\nimport { isOneIcon, svgElementFromString } from '../lib/lib-icon';\nimport { SIZE_CONTEXT } from '../../../config/size-context.token';\nimport { resolveIconSize } from '../../../functions/size/size-converter';\nimport { AssetStore } from '../../../stores/asset.store';\nimport { HttpService } from '../../../services/http';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { catchError } from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport { applyColorsToElement, ThemeStore } from '../../../lib/theme';\nimport { ICON_SOURCE } from '../../../config/tokens';\n\n@Component({\n selector: 'm-icon, m-one-icon',\n template: `<ng-content></ng-content>`,\n styleUrls: ['./icon.sass'],\n host: {\n '[class.has-color]': 'resolvedConfig()?.color',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconComponent {\n // Kept for the callers that hand an Icon a whole object rather than write it\n // out — a Button naming its own glyph, a SectionFormItem passing a Field's.\n config = model<Icon | undefined>(undefined);\n\n // `name` is the SVG's filename in `mag_assets/icons/`, not a config asset:\n // an Icon resolves artwork, so it is the one primitive whose name points at\n // a picture rather than at a description of itself (ADR 0010). `size` is a\n // free length (number → em), not a Size — Size stays on Section / ButtonGroup\n // (ADR 0008); set here only to overwrite the box SIZE_CONTEXT would give.\n readonly name = input<string | undefined>();\n readonly color = input<string | undefined>();\n readonly size = input<number | string | undefined>();\n readonly one = input<boolean | undefined>();\n readonly baseUrl = input<string | undefined>();\n readonly remote = input<string | undefined>();\n\n // Attributes win over the bound object, and an omitted one leaves the\n // object's key standing rather than blanking it.\n protected readonly resolvedConfig = computed<Icon | undefined>(() => {\n const config = this.config();\n const overrides: Icon = {};\n const name = this.name();\n if (name !== undefined) overrides.name = name;\n const color = this.color();\n if (color !== undefined) overrides.color = color;\n const one = this.one();\n if (one !== undefined) overrides.one = one;\n const baseUrl = this.baseUrl();\n if (baseUrl !== undefined) overrides.baseUrl = baseUrl;\n const remote = this.remote();\n if (remote !== undefined) overrides.remote = remote;\n if (!config && !Object.keys(overrides).length) return undefined;\n return { ...config, ...overrides };\n });\n\n private readonly elementRef = inject(ElementRef);\n // Icon sizes a square glyph through width/height, which no amount of\n // inherited font-size can set — so it is one of the few primitives that\n // reads the Size in force directly (ADR 0008).\n private readonly sizeContext = inject(SIZE_CONTEXT, { optional: true });\n private readonly assetStore = inject(AssetStore);\n private readonly http = inject(HttpService);\n private currentSvgElement: SVGElement | null = null;\n private readonly themeStore = inject(ThemeStore);\n private readonly isOneIcon = computed(() =>\n isOneIcon(this.elementRef, this.resolvedConfig())\n );\n private readonly remoteBaseUrl = computed<string | undefined>(() => {\n const remoteId = this.resolvedConfig()?.remote;\n return remoteId ? this.http.buildWcAssetBaseUrl(remoteId) : undefined;\n });\n\n // Icons supplied by name from memory (e.g. a visual editor's unsaved glyphs).\n // Read as a signal rather than through the resource below so that changing the\n // markup under an unchanged name repaints every icon already using it.\n private readonly iconSource = inject(ICON_SOURCE, { optional: true });\n private readonly inlineSvg = computed(() => {\n const name = this.resolvedConfig()?.name;\n return name ? this.iconSource?.()?.[name] : undefined;\n });\n\n private readonly text = rxResource({\n params: computed(\n () => ({\n name: this.resolvedConfig()?.name,\n isOneIcon: untracked(() => this.isOneIcon()),\n remoteBaseUrl: this.remoteBaseUrl(),\n }),\n { equal: (a, b) => a?.name === b?.name && a?.remoteBaseUrl === b?.remoteBaseUrl }\n ),\n stream: ({ params: { name, isOneIcon, remoteBaseUrl } }) => {\n if (!name) return untracked(() =>\n this.assetStore.resolve<string>('icons', 'logo', true).pipe(catchError(() => of(MAGMONIUM)))\n );\n // Skips the request entirely for an in-memory glyph — there is no asset\n // behind it, so fetching only ever produces a 404 and the fallback logo.\n const inline = untracked(() => this.inlineSvg());\n if (inline) return of(inline);\n return untracked(() =>\n this.assetStore\n .resolve<string>('icons', name, isOneIcon, remoteBaseUrl)\n .pipe(catchError(() => of(MAGMONIUM)))\n );\n },\n });\n\n private readonly pallet = computed(() =>\n applyColorsToElement(\n this.resolvedConfig()?.color ?? this.themeStore.color()?.mm ?? '#fff',\n this.themeStore.color(),\n this.elementRef.nativeElement\n )\n );\n\n constructor() {\n effect(this.updateElement);\n effect(this.applySize);\n }\n\n private readonly applySize = (): void => {\n this.elementRef.nativeElement.style.setProperty(\n '--m-icon-size',\n resolveIconSize(this.size(), this.sizeContext?.size())\n );\n };\n\n private readonly updateElement = (): void => {\n const element = this.elementRef.nativeElement;\n if (this.currentSvgElement) {\n this.currentSvgElement.remove();\n this.currentSvgElement = null;\n }\n const svg = svgElementFromString(\n this.inlineSvg() ?? (this.text.value() as string),\n this.pallet()?.color ?? this.themeStore.color()?.mm ?? '#fff'\n );\n if (!svg) return;\n this.currentSvgElement = svg;\n svg.removeAttribute('width');\n svg.removeAttribute('height');\n svg.style.width = 'var(--m-icon-size, 1em)';\n svg.style.height = 'var(--m-icon-size, 1em)';\n svg.style.flexShrink = '0';\n svg.removeAttribute('stroke-width');\n svg.style.setProperty('stroke-width', '2px');\n svg.querySelectorAll('*').forEach((el) => {\n el.removeAttribute('stroke-width');\n if (el instanceof HTMLElement || el instanceof SVGElement) {\n el.style.removeProperty('stroke-width');\n }\n });\n element.prepend(svg);\n };\n}\n","import { CustomIcon } from '../type/icon';\nimport { ThemeColor } from '@magmonium/cli';\n\nfunction genColor(colors: ThemeColor, color: string) {\n return colors[color as keyof ThemeColor] ?? color;\n}\n\nexport function isLargeImage(svg: CustomIcon): boolean {\n const width = svg.width || 0;\n const height = svg.height || 0;\n const area = width * height;\n return area > 2000000 || width > 2000 || height > 2000;\n}\n\nexport function genViewPort(svg: CustomIcon | undefined) {\n if (!svg) return '0 0 0 0';\n const width = svg.width || 0;\n const height = svg.height || 0;\n return `0 0 ${width} ${height}`;\n}\n\nexport function computedFillColor(\n svg: CustomIcon,\n colors?: ThemeColor,\n fillColor?: string\n) {\n const { lineColor, backgroundColor, invertSvg } = svg.edit;\n if (!colors) {\n return fillColor ?? backgroundColor;\n }\n return genColor(\n colors,\n invertSvg ? lineColor : (fillColor ?? backgroundColor)\n );\n}\n\nexport function computeLineColor(\n svg: CustomIcon,\n colors?: ThemeColor,\n strokeColor?: string\n) {\n const { lineColor, backgroundColor, invertSvg } = svg.edit;\n if (!colors) {\n return strokeColor ?? lineColor;\n }\n return genColor(\n colors,\n invertSvg ? backgroundColor : (strokeColor ?? lineColor)\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { CustomIcon } from '../type/icon';\nimport {\n computedFillColor,\n computeLineColor,\n genViewPort,\n isLargeImage,\n} from '../lib/custom-icon';\nimport { ThemeStore } from '../../../lib/theme';\n\n@Component({\n selector: 'm-custom-icon',\n template: `\n <!-- eslint-disable local/no-raw-svg -->\n @if (svg(); as svg) {\n <svg\n xmlns=\"http:/www.w3.org/2000/svg\"\n [attr.viewBox]=\"viewBox()\"\n [attr.width]=\"svg.width\"\n [attr.height]=\"svg.height\"\n preserveAspectRatio=\"xMidYMid meet\"\n >\n @if (_fillColor(); as fillColor) {\n <rect\n [attr.width]=\"svg.width\"\n [attr.height]=\"svg.height\"\n [attr.fill]=\"fillColor\"\n />\n }\n @if (_strokeColor(); as stroke) {\n @for (path of svg?.paths; track $index) {\n <path\n class=\"svg-path\"\n [attr.d]=\"path\"\n [attr.fill]=\"'none'\"\n [attr.stroke]=\"stroke\"\n [attr.stroke-linecap]=\"svg?.edit?.linecap\"\n [attr.stroke-linejoin]=\"svg?.edit?.linejoin\"\n [attr.stroke-width]=\"svg.edit.strokeWidth\"\n [attr.vector-effect]=\"vectorEffect()\"\n />\n }\n }\n </svg>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CustomIconClass {\n svg = input.required<CustomIcon>();\n strokeColor = input<string | undefined>(undefined);\n fillColor = input<string | undefined>(undefined);\n strokeWidth = input<number | undefined>(undefined);\n\n protected readonly viewBox = computed(() => genViewPort(this.svg()));\n protected readonly vectorEffect = computed(() => {\n return isLargeImage(this.svg()) ? 'non-scaling-stroke' : null;\n });\n private readonly themeStore = inject(ThemeStore);\n protected readonly _fillColor = computed(() =>\n computedFillColor(this.svg(), this.themeStore.color(), this.fillColor())\n );\n protected readonly _strokeColor = computed(() => {\n return computeLineColor(\n this.svg(),\n this.themeStore.color(),\n this.strokeColor()\n );\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n HostListener,\n computed,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { CustomIcon } from '../type/icon';\nimport {\n computedFillColor,\n computeLineColor,\n genViewPort,\n isLargeImage,\n} from '../lib/custom-icon';\nimport { ThemeStore } from '../../../lib/theme';\n\n@Component({\n selector: 'm-custom-icon-edit',\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- eslint-disable local/no-raw-svg -->\n @if (svg(); as svg) {\n <svg\n xmlns=\"http:/www.w3.org/2000/svg\"\n [attr.viewBox]=\"_viewBox()\"\n [attr.width]=\"svg.width\"\n [attr.height]=\"svg.height\"\n preserveAspectRatio=\"xMidYMid meet\"\n >\n @if (_fillColor(); as fillColor) {\n <rect\n [attr.width]=\"svg.width\"\n [attr.height]=\"svg.height\"\n [attr.fill]=\"fillColor\"\n />\n }\n @for (path of svg.paths; track $index) {\n <path\n class=\"svg-path\"\n (click)=\"_onPathClick($index)\"\n [class.interactive]=\"svg.edit.canInteract\"\n [class.selected]=\"_selectedIndex.includes($index)\"\n [attr.d]=\"path\"\n [attr.fill]=\"'none'\"\n [attr.stroke]=\"_strokeColor()\"\n [attr.stroke-linecap]=\"svg.edit.linecap\"\n [attr.stroke-linejoin]=\"svg.edit.linejoin\"\n [attr.stroke-width]=\"svg.edit.strokeWidth\"\n [attr.vector-effect]=\"_vectorEffect()\"\n />\n }\n </svg>\n }\n `,\n styleUrl: './custom-icon-edit.sass',\n})\nexport class CustomIconEditComponent {\n svg = model<CustomIcon | undefined>(undefined);\n strokeColor = input<string | undefined>(undefined);\n fillColor = input<string | undefined>(undefined);\n\n private readonly themeStore = inject(ThemeStore);\n\n @HostListener('window:keydown', ['$event'])\n onKeydown(event: KeyboardEvent) {\n if (!this.svg()?.edit?.canInteract || this._selectedIndex.length === 0) {\n return;\n }\n if (event.key === ' ') {\n event.preventDefault();\n this.deleteSelectedPaths();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this._selectedIndex = [];\n }\n }\n\n protected readonly _viewBox = computed(() => genViewPort(this.svg()));\n\n protected readonly _vectorEffect = computed(() => {\n const svg = this.svg();\n return svg && isLargeImage(svg) ? 'non-scaling-stroke' : null;\n });\n\n protected readonly _fillColor = computed(() => {\n const svg = this.svg();\n if (!svg) return undefined;\n return computedFillColor(svg, this.themeStore.color(), this.fillColor());\n });\n\n protected readonly _strokeColor = computed(() => {\n const svg = this.svg();\n if (!svg) return undefined;\n return computeLineColor(svg, this.themeStore.color(), this.strokeColor());\n });\n\n protected readonly _onPathClick = (index: number) => {\n if (!this.svg()?.edit?.canInteract) return;\n this._selectedIndex = Array.from(new Set([...this._selectedIndex, index]));\n };\n\n readonly deleteSelectedPaths = () => {\n this.svg.update((prev) => {\n if (!prev) return prev;\n return {\n ...prev,\n paths: prev.paths.filter((_, i) => !this._selectedIndex.includes(i)),\n };\n });\n this._selectedIndex = [];\n };\n\n protected _selectedIndex: number[] = [];\n}\n"],"mappings":";;;;;;;;AAAA,MAAa,YAAY;;;;;;;;;;;;ACCzB,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD;ACnID,SAAgB,UAAU,SAAkC,QAAa;CACvE,IAAI,OAAO,QAAQ,QAAQ,aACzB,OAAO,CAAC,CAAC,OAAO;CAIlB,IAAI,QAAQ,QAAS,aAAmC,SAAS,OAAO,IAAI,GAC1E,OAAO;CAIT,OADgB,QAAQ,cAAc,YACnB;AACrB;AAEA,SAAS,UAAU,MAAM,WAAW,OAAa;CAC/C,IAAI,OAAO,QAAQ,UAAU,OAAO;CACpC,OAAO,IAAI,QAAQ,WAAW,KAAK,CAAC,CAAC,QAAQ,iBAAiB,KAAK;AACrE;AAEA,SAAgB,qBAAqB,KAAa,OAAa;CAC7D,MAAM,SAAS,IAAI,UAAS;CAE5B,MAAM,MADM,OAAO,gBAAgB,UAAU,KAAK,KAAK,GAAG,eAC9C,CAAA,CAAI;CAEhB,IAAI,OAAO,IAAI,aAAa,OAC1B,OAAO;CAIT,OADiB,OAAO,gBAAgB,UAAU,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"}