@magmonium/one 0.4.42 → 0.4.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{magmonium-one-attribute-value-DCTXt4Sr.mjs → magmonium-one-attribute-value-C1lqou2L.mjs} +3 -3
- package/fesm2022/{magmonium-one-attribute-value-DCTXt4Sr.mjs.map → magmonium-one-attribute-value-C1lqou2L.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-checkbox-BNQAkyYU.mjs → magmonium-one-base-checkbox-CIxAiA4Q.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-checkbox-BNQAkyYU.mjs.map → magmonium-one-base-checkbox-CIxAiA4Q.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-dropdown-CcZ0lBQv.mjs → magmonium-one-base-dropdown-XpTWe4Ii.mjs} +10 -10
- package/fesm2022/{magmonium-one-base-dropdown-CcZ0lBQv.mjs.map → magmonium-one-base-dropdown-XpTWe4Ii.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-input-BTxhUtYO.mjs → magmonium-one-base-input-C1Ek0Ezm.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-input-BTxhUtYO.mjs.map → magmonium-one-base-input-C1Ek0Ezm.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-text-BCSqKmVs.mjs → magmonium-one-base-text-Di2V2ojp.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-text-BCSqKmVs.mjs.map → magmonium-one-base-text-Di2V2ojp.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-button-BZQOf-Pm.mjs → magmonium-one-button-DZ4wCJgb.mjs} +7 -7
- package/fesm2022/{magmonium-one-button-BZQOf-Pm.mjs.map → magmonium-one-button-DZ4wCJgb.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-checkbox-D5-5WhJ-.mjs → magmonium-one-checkbox-R-hPZrCa.mjs} +5 -5
- package/fesm2022/{magmonium-one-checkbox-D5-5WhJ-.mjs.map → magmonium-one-checkbox-R-hPZrCa.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-color-utl-D86GGpz5.mjs → magmonium-one-color-utl-DI5p24iQ.mjs} +209 -6
- package/fesm2022/magmonium-one-color-utl-DI5p24iQ.mjs.map +1 -0
- package/fesm2022/{magmonium-one-directives-DePukAj8.mjs → magmonium-one-directives-B93p5bAL.mjs} +4 -4
- package/fesm2022/{magmonium-one-directives-DePukAj8.mjs.map → magmonium-one-directives-B93p5bAL.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-group-Dl2bp-y-.mjs → magmonium-one-group-B7YeUd1u.mjs} +7 -7
- package/fesm2022/{magmonium-one-group-Dl2bp-y-.mjs.map → magmonium-one-group-B7YeUd1u.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-header-DhK9NuZW.mjs → magmonium-one-header-DUiBhPUP.mjs} +4 -4
- package/fesm2022/{magmonium-one-header-DhK9NuZW.mjs.map → magmonium-one-header-DUiBhPUP.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-icon-BgbtOdMv.mjs → magmonium-one-icon-C3jwzbb2.mjs} +13 -165
- package/fesm2022/magmonium-one-icon-C3jwzbb2.mjs.map +1 -0
- package/fesm2022/{magmonium-one-image-editor-oGxg59hV.mjs → magmonium-one-image-editor-BRTk8i4O.mjs} +4 -4
- package/fesm2022/{magmonium-one-image-editor-oGxg59hV.mjs.map → magmonium-one-image-editor-BRTk8i4O.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-label-DjvJthAB.mjs → magmonium-one-label-D_rU82nD.mjs} +2 -2
- package/fesm2022/{magmonium-one-label-DjvJthAB.mjs.map → magmonium-one-label-D_rU82nD.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-m-ref-C8c4Vf1G.mjs → magmonium-one-m-ref-CEms7B6-.mjs} +2 -2
- package/fesm2022/{magmonium-one-m-ref-C8c4Vf1G.mjs.map → magmonium-one-m-ref-CEms7B6-.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-menu-bI7lVUYI.mjs → magmonium-one-menu-cO34OcJc.mjs} +6 -6
- package/fesm2022/{magmonium-one-menu-bI7lVUYI.mjs.map → magmonium-one-menu-cO34OcJc.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-multi-range-o57TiVJU.mjs → magmonium-one-multi-range-Bq3_3NHg.mjs} +3 -3
- package/fesm2022/{magmonium-one-multi-range-o57TiVJU.mjs.map → magmonium-one-multi-range-Bq3_3NHg.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-options-asset-EVsv0DL7.mjs → magmonium-one-options-asset-BMd7W0Mk.mjs} +2 -2
- package/fesm2022/{magmonium-one-options-asset-EVsv0DL7.mjs.map → magmonium-one-options-asset-BMd7W0Mk.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-otp-CE4L1RcG.mjs → magmonium-one-otp-V2tFztLx.mjs} +5 -5
- package/fesm2022/{magmonium-one-otp-CE4L1RcG.mjs.map → magmonium-one-otp-V2tFztLx.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-password-BIs_YxJ5.mjs → magmonium-one-password-IdllPMUw.mjs} +6 -6
- package/fesm2022/{magmonium-one-password-BIs_YxJ5.mjs.map → magmonium-one-password-IdllPMUw.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-radio-C2wOB_Nb.mjs → magmonium-one-radio-BAL3-3j5.mjs} +3 -3
- package/fesm2022/{magmonium-one-radio-C2wOB_Nb.mjs.map → magmonium-one-radio-BAL3-3j5.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-range-rgDe4O8u.mjs → magmonium-one-range-Cf7yUnhN.mjs} +4 -4
- package/fesm2022/{magmonium-one-range-rgDe4O8u.mjs.map → magmonium-one-range-Cf7yUnhN.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-selector-DeRIUUBA.mjs → magmonium-one-selector-DAEI_0JX.mjs} +4 -4
- package/fesm2022/{magmonium-one-selector-DeRIUUBA.mjs.map → magmonium-one-selector-DAEI_0JX.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-size-converter-C5fG_dgw.mjs → magmonium-one-size-converter-BOBD8nHy.mjs} +8 -1
- package/fesm2022/magmonium-one-size-converter-BOBD8nHy.mjs.map +1 -0
- package/fesm2022/{magmonium-one-text-BvXdAX0i.mjs → magmonium-one-text-BnTkYLJe.mjs} +6 -6
- package/fesm2022/{magmonium-one-text-BvXdAX0i.mjs.map → magmonium-one-text-BnTkYLJe.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-text-output-Ci93Hi9Y.mjs → magmonium-one-text-output-BZU61QIF.mjs} +4 -4
- package/fesm2022/{magmonium-one-text-output-Ci93Hi9Y.mjs.map → magmonium-one-text-output-BZU61QIF.mjs.map} +1 -1
- package/fesm2022/magmonium-one-theme-DYvNIWmo.mjs +1 -0
- package/fesm2022/{magmonium-one-toggle-BTK2lzqA.mjs → magmonium-one-toggle-V_YnZXx5.mjs} +3 -3
- package/fesm2022/{magmonium-one-toggle-BTK2lzqA.mjs.map → magmonium-one-toggle-V_YnZXx5.mjs.map} +1 -1
- package/fesm2022/magmonium-one.mjs +203 -71
- package/fesm2022/magmonium-one.mjs.map +1 -1
- package/package.json +1 -1
- package/types/magmonium-one.d.ts +78 -23
- package/fesm2022/magmonium-one-color-utl-D86GGpz5.mjs.map +0 -1
- package/fesm2022/magmonium-one-icon-BgbtOdMv.mjs.map +0 -1
- package/fesm2022/magmonium-one-size-converter-C5fG_dgw.mjs.map +0 -1
- package/fesm2022/magmonium-one-theme-CT4cWpe7.mjs +0 -1
package/package.json
CHANGED
package/types/magmonium-one.d.ts
CHANGED
|
@@ -714,6 +714,8 @@ export interface LoadingActionsApi {
|
|
|
714
714
|
export declare class SharedStoreRegistry {
|
|
715
715
|
static setNavStore(store: unknown): void;
|
|
716
716
|
static getNavStore(): unknown;
|
|
717
|
+
static setAppLogoState(state: unknown): void;
|
|
718
|
+
static getAppLogoState(): unknown;
|
|
717
719
|
static setLoginStore(store: unknown): void;
|
|
718
720
|
static getLoginStore(): unknown;
|
|
719
721
|
/** First-write-wins: host registers its store; WC bundles reuse it so popups render in the host outlet. */
|
|
@@ -2602,6 +2604,16 @@ export declare function rebuildLogoGlyph(markup: string): LogoGlyphResult;
|
|
|
2602
2604
|
export declare const normalizeAppColor: (value: string) => string | undefined;
|
|
2603
2605
|
/** The AppLogo's shadow: App Color mixed with 20% black. */
|
|
2604
2606
|
export declare const appLogoShadowColor: (color: string) => string;
|
|
2607
|
+
/**
|
|
2608
|
+
* The theme's brand tokens (`mm`, `mmLite`, `mmDark`) as one App Color draws
|
|
2609
|
+
* them — what an app's own boundary paints its `mm` with in place of the
|
|
2610
|
+
* theme's.
|
|
2611
|
+
*/
|
|
2612
|
+
export declare const appColorBrand: (color: string) => {
|
|
2613
|
+
mm: string;
|
|
2614
|
+
mmLite: string;
|
|
2615
|
+
mmDark: string;
|
|
2616
|
+
};
|
|
2605
2617
|
/**
|
|
2606
2618
|
* Whether a white glyph reads poorly over this App Color: contrast under 3:1,
|
|
2607
2619
|
* the WCAG floor for graphical objects. A warning, never a refusal.
|
|
@@ -2656,23 +2668,46 @@ export type AppLogoSource = {
|
|
|
2656
2668
|
glyph?: string | null;
|
|
2657
2669
|
src?: string;
|
|
2658
2670
|
name?: string | null;
|
|
2671
|
+
/** App Color, `#rrggbb`, as Store holds it; null until the Owner sets one. */
|
|
2672
|
+
color?: string | null;
|
|
2659
2673
|
};
|
|
2660
2674
|
/**
|
|
2661
|
-
* Where NavStore publishes the
|
|
2662
|
-
*
|
|
2675
|
+
* Where NavStore publishes the AppLogo. Shared rather than read off NavStore
|
|
2676
|
+
* because `m-icon` sits below features and cannot import it — and handed to a
|
|
2677
|
+
* mounted WC through SharedStoreRegistry, since a WC reads the host's NavStore.
|
|
2678
|
+
* `logos` is every app NavStore knows the identity of, by AppLink: a host may
|
|
2679
|
+
* mount several at once, so each WC looks up its own. `source` is the fallback.
|
|
2663
2680
|
*/
|
|
2664
2681
|
export declare class AppLogoState {
|
|
2665
2682
|
#private;
|
|
2666
2683
|
readonly source: Signal<AppLogoSource | undefined>;
|
|
2684
|
+
readonly logos: Signal<Record<string, AppLogoSource>>;
|
|
2667
2685
|
readonly set: (source: AppLogoSource | undefined) => void;
|
|
2686
|
+
readonly setLogos: (logos: Record<string, AppLogoSource>) => void;
|
|
2668
2687
|
static ɵfac: i0.ɵɵFactoryDeclaration<AppLogoState, never>;
|
|
2669
2688
|
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
2670
2689
|
}
|
|
2671
2690
|
/**
|
|
2672
|
-
* What `m-icon name="app_logo"` draws
|
|
2691
|
+
* What `m-icon name="app_logo"` draws: this app's own entry, by the AppLink
|
|
2692
|
+
* AssetStore holds (a mounted WC's, from `bindApp`), else the fallback. A
|
|
2673
2693
|
* visual editor provides its own so the Canvas shows the AppTarget's logo.
|
|
2674
2694
|
*/
|
|
2675
2695
|
export declare const APP_LOGO_SOURCE: InjectionToken<Signal<AppLogoSource | undefined>>;
|
|
2696
|
+
/**
|
|
2697
|
+
* This app's App Color, which its own boundary paints as the theme's `mm`
|
|
2698
|
+
* (ThemeStore `color`). Unset at the host's root, so the host's chrome keeps
|
|
2699
|
+
* the theme's brand; a WC and a standalone Run provide it from
|
|
2700
|
+
* `appThemeColorFactory`. Unset too while the Owner has set none, and the
|
|
2701
|
+
* theme's own `mm` stands.
|
|
2702
|
+
*/
|
|
2703
|
+
export declare const APP_THEME_COLOR: InjectionToken<Signal<string | undefined>>;
|
|
2704
|
+
/** This app's App Color off the identities NavStore publishes, by its AppLink. */
|
|
2705
|
+
export declare const appThemeColorFactory: () => Signal<string | undefined>;
|
|
2706
|
+
/**
|
|
2707
|
+
* Paints an App Color's brand tokens onto the element that bounds the app —
|
|
2708
|
+
* every `m.$mm` inside it reads them — or clears them, leaving the theme's.
|
|
2709
|
+
*/
|
|
2710
|
+
export declare const paintAppColor: (element: HTMLElement, color: string | undefined) => void;
|
|
2676
2711
|
type ButtonBadge = {
|
|
2677
2712
|
count?: number;
|
|
2678
2713
|
variant?: 'default' | 'primary' | 'danger';
|
|
@@ -4707,7 +4742,7 @@ export declare class SectionFilterGroupComponent {
|
|
|
4707
4742
|
readonly paddingX: import("@angular/core").InputSignal<boolean | undefined>;
|
|
4708
4743
|
readonly paddingY: import("@angular/core").InputSignal<boolean | undefined>;
|
|
4709
4744
|
readonly maxWidth: import("@angular/core").InputSignal<string | undefined>;
|
|
4710
|
-
readonly align: import("@angular/core").InputSignal<"
|
|
4745
|
+
readonly align: import("@angular/core").InputSignal<"left" | "center" | "right" | undefined>;
|
|
4711
4746
|
readonly config: import("@angular/core").InputSignal<SectionFilterGroupConfig | undefined>;
|
|
4712
4747
|
/**
|
|
4713
4748
|
* The whole group's selection, keyed by each Filter's `name` — one key per
|
|
@@ -4725,7 +4760,7 @@ export declare class SectionFilterGroupComponent {
|
|
|
4725
4760
|
protected readonly resolvedPadding: import("@angular/core").Signal<boolean>;
|
|
4726
4761
|
protected readonly resolvedPaddingX: import("@angular/core").Signal<boolean>;
|
|
4727
4762
|
protected readonly resolvedPaddingY: import("@angular/core").Signal<boolean>;
|
|
4728
|
-
protected readonly resolvedAlign: import("@angular/core").Signal<"
|
|
4763
|
+
protected readonly resolvedAlign: import("@angular/core").Signal<"left" | "center" | "right">;
|
|
4729
4764
|
protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
|
|
4730
4765
|
protected readonly noBorder: import("@angular/core").Signal<boolean>;
|
|
4731
4766
|
/**
|
|
@@ -4904,7 +4939,7 @@ export declare class SectionStepperComponent implements OnDestroy {
|
|
|
4904
4939
|
export declare class SectionBadgesComponent {
|
|
4905
4940
|
readonly wrap: import("@angular/core").InputSignal<boolean>;
|
|
4906
4941
|
readonly border: import("@angular/core").InputSignal<boolean>;
|
|
4907
|
-
readonly align: import("@angular/core").InputSignal<"
|
|
4942
|
+
readonly align: import("@angular/core").InputSignal<"left" | "center" | "right">;
|
|
4908
4943
|
private readonly sectionContext;
|
|
4909
4944
|
protected readonly hasBorder: import("@angular/core").Signal<boolean>;
|
|
4910
4945
|
static ɵfac: i0.ɵɵFactoryDeclaration<SectionBadgesComponent, never>;
|
|
@@ -5021,7 +5056,7 @@ export declare class SectionToggleComponent<T extends SectionToggleItem = Sectio
|
|
|
5021
5056
|
}
|
|
5022
5057
|
export declare class SectionFooterComponent {
|
|
5023
5058
|
readonly sticky: import("@angular/core").InputSignal<boolean>;
|
|
5024
|
-
readonly align: import("@angular/core").InputSignal<"
|
|
5059
|
+
readonly align: import("@angular/core").InputSignal<"left" | "center" | "right">;
|
|
5025
5060
|
private readonly scrollSticky;
|
|
5026
5061
|
protected readonly isSticky: import("@angular/core").Signal<boolean>;
|
|
5027
5062
|
private readonly sectionContext;
|
|
@@ -5074,7 +5109,7 @@ export declare class SectionPaginationComponent {
|
|
|
5074
5109
|
* Entries that are not positive numbers drop rather than throw.
|
|
5075
5110
|
*/
|
|
5076
5111
|
readonly perPageOptions: import("@angular/core").InputSignal<string | undefined>;
|
|
5077
|
-
readonly align: import("@angular/core").InputSignal<"
|
|
5112
|
+
readonly align: import("@angular/core").InputSignal<"left" | "center" | "right">;
|
|
5078
5113
|
readonly showPerPage: import("@angular/core").InputSignal<boolean>;
|
|
5079
5114
|
/** Hides the band outright once everything fits one page. */
|
|
5080
5115
|
readonly hideOnSinglePage: import("@angular/core").InputSignal<boolean>;
|
|
@@ -5412,7 +5447,7 @@ export declare class SectionComponent extends ConfigComponent<SectionConfig> {
|
|
|
5412
5447
|
readonly align: import("@angular/core").InputSignal<SectionAlign | undefined>;
|
|
5413
5448
|
readonly alignX: import("@angular/core").InputSignal<GridAlignX | undefined>;
|
|
5414
5449
|
readonly alignY: import("@angular/core").InputSignal<GridAlignY | undefined>;
|
|
5415
|
-
readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" |
|
|
5450
|
+
readonly size: import("@angular/core").InputSignal<Size | "sm" | "md" | "lg" | undefined>;
|
|
5416
5451
|
private readonly parentSize;
|
|
5417
5452
|
readonly resolvedSize: import("@angular/core").Signal<Size>;
|
|
5418
5453
|
protected readonly sizeLength: import("@angular/core").Signal<string>;
|
|
@@ -5552,8 +5587,8 @@ export declare class SectionHeaderComponent {
|
|
|
5552
5587
|
readonly visibilityRule: import("@angular/core").InputSignal<((key: string, data?: unknown) => boolean) | undefined>;
|
|
5553
5588
|
readonly disableRule: import("@angular/core").InputSignal<((key: string, data?: unknown) => boolean) | undefined>;
|
|
5554
5589
|
readonly extraData: import("@angular/core").InputSignal<unknown>;
|
|
5555
|
-
readonly align: import("@angular/core").InputSignal<"
|
|
5556
|
-
readonly alignment: import("@angular/core").Signal<"
|
|
5590
|
+
readonly align: import("@angular/core").InputSignal<"left" | "center" | "right" | undefined>;
|
|
5591
|
+
readonly alignment: import("@angular/core").Signal<"left" | "center" | "right">;
|
|
5557
5592
|
readonly showBack: import("@angular/core").InputSignal<boolean>;
|
|
5558
5593
|
readonly actionButton: import("@angular/core").InputSignal<string | undefined>;
|
|
5559
5594
|
readonly actionLabel: import("@angular/core").InputSignal<string | undefined>;
|
|
@@ -5570,7 +5605,7 @@ export declare class SectionHeaderComponent {
|
|
|
5570
5605
|
protected readonly sidepanel: import("@angular/core").Signal<boolean>;
|
|
5571
5606
|
protected readonly noBorder: import("@angular/core").Signal<boolean>;
|
|
5572
5607
|
protected readonly resolvedMaxWidth: import("@angular/core").Signal<string | undefined>;
|
|
5573
|
-
protected readonly boxAlign: import("@angular/core").Signal<"
|
|
5608
|
+
protected readonly boxAlign: import("@angular/core").Signal<"left" | "center" | "right">;
|
|
5574
5609
|
protected readonly iconBox: import("@angular/core").Signal<string>;
|
|
5575
5610
|
protected readonly isSticky: import("@angular/core").Signal<boolean>;
|
|
5576
5611
|
protected readonly hasMenu: import("@angular/core").Signal<boolean>;
|
|
@@ -5681,7 +5716,7 @@ export declare class SectionHeaderComponent {
|
|
|
5681
5716
|
"actionClick": "actionClick";
|
|
5682
5717
|
"action": "action";
|
|
5683
5718
|
"back": "back";
|
|
5684
|
-
}, never, ["*", "m-section-filter-group"], true, never>;
|
|
5719
|
+
}, never, ["m-app-logo", "*", "m-section-filter-group"], true, never>;
|
|
5685
5720
|
}
|
|
5686
5721
|
/**
|
|
5687
5722
|
* Config for `m-section-button-group`. Carries no `names` and no `buttons` —
|
|
@@ -5710,7 +5745,7 @@ export declare class SectionButtonGroupComponent extends ConfigComponent<Section
|
|
|
5710
5745
|
readonly vertical: import("@angular/core").InputSignal<boolean | undefined>;
|
|
5711
5746
|
readonly align: import("@angular/core").InputSignal<ConfigAlign>;
|
|
5712
5747
|
readonly variant: import("@angular/core").InputSignal<"spaced" | "joined" | undefined>;
|
|
5713
|
-
readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" |
|
|
5748
|
+
readonly size: import("@angular/core").InputSignal<Size | "sm" | "md" | "lg" | undefined>;
|
|
5714
5749
|
readonly fullWidth: import("@angular/core").InputSignal<boolean | undefined>;
|
|
5715
5750
|
private readonly parentSize;
|
|
5716
5751
|
readonly resolvedSize: import("@angular/core").Signal<Size>;
|
|
@@ -5718,7 +5753,7 @@ export declare class SectionButtonGroupComponent extends ConfigComponent<Section
|
|
|
5718
5753
|
protected readonly resolvedFullWidth: import("@angular/core").Signal<boolean>;
|
|
5719
5754
|
protected readonly resolvedVertical: import("@angular/core").Signal<boolean>;
|
|
5720
5755
|
protected readonly resolvedVariant: import("@angular/core").Signal<"spaced" | "joined">;
|
|
5721
|
-
protected readonly resolvedAlign: import("@angular/core").Signal<"
|
|
5756
|
+
protected readonly resolvedAlign: import("@angular/core").Signal<"left" | "top" | "bottom" | "center" | "right">;
|
|
5722
5757
|
static ɵfac: i0.ɵɵFactoryDeclaration<SectionButtonGroupComponent, never>;
|
|
5723
5758
|
static ɵcmp: i0.ɵɵComponentDeclaration<SectionButtonGroupComponent, "m-section-button-group", never, {
|
|
5724
5759
|
"vertical": {
|
|
@@ -7226,7 +7261,7 @@ declare class DropdownBoxComponent {
|
|
|
7226
7261
|
}
|
|
7227
7262
|
/** The trigger both option Fields draw: a searchable text input and a chevron. */
|
|
7228
7263
|
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";
|
|
7229
|
-
declare const DROPDOWN_IMPORTS: (typeof
|
|
7264
|
+
declare const DROPDOWN_IMPORTS: (typeof TextOutputComponent | typeof ButtonComponent | typeof LabelComponent | typeof SelectorDirective | typeof TextInputComponent)[];
|
|
7230
7265
|
/**
|
|
7231
7266
|
* Everything a Dropdown and a Multiselect share: the options, the search, the
|
|
7232
7267
|
* keyboard walk and the panel. What differs is only what the Field holds — one
|
|
@@ -8581,14 +8616,14 @@ export declare class SectionFormComponent<T extends object = Record<string, unkn
|
|
|
8581
8616
|
readonly heightMode: import("@angular/core").InputSignal<"fixed" | "full" | undefined>;
|
|
8582
8617
|
readonly maxHeight: import("@angular/core").InputSignal<string | number | undefined>;
|
|
8583
8618
|
readonly height: import("@angular/core").InputSignal<string | number | undefined>;
|
|
8584
|
-
readonly align: import("@angular/core").InputSignal<"
|
|
8619
|
+
readonly align: import("@angular/core").InputSignal<"left" | "center" | "right" | undefined>;
|
|
8585
8620
|
readonly padding: import("@angular/core").InputSignal<string | number | undefined>;
|
|
8586
8621
|
readonly paddingX: import("@angular/core").InputSignal<string | number | undefined>;
|
|
8587
8622
|
readonly paddingY: import("@angular/core").InputSignal<string | number | undefined>;
|
|
8588
8623
|
readonly margin: import("@angular/core").InputSignal<string | number | undefined>;
|
|
8589
8624
|
readonly marginX: import("@angular/core").InputSignal<string | number | undefined>;
|
|
8590
8625
|
readonly marginY: import("@angular/core").InputSignal<string | number | undefined>;
|
|
8591
|
-
readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" |
|
|
8626
|
+
readonly size: import("@angular/core").InputSignal<Size | "sm" | "md" | "lg" | undefined>;
|
|
8592
8627
|
readonly autofocus: import("@angular/core").InputSignal<boolean>;
|
|
8593
8628
|
data: import("@angular/core").InputSignal<T | undefined>;
|
|
8594
8629
|
readonly dataChange: import("@angular/core").OutputEmitterRef<T>;
|
|
@@ -8633,7 +8668,7 @@ export declare class SectionFormComponent<T extends object = Record<string, unkn
|
|
|
8633
8668
|
protected readonly handleSubmit: (event: Event) => void;
|
|
8634
8669
|
readonly resolvedSize: import("@angular/core").Signal<Size>;
|
|
8635
8670
|
protected readonly sizeLength: import("@angular/core").Signal<string | null>;
|
|
8636
|
-
readonly resolvedAlign: import("@angular/core").Signal<"
|
|
8671
|
+
readonly resolvedAlign: import("@angular/core").Signal<"left" | "center" | "right">;
|
|
8637
8672
|
readonly resolvedVariant: import("@angular/core").Signal<string | undefined>;
|
|
8638
8673
|
readonly resolvedMaxWidth: import("@angular/core").Signal<string | number | undefined>;
|
|
8639
8674
|
private readonly resolvedPadding;
|
|
@@ -10262,6 +10297,7 @@ export declare class RemoteComponent implements OnDestroy {
|
|
|
10262
10297
|
private readonly navRef;
|
|
10263
10298
|
private readonly reloadPage;
|
|
10264
10299
|
private readonly assetStore;
|
|
10300
|
+
private readonly appLogoState;
|
|
10265
10301
|
private loadedElement?;
|
|
10266
10302
|
/** Bumped per load, so an answer for a link since replaced is dropped. */
|
|
10267
10303
|
private loadId;
|
|
@@ -10314,6 +10350,8 @@ export declare class RemoteComponent implements OnDestroy {
|
|
|
10314
10350
|
private readonly carriesQuery;
|
|
10315
10351
|
private readonly remotePath;
|
|
10316
10352
|
private readonly ownTail;
|
|
10353
|
+
/** The mounted app's App Color — the `mm` everything inside this mount draws. */
|
|
10354
|
+
private readonly appColor;
|
|
10317
10355
|
constructor();
|
|
10318
10356
|
ngOnDestroy(): void;
|
|
10319
10357
|
private mountName;
|
|
@@ -10778,7 +10816,7 @@ export declare class ImgComponent {
|
|
|
10778
10816
|
readonly boxHeight: import("@angular/core").Signal<number | null>;
|
|
10779
10817
|
readonly isSized: import("@angular/core").Signal<boolean>;
|
|
10780
10818
|
readonly autoNgSrcset: import("@angular/core").Signal<string | undefined>;
|
|
10781
|
-
readonly status: import("@angular/core").WritableSignal<"
|
|
10819
|
+
readonly status: import("@angular/core").WritableSignal<"loading" | "loaded" | "error">;
|
|
10782
10820
|
readonly effectiveSrc: import("@angular/core").Signal<string | null | undefined>;
|
|
10783
10821
|
readonly showFallback: import("@angular/core").Signal<boolean>;
|
|
10784
10822
|
readonly isDataUri: import("@angular/core").Signal<boolean>;
|
|
@@ -11122,7 +11160,7 @@ export type DocAiPhase = 'idle' | 'asking' | 'question' | 'outline' | 'writing'
|
|
|
11122
11160
|
*/
|
|
11123
11161
|
export declare class DocEditorComponent implements ControlValueAccessor {
|
|
11124
11162
|
protected readonly groups: readonly import("@magmonium/one").DocToolbarGroup[];
|
|
11125
|
-
protected readonly icons: Record<"
|
|
11163
|
+
protected readonly icons: Record<"list" | "code" | "link" | "table" | "strike" | "bold" | "heading" | "italic" | "quote", string>;
|
|
11126
11164
|
protected readonly docActionKey: typeof docActionKey;
|
|
11127
11165
|
private readonly translate;
|
|
11128
11166
|
protected readonly value: import("@angular/core").WritableSignal<string>;
|
|
@@ -13007,6 +13045,15 @@ export type BreadcrumbTrail = {
|
|
|
13007
13045
|
* Browses into it while the row itself follows it (GLOSSARY.md Browse).
|
|
13008
13046
|
*/
|
|
13009
13047
|
browsable?: boolean;
|
|
13048
|
+
/**
|
|
13049
|
+
* A row standing for a mounted app draws that app's AppLogo instead of an
|
|
13050
|
+
* icon (nx ADR 0007) — its root carries no `icon:` of its own.
|
|
13051
|
+
*/
|
|
13052
|
+
appLogo?: {
|
|
13053
|
+
glyph: string | null;
|
|
13054
|
+
color: string | null;
|
|
13055
|
+
name: string;
|
|
13056
|
+
};
|
|
13010
13057
|
};
|
|
13011
13058
|
export type BreadCrumb = {
|
|
13012
13059
|
trail?: BreadcrumbTrail[];
|
|
@@ -13385,7 +13432,9 @@ export declare class FrameComponent {
|
|
|
13385
13432
|
navHasContent: import("@angular/core").Signal<boolean>;
|
|
13386
13433
|
currentWcConfig: import("@angular/core").Signal<import("dist/libs/cli/src").WebComponentConfig | undefined>;
|
|
13387
13434
|
currentIdentity: import("@angular/core").Signal<import("@magmonium/one").AppIdentity | undefined>;
|
|
13435
|
+
appLogoLink: import("@angular/core").Signal<string | undefined>;
|
|
13388
13436
|
appLogo: import("@angular/core").Signal<import("@magmonium/one").AppLogoSource | undefined>;
|
|
13437
|
+
appLogos: import("@angular/core").Signal<Record<string, import("@magmonium/one").AppLogoSource>>;
|
|
13389
13438
|
activeAppOpen: import("@angular/core").Signal<boolean>;
|
|
13390
13439
|
transparentNavIds: import("@angular/core").Signal<ReadonlySet<string>>;
|
|
13391
13440
|
resolvedNavMenuConfig: import("@angular/core").Signal<import("@magmonium/one").NavMenuConfig | null>;
|
|
@@ -13802,11 +13851,13 @@ export declare const NavStore: import("@angular/core").Type<{
|
|
|
13802
13851
|
}) | null>;
|
|
13803
13852
|
searchLabel: Signal<string | null>;
|
|
13804
13853
|
breadcrumb: Signal<BreadCrumb>;
|
|
13805
|
-
navMenus: Signal<
|
|
13854
|
+
navMenus: Signal<BreadcrumbTrail[]>;
|
|
13806
13855
|
navHasContent: Signal<boolean>;
|
|
13807
13856
|
currentWcConfig: Signal<WebComponentConfig$1 | undefined>;
|
|
13808
13857
|
currentIdentity: Signal<AppIdentity | undefined>;
|
|
13858
|
+
appLogoLink: Signal<string | undefined>;
|
|
13809
13859
|
appLogo: Signal<AppLogoSource | undefined>;
|
|
13860
|
+
appLogos: Signal<Record<string, AppLogoSource>>;
|
|
13810
13861
|
activeAppOpen: Signal<boolean>;
|
|
13811
13862
|
transparentNavIds: Signal<ReadonlySet<string>>;
|
|
13812
13863
|
resolvedNavMenuConfig: Signal<NavMenuConfig | null>;
|
|
@@ -14296,7 +14347,9 @@ export declare class NavDetailsComponent {
|
|
|
14296
14347
|
navHasContent: import("@angular/core").Signal<boolean>;
|
|
14297
14348
|
currentWcConfig: import("@angular/core").Signal<import("dist/libs/cli/src").WebComponentConfig | undefined>;
|
|
14298
14349
|
currentIdentity: import("@angular/core").Signal<import("@magmonium/one").AppIdentity | undefined>;
|
|
14350
|
+
appLogoLink: import("@angular/core").Signal<string | undefined>;
|
|
14299
14351
|
appLogo: import("@angular/core").Signal<import("@magmonium/one").AppLogoSource | undefined>;
|
|
14352
|
+
appLogos: import("@angular/core").Signal<Record<string, import("@magmonium/one").AppLogoSource>>;
|
|
14300
14353
|
activeAppOpen: import("@angular/core").Signal<boolean>;
|
|
14301
14354
|
transparentNavIds: import("@angular/core").Signal<ReadonlySet<string>>;
|
|
14302
14355
|
resolvedNavMenuConfig: import("@angular/core").Signal<import("@magmonium/one").NavMenuConfig | null>;
|
|
@@ -14555,7 +14608,9 @@ export declare class NavHeaderComponent {
|
|
|
14555
14608
|
navHasContent: import("@angular/core").Signal<boolean>;
|
|
14556
14609
|
currentWcConfig: import("@angular/core").Signal<import("dist/libs/cli/src").WebComponentConfig | undefined>;
|
|
14557
14610
|
currentIdentity: import("@angular/core").Signal<import("@magmonium/one").AppIdentity | undefined>;
|
|
14611
|
+
appLogoLink: import("@angular/core").Signal<string | undefined>;
|
|
14558
14612
|
appLogo: import("@angular/core").Signal<import("@magmonium/one").AppLogoSource | undefined>;
|
|
14613
|
+
appLogos: import("@angular/core").Signal<Record<string, import("@magmonium/one").AppLogoSource>>;
|
|
14559
14614
|
activeAppOpen: import("@angular/core").Signal<boolean>;
|
|
14560
14615
|
transparentNavIds: import("@angular/core").Signal<ReadonlySet<string>>;
|
|
14561
14616
|
resolvedNavMenuConfig: import("@angular/core").Signal<import("@magmonium/one").NavMenuConfig | null>;
|
|
@@ -15547,7 +15602,7 @@ type AvatarUser = {
|
|
|
15547
15602
|
};
|
|
15548
15603
|
export declare class UserAvatarComponent {
|
|
15549
15604
|
user: import("@angular/core").InputSignal<AvatarUser | null | undefined>;
|
|
15550
|
-
variant: import("@angular/core").InputSignal<"
|
|
15605
|
+
variant: import("@angular/core").InputSignal<"square" | "rounded">;
|
|
15551
15606
|
protected readonly name: import("@angular/core").Signal<string>;
|
|
15552
15607
|
protected readonly abbr: import("@angular/core").Signal<string>;
|
|
15553
15608
|
protected readonly profilePic: import("@angular/core").Signal<string | undefined>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-color-utl-D86GGpz5.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/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","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';\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((state, themeDetector = inject(ThemeDetector)) => {\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 const color = computed(() => theme()?.color);\n return {\n theme,\n color,\n osTheme,\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-icon-BgbtOdMv.mjs","names":["catchError"],"sources":["../../../../libs/one/src/lib/shared/lib/app-identity/app-logo-source.ts","../../../../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/lib/app-identity/app-logo-icon.ts","../../../../libs/one/src/lib/shared/lib/app-identity/logo-glyph.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":["import {\n inject,\n Injectable,\n InjectionToken,\n Signal,\n signal,\n} from '@angular/core';\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};\n\n/**\n * Where NavStore publishes the running app's AppLogo. Shared rather than read\n * off NavStore because `m-icon` sits below features and cannot import it.\n */\n@Injectable({ providedIn: 'root' })\nexport class AppLogoState {\n readonly #source = signal<AppLogoSource | undefined>(undefined);\n readonly source = this.#source.asReadonly();\n readonly set = (source: AppLogoSource | undefined): void =>\n this.#source.set(source);\n}\n\n/**\n * What `m-icon name=\"app_logo\"` draws. Defaults to what NavStore published; 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: () => inject(AppLogoState).source,\n});\n","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","/**\n * The reserved icon name that draws the running app's own AppLogo as a glyph\n * (GLOSSARY.md AppLogoIcon). Never an IconAsset or a file in `icons/`: `m-icon`\n * reads it from APP_LOGO_SOURCE instead of fetching anything. Its own file so\n * codegen can read it without Angular.\n */\nexport const APP_LOGO_ICON = 'app_logo';\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, '&').replace(/\"/g, '"').replace(/</g, '<');\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/** The AppLogo's shadow: App Color mixed with 20% black. */\nexport const appLogoShadowColor = (color: string): string =>\n `#${channels(color)\n .map((channel) =>\n Math.round(channel * 0.8)\n .toString(16)\n .padStart(2, '0')\n )\n .join('')}`;\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 booleanAttribute,\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';\nimport { APP_LOGO_ICON } from '../../../lib/app-identity/app-logo-icon';\nimport {\n APP_LOGO_SOURCE,\n AppLogoSource,\n} from '../../../lib/app-identity/app-logo-source';\nimport { logoGlyphMaskUrl } from '../../../lib/app-identity/logo-glyph';\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 readonly shadow = input<boolean | undefined, unknown>(undefined, {\n transform: booleanAttribute,\n });\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 const shadow = this.shadow();\n if (shadow !== undefined) overrides.shadow = shadow;\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: Element | 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 // `app_logo` draws the running app's own AppLogo (GLOSSARY.md AppLogoIcon):\n // nothing to fetch, and the LogoGlyph is painted through a mask rather than\n // inserted, so its markup never reaches the page (nx ADR 0007).\n private readonly appLogoSource = inject(APP_LOGO_SOURCE);\n private readonly appLogo = computed(() =>\n this.resolvedConfig()?.name === APP_LOGO_ICON\n ? this.appLogoSource() ?? {}\n : 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 === APP_LOGO_ICON) return of(undefined);\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 effect(this.applyShadow);\n }\n\n // On the host, not the glyph: a filter on the masked AppLogoIcon would be\n // clipped by its own mask. Sized off the icon box so it scales with it.\n private readonly applyShadow = (): void => {\n const style = this.elementRef.nativeElement.style;\n if (!this.resolvedConfig()?.shadow) {\n style.removeProperty('filter');\n return;\n }\n const color =\n this.pallet()?.color ?? this.themeStore.color()?.mm ?? '#fff';\n style.setProperty(\n 'filter',\n `drop-shadow(0 calc(var(--m-icon-size, 1em) * 0.08) calc(var(--m-icon-size, 1em) * 0.06) color-mix(in srgb, ${color} 80%, black))`\n );\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 color = this.pallet()?.color ?? this.themeStore.color()?.mm ?? '#fff';\n const appLogo = this.appLogo();\n if (appLogo) {\n this.currentSvgElement = appLogoElement(appLogo, color);\n element.prepend(this.currentSvgElement);\n return;\n }\n const svg = svgElementFromString(\n this.inlineSvg() ?? (this.text.value() as string),\n color\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\n// Inline styles, like the SVG above: an element built here carries no\n// encapsulation attribute, so the component's sass never reaches it.\nconst appLogoElement = (logo: AppLogoSource, color: string): HTMLElement => {\n const mark = document.createElement('span');\n mark.className = 'm-icon__app-logo';\n const style = mark.style;\n style.width = 'var(--m-icon-size, 1em)';\n style.height = 'var(--m-icon-size, 1em)';\n style.flexShrink = '0';\n const mask = logo.glyph\n ? logoGlyphMaskUrl(logo.glyph)\n : logo.src\n ? `url(\"${encodeURI(logo.src)}\")`\n : undefined;\n if (mask) {\n style.backgroundColor = color;\n style.setProperty('mask-image', mask);\n style.setProperty('mask-size', 'contain');\n style.setProperty('mask-repeat', 'no-repeat');\n style.setProperty('mask-position', 'center');\n return mark;\n }\n // No LogoGlyph yet: the first letter, as an AppLogo shows it.\n mark.textContent = (logo.name?.trim().charAt(0) ?? '').toUpperCase();\n style.display = 'inline-flex';\n style.alignItems = 'center';\n style.justifyContent = 'center';\n style.color = color;\n style.fontSize = 'calc(var(--m-icon-size, 1em) * 0.8)';\n style.fontWeight = '600';\n style.lineHeight = '1';\n return mark;\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":";;;;;;;;AAwBA,IAAa,eAAb,MAAa,aAAY;CACd,UAAU,OAAkC,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACtD,SAAS,KAAK,QAAQ,WAAU;CAChC,OAAO,WACd,KAAK,QAAQ,IAAI,MAAM;CAJd,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAY,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAZ,OAAA,QAAA,GAAA,sBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAY,YADC;CAAM,CAAA;;AACnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAY,YAAA,CAAA;EADxB,MAAA;EAAW,MAAA,CAAA,EAAE,YAAY,OAAM,CAAE;;;AAYlC,MAAa,kBAAkB,IAAI,eAEjC,mBAAmB;CACnB,YAAY;CACZ,eAAe,OAAO,YAAY,CAAC,CAAC;AACrC,CAAA;ACxCD,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;C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"}
|