@magmonium/one 0.4.49 → 0.4.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{magmonium-one-attribute-value-DnctyCKp.mjs → magmonium-one-attribute-value-CSl5Xeq1.mjs} +3 -3
- package/fesm2022/{magmonium-one-attribute-value-DnctyCKp.mjs.map → magmonium-one-attribute-value-CSl5Xeq1.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-checkbox-D3Z1FTXU.mjs → magmonium-one-base-checkbox-BqCPBI1d.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-checkbox-D3Z1FTXU.mjs.map → magmonium-one-base-checkbox-BqCPBI1d.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-dropdown-DIaimBpG.mjs → magmonium-one-base-dropdown-Dxo8Yd62.mjs} +10 -10
- package/fesm2022/{magmonium-one-base-dropdown-DIaimBpG.mjs.map → magmonium-one-base-dropdown-Dxo8Yd62.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-input-CZyIcKrn.mjs → magmonium-one-base-input-CsVND89n.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-input-CZyIcKrn.mjs.map → magmonium-one-base-input-CsVND89n.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-base-text-6T8KrJbz.mjs → magmonium-one-base-text-CWf7J75v.mjs} +2 -2
- package/fesm2022/{magmonium-one-base-text-6T8KrJbz.mjs.map → magmonium-one-base-text-CWf7J75v.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-button-BKGxIBhw.mjs → magmonium-one-button-CJ1Gaaw-.mjs} +7 -7
- package/fesm2022/{magmonium-one-button-BKGxIBhw.mjs.map → magmonium-one-button-CJ1Gaaw-.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-checkbox-D1W18OGo.mjs → magmonium-one-checkbox-CS83TVYG.mjs} +5 -5
- package/fesm2022/{magmonium-one-checkbox-D1W18OGo.mjs.map → magmonium-one-checkbox-CS83TVYG.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-color-utl-DklqRa3m.mjs → magmonium-one-color-utl-td5Lij8L.mjs} +2 -2
- package/fesm2022/{magmonium-one-color-utl-DklqRa3m.mjs.map → magmonium-one-color-utl-td5Lij8L.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-directives-R099YTUd.mjs → magmonium-one-directives-O1JyFBc3.mjs} +4 -4
- package/fesm2022/{magmonium-one-directives-R099YTUd.mjs.map → magmonium-one-directives-O1JyFBc3.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-group-Blvejahi.mjs → magmonium-one-group-CYIO2BE-.mjs} +7 -7
- package/fesm2022/{magmonium-one-group-Blvejahi.mjs.map → magmonium-one-group-CYIO2BE-.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-header-qoXWebFN.mjs → magmonium-one-header-7MmiF2rG.mjs} +17 -17
- package/fesm2022/magmonium-one-header-7MmiF2rG.mjs.map +1 -0
- package/fesm2022/{magmonium-one-icon-Ce44a1mo.mjs → magmonium-one-icon-DR7LgBc3.mjs} +4 -4
- package/fesm2022/{magmonium-one-icon-Ce44a1mo.mjs.map → magmonium-one-icon-DR7LgBc3.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-image-editor-DKiscgQU.mjs → magmonium-one-image-editor-CkPeheGY.mjs} +4 -4
- package/fesm2022/{magmonium-one-image-editor-DKiscgQU.mjs.map → magmonium-one-image-editor-CkPeheGY.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-label-lYMBMB7p.mjs → magmonium-one-label-B2Rtuiyg.mjs} +2 -2
- package/fesm2022/{magmonium-one-label-lYMBMB7p.mjs.map → magmonium-one-label-B2Rtuiyg.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-m-ref-DVe-WAYR.mjs → magmonium-one-m-ref-X9KgVe86.mjs} +2 -2
- package/fesm2022/{magmonium-one-m-ref-DVe-WAYR.mjs.map → magmonium-one-m-ref-X9KgVe86.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-menu-DcqfcU1p.mjs → magmonium-one-menu-Dstqv7P7.mjs} +6 -6
- package/fesm2022/{magmonium-one-menu-DcqfcU1p.mjs.map → magmonium-one-menu-Dstqv7P7.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-multi-range-m86SzSZO.mjs → magmonium-one-multi-range-OzTdXSHR.mjs} +3 -3
- package/fesm2022/{magmonium-one-multi-range-m86SzSZO.mjs.map → magmonium-one-multi-range-OzTdXSHR.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-options-asset-CIKSNq4B.mjs → magmonium-one-options-asset-BlrhLckD.mjs} +2 -2
- package/fesm2022/{magmonium-one-options-asset-CIKSNq4B.mjs.map → magmonium-one-options-asset-BlrhLckD.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-otp-BrR0mijm.mjs → magmonium-one-otp-CkQohg0H.mjs} +5 -5
- package/fesm2022/{magmonium-one-otp-BrR0mijm.mjs.map → magmonium-one-otp-CkQohg0H.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-password-CKIAFzs9.mjs → magmonium-one-password-CLhWaUXK.mjs} +6 -6
- package/fesm2022/{magmonium-one-password-CKIAFzs9.mjs.map → magmonium-one-password-CLhWaUXK.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-radio-6oN9j_F6.mjs → magmonium-one-radio-dZL0E4k_.mjs} +3 -3
- package/fesm2022/{magmonium-one-radio-6oN9j_F6.mjs.map → magmonium-one-radio-dZL0E4k_.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-range-BmimLpG6.mjs → magmonium-one-range-DLu5PhUN.mjs} +4 -4
- package/fesm2022/{magmonium-one-range-BmimLpG6.mjs.map → magmonium-one-range-DLu5PhUN.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-selector-CLSwVQCJ.mjs → magmonium-one-selector-GGFfBf2O.mjs} +4 -4
- package/fesm2022/{magmonium-one-selector-CLSwVQCJ.mjs.map → magmonium-one-selector-GGFfBf2O.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-size-converter-DFIowQHO.mjs → magmonium-one-size-converter-BalJd7VH.mjs} +6 -2
- package/fesm2022/magmonium-one-size-converter-BalJd7VH.mjs.map +1 -0
- package/fesm2022/{magmonium-one-text-evdqwPEz.mjs → magmonium-one-text-BPThK6-y.mjs} +6 -6
- package/fesm2022/{magmonium-one-text-evdqwPEz.mjs.map → magmonium-one-text-BPThK6-y.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-text-output-BnS5Skz-.mjs → magmonium-one-text-output-Cg2dT_U_.mjs} +4 -4
- package/fesm2022/{magmonium-one-text-output-BnS5Skz-.mjs.map → magmonium-one-text-output-Cg2dT_U_.mjs.map} +1 -1
- package/fesm2022/magmonium-one-theme-CYT4pn5X.mjs +1 -0
- package/fesm2022/{magmonium-one-toggle-BIoiSggh.mjs → magmonium-one-toggle-DRG14zhR.mjs} +3 -3
- package/fesm2022/{magmonium-one-toggle-BIoiSggh.mjs.map → magmonium-one-toggle-DRG14zhR.mjs.map} +1 -1
- package/fesm2022/magmonium-one.mjs +44 -44
- package/fesm2022/magmonium-one.mjs.map +1 -1
- package/package.json +1 -1
- package/types/magmonium-one.d.ts +23 -16
- package/fesm2022/magmonium-one-header-qoXWebFN.mjs.map +0 -1
- package/fesm2022/magmonium-one-size-converter-DFIowQHO.mjs.map +0 -1
- package/fesm2022/magmonium-one-theme-DPBeYB-G.mjs +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { m as ThemeStore, t as applyColorsToElement } from "./magmonium-one-color-utl-
|
|
1
|
+
import { U as IS_DESIGN_MODE, b as HttpService, h as AssetStore } from "./magmonium-one-size-converter-BalJd7VH.mjs";
|
|
2
|
+
import { m as ThemeStore, t as applyColorsToElement } from "./magmonium-one-color-utl-td5Lij8L.mjs";
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import { ChangeDetectionStrategy, Component, ElementRef, computed, effect, inject, input, model, signal, untracked } from "@angular/core";
|
|
5
5
|
import { catchError, of } from "rxjs";
|
|
@@ -252,4 +252,4 @@ const toAttrNumber = (value) => {
|
|
|
252
252
|
};
|
|
253
253
|
export { resolveConfigAsset as i, toAttrNumber as n, ConfigComponent as r, toAttrBool as t };
|
|
254
254
|
|
|
255
|
-
//# sourceMappingURL=magmonium-one-attribute-value-
|
|
255
|
+
//# sourceMappingURL=magmonium-one-attribute-value-CSl5Xeq1.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-attribute-value-DnctyCKp.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/functions/config/resolve-config-asset.ts","../../../../libs/one/src/lib/shared/lib/components/config-component.ts","../../../../libs/one/src/lib/shared/functions/config/attribute-value.ts"],"sourcesContent":["import { catchError, Observable, of } from 'rxjs';\nimport { AssetStore } from '../../stores/asset.store';\nimport { Config } from '../../type/config/config-type';\n\n/**\n * Resolves a config asset by name via `AssetStore`, outside any component\n * injection context — callable from directives, stores, or components alike.\n */\nexport function resolveConfigAsset<T extends Config = Config>(\n assetStore: InstanceType<typeof AssetStore>,\n subFolder: string | undefined,\n name: string | undefined,\n isOne: boolean,\n remoteBaseUrl: string | undefined\n): Observable<Partial<T>> {\n if (!name) return of({});\n\n const parts = [subFolder, name].filter(\n (part): part is string => typeof part !== 'undefined'\n );\n const type = parts.length > 1 ? parts.slice(0, -1).join('/') : parts[0];\n const assetName = parts[parts.length - 1];\n\n return assetStore\n .resolve<Partial<T>>(type, assetName, isOne, remoteBaseUrl)\n .pipe(catchError(() => of({})));\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n model,\n signal,\n untracked,\n} from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { AssetStore } from '../../stores/asset.store';\nimport { Config } from '../../type/config/config-type';\nimport { resolveConfigAsset } from '../../functions/config/resolve-config-asset';\nimport { applyColorsToElement, ColorPallet } from '../theme/lib/color-utl';\nimport { ThemeStore } from '../theme/lib/theme-store';\nimport { HttpService } from '../../services/http';\nimport { IS_DESIGN_MODE } from '../../config/tokens';\n\n@Component({\n imports: [],\n selector: 'm-config',\n template: ``,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ConfigComponent<T extends Config = Config> {\n config = model<Partial<T>>();\n name = input<string | undefined>();\n baseUrl = input<string | undefined>();\n protected readonly subFolder: string | undefined = undefined;\n // Off for components whose settings are written on the tag: a Section Form\n // and its Items take every key as an attribute (ADR 0010), so their `name`\n // is the data key a form models by and not a `forms/*.yml` or\n // `fields/*.yml` to fetch. Config assets stay with <m-form> and its\n // <m-input-wrapper>, the pair that is reached by name alone.\n protected readonly resolvesConfigAsset: boolean = true;\n one = input<boolean | undefined>(undefined);\n protected readonly elementRef = inject(ElementRef);\n protected readonly isFromOne = computed(() => {\n if (this.one() || this.config()?.one) {\n return true;\n }\n return this.elementRef.nativeElement.tagName.startsWith('M-ONE');\n });\n protected readonly themeStore = inject(ThemeStore);\n\n // True when this component sits inside a visual editor's canvas (DesignMode).\n // Subclasses use it to render editor-only affordances — placeholder boxes for\n // otherwise zero-sized nodes, drop outlines, inert interactions.\n protected readonly isDesignMode = !!inject(IS_DESIGN_MODE, {\n optional: true,\n });\n\n protected readonly pallet = signal<ColorPallet | undefined>(undefined);\n\n remote = input<string | undefined>();\n protected readonly assetStore = inject(AssetStore);\n private readonly http = inject(HttpService);\n private readonly previousName = signal<string | undefined>(undefined);\n // Protected: a subclass resolving an asset of its own — a Field's accepted\n // shapes — has to reach the same Remote its config came from.\n protected readonly remoteBaseUrl = computed<string | undefined>(() => {\n const remoteId = this.remote() ?? this.config()?.remote;\n return remoteId ? this.http.buildWcAssetBaseUrl(remoteId) : undefined;\n });\n private readonly assetsPath = computed<\n | {\n name: string;\n isOne: boolean;\n remoteBaseUrl: string | undefined;\n }\n | undefined\n >(() => {\n const name = this.name();\n if (!name || !this.resolvesConfigAsset) return undefined;\n return {\n name,\n isOne: this.isFromOne(),\n remoteBaseUrl: this.remoteBaseUrl(),\n };\n });\n private readonly storedConfig = rxResource({\n params: () => this.assetsPath(),\n stream: ({ params }) =>\n resolveConfigAsset<T>(\n this.assetStore,\n this.subFolder,\n params?.name,\n params?.isOne ?? false,\n params?.remoteBaseUrl\n ),\n });\n\n // The `name` the resolved asset declares for itself, which is not always the\n // filename it was found under: fields/label_key.yml declares `label`, so a\n // picker asset and a plain textarea asset can drive one config key. Exposed\n // because `config().name` is stamped with the filename — that is what\n // resolves the asset — and a subclass binding to the declared key needs the\n // other half.\n protected readonly declaredName = computed(\n () => (this.storedConfig.value() as Config | undefined)?.name\n );\n\n // Keep track of manual updates cumulatively to support delta updates\n private readonly manualConfig = signal<Partial<T>>({});\n // Prevents syncManualConfig from treating internal updateConfig writes as external input\n private readonly _internalConfigWritePending = signal(false);\n\n /** Override in subclasses to provide component-level config overrides from individual inputs. */\n protected resolveComponentOverrides(): Partial<T> {\n return {};\n }\n\n constructor() {\n effect(this.syncManualConfig);\n effect(this.updateConfig);\n effect(this.updatePallet);\n }\n\n private readonly syncManualConfig = () => {\n const current = this.config();\n if (!current) return;\n\n untracked(() => {\n // Skip writes that originated from updateConfig — they are already merged\n if (this._internalConfigWritePending()) {\n this._internalConfigWritePending.set(false);\n return;\n }\n\n const prev = this.manualConfig();\n\n const merged = {\n ...current,\n };\n\n const allKeys = new Set([...Object.keys(merged), ...Object.keys(prev)]);\n const changed = [...allKeys].some((k) => {\n const inMerged = Object.prototype.hasOwnProperty.call(merged, k);\n const inPrev = Object.prototype.hasOwnProperty.call(prev, k);\n return (\n inMerged !== inPrev ||\n (merged as Record<string, unknown>)[k] !==\n (prev as Record<string, unknown>)[k]\n );\n });\n\n if (changed) {\n this.manualConfig.set(merged);\n }\n });\n };\n\n protected get defaultColor(): string {\n return 'mm';\n }\n\n private readonly updatePallet = (): void => {\n const config = this.config();\n if (!config) {\n return;\n }\n // Scalar inputs override the resolved config everywhere else. Apply the\n // same precedence to the host palette so its contrast and opposite values\n // cannot lag behind an explicit `color` input.\n const color =\n this.resolveComponentOverrides().color ??\n config.color ??\n this.defaultColor;\n this.pallet.set(\n applyColorsToElement(\n color,\n this.themeStore.color(),\n this.elementRef.nativeElement\n )\n );\n };\n\n private readonly updateConfig = () => {\n const currentName = untracked(() => this.name());\n const prevName = untracked(() => this.previousName());\n const storedConfigValue = this.storedConfig.value();\n const isLoading = this.storedConfig.isLoading();\n const manual = this.manualConfig();\n const componentOverrides = this.resolveComponentOverrides();\n\n const nameChanged = currentName !== prevName && prevName !== undefined;\n\n if (nameChanged) {\n // Clear manual config on name change to start fresh with new asset\n this.manualConfig.set({});\n this._internalConfigWritePending.set(true);\n this.config.set({\n ...((storedConfigValue ?? {}) as T),\n ...componentOverrides,\n name: currentName,\n remote: this.remote() ?? (storedConfigValue as Partial<T>)?.remote,\n isLoading,\n } as T);\n } else {\n untracked(() => {\n const currentConfig = this.config();\n const merged = {\n ...((storedConfigValue ?? {}) as Partial<T>),\n ...(manual as T),\n ...componentOverrides,\n name: currentName ?? currentConfig?.name,\n baseUrl: this.baseUrl() ?? currentConfig?.baseUrl,\n remote:\n this.remote() ??\n (storedConfigValue as Partial<T>)?.remote ??\n currentConfig?.remote,\n isLoading,\n } as T;\n\n const prev = currentConfig ?? {};\n const allKeys = new Set([...Object.keys(merged), ...Object.keys(prev)]);\n const same = [...allKeys].every((k) => {\n const inMerged = Object.prototype.hasOwnProperty.call(merged, k);\n const inPrev = Object.prototype.hasOwnProperty.call(prev, k);\n return (\n inMerged === inPrev &&\n (merged as Record<string, unknown>)[k] ===\n (prev as Record<string, unknown>)[k]\n );\n });\n if (same) return;\n\n this._internalConfigWritePending.set(true);\n this.config.set(merged);\n });\n }\n this.previousName.set(currentName);\n };\n}\n","// A component's scalar settings ride on its tag (ADR 0010), and an attribute\n// is a string even when the value is not. These are what a\n// `resolveComponentOverrides()` runs an attribute through before folding it\n// into the config the component would otherwise have read from a YAML asset.\n\n/**\n * A bare attribute (`required`, `fullWidth`) arrives as '', which is HTML for\n * \"present\" — the one spelling that has to mean true rather than empty. Only\n * the literal string 'false' reads as false, so `[required]=\"false\"` and\n * `required=\"false\"` agree; without that, a non-empty string would reach a\n * `boolean` input as truthy and an unticked toggle would render as ticked.\n */\nexport const toAttrBool = (\n value: boolean | string | undefined\n): boolean | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === 'boolean') return value;\n return value.trim().toLowerCase() !== 'false';\n};\n\n/**\n * A numeric string becomes a number so the inputs reading these get the type\n * they expect. Anything else passes through as written — `maxWidth: 50%` and a\n * date format are legitimately non-numeric, and an empty attribute is an unset\n * rather than a zero.\n */\nexport const toAttrNumber = (\n value: number | string | undefined\n): number | string | undefined => {\n if (value === undefined || typeof value === 'number') return value;\n const trimmed = value.trim();\n if (trimmed === '') return undefined;\n const numeric = Number(trimmed);\n return Number.isNaN(numeric) ? value : numeric;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"magmonium-one-attribute-value-CSl5Xeq1.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/functions/config/resolve-config-asset.ts","../../../../libs/one/src/lib/shared/lib/components/config-component.ts","../../../../libs/one/src/lib/shared/functions/config/attribute-value.ts"],"sourcesContent":["import { catchError, Observable, of } from 'rxjs';\nimport { AssetStore } from '../../stores/asset.store';\nimport { Config } from '../../type/config/config-type';\n\n/**\n * Resolves a config asset by name via `AssetStore`, outside any component\n * injection context — callable from directives, stores, or components alike.\n */\nexport function resolveConfigAsset<T extends Config = Config>(\n assetStore: InstanceType<typeof AssetStore>,\n subFolder: string | undefined,\n name: string | undefined,\n isOne: boolean,\n remoteBaseUrl: string | undefined\n): Observable<Partial<T>> {\n if (!name) return of({});\n\n const parts = [subFolder, name].filter(\n (part): part is string => typeof part !== 'undefined'\n );\n const type = parts.length > 1 ? parts.slice(0, -1).join('/') : parts[0];\n const assetName = parts[parts.length - 1];\n\n return assetStore\n .resolve<Partial<T>>(type, assetName, isOne, remoteBaseUrl)\n .pipe(catchError(() => of({})));\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n model,\n signal,\n untracked,\n} from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { AssetStore } from '../../stores/asset.store';\nimport { Config } from '../../type/config/config-type';\nimport { resolveConfigAsset } from '../../functions/config/resolve-config-asset';\nimport { applyColorsToElement, ColorPallet } from '../theme/lib/color-utl';\nimport { ThemeStore } from '../theme/lib/theme-store';\nimport { HttpService } from '../../services/http';\nimport { IS_DESIGN_MODE } from '../../config/tokens';\n\n@Component({\n imports: [],\n selector: 'm-config',\n template: ``,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ConfigComponent<T extends Config = Config> {\n config = model<Partial<T>>();\n name = input<string | undefined>();\n baseUrl = input<string | undefined>();\n protected readonly subFolder: string | undefined = undefined;\n // Off for components whose settings are written on the tag: a Section Form\n // and its Items take every key as an attribute (ADR 0010), so their `name`\n // is the data key a form models by and not a `forms/*.yml` or\n // `fields/*.yml` to fetch. Config assets stay with <m-form> and its\n // <m-input-wrapper>, the pair that is reached by name alone.\n protected readonly resolvesConfigAsset: boolean = true;\n one = input<boolean | undefined>(undefined);\n protected readonly elementRef = inject(ElementRef);\n protected readonly isFromOne = computed(() => {\n if (this.one() || this.config()?.one) {\n return true;\n }\n return this.elementRef.nativeElement.tagName.startsWith('M-ONE');\n });\n protected readonly themeStore = inject(ThemeStore);\n\n // True when this component sits inside a visual editor's canvas (DesignMode).\n // Subclasses use it to render editor-only affordances — placeholder boxes for\n // otherwise zero-sized nodes, drop outlines, inert interactions.\n protected readonly isDesignMode = !!inject(IS_DESIGN_MODE, {\n optional: true,\n });\n\n protected readonly pallet = signal<ColorPallet | undefined>(undefined);\n\n remote = input<string | undefined>();\n protected readonly assetStore = inject(AssetStore);\n private readonly http = inject(HttpService);\n private readonly previousName = signal<string | undefined>(undefined);\n // Protected: a subclass resolving an asset of its own — a Field's accepted\n // shapes — has to reach the same Remote its config came from.\n protected readonly remoteBaseUrl = computed<string | undefined>(() => {\n const remoteId = this.remote() ?? this.config()?.remote;\n return remoteId ? this.http.buildWcAssetBaseUrl(remoteId) : undefined;\n });\n private readonly assetsPath = computed<\n | {\n name: string;\n isOne: boolean;\n remoteBaseUrl: string | undefined;\n }\n | undefined\n >(() => {\n const name = this.name();\n if (!name || !this.resolvesConfigAsset) return undefined;\n return {\n name,\n isOne: this.isFromOne(),\n remoteBaseUrl: this.remoteBaseUrl(),\n };\n });\n private readonly storedConfig = rxResource({\n params: () => this.assetsPath(),\n stream: ({ params }) =>\n resolveConfigAsset<T>(\n this.assetStore,\n this.subFolder,\n params?.name,\n params?.isOne ?? false,\n params?.remoteBaseUrl\n ),\n });\n\n // The `name` the resolved asset declares for itself, which is not always the\n // filename it was found under: fields/label_key.yml declares `label`, so a\n // picker asset and a plain textarea asset can drive one config key. Exposed\n // because `config().name` is stamped with the filename — that is what\n // resolves the asset — and a subclass binding to the declared key needs the\n // other half.\n protected readonly declaredName = computed(\n () => (this.storedConfig.value() as Config | undefined)?.name\n );\n\n // Keep track of manual updates cumulatively to support delta updates\n private readonly manualConfig = signal<Partial<T>>({});\n // Prevents syncManualConfig from treating internal updateConfig writes as external input\n private readonly _internalConfigWritePending = signal(false);\n\n /** Override in subclasses to provide component-level config overrides from individual inputs. */\n protected resolveComponentOverrides(): Partial<T> {\n return {};\n }\n\n constructor() {\n effect(this.syncManualConfig);\n effect(this.updateConfig);\n effect(this.updatePallet);\n }\n\n private readonly syncManualConfig = () => {\n const current = this.config();\n if (!current) return;\n\n untracked(() => {\n // Skip writes that originated from updateConfig — they are already merged\n if (this._internalConfigWritePending()) {\n this._internalConfigWritePending.set(false);\n return;\n }\n\n const prev = this.manualConfig();\n\n const merged = {\n ...current,\n };\n\n const allKeys = new Set([...Object.keys(merged), ...Object.keys(prev)]);\n const changed = [...allKeys].some((k) => {\n const inMerged = Object.prototype.hasOwnProperty.call(merged, k);\n const inPrev = Object.prototype.hasOwnProperty.call(prev, k);\n return (\n inMerged !== inPrev ||\n (merged as Record<string, unknown>)[k] !==\n (prev as Record<string, unknown>)[k]\n );\n });\n\n if (changed) {\n this.manualConfig.set(merged);\n }\n });\n };\n\n protected get defaultColor(): string {\n return 'mm';\n }\n\n private readonly updatePallet = (): void => {\n const config = this.config();\n if (!config) {\n return;\n }\n // Scalar inputs override the resolved config everywhere else. Apply the\n // same precedence to the host palette so its contrast and opposite values\n // cannot lag behind an explicit `color` input.\n const color =\n this.resolveComponentOverrides().color ??\n config.color ??\n this.defaultColor;\n this.pallet.set(\n applyColorsToElement(\n color,\n this.themeStore.color(),\n this.elementRef.nativeElement\n )\n );\n };\n\n private readonly updateConfig = () => {\n const currentName = untracked(() => this.name());\n const prevName = untracked(() => this.previousName());\n const storedConfigValue = this.storedConfig.value();\n const isLoading = this.storedConfig.isLoading();\n const manual = this.manualConfig();\n const componentOverrides = this.resolveComponentOverrides();\n\n const nameChanged = currentName !== prevName && prevName !== undefined;\n\n if (nameChanged) {\n // Clear manual config on name change to start fresh with new asset\n this.manualConfig.set({});\n this._internalConfigWritePending.set(true);\n this.config.set({\n ...((storedConfigValue ?? {}) as T),\n ...componentOverrides,\n name: currentName,\n remote: this.remote() ?? (storedConfigValue as Partial<T>)?.remote,\n isLoading,\n } as T);\n } else {\n untracked(() => {\n const currentConfig = this.config();\n const merged = {\n ...((storedConfigValue ?? {}) as Partial<T>),\n ...(manual as T),\n ...componentOverrides,\n name: currentName ?? currentConfig?.name,\n baseUrl: this.baseUrl() ?? currentConfig?.baseUrl,\n remote:\n this.remote() ??\n (storedConfigValue as Partial<T>)?.remote ??\n currentConfig?.remote,\n isLoading,\n } as T;\n\n const prev = currentConfig ?? {};\n const allKeys = new Set([...Object.keys(merged), ...Object.keys(prev)]);\n const same = [...allKeys].every((k) => {\n const inMerged = Object.prototype.hasOwnProperty.call(merged, k);\n const inPrev = Object.prototype.hasOwnProperty.call(prev, k);\n return (\n inMerged === inPrev &&\n (merged as Record<string, unknown>)[k] ===\n (prev as Record<string, unknown>)[k]\n );\n });\n if (same) return;\n\n this._internalConfigWritePending.set(true);\n this.config.set(merged);\n });\n }\n this.previousName.set(currentName);\n };\n}\n","// A component's scalar settings ride on its tag (ADR 0010), and an attribute\n// is a string even when the value is not. These are what a\n// `resolveComponentOverrides()` runs an attribute through before folding it\n// into the config the component would otherwise have read from a YAML asset.\n\n/**\n * A bare attribute (`required`, `fullWidth`) arrives as '', which is HTML for\n * \"present\" — the one spelling that has to mean true rather than empty. Only\n * the literal string 'false' reads as false, so `[required]=\"false\"` and\n * `required=\"false\"` agree; without that, a non-empty string would reach a\n * `boolean` input as truthy and an unticked toggle would render as ticked.\n */\nexport const toAttrBool = (\n value: boolean | string | undefined\n): boolean | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === 'boolean') return value;\n return value.trim().toLowerCase() !== 'false';\n};\n\n/**\n * A numeric string becomes a number so the inputs reading these get the type\n * they expect. Anything else passes through as written — `maxWidth: 50%` and a\n * date format are legitimately non-numeric, and an empty attribute is an unset\n * rather than a zero.\n */\nexport const toAttrNumber = (\n value: number | string | undefined\n): number | string | undefined => {\n if (value === undefined || typeof value === 'number') return value;\n const trimmed = value.trim();\n if (trimmed === '') return undefined;\n const numeric = Number(trimmed);\n return Number.isNaN(numeric) ? value : numeric;\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as BaseInputComponent } from "./magmonium-one-base-input-
|
|
1
|
+
import { t as BaseInputComponent } from "./magmonium-one-base-input-CsVND89n.mjs";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import { Directive, afterRenderEffect, model, viewChild } from "@angular/core";
|
|
4
4
|
var BaseCheckboxInputComponent = class BaseCheckboxInputComponent extends BaseInputComponent {
|
|
@@ -74,4 +74,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
74
74
|
});
|
|
75
75
|
export { BaseCheckboxInputComponent as t };
|
|
76
76
|
|
|
77
|
-
//# sourceMappingURL=magmonium-one-base-checkbox-
|
|
77
|
+
//# sourceMappingURL=magmonium-one-base-checkbox-BqCPBI1d.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-base-checkbox-
|
|
1
|
+
{"version":3,"file":"magmonium-one-base-checkbox-BqCPBI1d.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/checkbox/base-checkbox.ts"],"sourcesContent":["import {\n afterRenderEffect,\n Directive,\n ElementRef,\n model,\n ModelSignal,\n viewChild,\n} from '@angular/core';\nimport { FormCheckboxControl } from '@angular/forms/signals';\nimport { BaseInputComponent } from '../../lib/base-input';\nimport { Input } from '../../model/input';\n\n@Directive()\nexport class BaseCheckboxInputComponent\n extends BaseInputComponent<Input>\n implements FormCheckboxControl\n{\n public value = undefined;\n /** Required by FormCheckboxControl interface */\n public readonly checked: ModelSignal<boolean> = model<boolean>(\n false\n ) as ModelSignal<boolean>;\n\n private inputElement =\n viewChild<ElementRef<HTMLInputElement>>('inputElement');\n\n constructor() {\n super();\n afterRenderEffect(() => {\n if (this.focused() && this.inputElement()) {\n this.inputElement()?.nativeElement.focus();\n }\n });\n }\n\n protected readonly setValue = (value: boolean) => {\n this.checked.set(value);\n this.touched.set(true);\n };\n}\n"],"mappings":";;;AAaA,IAAa,6BAAb,MAAa,mCACH,mBAAyB;CAG1B,QAAQ;CAEC,UAAgC,MAC9C,KAAK;CAGC,eACN,UAAwC,gBAAe,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAEzD,cAAA;EACE,MAAK;EACL,wBAAuB;GACrB,IAAI,KAAK,QAAO,KAAM,KAAK,aAAY,GACrC,KAAK,aAAY,CAAE,EAAE,cAAc,MAAK;EAE5C,CAAC;CACH;CAEmB,YAAY,UAAkB;EAC/C,KAAK,QAAQ,IAAI,KAAK;EACtB,KAAK,QAAQ,IAAI,IAAI;CACvB;CAzBW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAA0B,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAA1B,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAA0B,cAAA;EAAA,QAAA,EAAA,SAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,SAAA,EAAA,SAAA,gBAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,cAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,iBAAA;EAAA,UAAA;CAAA,CAAA;;AAA1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA0B,YAAA,CAAA,EADtC,MAAA,UAY2C,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,eAAA;EAAA,CAAA;EAAA,cAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,gBAAc,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { c as TranslatePipe, l as TranslateService } from "./magmonium-one-size-converter-
|
|
2
|
-
import { t as SelectorDirective } from "./magmonium-one-selector-
|
|
3
|
-
import { t as LabelComponent } from "./magmonium-one-label-
|
|
4
|
-
import { t as ButtonComponent } from "./magmonium-one-button-
|
|
5
|
-
import { t as assetOptions } from "./magmonium-one-options-asset-
|
|
6
|
-
import "./magmonium-one-directives-
|
|
7
|
-
import { t as BaseInputComponent } from "./magmonium-one-base-input-
|
|
8
|
-
import { t as TextOutputComponent } from "./magmonium-one-text-output-
|
|
9
|
-
import { t as TextInputComponent } from "./magmonium-one-text-
|
|
1
|
+
import { c as TranslatePipe, l as TranslateService } from "./magmonium-one-size-converter-BalJd7VH.mjs";
|
|
2
|
+
import { t as SelectorDirective } from "./magmonium-one-selector-GGFfBf2O.mjs";
|
|
3
|
+
import { t as LabelComponent } from "./magmonium-one-label-B2Rtuiyg.mjs";
|
|
4
|
+
import { t as ButtonComponent } from "./magmonium-one-button-CJ1Gaaw-.mjs";
|
|
5
|
+
import { t as assetOptions } from "./magmonium-one-options-asset-BlrhLckD.mjs";
|
|
6
|
+
import "./magmonium-one-directives-O1JyFBc3.mjs";
|
|
7
|
+
import { t as BaseInputComponent } from "./magmonium-one-base-input-CsVND89n.mjs";
|
|
8
|
+
import { t as TextOutputComponent } from "./magmonium-one-text-output-Cg2dT_U_.mjs";
|
|
9
|
+
import { t as TextInputComponent } from "./magmonium-one-text-BPThK6-y.mjs";
|
|
10
10
|
import * as i0 from "@angular/core";
|
|
11
11
|
import { ChangeDetectionStrategy, Component, Directive, ElementRef, computed, effect, inject, input, inputBinding, linkedSignal, model, output, outputBinding, signal, viewChild } from "@angular/core";
|
|
12
12
|
var DropdownBoxComponent = class DropdownBoxComponent {
|
|
@@ -601,4 +601,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
601
601
|
});
|
|
602
602
|
export { DROPDOWN_IMPORTS as n, DROPDOWN_TEMPLATE as r, BaseDropdownComponent as t };
|
|
603
603
|
|
|
604
|
-
//# sourceMappingURL=magmonium-one-base-dropdown-
|
|
604
|
+
//# sourceMappingURL=magmonium-one-base-dropdown-Dxo8Yd62.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-base-dropdown-DIaimBpG.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/dropdown/dropdown-box.ts","../../../../libs/one/src/lib/shared/ui/input/ui/dropdown/base-dropdown.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { TranslatePipe } from '../../../../pipe/translate';\nimport { DropdownOption, DropdownValue } from '../../model/input';\n\n@Component({\n selector: 'm-dropdown-box',\n imports: [TranslatePipe],\n template: `\n <ul class=\"dropdown-box\" role=\"listbox\">\n @for (option of options(); track option.value; let i = $index) {\n @let selectedState = isSelected(option.value);\n <li\n class=\"dropdown-box__option\"\n [class.dropdown-box__option--selected]=\"selectedState\"\n [class.dropdown-box__option--disabled]=\"option.disabled\"\n [class.dropdown-box__option--active]=\"i === activeIndex()\"\n role=\"option\"\n [attr.aria-selected]=\"selectedState\"\n [attr.data-value]=\"option.value\"\n (click)=\"selectOption(option)\"\n (keydown.enter)=\"selectOption(option)\"\n tabindex=\"0\"\n >\n <!-- A group header is a row, never a choice: no box to tick. -->\n @if (multiple() && !option.disabled) {\n <input\n type=\"checkbox\"\n class=\"dropdown-box__checkbox\"\n [checked]=\"selectedState\"\n tabindex=\"-1\"\n (click)=\"$event.preventDefault()\"\n />\n }\n @if (option.noTranslate) {\n {{ option.label }}\n } @else {\n {{ option.label | translate }}\n }\n </li>\n } @empty {\n <li class=\"dropdown-box__empty\">\n {{ 'no-results-found' | translate }}\n </li>\n }\n </ul>\n `,\n styleUrl: './dropdown-box.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DropdownBoxComponent {\n readonly options = input<DropdownOption<DropdownValue>[]>([]);\n /** The values ticked, as a list whichever Field drew the panel. */\n readonly selected = input<readonly DropdownValue[]>([]);\n readonly multiple = input<boolean>(false);\n readonly activeIndex = input<number>(-1);\n readonly action = output<DropdownOption<DropdownValue>>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // Keep the keyboard-active option in view as ↑/↓ walk a scrolled list.\n constructor() {\n effect(() => {\n const index = this.activeIndex();\n if (index < 0) return;\n this.host.nativeElement\n .querySelectorAll('.dropdown-box__option')\n [index]?.scrollIntoView?.({ block: 'nearest' });\n });\n }\n\n protected readonly isSelected = (value: DropdownValue): boolean =>\n this.selected().includes(value);\n\n // Only emit a selection event for enabled options.\n protected readonly selectOption = (\n option: DropdownOption<DropdownValue>\n ): void => {\n if (option.disabled) return;\n this.action.emit(option);\n };\n}\n","import {\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n inputBinding,\n linkedSignal,\n model,\n outputBinding,\n Signal,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { LabelComponent } from '../label';\nimport { TextOutputComponent } from '../../../text-output';\nimport { BaseInputComponent } from '../../lib/base-input';\nimport { Button } from '../../../button/type/button';\nimport { ButtonComponent } from '../../../button/ui/button';\nimport { TranslateService } from '../../../../services';\nimport { SelectorConfig, SelectorDirective } from '../../../../directives';\nimport { Direction } from '../../../../directives/selector/selector-type';\nimport { DropdownBoxComponent } from './dropdown-box';\nimport {\n DropdownInput,\n DropdownOption,\n DropdownValue,\n TextInput,\n} from '../../model/input';\nimport { TextInputComponent } from '../text/text';\nimport { assetOptions } from '../../lib/options-asset';\n\n/** The trigger both option Fields draw: a searchable text input and a chevron. */\nexport const DROPDOWN_TEMPLATE = `\n @if (config(); as dropdown) {\n @if (dropdown.label) {\n <m-label\n [for]=\"dropdown.name ?? ''\"\n [placeholder]=\"dropdown.label\"\n [params]=\"dropdown.params\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n }\n <div\n class=\"trigger-wrap\"\n #wrapper\n [mSelector]=\"selectorConfig()\"\n [disabled]=\"disabled() || readonly() || !!config()?.readonly\"\n (opened)=\"onOpened()\"\n (closed)=\"onClosed()\"\n (focusin)=\"isFocused.set(true)\"\n (focusout)=\"isFocused.set(false)\"\n >\n <m-text-input\n [config]=\"triggerInputConfig()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [invalid]=\"invalid()\"\n [hideErrors]=\"true\"\n [(touched)]=\"touched\"\n [focused]=\"focused()\"\n (valueChange)=\"onInput($event)\"\n (click)=\"preventToggleWhenOpen($event)\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown.enter)=\"onEnter($event)\"\n (keydown.arrowdown)=\"onArrow($event, 1)\"\n (keydown.arrowup)=\"onArrow($event, -1)\"\n (keydown.tab)=\"$event.stopPropagation()\"\n />\n <m-button [disabled]=\"disabled()\" [config]=\"chevron()\" />\n </div>\n @if (showErrors()) {\n @for (error of errors(); track $index) {\n <m-text-output\n variant=\"footer\"\n color=\"error\"\n [label]=\"error.message\"\n />\n }\n }\n }\n`;\n\nexport const DROPDOWN_IMPORTS = [\n LabelComponent,\n TextOutputComponent,\n TextInputComponent,\n ButtonComponent,\n SelectorDirective,\n];\n\n/**\n * Everything a Dropdown and a Multiselect share: the options, the search, the\n * keyboard walk and the panel. What differs is only what the Field holds — one\n * value or a list — so a subclass says which values are selected and what a\n * pick does to them.\n */\n@Directive()\nexport abstract class BaseDropdownComponent extends BaseInputComponent<DropdownInput> {\n public override config = input<Partial<DropdownInput> | 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 readonly options = input<\n DropdownOption<DropdownValue>[] | Signal<DropdownOption<DropdownValue>[]>\n >();\n readonly dir = input<Direction>();\n readonly toggle = model(false);\n readonly searchTerm = signal('');\n readonly isFocused = signal(false);\n readonly chevron = computed(\n () =>\n <Button>{\n icon: this.toggle() ? 'chevron-up' : 'chevron-down',\n one: true,\n variant: 'ghost',\n // In-Field control, never the form's submit — without this the Button\n // reads as the submit control and greys out while the form is invalid.\n type: 'button',\n // Chevron tracks the trigger's border like the text input's own icon:\n // red while the Field shows errors, focus tint while focused, border at rest.\n color: this.showErrors()\n ? 'error'\n : this.isFocused()\n ? 'focus'\n : 'border',\n // The trigger input is the Field's tab stop; the chevron only repeats\n // what clicking that input already does, so Tab walks past it.\n tabindex: -1,\n }\n );\n\n /** The values the Field holds now, as a list whichever kind it is. */\n protected abstract readonly selectedValues: Signal<readonly DropdownValue[]>;\n /** Whether the panel ticks rows and stays open across picks. */\n protected abstract readonly multiple: boolean;\n /** What picking `option` does to the Field's value. */\n protected abstract selectOption(option: DropdownOption<DropdownValue>): void;\n\n protected readonly triggerInputConfig = computed(() => {\n const dropdown = this.config() as DropdownInput | undefined;\n return <Partial<TextInput>>{\n name: dropdown?.name,\n icon: dropdown?.icon,\n one: dropdown?.one,\n placeholder: this.placeholderText(),\n readonly: this.readonly() || !!dropdown?.readonly,\n };\n });\n\n protected readonly dropdownOptions = computed(\n (): DropdownOption<DropdownValue>[] => {\n const runtimeOptions = this.options();\n const source =\n runtimeOptions ?? (this.config() as DropdownInput | undefined)?.options;\n if (typeof source === 'function') return source();\n if (source?.length) return source;\n return this.assetOptions();\n }\n );\n\n private readonly translateService = inject(TranslateService);\n\n protected readonly assetOptions = assetOptions(\n () => (this.config() as DropdownInput | undefined)?.optionsAsset\n );\n\n /** An option's text: authored as it stands, a key translated. */\n private readonly optionLabel = (\n option?: DropdownOption<DropdownValue>\n ): string => {\n if (!option?.label) return '';\n return option.noTranslate\n ? option.label\n : this.translateService.translate(option.label);\n };\n\n protected readonly filteredOptions = computed(\n (): DropdownOption<DropdownValue>[] => {\n const search = this.searchTerm().toLowerCase();\n if (!search) return this.dropdownOptions();\n return this.dropdownOptions().filter((o) => {\n const label = this.optionLabel(o).toLowerCase();\n return (\n label.includes(search) ||\n String(o.value).toLowerCase().includes(search)\n );\n });\n }\n );\n\n /** The option ↑/↓ point at while the panel is open; -1 is none. Reset as the search narrows the list. */\n protected readonly activeIndex = linkedSignal<\n DropdownOption<DropdownValue>[],\n number\n >({\n source: this.filteredOptions,\n computation: (options) =>\n this.searchTerm() ? this.nextEnabled(options, -1, 1) : -1,\n });\n\n /** The enabled option `step` rows past `from`, wrapping; `from` itself when none. */\n private readonly nextEnabled = (\n options: DropdownOption<DropdownValue>[],\n from: number,\n step: 1 | -1\n ): number => {\n for (let i = 1; i <= options.length; i++) {\n const index =\n (((from + step * i) % options.length) + options.length) %\n options.length;\n if (!options[index].disabled) return index;\n }\n return from;\n };\n\n /** One pick reads as its option's label, several as a count. */\n private readonly selectionLabel = computed((): string => {\n const values = this.selectedValues();\n if (values.length === 0) return '';\n if (values.length === 1) {\n return this.optionLabel(\n this.dropdownOptions().find((o) => o.value === values[0])\n );\n }\n const translation = this.translateService.translate(\n `selected?count=${values.length}`\n );\n return translation.includes('selected')\n ? `${values.length} Selected`\n : translation;\n });\n\n protected readonly displayValue = computed((): string =>\n this.toggle() ? this.searchTerm() : this.selectionLabel()\n );\n\n protected readonly placeholderText = computed((): string => {\n if (this.toggle()) {\n const label = this.selectionLabel();\n if (label) return label;\n }\n const placeholder = (this.config() as DropdownInput | undefined)\n ?.placeholder;\n return placeholder ? this.translateService.translate(placeholder) : '';\n });\n\n private readonly wrapperRef =\n viewChild<ElementRef<HTMLDivElement>>('wrapper');\n\n protected readonly selectorConfig = computed<\n SelectorConfig<DropdownBoxComponent>\n >(() => ({\n component: DropdownBoxComponent,\n base: 'm-dropdown-input',\n matchTriggerWidth: true,\n toggle: true,\n dir: this.dir(),\n bindings: [\n inputBinding('options', this.filteredOptions),\n inputBinding('selected', this.selectedValues),\n inputBinding('multiple', () => this.multiple),\n inputBinding('activeIndex', this.activeIndex),\n outputBinding<DropdownOption<DropdownValue>>('action', (option) =>\n this.selectOption(option)\n ),\n ],\n }));\n\n /** Shuts the panel after a pick, the way a click on the trigger would. */\n protected readonly closePanel = (): void => {\n this.toggle.set(false);\n this.searchTerm.set('');\n setTimeout(() => this.wrapperRef()?.nativeElement.click(), 0);\n };\n\n protected readonly onOpened = (): void => {\n this.toggle.set(true);\n this.searchTerm.set('');\n const current = this.selectedValues()[0];\n this.activeIndex.set(\n this.filteredOptions().findIndex((o) => o.value === current)\n );\n };\n\n // Focus stays in the trigger input (it is the search box), so ↑/↓ move the\n // active option rather than DOM focus. Closed, ArrowDown bubbles on to\n // SelectorDirective, which opens the panel.\n protected readonly onArrow = (event: Event, step: 1 | -1): void => {\n if (!this.toggle()) return;\n event.preventDefault();\n this.activeIndex.update((index) =>\n this.nextEnabled(this.filteredOptions(), index, step)\n );\n };\n\n // Enter never reaches SelectorDirective (it would toggle the panel); open,\n // it picks the active option.\n protected readonly onEnter = (event: Event): void => {\n event.stopPropagation();\n if (!this.toggle()) return;\n event.preventDefault();\n const option = this.filteredOptions()[this.activeIndex()];\n if (option && !option.disabled) this.selectOption(option);\n };\n\n protected readonly onClosed = (): void => {\n this.toggle.set(false);\n this.searchTerm.set('');\n };\n\n protected readonly onInput = (value: string): void => {\n this.searchTerm.set(value);\n };\n\n protected readonly preventToggleWhenOpen = (event: Event): void => {\n if (this.toggle() || this.readonly() || this.config()?.readonly) {\n event.stopPropagation();\n }\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"magmonium-one-base-dropdown-Dxo8Yd62.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/dropdown/dropdown-box.ts","../../../../libs/one/src/lib/shared/ui/input/ui/dropdown/base-dropdown.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { TranslatePipe } from '../../../../pipe/translate';\nimport { DropdownOption, DropdownValue } from '../../model/input';\n\n@Component({\n selector: 'm-dropdown-box',\n imports: [TranslatePipe],\n template: `\n <ul class=\"dropdown-box\" role=\"listbox\">\n @for (option of options(); track option.value; let i = $index) {\n @let selectedState = isSelected(option.value);\n <li\n class=\"dropdown-box__option\"\n [class.dropdown-box__option--selected]=\"selectedState\"\n [class.dropdown-box__option--disabled]=\"option.disabled\"\n [class.dropdown-box__option--active]=\"i === activeIndex()\"\n role=\"option\"\n [attr.aria-selected]=\"selectedState\"\n [attr.data-value]=\"option.value\"\n (click)=\"selectOption(option)\"\n (keydown.enter)=\"selectOption(option)\"\n tabindex=\"0\"\n >\n <!-- A group header is a row, never a choice: no box to tick. -->\n @if (multiple() && !option.disabled) {\n <input\n type=\"checkbox\"\n class=\"dropdown-box__checkbox\"\n [checked]=\"selectedState\"\n tabindex=\"-1\"\n (click)=\"$event.preventDefault()\"\n />\n }\n @if (option.noTranslate) {\n {{ option.label }}\n } @else {\n {{ option.label | translate }}\n }\n </li>\n } @empty {\n <li class=\"dropdown-box__empty\">\n {{ 'no-results-found' | translate }}\n </li>\n }\n </ul>\n `,\n styleUrl: './dropdown-box.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DropdownBoxComponent {\n readonly options = input<DropdownOption<DropdownValue>[]>([]);\n /** The values ticked, as a list whichever Field drew the panel. */\n readonly selected = input<readonly DropdownValue[]>([]);\n readonly multiple = input<boolean>(false);\n readonly activeIndex = input<number>(-1);\n readonly action = output<DropdownOption<DropdownValue>>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // Keep the keyboard-active option in view as ↑/↓ walk a scrolled list.\n constructor() {\n effect(() => {\n const index = this.activeIndex();\n if (index < 0) return;\n this.host.nativeElement\n .querySelectorAll('.dropdown-box__option')\n [index]?.scrollIntoView?.({ block: 'nearest' });\n });\n }\n\n protected readonly isSelected = (value: DropdownValue): boolean =>\n this.selected().includes(value);\n\n // Only emit a selection event for enabled options.\n protected readonly selectOption = (\n option: DropdownOption<DropdownValue>\n ): void => {\n if (option.disabled) return;\n this.action.emit(option);\n };\n}\n","import {\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n inputBinding,\n linkedSignal,\n model,\n outputBinding,\n Signal,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { LabelComponent } from '../label';\nimport { TextOutputComponent } from '../../../text-output';\nimport { BaseInputComponent } from '../../lib/base-input';\nimport { Button } from '../../../button/type/button';\nimport { ButtonComponent } from '../../../button/ui/button';\nimport { TranslateService } from '../../../../services';\nimport { SelectorConfig, SelectorDirective } from '../../../../directives';\nimport { Direction } from '../../../../directives/selector/selector-type';\nimport { DropdownBoxComponent } from './dropdown-box';\nimport {\n DropdownInput,\n DropdownOption,\n DropdownValue,\n TextInput,\n} from '../../model/input';\nimport { TextInputComponent } from '../text/text';\nimport { assetOptions } from '../../lib/options-asset';\n\n/** The trigger both option Fields draw: a searchable text input and a chevron. */\nexport const DROPDOWN_TEMPLATE = `\n @if (config(); as dropdown) {\n @if (dropdown.label) {\n <m-label\n [for]=\"dropdown.name ?? ''\"\n [placeholder]=\"dropdown.label\"\n [params]=\"dropdown.params\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n }\n <div\n class=\"trigger-wrap\"\n #wrapper\n [mSelector]=\"selectorConfig()\"\n [disabled]=\"disabled() || readonly() || !!config()?.readonly\"\n (opened)=\"onOpened()\"\n (closed)=\"onClosed()\"\n (focusin)=\"isFocused.set(true)\"\n (focusout)=\"isFocused.set(false)\"\n >\n <m-text-input\n [config]=\"triggerInputConfig()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [invalid]=\"invalid()\"\n [hideErrors]=\"true\"\n [(touched)]=\"touched\"\n [focused]=\"focused()\"\n (valueChange)=\"onInput($event)\"\n (click)=\"preventToggleWhenOpen($event)\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown.enter)=\"onEnter($event)\"\n (keydown.arrowdown)=\"onArrow($event, 1)\"\n (keydown.arrowup)=\"onArrow($event, -1)\"\n (keydown.tab)=\"$event.stopPropagation()\"\n />\n <m-button [disabled]=\"disabled()\" [config]=\"chevron()\" />\n </div>\n @if (showErrors()) {\n @for (error of errors(); track $index) {\n <m-text-output\n variant=\"footer\"\n color=\"error\"\n [label]=\"error.message\"\n />\n }\n }\n }\n`;\n\nexport const DROPDOWN_IMPORTS = [\n LabelComponent,\n TextOutputComponent,\n TextInputComponent,\n ButtonComponent,\n SelectorDirective,\n];\n\n/**\n * Everything a Dropdown and a Multiselect share: the options, the search, the\n * keyboard walk and the panel. What differs is only what the Field holds — one\n * value or a list — so a subclass says which values are selected and what a\n * pick does to them.\n */\n@Directive()\nexport abstract class BaseDropdownComponent extends BaseInputComponent<DropdownInput> {\n public override config = input<Partial<DropdownInput> | 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 readonly options = input<\n DropdownOption<DropdownValue>[] | Signal<DropdownOption<DropdownValue>[]>\n >();\n readonly dir = input<Direction>();\n readonly toggle = model(false);\n readonly searchTerm = signal('');\n readonly isFocused = signal(false);\n readonly chevron = computed(\n () =>\n <Button>{\n icon: this.toggle() ? 'chevron-up' : 'chevron-down',\n one: true,\n variant: 'ghost',\n // In-Field control, never the form's submit — without this the Button\n // reads as the submit control and greys out while the form is invalid.\n type: 'button',\n // Chevron tracks the trigger's border like the text input's own icon:\n // red while the Field shows errors, focus tint while focused, border at rest.\n color: this.showErrors()\n ? 'error'\n : this.isFocused()\n ? 'focus'\n : 'border',\n // The trigger input is the Field's tab stop; the chevron only repeats\n // what clicking that input already does, so Tab walks past it.\n tabindex: -1,\n }\n );\n\n /** The values the Field holds now, as a list whichever kind it is. */\n protected abstract readonly selectedValues: Signal<readonly DropdownValue[]>;\n /** Whether the panel ticks rows and stays open across picks. */\n protected abstract readonly multiple: boolean;\n /** What picking `option` does to the Field's value. */\n protected abstract selectOption(option: DropdownOption<DropdownValue>): void;\n\n protected readonly triggerInputConfig = computed(() => {\n const dropdown = this.config() as DropdownInput | undefined;\n return <Partial<TextInput>>{\n name: dropdown?.name,\n icon: dropdown?.icon,\n one: dropdown?.one,\n placeholder: this.placeholderText(),\n readonly: this.readonly() || !!dropdown?.readonly,\n };\n });\n\n protected readonly dropdownOptions = computed(\n (): DropdownOption<DropdownValue>[] => {\n const runtimeOptions = this.options();\n const source =\n runtimeOptions ?? (this.config() as DropdownInput | undefined)?.options;\n if (typeof source === 'function') return source();\n if (source?.length) return source;\n return this.assetOptions();\n }\n );\n\n private readonly translateService = inject(TranslateService);\n\n protected readonly assetOptions = assetOptions(\n () => (this.config() as DropdownInput | undefined)?.optionsAsset\n );\n\n /** An option's text: authored as it stands, a key translated. */\n private readonly optionLabel = (\n option?: DropdownOption<DropdownValue>\n ): string => {\n if (!option?.label) return '';\n return option.noTranslate\n ? option.label\n : this.translateService.translate(option.label);\n };\n\n protected readonly filteredOptions = computed(\n (): DropdownOption<DropdownValue>[] => {\n const search = this.searchTerm().toLowerCase();\n if (!search) return this.dropdownOptions();\n return this.dropdownOptions().filter((o) => {\n const label = this.optionLabel(o).toLowerCase();\n return (\n label.includes(search) ||\n String(o.value).toLowerCase().includes(search)\n );\n });\n }\n );\n\n /** The option ↑/↓ point at while the panel is open; -1 is none. Reset as the search narrows the list. */\n protected readonly activeIndex = linkedSignal<\n DropdownOption<DropdownValue>[],\n number\n >({\n source: this.filteredOptions,\n computation: (options) =>\n this.searchTerm() ? this.nextEnabled(options, -1, 1) : -1,\n });\n\n /** The enabled option `step` rows past `from`, wrapping; `from` itself when none. */\n private readonly nextEnabled = (\n options: DropdownOption<DropdownValue>[],\n from: number,\n step: 1 | -1\n ): number => {\n for (let i = 1; i <= options.length; i++) {\n const index =\n (((from + step * i) % options.length) + options.length) %\n options.length;\n if (!options[index].disabled) return index;\n }\n return from;\n };\n\n /** One pick reads as its option's label, several as a count. */\n private readonly selectionLabel = computed((): string => {\n const values = this.selectedValues();\n if (values.length === 0) return '';\n if (values.length === 1) {\n return this.optionLabel(\n this.dropdownOptions().find((o) => o.value === values[0])\n );\n }\n const translation = this.translateService.translate(\n `selected?count=${values.length}`\n );\n return translation.includes('selected')\n ? `${values.length} Selected`\n : translation;\n });\n\n protected readonly displayValue = computed((): string =>\n this.toggle() ? this.searchTerm() : this.selectionLabel()\n );\n\n protected readonly placeholderText = computed((): string => {\n if (this.toggle()) {\n const label = this.selectionLabel();\n if (label) return label;\n }\n const placeholder = (this.config() as DropdownInput | undefined)\n ?.placeholder;\n return placeholder ? this.translateService.translate(placeholder) : '';\n });\n\n private readonly wrapperRef =\n viewChild<ElementRef<HTMLDivElement>>('wrapper');\n\n protected readonly selectorConfig = computed<\n SelectorConfig<DropdownBoxComponent>\n >(() => ({\n component: DropdownBoxComponent,\n base: 'm-dropdown-input',\n matchTriggerWidth: true,\n toggle: true,\n dir: this.dir(),\n bindings: [\n inputBinding('options', this.filteredOptions),\n inputBinding('selected', this.selectedValues),\n inputBinding('multiple', () => this.multiple),\n inputBinding('activeIndex', this.activeIndex),\n outputBinding<DropdownOption<DropdownValue>>('action', (option) =>\n this.selectOption(option)\n ),\n ],\n }));\n\n /** Shuts the panel after a pick, the way a click on the trigger would. */\n protected readonly closePanel = (): void => {\n this.toggle.set(false);\n this.searchTerm.set('');\n setTimeout(() => this.wrapperRef()?.nativeElement.click(), 0);\n };\n\n protected readonly onOpened = (): void => {\n this.toggle.set(true);\n this.searchTerm.set('');\n const current = this.selectedValues()[0];\n this.activeIndex.set(\n this.filteredOptions().findIndex((o) => o.value === current)\n );\n };\n\n // Focus stays in the trigger input (it is the search box), so ↑/↓ move the\n // active option rather than DOM focus. Closed, ArrowDown bubbles on to\n // SelectorDirective, which opens the panel.\n protected readonly onArrow = (event: Event, step: 1 | -1): void => {\n if (!this.toggle()) return;\n event.preventDefault();\n this.activeIndex.update((index) =>\n this.nextEnabled(this.filteredOptions(), index, step)\n );\n };\n\n // Enter never reaches SelectorDirective (it would toggle the panel); open,\n // it picks the active option.\n protected readonly onEnter = (event: Event): void => {\n event.stopPropagation();\n if (!this.toggle()) return;\n event.preventDefault();\n const option = this.filteredOptions()[this.activeIndex()];\n if (option && !option.disabled) this.selectOption(option);\n };\n\n protected readonly onClosed = (): void => {\n this.toggle.set(false);\n this.searchTerm.set('');\n };\n\n protected readonly onInput = (value: string): void => {\n this.searchTerm.set(value);\n };\n\n protected readonly preventToggleWhenOpen = (event: Event): void => {\n if (this.toggle() || this.readonly() || this.config()?.readonly) {\n event.stopPropagation();\n }\n };\n}\n"],"mappings":"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"}
|
package/fesm2022/{magmonium-one-base-input-CZyIcKrn.mjs → magmonium-one-base-input-CsVND89n.mjs}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as resolveSize } from "./magmonium-one-size-converter-
|
|
1
|
+
import { i as resolveSize } from "./magmonium-one-size-converter-BalJd7VH.mjs";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import { Directive, ElementRef, computed, effect, inject, input, model } from "@angular/core";
|
|
4
4
|
var BaseInputComponent = class BaseInputComponent {
|
|
@@ -180,4 +180,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
180
180
|
});
|
|
181
181
|
export { BaseInputComponent as t };
|
|
182
182
|
|
|
183
|
-
//# sourceMappingURL=magmonium-one-base-input-
|
|
183
|
+
//# sourceMappingURL=magmonium-one-base-input-CsVND89n.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-base-input-
|
|
1
|
+
{"version":3,"file":"magmonium-one-base-input-CsVND89n.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/lib/base-input.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n effect,\n inject,\n input,\n model,\n computed,\n InputSignal,\n ModelSignal,\n} from '@angular/core';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { Size } from '../../../enum/scaling/size';\nimport { Input } from '../model/input';\nimport { resolveSize } from '../../../functions/size/size-converter';\n\n@Directive({})\nexport class BaseInputComponent<T extends Input = Input> {\n public focused: InputSignal<boolean> = input<boolean>(false);\n public errors: InputSignal<readonly WithOptionalFieldTree<ValidationError>[]> =\n input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n public config: InputSignal<Partial<T> | undefined> = input<\n Partial<T> | undefined\n >();\n public required: InputSignal<boolean> = input<boolean>(false);\n public disabled: InputSignal<boolean> = input<boolean>(false);\n public invalid: InputSignal<boolean> = input<boolean>(false);\n public touched: ModelSignal<boolean> = model<boolean>(false);\n public readonly: InputSignal<boolean> = input<boolean>(false);\n\n protected readonly elementRef = inject(ElementRef);\n\n // SectionFormItem stamps Size onto config; inputs scale via CSS var\n // so size changes update without destroying the field. Uses CSS var because\n // host may have display: contents, but CSS vars still inherit to children.\n private readonly applyConfigSize = effect(() => {\n const configWithSize = this.config() as Partial<Input> & { size?: Size };\n const size = configWithSize?.size;\n const el = this.elementRef.nativeElement as HTMLElement;\n if (size) {\n const resolved = resolveSize(size);\n el.style.setProperty('--input-size', resolved);\n // Some input variants declare their own font-size on the rendered\n // control. Keep the actual input text synchronized with the size that\n // drives its geometry instead of relying only on inherited variables.\n el.style.fontSize = resolved;\n } else {\n el.style.removeProperty('--input-size');\n el.style.removeProperty('font-size');\n }\n });\n\n public showErrors = computed(() => \n (this.touched() === true || this.touched() + '' === 'true') && \n (this.invalid() === true || this.invalid() + '' === 'true')\n );\n}\n"],"mappings":";;;AAiBA,IAAa,qBAAb,MAAa,mBAAkB;CACtB,UAAgC,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACrD,SACL,MAAyD,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACvD,SAA8C,MAElD,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACI,WAAiC,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACtD,WAAiC,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACtD,UAAgC,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACrD,UAAgC,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACrD,WAAiC,MAAe,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAE1C,aAAa,OAAO,UAAU;CAKhC,kBAAkB,aAAY;EAE7C,MAAM,OADiB,KAAK,OACf,CAAA,EAAgB;EAC7B,MAAM,KAAK,KAAK,WAAW;EAC3B,IAAI,MAAM;GACR,MAAM,WAAW,YAAY,IAAI;GACjC,GAAG,MAAM,YAAY,gBAAgB,QAAQ;GAI7C,GAAG,MAAM,WAAW;EACtB,OAAO;GACL,GAAG,MAAM,eAAe,cAAc;GACtC,GAAG,MAAM,eAAe,WAAW;EACrC;CACF,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,kBAAA,CAAA,+BAAA,CAAA,CAAA;CAEK,aAAa,gBACjB,KAAK,QAAO,MAAO,QAAQ,KAAK,QAAO,IAAK,OAAO,YACnD,KAAK,QAAO,MAAO,QAAQ,KAAK,QAAO,IAAK,OAAO,SACrD,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAtCU,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAkB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAlB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAkB,cAAA;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,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,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,SAAA,gBAAA;EAAA,UAAA;CAAA,CAAA;;AAAlB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAkB,YAAA,CAAA;EAD9B,MAAA;EAAU,MAAA,CAAA,CAAA,CAAE"}
|
package/fesm2022/{magmonium-one-base-text-6T8KrJbz.mjs → magmonium-one-base-text-CWf7J75v.mjs}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as BaseInputComponent } from "./magmonium-one-base-input-
|
|
1
|
+
import { t as BaseInputComponent } from "./magmonium-one-base-input-CsVND89n.mjs";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import { DOCUMENT, Directive, afterRenderEffect, computed, inject, model, signal, viewChild } from "@angular/core";
|
|
4
4
|
function classListSignal(element) {
|
|
@@ -115,4 +115,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
115
115
|
});
|
|
116
116
|
export { getScrollParent as i, activeElementWithin as n, classListSignal as r, BaseTextInputComponent as t };
|
|
117
117
|
|
|
118
|
-
//# sourceMappingURL=magmonium-one-base-text-
|
|
118
|
+
//# sourceMappingURL=magmonium-one-base-text-CWf7J75v.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-base-text-
|
|
1
|
+
{"version":3,"file":"magmonium-one-base-text-CWf7J75v.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/functions/dom/element.ts","../../../../libs/one/src/lib/shared/ui/input/ui/text/base-text.ts"],"sourcesContent":["import { Signal, signal } from '@angular/core';\n\nexport function classListSignal(element: Element): Signal<string[]> {\n const classSignal = signal<string[]>(Array.from(element.classList));\n const observer = new MutationObserver(() => {\n classSignal.set(Array.from(element.classList));\n });\n observer.observe(element, { attributes: true, attributeFilter: ['class'] });\n return classSignal;\n}\n\n/**\n * Which element in `node`'s own root holds the caret — the document for a node\n * in the light DOM, the nearest shadow root for a node inside one — or null when\n * nothing there does.\n *\n * `document.activeElement` is the wrong question for anything that may be\n * mounted in a shadow root, and every Screen of an app loaded under m-ui is: the\n * Web Component wrapper gives the app's root `ViewEncapsulation.ShadowDom`, so\n * the app renders in one. Asked from inside, the document answers with the\n * shadow **host** — an ancestor of whoever is asking — and `contains` does not\n * walk across the boundary, so `node.contains(document.activeElement)` reads\n * false however well `node` holds the focus. The Section's search bar, asking\n * the document whether its own freshly-focused input still holds the caret,\n * therefore closes itself on the very click that opened it: the toggle is\n * destroyed, the input mounts, the deferred check sees the host instead of the\n * input, and `close` is called.\n *\n * Null is the honest answer for \"no caret has been placed here\", which is what\n * a caller guarding against stealing one is asking.\n */\nexport function activeElementWithin(node: Node): Element | null {\n const root = node.getRootNode() as Document | ShadowRoot;\n return root.activeElement ?? null;\n}\n\nexport function getScrollParent(node: Node | null): HTMLElement | Window {\n if (!node || node === document) return window;\n if (node instanceof ShadowRoot) {\n return getScrollParent(node.host);\n }\n if (node instanceof HTMLElement) {\n if (node.classList.contains('scroll__inner')) return node;\n const style = window.getComputedStyle(node);\n const overflow = style.overflowY || style.overflow || '';\n const isScrollable =\n overflow.includes('scroll') ||\n (overflow.includes('auto') && node.scrollHeight > node.clientHeight);\n if (isScrollable) return node;\n }\n return getScrollParent(node.parentNode);\n}\n","import {\n afterRenderEffect,\n computed,\n Directive,\n DOCUMENT,\n ElementRef,\n inject,\n model,\n ModelSignal,\n signal,\n viewChild,\n} from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { Input, TextInput } from '../../model/input';\nimport { BaseInputComponent } from '../../lib/base-input';\nimport { activeElementWithin } from '../../../../functions/dom/element';\n\n@Directive({})\nexport class BaseTextInputComponent<T extends Input = TextInput>\n extends BaseInputComponent<T>\n implements FormValueControl<string>\n{\n public value = model<string>() as ModelSignal<string>;\n\n private inputElement =\n viewChild<ElementRef<HTMLInputElement>>('inputElement');\n\n private readonly document = inject(DOCUMENT);\n\n /** The element this field has already claimed the caret for, once. */\n private autofocused: HTMLInputElement | undefined;\n\n constructor() {\n super();\n afterRenderEffect(() => {\n const element = this.inputElement();\n if (!this.focused() || !element) return;\n\n const node = element.nativeElement;\n // Once per element. A form that re-renders — an inspector rebuilt on\n // every store change — mounts a fresh input each time, and a focus per\n // mount is a focus per keystroke somewhere else on the screen.\n if (this.autofocused === node) return;\n\n // And never out of a surface the User is already working in. Same rule\n // the form makes for its own first field: a caret that has been placed\n // is theirs, not the next form's to take. Asked of the field's own root,\n // never of the document: inside a shadow root — where every field of an\n // app loaded under m-ui renders — the document answers with the shadow\n // host, so every field read as \"somebody else has the caret\" and not one\n // of them ever took it.\n const active = activeElementWithin(node);\n if (active && active !== this.document.body && active !== node) return;\n\n this.autofocused = node;\n node.focus();\n });\n }\n\n public readonly isFocused = signal(false);\n\n // Icon tracks the wrapper's border: =input-wrapper paints $error on error,\n // the focus tint on focus, and the border color at rest.\n public readonly iconColor = computed(() => {\n if (this.showErrors()) return 'error';\n if (this.isFocused()) return 'focus';\n return 'border';\n });\n\n protected readonly setValue = (value: string) => {\n this.value.set(value);\n this.touched.set(true);\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as resolvePallet } from "./magmonium-one-color-utl-
|
|
3
|
-
import "./magmonium-one-theme-
|
|
4
|
-
import { r as IconComponent } from "./magmonium-one-icon-
|
|
5
|
-
import { n as toAttrNumber, r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-
|
|
6
|
-
import { t as MRefDirective } from "./magmonium-one-m-ref-
|
|
1
|
+
import { Y as NAV_STORE_REF, b as HttpService, c as TranslatePipe } from "./magmonium-one-size-converter-BalJd7VH.mjs";
|
|
2
|
+
import { n as resolvePallet } from "./magmonium-one-color-utl-td5Lij8L.mjs";
|
|
3
|
+
import "./magmonium-one-theme-CYT4pn5X.mjs";
|
|
4
|
+
import { r as IconComponent } from "./magmonium-one-icon-DR7LgBc3.mjs";
|
|
5
|
+
import { n as toAttrNumber, r as ConfigComponent, t as toAttrBool } from "./magmonium-one-attribute-value-CSl5Xeq1.mjs";
|
|
6
|
+
import { t as MRefDirective } from "./magmonium-one-m-ref-X9KgVe86.mjs";
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
import { ChangeDetectionStrategy, Component, InjectionToken, ViewEncapsulation, computed, effect, forwardRef, inject, input, model, output, signal, viewChild } from "@angular/core";
|
|
9
9
|
import { RouterModule } from "@angular/router";
|
|
@@ -1280,4 +1280,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
1280
1280
|
});
|
|
1281
1281
|
export { isButtonName as a, formatBadgeCount as c, deriveGroupClass as i, shouldShowBadge as l, SECTION_FORM_CONTEXT as n, ReactiveElementComponent as o, ImgComponent as r, BadgeComponent as s, ButtonComponent as t };
|
|
1282
1282
|
|
|
1283
|
-
//# sourceMappingURL=magmonium-one-button-
|
|
1283
|
+
//# sourceMappingURL=magmonium-one-button-CJ1Gaaw-.mjs.map
|