@magmonium/one 0.4.66 → 0.4.68
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-base-dropdown-BT3zFQ6c.mjs → magmonium-one-base-dropdown-CCsetZ1L.mjs} +4 -4
- package/fesm2022/{magmonium-one-base-dropdown-BT3zFQ6c.mjs.map → magmonium-one-base-dropdown-CCsetZ1L.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-button-BvX-kWgh.mjs → magmonium-one-button-CKHBcCoO.mjs} +3 -3
- package/fesm2022/{magmonium-one-button-BvX-kWgh.mjs.map → magmonium-one-button-CKHBcCoO.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-checkbox-D4ZJV6AC.mjs → magmonium-one-checkbox-CSWhEUT4.mjs} +2 -2
- package/fesm2022/{magmonium-one-checkbox-D4ZJV6AC.mjs.map → magmonium-one-checkbox-CSWhEUT4.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-group-cbqVX51M.mjs → magmonium-one-group-sz1ufuBT.mjs} +3 -3
- package/fesm2022/{magmonium-one-group-cbqVX51M.mjs.map → magmonium-one-group-sz1ufuBT.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-header-BylTUAGY.mjs → magmonium-one-header-CkW_6y7m.mjs} +2 -2
- package/fesm2022/{magmonium-one-header-BylTUAGY.mjs.map → magmonium-one-header-CkW_6y7m.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-image-editor-FomMDHZl.mjs → magmonium-one-image-editor-BYNN15tt.mjs} +4 -4
- package/fesm2022/{magmonium-one-image-editor-FomMDHZl.mjs.map → magmonium-one-image-editor-BYNN15tt.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-label-BJcQs0Nd.mjs → magmonium-one-label-23DjRQdd.mjs} +34 -2
- package/fesm2022/magmonium-one-label-23DjRQdd.mjs.map +1 -0
- package/fesm2022/{magmonium-one-menu-Ct4s8-W_.mjs → magmonium-one-menu-Nj_Aj1fs.mjs} +2 -2
- package/fesm2022/{magmonium-one-menu-Ct4s8-W_.mjs.map → magmonium-one-menu-Nj_Aj1fs.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-multi-range-CDJX9iFR.mjs → magmonium-one-multi-range-DYIv7jB7.mjs} +2 -2
- package/fesm2022/{magmonium-one-multi-range-CDJX9iFR.mjs.map → magmonium-one-multi-range-DYIv7jB7.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-otp-CS1Z0KKQ.mjs → magmonium-one-otp-a8D3AUU6.mjs} +2 -2
- package/fesm2022/{magmonium-one-otp-CS1Z0KKQ.mjs.map → magmonium-one-otp-a8D3AUU6.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-password-zW1YmyBs.mjs → magmonium-one-password-c2JsD6C5.mjs} +3 -3
- package/fesm2022/{magmonium-one-password-zW1YmyBs.mjs.map → magmonium-one-password-c2JsD6C5.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-radio-yizQzCrD.mjs → magmonium-one-radio-BjsRiF80.mjs} +2 -2
- package/fesm2022/{magmonium-one-radio-yizQzCrD.mjs.map → magmonium-one-radio-BjsRiF80.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-range-B6JesBOM.mjs → magmonium-one-range-M_HBccdt.mjs} +2 -2
- package/fesm2022/{magmonium-one-range-B6JesBOM.mjs.map → magmonium-one-range-M_HBccdt.mjs.map} +1 -1
- package/fesm2022/{magmonium-one-text-DLKgk_bm.mjs → magmonium-one-text-XSYTtGBf.mjs} +2 -2
- package/fesm2022/{magmonium-one-text-DLKgk_bm.mjs.map → magmonium-one-text-XSYTtGBf.mjs.map} +1 -1
- package/fesm2022/magmonium-one.mjs +27 -27
- package/package.json +1 -1
- package/types/magmonium-one.d.ts +43 -28
- package/fesm2022/magmonium-one-label-BJcQs0Nd.mjs.map +0 -1
package/fesm2022/{magmonium-one-checkbox-D4ZJV6AC.mjs.map → magmonium-one-checkbox-CSWhEUT4.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-checkbox-
|
|
1
|
+
{"version":3,"file":"magmonium-one-checkbox-CSWhEUT4.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/lib/placed-checkbox.token.ts","../../../../libs/one/src/lib/shared/ui/input/ui/checkbox/checkbox.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\nimport { DropdownOption } from '../model/input';\n\n/**\n * An `m-checkbox` placed between a SectionFormItem's tags as one option of its\n * CheckboxGroup (libs/one ADR 0039). Provided by the checkbox itself so the\n * item can collect its children without importing the checkbox chunk it only\n * lazy-loads. `undefined` until the checkbox names a `value`.\n */\nexport type PlacedCheckbox = {\n readonly option: Signal<DropdownOption | undefined>;\n};\n\nexport const PLACED_CHECKBOX = new InjectionToken<PlacedCheckbox>(\n 'PLACED_CHECKBOX'\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n ModelSignal,\n} from '@angular/core';\nimport { BaseCheckboxInputComponent } from './base-checkbox';\nimport { LabelComponent } from '../label';\nimport { TextOutputComponent } from '../../../text-output';\nimport { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { DropdownOption, Input } from '../../model/input';\nimport {\n PLACED_CHECKBOX,\n PlacedCheckbox,\n} from '../../lib/placed-checkbox.token';\nimport { toAttrBool } from '../../../../functions/config/attribute-value';\n\n@Component({\n selector: 'm-checkbox',\n template: `\n @if (config(); as checkbox) {\n <div class=\"checkbox\">\n <input\n [checked]=\"checked()\"\n #inputElement\n [class.error]=\"showErrors()\"\n [disabled]=\"disabled()\"\n (change)=\"onChange($event)\"\n type=\"checkbox\"\n [id]=\"checkbox.name\"\n />\n @if (labelText(); as text) {\n <m-label\n [for]=\"checkbox.name\"\n [placeholder]=\"text\"\n [params]=\"checkbox.params\"\n [noTranslate]=\"isNoTranslate()\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n />\n }\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 imports: [LabelComponent, TextOutputComponent],\n styleUrl: './checkbox.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: PLACED_CHECKBOX, useExisting: CheckboxInputComponent },\n ],\n})\nexport class CheckboxInputComponent\n extends BaseCheckboxInputComponent\n implements PlacedCheckbox\n{\n public override value = undefined;\n public override checked = model<boolean>(false) as ModelSignal<boolean>;\n public override config = input<Partial<Input> | 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 // What a checkbox placed inside a CheckboxGroup's SectionFormItem says about\n // the option it stands for, written on its own tag (ADR 0010, ADR 0039).\n // `value` is the attribute because it is the option's value; the member is\n // named apart because FormCheckboxControl pins `value` itself to undefined —\n // a checkbox control's value is `checked`.\n /* eslint-disable @angular-eslint/no-input-rename */\n public readonly optionValue = input<string | undefined>(undefined, {\n alias: 'value',\n });\n /* eslint-enable @angular-eslint/no-input-rename */\n public readonly label = input<string | undefined>();\n public readonly noTranslate = input<boolean | string | undefined>();\n\n protected readonly labelText = computed(\n () => this.label() ?? this.config()?.label\n );\n protected readonly isNoTranslate = computed(\n () => toAttrBool(this.noTranslate()) === true\n );\n\n public readonly option = computed((): DropdownOption | undefined => {\n const value = this.optionValue();\n if (!value) return undefined;\n return {\n value,\n label: this.label() ?? value,\n disabled: this.disabled() || undefined,\n noTranslate: this.isNoTranslate() || undefined,\n };\n });\n\n protected onChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n this.setValue(target?.checked ?? false);\n }\n}\n"],"mappings":";;;;;;;AAaA,MAAa,kBAAkB,IAAI,eACjC,iBAAiB;;ACgDnB,IAAa,yBAAb,MAAa,+BACH,2BAA0B;CAGlB,QAAQ;CACR,UAAU,MAAe,KAAK;CAC9B,SAAS,MAAmC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAC5C,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;CAQ7D,cAAc,MAA0B,QAAS;EAAA,GAAA,YAAA,EAAA,WAAA,cAAA,+BAAA,CAAA;EAC/D,OAAO;CAAO,CAAA;CAGA,QAAQ,MAA2B,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACnC,cAAc,MAAqC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEhD,YAAY,eACvB,KAAK,MAAK,KAAM,KAAK,OAAM,CAAE,EAAE,OACtC,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,gBAAgB,eAC3B,WAAW,KAAK,YAAW,CAAE,MAAM,MAC1C,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAEe,SAAS,eAA0C;EACjE,MAAM,QAAQ,KAAK,YAAW;EAC9B,IAAI,CAAC,OAAO,OAAO;EACnB,OAAO;GACL;GACA,OAAO,KAAK,MAAK,KAAM;GACvB,UAAU,KAAK,SAAQ,KAAM;GAC7B,aAAa,KAAK,cAAa,KAAM;EACtC;CACH,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,SAAS,OAAY;EAC7B,MAAM,SAAS,MAAM;EACrB,KAAK,SAAS,QAAQ,WAAW,KAAK;CACxC;CAnDW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAsB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAtB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAsB,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;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA;GAAA,SAAA;GAAA,SAAA;EAAA;EAAA,WAJtB,CACT;GAAE,SAAS;GAAiB,aAAa;EAAsB,CAChE;EAAA,iBAAA;EAAA,UAAA;EAAA,UAvCS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCT,UAAA;EAAA,QAAA,CAAA,oljBAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MACS;GAAc,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAmB,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,gBAAA,SAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAOlC,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EA3ClC,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAY,UACZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCT,SACQ,CAAC,gBAAgB,mBAAmB;GAAC,iBAE7B,wBAAwB;GAAM,WACpC,CACT;IAAE,SAAS;IAAiB,aAAW;GAAwB,CAChE;GAAA,QAAA,CAAA,oljBAAA;EAAA,CAAA"}
|
|
@@ -2,8 +2,8 @@ import { i as resolveSize, t as coerceSize } from "./magmonium-one-size-converte
|
|
|
2
2
|
import { r as deriveContrastColor } from "./magmonium-one-color-utl-BA51l-Rw.mjs";
|
|
3
3
|
import { o as injectParentSize, s as provideSizeContext } from "./magmonium-one-icon-CH-g8CUR.mjs";
|
|
4
4
|
import { r as ConfigComponent } from "./magmonium-one-attribute-value-CPh-lJPV.mjs";
|
|
5
|
-
import { i as deriveGroupClass, t as ButtonComponent } from "./magmonium-one-button-
|
|
6
|
-
import { t as ContextMenuComponent } from "./magmonium-one-menu-
|
|
5
|
+
import { i as deriveGroupClass, t as ButtonComponent } from "./magmonium-one-button-CKHBcCoO.mjs";
|
|
6
|
+
import { t as ContextMenuComponent } from "./magmonium-one-menu-Nj_Aj1fs.mjs";
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, effect, forwardRef, input, output } from "@angular/core";
|
|
9
9
|
import { forkJoin, map, of } from "rxjs";
|
|
@@ -425,4 +425,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
425
425
|
});
|
|
426
426
|
export { mergeUniqueWith as i, mergeUnique as n, mergeUniqueBy as r, ButtonGroupComponent as t };
|
|
427
427
|
|
|
428
|
-
//# sourceMappingURL=magmonium-one-group-
|
|
428
|
+
//# sourceMappingURL=magmonium-one-group-sz1ufuBT.mjs.map
|
package/fesm2022/{magmonium-one-group-cbqVX51M.mjs.map → magmonium-one-group-sz1ufuBT.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-group-cbqVX51M.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/lib/utils/array.ts","../../../../libs/one/src/lib/shared/ui/button/ui/group/group.ts"],"sourcesContent":["/**\n * Merges multiple arrays and removes duplicates\n * @param arrays - Arrays to merge\n * @returns Merged array with unique values\n */\nexport function mergeUnique<T>(...arrays: T[][]): T[] {\n return [...new Set(arrays.flat())];\n}\n\n/**\n * Merges arrays of objects and removes duplicates by key\n * @param arrays - Arrays to merge\n * @param key - Property to use for uniqueness check\n * @returns Merged array with unique objects\n */\nexport function mergeUniqueBy<T, K extends keyof T>(\n arrays: T[][],\n key: K\n): T[] {\n const map = new Map<T[K], T>();\n\n arrays.flat().forEach((item) => {\n if (!map.has(item[key])) {\n map.set(item[key], item);\n }\n });\n\n return Array.from(map.values());\n}\n\n/**\n * Merges arrays with custom comparator\n */\nexport function mergeUniqueWith<T>(\n arrays: T[][],\n compareFn: (item: T) => unknown\n): T[] {\n const map = new Map<unknown, T>();\n\n arrays.flat().forEach((item) => {\n const key = compareFn(item);\n if (!map.has(key)) {\n map.set(key, item);\n }\n });\n\n return Array.from(map.values());\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Button, ButtonGroup } from '../../type/button';\nimport { ButtonComponent } from '../button';\nimport { ConfigComponent } from '../../../../lib/components/config-component';\nimport { mergeUnique } from '../../../../lib/utils/array';\nimport { ContextMenuComponent, MenuItem } from '../../../menu';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { forkJoin, map, of } from 'rxjs';\nimport { deriveContrastColor } from '../../../../functions/color/operations';\n\nimport { deriveGroupClass } from '../../lib';\nimport {\n injectParentSize,\n provideSizeContext,\n} from '../../../../config/size-context.token';\nimport { Size } from '../../../../enum/scaling/size';\nimport {\n coerceSize,\n resolveSize,\n} from '../../../../functions/size/size-converter';\n\n@Component({\n selector: 'm-button-group, m-one-button-group',\n template: `\n @if (config(); as group) {\n <div\n class=\"button-group {{ classList() }}\"\n [class.is-context]=\"group.isContext\"\n >\n @if (group.isContext) {\n @if (primaryButton(); as primary) {\n <m-button\n [variant]=\"isPrimaryVisible() ? 'primary' : undefined\"\n [disabled]=\"isDisabled(primary.name)\"\n [color]=\"group.color\"\n [config]=\"primary\"\n [name]=\"primary.name\"\n [one]=\"isFromOne()\"\n [remote]=\"remote() ?? group.remote\"\n (clicked)=\"clicked.emit($event)\"\n />\n }\n @if (secondaryActions(); as actions) {\n <m-context-menu\n [config]=\"{\n icon: {\n name: config()?.contextMenuIcon ?? 'ellipsis-vertical',\n color: contextMenuIconColor(),\n },\n options: actions,\n }\"\n [inverted]=\"group.inverted\"\n [remote]=\"remote() ?? group.remote\"\n (action)=\"handleMenuAction($event)\"\n />\n }\n } @else {\n @for (button of mergedButtons(); track $index) {\n <m-button\n [variant]=\"isPrimary(button.name) ? 'primary' : undefined\"\n [disabled]=\"isDisabled(button.name)\"\n [color]=\"group.color\"\n [config]=\"button\"\n [name]=\"button.name\"\n [one]=\"isFromOne()\"\n [remote]=\"remote() ?? group.remote\"\n (clicked)=\"clicked.emit($event)\"\n />\n }\n }\n </div>\n }\n `,\n imports: [forwardRef(() => ButtonComponent), ContextMenuComponent],\n styleUrls: ['./group.sass'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n // The one non-Section that may declare a Size, because a cluster of\n // actions routinely needs to differ from the region holding it (ADR 0008).\n '[style.font-size]': 'sizeLength()',\n },\n providers: [\n provideSizeContext(ButtonGroupComponent),\n ],\n})\nexport class ButtonGroupComponent extends ConfigComponent<ButtonGroup> {\n // to overwrite specific button config\n buttons = input<Record<string, Partial<Button>>>();\n\n // to add names\n names = input<string[]>();\n exclude = input<string[]>();\n vertical = input<boolean | undefined>();\n\n size = input<Size | undefined>();\n\n private readonly parentSize = injectParentSize();\n\n readonly resolvedSize = computed<Size>(() =>\n coerceSize(this.size(), this.config()?.size, this.parentSize?.size())\n );\n protected readonly sizeLength = computed(() =>\n resolveSize(this.resolvedSize())\n );\n\n override subFolder = 'button_groups';\n readonly clicked = output<Button | undefined>();\n\n protected readonly classList = computed(() => {\n const base = deriveGroupClass(this.config());\n if (this.isPrimaryVisible()) {\n return base.includes('is-primary') ? base : `${base} is-primary`.trim();\n }\n return base.replace('is-primary', '').trim();\n });\n\n protected readonly isPrimaryVisible = computed(() => {\n const primary = this.primaryButton();\n if (!primary) return false;\n return !!(this.isPrimary(primary.name) || primary.variant === 'primary');\n });\n\n protected readonly contextMenuIconColor = computed(() => {\n if (!this.isPrimaryVisible()) {\n return undefined;\n }\n const oppColor = this.pallet()?.oppositeColor;\n if (oppColor) {\n return deriveContrastColor(oppColor);\n }\n return 'white';\n });\n\n protected readonly mergedNames = computed(() => {\n const exclude = this.exclude() ?? [];\n const names = mergeUnique<string>(\n this.names() ?? [],\n this.config()?.names ?? []\n ).filter((name) => !exclude.includes(name));\n const buttonNames = new Set(this.mergedButtons().map((b) => b.name));\n return names.filter((name) => !buttonNames.has(name));\n });\n\n protected readonly buttonsResource = rxResource({\n params: () => {\n const config = this.config();\n if (!config?.isContext) return undefined;\n\n const namesFromAsset = config.names ?? [];\n const buttonNamesFromAsset = config.buttons?.map((b) => b.name) ?? [];\n const manualNames = this.names() ?? [];\n\n const allNames = mergeUnique<string>(\n manualNames,\n mergeUnique<string>(namesFromAsset, buttonNamesFromAsset as string[])\n );\n\n if (allNames.length === 0) return undefined;\n\n return { names: allNames, isOne: this.isFromOne() };\n },\n stream: ({ params }) => {\n if (!params) return of([]);\n return forkJoin(\n params.names.map((name) =>\n this.assetStore\n .resolve<Button>('buttons', name, params.isOne)\n .pipe(map((button) => ({ ...button, name })))\n )\n );\n },\n });\n\n protected readonly mergedButtons = computed(() => {\n const config = this.config();\n const buttonOverrides = this.buttons();\n const exclude = this.exclude() ?? [];\n\n // If isContext is true, we use the resolved buttons from the resource\n // Otherwise we use buttons from config, and also include names as partial buttons\n const yamlButtons = (\n config?.isContext\n ? (this.buttonsResource.value() ?? [])\n : [\n ...(config?.buttons ?? []),\n ...(config?.names?.map((name) => ({ name }) as Button) ?? []),\n ]\n ).map((b) => (typeof b === 'string' ? ({ name: b } as Button) : b));\n\n const merged = yamlButtons\n .filter((b) => !b.name || !exclude.includes(b.name))\n .map((button) => ({\n ...button,\n ...(button.name && buttonOverrides?.[button.name]\n ? buttonOverrides[button.name]\n : {}),\n }));\n\n if (!buttonOverrides) {\n return merged;\n }\n\n const yamlNames = new Set(yamlButtons.map((b) => b.name));\n const configNames = new Set(config?.names ?? []);\n const extra = Object.entries(buttonOverrides)\n .filter(\n ([name]) =>\n !yamlNames.has(name) &&\n !configNames.has(name) &&\n !exclude.includes(name)\n )\n .map(([name, override]) => ({ name, ...override }) as Button);\n\n return [...merged, ...extra];\n });\n\n protected readonly primaryButton = computed(() => {\n const buttons = this.mergedButtons();\n const primaryName = this.config()?.primary;\n if (!primaryName) return buttons[0];\n return buttons.find((b) => b.name === primaryName) ?? buttons[0];\n });\n\n protected readonly secondaryActions = computed<MenuItem[][] | undefined>(\n () => {\n const primary = this.primaryButton();\n const secondary = this.mergedButtons().filter((b) => b !== primary);\n\n if (secondary.length === 0) return undefined;\n\n const items: MenuItem[] = secondary.map((b) => ({\n id: b.name ?? '',\n label: b.label ?? b.name ?? '',\n icon: b.icon,\n nav: b.nav,\n link: b.href,\n disabled: b.disabled ? true : undefined,\n }));\n\n return [items];\n }\n );\n\n constructor() {\n super();\n effect(this.updateProperty);\n }\n\n isPrimary(name?: string): true | undefined {\n const config = this.config();\n if (!config?.primary || !name) {\n return undefined;\n }\n return name === config.primary ? true : undefined;\n }\n\n isDisabled(name?: string): boolean | undefined {\n if (!name) return undefined;\n const buttonOverride = this.buttons()?.[name];\n if (typeof buttonOverride?.disabled !== 'undefined') {\n return buttonOverride.disabled;\n }\n const config = this.config();\n if (!config?.disabled) return undefined;\n return config.disabled[name];\n }\n\n protected handleMenuAction(item: MenuItem) {\n const button = this.mergedButtons().find((b) => b.name === item.id);\n this.clicked.emit(button);\n }\n\n private readonly updateProperty = (): void => {\n const updatedConfig = <ButtonGroup>{};\n const vertical = this.vertical();\n if (typeof vertical !== 'undefined') {\n updatedConfig.vertical = vertical;\n }\n this.config.update((prev) => ({\n ...(prev ?? {}),\n ...updatedConfig,\n }));\n };\n\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"magmonium-one-group-sz1ufuBT.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/lib/utils/array.ts","../../../../libs/one/src/lib/shared/ui/button/ui/group/group.ts"],"sourcesContent":["/**\n * Merges multiple arrays and removes duplicates\n * @param arrays - Arrays to merge\n * @returns Merged array with unique values\n */\nexport function mergeUnique<T>(...arrays: T[][]): T[] {\n return [...new Set(arrays.flat())];\n}\n\n/**\n * Merges arrays of objects and removes duplicates by key\n * @param arrays - Arrays to merge\n * @param key - Property to use for uniqueness check\n * @returns Merged array with unique objects\n */\nexport function mergeUniqueBy<T, K extends keyof T>(\n arrays: T[][],\n key: K\n): T[] {\n const map = new Map<T[K], T>();\n\n arrays.flat().forEach((item) => {\n if (!map.has(item[key])) {\n map.set(item[key], item);\n }\n });\n\n return Array.from(map.values());\n}\n\n/**\n * Merges arrays with custom comparator\n */\nexport function mergeUniqueWith<T>(\n arrays: T[][],\n compareFn: (item: T) => unknown\n): T[] {\n const map = new Map<unknown, T>();\n\n arrays.flat().forEach((item) => {\n const key = compareFn(item);\n if (!map.has(key)) {\n map.set(key, item);\n }\n });\n\n return Array.from(map.values());\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n forwardRef,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Button, ButtonGroup } from '../../type/button';\nimport { ButtonComponent } from '../button';\nimport { ConfigComponent } from '../../../../lib/components/config-component';\nimport { mergeUnique } from '../../../../lib/utils/array';\nimport { ContextMenuComponent, MenuItem } from '../../../menu';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { forkJoin, map, of } from 'rxjs';\nimport { deriveContrastColor } from '../../../../functions/color/operations';\n\nimport { deriveGroupClass } from '../../lib';\nimport {\n injectParentSize,\n provideSizeContext,\n} from '../../../../config/size-context.token';\nimport { Size } from '../../../../enum/scaling/size';\nimport {\n coerceSize,\n resolveSize,\n} from '../../../../functions/size/size-converter';\n\n@Component({\n selector: 'm-button-group, m-one-button-group',\n template: `\n @if (config(); as group) {\n <div\n class=\"button-group {{ classList() }}\"\n [class.is-context]=\"group.isContext\"\n >\n @if (group.isContext) {\n @if (primaryButton(); as primary) {\n <m-button\n [variant]=\"isPrimaryVisible() ? 'primary' : undefined\"\n [disabled]=\"isDisabled(primary.name)\"\n [color]=\"group.color\"\n [config]=\"primary\"\n [name]=\"primary.name\"\n [one]=\"isFromOne()\"\n [remote]=\"remote() ?? group.remote\"\n (clicked)=\"clicked.emit($event)\"\n />\n }\n @if (secondaryActions(); as actions) {\n <m-context-menu\n [config]=\"{\n icon: {\n name: config()?.contextMenuIcon ?? 'ellipsis-vertical',\n color: contextMenuIconColor(),\n },\n options: actions,\n }\"\n [inverted]=\"group.inverted\"\n [remote]=\"remote() ?? group.remote\"\n (action)=\"handleMenuAction($event)\"\n />\n }\n } @else {\n @for (button of mergedButtons(); track $index) {\n <m-button\n [variant]=\"isPrimary(button.name) ? 'primary' : undefined\"\n [disabled]=\"isDisabled(button.name)\"\n [color]=\"group.color\"\n [config]=\"button\"\n [name]=\"button.name\"\n [one]=\"isFromOne()\"\n [remote]=\"remote() ?? group.remote\"\n (clicked)=\"clicked.emit($event)\"\n />\n }\n }\n </div>\n }\n `,\n imports: [forwardRef(() => ButtonComponent), ContextMenuComponent],\n styleUrls: ['./group.sass'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n // The one non-Section that may declare a Size, because a cluster of\n // actions routinely needs to differ from the region holding it (ADR 0008).\n '[style.font-size]': 'sizeLength()',\n },\n providers: [\n provideSizeContext(ButtonGroupComponent),\n ],\n})\nexport class ButtonGroupComponent extends ConfigComponent<ButtonGroup> {\n // to overwrite specific button config\n buttons = input<Record<string, Partial<Button>>>();\n\n // to add names\n names = input<string[]>();\n exclude = input<string[]>();\n vertical = input<boolean | undefined>();\n\n size = input<Size | undefined>();\n\n private readonly parentSize = injectParentSize();\n\n readonly resolvedSize = computed<Size>(() =>\n coerceSize(this.size(), this.config()?.size, this.parentSize?.size())\n );\n protected readonly sizeLength = computed(() =>\n resolveSize(this.resolvedSize())\n );\n\n override subFolder = 'button_groups';\n readonly clicked = output<Button | undefined>();\n\n protected readonly classList = computed(() => {\n const base = deriveGroupClass(this.config());\n if (this.isPrimaryVisible()) {\n return base.includes('is-primary') ? base : `${base} is-primary`.trim();\n }\n return base.replace('is-primary', '').trim();\n });\n\n protected readonly isPrimaryVisible = computed(() => {\n const primary = this.primaryButton();\n if (!primary) return false;\n return !!(this.isPrimary(primary.name) || primary.variant === 'primary');\n });\n\n protected readonly contextMenuIconColor = computed(() => {\n if (!this.isPrimaryVisible()) {\n return undefined;\n }\n const oppColor = this.pallet()?.oppositeColor;\n if (oppColor) {\n return deriveContrastColor(oppColor);\n }\n return 'white';\n });\n\n protected readonly mergedNames = computed(() => {\n const exclude = this.exclude() ?? [];\n const names = mergeUnique<string>(\n this.names() ?? [],\n this.config()?.names ?? []\n ).filter((name) => !exclude.includes(name));\n const buttonNames = new Set(this.mergedButtons().map((b) => b.name));\n return names.filter((name) => !buttonNames.has(name));\n });\n\n protected readonly buttonsResource = rxResource({\n params: () => {\n const config = this.config();\n if (!config?.isContext) return undefined;\n\n const namesFromAsset = config.names ?? [];\n const buttonNamesFromAsset = config.buttons?.map((b) => b.name) ?? [];\n const manualNames = this.names() ?? [];\n\n const allNames = mergeUnique<string>(\n manualNames,\n mergeUnique<string>(namesFromAsset, buttonNamesFromAsset as string[])\n );\n\n if (allNames.length === 0) return undefined;\n\n return { names: allNames, isOne: this.isFromOne() };\n },\n stream: ({ params }) => {\n if (!params) return of([]);\n return forkJoin(\n params.names.map((name) =>\n this.assetStore\n .resolve<Button>('buttons', name, params.isOne)\n .pipe(map((button) => ({ ...button, name })))\n )\n );\n },\n });\n\n protected readonly mergedButtons = computed(() => {\n const config = this.config();\n const buttonOverrides = this.buttons();\n const exclude = this.exclude() ?? [];\n\n // If isContext is true, we use the resolved buttons from the resource\n // Otherwise we use buttons from config, and also include names as partial buttons\n const yamlButtons = (\n config?.isContext\n ? (this.buttonsResource.value() ?? [])\n : [\n ...(config?.buttons ?? []),\n ...(config?.names?.map((name) => ({ name }) as Button) ?? []),\n ]\n ).map((b) => (typeof b === 'string' ? ({ name: b } as Button) : b));\n\n const merged = yamlButtons\n .filter((b) => !b.name || !exclude.includes(b.name))\n .map((button) => ({\n ...button,\n ...(button.name && buttonOverrides?.[button.name]\n ? buttonOverrides[button.name]\n : {}),\n }));\n\n if (!buttonOverrides) {\n return merged;\n }\n\n const yamlNames = new Set(yamlButtons.map((b) => b.name));\n const configNames = new Set(config?.names ?? []);\n const extra = Object.entries(buttonOverrides)\n .filter(\n ([name]) =>\n !yamlNames.has(name) &&\n !configNames.has(name) &&\n !exclude.includes(name)\n )\n .map(([name, override]) => ({ name, ...override }) as Button);\n\n return [...merged, ...extra];\n });\n\n protected readonly primaryButton = computed(() => {\n const buttons = this.mergedButtons();\n const primaryName = this.config()?.primary;\n if (!primaryName) return buttons[0];\n return buttons.find((b) => b.name === primaryName) ?? buttons[0];\n });\n\n protected readonly secondaryActions = computed<MenuItem[][] | undefined>(\n () => {\n const primary = this.primaryButton();\n const secondary = this.mergedButtons().filter((b) => b !== primary);\n\n if (secondary.length === 0) return undefined;\n\n const items: MenuItem[] = secondary.map((b) => ({\n id: b.name ?? '',\n label: b.label ?? b.name ?? '',\n icon: b.icon,\n nav: b.nav,\n link: b.href,\n disabled: b.disabled ? true : undefined,\n }));\n\n return [items];\n }\n );\n\n constructor() {\n super();\n effect(this.updateProperty);\n }\n\n isPrimary(name?: string): true | undefined {\n const config = this.config();\n if (!config?.primary || !name) {\n return undefined;\n }\n return name === config.primary ? true : undefined;\n }\n\n isDisabled(name?: string): boolean | undefined {\n if (!name) return undefined;\n const buttonOverride = this.buttons()?.[name];\n if (typeof buttonOverride?.disabled !== 'undefined') {\n return buttonOverride.disabled;\n }\n const config = this.config();\n if (!config?.disabled) return undefined;\n return config.disabled[name];\n }\n\n protected handleMenuAction(item: MenuItem) {\n const button = this.mergedButtons().find((b) => b.name === item.id);\n this.clicked.emit(button);\n }\n\n private readonly updateProperty = (): void => {\n const updatedConfig = <ButtonGroup>{};\n const vertical = this.vertical();\n if (typeof vertical !== 'undefined') {\n updatedConfig.vertical = vertical;\n }\n this.config.update((prev) => ({\n ...(prev ?? {}),\n ...updatedConfig,\n }));\n };\n\n}\n"],"mappings":";;;;;;;;;;AAKA,SAAgB,YAAe,GAAG,QAAa;CAC7C,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,KAAI,CAAE,CAAC;AACnC;AAQA,SAAgB,cACd,QACA,KAAM;CAEN,MAAM,sBAAM,IAAI,IAAG;CAEnB,OAAO,KAAI,CAAE,CAAC,SAAS,SAAQ;EAC7B,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,GACpB,IAAI,IAAI,KAAK,MAAM,IAAI;CAE3B,CAAC;CAED,OAAO,MAAM,KAAK,IAAI,OAAM,CAAE;AAChC;AAKA,SAAgB,gBACd,QACA,WAA+B;CAE/B,MAAM,sBAAM,IAAI,IAAG;CAEnB,OAAO,KAAI,CAAE,CAAC,SAAS,SAAQ;EAC7B,MAAM,MAAM,UAAU,IAAI;EAC1B,IAAI,CAAC,IAAI,IAAI,GAAG,GACd,IAAI,IAAI,KAAK,IAAI;CAErB,CAAC;CAED,OAAO,MAAM,KAAK,IAAI,OAAM,CAAE;AAChC;ACgDA,IAAa,uBAAb,MAAa,6BAA6B,gBAA4B;CAEpE,UAAU,MAAwC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAGlD,QAAQ,MAAiB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACzB,UAAU,MAAiB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC3B,WAAW,MAA4B,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAEvC,OAAO,MAAyB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEf,aAAa,iBAAgB;CAErC,eAAe,eACtB,WAAW,KAAK,KAAI,GAAI,KAAK,OAAM,CAAE,EAAE,MAAM,KAAK,YAAY,KAAI,CAAE,GACrE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,aAAa,eAC9B,YAAY,KAAK,aAAY,CAAE,GAChC,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEQ,YAAY;CACZ,UAAU,OAAM;CAEN,YAAY,eAAc;EAC3C,MAAM,OAAO,iBAAiB,KAAK,OAAM,CAAE;EAC3C,IAAI,KAAK,iBAAgB,GACvB,OAAO,KAAK,SAAS,YAAY,IAAI,OAAO,GAAG,KAAI,aAAc,KAAI;EAEvE,OAAO,KAAK,QAAQ,cAAc,EAAE,CAAC,CAAC,KAAI;CAC5C,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,mBAAmB,eAAc;EAClD,MAAM,UAAU,KAAK,cAAa;EAClC,IAAI,CAAC,SAAS,OAAO;EACrB,OAAO,CAAC,EAAE,KAAK,UAAU,QAAQ,IAAI,KAAK,QAAQ,YAAY;CAChE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,uBAAuB,eAAc;EACtD,IAAI,CAAC,KAAK,iBAAgB,GACxB;EAEF,MAAM,WAAW,KAAK,OAAM,CAAE,EAAE;EAChC,IAAI,UACF,OAAO,oBAAoB,QAAQ;EAErC,OAAO;CACT,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,uBAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,cAAc,eAAc;EAC7C,MAAM,UAAU,KAAK,QAAO,KAAM,CAAA;EAClC,MAAM,QAAQ,YACZ,KAAK,MAAK,KAAM,CAAA,GAChB,KAAK,OAAM,CAAE,EAAE,SAAS,CAAA,CAAE,CAC3B,CAAC,QAAQ,SAAS,CAAC,QAAQ,SAAS,IAAI,CAAC;EAC1C,MAAM,cAAc,IAAI,IAAI,KAAK,cAAa,CAAE,CAAC,KAAK,MAAM,EAAE,IAAI,CAAC;EACnE,OAAO,MAAM,QAAQ,SAAS,CAAC,YAAY,IAAI,IAAI,CAAC;CACtD,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,kBAAkB,WAAW;EAC9C,cAAa;GACX,MAAM,SAAS,KAAK,OAAM;GAC1B,IAAI,CAAC,QAAQ,WAAW,OAAO;GAE/B,MAAM,iBAAiB,OAAO,SAAS,CAAA;GACvC,MAAM,uBAAuB,OAAO,SAAS,KAAK,MAAM,EAAE,IAAI,KAAK,CAAA;GAGnE,MAAM,WAAW,YAFG,KAAK,MAAK,KAAM,CAAA,GAIlC,YAAoB,gBAAgB,oBAAgC,CAAC;GAGvE,IAAI,SAAS,WAAW,GAAG,OAAO;GAElC,OAAO;IAAE,OAAO;IAAU,OAAO,KAAK,UAAS;GAAE;EACnD;EACA,SAAS,EAAE,aAAY;GACrB,IAAI,CAAC,QAAQ,OAAO,GAAG,CAAA,CAAE;GACzB,OAAO,SACL,OAAO,MAAM,KAAK,SAChB,KAAK,WACF,QAAgB,WAAW,MAAM,OAAO,KAAK,CAAC,CAC9C,KAAK,KAAK,YAAY;IAAE,GAAG;IAAQ;GAAI,EAAG,CAAC,CAAC,CAChD;EAEL;CACD,CAAA;CAEkB,gBAAgB,eAAc;EAC/C,MAAM,SAAS,KAAK,OAAM;EAC1B,MAAM,kBAAkB,KAAK,QAAO;EACpC,MAAM,UAAU,KAAK,QAAO,KAAM,CAAA;EAIlC,MAAM,eACJ,QAAQ,YACH,KAAK,gBAAgB,MAAK,KAAM,CAAA,IACjC,CACE,GAAI,QAAQ,WAAW,CAAA,GACvB,GAAI,QAAQ,OAAO,KAAK,UAAU,EAAE,KAAI,EAAa,KAAK,CAAA,CAC3D,EAAA,CACL,KAAK,MAAO,OAAO,MAAM,WAAY,EAAE,MAAM,EAAC,IAAgB,CAAE;EAElE,MAAM,SAAS,YACZ,QAAQ,MAAM,CAAC,EAAE,QAAQ,CAAC,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,CACnD,KAAK,YAAY;GAChB,GAAG;GACH,GAAI,OAAO,QAAQ,kBAAkB,OAAO,QACxC,gBAAgB,OAAO,QACvB,CAAA;EACL,EAAC;EAEJ,IAAI,CAAC,iBACH,OAAO;EAGT,MAAM,YAAY,IAAI,IAAI,YAAY,KAAK,MAAM,EAAE,IAAI,CAAC;EACxD,MAAM,cAAc,IAAI,IAAI,QAAQ,SAAS,CAAA,CAAE;EAC/C,MAAM,QAAQ,OAAO,QAAQ,eAAe,CAAC,CAC1C,QACE,CAAC,UACA,CAAC,UAAU,IAAI,IAAI,KACnB,CAAC,YAAY,IAAI,IAAI,KACrB,CAAC,QAAQ,SAAS,IAAI,CAAC,CAC1B,CACA,KAAK,CAAC,MAAM,eAAe;GAAE;GAAM,GAAG;EAAQ,EAAa;EAE9D,OAAO,CAAC,GAAG,QAAQ,GAAG,KAAK;CAC7B,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,gBAAgB,eAAc;EAC/C,MAAM,UAAU,KAAK,cAAa;EAClC,MAAM,cAAc,KAAK,OAAM,CAAE,EAAE;EACnC,IAAI,CAAC,aAAa,OAAO,QAAQ;EACjC,OAAO,QAAQ,MAAM,MAAM,EAAE,SAAS,WAAW,KAAK,QAAQ;CAChE,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAEiB,mBAAmB,eAC/B;EACH,MAAM,UAAU,KAAK,cAAa;EAClC,MAAM,YAAY,KAAK,cAAa,CAAE,CAAC,QAAQ,MAAM,MAAM,OAAO;EAElE,IAAI,UAAU,WAAW,GAAG,OAAO;EAWnC,OAAO,CATmB,UAAU,KAAK,OAAO;GAC9C,IAAI,EAAE,QAAQ;GACd,OAAO,EAAE,SAAS,EAAE,QAAQ;GAC5B,MAAM,EAAE;GACR,KAAK,EAAE;GACP,MAAM,EAAE;GACR,UAAU,EAAE,WAAW,OAAO;EAC/B,EAEO,CAAK;CACf,GACD,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAED,cAAA;EACE,MAAK;EACL,OAAO,KAAK,cAAc;CAC5B;CAEA,UAAU,MAAa;EACrB,MAAM,SAAS,KAAK,OAAM;EAC1B,IAAI,CAAC,QAAQ,WAAW,CAAC,MACvB;EAEF,OAAO,SAAS,OAAO,UAAU,OAAO;CAC1C;CAEA,WAAW,MAAa;EACtB,IAAI,CAAC,MAAM,OAAO;EAClB,MAAM,iBAAiB,KAAK,QAAO,CAAE,GAAG;EACxC,IAAI,OAAO,gBAAgB,aAAa,aACtC,OAAO,eAAe;EAExB,MAAM,SAAS,KAAK,OAAM;EAC1B,IAAI,CAAC,QAAQ,UAAU,OAAO;EAC9B,OAAO,OAAO,SAAS;CACzB;CAEU,iBAAiB,MAAc;EACvC,MAAM,SAAS,KAAK,cAAa,CAAE,CAAC,MAAM,MAAM,EAAE,SAAS,KAAK,EAAE;EAClE,KAAK,QAAQ,KAAK,MAAM;CAC1B;CAEiB,uBAA4B;EAC3C,MAAM,gBAA6B,CAAA;EACnC,MAAM,WAAW,KAAK,SAAQ;EAC9B,IAAI,OAAO,aAAa,aACtB,cAAc,WAAW;EAE3B,KAAK,OAAO,QAAQ,UAAU;GAC5B,GAAI,QAAQ,CAAA;GACZ,GAAG;EACJ,EAAC;CACJ;CArMW,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,OAAA;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;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,SAAA,UAAA;EAAA,MAAA,EAAA,YAAA,EAAA,mBAAA,eAAA,EAAA;EAAA,WAJpB,CACT,mBAAmB,oBAAoB,CACxC;EAAA,iBAAA;EAAA,UAAA;EAAA,UA7DS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDT,UAAA;EAAA,QAAA,CAAA,8hSAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MAAA,GAAA,iBAC0B,eAAe;GAAA,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,gBAAA,SAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAA,GAAA,iBAAG,oBAAoB;GAAA,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA,CAAA,gBAAA,QAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AAatD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAoB,YAAA,CAAA;EAjEhC,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAoC,UACpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDT,SACQ,CAAC,iBAAiB,eAAe,GAAG,oBAAoB;GAAC,eAEnD,kBAAkB;GAAI,iBACpB,wBAAwB;GAAM,MACzC,EAGJ,qBAAqB,eACtB;GAAA,WACU,CACT,mBAAkB,oBAAA,CACnB;GAAA,QAAA,CAAA,8hSAAA;EAAA,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { f as escapeHtml, i as resolveSize, l as TranslateService, p as miniMarkInlineToHtml } from "./magmonium-one-size-converter-BqkALIWA.mjs";
|
|
2
2
|
import { a as SIZE_CONTEXT, r as IconComponent } from "./magmonium-one-icon-CH-g8CUR.mjs";
|
|
3
|
-
import { t as ButtonComponent } from "./magmonium-one-button-
|
|
3
|
+
import { t as ButtonComponent } from "./magmonium-one-button-CKHBcCoO.mjs";
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import { ChangeDetectionStrategy, Component, computed, inject, input, output } from "@angular/core";
|
|
6
6
|
var HeaderComponent = class HeaderComponent {
|
|
@@ -378,4 +378,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
378
378
|
});
|
|
379
379
|
export { HeaderComponent as t };
|
|
380
380
|
|
|
381
|
-
//# sourceMappingURL=magmonium-one-header-
|
|
381
|
+
//# sourceMappingURL=magmonium-one-header-CkW_6y7m.mjs.map
|
package/fesm2022/{magmonium-one-header-BylTUAGY.mjs.map → magmonium-one-header-CkW_6y7m.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-header-
|
|
1
|
+
{"version":3,"file":"magmonium-one-header-CkW_6y7m.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/header/ui/header.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { TranslateService } from '../../../services/translate';\nimport { HeaderLevel } from '../type/header';\nimport { ButtonComponent } from '../../button/ui/button';\nimport { IconComponent } from '../../icon';\nimport { Button } from '../../button/type/button';\nimport { SIZE_CONTEXT } from '../../../config/size-context.token';\nimport { resolveSize } from '../../../functions/size/size-converter';\nimport { escapeHtml, miniMarkInlineToHtml } from '../../../functions/text';\n\n@Component({\n selector: 'm-header',\n imports: [ButtonComponent, IconComponent],\n template: `\n @switch (level()) {\n @case (1) {\n <h1 class=\"header__heading\">\n @if (icon(); as iconName) {\n <m-icon class=\"header__icon\" [name]=\"iconName\" />\n }\n <span [innerHTML]=\"html()\"></span>\n <ng-content />\n @if (actionConfig(); as action) {\n <m-button class=\"header__action\" [config]=\"action\" [style.--m-button-size]=\"actionSize()\" (clicked)=\"actionClick.emit()\" />\n }\n </h1>\n }\n @case (2) {\n <h2 class=\"header__heading\">\n @if (icon(); as iconName) {\n <m-icon class=\"header__icon\" [name]=\"iconName\" />\n }\n <span [innerHTML]=\"html()\"></span>\n <ng-content />\n @if (actionConfig(); as action) {\n <m-button class=\"header__action\" [config]=\"action\" [style.--m-button-size]=\"actionSize()\" (clicked)=\"actionClick.emit()\" />\n }\n </h2>\n }\n @case (3) {\n <h3 class=\"header__heading\">\n @if (icon(); as iconName) {\n <m-icon class=\"header__icon\" [name]=\"iconName\" />\n }\n <span [innerHTML]=\"html()\"></span>\n <ng-content />\n @if (actionConfig(); as action) {\n <m-button class=\"header__action\" [config]=\"action\" [style.--m-button-size]=\"actionSize()\" (clicked)=\"actionClick.emit()\" />\n }\n </h3>\n }\n @case (4) {\n <h4 class=\"header__heading\">\n @if (icon(); as iconName) {\n <m-icon class=\"header__icon\" [name]=\"iconName\" />\n }\n <span [innerHTML]=\"html()\"></span>\n <ng-content />\n @if (actionConfig(); as action) {\n <m-button class=\"header__action\" [config]=\"action\" [style.--m-button-size]=\"actionSize()\" (clicked)=\"actionClick.emit()\" />\n }\n </h4>\n }\n @case (5) {\n <h5 class=\"header__heading\">\n @if (icon(); as iconName) {\n <m-icon class=\"header__icon\" [name]=\"iconName\" />\n }\n <span [innerHTML]=\"html()\"></span>\n <ng-content />\n @if (actionConfig(); as action) {\n <m-button class=\"header__action\" [config]=\"action\" [style.--m-button-size]=\"actionSize()\" (clicked)=\"actionClick.emit()\" />\n }\n </h5>\n }\n @case (6) {\n <h6 class=\"header__heading\">\n @if (icon(); as iconName) {\n <m-icon class=\"header__icon\" [name]=\"iconName\" />\n }\n <span [innerHTML]=\"html()\"></span>\n <ng-content />\n @if (actionConfig(); as action) {\n <m-button class=\"header__action\" [config]=\"action\" [style.--m-button-size]=\"actionSize()\" (clicked)=\"actionClick.emit()\" />\n }\n </h6>\n }\n }\n `,\n styleUrl: './header.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeaderComponent {\n readonly level = input<HeaderLevel>(3);\n readonly label = input<string | undefined>();\n // Drawn inside the heading rather than beside it. A glyph placed as the\n // heading's sibling has no line box of its own to centre against — it ends\n // up centred on whatever column it sits next to, which is how a Canvas\n // header's icon came to line up with the label slot's drop rect instead of\n // with the label. Inside, the two share one line box at every level.\n readonly icon = input<string | undefined>();\n readonly actionButton = input<string | undefined>();\n // The action Button's accessible name. It renders icon-only, so the label is\n // the only thing a screen reader has to go on — without it the button reads\n // as nothing at all.\n readonly actionLabel = input<string | undefined>();\n // The label is authored text rather than a translation key. Needed for text\n // carrying angle brackets above all: `translate` reads `<...>` as link\n // markup, so a heading naming a MessageVariable — `<$app>` — resolves to\n // nothing at all rather than to itself.\n readonly noTranslate = input<boolean>(false);\n // A message's [MessageVariable] values, the same record `m-text-output`\n // takes: a heading naming `<$count>` is a sentence with a datum in it, and\n // splicing that datum into the key instead would be parsed as a query\n // string (m-one-ui ADR 0066).\n readonly params = input<Record<string, string> | undefined>(undefined);\n readonly actionClick = output<void>();\n\n private readonly translateService = inject(TranslateService);\n private readonly sizeContext = inject(SIZE_CONTEXT, { optional: true });\n\n // The action Button sits inside the heading, whose font-size is the level's\n // own — 2.25rem at h1 — so `em` inheritance would scale the Button to the\n // heading rather than to the Section it belongs to. It reads the Size in\n // force instead, the way Icon does, and lands at the same size as every\n // other Button on that Section (ADR 0008).\n protected readonly actionSize = computed(() =>\n resolveSize(this.sizeContext?.size())\n );\n\n protected readonly actionConfig = computed<Button | undefined>(() => {\n const icon = this.actionButton();\n if (!icon) return undefined;\n return {\n icon,\n label: this.actionLabel(),\n iconOnly: true,\n variant: 'ghost',\n };\n });\n\n // A computed rather than the impure TranslatePipe repeated six times: one\n // lookup per label change instead of one per change-detection tick, and it\n // still repaints when the language or an in-memory translation moves.\n // A translation renders MiniMark's inline rules, so `Uninstall **<$app>**`\n // bolds the App's name the way `m-text-output` would. Authored text stays\n // literal: it names identifiers, and `__init__` must not turn bold.\n protected readonly html = computed(() =>\n this.noTranslate()\n ? escapeHtml(this.label() ?? '')\n : miniMarkInlineToHtml(\n this.translateService.translate(this.label(), this.params())\n )\n );\n}\n"],"mappings":"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"}
|
package/fesm2022/{magmonium-one-image-editor-FomMDHZl.mjs → magmonium-one-image-editor-BYNN15tt.mjs}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as ButtonComponent } from "./magmonium-one-button-
|
|
1
|
+
import { t as ButtonComponent } from "./magmonium-one-button-CKHBcCoO.mjs";
|
|
2
2
|
import { t as InputType } from "./magmonium-one-input-DqHPorA1.mjs";
|
|
3
|
-
import { t as HeaderComponent } from "./magmonium-one-header-
|
|
4
|
-
import { t as RangeInputComponent } from "./magmonium-one-range-
|
|
3
|
+
import { t as HeaderComponent } from "./magmonium-one-header-CkW_6y7m.mjs";
|
|
4
|
+
import { t as RangeInputComponent } from "./magmonium-one-range-M_HBccdt.mjs";
|
|
5
5
|
import { a as initialFraming, c as parseRatio, i as encodeFramed, l as renameForType, n as cropRect, r as drawFramed, s as outputSize, t as clampFraming } from "./magmonium-one-image-frame-BTSaUSAi.mjs";
|
|
6
6
|
import { MODAL_REF } from "./magmonium-one.mjs";
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
@@ -435,4 +435,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
435
435
|
});
|
|
436
436
|
export { ImageEditorComponent };
|
|
437
437
|
|
|
438
|
-
//# sourceMappingURL=magmonium-one-image-editor-
|
|
438
|
+
//# sourceMappingURL=magmonium-one-image-editor-BYNN15tt.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magmonium-one-image-editor-FomMDHZl.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/file-upload-input/image-editor.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ButtonComponent } from '../../../button/ui/button';\nimport { HeaderComponent } from '../../../header';\nimport { RangeInputComponent } from '../range/range';\nimport { InputType, RangeInput } from '../../model/input';\nimport { MODAL_REF, ModalRef } from '../../../../config/modal-ref';\nimport {\n clampFraming,\n cropRect,\n drawFramed,\n encodeFramed,\n Framing,\n FrameSize,\n initialFraming,\n MAX_ZOOM,\n MIN_ZOOM,\n outputSize,\n parseRatio,\n renameForType,\n} from './image-frame';\n\n/**\n * What an ImageEditor closes with. The framed file on an apply, `unreadable`\n * when the picture never decoded, and neither for a dismissal — a flat object\n * rather than a union, so the web-component build (no `strict`) reads it too.\n */\nexport type ImageEditorResult = { file?: File; unreadable?: boolean };\n\ntype Point = { x: number; y: number };\n\nconst WHEEL_ZOOM_RATE = 0.0015;\n\nconst distance = (a: Point, b: Point): number =>\n Math.hypot(a.x - b.x, a.y - b.y);\n\n@Component({\n selector: 'm-image-editor',\n template: `\n <div class=\"image-editor\">\n <m-header\n [level]=\"3\"\n label=\"edit-image-size\"\n [params]=\"sizeParams()\"\n />\n <div\n #stage\n class=\"image-editor__stage\"\n [style.aspect-ratio]=\"aspect()\"\n [style.--m-image-editor-aspect]=\"aspect()\"\n [class.image-editor__stage--panning]=\"isPanning()\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n (wheel)=\"onWheel($event)\"\n >\n @if (sourceUrl(); as url) {\n <img\n class=\"image-editor__image\"\n [src]=\"url\"\n alt=\"\"\n draggable=\"false\"\n [style.width.px]=\"imageBox().width\"\n [style.height.px]=\"imageBox().height\"\n [style.transform]=\"imageBox().transform\"\n />\n }\n </div>\n <m-range\n [config]=\"zoomConfig()\"\n [value]=\"zoomPercent()\"\n (valueChange)=\"onZoom($event)\"\n />\n <!-- asset: buttons/okay.yml. No cancel beside it: the Modal's own close\n is the cancel, and it drops the image the same way. -->\n <m-one-button\n name=\"okay\"\n label=\"apply\"\n [disabled]=\"!source() || isApplying()\"\n (clicked)=\"apply()\"\n />\n </div>\n `,\n imports: [ButtonComponent, HeaderComponent, RangeInputComponent],\n styleUrl: './image-editor.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ImageEditorComponent {\n readonly file = input.required<File>();\n readonly ratio = input.required<string>();\n readonly width = input.required<number>();\n\n readonly #modalRef = inject<ModalRef<ImageEditorResult | undefined>>(MODAL_REF);\n private readonly stage = viewChild<ElementRef<HTMLDivElement>>('stage');\n\n protected readonly source = signal<ImageBitmap | undefined>(undefined);\n protected readonly sourceUrl = signal<string | undefined>(undefined);\n protected readonly isApplying = signal(false);\n private readonly framing = signal<Framing>({ cx: 0, cy: 0, zoom: MIN_ZOOM });\n private readonly stageWidth = signal(0);\n private readonly pointers = new Map<number, Point>();\n protected readonly isPanning = signal(false);\n #settled = false;\n\n protected readonly zoomConfig = computed<RangeInput>(() => ({\n name: 'zoom',\n label: 'zoom',\n type: InputType.RANGE,\n min: MIN_ZOOM * 100,\n max: MAX_ZOOM * 100,\n }));\n\n protected readonly aspect = computed(() => parseRatio(this.ratio()) ?? 1);\n\n private readonly output = computed<FrameSize | undefined>(() =>\n outputSize(this.ratio(), this.width())\n );\n\n protected readonly sizeParams = computed(() => {\n const size = this.output();\n return {\n width: String(size?.width ?? ''),\n height: String(size?.height ?? ''),\n };\n });\n\n private readonly imageSize = computed<FrameSize | undefined>(() => {\n const bitmap = this.source();\n return bitmap ? { width: bitmap.width, height: bitmap.height } : undefined;\n });\n\n protected readonly zoomPercent = computed(() =>\n String(Math.round(this.framing().zoom * 100))\n );\n\n /** The whole picture laid out so the box shows exactly the crop. */\n protected readonly imageBox = computed(() => {\n const image = this.imageSize();\n const stage = this.stageWidth();\n if (!image || !stage) return { width: 0, height: 0, transform: 'none' };\n const rect = cropRect(image, this.aspect(), this.framing());\n const scale = stage / rect.width;\n return {\n width: image.width * scale,\n height: image.height * scale,\n transform: `translate(${-rect.x * scale}px, ${-rect.y * scale}px)`,\n };\n });\n\n private readonly load = effect((onCleanup) => {\n const file = this.file();\n let cancelled = false;\n const url = URL.createObjectURL(file);\n this.sourceUrl.set(url);\n // EXIF orientation applied here, so the geometry below and the <img> the\n // stage draws agree on which way is up.\n createImageBitmap(file, { imageOrientation: 'from-image' })\n .then((bitmap) => {\n if (cancelled) {\n bitmap.close();\n return;\n }\n this.framing.set(\n initialFraming({ width: bitmap.width, height: bitmap.height })\n );\n this.source.set(bitmap);\n })\n .catch(() => {\n if (!cancelled) this.settle({ unreadable: true });\n });\n onCleanup(() => {\n cancelled = true;\n URL.revokeObjectURL(url);\n this.source()?.close();\n });\n });\n\n private readonly measure = effect((onCleanup) => {\n const stage = this.stage()?.nativeElement;\n if (!stage) return;\n this.stageWidth.set(stage.clientWidth);\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(([entry]) =>\n this.stageWidth.set(entry.contentRect.width)\n );\n observer.observe(stage);\n onCleanup(() => observer.disconnect());\n });\n\n // The Modal's own close affordance destroys the body without a word, and a\n // dismissal is a cancel: whoever opened the editor is still waiting.\n private readonly reportDismissal = inject(DestroyRef).onDestroy(() =>\n this.settle(undefined)\n );\n\n protected onPointerDown = (event: PointerEvent): void => {\n if (!this.source()) return;\n (event.currentTarget as HTMLElement).setPointerCapture?.(event.pointerId);\n this.pointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n this.isPanning.set(true);\n };\n\n protected onPointerMove = (event: PointerEvent): void => {\n const previous = this.pointers.get(event.pointerId);\n if (!previous) return;\n const next = { x: event.clientX, y: event.clientY };\n const others = [...this.pointers.entries()].filter(\n ([id]) => id !== event.pointerId\n );\n if (others.length === 1) {\n // Pinch: the gap between two fingers is the zoom.\n const anchor = others[0][1];\n const before = distance(previous, anchor);\n if (before > 0) this.zoomBy(distance(next, anchor) / before);\n } else if (others.length === 0) {\n this.panBy(next.x - previous.x, next.y - previous.y);\n }\n this.pointers.set(event.pointerId, next);\n };\n\n protected onPointerUp = (event: PointerEvent): void => {\n this.pointers.delete(event.pointerId);\n this.isPanning.set(this.pointers.size > 0);\n };\n\n protected onWheel = (event: WheelEvent): void => {\n if (!this.source()) return;\n event.preventDefault();\n this.zoomBy(Math.exp(-event.deltaY * WHEEL_ZOOM_RATE));\n };\n\n protected onZoom = (percent: string): void => {\n const zoom = Number(percent) / 100;\n if (!Number.isFinite(zoom)) return;\n this.updateFraming((framing) => ({ ...framing, zoom }));\n };\n\n protected apply = async (): Promise<void> => {\n const bitmap = this.source();\n const image = this.imageSize();\n const output = this.output();\n if (!bitmap || !image || !output || this.isApplying()) return;\n this.isApplying.set(true);\n try {\n const rect = cropRect(image, this.aspect(), this.framing());\n const blob = await encodeFramed(drawFramed(bitmap, rect, output));\n const original = this.file();\n this.settle({\n file: new File([blob], renameForType(original.name, blob.type), {\n type: blob.type,\n lastModified: Date.now(),\n }),\n });\n } catch {\n this.settle({ unreadable: true });\n }\n };\n\n /** Screen pixels dragged, moved into source pixels at the current scale. */\n private panBy = (dx: number, dy: number): void => {\n const image = this.imageSize();\n const stage = this.stageWidth();\n if (!image || !stage) return;\n const rect = cropRect(image, this.aspect(), this.framing());\n const perPixel = rect.width / stage;\n this.updateFraming((framing) => ({\n ...framing,\n cx: framing.cx - dx * perPixel,\n cy: framing.cy - dy * perPixel,\n }));\n };\n\n private zoomBy = (factor: number): void => {\n this.updateFraming((framing) => ({\n ...framing,\n zoom: framing.zoom * factor,\n }));\n };\n\n private updateFraming = (change: (framing: Framing) => Framing): void => {\n const image = this.imageSize();\n if (!image) return;\n this.framing.update((framing) =>\n clampFraming(image, this.aspect(), change(framing))\n );\n };\n\n private settle = (result: ImageEditorResult | undefined): void => {\n if (this.#settled) return;\n this.#settled = true;\n this.#modalRef.close(result);\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"magmonium-one-image-editor-BYNN15tt.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/ui/input/ui/file-upload-input/image-editor.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ButtonComponent } from '../../../button/ui/button';\nimport { HeaderComponent } from '../../../header';\nimport { RangeInputComponent } from '../range/range';\nimport { InputType, RangeInput } from '../../model/input';\nimport { MODAL_REF, ModalRef } from '../../../../config/modal-ref';\nimport {\n clampFraming,\n cropRect,\n drawFramed,\n encodeFramed,\n Framing,\n FrameSize,\n initialFraming,\n MAX_ZOOM,\n MIN_ZOOM,\n outputSize,\n parseRatio,\n renameForType,\n} from './image-frame';\n\n/**\n * What an ImageEditor closes with. The framed file on an apply, `unreadable`\n * when the picture never decoded, and neither for a dismissal — a flat object\n * rather than a union, so the web-component build (no `strict`) reads it too.\n */\nexport type ImageEditorResult = { file?: File; unreadable?: boolean };\n\ntype Point = { x: number; y: number };\n\nconst WHEEL_ZOOM_RATE = 0.0015;\n\nconst distance = (a: Point, b: Point): number =>\n Math.hypot(a.x - b.x, a.y - b.y);\n\n@Component({\n selector: 'm-image-editor',\n template: `\n <div class=\"image-editor\">\n <m-header\n [level]=\"3\"\n label=\"edit-image-size\"\n [params]=\"sizeParams()\"\n />\n <div\n #stage\n class=\"image-editor__stage\"\n [style.aspect-ratio]=\"aspect()\"\n [style.--m-image-editor-aspect]=\"aspect()\"\n [class.image-editor__stage--panning]=\"isPanning()\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n (wheel)=\"onWheel($event)\"\n >\n @if (sourceUrl(); as url) {\n <img\n class=\"image-editor__image\"\n [src]=\"url\"\n alt=\"\"\n draggable=\"false\"\n [style.width.px]=\"imageBox().width\"\n [style.height.px]=\"imageBox().height\"\n [style.transform]=\"imageBox().transform\"\n />\n }\n </div>\n <m-range\n [config]=\"zoomConfig()\"\n [value]=\"zoomPercent()\"\n (valueChange)=\"onZoom($event)\"\n />\n <!-- asset: buttons/okay.yml. No cancel beside it: the Modal's own close\n is the cancel, and it drops the image the same way. -->\n <m-one-button\n name=\"okay\"\n label=\"apply\"\n [disabled]=\"!source() || isApplying()\"\n (clicked)=\"apply()\"\n />\n </div>\n `,\n imports: [ButtonComponent, HeaderComponent, RangeInputComponent],\n styleUrl: './image-editor.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ImageEditorComponent {\n readonly file = input.required<File>();\n readonly ratio = input.required<string>();\n readonly width = input.required<number>();\n\n readonly #modalRef = inject<ModalRef<ImageEditorResult | undefined>>(MODAL_REF);\n private readonly stage = viewChild<ElementRef<HTMLDivElement>>('stage');\n\n protected readonly source = signal<ImageBitmap | undefined>(undefined);\n protected readonly sourceUrl = signal<string | undefined>(undefined);\n protected readonly isApplying = signal(false);\n private readonly framing = signal<Framing>({ cx: 0, cy: 0, zoom: MIN_ZOOM });\n private readonly stageWidth = signal(0);\n private readonly pointers = new Map<number, Point>();\n protected readonly isPanning = signal(false);\n #settled = false;\n\n protected readonly zoomConfig = computed<RangeInput>(() => ({\n name: 'zoom',\n label: 'zoom',\n type: InputType.RANGE,\n min: MIN_ZOOM * 100,\n max: MAX_ZOOM * 100,\n }));\n\n protected readonly aspect = computed(() => parseRatio(this.ratio()) ?? 1);\n\n private readonly output = computed<FrameSize | undefined>(() =>\n outputSize(this.ratio(), this.width())\n );\n\n protected readonly sizeParams = computed(() => {\n const size = this.output();\n return {\n width: String(size?.width ?? ''),\n height: String(size?.height ?? ''),\n };\n });\n\n private readonly imageSize = computed<FrameSize | undefined>(() => {\n const bitmap = this.source();\n return bitmap ? { width: bitmap.width, height: bitmap.height } : undefined;\n });\n\n protected readonly zoomPercent = computed(() =>\n String(Math.round(this.framing().zoom * 100))\n );\n\n /** The whole picture laid out so the box shows exactly the crop. */\n protected readonly imageBox = computed(() => {\n const image = this.imageSize();\n const stage = this.stageWidth();\n if (!image || !stage) return { width: 0, height: 0, transform: 'none' };\n const rect = cropRect(image, this.aspect(), this.framing());\n const scale = stage / rect.width;\n return {\n width: image.width * scale,\n height: image.height * scale,\n transform: `translate(${-rect.x * scale}px, ${-rect.y * scale}px)`,\n };\n });\n\n private readonly load = effect((onCleanup) => {\n const file = this.file();\n let cancelled = false;\n const url = URL.createObjectURL(file);\n this.sourceUrl.set(url);\n // EXIF orientation applied here, so the geometry below and the <img> the\n // stage draws agree on which way is up.\n createImageBitmap(file, { imageOrientation: 'from-image' })\n .then((bitmap) => {\n if (cancelled) {\n bitmap.close();\n return;\n }\n this.framing.set(\n initialFraming({ width: bitmap.width, height: bitmap.height })\n );\n this.source.set(bitmap);\n })\n .catch(() => {\n if (!cancelled) this.settle({ unreadable: true });\n });\n onCleanup(() => {\n cancelled = true;\n URL.revokeObjectURL(url);\n this.source()?.close();\n });\n });\n\n private readonly measure = effect((onCleanup) => {\n const stage = this.stage()?.nativeElement;\n if (!stage) return;\n this.stageWidth.set(stage.clientWidth);\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(([entry]) =>\n this.stageWidth.set(entry.contentRect.width)\n );\n observer.observe(stage);\n onCleanup(() => observer.disconnect());\n });\n\n // The Modal's own close affordance destroys the body without a word, and a\n // dismissal is a cancel: whoever opened the editor is still waiting.\n private readonly reportDismissal = inject(DestroyRef).onDestroy(() =>\n this.settle(undefined)\n );\n\n protected onPointerDown = (event: PointerEvent): void => {\n if (!this.source()) return;\n (event.currentTarget as HTMLElement).setPointerCapture?.(event.pointerId);\n this.pointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n this.isPanning.set(true);\n };\n\n protected onPointerMove = (event: PointerEvent): void => {\n const previous = this.pointers.get(event.pointerId);\n if (!previous) return;\n const next = { x: event.clientX, y: event.clientY };\n const others = [...this.pointers.entries()].filter(\n ([id]) => id !== event.pointerId\n );\n if (others.length === 1) {\n // Pinch: the gap between two fingers is the zoom.\n const anchor = others[0][1];\n const before = distance(previous, anchor);\n if (before > 0) this.zoomBy(distance(next, anchor) / before);\n } else if (others.length === 0) {\n this.panBy(next.x - previous.x, next.y - previous.y);\n }\n this.pointers.set(event.pointerId, next);\n };\n\n protected onPointerUp = (event: PointerEvent): void => {\n this.pointers.delete(event.pointerId);\n this.isPanning.set(this.pointers.size > 0);\n };\n\n protected onWheel = (event: WheelEvent): void => {\n if (!this.source()) return;\n event.preventDefault();\n this.zoomBy(Math.exp(-event.deltaY * WHEEL_ZOOM_RATE));\n };\n\n protected onZoom = (percent: string): void => {\n const zoom = Number(percent) / 100;\n if (!Number.isFinite(zoom)) return;\n this.updateFraming((framing) => ({ ...framing, zoom }));\n };\n\n protected apply = async (): Promise<void> => {\n const bitmap = this.source();\n const image = this.imageSize();\n const output = this.output();\n if (!bitmap || !image || !output || this.isApplying()) return;\n this.isApplying.set(true);\n try {\n const rect = cropRect(image, this.aspect(), this.framing());\n const blob = await encodeFramed(drawFramed(bitmap, rect, output));\n const original = this.file();\n this.settle({\n file: new File([blob], renameForType(original.name, blob.type), {\n type: blob.type,\n lastModified: Date.now(),\n }),\n });\n } catch {\n this.settle({ unreadable: true });\n }\n };\n\n /** Screen pixels dragged, moved into source pixels at the current scale. */\n private panBy = (dx: number, dy: number): void => {\n const image = this.imageSize();\n const stage = this.stageWidth();\n if (!image || !stage) return;\n const rect = cropRect(image, this.aspect(), this.framing());\n const perPixel = rect.width / stage;\n this.updateFraming((framing) => ({\n ...framing,\n cx: framing.cx - dx * perPixel,\n cy: framing.cy - dy * perPixel,\n }));\n };\n\n private zoomBy = (factor: number): void => {\n this.updateFraming((framing) => ({\n ...framing,\n zoom: framing.zoom * factor,\n }));\n };\n\n private updateFraming = (change: (framing: Framing) => Framing): void => {\n const image = this.imageSize();\n if (!image) return;\n this.framing.update((framing) =>\n clampFraming(image, this.aspect(), change(framing))\n );\n };\n\n private settle = (result: ImageEditorResult | undefined): void => {\n if (this.#settled) return;\n this.#settled = true;\n this.#modalRef.close(result);\n };\n}\n"],"mappings":"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"}
|
|
@@ -225,6 +225,38 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
225
225
|
args: [{ name: "percentage" }]
|
|
226
226
|
}]
|
|
227
227
|
});
|
|
228
|
+
var SignColorPipe = class SignColorPipe {
|
|
229
|
+
transform(value, positive = "success", negative = "error") {
|
|
230
|
+
if (value == null || isNaN(value) || value === 0) return void 0;
|
|
231
|
+
return value > 0 ? positive : negative;
|
|
232
|
+
}
|
|
233
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
234
|
+
minVersion: "12.0.0",
|
|
235
|
+
version: "22.2.1",
|
|
236
|
+
ngImport: i0,
|
|
237
|
+
type: SignColorPipe,
|
|
238
|
+
deps: [],
|
|
239
|
+
target: i0.ɵɵFactoryTarget.Pipe
|
|
240
|
+
});
|
|
241
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({
|
|
242
|
+
minVersion: "14.0.0",
|
|
243
|
+
version: "22.2.1",
|
|
244
|
+
ngImport: i0,
|
|
245
|
+
type: SignColorPipe,
|
|
246
|
+
isStandalone: true,
|
|
247
|
+
name: "signColor"
|
|
248
|
+
});
|
|
249
|
+
};
|
|
250
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
251
|
+
minVersion: "12.0.0",
|
|
252
|
+
version: "22.2.1",
|
|
253
|
+
ngImport: i0,
|
|
254
|
+
type: SignColorPipe,
|
|
255
|
+
decorators: [{
|
|
256
|
+
type: Pipe,
|
|
257
|
+
args: [{ name: "signColor" }]
|
|
258
|
+
}]
|
|
259
|
+
});
|
|
228
260
|
var CompactNumberPipe = class CompactNumberPipe {
|
|
229
261
|
translateService = inject(TranslateService);
|
|
230
262
|
transform(value, system = "IN", forceSign = false) {
|
|
@@ -579,6 +611,6 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
579
611
|
}]
|
|
580
612
|
}
|
|
581
613
|
});
|
|
582
|
-
export { sectionTableColumnId as a, sortSectionTableRows as c,
|
|
614
|
+
export { sectionTableColumnId as a, sortSectionTableRows as c, SignColorPipe as d, PercentagePipe as f, nextSectionTableSort as i, AssetUrlPipe as l, TimeAgoPipe as m, SectionTableSortPipe as n, sectionTableColumnWidths as o, MoneyPipe as p, defaultSectionTableSort as r, sectionTableFrozenCount as s, LabelComponent as t, CompactNumberPipe as u };
|
|
583
615
|
|
|
584
|
-
//# sourceMappingURL=magmonium-one-label-
|
|
616
|
+
//# sourceMappingURL=magmonium-one-label-23DjRQdd.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magmonium-one-label-23DjRQdd.mjs","names":[],"sources":["../../../../libs/one/src/lib/shared/pipe/time-ago.ts","../../../../libs/one/src/lib/shared/pipe/money.fn.ts","../../../../libs/one/src/lib/shared/pipe/money.ts","../../../../libs/one/src/lib/shared/pipe/percentage.ts","../../../../libs/one/src/lib/shared/pipe/sign-color.ts","../../../../libs/one/src/lib/shared/pipe/compact-number.ts","../../../../libs/one/src/lib/shared/pipe/asset-url.ts","../../../../libs/one/src/lib/shared/ui/section/lib/functions/section-table.ts","../../../../libs/one/src/lib/shared/pipe/section-table-sort.ts","../../../../libs/one/src/lib/shared/ui/input/ui/label.ts"],"sourcesContent":["import { ChangeDetectorRef, inject, OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate';\nimport { interval, Subscription } from 'rxjs';\n\nconst SECONDS_IN_MINUTE = 60;\nconst SECONDS_IN_HOUR = 3600;\nconst SECONDS_IN_DAY = 86400;\nconst SECONDS_IN_MONTH = 2592000;\nconst SECONDS_IN_YEAR = 31536000;\n\n@Pipe({\n name: 'timeAgo',\n pure: false,\n})\nexport class TimeAgoPipe implements PipeTransform, OnDestroy {\n private readonly translateService = inject(TranslateService);\n private readonly cdr = inject(ChangeDetectorRef);\n private timerSubscription: Subscription | null = null;\n private lastValue: string | Date | undefined = undefined;\n\n transform(value: string | Date | undefined): string {\n if (!value) return '';\n\n if (value !== this.lastValue) {\n this.lastValue = value;\n this.setupTimer();\n }\n\n const date = typeof value === 'string' ? new Date(value) : value;\n const now = new Date();\n const seconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n if (seconds < SECONDS_IN_MINUTE) {\n return this.translateService.translate('just-now');\n }\n\n let count: number;\n let unit: string;\n\n if (seconds < SECONDS_IN_HOUR) {\n count = Math.floor(seconds / SECONDS_IN_MINUTE);\n unit = count === 1 ? 'minute' : 'minutes';\n } else if (seconds < SECONDS_IN_DAY) {\n count = Math.floor(seconds / SECONDS_IN_HOUR);\n unit = count === 1 ? 'hour' : 'hours';\n } else if (seconds < SECONDS_IN_MONTH) {\n count = Math.floor(seconds / SECONDS_IN_DAY);\n unit = count === 1 ? 'day' : 'days';\n } else if (seconds < SECONDS_IN_YEAR) {\n count = Math.floor(seconds / SECONDS_IN_MONTH);\n unit = count === 1 ? 'month' : 'months';\n } else {\n count = Math.floor(seconds / SECONDS_IN_YEAR);\n unit = count === 1 ? 'year' : 'years';\n }\n\n return this.translateService.translate(\n `time-ago?count=${count}&unit=${unit}`\n );\n }\n\n private setupTimer(): void {\n this.clearTimer();\n // Update every 30 seconds to keep the display fresh without overloading change detection.\n this.timerSubscription = interval(30000).subscribe(() => {\n this.cdr.detectChanges();\n });\n }\n\n private clearTimer(): void {\n if (this.timerSubscription) {\n this.timerSubscription.unsubscribe();\n this.timerSubscription = null;\n }\n }\n\n ngOnDestroy(): void {\n this.clearTimer();\n }\n}\n","export type MoneySystem = 'IN' | 'INTL';\n\nexport interface MoneyResult {\n amount: string;\n labelKey: string;\n}\n\ninterface Threshold {\n min: number;\n labelKey: string;\n overflowAt: number;\n}\n\nconst IN_THRESHOLDS: Threshold[] = [\n { min: 1_00_00_000, labelKey: 'cr', overflowAt: Infinity },\n { min: 1_00_000, labelKey: 'l', overflowAt: 100 },\n { min: 1_000, labelKey: 'k', overflowAt: 100 },\n];\n\nconst INTL_THRESHOLDS: Threshold[] = [\n { min: 1_000_000_000_000, labelKey: 't', overflowAt: Infinity },\n { min: 1_000_000_000, labelKey: 'b', overflowAt: 1_000 },\n { min: 1_000_000, labelKey: 'm', overflowAt: 1_000 },\n { min: 1_000, labelKey: 'k', overflowAt: 1_000 },\n];\n\n/**\n * Formats a non-negative finite number into a compact denomination result.\n * @param value Must be a non-negative finite number. Negative values and NaN\n * should be handled by the caller before invoking this function.\n */\nexport const formatMoney = (\n value: number,\n system: MoneySystem\n): MoneyResult => {\n const thresholds = system === 'IN' ? IN_THRESHOLDS : INTL_THRESHOLDS;\n\n for (let i = 0; i < thresholds.length; i++) {\n const { min, labelKey, overflowAt } = thresholds[i];\n if (value >= min) {\n const rounded = parseFloat((value / min).toFixed(1));\n if (rounded >= overflowAt && i > 0) {\n const higher = thresholds[i - 1];\n return {\n amount: parseFloat((value / higher.min).toFixed(1)).toString(),\n labelKey: higher.labelKey,\n };\n }\n return { amount: rounded.toString(), labelKey };\n }\n }\n\n return { amount: parseFloat(value.toFixed(2)).toString(), labelKey: '' };\n};\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate';\nimport { formatMoney, MoneySystem } from './money.fn';\n\n@Pipe({\n name: 'money',\n pure: false,\n})\nexport class MoneyPipe implements PipeTransform {\n private readonly translateService = inject(TranslateService);\n\n transform(\n value: number | undefined | null,\n system: MoneySystem = 'IN',\n symbol = '₹',\n forceSign = false\n ): string {\n if (value == null || isNaN(value)) return '';\n if (value === 0) return `${symbol}0`;\n\n const isNegative = value < 0;\n const absValue = Math.abs(value);\n const { amount, labelKey } = formatMoney(absValue, system);\n const label = labelKey\n ? ` ${this.translateService.translate(labelKey)}`\n : '';\n\n const sign = isNegative ? '-' : forceSign ? '+' : '';\n return `${sign}${symbol}${amount}${label}`;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Renders a number already expressed in percent units as a `%` reading —\n * `42` becomes `42.00%`, never `4200%`. A ratio is the caller's to multiply,\n * the way `MoneyPipe` takes an amount rather than a currency object.\n *\n * Two decimals by default: a percentage carries the fraction that separates\n * two near-equal readings, and a caller wanting the whole number asks for\n * `decimals: 0`.\n *\n * Pure, unlike the other three: it reads no language and no clock, so its\n * output depends on its arguments alone.\n */\n@Pipe({\n name: 'percentage',\n})\nexport class PercentagePipe implements PipeTransform {\n transform(\n value: number | undefined | null,\n decimals = 2,\n forceSign = false\n ): string {\n if (value == null || isNaN(value)) return '';\n\n const digits = Math.max(0, Math.trunc(decimals));\n const rendered = Math.abs(value).toFixed(digits);\n // A rounded-to-zero negative would otherwise print `-0%`.\n const isNegative = value < 0 && Number(rendered) !== 0;\n\n const sign = isNegative\n ? '-'\n : forceSign && Number(rendered) !== 0\n ? '+'\n : '';\n return `${sign}${rendered}%`;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Reads a number's sign as a colour — `success` above zero, `error` below — for\n * the `color` input `m-text-output` resolves against the active theme, so a\n * gain and a loss follow the theme rather than freezing one theme's hex.\n *\n * Zero, `null`, `undefined` and `NaN` answer `undefined`: no colour is the\n * component's own default, and a flat reading is neither a gain nor a loss.\n *\n * Pure, like `PercentagePipe`: its output depends on its arguments alone.\n */\n@Pipe({\n name: 'signColor',\n})\nexport class SignColorPipe implements PipeTransform {\n transform(\n value: number | undefined | null,\n positive = 'success',\n negative = 'error'\n ): string | undefined {\n if (value == null || isNaN(value) || value === 0) return undefined;\n return value > 0 ? positive : negative;\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate';\nimport { formatMoney, MoneySystem } from './money.fn';\n\n/**\n * Renders a large number as a compact denominated reading — `12500` becomes\n * `12.5 k`, `1250000` becomes `12.5 l` (or `1.3 m` on the `INTL` ladder).\n * `MoneyPipe` without the currency symbol: a count of views, rows or users is\n * no amount of money, but it climbs the same thresholds.\n *\n * Named `compactNumber` rather than `number` so it never collides with\n * Angular's own `DecimalPipe` in a template that imports both.\n *\n * Impure for `MoneyPipe`'s reason: the denomination label is a translation key\n * resolved in the active language.\n */\n@Pipe({\n name: 'compactNumber',\n pure: false,\n})\nexport class CompactNumberPipe implements PipeTransform {\n private readonly translateService = inject(TranslateService);\n\n transform(\n value: number | undefined | null,\n system: MoneySystem = 'IN',\n forceSign = false\n ): string {\n if (value == null || isNaN(value)) return '';\n if (value === 0) return '0';\n\n const { amount, labelKey } = formatMoney(Math.abs(value), system);\n // Below the first threshold a tiny value can still round to `0`.\n if (Number(amount) === 0) return '0';\n\n const label = labelKey\n ? ` ${this.translateService.translate(labelKey)}`\n : '';\n const sign = value < 0 ? '-' : forceSign ? '+' : '';\n return `${sign}${amount}${label}`;\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { HttpService } from '../services/http';\n\n@Pipe({\n name: 'assetUrl',\n})\nexport class AssetUrlPipe implements PipeTransform {\n private readonly http = inject(HttpService);\n\n transform(value: string | null | undefined): string {\n return this.http.getAssetUrl(value);\n }\n}\n","import {\n SectionTableColumn,\n SectionTableSort,\n} from '../../type/section-table';\n\n/** A column's id, falling back to its position (m-one-ui ADR 0148). */\nexport const sectionTableColumnId = (\n column: SectionTableColumn,\n index: number\n): string => column.id || String(index);\n\n/**\n * Each column's width as a CSS length: a `span` is its twelfth-share of the\n * table, and a column without one gets `undefined` so the `<table>` divides\n * what the spanned columns left.\n */\nexport const sectionTableColumnWidths = (\n columns: readonly SectionTableColumn[]\n): (string | undefined)[] =>\n columns.map(({ span }) => {\n if (span == null || !Number.isFinite(span)) return undefined;\n const clamped = Math.min(12, Math.max(1, Math.round(span)));\n return `${(clamped * 100) / 12}%`;\n });\n\n/**\n * How many leading columns are frozen: freezing a column freezes every column\n * before it, because a frozen column pinned past an unfrozen one would slide\n * over it.\n */\nexport const sectionTableFrozenCount = (\n columns: readonly SectionTableColumn[]\n): number => {\n let last = -1;\n columns.forEach((column, i) => {\n if (column.freeze) last = i;\n });\n return last + 1;\n};\n\n/** The next sort after a click on the column with `id`. */\nexport const nextSectionTableSort = (\n current: SectionTableSort | null,\n id: string,\n dataType: SectionTableSort['dataType']\n): SectionTableSort =>\n current?.id === id\n ? { id, dataType, direction: current.direction === 'asc' ? 'desc' : 'asc' }\n : { id, dataType, direction: 'asc' };\n\n/** The sort a table starts with: its first `defaultSort` column's, if any. */\nexport const defaultSectionTableSort = (\n columns: readonly SectionTableColumn[]\n): SectionTableSort | null => {\n const index = columns.findIndex((column) => column.defaultSort);\n if (index < 0) return null;\n const column = columns[index];\n return {\n id: sectionTableColumnId(column, index),\n dataType: column.dataType,\n direction: column.ascending ? 'asc' : 'desc',\n };\n};\n\nconst readPath =(row: unknown, path: string): unknown =>\n path\n .split('.')\n .reduce<unknown>(\n (value, key) =>\n value != null && typeof value === 'object'\n ? (value as Record<string, unknown>)[key]\n : undefined,\n row\n );\n\nconst comparable = (\n value: unknown,\n dataType: SectionTableSort['dataType']\n): number | string | undefined => {\n if (value == null || value === '') return undefined;\n if (dataType === 'number') {\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isNaN(n) ? undefined : n;\n }\n if (dataType === 'date') {\n const t =\n value instanceof Date ? value.getTime() : new Date(String(value)).getTime();\n return Number.isNaN(t) ? undefined : t;\n }\n return String(value).toLocaleLowerCase();\n};\n\n/**\n * A copy of `rows` ordered by `sort`, the input untouched. Missing values sink\n * to the end in either direction — an empty cell is not the smallest value.\n */\nexport const sortSectionTableRows = <T>(\n rows: readonly T[] | null | undefined,\n sort: SectionTableSort | null | undefined\n): T[] => {\n const list = [...(rows ?? [])];\n if (!sort) return list;\n const sign = sort.direction === 'asc' ? 1 : -1;\n return list\n .map((row, i) => ({ row, i, key: comparable(readPath(row, sort.id), sort.dataType) }))\n .sort((a, b) => {\n if (a.key === undefined || b.key === undefined) {\n if (a.key === b.key) return a.i - b.i;\n return a.key === undefined ? 1 : -1;\n }\n const diff =\n typeof a.key === 'number' && typeof b.key === 'number'\n ? a.key - b.key\n : String(a.key).localeCompare(String(b.key));\n return diff === 0 ? a.i - b.i : diff * sign;\n })\n .map(({ row }) => row);\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport type { SectionTableSort } from '../ui/section/type/section-table';\nimport { sortSectionTableRows } from '../ui/section/lib/functions/section-table';\n\n/**\n * A SectionTable's sort applied to a Repeat's collection:\n * `@for (row of (rows | sectionTableSort: table.sort()); …)`. The `@for` is the\n * Repeat's, not the table's, so the table reorders a collection it does not\n * own through this and nothing else (m-one-ui ADR 0148).\n *\n * Pure: a new order needs a new sort or a new collection, never a mutated one.\n */\n@Pipe({\n name: 'sectionTableSort',\n})\nexport class SectionTableSortPipe implements PipeTransform {\n transform<T>(\n rows: readonly T[] | null | undefined,\n sort: SectionTableSort | null | undefined\n ): T[] {\n return sortSectionTableRows(rows, sort);\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { TranslatePipe } from '../../../pipe';\n\n@Component({\n selector: 'm-label',\n template: `\n <label\n [class.required]=\"required()\"\n [class.disabled]=\"disabled()\"\n [attr.for]=\"for() || null\"\n >\n @if (color()) {\n <span class=\"label__swatch\" [style.background]=\"color()\"></span>\n }\n @if (noTranslate()) {\n {{ placeholder() }}\n } @else {\n {{ placeholder() | translate: params() }}\n }\n </label>\n `,\n imports: [TranslatePipe],\n styleUrl: './label.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LabelComponent {\n for = input<string>();\n placeholder = input<string>();\n // The label's [MessageVariable] values — a Field whose label is a sentence\n // with a datum in it (m-one-ui ADR 0066).\n params = input<Record<string, string> | undefined>();\n required = input<boolean>();\n disabled = input<boolean>();\n color = input<string>();\n // Authored text rather than an i18n key — an option label mapped from a row\n // the app holds, which the dictionary has never heard of.\n noTranslate = input<boolean>();\n}\n\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { Y as NAV_STORE_REF, b as HttpService, c as TranslatePipe, ot as Assets
|
|
|
2
2
|
import { t as SelectorDirective } from "./magmonium-one-selector-CeqlecBa.mjs";
|
|
3
3
|
import { r as IconComponent } from "./magmonium-one-icon-CH-g8CUR.mjs";
|
|
4
4
|
import { r as ConfigComponent } from "./magmonium-one-attribute-value-CPh-lJPV.mjs";
|
|
5
|
-
import { t as ButtonComponent } from "./magmonium-one-button-
|
|
5
|
+
import { t as ButtonComponent } from "./magmonium-one-button-CKHBcCoO.mjs";
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
import { ChangeDetectionStrategy, Component, ElementRef, afterRenderEffect, computed, inject, input, inputBinding, model, output, outputBinding, signal, untracked, viewChild } from "@angular/core";
|
|
8
8
|
import { of } from "rxjs";
|
|
@@ -885,4 +885,4 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
885
885
|
});
|
|
886
886
|
export { ContextMenuBoxComponent as n, MenuComponent as r, ContextMenuComponent as t };
|
|
887
887
|
|
|
888
|
-
//# sourceMappingURL=magmonium-one-menu-
|
|
888
|
+
//# sourceMappingURL=magmonium-one-menu-Nj_Aj1fs.mjs.map
|