@magmonium/one 0.4.46 → 0.4.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/i18n/af.json +53 -11
- package/assets/i18n/am.json +61 -15
- package/assets/i18n/ar.json +59 -27
- package/assets/i18n/as.json +56 -16
- package/assets/i18n/az.json +56 -14
- package/assets/i18n/ba.json +50 -11
- package/assets/i18n/be.json +53 -12
- package/assets/i18n/bg.json +54 -13
- package/assets/i18n/bn.json +64 -13
- package/assets/i18n/br.json +51 -10
- package/assets/i18n/brx.json +50 -1
- package/assets/i18n/bs.json +55 -14
- package/assets/i18n/ca.json +53 -11
- package/assets/i18n/ceb.json +57 -14
- package/assets/i18n/cnr.json +54 -12
- package/assets/i18n/co.json +56 -14
- package/assets/i18n/cs.json +54 -11
- package/assets/i18n/cy.json +49 -11
- package/assets/i18n/da.json +54 -11
- package/assets/i18n/de.json +50 -21
- package/assets/i18n/doi.json +55 -13
- package/assets/i18n/el.json +55 -14
- package/assets/i18n/en.json +2 -2
- package/assets/i18n/eo.json +55 -12
- package/assets/i18n/es.json +51 -24
- package/assets/i18n/et.json +50 -8
- package/assets/i18n/eu.json +54 -12
- package/assets/i18n/fa.json +53 -12
- package/assets/i18n/fi.json +53 -11
- package/assets/i18n/fr.json +54 -24
- package/assets/i18n/fy.json +56 -12
- package/assets/i18n/ga.json +50 -11
- package/assets/i18n/gd.json +52 -13
- package/assets/i18n/gl.json +56 -12
- package/assets/i18n/gu.json +64 -13
- package/assets/i18n/ha.json +58 -13
- package/assets/i18n/haw.json +48 -12
- package/assets/i18n/he.json +51 -10
- package/assets/i18n/hi.json +61 -26
- package/assets/i18n/hmn.json +53 -12
- package/assets/i18n/hr.json +54 -11
- package/assets/i18n/hu.json +54 -13
- package/assets/i18n/hy.json +59 -12
- package/assets/i18n/id.json +48 -9
- package/assets/i18n/ie.json +48 -2
- package/assets/i18n/ig.json +50 -9
- package/assets/i18n/ilo.json +40 -9
- package/assets/i18n/is.json +53 -11
- package/assets/i18n/it.json +50 -21
- package/assets/i18n/iw.json +51 -10
- package/assets/i18n/ja.json +56 -26
- package/assets/i18n/jw.json +48 -10
- package/assets/i18n/ka.json +54 -10
- package/assets/i18n/kk.json +49 -10
- package/assets/i18n/km.json +53 -12
- package/assets/i18n/kn.json +62 -11
- package/assets/i18n/ko.json +53 -22
- package/assets/i18n/kok.json +53 -11
- package/assets/i18n/ks.json +49 -1
- package/assets/i18n/ku.json +52 -13
- package/assets/i18n/ky.json +52 -12
- package/assets/i18n/la.json +52 -9
- package/assets/i18n/lb.json +54 -9
- package/assets/i18n/lo.json +50 -9
- package/assets/i18n/lt.json +55 -10
- package/assets/i18n/lv.json +54 -9
- package/assets/i18n/ma.json +54 -1
- package/assets/i18n/mai.json +50 -10
- package/assets/i18n/me.json +49 -0
- package/assets/i18n/mg.json +55 -10
- package/assets/i18n/mi.json +55 -12
- package/assets/i18n/mk.json +52 -8
- package/assets/i18n/ml.json +59 -8
- package/assets/i18n/mn.json +54 -10
- package/assets/i18n/mni.json +52 -0
- package/assets/i18n/mr.json +61 -10
- package/assets/i18n/ms.json +52 -8
- package/assets/i18n/mt.json +54 -10
- package/assets/i18n/my.json +54 -11
- package/assets/i18n/ne.json +53 -10
- package/assets/i18n/nl.json +51 -22
- package/assets/i18n/no.json +52 -9
- package/assets/i18n/ny.json +53 -11
- package/assets/i18n/or.json +61 -9
- package/assets/i18n/pa.json +61 -9
- package/assets/i18n/pl.json +48 -20
- package/assets/i18n/ps.json +50 -8
- package/assets/i18n/pt.json +50 -20
- package/assets/i18n/rm.json +50 -1
- package/assets/i18n/ro.json +52 -10
- package/assets/i18n/ru.json +50 -20
- package/assets/i18n/sa.json +54 -11
- package/assets/i18n/sat.json +55 -11
- package/assets/i18n/sc.json +50 -1
- package/assets/i18n/sd.json +48 -10
- package/assets/i18n/si.json +50 -12
- package/assets/i18n/sk.json +48 -9
- package/assets/i18n/sl.json +46 -7
- package/assets/i18n/sm.json +52 -12
- package/assets/i18n/sn.json +48 -9
- package/assets/i18n/so.json +50 -11
- package/assets/i18n/sq.json +57 -9
- package/assets/i18n/sr.json +49 -11
- package/assets/i18n/st.json +47 -10
- package/assets/i18n/su.json +49 -11
- package/assets/i18n/sv.json +44 -6
- package/assets/i18n/sw.json +33 -10
- package/assets/i18n/ta.json +61 -10
- package/assets/i18n/te.json +62 -11
- package/assets/i18n/tg.json +50 -11
- package/assets/i18n/th.json +51 -12
- package/assets/i18n/tl.json +51 -9
- package/assets/i18n/tr.json +49 -23
- package/assets/i18n/uk.json +47 -9
- package/assets/i18n/ur.json +54 -11
- package/assets/i18n/uz.json +49 -11
- package/assets/i18n/vi.json +47 -7
- package/assets/i18n/xh.json +50 -13
- package/assets/i18n/yi.json +51 -11
- package/assets/i18n/yo.json +51 -11
- package/assets/i18n/zh.json +52 -25
- package/assets/i18n/zu.json +48 -10
- package/assets/icons/svg.json +1 -0
- package/assets/icons/wrench.svg +3 -0
- package/assets/index.json +1 -1
- package/assets/modal/authenticate.json +1 -1
- package/fesm2022/{magmonium-one-attribute-value-C1lqou2L.mjs → magmonium-one-attribute-value-DnctyCKp.mjs} +3 -3
- package/fesm2022/{magmonium-one-attribute-value-C1lqou2L.mjs.map → magmonium-one-attribute-value-DnctyCKp.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-checkbox-CIxAiA4Q.mjs → magmonium-one-base-checkbox-D3Z1FTXU.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-checkbox-CIxAiA4Q.mjs.map → magmonium-one-base-checkbox-D3Z1FTXU.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-dropdown-XpTWe4Ii.mjs → magmonium-one-base-dropdown-DIaimBpG.mjs} +10 -10
- package/fesm2022/{magmonium-one-base-dropdown-XpTWe4Ii.mjs.map → magmonium-one-base-dropdown-DIaimBpG.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-input-C1Ek0Ezm.mjs → magmonium-one-base-input-CZyIcKrn.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-input-C1Ek0Ezm.mjs.map → magmonium-one-base-input-CZyIcKrn.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-text-Di2V2ojp.mjs → magmonium-one-base-text-6T8KrJbz.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-text-Di2V2ojp.mjs.map → magmonium-one-base-text-6T8KrJbz.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-button-DZ4wCJgb.mjs → magmonium-one-button-BKGxIBhw.mjs} +7 -7
- package/fesm2022/{magmonium-one-button-DZ4wCJgb.mjs.map → magmonium-one-button-BKGxIBhw.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-checkbox-R-hPZrCa.mjs → magmonium-one-checkbox-D1W18OGo.mjs} +5 -5
- package/fesm2022/{magmonium-one-checkbox-R-hPZrCa.mjs.map → magmonium-one-checkbox-D1W18OGo.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-color-utl-DI5p24iQ.mjs → magmonium-one-color-utl-DklqRa3m.mjs} +38 -13
- package/fesm2022/magmonium-one-color-utl-DklqRa3m.mjs.map +1 -0
- package/fesm2022/{magmonium-one-directives-B93p5bAL.mjs → magmonium-one-directives-R099YTUd.mjs} +217 -217
- package/fesm2022/magmonium-one-directives-R099YTUd.mjs.map +1 -0
- package/fesm2022/{magmonium-one-group-B7YeUd1u.mjs → magmonium-one-group-Blvejahi.mjs} +7 -7
- package/fesm2022/{magmonium-one-group-B7YeUd1u.mjs.map → magmonium-one-group-Blvejahi.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-header-DUiBhPUP.mjs → magmonium-one-header-qoXWebFN.mjs} +4 -4
- package/fesm2022/{magmonium-one-header-DUiBhPUP.mjs.map → magmonium-one-header-qoXWebFN.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-icon-C3jwzbb2.mjs → magmonium-one-icon-Ce44a1mo.mjs} +5 -4
- package/fesm2022/magmonium-one-icon-Ce44a1mo.mjs.map +1 -0
- package/fesm2022/{magmonium-one-image-editor-BRTk8i4O.mjs → magmonium-one-image-editor-DKiscgQU.mjs} +4 -4
- package/fesm2022/{magmonium-one-image-editor-BRTk8i4O.mjs.map → magmonium-one-image-editor-DKiscgQU.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-label-D_rU82nD.mjs → magmonium-one-label-lYMBMB7p.mjs} +2 -2
- package/fesm2022/{magmonium-one-label-D_rU82nD.mjs.map → magmonium-one-label-lYMBMB7p.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-m-ref-CEms7B6-.mjs → magmonium-one-m-ref-DVe-WAYR.mjs} +2 -2
- package/fesm2022/{magmonium-one-m-ref-CEms7B6-.mjs.map → magmonium-one-m-ref-DVe-WAYR.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-menu-cO34OcJc.mjs → magmonium-one-menu-DcqfcU1p.mjs} +6 -6
- package/fesm2022/{magmonium-one-menu-cO34OcJc.mjs.map → magmonium-one-menu-DcqfcU1p.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-multi-range-Bq3_3NHg.mjs → magmonium-one-multi-range-m86SzSZO.mjs} +3 -3
- package/fesm2022/{magmonium-one-multi-range-Bq3_3NHg.mjs.map → magmonium-one-multi-range-m86SzSZO.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-options-asset-BMd7W0Mk.mjs → magmonium-one-options-asset-CIKSNq4B.mjs} +2 -2
- package/fesm2022/{magmonium-one-options-asset-BMd7W0Mk.mjs.map → magmonium-one-options-asset-CIKSNq4B.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-otp-V2tFztLx.mjs → magmonium-one-otp-BrR0mijm.mjs} +5 -5
- package/fesm2022/{magmonium-one-otp-V2tFztLx.mjs.map → magmonium-one-otp-BrR0mijm.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-password-IdllPMUw.mjs → magmonium-one-password-CKIAFzs9.mjs} +6 -6
- package/fesm2022/{magmonium-one-password-IdllPMUw.mjs.map → magmonium-one-password-CKIAFzs9.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-radio-BAL3-3j5.mjs → magmonium-one-radio-6oN9j_F6.mjs} +3 -3
- package/fesm2022/{magmonium-one-radio-BAL3-3j5.mjs.map → magmonium-one-radio-6oN9j_F6.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-range-Cf7yUnhN.mjs → magmonium-one-range-BmimLpG6.mjs} +4 -4
- package/fesm2022/{magmonium-one-range-Cf7yUnhN.mjs.map → magmonium-one-range-BmimLpG6.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-selector-DAEI_0JX.mjs → magmonium-one-selector-CLSwVQCJ.mjs} +4 -4
- package/fesm2022/{magmonium-one-selector-DAEI_0JX.mjs.map → magmonium-one-selector-CLSwVQCJ.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-size-converter-BOBD8nHy.mjs → magmonium-one-size-converter-DFIowQHO.mjs} +13 -2
- package/fesm2022/magmonium-one-size-converter-DFIowQHO.mjs.map +1 -0
- package/fesm2022/{magmonium-one-text-BnTkYLJe.mjs → magmonium-one-text-evdqwPEz.mjs} +6 -6
- package/fesm2022/{magmonium-one-text-BnTkYLJe.mjs.map → magmonium-one-text-evdqwPEz.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-text-output-BZU61QIF.mjs → magmonium-one-text-output-BnS5Skz-.mjs} +4 -4
- package/fesm2022/{magmonium-one-text-output-BZU61QIF.mjs.map → magmonium-one-text-output-BnS5Skz-.mjs.map} +1 -1
- package/fesm2022/magmonium-one-theme-DPBeYB-G.mjs +1 -0
- package/fesm2022/{magmonium-one-toggle-V_YnZXx5.mjs → magmonium-one-toggle-BIoiSggh.mjs} +3 -3
- package/fesm2022/{magmonium-one-toggle-V_YnZXx5.mjs.map → magmonium-one-toggle-BIoiSggh.mjs.map} +1 -1
- package/fesm2022/magmonium-one.mjs +13780 -13130
- package/fesm2022/magmonium-one.mjs.map +1 -1
- package/package.json +1 -1
- package/types/magmonium-one.d.ts +194 -39
- package/fesm2022/magmonium-one-color-utl-DI5p24iQ.mjs.map +0 -1
- package/fesm2022/magmonium-one-directives-B93p5bAL.mjs.map +0 -1
- package/fesm2022/magmonium-one-icon-C3jwzbb2.mjs.map +0 -1
- package/fesm2022/magmonium-one-size-converter-BOBD8nHy.mjs.map +0 -1
- package/fesm2022/magmonium-one-theme-DYvNIWmo.mjs +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magmonium-one-size-converter-DFIowQHO.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/enum/scaling/size.ts","../../../../libs/one/src/lib/shared/enum/assets/assets.ts","../../../../libs/one/src/lib/shared/enum/assets/layout-asset-folder.ts","../../../../libs/one/src/lib/shared/enum/assets/form-asset-folder.ts","../../../../libs/one/src/lib/shared/config/tokens.ts","../../../../libs/one/src/lib/shared/lib/remote/web-util.ts","../../../../libs/one/src/lib/shared/functions/remote-url.ts","../../../../libs/one/src/lib/shared/services/http.ts","../../../../libs/one/src/lib/shared/functions/object/json.ts","../../../../libs/one/src/lib/shared/services/storage.ts","../../../../libs/one/src/lib/shared/config/service-registry.ts","../../../../libs/one/src/lib/shared/stores/asset.store.ts","../../../../libs/one/src/lib/shared/functions/text/mini-mark.ts","../../../../libs/one/src/lib/shared/functions/browser-locale.ts","../../../../libs/one/src/lib/shared/services/browser-locale.ts","../../../../libs/one/src/lib/shared/services/translate.ts","../../../../libs/one/src/lib/shared/pipe/translate.ts","../../../../libs/one/src/lib/shared/functions/size/size-converter.ts"],"sourcesContent":["/**\n * The three scale steps the design system renders, and the only ones — see\n * GLOSSARY.md `Size` and ADR 0008. Declarable on a Section or a ButtonGroup and\n * nowhere else (a SectionButtonGroup shares the latter seat, being its\n * markup-composed variant); everything below one renders at its Size.\n */\nexport enum Size {\n SMALL = 'sm',\n MEDIUM = 'md',\n LARGE = 'lg',\n}\n\nexport const DEFAULT_SIZE = Size.MEDIUM;\n","export enum Assets {\n JSON = 'json',\n SVG = 'svg',\n PNG = 'png',\n CSS = 'css',\n /** A DocAsset — markdown, copied verbatim rather than compiled. */\n MD = 'md',\n}\n","// Single source for the layout primitives' asset subFolder — each\n// primitive's ConfigComponent.subFolder reads from here, and the m-one-ui\n// Design editor's codegen reads the same const when emitting ControlAssets,\n// so the two never drift apart (see libs/one ADR 0004).\nexport const LAYOUT_ASSET_FOLDER = {\n section: 'sections',\n row: 'rows',\n col: 'cols',\n flex: 'flex_containers',\n flex_item: 'flex_items',\n // Not `button_groups` — those files carry `names`, `buttons`, `isContext`,\n // `primary` and `size`, none of which a SectionButtonGroup reads (ADR 0009).\n section_button_group: 'section_button_groups',\n section_hero: 'section_heroes',\n section_carousel: 'section_carousels',\n text_output: 'text_outputs',\n list: 'lists',\n section_table: 'section_tables',\n} as const;\n","// Single source for the asset subFolders a form and its Fields resolve by —\n// FormGroupComponent and WrapperInputComponent read from here, and the\n// m-one-ui Design editor's codegen reads the same const when emitting a\n// FormControl's and a FieldControl's assets, so the two never drift apart\n// (same reason as LAYOUT_ASSET_FOLDER, libs/one ADR 0004).\nexport const FORM_ASSET_FOLDER = {\n form: 'forms',\n field: 'fields',\n // Choices a Field points at by name, shared across every form that names\n // the same list (AssetOptions).\n options: 'options',\n // Shapes a Field's value may take, named the same way and resolved at build\n // rather than at runtime (AssetPatterns, libs/one ADR 0017).\n patterns: 'patterns',\n} as const;\n","import {\n InjectionToken,\n Signal,\n Type,\n WritableSignal,\n signal,\n} from '@angular/core';\nimport type { MountRoute, RemoteMount } from '../lib/remote/model';\nimport type { AppIdentity } from '../lib/app-identity/model';\nimport type { LoadingActionsApi, SessionRenewal } from './service-registry';\n\nexport interface NavStoreRef {\n /** Current NavId — route's NavId plus any open Murl segments. */\n id: Signal<string | undefined>;\n /**\n * The Nav the open panel *is*, once an anchored Murl has fallen through to\n * the panel that answered it — or the Nav a Browse moved it onto. What a\n * toggle compares itself against: `id` is the address's own key and names no\n * node when a panel was opened over a page.\n */\n panelNavId?: Signal<string | undefined>;\n /**\n * `panelNavId` with any Browse left out — where the User stands rather than\n * where they are looking (GLOSSARY.md Browse). What a row marks itself\n * against, so the row they came through stays marked while they Browse.\n * Optional: a host built before it existed provides none.\n */\n standingNavId?: Signal<string | undefined>;\n /** Open Murl segments. Empty means no panel is addressed. */\n murl: Signal<string[]>;\n /**\n * Whether the panel is up — an open Murl or one the User raised. What a move\n * reads to keep an open panel without raising a closed one. Optional: a host\n * built before it existed provides none.\n */\n isNavOpened?: Signal<boolean>;\n /**\n * The Router's current path parameters. A row of a `dynamic` Nav names the\n * node like every other row of that Nav, so this is the only thing that\n * tells the one being stood on from its siblings.\n */\n routeParams?: Signal<Record<string, string>>;\n /**\n * Follows a NavRef by NavId; `undefined` closes the panel. `params` supplies\n * values for any dynamic segment on the way — a NavRef names the node, the\n * instance is data.\n */\n setSelected: (\n navId?: string,\n params?: Record<string, string | number>,\n options?: { keepPanel?: boolean }\n ) => void;\n /**\n * Moves the open panel onto a Nav without moving the User — the Address and\n * the Page stay put (GLOSSARY.md Browse). `params` names the instance of a\n * `dynamic` Nav. Optional: a host built before it existed provides none.\n */\n browse?: (navId: string, params?: Record<string, string | number>) => void;\n /**\n * Follows a NavRef whose dynamic segments are keyed by the Nav contributing\n * each one rather than by parameter name — what an emitted OutcomeNav calls\n * (m-one-ui GLOSSARY.md OutcomeNav). Optional: a host built before it existed\n * provides none, and the gesture then does nothing rather than throwing.\n */\n followNav?: (\n navId: string,\n byNav?: Record<string, string | number>,\n options?: { replaceUrl?: boolean; keepPanel?: boolean }\n ) => void;\n /** Up to the nearest ancestor of the current page that routes. */\n goToParentNav?: (options?: { replaceUrl?: boolean }) => void;\n /** The current value of the route parameter one dynamic Nav contributes. */\n routeParamOf?: (navId: string) => string | undefined;\n /**\n * Whether the routed page is this Nav or one below it. Signal-backed, so a\n * `computed` reading it follows navigation. Optional for `followNav`'s reason.\n */\n isNavActive?: (navId: string) => boolean;\n /** A mounted Remote announcing itself, and leaving (ADR 0036). */\n registerMount?: (mount: RemoteMount) => void;\n unregisterMount?: (name: string, navigate?: RemoteMount['navigate']) => void;\n /**\n * Where a mount's own Router stands, reported on each move; `undefined`\n * forgets it. Optional: a host built before it existed provides none.\n */\n setMountRoute?: (name: string, route: MountRoute | undefined) => void;\n /**\n * Writes an app's App Identity over the one held — what an Owner's save\n * hands back, so every AppLogo drawn from it follows. Optional: a host built\n * before it existed provides none.\n */\n setIdentity?: (identity: AppIdentity) => void;\n}\n\nexport enum AppRelationType {\n OWNER = 1,\n COLLABORATOR = 2,\n USER = 3,\n COLLABORATE_REQUESTED = 4,\n INSTALL_REQUESTED = 5,\n INSTALL_REJECTED = 6,\n COLLABORATE_REJECTED = 7,\n}\n\nexport type AppRelation = {\n id: string;\n user: string;\n app: string;\n type: AppRelationType;\n validTill: string | null;\n};\n\n/**\n * One Permission an App may declare — a catalog entry naming a kind of\n * cross-context data access (store ADR 0006). `nameKey` is the short code an\n * App stores in its Declared Permissions (`wr`) and is never translated;\n * `descriptionKey` is the i18n key users see.\n */\nexport interface AppPermission {\n nameKey: string;\n descriptionKey: string;\n}\n\n/** The caller's Relation to one App as `store/app/<link>/relation` answers it. */\nexport interface AppRelationView {\n app: string;\n type: AppRelationType | null;\n /** Open App: asks no Relation, Agreement or Country Restriction — the App just opens. */\n open?: boolean;\n /** The App's apis refuse until the caller agrees to its Declared Permissions again. */\n needsAgreement: boolean;\n /** The App's Declared Permissions — what an Agreement accepts, all at once. */\n permissions: AppPermission[];\n /**\n * Relation Language as resolved — the language the App runs in for the\n * caller; null when nothing resolves and the client picks from the Browser\n * Locale and `supportedLanguages`.\n */\n language: string | null;\n /**\n * The App's Default Language — where its keys come from when it ships none\n * for `language`; null when the Owner named none.\n */\n defaultLanguage: string | null;\n /** The App's Supported Languages in platform order. */\n supportedLanguages: string[];\n /** The App's Country Restriction refuses the caller; the App must not open. */\n countryBlocked: boolean;\n}\n\n/**\n * A mode + list rule — `allow` keeps only the listed codes, `block` drops\n * them; an empty `block` list is All. Country Restriction lists ISO 3166-1\n * alpha-2 codes, Supported Languages platform language codes.\n */\nexport interface AppCodeRule {\n mode: 'allow' | 'block';\n list: string[];\n}\n\n/** Who may use an App, stored and sent as its number. `OPEN` Apps are embedded by other Apps as their own. */\nexport enum AppAvailability {\n EVERYONE = 1,\n TEAM_ONLY = 2,\n ONLY_ME = 3,\n OPEN = 4,\n}\n\n/** What every user of an App is bound by, as `store/app/<id>/permission` answers it. */\nexport interface AppRules {\n availability: AppAvailability;\n permissions: AppPermission[];\n countries: AppCodeRule;\n languages: AppCodeRule & { default: string | null };\n}\n\nexport interface AppContextRef {\n user: Signal<SharedUser | undefined>;\n isVisitor: Signal<boolean>;\n isUser: Signal<boolean>;\n isCollaborator: Signal<boolean>;\n isManager: Signal<boolean>;\n}\n\nexport interface SharedToken {\n auth: string;\n refresh: string;\n}\n\nexport interface SharedUser {\n firstName: string;\n lastName: string;\n profilePic?: string;\n lang?: string;\n id: string;\n username?: string;\n dob?: string;\n}\n\nexport interface LoginStoreContract {\n tokens: Signal<SharedToken | undefined>;\n userId: Signal<string | undefined>;\n initApp(data: {\n navs: string[];\n tokens?: SharedToken;\n user?: SharedUser;\n }): void;\n setTokens(tokens: SharedToken): void;\n clearAuth(): void;\n loadSavedLoginIds(): void;\n isLoggedIn: Signal<boolean>;\n // The signed-in User's Deploy Token, shared with remotes (the design editor)\n // so every app reads the one the host minted this session.\n deployToken: Signal<string | undefined>;\n hasDeployToken: Signal<boolean>;\n ensureDeployToken: () => void;\n rotateDeployToken: () => void;\n}\n\nexport const LOGIN_COMPONENT = new InjectionToken<Type<unknown>>(\n 'LOGIN_COMPONENT'\n);\nexport const LOGIN_STORE = new InjectionToken<LoginStoreContract>(\n 'LOGIN_STORE'\n);\n/**\n * True inside a Remote's own bundle (`provideMagWcConfig`). Where it is mounted\n * is the host's MountPattern, so the base href no longer tells a Remote apart.\n */\nexport const WC_BUNDLE = new InjectionToken<boolean>('WC_BUNDLE');\n/**\n * The session renewal of the app this one is mounted in, or `null` when this\n * app owns its session. Set, the session is that host's: this app never calls\n * `auth/*` itself — no `init`, no `refresh` — and renews through the host.\n */\nexport const HOST_SESSION = new InjectionToken<SessionRenewal | null>(\n 'HOST_SESSION',\n { providedIn: 'root', factory: () => null }\n);\nexport const ASSET_BASE_URL = new InjectionToken<string>('ASSET_BASE_URL');\nexport const ONE_ASSET_BASE_URL = new InjectionToken<string>(\n 'ONE_ASSET_BASE_URL'\n);\nexport const SEARCH_QUERY = new InjectionToken<WritableSignal<string>>(\n 'SEARCH_QUERY'\n);\nexport const SEARCH_RESULTS_EVENT = '__mag_search_results__';\nexport const WC_SEARCH_GROUPS = new InjectionToken<\n Signal<{ key: string; label: string; items: unknown[] }[]>\n>('WC_SEARCH_GROUPS');\nexport const NAV_STORE_REF = new InjectionToken<NavStoreRef>('NAV_STORE_REF');\n\nexport interface ModalStoreTrigger {\n component: Type<unknown>;\n bindings?: unknown[];\n name?: string;\n one?: boolean;\n id?: string;\n providers?: unknown[];\n config?: unknown;\n}\n\nexport interface ModalStoreRef {\n modalTriggerMap: Signal<Record<string, unknown>>;\n open: (trigger: ModalStoreTrigger) => string;\n // Same trigger shape as `open`, presented as a SidePanel instead. On the\n // contract because a field can now choose its presentation, and the token is\n // all a ComponentInput sees of the store.\n openPanel: (trigger: ModalStoreTrigger & { width?: string }) => string;\n close: (id?: string) => void;\n closePanel: (id?: string) => void;\n}\n\nexport const MODAL_STORE_REF = new InjectionToken<ModalStoreRef>(\n 'MODAL_STORE_REF'\n);\n\nexport interface UserStoreRef {\n get: (\n id: string\n ) => Signal<\n { firstName?: string; lastName?: string; username?: string } | undefined\n >;\n}\n\nexport const USER_STORE_REF = new InjectionToken<UserStoreRef>(\n 'USER_STORE_REF'\n);\n\nexport const APP_CONTEXT_REF = new InjectionToken<AppContextRef>(\n 'APP_CONTEXT_REF'\n);\n\n/**\n * This application's own AppLink. `root` is per bootstrapped app, so a Remote\n * never reads its host's — unlike NavStore's `appLink`, which is the host's\n * active app. The interceptor names the App in `X-Mag-App` with it (api ADR\n * 0007) and init asks for Agreement to it.\n */\nexport const APP_LINK = new InjectionToken<WritableSignal<string | undefined>>(\n 'APP_LINK',\n { providedIn: 'root', factory: () => signal<string | undefined>(undefined) }\n);\n\n/**\n * The loading counter this application's requests move, ahead of the host's\n * shared one. A Plugin provides its own so its requests never turn the host's\n * `busy` on (libs/one GLOSSARY.md Plugin); unset, the host's counter is used.\n */\nexport const LOADING_ACTIONS_REF = new InjectionToken<LoadingActionsApi>(\n 'LOADING_ACTIONS_REF'\n);\n\nexport const IS_SIDE_PANEL = new InjectionToken<boolean>('IS_SIDE_PANEL');\n\n// SVG markup supplied by name from memory instead of fetched as an asset.\n// `m-icon` reads it before its own resource, so a glyph that exists only in a\n// host app's state still renders everywhere an asset-backed one would. Signal\n// valued on purpose: editing the markup under an unchanged name repaints every\n// icon using it, which a one-shot fetch could never do.\nexport const ICON_SOURCE = new InjectionToken<\n Signal<Record<string, string> | undefined>\n>('ICON_SOURCE');\n\n// Translations supplied by key from memory instead of fetched as an asset,\n// for the language currently being rendered. `TranslateService` reads it ahead\n// of its own fetched map, so a key that exists only in a host app's state — a\n// visual editor's unsaved messages, say — resolves everywhere a fetched one\n// would. Signal valued for the same reason as ICON_SOURCE: editing the text\n// under an unchanged key repaints every string using it.\nexport const TRANSLATION_SOURCE = new InjectionToken<\n Signal<Record<string, string> | undefined>\n>('TRANSLATION_SOURCE');\n\n// Option lists supplied by name from memory instead of fetched as an\n// `options/<name>` asset. Every Field that names an OptionsSource (`mOptions`\n// / `optionsAsset:`) reads this ahead of its own fetch, so a list that exists\n// only in a host app's state — a visual editor's unsaved OptionSets — fills the\n// same Fields a shipped asset would. Rows carry the asset's own shape, flat or\n// rows-of-rows. Signal valued for the same reason as ICON_SOURCE: editing rows\n// under an unchanged name repaints every Field using it.\nexport const OPTIONS_SOURCE = new InjectionToken<\n Signal<Record<string, unknown> | undefined>\n>('OPTIONS_SOURCE');\n\n// Maps a `component:` name in a field asset to the component that field opens,\n// so a ComponentInput stays YAML-declared like every other field instead of\n// needing the class threaded down through `[elements]` at every call site.\nexport const COMPONENT_INPUT_REGISTRY = new InjectionToken<\n Record<string, Type<unknown>>\n>('COMPONENT_INPUT_REGISTRY');\n\n/** Optional hook when a FileUploadInput in folder mode picks a directory handle. */\nexport type FolderPickListener = (handle: unknown, name: string) => void;\nexport const FOLDER_PICK_LISTENER = new InjectionToken<FolderPickListener>(\n 'FOLDER_PICK_LISTENER'\n);\n\n// DesignMode: marks a subtree as rendered inside a visual editor's canvas rather\n// than on a real page. Carries no payload — presence is the whole signal. Provided\n// only by the editor's renderer, so every consumer must inject it as optional.\nexport const IS_DESIGN_MODE = new InjectionToken<boolean>('IS_DESIGN_MODE');\n","import { WebComponentConfig } from './model';\n\nexport function isWebComponent(config: unknown): config is WebComponentConfig {\n if (!config || typeof config !== 'object') {\n return false;\n }\n return 'selector' in config;\n}\n\nconst PREVIEW_PATH_RE = /\\/pwa\\/(draft|beta|published)(?:\\/|$)/;\nconst PREVIEW_TIERS = new Set(['draft', 'beta', 'published']);\n\nfunction getTierFromSearch(search: string): string | null {\n const tier = new URLSearchParams(search).get('tier');\n return tier && PREVIEW_TIERS.has(tier) ? tier : null;\n}\n\nexport function isTierPreview(pathname?: string, search?: string): boolean {\n if (pathname !== undefined && PREVIEW_PATH_RE.test(pathname)) return true;\n if (search !== undefined && !!getTierFromSearch(search)) return true;\n return false;\n}\n\nexport function getTierFromPreviewPath(pathname: string, search?: string): string | null {\n return PREVIEW_PATH_RE.exec(pathname)?.[1] ?? (search ? getTierFromSearch(search) : null);\n}\n\nexport const isLocalhost =\n typeof window !== 'undefined' &&\n (window.location.hostname === 'localhost' ||\n window.location.hostname === '127.0.0.1' ||\n window.location.hostname === '0.0.0.0');\n\nexport function isUrlLocalhost(url: string): boolean {\n try {\n const host = new URL(url).hostname;\n return host === 'localhost' || host === '127.0.0.1' || host === '0.0.0.0';\n } catch {\n return false;\n }\n}\n\n","import { isLocalhost } from '../lib/remote/web-util';\n\n/**\n * Where an app is mounted from instead of its status folder: the Store's beta\n * tier, or a dev server on this machine (`local`, at the port pinned beside it).\n */\nexport type WcTier = 'beta' | 'local';\n\ntype TierWindow = Window & {\n __MAGMONIUM_STANDALONE__?: boolean;\n /**\n * The tier each AppLink is mounted from. On `window` rather than a service:\n * the host and every Remote bundle carry their own libs/one, and all of them\n * build that Remote's URLs.\n */\n __MAGMONIUM_WC_TIERS__?: Record<string, WcTier>;\n /** The dev-server port each AppLink pinned to `local` is served from. */\n __MAGMONIUM_WC_LOCAL_PORTS__?: Record<string, number>;\n /**\n * The tier whose bundle defined each custom-element tag. A page has one\n * registry and a tag defines once, so a second tier of one app cannot load\n * beside the first — it can only be noticed.\n */\n __MAGMONIUM_WC_DEFINED_TIERS__?: Record<string, WcTier | 'status'>;\n /**\n * The bundle file — hash and all — that defined each tag. Two tiers serving\n * one bundle (an app in Beta: its status folder *is* its beta folder) are\n * the same code, so the tag already defined is the one asked for.\n */\n __MAGMONIUM_WC_DEFINED_BUNDLES__?: Record<string, string>;\n};\n\nconst tierWindow = (): TierWindow | undefined =>\n typeof window !== 'undefined' ? (window as TierWindow) : undefined;\n\n/** Pins an AppLink to a tier, or back to its status folder with `undefined`. */\nexport function setWcTier(remoteId: string, tier: WcTier | undefined): void {\n const win = tierWindow();\n if (!win) return;\n const tiers = { ...(win.__MAGMONIUM_WC_TIERS__ ?? {}) };\n if (tier) tiers[remoteId] = tier;\n else delete tiers[remoteId];\n win.__MAGMONIUM_WC_TIERS__ = tiers;\n}\n\n/** Pins an AppLink's `local` tier to a dev-server port, or unpins it. */\nexport function setWcLocalPort(remoteId: string, port: number | undefined): void {\n const win = tierWindow();\n if (!win) return;\n const ports = { ...(win.__MAGMONIUM_WC_LOCAL_PORTS__ ?? {}) };\n if (port) ports[remoteId] = port;\n else delete ports[remoteId];\n win.__MAGMONIUM_WC_LOCAL_PORTS__ = ports;\n}\n\n/**\n * Where an AppLink pinned to `local` is served: the app's own dev server, whose\n * `assets/` holds `remote/app-wc.json`, the bundle and every asset. Undefined\n * when it is not pinned there, or has no usable port.\n */\nexport function wcLocalBaseOf(remoteId: string): string | undefined {\n const win = tierWindow();\n if (win?.__MAGMONIUM_WC_TIERS__?.[remoteId] !== 'local') return undefined;\n const port = win.__MAGMONIUM_WC_LOCAL_PORTS__?.[remoteId];\n return port && Number.isInteger(port) && port > 0 && port < 65536\n ? `http://localhost:${port}/assets`\n : undefined;\n}\n\nexport function wcTierOf(remoteId: string): WcTier | undefined {\n return tierWindow()?.__MAGMONIUM_WC_TIERS__?.[remoteId];\n}\n\n/** Which tier's bundle defined a tag — `status` for the app's status folder. */\nexport function definedWcTierOf(selector: string): WcTier | 'status' | undefined {\n return tierWindow()?.__MAGMONIUM_WC_DEFINED_TIERS__?.[selector];\n}\n\n/** The bundle file that defined a tag, when the loader that defined it said. */\nexport function definedWcBundleOf(selector: string): string | undefined {\n return tierWindow()?.__MAGMONIUM_WC_DEFINED_BUNDLES__?.[selector];\n}\n\nexport function recordDefinedWcTier(\n selector: string,\n tier: WcTier | 'status',\n bundle?: string\n): void {\n const win = tierWindow();\n if (!win) return;\n win.__MAGMONIUM_WC_DEFINED_TIERS__ = {\n ...(win.__MAGMONIUM_WC_DEFINED_TIERS__ ?? {}),\n [selector]: tier,\n };\n if (bundle)\n win.__MAGMONIUM_WC_DEFINED_BUNDLES__ = {\n ...(win.__MAGMONIUM_WC_DEFINED_BUNDLES__ ?? {}),\n [selector]: bundle,\n };\n}\n\nexport function buildWcBaseUrl(apiUrl: string, remoteId: string): string {\n // Asked for by name, so it wins over every guess below.\n const local = wcLocalBaseOf(remoteId);\n if (local) return local;\n if (tierWindow()?.__MAGMONIUM_STANDALONE__) {\n return '/assets';\n }\n if (isLocalhost) {\n return `/local-dist/m-${remoteId}-wc`;\n }\n const tier = wcTierOf(remoteId);\n return `${apiUrl}/store/v1/wc/${remoteId}${tier === 'beta' ? '/beta' : ''}`;\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient, HttpEvent, HttpParams } from '@angular/common/http';\nimport { firstValueFrom, Observable } from 'rxjs';\nimport { Assets } from '../enum';\nimport { ASSET_BASE_URL, ONE_ASSET_BASE_URL } from '../config/tokens';\nimport { isLocalhost } from '../lib/remote/web-util';\nimport {\n buildWcBaseUrl,\n wcLocalBaseOf,\n wcTierOf,\n} from '../functions/remote-url';\n\nexport type Version = undefined | 'v2';\n\nexport type QueryValue = string | number | boolean;\n\n/**\n * A query string, as an operation declares it. `undefined` and `null` are\n * dropped rather than serialised — an optional query parameter left unset is\n * absent from the url, never `?q=undefined`.\n */\nexport type QueryParams = Record<\n string,\n QueryValue | readonly QueryValue[] | null | undefined\n>;\n\n/** Access domains — routed to Auth URL when it differs from Backend URL (ADR 0012). */\nexport const ACCESS_DOMAINS = new Set(['auth', 'user', 'admin']);\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HttpService {\n private readonly http: HttpClient = inject(HttpClient);\n private url = 'http://localhost:8000';\n private authUrl = 'http://localhost:8000';\n private assetUrl = inject(ASSET_BASE_URL, { optional: true }) ?? './assets';\n private oneAssetUrl =\n inject(ONE_ASSET_BASE_URL, { optional: true }) ?? './assets';\n private publicUrl = './';\n\n get<T>(\n domain: string,\n path: (string | number)[],\n version?: Version,\n params?: QueryParams\n ): Observable<T> {\n return this.http.get<T>(this.createUrl(domain, path, version), {\n params: this.toParams(params),\n });\n }\n\n // The writing verbs take a query alongside their body: a path templates its\n // ids, the body carries the payload, and a filter or a mode rides on the\n // query — one operation can declare all three and none of them substitutes.\n put<T>(\n domain: string,\n path: (string | number)[],\n data?: unknown,\n version?: Version,\n params?: QueryParams\n ): Observable<T> {\n return this.http.put<T>(this.createUrl(domain, path, version), data, {\n params: this.toParams(params),\n });\n }\n\n post<T>(\n domain: string,\n path: (string | number)[],\n data?: unknown,\n version?: Version,\n params?: QueryParams\n ): Observable<T> {\n return this.http.post<T>(this.createUrl(domain, path, version), data, {\n params: this.toParams(params),\n });\n }\n\n patch<T>(\n domain: string,\n path: (string | number)[],\n data?: unknown,\n version?: Version,\n params?: QueryParams\n ): Observable<T> {\n return this.http.patch<T>(this.createUrl(domain, path, version), data, {\n params: this.toParams(params),\n });\n }\n\n patchEvents(\n domain: string,\n path: (string | number)[],\n data?: unknown,\n version?: Version\n ): Observable<HttpEvent<string>> {\n return this.http.patch(this.createUrl(domain, path, version), data, {\n observe: 'events',\n responseType: 'text',\n reportProgress: true,\n });\n }\n\n postEvents(\n domain: string,\n path: (string | number)[],\n data?: unknown,\n version?: Version\n ): Observable<HttpEvent<string>> {\n return this.http.post(this.createUrl(domain, path, version), data, {\n observe: 'events',\n responseType: 'text',\n reportProgress: true,\n });\n }\n\n delete<T>(\n domain: string,\n path: (string | number)[],\n version?: Version,\n params?: QueryParams\n ): Observable<T> {\n return this.http.delete<T>(this.createUrl(domain, path, version), {\n params: this.toParams(params),\n });\n }\n\n deleteWithBody<T>(\n domain: string,\n path: (string | number)[],\n body: unknown,\n version?: Version,\n params?: QueryParams\n ): Observable<T> {\n return this.http.delete<T>(this.createUrl(domain, path, version), {\n body,\n params: this.toParams(params),\n });\n }\n\n setUrl(url: string) {\n this.url = url;\n }\n\n getUrl(): string {\n return this.url;\n }\n\n setAuthUrl(url: string) {\n this.authUrl = url;\n }\n\n getAuthUrl(): string {\n return this.authUrl;\n }\n\n buildUrl(\n domain: string,\n path: (string | number)[],\n version?: Version\n ): string {\n return this.createUrl(domain, path, version);\n }\n\n setAssetUrl(url: string) {\n this.assetUrl = url;\n }\n\n setOneAssetUrl(url: string) {\n this.oneAssetUrl = url;\n }\n\n setPublicUrl(url: string) {\n this.publicUrl = url;\n }\n\n blob(url: string): Observable<Blob> {\n return this.http.get(url, { responseType: 'blob' });\n }\n\n /** A whole url read as text — what a document fetched from a Remote needs. */\n text(url: string): Observable<string> {\n return this.http.get(url, { responseType: 'text' });\n }\n\n wc<T>(link: string, filePath: string[]): Observable<T> {\n const local = wcLocalBaseOf(link);\n if (local) return this.http.get<T>(`${local}/${filePath.join('/')}`);\n if (isLocalhost) {\n return this.http.get<T>(`/local-dist/m-${link}-wc/${filePath.join('/')}`);\n }\n const tier = wcTierOf(link);\n return this.get<T>('store', ['wc', link, ...(tier === 'beta' ? [tier] : []), ...filePath]);\n }\n\n buildWcUrl(link: string): string {\n return buildWcBaseUrl(this.url, link);\n }\n\n public buildWcAssetBaseUrl(link: string): string {\n return this.buildWcUrl(link);\n }\n\n public buildWcAssetUrl(link: string, path: string): string {\n const normalized = path.startsWith('assets/')\n ? path.slice('assets/'.length)\n : path;\n return this.join(this.buildWcAssetBaseUrl(link), normalized);\n }\n\n public getAssetUrl(\n path: string | null | undefined,\n isPublic = false\n ): string {\n if (!path) return '';\n if (\n path.startsWith('http') ||\n path.startsWith('data:') ||\n path.startsWith('blob:')\n ) {\n return path;\n }\n const base = isPublic ? this.assetUrl : this.url;\n return this.join(base, path);\n }\n\n public getPublicUrl(path: string | null | undefined): string {\n if (!path) return '';\n if (path.startsWith('http')) return path;\n return this.join(this.publicUrl, path);\n }\n\n /**\n * Loads a worker from a URL.\n * If the URL is cross-origin, it fetches the script and creates a Blob worker.\n * This avoids 'importScripts' NetworkErrors in cross-origin environments like Web Components.\n */\n public async loadWorker(url: string): Promise<Worker> {\n if (url.startsWith('http') && !url.startsWith(window.location.origin)) {\n try {\n const script = await firstValueFrom(\n this.http.get(url, { responseType: 'text' })\n );\n const blob = new Blob([script], { type: 'application/javascript' });\n return new Worker(URL.createObjectURL(blob));\n } catch (error) {\n console.warn(\n `Failed to fetch worker cross-origin, falling back to importScripts shim:`,\n error\n );\n // Fallback to the old shim if fetch fails (e.g. CORS not configured but importScripts might work)\n const shim = new Blob([`importScripts(\"${url}\")`], {\n type: 'application/javascript',\n });\n return new Worker(URL.createObjectURL(shim));\n }\n }\n return new Worker(url);\n }\n\n private join(base: string, path: string): string {\n const b = base.endsWith('/') ? base.slice(0, -1) : base;\n const p = path.startsWith('/') ? path.slice(1) : path;\n return `${b}/${p}`;\n }\n\n asset<T>(\n tree: string[],\n type: Assets,\n options?: Record<string, unknown>,\n baseUrl?: string\n ): Observable<T> {\n const resolvedBase =\n baseUrl ?? (tree[0] === 'one' ? this.oneAssetUrl : this.assetUrl);\n const url = this.join(resolvedBase, `${tree.join('/')}.${type}`);\n\n const requestOptions = {\n ...options,\n responseType: this.fromAssetToResponseType(type) as 'json',\n };\n\n return this.http.get<T>(url, requestOptions) as Observable<T>;\n }\n\n private createUrl(\n domain: string,\n path: (string | number)[],\n version?: Version\n ) {\n const base = ACCESS_DOMAINS.has(domain) ? this.authUrl : this.url;\n return `${base}/${domain}/${version ?? 'v1'}/${path.join('/')}`;\n }\n\n /**\n * The query, built by hand rather than handed to `fromObject`: an unset\n * optional parameter is absent from the url, and a repeated one appends\n * instead of replacing.\n */\n private toParams(params?: QueryParams): HttpParams | undefined {\n if (!params) return undefined;\n let built = new HttpParams();\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const item of value) built = built.append(key, String(item));\n } else {\n built = built.set(key, String(value));\n }\n }\n return built.keys().length ? built : undefined;\n }\n\n private fromAssetToResponseType = (assets: Assets) => {\n let responseType: 'text' | 'json' | 'blob' = 'json';\n switch (assets) {\n case Assets.SVG:\n case Assets.CSS:\n case Assets.MD:\n responseType = 'text';\n break;\n case Assets.PNG:\n responseType = 'blob';\n break;\n case Assets.JSON:\n default:\n responseType = 'json';\n break;\n }\n return responseType;\n };\n}\n","export function isJson(data: unknown) {\n if (typeof data === 'string') {\n try {\n JSON.parse(data);\n } catch {\n return false;\n }\n }\n return true;\n}\n","import { Injectable } from '@angular/core';\nimport { isJson } from '../functions/object/json';\n\n/** Which shelf a HeldValue lives on. The caller's pick, never derived. */\nexport type HeldShelf = 'local' | 'session';\n\n@Injectable({ providedIn: 'root' })\nexport class StorageService {\n /**\n * Write a HeldValue (GLOSSARY.md HeldValue, ADR 0019). Always a JSON envelope,\n * so a `string` holding `'3'` reads back a `string` and not the `3` that\n * `getLocal` answers; `undefined` deletes the key rather than storing the\n * word; and falsiness is never a reason to skip the write, so a `false`, a\n * `0` and an empty string land like any other value.\n */\n public setHeld<T>(key: string, value: T, shelf: HeldShelf = 'local'): void {\n const shelfStore = this.shelf(shelf);\n if (value === undefined) {\n shelfStore.removeItem(key);\n return;\n }\n shelfStore.setItem(key, JSON.stringify(value));\n }\n\n /**\n * Read a HeldValue back at the type it was written. An absent key and an\n * unreadable one both answer `undefined` — a store that cannot say what it\n * holds holds nothing, which is the same answer the caller's initial state\n * already gives.\n */\n public getHeld<T>(key: string, shelf: HeldShelf = 'local'): T | undefined {\n const raw = this.shelf(shelf).getItem(key);\n if (raw === null) return undefined;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n }\n\n private shelf(shelf: HeldShelf): Storage {\n return shelf === 'session' ? sessionStorage : localStorage;\n }\n\n public setSession(key: string, value: unknown): void {\n if (value) {\n if (isJson(value)) {\n sessionStorage.setItem(key, JSON.stringify(value));\n } else {\n sessionStorage.setItem(key, String(value));\n }\n }\n }\n\n public getSession(key: string): unknown {\n const data = sessionStorage.getItem(key);\n if (data && isJson(data)) {\n return JSON.parse(data);\n } else {\n return data;\n }\n }\n\n public deleteSession(key: string): void {\n sessionStorage.removeItem(key);\n }\n\n public setLocal(key: string, value: unknown): void {\n if (isJson(value)) {\n localStorage.setItem(key, JSON.stringify(value));\n } else {\n localStorage.setItem(key, String(value));\n }\n }\n\n public getLocal(key: string): unknown {\n const data = localStorage.getItem(key);\n if (data && isJson(data)) {\n return JSON.parse(data);\n } else {\n return data;\n }\n }\n\n public deleteLocal(key: string): void {\n localStorage.removeItem(key);\n }\n}\n","import { Injector } from '@angular/core';\n\nexport interface LoadingActionsApi {\n startLoading: () => void;\n stopLoading: () => void;\n setError: () => void;\n clearError: () => void;\n reset: () => void;\n cancelLoading: () => void;\n}\n\n/**\n * Renews the session the LoginStore holds — the refresh token, else the login\n * modal — settling once fresh tokens are in it, rejecting when it cannot.\n */\nexport type SessionRenewal = () => Promise<void>;\n\n// Extend Window interface for shared stores\ninterface SharedStores {\n themeStore?: unknown;\n translateService?: unknown;\n hostInjector?: Injector;\n loadingActions?: LoadingActionsApi;\n socketUrl?: string;\n navStore?: unknown;\n loginStore?: unknown;\n sessionRenewal?: SessionRenewal;\n notificationStore?: unknown;\n appLogoState?: unknown;\n}\n\ndeclare const window: Window & { sharedStores: SharedStores };\n\nexport class SharedStoreRegistry {\n static setNavStore(store: unknown): void {\n this.check();\n if (!window.sharedStores.navStore) {\n window.sharedStores.navStore = store;\n }\n }\n\n static getNavStore(): unknown {\n return window.sharedStores?.navStore;\n }\n\n // `app_logo`'s source: a WC bundles its own `@magmonium/one`, so the host's\n // AppLogoState class is not its token — the instance crosses here instead.\n static setAppLogoState(state: unknown): void {\n this.check();\n if (!window.sharedStores.appLogoState) {\n window.sharedStores.appLogoState = state;\n }\n }\n\n static getAppLogoState(): unknown {\n return window.sharedStores?.appLogoState;\n }\n\n static setLoginStore(store: unknown): void {\n this.check();\n if (!window.sharedStores.loginStore) {\n window.sharedStores.loginStore = store;\n }\n }\n\n static getLoginStore(): unknown {\n return window.sharedStores?.loginStore;\n }\n\n /**\n * First-write-wins: the app that owns the LoginStore registers how it renews\n * it. A WC bundle mounted in that app shares its tokens, so it renews through\n * this — never through its own Auth URL, which may not know them.\n */\n static setSessionRenewal(renew: SessionRenewal): void {\n this.check();\n if (!window.sharedStores.sessionRenewal) {\n window.sharedStores.sessionRenewal = renew;\n }\n }\n\n static getSessionRenewal(): SessionRenewal | undefined {\n return window.sharedStores?.sessionRenewal;\n }\n\n /** First-write-wins: host registers its store; WC bundles reuse it so popups render in the host outlet. */\n static setNotificationStore(store: unknown): void {\n this.check();\n if (!window.sharedStores.notificationStore) {\n window.sharedStores.notificationStore = store;\n }\n }\n\n static getNotificationStore(): unknown {\n return window.sharedStores?.notificationStore;\n }\n static setHostInjector(injector: Injector): void {\n this.check();\n window.sharedStores.hostInjector = injector;\n }\n\n static getHostInjector(): Injector | undefined {\n return window.sharedStores?.hostInjector;\n }\n\n static getThemeStore(): unknown {\n return window.sharedStores?.themeStore;\n }\n\n static getTranslateService(): unknown {\n return window.sharedStores?.translateService;\n }\n\n static setThemeStore(store: unknown): void {\n this.check();\n window.sharedStores.themeStore = store;\n }\n\n /** First-write-wins: host registers its service; WC bundles reuse it instead of creating a new one. */\n static setTranslateService(service: unknown): void {\n this.check();\n if (!window.sharedStores.translateService) {\n window.sharedStores.translateService = service;\n }\n }\n\n /** First-write-wins: the host app registers its actions; WC bundles skip if already set. */\n static setLoadingActions(actions: LoadingActionsApi): void {\n this.check();\n if (!window.sharedStores.loadingActions) {\n window.sharedStores.loadingActions = actions;\n }\n }\n\n static getLoadingActions(): LoadingActionsApi | undefined {\n return window.sharedStores?.loadingActions;\n }\n\n /** First-write-wins: host sets this; WCs skip socket init when truthy. */\n static setSocketUrl(url: string): void {\n this.check();\n if (!window.sharedStores.socketUrl) {\n window.sharedStores.socketUrl = url;\n }\n }\n\n static isHostSocketActive(): boolean {\n return !!window.sharedStores?.socketUrl;\n }\n\n private static check() {\n if (!window.sharedStores) {\n window.sharedStores = {};\n }\n }\n}\n","import { inject } from '@angular/core';\nimport {\n patchState,\n signalStore,\n withHooks,\n withMethods,\n withState,\n} from '@ngrx/signals';\nimport { catchError, finalize, Observable, of, shareReplay, tap, throwError } from 'rxjs';\nimport { Assets } from '../enum';\nimport { HttpService } from '../services/http';\nimport { StorageService } from '../services/storage';\nimport { SharedStoreRegistry } from '../config/service-registry';\n\ntype AssetMap = Record<string, Record<string, Record<string, unknown>>>;\n\ninterface AssetState {\n map: AssetMap;\n isCachingDisabled: boolean;\n appLink: string | undefined;\n /** The host path this app is mounted under, as the mounting m-remote said. */\n hostBase: string | undefined;\n /**\n * Whether an m-remote mounted this app: the host then writes the page\n * address from its reports, and this app's Router never writes it itself.\n */\n hosted: boolean;\n}\n\nconst STORAGE_KEY = 'mag_assets';\n\nconst inferAssetType = (folder: string): Assets =>\n folder === 'icons' ? Assets.SVG : Assets.JSON;\n\nexport const AssetStore = signalStore(\n { providedIn: 'root' },\n withState<AssetState>({\n map: {},\n isCachingDisabled: false,\n appLink: undefined,\n hostBase: undefined,\n hosted: false,\n }),\n withMethods(\n (store, http = inject(HttpService), storage = inject(StorageService)) => {\n const pending = new Map<string, Observable<unknown>>();\n const buildKey = (ns: string, type: string, name: string) =>\n `${ns}:${type}:${name}`;\n\n const getCached = (\n ns: string,\n type: string,\n name: string\n ): unknown | undefined => store.map()[ns]?.[type]?.[name];\n\n const setCached = (\n ns: string,\n type: string,\n name: string,\n value: unknown\n ): void => {\n // Skip update if value is the same reference\n const current = store.map()[ns]?.[type]?.[name];\n if (current === value) {\n return;\n }\n\n const updated = {\n ...store.map(),\n [ns]: {\n ...store.map()[ns],\n [type]: { ...store.map()[ns]?.[type], [name]: value },\n },\n };\n patchState(store, { map: updated });\n\n if (store.isCachingDisabled()) {\n return;\n }\n try {\n storage.setSession(STORAGE_KEY, updated);\n } catch {\n // quota exceeded — caching skipped\n }\n };\n\n return {\n setAppLink: (appLink: string) => patchState(store, { appLink }),\n setHostBase: (hostBase: string) => patchState(store, { hostBase }),\n setHosted: () => patchState(store, { hosted: true }),\n setCachingDisabled: (isDisabled: boolean) =>\n patchState(store, { isCachingDisabled: isDisabled }),\n\n resolve<T>(\n type: string,\n name: string,\n isOne = false,\n remoteBaseUrl?: string\n ): Observable<T> {\n const ns = isOne\n ? 'one'\n : remoteBaseUrl\n ? `remote:${remoteBaseUrl}`\n : (store.appLink() ?? 'host');\n\n const cached = getCached(ns, type, name);\n if (cached !== undefined) return of(cached as T);\n\n const key = buildKey(ns, type, name);\n const existingPending = pending.get(key);\n if (existingPending) {\n return existingPending as Observable<T>;\n }\n\n const assetType = inferAssetType(type);\n\n const fetchFromHost = (): Observable<T> => {\n const hostNs = store.appLink() ?? 'host';\n const isEmbeddedInHost = !!SharedStoreRegistry.getHostInjector();\n const baseUrl = remoteBaseUrl ?? (isEmbeddedInHost && store.appLink() ? http.buildWcAssetBaseUrl(store.appLink() as string) : undefined);\n return http\n .asset<T>([type, name], assetType, undefined, baseUrl)\n .pipe(tap((value) => setCached(hostNs, type, name, value)));\n };\n\n let request$: Observable<T>;\n\n if (isOne) {\n const oneTree = ['one', type, name];\n const oneFetch = http\n .asset<T>(oneTree, assetType)\n .pipe(tap((value) => setCached('one', type, name, value)));\n\n request$ = oneFetch.pipe(\n catchError((error) => {\n // If it's from one but not found, try host as fallback\n // only if it's not already a remote request (which has its own fallback)\n if (!remoteBaseUrl) {\n return fetchFromHost();\n }\n throw error;\n }),\n catchError(() => {\n // Remote fallback logic\n if (remoteBaseUrl) {\n const remoteNs = `remote:${remoteBaseUrl}`;\n if (!store.isCachingDisabled()) {\n const cached = getCached(remoteNs, type, name);\n if (cached !== undefined) return of(cached as T);\n }\n return http\n .asset<T>([type, name], assetType, undefined, remoteBaseUrl)\n .pipe(tap((value) => setCached(remoteNs, type, name, value)));\n }\n return throwError(() => new Error(`Asset not found: ${type}/${name}`));\n }),\n shareReplay(1),\n finalize(() => pending.delete(key))\n );\n } else {\n request$ = fetchFromHost().pipe(\n shareReplay(1),\n finalize(() => pending.delete(key))\n );\n }\n\n pending.set(key, request$);\n return request$;\n },\n };\n }\n ),\n withHooks({\n onInit(store, storage = inject(StorageService)) {\n const isLocal =\n typeof window !== 'undefined' &&\n (window.location.hostname === 'localhost' ||\n window.location.hostname === '127.0.0.1' ||\n window.location.hostname === '0.0.0.0');\n patchState(store, { isCachingDisabled: isLocal });\n\n if (!isLocal) {\n const saved = storage.getSession(STORAGE_KEY) as AssetMap | null;\n if (saved) patchState(store, { map: saved });\n }\n },\n })\n\n);\n","// MiniMark: closed-vocabulary text markup, not CommonMark. See libs/one/GLOSSARY.md\n// and docs/adr/0002-rich-text-output-minimark-plus-angular-sanitizer.md. Deliberately\n// supports only h1-h6, p, **bold**/__bold__, *italic*/_italic_, ~~strike~~, > blockquote, - list\n// (flat — indented bullets are siblings, indented non-bullet lines continue the\n// item above), [text](url) links, emoji passthrough. No images/tables/code/raw HTML — all `&<>`\n// from source text is escaped, so callers can bind the result with a plain\n// [innerHTML] and rely on Angular's own sanitizer as the only safety net.\n\nconst escapeHtml = (text: string): string =>\n text.replace(/&(?!#?\\w+;)/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\nconst HEADING_RE = /^(#{1,6})\\s+(.*)$/;\nconst QUOTE_RE = /^>\\s?(.*)$/;\n// A leading indent is tolerated on a bullet: the list stays flat, so an indented\n// `- x` is a sibling item, never a nested list. An indented line without a bullet\n// is a wrapped continuation of the item above it (see CONTINUATION_RE).\nconst LIST_RE = /^[ \\t]*-[ \\t]+(.*)$/;\nconst CONTINUATION_RE = /^[ \\t]+(\\S.*)$/;\nconst LINK_RE = /\\[([^\\]]*)\\]\\(([^)\\s]+)\\)/g;\n\n// `__bold__` / `_italic_` are accepted as aliases of the `*` forms, but only at word\n// boundaries: an identifier like snake_case_name must stay literal text, so the\n// delimiter may not sit against a word character on the outside.\nconst UNDERSCORE_BOLD_RE = /(?<!\\w)__(.+?)__(?!\\w)/g;\nconst UNDERSCORE_ITALIC_RE = /(?<!\\w)_(.+?)_(?!\\w)/g;\n\n// Links are parsed before bold/italic/strike so those passes can never rewrite\n// characters inside an href. Each rendered anchor is parked behind a NUL-delimited\n// index token and spliced back once every other inline rule has run. Source text is\n// escaped upstream, so a NUL can only come from here.\n// eslint-disable-next-line no-control-regex\nconst TOKEN_RE = /\\u0000(\\d+)\\u0000/g;\n// eslint-disable-next-line no-control-regex\nconst CONTROL_RE = /[\\u0000-\\u001f\\u007f]/g;\n\nconst SCHEME_RE = /^[a-z][a-z0-9+.-]*:/i;\nconst ALLOWED_SCHEME_RE = /^(?:https?|mailto|tel):/i;\nconst EXTERNAL_RE = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\n/**\n * Accept http/https/mailto/tel plus protocol-relative and relative URLs; reject\n * every other scheme (javascript:, data:, vbscript:, file:). Angular's sanitizer\n * would drop those too, but the parser must not emit them in the first place.\n */\nconst sanitizeUrl = (raw: string): string | null => {\n const url = raw.replace(CONTROL_RE, '').trim();\n if (!url) return null;\n if (SCHEME_RE.test(url) && !ALLOWED_SCHEME_RE.test(url)) return null;\n return url.replace(/\"/g, '%22');\n};\n\nconst renderInline = (text: string, links: string[]): string => {\n let html = text.replace(LINK_RE, (match, label: string, url: string) => {\n const href = sanitizeUrl(url);\n if (!href) return match;\n const rel = EXTERNAL_RE.test(href)\n ? ' target=\"_blank\" rel=\"noopener noreferrer\"'\n : '';\n links.push(\n `<a href=\"${href}\"${rel}>${renderInline(label, links) || href}</a>`\n );\n return `\\u0000${links.length - 1}\\u0000`;\n });\n html = html.replace(\n /\\*\\*(.+?)\\*\\*/g,\n (_, inner: string) => `<strong>${renderInline(inner, links)}</strong>`\n );\n html = html.replace(\n UNDERSCORE_BOLD_RE,\n (_, inner: string) => `<strong>${renderInline(inner, links)}</strong>`\n );\n html = html.replace(\n /~~(.+?)~~/g,\n (_, inner: string) => `<s>${renderInline(inner, links)}</s>`\n );\n html = html.replace(\n /\\*(.+?)\\*/g,\n (_, inner: string) => `<em>${renderInline(inner, links)}</em>`\n );\n html = html.replace(\n UNDERSCORE_ITALIC_RE,\n (_, inner: string) => `<em>${renderInline(inner, links)}</em>`\n );\n return html;\n};\n\nconst parseInline = (text: string): string => {\n const links: string[] = [];\n return renderInline(text, links).replace(\n TOKEN_RE,\n (_, index: string) => links[Number(index)]\n );\n};\n\ntype BlockType = 'p' | 'blockquote' | 'ul';\n\n/**\n * Render MiniMark source text to an HTML string.\n */\nexport function miniMarkToHtml(source?: string): string {\n if (!source) return '';\n\n const blocks: string[] = [];\n let bufferType: BlockType | null = null;\n // One group per rendered unit: a group is a single `<li>` in a list, a single\n // source line elsewhere. Lines within a group are joined by <br>, matching how\n // MiniMark treats a single newline everywhere else.\n let buffer: string[][] = [];\n\n const renderGroup = (group: string[]): string =>\n group.map(parseInline).join('<br>');\n\n const flush = (): void => {\n if (bufferType && buffer.length) {\n if (bufferType === 'ul') {\n blocks.push(\n `<ul>${buffer.map((group) => `<li>${renderGroup(group)}</li>`).join('')}</ul>`\n );\n } else {\n const joined = buffer.map(renderGroup).join('<br>');\n blocks.push(\n bufferType === 'p'\n ? `<p>${joined}</p>`\n : `<blockquote>${joined}</blockquote>`\n );\n }\n }\n bufferType = null;\n buffer = [];\n };\n\n for (const rawLine of source.replace(/\\r\\n?/g, '\\n').split('\\n')) {\n if (!rawLine.trim()) {\n flush();\n continue;\n }\n\n const heading = HEADING_RE.exec(rawLine);\n if (heading) {\n flush();\n const level = heading[1].length;\n blocks.push(\n `<h${level}>${parseInline(escapeHtml(heading[2]))}</h${level}>`\n );\n continue;\n }\n\n const quote = QUOTE_RE.exec(rawLine);\n if (quote) {\n if (bufferType !== 'blockquote') flush();\n bufferType = 'blockquote';\n buffer.push([escapeHtml(quote[1])]);\n continue;\n }\n\n const item = LIST_RE.exec(rawLine);\n if (item) {\n if (bufferType !== 'ul') flush();\n bufferType = 'ul';\n buffer.push([escapeHtml(item[1])]);\n continue;\n }\n\n // An indented line inside a list is a wrapped item, not a new paragraph —\n // without this a soft-wrapped bullet would close the <ul> mid-list.\n const continuation =\n bufferType === 'ul' && buffer.length\n ? CONTINUATION_RE.exec(rawLine)\n : null;\n if (continuation) {\n buffer[buffer.length - 1].push(escapeHtml(continuation[1]));\n continue;\n }\n\n if (bufferType !== 'p') flush();\n bufferType = 'p';\n buffer.push([escapeHtml(rawLine)]);\n }\n flush();\n\n return blocks.join('');\n}\n","/**\n * The language and country the visitor's browser declares (GLOSSARY.md\n * Browser Locale). A hint that pre-fills and breaks ties, never an authority —\n * callers clamp `language` to their own list, and `country` is null rather\n * than guessed from the language (`en` is not `US`).\n */\nexport interface BrowserLocale {\n language: string | undefined;\n country: string | null;\n}\n\nconst COUNTRY = /^[A-Z]{2}$/;\n\nconst parseTag = (tag: string | undefined): BrowserLocale => {\n const [language, region] = (tag ?? '').split('-');\n const country = region?.toUpperCase();\n return {\n language: language ? language.toLowerCase() : undefined,\n country: country && COUNTRY.test(country) ? country : null,\n };\n};\n\n/**\n * Reads `navigator.language`; when that tag carries no region, the first of\n * `navigator.languages` that does supplies the country.\n */\nexport const browserLocale = (\n nav:\n | Pick<Navigator, 'language' | 'languages'>\n | undefined = typeof navigator === 'undefined' ? undefined : navigator\n): BrowserLocale => {\n const primary = parseTag(nav?.language);\n if (primary.country) return primary;\n const country =\n (nav?.languages ?? []).map(parseTag).find((locale) => locale.country)\n ?.country ?? null;\n return { language: primary.language, country };\n};\n","import { DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { BrowserLocale, browserLocale } from '../functions/browser-locale';\n\n/**\n * The Browser Locale as a signal — read once at start and again whenever the\n * visitor changes their browser languages (`languagechange`).\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class BrowserLocaleService {\n private readonly current = signal<BrowserLocale>(browserLocale());\n readonly locale = this.current.asReadonly();\n\n constructor() {\n if (typeof window === 'undefined') return;\n const handler = (): void => this.current.set(browserLocale());\n window.addEventListener('languagechange', handler);\n inject(DestroyRef).onDestroy(() =>\n window.removeEventListener('languagechange', handler)\n );\n }\n}\n","import { computed, inject, Injectable, linkedSignal, signal } from '@angular/core';\nimport { HttpService } from './http';\nimport { rxResource, toObservable } from '@angular/core/rxjs-interop';\nimport { catchError, forkJoin, map, of } from 'rxjs';\nimport { Assets } from '../enum/assets/assets';\nimport { AssetStore } from '../stores/asset.store';\nimport { miniMarkToHtml } from '../functions/text/mini-mark';\nimport { TRANSLATION_SOURCE } from '../config/tokens';\nimport { BrowserLocaleService } from './browser-locale';\n\n/** The language every key is authored in first — what a missing one reads as. */\nconst FALLBACK_LANG = 'en';\n\n/** The `@magmonium/one` half and the project half of one language. */\ntype TranslationPair = [Record<string, unknown>?, Record<string, unknown>?];\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TranslateService {\n private readonly browserLocale = inject(BrowserLocaleService).locale;\n /** Set once the visitor picks a language — the Browser Locale stops leading. */\n private picked = false;\n /**\n * The visitor's pick, else their Browser Locale language — following it when\n * they change their browser languages, until they pick one here.\n */\n public readonly lang = linkedSignal<string | undefined, string>({\n source: () => this.browserLocale().language,\n computation: (language, previous) =>\n this.picked && previous ? previous.value : (language ?? 'en'),\n });\n private readonly path = signal<string[] | undefined>(['i18n'], {\n equal: (a, b) => {\n if (a === b) return true;\n if (!a || !b || a.length !== b.length) return false;\n return a.every((v, i) => v === b[i]);\n },\n });\n private readonly country = computed(() => this.browserLocale().country);\n public readonly remoteAppId = signal<string | undefined>(undefined);\n /**\n * The mounted App's Default Language (store GLOSSARY.md): its keys load from\n * this file when the App ships none for `lang` — library keys still follow\n * `lang`.\n */\n public readonly remoteFallbackLang = signal<string | undefined>(undefined);\n\n private readonly httpService = inject(HttpService);\n private readonly assetStore = inject(AssetStore);\n\n /**\n * Every Remote mounted beside m-ui's single slot, counted per link so one\n * app mounted twice stays loaded until both mounts leave (ADR 0036).\n */\n private readonly mountedApps = signal<Record<string, number>>({});\n\n readonly mountRemoteApp = (link: string) =>\n this.mountedApps.update((apps) => ({ ...apps, [link]: (apps[link] ?? 0) + 1 }));\n\n readonly unmountRemoteApp = (link: string) =>\n this.mountedApps.update(({ [link]: count = 0, ...rest }) =>\n count > 1 ? { ...rest, [link]: count - 1 } : rest\n );\n\n private readonly remoteAppIds = computed(\n () => [\n ...new Set([\n ...(this.remoteAppId() ? [this.remoteAppId() as string] : []),\n ...Object.keys(this.mountedApps()),\n ]),\n ],\n { equal: (a, b) => a.length === b.length && a.every((v, i) => v === b[i]) }\n );\n\n private readonly remoteTranslation = rxResource({\n params: () => ({\n lang: this.lang(),\n appIds: this.remoteAppIds(),\n fallback: this.remoteFallbackLang(),\n }),\n stream: ({ params: { lang, appIds, fallback } }) => {\n if (!appIds.length) return of({});\n const bundle = (appId: string, name: string) =>\n this.httpService.asset<Record<string, unknown>>(\n ['i18n', name],\n Assets.JSON,\n undefined,\n this.httpService.buildWcAssetBaseUrl(appId)\n );\n return forkJoin(\n appIds.map((appId) =>\n bundle(appId, lang).pipe(\n catchError(() =>\n fallback && fallback !== lang\n ? bundle(appId, fallback).pipe(catchError(() => of({})))\n : of({})\n )\n )\n )\n ).pipe(map((bundles) => Object.assign({}, ...bundles)));\n },\n });\n\n private readonly langs = rxResource({\n params: this.path,\n stream: ({ params }) =>\n this.assetStore\n .resolve<\n Record<'langs', Record<string, string>>\n >((params ?? ['i18n']).join('/'), 'lang', true)\n .pipe(catchError(() => of({ langs: {} }))),\n });\n\n public readonly allLangs = computed(() => this.langs.value()?.langs ?? {});\n private readonly countryLangSource = rxResource({\n params: () => ({ country: this.country(), path: this.path() }),\n stream: ({ params: { country, path } }) =>\n country\n ? this.assetStore\n .resolve<string[]>((path ?? []).join('/'), `country-${country}`, true)\n .pipe(catchError(() => []))\n : of([]),\n });\n\n public readonly countryLangs = computed(() => {\n const countryLangs = {} as Record<string, string>;\n for (const [key, value] of Object.entries(this.allLangs())) {\n if (this.countryLangSource.value()?.includes(key)) {\n countryLangs[key] = value as string;\n }\n }\n return countryLangs;\n });\n\n private readonly translation = rxResource({\n params: () => ({\n lang: this.lang(),\n path: this.path(),\n remote: this.remoteTranslation.value(),\n }),\n // A language ships a share of `en`'s keys, so `en` lies underneath it: a\n // key the language lacks reads in English rather than as the bare key.\n // Language beats layer — a library key in `lang` wins a project one in `en`.\n stream: ({ params: { path, lang, remote } }) =>\n forkJoin([\n lang === FALLBACK_LANG\n ? of([{}, {}])\n : this.fetchTranslations([...(path ?? []), FALLBACK_LANG]),\n this.fetchTranslations([...(path ?? []), lang]),\n ]).pipe(\n map((results) => {\n const [[enOne = {}, enProject = {}], [one = {}, project = {}]] =\n results as [TranslationPair, TranslationPair];\n return {\n ...enOne,\n ...enProject,\n ...one,\n ...project,\n ...(remote as Record<string, unknown>),\n };\n })\n ),\n });\n\n public readonly translations$ = toObservable(this.translation.value);\n\n // Keys supplied from memory by a host app rather than fetched (see\n // TRANSLATION_SOURCE). Optional everywhere: only a visual editor provides it.\n private readonly translationSource = inject(TRANSLATION_SOURCE, {\n optional: true,\n });\n\n // What every lookup reads. The in-memory source wins over the fetched map so\n // that a key being edited right now beats the copy last fetched from disk.\n private readonly mergedTranslations = computed(() => ({\n ...((this.translation.value() ?? {}) as Record<string, unknown>),\n ...(this.translationSource?.() ?? {}),\n }));\n\n // The `@magmonium/one` half of the merge, on its own. A host app that lets a\n // User invent keys needs it to refuse the ones the library already ships:\n // project keys win the merge above, so inventing one silently rewords a\n // library string everywhere it appears.\n private readonly libraryTranslation = rxResource({\n params: () => ({ lang: this.lang(), path: this.path() }),\n stream: ({ params: { lang, path } }) =>\n this.assetStore\n .resolve<Record<string, unknown>>((path ?? []).join('/'), lang, true)\n .pipe(catchError(() => of({}))),\n });\n\n public readonly libraryKeys = computed(\n () => new Set(Object.keys(this.libraryTranslation.value() ?? {}))\n );\n\n private readonly links = rxResource({\n params: this.path,\n stream: ({ params }) =>\n this.fetchTranslations([...params, 'links']).pipe(\n map((result: [unknown, unknown] | unknown) => {\n const [one = {}, project = {}] = result as [\n Record<string, Record<string, string>>,\n Record<string, Record<string, string>>,\n ];\n return { ...one?.['links'], ...project?.['links'] };\n })\n ),\n });\n\n public setLang(lang: string): void {\n this.picked = true;\n if (lang !== this.lang()) {\n this.lang.set(lang);\n }\n }\n\n /**\n * Translate a key and return plain text\n * If no translation found in JSON, it will process the value directly\n */\n public readonly translate = (\n value?: string | number,\n config?: Record<string, string>\n ): string => {\n if (value == null) return '';\n if (typeof value === 'number') return value.toString();\n // YAML `label: true`/`false` compile to booleans; those names are also\n // real i18n keys (\"Yes\"/\"No\"), so coerce rather than throw. Any other\n // non-string used to crash in parseTranslationKey / key.split.\n if (typeof value === 'boolean') value = String(value);\n else if (typeof value !== 'string') return '';\n\n const { key, params } = this.parseTranslationKey(value);\n\n const translations = this.mergedTranslations();\n const result = key\n .split('.')\n .reduce(\n (obj: unknown, keyPart) =>\n typeof obj === 'object' && obj !== null\n ? ((obj as Record<string, unknown>)?.[keyPart] ?? '')\n : obj,\n translations\n );\n\n const mergedParams = { ...params, ...(config ?? {}) };\n\n // If translation found in JSON, use it\n if (typeof result === 'string' && result) {\n const textWithParams = this.replacePlaceholders(result, mergedParams);\n return this.addLink(textWithParams, config);\n }\n\n // If no translation found, process the original key directly\n // This allows direct translation like: \"$month,$year?month=january&year=2006\"\n const directTranslation = this.replacePlaceholders(key, mergedParams);\n return this.addLink(directTranslation, config);\n };\n\n /**\n * Translate a key and render the result as MiniMark HTML.\n * Returns a plain string — bind with a plain [innerHTML], not bypassSecurityTrustHtml.\n * Angular's own sanitizer is the safety net; see ADR 0002.\n */\n public readonly translateToHtml = (\n value?: string | number,\n config?: Record<string, string>\n ): string => {\n const translatedText = this.translate(value, config);\n return translatedText ? miniMarkToHtml(translatedText) : '';\n };\n\n public init(path: string[] = ['i18n']): void {\n this.path.set(path);\n }\n\n /**\n * Parse query string from translation key\n * Example: \"min_length?len=6&max=10\" => { key: \"min_length\", params: { len: \"6\", max: \"10\" } }\n */\n private parseTranslationKey(value: string): {\n key: string;\n params: Record<string, string>;\n } {\n if (!value.includes('?')) {\n return { key: value, params: {} };\n }\n\n const [key, queryString] = value.split('?');\n const params: Record<string, string> = {};\n\n const urlParams = new URLSearchParams(queryString);\n urlParams.forEach((val, paramKey) => {\n params[paramKey] = val;\n });\n\n return { key, params };\n }\n\n /**\n * Replace placeholders in translated text with actual values.\n *\n * Two forms, and the `$` is the whole difference:\n * - `<$len>` — the value is itself a translation key. It is looked up in the\n * translation JSON and the translation is substituted, so the text reads in\n * the User's language. Falls back to the raw value when the lookup misses.\n * `\"Should contain at least <$len> characters.\"` + `{ len: \"6\" }` → \"…at\n * least 6 characters.\"\n * - `<name>` — the value is substituted verbatim, no lookup. For data that\n * has no translation and must not acquire one by accident: a username, an\n * ID, a number already formatted by the caller.\n *\n * A placeholder with no matching param is left untouched for `addLink`, which\n * reads `<...>` as its own link-template markup.\n */\n private replacePlaceholders(\n text: string,\n params: Record<string, string>\n ): string {\n return text.replace(\n /<(\\$?)(\\w+)>/g,\n (match, dollar: string, placeholder: string) => {\n const value = params[placeholder];\n if (!Object.prototype.hasOwnProperty.call(params, placeholder)) {\n return match;\n }\n\n const resolved = dollar ? this.translateParameterValue(value) : value;\n\n // Escape HTML and markdown control characters in parameter values for security and formatting stability\n return this.escapeParam(resolved);\n }\n );\n }\n\n private escapeParam(text: string): string {\n const escapedHtml = this.escapeHtml(text);\n return escapedHtml\n .replace(/\\*/g, '*')\n .replace(/_/g, '_')\n .replace(/~/g, '~')\n .replace(/\\[/g, '[')\n .replace(/\\]/g, ']');\n }\n\n /**\n * Try to translate a parameter value by looking it up in translation JSON\n * If not found, return the original value\n */\n private translateParameterValue(value: string): string {\n if (!value) return value;\n\n const translations = this.mergedTranslations();\n\n // Try to look up the value in translations\n const result = value\n .split('.')\n .reduce(\n (obj: unknown, keyPart) =>\n typeof obj === 'object' && obj !== null\n ? (obj as Record<string, unknown>)?.[keyPart]\n : obj,\n translations\n );\n\n // If found and is a string, use it. Otherwise, return original value\n return typeof result === 'string' && result ? result : value;\n }\n\n private fetchTranslations(path: string[]) {\n const type = path.slice(0, -1).join('/');\n const name = path[path.length - 1];\n return forkJoin([\n this.assetStore.resolve(type, name, true).pipe(catchError(() => of({}))),\n this.assetStore.resolve(type, name).pipe(catchError(() => of({}))),\n ]).pipe(catchError(() => of([{}, {}])));\n }\n\n private formatDate(date: Date): string {\n return `${this.translate(\n `day.${date.getDay()}`\n )} ${date.getDate()} ${this.translate(\n `month.${date.getMonth()}`\n )},${date.getFullYear()}`;\n }\n\n private toReadableTime(date: string): string {\n return this.formatDate(new Date(date));\n }\n\n private getLink(key: string): string {\n return this.links.value()?.[key] ?? '';\n }\n\n private applyRule(text: string, type: string): string {\n return type === 'date' ? this.toReadableTime(text) : text;\n }\n\n private processLinkContent(\n content: string,\n config: Record<string, string>\n ): string {\n if (content.includes('~')) {\n const [text, linkKey] = content.split('~');\n const displayText =\n text.startsWith('$') && config[text]\n ? this.translate(config[text])\n : text;\n const link = this.getLink(linkKey) ?? config[linkKey];\n // Sanitize link URL to prevent XSS\n const sanitizedLink = link ? this.sanitizeUrl(link) : null;\n return sanitizedLink\n ? `<a href=\"${sanitizedLink}\">${this.escapeHtml(displayText)}</a>`\n : this.escapeHtml(displayText);\n }\n\n if (content.includes('%')) {\n const [key, type] = content.split('%');\n return this.escapeHtml(this.applyRule(config[key], type));\n }\n\n if (content.includes('@')) {\n const [text, alt] = content.split('@');\n const displayText =\n text.startsWith('$') && config[text]\n ? this.translate(config[text])\n : text;\n return `<a alt=\"${this.escapeHtml(alt)}\">${this.escapeHtml(\n displayText\n )}</a>`;\n }\n\n if (content.startsWith('$')) {\n const param = config[content] ?? config[content.substring(1)];\n // An unfilled slot stays visible rather than resolving to nothing.\n // `translate(undefined)` returns '', so `Found <$count> apps` rendered\n // as `Found apps` — the slot deleted itself and the sentence read as a\n // typo. `replacePlaceholders` already promises the opposite (\"a\n // placeholder with no matching param is left untouched\"), and every\n // caller documents `<$name>` as what an unfilled slot draws.\n if (param === undefined) return `<${content}>`;\n return this.escapeHtml(this.translate(param));\n }\n\n return `<${content}>`;\n }\n\n private readonly addLink = (\n text: string,\n config: Record<string, string> = {}\n ): string => {\n return text.replace(/<.+?>/g, (elem) =>\n this.processLinkContent(elem.slice(1, -1), config)\n );\n };\n\n /**\n * Render already-resolved MiniMark text to HTML, skipping translate()'s key\n * lookup / placeholder / addLink processing. Use this when the source is\n * literal authored content rather than a translation key (e.g. a\n * `noTranslate` config flag). Returns a plain string — see ADR 0002.\n */\n public readonly toSafeHtml = (text?: string): string => miniMarkToHtml(text);\n\n /**\n * Escape HTML special characters to prevent XSS\n */\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n /**\n * Sanitize URLs to prevent javascript: and data: URI XSS attacks\n */\n private sanitizeUrl(url: string): string {\n const trimmedUrl = url.trim().toLowerCase();\n\n // Block dangerous protocols\n const dangerousProtocols = ['javascript:', 'data:', 'vbscript:', 'file:'];\n if (\n dangerousProtocols.some((protocol) => trimmedUrl.startsWith(protocol))\n ) {\n return '#';\n }\n\n // Allow only http, https, mailto, and relative URLs\n if (\n trimmedUrl.startsWith('http:/') ||\n trimmedUrl.startsWith('https:/') ||\n trimmedUrl.startsWith('mailto:') ||\n trimmedUrl.startsWith('/') ||\n trimmedUrl.startsWith('#') ||\n trimmedUrl.startsWith('.')\n ) {\n return url;\n }\n\n // If no protocol specified, treat as relative URL\n if (!trimmedUrl.includes(':')) {\n return url;\n }\n\n // Block everything else\n return '#';\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate';\n\n@Pipe({\n name: 'translate',\n pure: false,\n})\nexport class TranslatePipe implements PipeTransform {\n private readonly translateService = inject(TranslateService);\n\n transform(\n value?: string | number,\n config?: Record<string, string> | undefined\n ): string {\n // Only nullish / empty-string skip — boolean `false` and `0` are not\n // translation keys, and TranslateService already rejects non-strings.\n if (value == null || value === '') return '';\n return this.translateService.translate(value, config);\n }\n}\n","import { DEFAULT_SIZE, Size } from '../../enum/scaling/size';\n\n/**\n * The three Sizes as absolute lengths. Absolute rather than relative is what\n * makes a Size idempotent: a `sm` Section nested inside a `sm` Section renders\n * at 0.75rem, not at 0.75 of it (ADR 0008).\n */\nconst SIZE_LENGTH: Record<Size, string> = {\n [Size.SMALL]: '0.75rem',\n [Size.MEDIUM]: '1rem',\n [Size.LARGE]: '1.5rem',\n};\n\n/**\n * Total over the three Sizes. Deliberately accepts nothing else — the old\n * `derivedSize` ended in `default: return size`, which is how `1.3rem` and\n * `full-width` ended up in the assets. Lengths that are not Sizes go through\n * `toLength` instead.\n *\n * Non-Size values (empty string, legacy options like `xxs`/`n`) must not win\n * over the default: `size ?? DEFAULT` still picks them, and callers then write\n * `calc(undefined * 1.1)` onto Icons — glyph in the DOM, size zero on screen.\n */\nexport function resolveSize(size: Size | string | undefined): string {\n return SIZE_LENGTH[isSize(size) ? size : DEFAULT_SIZE];\n}\n\nexport function isSize(value: unknown): value is Size {\n return (\n value === Size.SMALL || value === Size.MEDIUM || value === Size.LARGE\n );\n}\n\n/**\n * First real Size among the candidates, else the default. Used by Section /\n * SectionForm / ButtonGroup so a bad `configs.size` (empty string, legacy\n * option) never becomes SIZE_CONTEXT and zero out every Icon underneath.\n */\nexport function coerceSize(\n ...candidates: Array<Size | string | undefined | null>\n): Size {\n for (const candidate of candidates) {\n if (isSize(candidate)) return candidate;\n }\n return DEFAULT_SIZE;\n}\n\n/**\n * A free CSS length for the things that are spacing or geometry rather than\n * Size — FlexContainer's gap, Jumbotron's margin and radius. Knows nothing\n * about Size, so the enum can no longer be borrowed for lengths.\n */\nexport function toLength(\n value: number | string | undefined,\n isNone?: true\n): string {\n if (value === undefined || value === null || value === '') {\n return isNone ? 'none' : '0';\n }\n return typeof value === 'number' ? `${value}em` : value;\n}\n\n/**\n * Box length for an Icon's square glyph. An explicit override wins over the\n * Size in force; otherwise the SizeContext length scaled by 1.1 — the same box\n * Icons paint at when they only inherit. A bare number (or a unitless numeric\n * string, the form attributes take) becomes `em`; any other string is a CSS\n * length as written. This is a length, not a Size: Size stays on Section /\n * ButtonGroup (ADR 0008); the Icon just opts out of that box when it must.\n */\nexport function resolveIconSize(\n override: number | string | undefined | null,\n contextSize?: Size | string | undefined\n): string {\n if (override === undefined || override === null || override === '') {\n return `calc(${resolveSize(contextSize)} * 1.1)`;\n }\n if (typeof override === 'number') return `${override}em`;\n const trimmed = override.trim();\n if (trimmed === '') return `calc(${resolveSize(contextSize)} * 1.1)`;\n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) return `${trimmed}em`;\n return trimmed;\n}\n\n/**\n * A box dimension — min/max width and height. Unitless means px here, not em:\n * these read as box dimensions, matching Section's `height`, whereas `toLength`\n * serves spacing and defaults a bare number to `em`. Any other CSS length\n * (`50%`, `20vh`, `10em`) passes through untouched, and an empty value returns\n * `undefined` so the style binding is dropped rather than written as `''`.\n */\nexport function toCssLength(\n value: number | string | undefined\n): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'number') return `${value}px`;\n const trimmed = value.trim();\n if (trimmed === '') return undefined;\n return /^\\d+(\\.\\d+)?$/.test(trimmed) ? `${trimmed}px` : trimmed;\n}\n\n// `toLength` only appends `em` to real numbers — a numeric string comes back\n// bare, yielding `gap: 2`. Design-editor text fields, YAML and plain tag\n// attributes all hand over strings, so narrow before converting.\nconst toSpacingValue = (value: number | string): number | string => {\n if (typeof value !== 'string') return value;\n const trimmed = value.trim();\n if (trimmed === '' || Number.isNaN(Number(trimmed))) return value;\n return Number(trimmed);\n};\n\n/**\n * Spacing on the em scale — gap, padding, margin — or nothing at all: an unset\n * value drops the style binding rather than writing `toLength`'s `0` over what\n * CSS would have done.\n */\nexport function resolveSpacing(\n value: number | string | undefined | null\n): string | undefined {\n return value === undefined || value === null || value === ''\n ? undefined\n : toLength(toSpacingValue(value));\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { t as __exportAll } from "./magmonium-one-rolldown-runtime-DpJrqANO.mjs";
|
|
2
|
-
import { c as TranslatePipe } from "./magmonium-one-size-converter-
|
|
3
|
-
import { t as LabelComponent } from "./magmonium-one-label-
|
|
4
|
-
import {
|
|
5
|
-
import { r as IconComponent } from "./magmonium-one-icon-C3jwzbb2.mjs";
|
|
6
|
-
import { t as TextOutputComponent } from "./magmonium-one-text-output-BZU61QIF.mjs";
|
|
2
|
+
import { c as TranslatePipe } from "./magmonium-one-size-converter-DFIowQHO.mjs";
|
|
3
|
+
import { t as LabelComponent } from "./magmonium-one-label-lYMBMB7p.mjs";
|
|
4
|
+
import { r as IconComponent } from "./magmonium-one-icon-Ce44a1mo.mjs";
|
|
7
5
|
import { t as InputType } from "./magmonium-one-input-DqHPorA1.mjs";
|
|
6
|
+
import { t as BaseTextInputComponent } from "./magmonium-one-base-text-6T8KrJbz.mjs";
|
|
7
|
+
import { t as TextOutputComponent } from "./magmonium-one-text-output-BnS5Skz-.mjs";
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
import { ChangeDetectionStrategy, Component, computed, input, model } from "@angular/core";
|
|
10
10
|
var text_exports = /* @__PURE__ */ __exportAll({ TextInputComponent: () => TextInputComponent });
|
|
@@ -404,4 +404,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
404
404
|
});
|
|
405
405
|
export { text_exports as n, TextInputComponent as t };
|
|
406
406
|
|
|
407
|
-
//# sourceMappingURL=magmonium-one-text-
|
|
407
|
+
//# sourceMappingURL=magmonium-one-text-evdqwPEz.mjs.map
|
package/fesm2022/{magmonium-one-text-BnTkYLJe.mjs.map → magmonium-one-text-evdqwPEz.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-text-
|
|
1
|
+
{"version":3,"file":"magmonium-one-text-evdqwPEz.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/text/text.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n} from '@angular/core';\nimport { LabelComponent } from '../label';\nimport { TextOutputComponent } from '../../../text-output';\nimport { BaseTextInputComponent } from './base-text';\nimport { IconComponent } from '../../../icon';\nimport { TranslatePipe } from '../../../../pipe';\nimport { Input, InputType, NumberInput } from '../../model/input';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\n\n/**\n * What this one component draws: a line of text, or the same line typed\n * `number`. WrapperInputComponent has no case for a `number` Field, so it\n * lands here — and the figures a NumberInput carries have to be readable off\n * the config the template already holds.\n */\nexport type TextOrNumberInput = Omit<Input, 'type'> &\n Pick<NumberInput, 'min' | 'max' | 'step'> & {\n type: InputType.TEXT | InputType.NUMBER;\n };\n\n@Component({\n selector: 'm-text-input',\n template: `\n @if (config(); as text) {\n @if (text.label) {\n <m-label\n [for]=\"text.name ?? ''\"\n [placeholder]=\"text.label\"\n [params]=\"text.params\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n }\n <div class=\"input-wrapper\">\n @if (text.icon) {\n <m-icon\n [name]=\"text.icon\"\n [color]=\"iconColor()\"\n [one]=\"text.one\"\n />\n }\n @if (text.prefix) {\n <span class=\"input-prefix\">{{ text.prefix }}</span>\n }\n <input\n [id]=\"text.name ?? ''\"\n [attr.data-testid]=\"text.testid ?? (text.name ? text.name + '-input' : null)\"\n [value]=\"value()\"\n #inputElement\n [class.error]=\"showErrors()\"\n [class.has-icon]=\"!!text.icon\"\n [class.has-prefix]=\"!!text.prefix\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly() || config()?.readonly\"\n [placeholder]=\"text.placeholder ?? '' | translate: text.params\"\n (input)=\"onInput($event)\"\n (focus)=\"isFocused.set(true)\"\n (blur)=\"isFocused.set(false); touched.set(true)\"\n [type]=\"isNumber() ? 'number' : 'text'\"\n [attr.min]=\"isNumber() ? text.min ?? null : null\"\n [attr.max]=\"isNumber() ? text.max ?? null : null\"\n [attr.step]=\"isNumber() ? text.step ?? null : null\"\n />\n @if (config()?.status; as status) {\n <div class=\"input-indicator\" [class]=\"'input-indicator--' + status\">\n @if (status === 'checking') {\n <span class=\"spinner\"></span>\n } @else if (status === 'available') {\n <m-icon name=\"check\" color=\"success\" />\n }\n </div>\n }\n @if (text.suffix) {\n <span class=\"input-suffix\">{{ text.suffix }}</span>\n }\n </div>\n @if (showErrors() && !hideErrors()) {\n @for (error of errors(); track $index) {\n <m-text-output\n variant=\"footer\"\n color=\"error\"\n [label]=\"error.message\"\n />\n }\n }\n }\n `,\n imports: [LabelComponent, TextOutputComponent, IconComponent, TranslatePipe],\n styleUrl: './text.sass',\n host: {\n '[class]': \"config()?.variant ? 'm-input--' + config()?.variant : ''\",\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TextInputComponent extends BaseTextInputComponent<TextOrNumberInput> {\n public override value = model<string>('');\n public override config = input<Partial<TextOrNumberInput> | undefined>();\n public override required = input<boolean>(false);\n public override disabled = input<boolean>(false);\n public override invalid = input<boolean>(false);\n public override touched = model<boolean>(false);\n public override focused = input<boolean>(false);\n public override errors = input<readonly WithOptionalFieldTree<ValidationError>[]>(\n []\n );\n public override showErrors = computed(() => this.touched() && this.invalid());\n readonly hideErrors = input<boolean>(false);\n\n // A `number` Field draws this same component (WrapperInputComponent has no\n // case of its own for it), so the type it declares decides the element it\n // draws. What *leaves* the field is coerced a level up, in the wrapper: an\n // `<input>` reads its value as text whatever its type, and every other\n // component on this base is a string field.\n protected readonly isNumber = computed(() => {\n const config = this.config();\n return !!config && config.type === InputType.NUMBER;\n });\n\n protected onInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.setValue(target?.value ?? '');\n }\n}\n"],"mappings":"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"}
|
package/fesm2022/{magmonium-one-text-output-BZU61QIF.mjs → magmonium-one-text-output-BnS5Skz-.mjs}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { l as TranslateService,
|
|
2
|
-
import { n as resolvePallet } from "./magmonium-one-color-utl-
|
|
3
|
-
import { r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-
|
|
1
|
+
import { l as TranslateService, rt as LAYOUT_ASSET_FOLDER } from "./magmonium-one-size-converter-DFIowQHO.mjs";
|
|
2
|
+
import { n as resolvePallet } from "./magmonium-one-color-utl-DklqRa3m.mjs";
|
|
3
|
+
import { r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-DnctyCKp.mjs";
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import { ChangeDetectionStrategy, Component, computed, inject, input, model, output } from "@angular/core";
|
|
6
6
|
var TextOutputComponent = class TextOutputComponent extends ConfigComponent {
|
|
@@ -293,4 +293,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
293
293
|
});
|
|
294
294
|
export { TextOutputComponent as t };
|
|
295
295
|
|
|
296
|
-
//# sourceMappingURL=magmonium-one-text-output-
|
|
296
|
+
//# sourceMappingURL=magmonium-one-text-output-BnS5Skz-.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-text-output-BZU61QIF.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/text-output/ui/text-output.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { TranslateService } from '../../../services/translate';\nimport { ConfigComponent } from '../../../lib/components/config-component';\nimport { Config } from '../../../type/config/config-type';\nimport { LAYOUT_ASSET_FOLDER } from '../../../enum';\nimport { toAttrBool } from '../../../functions/config/attribute-value';\nimport { resolvePallet } from '../../../lib/theme/lib/color-utl';\n\nexport type TextOutputAlign = 'left' | 'right' | 'center';\n\n// Variants are roles, not styles: each one says what the text is doing on the\n// page, and the Section it sits in decides how big that role renders. Every\n// size below is therefore an `em` multiple of the inherited Section font-size\n// — a `lead` in a compact Section stays proportionally a lead — which is the\n// one rule the plain (undefined) variant keeps by inheriting outright.\n//\n// - `lead` opening paragraph that introduces the block under it\n// - `big` one-line statement — a number, a verdict, a headline that is\n// not a SectionHeader\n// - `bold` emphasis at body size, for the line that must be read first\n// - `footer` annotation under the thing it describes — a field's validation\n// message, a caption, a disclaimer; 0.75 of body, body colour\n// - `footnote` aside the reader may skip — source, legal line, small print;\n// 0.6 of body, body colour\n// - `link` text that goes somewhere on click — an affordance rather than\n// a size, so it is the one role that stays inline, takes focus,\n// and emits `clicked`\n// - `link-small` the same affordance for a link that trails the content it\n// belongs to rather than carrying a line of its own — a \"see\n// all\", an \"edit\" beside a field; body size like `link`\nexport type TextOutputVariant =\n | 'lead'\n | 'big'\n | 'bold'\n | 'footer'\n | 'footnote'\n | 'link'\n | 'link-small';\n\n// Weight tokens of the type scale. Applied after the variant, so it overrides\n// the weight a role implies (`lead` light, `big` semibold, `bold` bold).\nexport type TextOutputFontWeight =\n | 'light'\n | 'normal'\n | 'medium'\n | 'semibold'\n | 'bold';\n\nexport interface TextOutputConfig extends Config {\n label?: string;\n noTranslate?: boolean;\n align?: TextOutputAlign;\n variant?: TextOutputVariant;\n color?: string;\n fontWeight?: TextOutputFontWeight;\n}\n\n@Component({\n selector: 'm-text-output',\n imports: [],\n template: `\n <div\n class=\"m-text-output\"\n [style.color]=\"resolvedColorPallet().color\"\n [innerHTML]=\"html()\"\n ></div>\n `,\n styleUrl: './text-output.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'm-text-output-host',\n '[class.is-design-mode]': 'isDesignMode',\n '[class.align-left]': 'resolvedAlign() === \"left\"',\n '[class.align-right]': 'resolvedAlign() === \"right\"',\n '[class.align-center]': 'resolvedAlign() === \"center\"',\n '[class.variant-lead]': 'resolvedVariant() === \"lead\"',\n '[class.variant-big]': 'resolvedVariant() === \"big\"',\n '[class.variant-bold]': 'resolvedVariant() === \"bold\"',\n '[class.variant-footer]': 'resolvedVariant() === \"footer\"',\n '[class.variant-footnote]': 'resolvedVariant() === \"footnote\"',\n '[class.variant-link]': 'resolvedVariant() === \"link\"',\n '[class.variant-link-small]': 'resolvedVariant() === \"link-small\"',\n '[class.weight-light]': 'resolvedFontWeight() === \"light\"',\n '[class.weight-normal]': 'resolvedFontWeight() === \"normal\"',\n '[class.weight-medium]': 'resolvedFontWeight() === \"medium\"',\n '[class.weight-semibold]': 'resolvedFontWeight() === \"semibold\"',\n '[class.weight-bold]': 'resolvedFontWeight() === \"bold\"',\n '[class.has-color]': '!!(color() ?? config()?.color)',\n // Only a link is reachable and announced as one. Every other variant is a\n // size, and a focus stop on plain text is a tab stop that does nothing.\n '[attr.role]': 'isLink() ? \"link\" : null',\n '[attr.tabindex]': 'isLink() ? 0 : null',\n '(click)': 'onClick()',\n '(keydown.enter)': 'onClick()',\n '[style.--m-text-output-color]': 'resolvedColorPallet().color',\n '[style.--m-text-output-color-contrast]': 'resolvedColorPallet().contrastColor',\n '[style.--m-text-output-color-opposite]': 'resolvedColorPallet().oppositeColor',\n },\n})\nexport class TextOutputComponent extends ConfigComponent<TextOutputConfig> {\n override subFolder = LAYOUT_ASSET_FOLDER.text_output;\n override config = model<Partial<TextOutputConfig>>();\n private readonly translateService = inject(TranslateService);\n\n readonly align = input<TextOutputAlign | undefined>(undefined);\n readonly variant = input<TextOutputVariant | undefined>(undefined);\n // A theme colour key (`error`, `warning`, `success`, …) or a raw CSS colour,\n // resolved the same way an Icon's or a Logo's is so a token follows the\n // active theme instead of freezing one theme's hex into a template.\n readonly color = input<string | undefined>(undefined);\n readonly fontWeight = input<TextOutputFontWeight | undefined>(undefined);\n // `label` is the text itself, so a one-off TextOutput needs no asset behind\n // it (ADR 0010). MiniMark is a single string whatever it renders to, which\n // is what lets it ride on the tag at all.\n readonly label = input<string | undefined>(undefined);\n readonly noTranslate = input<boolean | string | undefined>(undefined);\n // Values for the message's `<name>` / `<$name>` placeholders. An input and\n // deliberately not a TextOutputConfig key: an asset is resolved by name and\n // shared across every Control that names it, and these differ per render\n // (ADR 0020). The query-string form (`min_length?len=6`) still works and\n // still loses to this on a shared placeholder, that being the precedence\n // TranslateService already had. Bind a named member — an object literal in a\n // template is refused by `no-inline-config` (ADR 0010).\n readonly params = input<Record<string, string> | undefined>(undefined);\n\n readonly resolvedAlign = computed<TextOutputAlign>(\n () => this.align() ?? this.config()?.align ?? 'left'\n );\n\n protected readonly resolvedVariant = computed<TextOutputVariant | undefined>(\n () => this.variant() ?? this.config()?.variant\n );\n\n protected readonly resolvedFontWeight = computed<\n TextOutputFontWeight | undefined\n >(() => this.fontWeight() ?? this.config()?.fontWeight);\n\n // Both link roles are the same affordance, so both take the focus stop, the\n // `role=\"link\"` and the `clicked` output; only their size differs.\n protected readonly isLink = computed(() => {\n const variant = this.resolvedVariant();\n return variant === 'link' || variant === 'link-small';\n });\n\n /**\n * Fired by a `link` variant and by nothing else. A text that is not a link\n * draws no affordance and takes no focus, so a click on it is a click on\n * prose — emitting there would be a control only a mouse could find.\n *\n * Where the link goes to a route instead, the caller attaches `routerLink`\n * and binds nothing here: one click means one thing.\n */\n readonly clicked = output<void>();\n\n protected onClick(): void {\n if (this.isLink()) this.clicked.emit();\n }\n\n protected readonly resolvedColorPallet = computed(() =>\n resolvePallet(\n this.color() ?? this.config()?.color ?? this.defaultColor,\n this.themeStore.color()\n )\n );\n\n protected override resolveComponentOverrides(): Partial<TextOutputConfig> {\n const overrides: Partial<TextOutputConfig> = {};\n const align = this.align();\n if (align !== undefined) overrides.align = align;\n const label = this.label();\n if (label !== undefined) overrides.label = label;\n const noTranslate = toAttrBool(this.noTranslate());\n if (noTranslate !== undefined) overrides.noTranslate = noTranslate;\n const variant = this.variant();\n if (variant !== undefined) overrides.variant = variant;\n const color = this.color();\n if (color !== undefined) overrides.color = color;\n const fontWeight = this.fontWeight();\n if (fontWeight !== undefined) overrides.fontWeight = fontWeight;\n return overrides;\n }\n\n protected readonly resolvedLabel = computed(() => this.config()?.label);\n protected readonly shouldTranslate = computed(\n () => !this.config()?.noTranslate\n );\n protected readonly html = computed(() => {\n const label = this.resolvedLabel();\n return this.shouldTranslate()\n ? this.translateService.translateToHtml(label, this.params())\n : this.translateService.toSafeHtml(label);\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"magmonium-one-text-output-BnS5Skz-.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/text-output/ui/text-output.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { TranslateService } from '../../../services/translate';\nimport { ConfigComponent } from '../../../lib/components/config-component';\nimport { Config } from '../../../type/config/config-type';\nimport { LAYOUT_ASSET_FOLDER } from '../../../enum';\nimport { toAttrBool } from '../../../functions/config/attribute-value';\nimport { resolvePallet } from '../../../lib/theme/lib/color-utl';\n\nexport type TextOutputAlign = 'left' | 'right' | 'center';\n\n// Variants are roles, not styles: each one says what the text is doing on the\n// page, and the Section it sits in decides how big that role renders. Every\n// size below is therefore an `em` multiple of the inherited Section font-size\n// — a `lead` in a compact Section stays proportionally a lead — which is the\n// one rule the plain (undefined) variant keeps by inheriting outright.\n//\n// - `lead` opening paragraph that introduces the block under it\n// - `big` one-line statement — a number, a verdict, a headline that is\n// not a SectionHeader\n// - `bold` emphasis at body size, for the line that must be read first\n// - `footer` annotation under the thing it describes — a field's validation\n// message, a caption, a disclaimer; 0.75 of body, body colour\n// - `footnote` aside the reader may skip — source, legal line, small print;\n// 0.6 of body, body colour\n// - `link` text that goes somewhere on click — an affordance rather than\n// a size, so it is the one role that stays inline, takes focus,\n// and emits `clicked`\n// - `link-small` the same affordance for a link that trails the content it\n// belongs to rather than carrying a line of its own — a \"see\n// all\", an \"edit\" beside a field; body size like `link`\nexport type TextOutputVariant =\n | 'lead'\n | 'big'\n | 'bold'\n | 'footer'\n | 'footnote'\n | 'link'\n | 'link-small';\n\n// Weight tokens of the type scale. Applied after the variant, so it overrides\n// the weight a role implies (`lead` light, `big` semibold, `bold` bold).\nexport type TextOutputFontWeight =\n | 'light'\n | 'normal'\n | 'medium'\n | 'semibold'\n | 'bold';\n\nexport interface TextOutputConfig extends Config {\n label?: string;\n noTranslate?: boolean;\n align?: TextOutputAlign;\n variant?: TextOutputVariant;\n color?: string;\n fontWeight?: TextOutputFontWeight;\n}\n\n@Component({\n selector: 'm-text-output',\n imports: [],\n template: `\n <div\n class=\"m-text-output\"\n [style.color]=\"resolvedColorPallet().color\"\n [innerHTML]=\"html()\"\n ></div>\n `,\n styleUrl: './text-output.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'm-text-output-host',\n '[class.is-design-mode]': 'isDesignMode',\n '[class.align-left]': 'resolvedAlign() === \"left\"',\n '[class.align-right]': 'resolvedAlign() === \"right\"',\n '[class.align-center]': 'resolvedAlign() === \"center\"',\n '[class.variant-lead]': 'resolvedVariant() === \"lead\"',\n '[class.variant-big]': 'resolvedVariant() === \"big\"',\n '[class.variant-bold]': 'resolvedVariant() === \"bold\"',\n '[class.variant-footer]': 'resolvedVariant() === \"footer\"',\n '[class.variant-footnote]': 'resolvedVariant() === \"footnote\"',\n '[class.variant-link]': 'resolvedVariant() === \"link\"',\n '[class.variant-link-small]': 'resolvedVariant() === \"link-small\"',\n '[class.weight-light]': 'resolvedFontWeight() === \"light\"',\n '[class.weight-normal]': 'resolvedFontWeight() === \"normal\"',\n '[class.weight-medium]': 'resolvedFontWeight() === \"medium\"',\n '[class.weight-semibold]': 'resolvedFontWeight() === \"semibold\"',\n '[class.weight-bold]': 'resolvedFontWeight() === \"bold\"',\n '[class.has-color]': '!!(color() ?? config()?.color)',\n // Only a link is reachable and announced as one. Every other variant is a\n // size, and a focus stop on plain text is a tab stop that does nothing.\n '[attr.role]': 'isLink() ? \"link\" : null',\n '[attr.tabindex]': 'isLink() ? 0 : null',\n '(click)': 'onClick()',\n '(keydown.enter)': 'onClick()',\n '[style.--m-text-output-color]': 'resolvedColorPallet().color',\n '[style.--m-text-output-color-contrast]': 'resolvedColorPallet().contrastColor',\n '[style.--m-text-output-color-opposite]': 'resolvedColorPallet().oppositeColor',\n },\n})\nexport class TextOutputComponent extends ConfigComponent<TextOutputConfig> {\n override subFolder = LAYOUT_ASSET_FOLDER.text_output;\n override config = model<Partial<TextOutputConfig>>();\n private readonly translateService = inject(TranslateService);\n\n readonly align = input<TextOutputAlign | undefined>(undefined);\n readonly variant = input<TextOutputVariant | undefined>(undefined);\n // A theme colour key (`error`, `warning`, `success`, …) or a raw CSS colour,\n // resolved the same way an Icon's or a Logo's is so a token follows the\n // active theme instead of freezing one theme's hex into a template.\n readonly color = input<string | undefined>(undefined);\n readonly fontWeight = input<TextOutputFontWeight | undefined>(undefined);\n // `label` is the text itself, so a one-off TextOutput needs no asset behind\n // it (ADR 0010). MiniMark is a single string whatever it renders to, which\n // is what lets it ride on the tag at all.\n readonly label = input<string | undefined>(undefined);\n readonly noTranslate = input<boolean | string | undefined>(undefined);\n // Values for the message's `<name>` / `<$name>` placeholders. An input and\n // deliberately not a TextOutputConfig key: an asset is resolved by name and\n // shared across every Control that names it, and these differ per render\n // (ADR 0020). The query-string form (`min_length?len=6`) still works and\n // still loses to this on a shared placeholder, that being the precedence\n // TranslateService already had. Bind a named member — an object literal in a\n // template is refused by `no-inline-config` (ADR 0010).\n readonly params = input<Record<string, string> | undefined>(undefined);\n\n readonly resolvedAlign = computed<TextOutputAlign>(\n () => this.align() ?? this.config()?.align ?? 'left'\n );\n\n protected readonly resolvedVariant = computed<TextOutputVariant | undefined>(\n () => this.variant() ?? this.config()?.variant\n );\n\n protected readonly resolvedFontWeight = computed<\n TextOutputFontWeight | undefined\n >(() => this.fontWeight() ?? this.config()?.fontWeight);\n\n // Both link roles are the same affordance, so both take the focus stop, the\n // `role=\"link\"` and the `clicked` output; only their size differs.\n protected readonly isLink = computed(() => {\n const variant = this.resolvedVariant();\n return variant === 'link' || variant === 'link-small';\n });\n\n /**\n * Fired by a `link` variant and by nothing else. A text that is not a link\n * draws no affordance and takes no focus, so a click on it is a click on\n * prose — emitting there would be a control only a mouse could find.\n *\n * Where the link goes to a route instead, the caller attaches `routerLink`\n * and binds nothing here: one click means one thing.\n */\n readonly clicked = output<void>();\n\n protected onClick(): void {\n if (this.isLink()) this.clicked.emit();\n }\n\n protected readonly resolvedColorPallet = computed(() =>\n resolvePallet(\n this.color() ?? this.config()?.color ?? this.defaultColor,\n this.themeStore.color()\n )\n );\n\n protected override resolveComponentOverrides(): Partial<TextOutputConfig> {\n const overrides: Partial<TextOutputConfig> = {};\n const align = this.align();\n if (align !== undefined) overrides.align = align;\n const label = this.label();\n if (label !== undefined) overrides.label = label;\n const noTranslate = toAttrBool(this.noTranslate());\n if (noTranslate !== undefined) overrides.noTranslate = noTranslate;\n const variant = this.variant();\n if (variant !== undefined) overrides.variant = variant;\n const color = this.color();\n if (color !== undefined) overrides.color = color;\n const fontWeight = this.fontWeight();\n if (fontWeight !== undefined) overrides.fontWeight = fontWeight;\n return overrides;\n }\n\n protected readonly resolvedLabel = computed(() => this.config()?.label);\n protected readonly shouldTranslate = computed(\n () => !this.config()?.noTranslate\n );\n protected readonly html = computed(() => {\n const label = this.resolvedLabel();\n return this.shouldTranslate()\n ? this.translateService.translateToHtml(label, this.params())\n : this.translateService.toSafeHtml(label);\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./magmonium-one-color-utl-DklqRa3m.mjs";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as TranslatePipe } from "./magmonium-one-size-converter-
|
|
2
|
-
import { t as BaseInputComponent } from "./magmonium-one-base-input-
|
|
1
|
+
import { c as TranslatePipe } from "./magmonium-one-size-converter-DFIowQHO.mjs";
|
|
2
|
+
import { t as BaseInputComponent } from "./magmonium-one-base-input-CZyIcKrn.mjs";
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import { ChangeDetectionStrategy, Component, computed, input, model } from "@angular/core";
|
|
5
5
|
var ToggleInputComponent = class ToggleInputComponent extends BaseInputComponent {
|
|
@@ -228,4 +228,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
228
228
|
});
|
|
229
229
|
export { ToggleInputComponent };
|
|
230
230
|
|
|
231
|
-
//# sourceMappingURL=magmonium-one-toggle-
|
|
231
|
+
//# sourceMappingURL=magmonium-one-toggle-BIoiSggh.mjs.map
|
package/fesm2022/{magmonium-one-toggle-V_YnZXx5.mjs.map → magmonium-one-toggle-BIoiSggh.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-toggle-
|
|
1
|
+
{"version":3,"file":"magmonium-one-toggle-BIoiSggh.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/toggle/toggle.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n ModelSignal,\n} from '@angular/core';\nimport { ToggleInput } from '../../model/input';\nimport { TranslatePipe } from '../../../../pipe/translate';\nimport {\n FormCheckboxControl,\n ValidationError,\n WithOptionalFieldTree,\n} from '@angular/forms/signals';\nimport { BaseInputComponent } from '../../lib/base-input';\n\n@Component({\n selector: 'm-toggle-input',\n template: `\n @if (config(); as toggle) {\n <div class=\"toggle\">\n <input\n [id]=\"toggle.name ?? ''\"\n [checked]=\"checked()\"\n (change)=\"onChange($event)\"\n type=\"checkbox\"\n />\n <label [attr.for]=\"toggle.name || null\">{{\n toggle.label | translate\n }}</label>\n </div>\n }\n `,\n imports: [TranslatePipe],\n styleUrl: './toggle.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToggleInputComponent\n extends BaseInputComponent<ToggleInput>\n implements FormCheckboxControl\n{\n public value = undefined;\n public checked = model<boolean>(false) as ModelSignal<boolean>;\n public override config = input<Partial<ToggleInput> | undefined>();\n public override required = input<boolean>(false);\n public override disabled = input<boolean>(false);\n public override invalid = input<boolean>(false);\n public override touched = model<boolean>(false);\n public override focused = input<boolean>(false);\n public override errors = input<readonly WithOptionalFieldTree<ValidationError>[]>(\n []\n );\n public override showErrors = computed(() => this.touched() && this.invalid());\n\n /** Required by FormCheckboxControl interface */\n // public readonly checked: ModelSignal<boolean> = this.value; // Already defined above\n\n constructor() {\n super();\n }\n\n protected onChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.checked.set(target?.checked ?? false);\n }\n}\n"],"mappings":";;;;AAsCA,IAAa,uBAAb,MAAa,6BACH,mBAA+B;CAGhC,QAAQ;CACR,UAAU,MAAe,KAAK;CACrB,SAAS,MAAyC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAClD,WAAW,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,WAAW,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,UAAU,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,UAAU,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,UAAU,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC/B,SAAS,MACvB,CAAA,GACD,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACe,aAAa,eAAe,KAAK,QAAO,KAAM,KAAK,QAAO,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAK7E,cAAA;EACE,MAAK;CACP;CAEU,SAAS,OAAY;EAC7B,MAAM,SAAS,MAAM;EACrB,KAAK,QAAQ,IAAI,QAAQ,WAAW,KAAK;CAC3C;CA3BW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAoB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAApB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAoB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,SAAA;GAAA,SAAA;EAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UAnBrB;;;;;;;;;;;;;;;EAcT,UAAA;EAAA,QAAA,CAAA,+6GAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MACS;GAAa,MAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAIZ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EArBhC,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAgB,UAChB;;;;;;;;;;;;;;;GAcT,SACQ,CAAC,aAAa;GAAC,iBAEP,wBAAwB;GAAM,QAAA,CAAA,+6GAAA;EAAA,CAAA"}
|