@magmonium/one 0.4.50 → 0.4.51

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.
@@ -114,7 +114,7 @@ var DropdownBoxComponent = class DropdownBoxComponent {
114
114
  </ul>
115
115
  `,
116
116
  isInline: true,
117
- styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.dropdown-box{overflow-y:auto;max-height:15rem;margin:0;padding:.375rem;list-style:none;border:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));border-radius:var(--m-input-radius, .5rem);background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);animation:dropdown-in .2s ease-out}.dropdown-box__checkbox{flex-shrink:0;width:14px;height:14px;margin-right:8px;pointer-events:none;accent-color:var(--m-mm);cursor:pointer}.dropdown-box__option{display:flex;align-items:center;padding:.625rem .75rem;border-radius:.375rem;cursor:pointer;font-size:.875rem;color:var(--m-text);transition:background .15s ease}.dropdown-box__option:hover,.dropdown-box__option--active{background:color-mix(in srgb,var(--m-focus) 8%,transparent)}.dropdown-box__option--selected{font-weight:600;color:var(--m-mm)}.dropdown-box__option--disabled{opacity:.4;pointer-events:none}.dropdown-box__empty{padding:.75rem;text-align:center;color:var(--m-text-tertiary);font-size:.875rem}@keyframes dropdown-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host(.open-upward) .dropdown-box{animation:dropdown-in-up .2s ease-out}@keyframes dropdown-in-up{0%{opacity:0;transform:scale(.95) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom) .dropdown-box{max-height:70vh;border:none;border-radius:0;background:transparent;box-shadow:none;animation:none}\n"],
117
+ styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.dropdown-box{overflow-y:auto;max-height:15rem;margin:0;padding:.375rem;list-style:none;border:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));border-radius:var(--m-input-radius, .5rem);background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem var(--m-backdrop-shadow);animation:dropdown-in .2s ease-out}.dropdown-box__checkbox{flex-shrink:0;width:14px;height:14px;margin-right:8px;pointer-events:none;accent-color:var(--m-mm);cursor:pointer}.dropdown-box__option{display:flex;align-items:center;padding:.625rem .75rem;border-radius:.375rem;cursor:pointer;font-size:.875rem;color:var(--m-text);transition:background .15s ease}.dropdown-box__option:hover,.dropdown-box__option--active{background:color-mix(in srgb,var(--m-focus) 8%,transparent)}.dropdown-box__option--selected{font-weight:600;color:var(--m-mm)}.dropdown-box__option--disabled{opacity:.4;pointer-events:none}.dropdown-box__empty{padding:.75rem;text-align:center;color:var(--m-text-tertiary);font-size:.875rem}@keyframes dropdown-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host(.open-upward) .dropdown-box{animation:dropdown-in-up .2s ease-out}@keyframes dropdown-in-up{0%{opacity:0;transform:scale(.95) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom) .dropdown-box{max-height:70vh;border:none;border-radius:0;background:transparent;box-shadow:none;animation:none}\n"],
118
118
  dependencies: [{
119
119
  kind: "pipe",
120
120
  type: TranslatePipe,
@@ -173,7 +173,7 @@ i0.ɵɵngDeclareClassMetadata({
173
173
  </ul>
174
174
  `,
175
175
  changeDetection: ChangeDetectionStrategy.OnPush,
176
- styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.dropdown-box{overflow-y:auto;max-height:15rem;margin:0;padding:.375rem;list-style:none;border:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));border-radius:var(--m-input-radius, .5rem);background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);animation:dropdown-in .2s ease-out}.dropdown-box__checkbox{flex-shrink:0;width:14px;height:14px;margin-right:8px;pointer-events:none;accent-color:var(--m-mm);cursor:pointer}.dropdown-box__option{display:flex;align-items:center;padding:.625rem .75rem;border-radius:.375rem;cursor:pointer;font-size:.875rem;color:var(--m-text);transition:background .15s ease}.dropdown-box__option:hover,.dropdown-box__option--active{background:color-mix(in srgb,var(--m-focus) 8%,transparent)}.dropdown-box__option--selected{font-weight:600;color:var(--m-mm)}.dropdown-box__option--disabled{opacity:.4;pointer-events:none}.dropdown-box__empty{padding:.75rem;text-align:center;color:var(--m-text-tertiary);font-size:.875rem}@keyframes dropdown-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host(.open-upward) .dropdown-box{animation:dropdown-in-up .2s ease-out}@keyframes dropdown-in-up{0%{opacity:0;transform:scale(.95) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom) .dropdown-box{max-height:70vh;border:none;border-radius:0;background:transparent;box-shadow:none;animation:none}\n"]
176
+ styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.dropdown-box{overflow-y:auto;max-height:15rem;margin:0;padding:.375rem;list-style:none;border:var(--m-input-border-width, 1px) solid var(--m-text-input-border, color-mix(in srgb, var(--m-text) 18%, var(--m-background)));border-radius:var(--m-input-radius, .5rem);background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem var(--m-backdrop-shadow);animation:dropdown-in .2s ease-out}.dropdown-box__checkbox{flex-shrink:0;width:14px;height:14px;margin-right:8px;pointer-events:none;accent-color:var(--m-mm);cursor:pointer}.dropdown-box__option{display:flex;align-items:center;padding:.625rem .75rem;border-radius:.375rem;cursor:pointer;font-size:.875rem;color:var(--m-text);transition:background .15s ease}.dropdown-box__option:hover,.dropdown-box__option--active{background:color-mix(in srgb,var(--m-focus) 8%,transparent)}.dropdown-box__option--selected{font-weight:600;color:var(--m-mm)}.dropdown-box__option--disabled{opacity:.4;pointer-events:none}.dropdown-box__empty{padding:.75rem;text-align:center;color:var(--m-text-tertiary);font-size:.875rem}@keyframes dropdown-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host(.open-upward) .dropdown-box{animation:dropdown-in-up .2s ease-out}@keyframes dropdown-in-up{0%{opacity:0;transform:scale(.95) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom) .dropdown-box{max-height:70vh;border:none;border-radius:0;background:transparent;box-shadow:none;animation:none}\n"]
177
177
  }]
178
178
  }],
179
179
  ctorParameters: () => [],
@@ -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-Dxo8Yd62.mjs.map
604
+ //# sourceMappingURL=magmonium-one-base-dropdown-0qlJVp_y.mjs.map
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"magmonium-one-base-dropdown-0qlJVp_y.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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"}
@@ -3,7 +3,7 @@ import { r as deriveContrastColor } from "./magmonium-one-color-utl-td5Lij8L.mjs
3
3
  import { o as injectParentSize, s as provideSizeContext } from "./magmonium-one-icon-DR7LgBc3.mjs";
4
4
  import { r as ConfigComponent } from "./magmonium-one-attribute-value-CSl5Xeq1.mjs";
5
5
  import { i as deriveGroupClass, t as ButtonComponent } from "./magmonium-one-button-CJ1Gaaw-.mjs";
6
- import { t as ContextMenuComponent } from "./magmonium-one-menu-Dstqv7P7.mjs";
6
+ import { t as ContextMenuComponent } from "./magmonium-one-menu-B8H0Grmb.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-CYIO2BE-.mjs.map
428
+ //# sourceMappingURL=magmonium-one-group-BBaepb2P.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"magmonium-one-group-CYIO2BE-.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-BBaepb2P.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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"}
@@ -469,7 +469,7 @@ var ContextMenuBoxComponent = class ContextMenuBoxComponent {
469
469
  outputs: { action: "action" },
470
470
  ngImport: i0,
471
471
  template: "<div class=\"m-context-menu-box\" [style.width]=\"width()\" [style.max-height]=\"height()\">\n <m-menu\n [config]=\"options()\"\n [hide]=\"hide()\"\n [file]=\"file()\"\n [isAdmin]=\"isAdmin()\"\n [autoFocus]=\"true\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"emitAction($event)\"\n />\n</div>\n",
472
- styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-context-menu-box{overflow-y:auto;padding:.375rem;border-radius:var(--m-input-radius, .5rem);border:var(--m-input-border-width, 1px) solid color-mix(in srgb,var(--m-text) 18%,var(--m-background));background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);animation:context-menu-in .2s ease-out}@keyframes context-menu-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom){display:block;width:100%!important;max-width:100%!important}:host-context(.align-bottom) .m-context-menu-box{width:100%!important;max-width:100%!important;max-height:70vh!important;border-left:none;border-right:none;border-bottom:none}\n"],
472
+ styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-context-menu-box{overflow-y:auto;padding:.375rem;border-radius:var(--m-input-radius, .5rem);border:var(--m-input-border-width, 1px) solid color-mix(in srgb,var(--m-text) 18%,var(--m-background));background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem var(--m-backdrop-shadow);animation:context-menu-in .2s ease-out}@keyframes context-menu-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom){display:block;width:100%!important;max-width:100%!important}:host-context(.align-bottom) .m-context-menu-box{width:100%!important;max-width:100%!important;max-height:70vh!important;border-left:none;border-right:none;border-bottom:none}\n"],
473
473
  dependencies: [{
474
474
  kind: "component",
475
475
  type: MenuComponent,
@@ -505,7 +505,7 @@ i0.ɵɵngDeclareClassMetadata({
505
505
  imports: [MenuComponent],
506
506
  changeDetection: ChangeDetectionStrategy.OnPush,
507
507
  template: "<div class=\"m-context-menu-box\" [style.width]=\"width()\" [style.max-height]=\"height()\">\n <m-menu\n [config]=\"options()\"\n [hide]=\"hide()\"\n [file]=\"file()\"\n [isAdmin]=\"isAdmin()\"\n [autoFocus]=\"true\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"emitAction($event)\"\n />\n</div>\n",
508
- styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-context-menu-box{overflow-y:auto;padding:.375rem;border-radius:var(--m-input-radius, .5rem);border:var(--m-input-border-width, 1px) solid color-mix(in srgb,var(--m-text) 18%,var(--m-background));background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem color-mix(in srgb,var(--m-text) 12%,transparent);animation:context-menu-in .2s ease-out}@keyframes context-menu-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom){display:block;width:100%!important;max-width:100%!important}:host-context(.align-bottom) .m-context-menu-box{width:100%!important;max-width:100%!important;max-height:70vh!important;border-left:none;border-right:none;border-bottom:none}\n"]
508
+ styles: ["@keyframes toggle-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.02)}}@keyframes thumb-slide{0%{transform:translate(0) scale(1)}50%{transform:translate(.3em) scale(.9)}to{transform:translate(.6em) scale(1)}}.m-context-menu-box{overflow-y:auto;padding:.375rem;border-radius:var(--m-input-radius, .5rem);border:var(--m-input-border-width, 1px) solid color-mix(in srgb,var(--m-text) 18%,var(--m-background));background:color-mix(in srgb,var(--m-focus) 2%,var(--m-background));box-shadow:0 .75rem 2rem var(--m-backdrop-shadow);animation:context-menu-in .2s ease-out}@keyframes context-menu-in{0%{opacity:0;transform:scale(.95) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}:host-context(.align-bottom){display:block;width:100%!important;max-width:100%!important}:host-context(.align-bottom) .m-context-menu-box{width:100%!important;max-width:100%!important;max-height:70vh!important;border-left:none;border-right:none;border-bottom:none}\n"]
509
509
  }]
510
510
  }],
511
511
  propDecorators: {
@@ -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-Dstqv7P7.mjs.map
888
+ //# sourceMappingURL=magmonium-one-menu-B8H0Grmb.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"magmonium-one-menu-Dstqv7P7.mjs","names":["catchError"],"sources":["../../../../libs/one/src/lib/shared/ui/menu/ui/menu/menu.ts","../../../../libs/one/src/lib/shared/ui/menu/ui/menu/menu.html","../../../../libs/one/src/lib/shared/ui/menu/ui/context-menu-box/context-menu-box.ts","../../../../libs/one/src/lib/shared/ui/menu/ui/context-menu-box/context-menu-box.html","../../../../libs/one/src/lib/shared/ui/menu/ui/context-menu/context-menu.ts"],"sourcesContent":["import {\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { Assets } from '../../../../enum/assets/assets';\nimport { HttpService } from '../../../../services/http';\nimport { TranslatePipe } from '../../../../pipe/translate';\n\nimport { IconComponent } from '../../../icon';\nimport { MenuItem } from '../../type';\nimport { NAV_STORE_REF } from '../../../../config/tokens';\n\n@Component({\n selector: 'm-menu',\n\n imports: [TranslatePipe, IconComponent],\n templateUrl: './menu.html',\n styleUrl: './menu.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(keydown.arrowdown)': 'moveFocus($event, 1)',\n '(keydown.arrowup)': 'moveFocus($event, -1)',\n },\n})\nexport class MenuComponent {\n readonly #navRef = inject(NAV_STORE_REF, { optional: true });\n\n // --- Inputs ---\n config = input<MenuItem[][] | undefined>();\n file = input<string | undefined>();\n root = input<string | undefined>();\n url = input<string | undefined>();\n extra = input<MenuItem[] | undefined>();\n hide = input<string[] | undefined>();\n hideLink = input<boolean>(false);\n isAdmin = input<boolean>(false);\n /** Focus the first item once rendered — a popover menu opened from a trigger. */\n autoFocus = input<boolean>(false);\n readonly action = output<MenuItem>();\n\n visibilityRule = input<(key: string, data?: unknown) => boolean>();\n disableRule = input<(key: string, data?: unknown) => boolean>();\n extraData = input<unknown>();\n\n // --- Internals ---\n #httpService = inject(HttpService);\n #tree = signal<string[]>([]);\n #treeMap = signal<Record<string, MenuItem>>({});\n #host = inject<ElementRef<HTMLElement>>(ElementRef);\n // Whether the next settled render should focus the first item: `autoFocus`\n // decides the first one, a drill or back decides after (its rows replace\n // the focused one, which would drop focus to the body).\n #focusPending?: boolean;\n\n protected back = signal<MenuItem | undefined>(undefined);\n protected slideDirection = signal<'forward' | 'backward' | 'none'>('none');\n\n #asyncOptions = rxResource({\n params: computed(() => this.back()?.file ?? this.file()),\n stream: ({ params: file }) => {\n if (!file) {\n return of(undefined);\n }\n return this.#httpService\n .asset<MenuItem[][]>(['menus', file], Assets.JSON)\n .pipe(catchError(() => of(undefined)));\n },\n });\n\n protected options = computed<MenuItem[][]>(() => {\n const back = this.back();\n const async = this.#asyncOptions.value();\n const config = this.config();\n const hide = this.hide();\n const extra = this.extra();\n const isAdmin = this.isAdmin();\n const vRule = this.visibilityRule();\n const data = this.extraData();\n\n // Filtering recurses so a parent is judged by what survives under it: a row\n // whose every child was hidden would open an empty box, which reads as a\n // broken menu rather than an unavailable one. A `file` parent is exempt —\n // its options are fetched on drill and there is nothing here to count.\n const filterGroups = (groups: MenuItem[][]): MenuItem[][] =>\n groups\n .map((group) =>\n group.filter((item) => {\n if (!isAdmin && item.adminOnly) return false;\n if (hide?.length && hide.includes(item.id)) return false;\n if (vRule && !vRule(item.visibilityKey ?? item.id, data)) {\n return false;\n }\n if (item.options) return filterGroups(item.options).length > 0;\n return true;\n })\n )\n .filter((group) => group.length > 0);\n\n const source = back\n ? (back.options ?? async ?? [])\n : (async ?? config ?? []);\n\n const result = filterGroups(source);\n\n return extra?.length && !back ? [...result, extra] : result;\n });\n\n protected isLoading = computed(() => this.#asyncOptions.isLoading());\n\n constructor() {\n afterRenderEffect(() => {\n this.options();\n if (this.isLoading()) return;\n const pending = this.#focusPending ?? untracked(this.autoFocus);\n this.#focusPending = false;\n if (pending) {\n this.#host.nativeElement\n .querySelector<HTMLElement>('.menu-item:not(.is-disabled)')\n ?.focus();\n }\n });\n }\n\n // ↑/↓ walk the focusable rows (back row included), wrapping; Enter on a\n // row is its own `selectItem`.\n moveFocus(event: Event, step: 1 | -1): void {\n const rows = Array.from(\n this.#host.nativeElement.querySelectorAll<HTMLElement>(\n '.back-btn, .menu-item:not(.is-disabled)'\n )\n );\n if (!rows.length) return;\n event.preventDefault();\n const current = rows.indexOf(document.activeElement as HTMLElement);\n const next =\n current < 0\n ? step > 0\n ? 0\n : rows.length - 1\n : (current + step + rows.length) % rows.length;\n rows[next].focus();\n }\n\n // --- Handlers ---\n selectItem(item: MenuItem): void {\n const dRule = this.disableRule();\n if (item.disabled || (dRule && dRule(item.disableKey ?? item.id))) {\n return;\n }\n\n if (item.options || item.file) {\n this.slideDirection.set('forward');\n this.#treeMap.update((map) => ({ ...map, [item.id]: item }));\n this.#tree.update((t) => [...t, item.id]);\n this.back.set(item);\n this.#focusPending = this.#hasFocus();\n return;\n }\n\n // A row naming a Nav goes there itself — the NavKind on that node decides\n // whether it routes or opens a panel, the answer `[mRef]` gives (GLOSSARY.md\n // NavRef). Still emitted, so whatever holds the menu closes it.\n if (item.nav)\n this.#navRef?.setSelected(\n item.nav,\n undefined,\n item.keepPanel ? { keepPanel: true } : undefined\n );\n this.action.emit(item);\n }\n\n goBack(): void {\n this.slideDirection.set('backward');\n this.#focusPending = this.#hasFocus();\n const currentTree = this.#tree();\n if (currentTree.length <= 1) {\n this.#tree.set([]);\n this.back.set(undefined);\n return;\n }\n\n const newTree = currentTree.slice(0, -1);\n this.#tree.set(newTree);\n const parentId = newTree[newTree.length - 1];\n this.back.set(this.#treeMap()[parentId]);\n }\n\n #hasFocus(): boolean {\n return this.#host.nativeElement.contains(document.activeElement);\n }\n\n isSelected(item: MenuItem): boolean {\n // A NavRef knows what it points at, so selection is an id comparison —\n // no path normalising, and it works for panels as well as pages.\n if (item.nav) {\n return this.#navRef?.id() === item.nav;\n }\n\n const currentUrl = this.url();\n const rootPath = this.root();\n if (!currentUrl || !item.link) {\n return item.selected ?? false;\n }\n const fullLink = rootPath ? `${rootPath}/${item.link}` : item.link;\n return currentUrl === fullLink || currentUrl.startsWith(fullLink + '/');\n }\n\n isItemDisabled(item: MenuItem): boolean {\n const dRule = this.disableRule();\n return !!(\n item.disabled ||\n (dRule && dRule(item.disableKey ?? item.id, this.extraData()))\n );\n }\n}\n","<div class=\"menu-container\" [attr.data-slide]=\"slideDirection()\">\n @if (back()) {\n <div\n class=\"back-btn\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"goBack()\"\n (keydown.enter)=\"goBack()\"\n (keydown.space)=\"goBack()\"\n >\n <div class=\"back-icon\">\n <m-icon [name]=\"'chevron-left'\" color=\"currentColor\" />\n </div>\n <span class=\"back-text\">{{ back()!.label | translate }}</span>\n </div>\n }\n\n <div class=\"menu-content\">\n @if (isLoading()) {\n <div class=\"menu-loading\">\n <div class=\"spinner\"></div>\n </div>\n } @else {\n <div class=\"menu-groups\">\n @for (group of options(); track $index; let last = $last) {\n <div class=\"menu-group\" [class.has-separator]=\"!last\">\n @for (item of group; track item.id) {\n @if (!item.hidden) {\n <div\n class=\"menu-item\"\n [attr.data-testid]=\"item.id + '-btn'\"\n [class.is-selected]=\"isSelected(item)\"\n [class.is-disabled]=\"isItemDisabled(item)\"\n [attr.aria-disabled]=\"isItemDisabled(item) || null\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"selectItem(item)\"\n (keydown.enter)=\"selectItem(item)\"\n (keydown.space)=\"selectItem(item)\"\n >\n @if (item.icon) {\n <div class=\"item-icon\">\n <m-icon [name]=\"item.icon\" color=\"currentColor\" />\n </div>\n }\n <span class=\"item-text\">{{ item.label | translate }}</span>\n @if (item.options || item.file) {\n <div class=\"item-arrow\">\n <m-icon [name]=\"'chevron-right'\" color=\"currentColor\" />\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { MenuComponent } from '../menu/menu';\nimport { MenuItem } from '../../type';\n\n@Component({\n selector: 'm-context-menu-box',\n imports: [MenuComponent],\n templateUrl: './context-menu-box.html',\n styleUrl: './context-menu-box.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContextMenuBoxComponent {\n readonly options = input<MenuItem[][]>([]);\n readonly hide = input<string[] | undefined>();\n readonly file = input<string | undefined>();\n readonly width = input<string>('250px');\n readonly height = input<string>('auto');\n readonly isAdmin = input<boolean>(false);\n readonly action = output<MenuItem>();\n\n readonly visibilityRule = input<(key: string, data?: unknown) => boolean>();\n readonly disableRule = input<(key: string, data?: unknown) => boolean>();\n readonly extraData = input<unknown>();\n\n protected readonly emitAction = (item: MenuItem): void => {\n this.action.emit(item);\n };\n}\n","<div class=\"m-context-menu-box\" [style.width]=\"width()\" [style.max-height]=\"height()\">\n <m-menu\n [config]=\"options()\"\n [hide]=\"hide()\"\n [file]=\"file()\"\n [isAdmin]=\"isAdmin()\"\n [autoFocus]=\"true\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"emitAction($event)\"\n />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n inputBinding,\n model,\n output,\n outputBinding,\n viewChild,\n} from '@angular/core';\nimport { ConfigComponent } from '../../../../lib/components/config-component';\nimport { SelectorDirective } from '../../../../directives/selector/selector';\nimport type { SelectorConfig } from '../../../../directives/selector/selector-type';\nimport { Icon } from '../../../icon';\nimport { ButtonComponent } from '../../../button/ui/button';\nimport { ContextMenu, MenuItem } from '../../type';\nimport { ContextMenuBoxComponent } from '../context-menu-box/context-menu-box';\n\n@Component({\n selector: 'm-context-menu, m-one-context-menu',\n imports: [ButtonComponent, SelectorDirective],\n template: `\n <m-one-button\n [config]=\"triggerButtonConfig()\"\n [mSelector]=\"selectorConfig()\"\n (opened)=\"toggle.set(true)\"\n (closed)=\"toggle.set(false)\"\n />\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContextMenuComponent extends ConfigComponent<ContextMenu> {\n toggle = model<boolean>();\n override remote = input<string | undefined>();\n exclude = input<string[]>();\n readonly visibilityRule = input<(key: string, data?: unknown) => boolean>();\n readonly disableRule = input<(key: string, data?: unknown) => boolean>();\n readonly extraData = input<unknown>();\n readonly inverted = input<boolean | undefined>();\n // A bound list rides the tag, not the config bag: a YAML file cannot hold\n // rows a store computes. `MenuItem[]` is accepted because root groups are an\n // authoring shape — data is one flat group — and normalized on read.\n readonly options = input<MenuItem[] | MenuItem[][] | undefined>();\n readonly action = output<MenuItem>();\n protected override readonly subFolder = 'menu';\n private readonly selectorDir = viewChild(SelectorDirective);\n protected readonly contextMenuConfig = computed(\n () => (this.config() ?? {}) as ContextMenu\n );\n private readonly iconConfig = computed<Partial<Icon>>(() => {\n const toggle = this.toggle();\n const { closeIcon, icon } = this.contextMenuConfig();\n if (toggle) {\n return { name: 'x', ...closeIcon };\n }\n return { name: 'ellipsis-vertical', ...icon };\n });\n protected readonly triggerButtonConfig = computed(() => ({\n variant: 'ghost' as const,\n iconOnly: true as const,\n icon: this.iconConfig().name,\n label: 'actions',\n inverted: this.inverted() ?? this.contextMenuConfig().inverted,\n }));\n // `exclude` is not applied here: a menu nests, and a filter run once over the\n // root groups cannot reach an item a layer down, nor one a `file` parent has\n // not fetched yet. It is handed to the menu as `hide` instead, which the menu\n // re-applies at whatever depth is on screen.\n private readonly contextMenuOptions = computed<MenuItem[][]>(() => {\n const supplied = this.options();\n if (supplied) {\n // The input overrides the config bag the way `inverted` already does.\n return Array.isArray(supplied[0])\n ? (supplied as MenuItem[][])\n : [supplied as MenuItem[]];\n }\n return this.contextMenuConfig().options ?? [];\n });\n protected readonly selectorConfig = computed<\n SelectorConfig<ContextMenuBoxComponent> | undefined\n >(() => {\n // The overlay-bearing primitives' DesignMode rule (ADR 0003): a Canvas\n // owns the click — the ControlLayer selects, never the menu — so the\n // directive is handed nothing to open. An undefined config is the whole\n // suppression, the directive having no `base` to open on.\n if (this.isDesignMode) return undefined;\n return {\n component: ContextMenuBoxComponent,\n base: 'm-context-menu',\n width: this.contextMenuConfig().width ?? '250px',\n height: this.contextMenuConfig().height ?? 'auto',\n align: this.contextMenuConfig().align,\n toggle: true,\n bindings: [\n inputBinding('options', this.contextMenuOptions),\n inputBinding('hide', this.exclude),\n inputBinding('visibilityRule', this.visibilityRule),\n inputBinding('disableRule', this.disableRule),\n inputBinding('extraData', this.extraData),\n outputBinding('action', (event: MenuItem) => {\n this.action.emit(event);\n this.selectorDir()?.close();\n }),\n ],\n };\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"magmonium-one-menu-B8H0Grmb.mjs","names":["catchError"],"sources":["../../../../libs/one/src/lib/shared/ui/menu/ui/menu/menu.ts","../../../../libs/one/src/lib/shared/ui/menu/ui/menu/menu.html","../../../../libs/one/src/lib/shared/ui/menu/ui/context-menu-box/context-menu-box.ts","../../../../libs/one/src/lib/shared/ui/menu/ui/context-menu-box/context-menu-box.html","../../../../libs/one/src/lib/shared/ui/menu/ui/context-menu/context-menu.ts"],"sourcesContent":["import {\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { Assets } from '../../../../enum/assets/assets';\nimport { HttpService } from '../../../../services/http';\nimport { TranslatePipe } from '../../../../pipe/translate';\n\nimport { IconComponent } from '../../../icon';\nimport { MenuItem } from '../../type';\nimport { NAV_STORE_REF } from '../../../../config/tokens';\n\n@Component({\n selector: 'm-menu',\n\n imports: [TranslatePipe, IconComponent],\n templateUrl: './menu.html',\n styleUrl: './menu.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(keydown.arrowdown)': 'moveFocus($event, 1)',\n '(keydown.arrowup)': 'moveFocus($event, -1)',\n },\n})\nexport class MenuComponent {\n readonly #navRef = inject(NAV_STORE_REF, { optional: true });\n\n // --- Inputs ---\n config = input<MenuItem[][] | undefined>();\n file = input<string | undefined>();\n root = input<string | undefined>();\n url = input<string | undefined>();\n extra = input<MenuItem[] | undefined>();\n hide = input<string[] | undefined>();\n hideLink = input<boolean>(false);\n isAdmin = input<boolean>(false);\n /** Focus the first item once rendered — a popover menu opened from a trigger. */\n autoFocus = input<boolean>(false);\n readonly action = output<MenuItem>();\n\n visibilityRule = input<(key: string, data?: unknown) => boolean>();\n disableRule = input<(key: string, data?: unknown) => boolean>();\n extraData = input<unknown>();\n\n // --- Internals ---\n #httpService = inject(HttpService);\n #tree = signal<string[]>([]);\n #treeMap = signal<Record<string, MenuItem>>({});\n #host = inject<ElementRef<HTMLElement>>(ElementRef);\n // Whether the next settled render should focus the first item: `autoFocus`\n // decides the first one, a drill or back decides after (its rows replace\n // the focused one, which would drop focus to the body).\n #focusPending?: boolean;\n\n protected back = signal<MenuItem | undefined>(undefined);\n protected slideDirection = signal<'forward' | 'backward' | 'none'>('none');\n\n #asyncOptions = rxResource({\n params: computed(() => this.back()?.file ?? this.file()),\n stream: ({ params: file }) => {\n if (!file) {\n return of(undefined);\n }\n return this.#httpService\n .asset<MenuItem[][]>(['menus', file], Assets.JSON)\n .pipe(catchError(() => of(undefined)));\n },\n });\n\n protected options = computed<MenuItem[][]>(() => {\n const back = this.back();\n const async = this.#asyncOptions.value();\n const config = this.config();\n const hide = this.hide();\n const extra = this.extra();\n const isAdmin = this.isAdmin();\n const vRule = this.visibilityRule();\n const data = this.extraData();\n\n // Filtering recurses so a parent is judged by what survives under it: a row\n // whose every child was hidden would open an empty box, which reads as a\n // broken menu rather than an unavailable one. A `file` parent is exempt —\n // its options are fetched on drill and there is nothing here to count.\n const filterGroups = (groups: MenuItem[][]): MenuItem[][] =>\n groups\n .map((group) =>\n group.filter((item) => {\n if (!isAdmin && item.adminOnly) return false;\n if (hide?.length && hide.includes(item.id)) return false;\n if (vRule && !vRule(item.visibilityKey ?? item.id, data)) {\n return false;\n }\n if (item.options) return filterGroups(item.options).length > 0;\n return true;\n })\n )\n .filter((group) => group.length > 0);\n\n const source = back\n ? (back.options ?? async ?? [])\n : (async ?? config ?? []);\n\n const result = filterGroups(source);\n\n return extra?.length && !back ? [...result, extra] : result;\n });\n\n protected isLoading = computed(() => this.#asyncOptions.isLoading());\n\n constructor() {\n afterRenderEffect(() => {\n this.options();\n if (this.isLoading()) return;\n const pending = this.#focusPending ?? untracked(this.autoFocus);\n this.#focusPending = false;\n if (pending) {\n this.#host.nativeElement\n .querySelector<HTMLElement>('.menu-item:not(.is-disabled)')\n ?.focus();\n }\n });\n }\n\n // ↑/↓ walk the focusable rows (back row included), wrapping; Enter on a\n // row is its own `selectItem`.\n moveFocus(event: Event, step: 1 | -1): void {\n const rows = Array.from(\n this.#host.nativeElement.querySelectorAll<HTMLElement>(\n '.back-btn, .menu-item:not(.is-disabled)'\n )\n );\n if (!rows.length) return;\n event.preventDefault();\n const current = rows.indexOf(document.activeElement as HTMLElement);\n const next =\n current < 0\n ? step > 0\n ? 0\n : rows.length - 1\n : (current + step + rows.length) % rows.length;\n rows[next].focus();\n }\n\n // --- Handlers ---\n selectItem(item: MenuItem): void {\n const dRule = this.disableRule();\n if (item.disabled || (dRule && dRule(item.disableKey ?? item.id))) {\n return;\n }\n\n if (item.options || item.file) {\n this.slideDirection.set('forward');\n this.#treeMap.update((map) => ({ ...map, [item.id]: item }));\n this.#tree.update((t) => [...t, item.id]);\n this.back.set(item);\n this.#focusPending = this.#hasFocus();\n return;\n }\n\n // A row naming a Nav goes there itself — the NavKind on that node decides\n // whether it routes or opens a panel, the answer `[mRef]` gives (GLOSSARY.md\n // NavRef). Still emitted, so whatever holds the menu closes it.\n if (item.nav)\n this.#navRef?.setSelected(\n item.nav,\n undefined,\n item.keepPanel ? { keepPanel: true } : undefined\n );\n this.action.emit(item);\n }\n\n goBack(): void {\n this.slideDirection.set('backward');\n this.#focusPending = this.#hasFocus();\n const currentTree = this.#tree();\n if (currentTree.length <= 1) {\n this.#tree.set([]);\n this.back.set(undefined);\n return;\n }\n\n const newTree = currentTree.slice(0, -1);\n this.#tree.set(newTree);\n const parentId = newTree[newTree.length - 1];\n this.back.set(this.#treeMap()[parentId]);\n }\n\n #hasFocus(): boolean {\n return this.#host.nativeElement.contains(document.activeElement);\n }\n\n isSelected(item: MenuItem): boolean {\n // A NavRef knows what it points at, so selection is an id comparison —\n // no path normalising, and it works for panels as well as pages.\n if (item.nav) {\n return this.#navRef?.id() === item.nav;\n }\n\n const currentUrl = this.url();\n const rootPath = this.root();\n if (!currentUrl || !item.link) {\n return item.selected ?? false;\n }\n const fullLink = rootPath ? `${rootPath}/${item.link}` : item.link;\n return currentUrl === fullLink || currentUrl.startsWith(fullLink + '/');\n }\n\n isItemDisabled(item: MenuItem): boolean {\n const dRule = this.disableRule();\n return !!(\n item.disabled ||\n (dRule && dRule(item.disableKey ?? item.id, this.extraData()))\n );\n }\n}\n","<div class=\"menu-container\" [attr.data-slide]=\"slideDirection()\">\n @if (back()) {\n <div\n class=\"back-btn\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"goBack()\"\n (keydown.enter)=\"goBack()\"\n (keydown.space)=\"goBack()\"\n >\n <div class=\"back-icon\">\n <m-icon [name]=\"'chevron-left'\" color=\"currentColor\" />\n </div>\n <span class=\"back-text\">{{ back()!.label | translate }}</span>\n </div>\n }\n\n <div class=\"menu-content\">\n @if (isLoading()) {\n <div class=\"menu-loading\">\n <div class=\"spinner\"></div>\n </div>\n } @else {\n <div class=\"menu-groups\">\n @for (group of options(); track $index; let last = $last) {\n <div class=\"menu-group\" [class.has-separator]=\"!last\">\n @for (item of group; track item.id) {\n @if (!item.hidden) {\n <div\n class=\"menu-item\"\n [attr.data-testid]=\"item.id + '-btn'\"\n [class.is-selected]=\"isSelected(item)\"\n [class.is-disabled]=\"isItemDisabled(item)\"\n [attr.aria-disabled]=\"isItemDisabled(item) || null\"\n tabindex=\"0\"\n role=\"button\"\n (click)=\"selectItem(item)\"\n (keydown.enter)=\"selectItem(item)\"\n (keydown.space)=\"selectItem(item)\"\n >\n @if (item.icon) {\n <div class=\"item-icon\">\n <m-icon [name]=\"item.icon\" color=\"currentColor\" />\n </div>\n }\n <span class=\"item-text\">{{ item.label | translate }}</span>\n @if (item.options || item.file) {\n <div class=\"item-arrow\">\n <m-icon [name]=\"'chevron-right'\" color=\"currentColor\" />\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { MenuComponent } from '../menu/menu';\nimport { MenuItem } from '../../type';\n\n@Component({\n selector: 'm-context-menu-box',\n imports: [MenuComponent],\n templateUrl: './context-menu-box.html',\n styleUrl: './context-menu-box.sass',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContextMenuBoxComponent {\n readonly options = input<MenuItem[][]>([]);\n readonly hide = input<string[] | undefined>();\n readonly file = input<string | undefined>();\n readonly width = input<string>('250px');\n readonly height = input<string>('auto');\n readonly isAdmin = input<boolean>(false);\n readonly action = output<MenuItem>();\n\n readonly visibilityRule = input<(key: string, data?: unknown) => boolean>();\n readonly disableRule = input<(key: string, data?: unknown) => boolean>();\n readonly extraData = input<unknown>();\n\n protected readonly emitAction = (item: MenuItem): void => {\n this.action.emit(item);\n };\n}\n","<div class=\"m-context-menu-box\" [style.width]=\"width()\" [style.max-height]=\"height()\">\n <m-menu\n [config]=\"options()\"\n [hide]=\"hide()\"\n [file]=\"file()\"\n [isAdmin]=\"isAdmin()\"\n [autoFocus]=\"true\"\n [visibilityRule]=\"visibilityRule()\"\n [disableRule]=\"disableRule()\"\n [extraData]=\"extraData()\"\n (action)=\"emitAction($event)\"\n />\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n inputBinding,\n model,\n output,\n outputBinding,\n viewChild,\n} from '@angular/core';\nimport { ConfigComponent } from '../../../../lib/components/config-component';\nimport { SelectorDirective } from '../../../../directives/selector/selector';\nimport type { SelectorConfig } from '../../../../directives/selector/selector-type';\nimport { Icon } from '../../../icon';\nimport { ButtonComponent } from '../../../button/ui/button';\nimport { ContextMenu, MenuItem } from '../../type';\nimport { ContextMenuBoxComponent } from '../context-menu-box/context-menu-box';\n\n@Component({\n selector: 'm-context-menu, m-one-context-menu',\n imports: [ButtonComponent, SelectorDirective],\n template: `\n <m-one-button\n [config]=\"triggerButtonConfig()\"\n [mSelector]=\"selectorConfig()\"\n (opened)=\"toggle.set(true)\"\n (closed)=\"toggle.set(false)\"\n />\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContextMenuComponent extends ConfigComponent<ContextMenu> {\n toggle = model<boolean>();\n override remote = input<string | undefined>();\n exclude = input<string[]>();\n readonly visibilityRule = input<(key: string, data?: unknown) => boolean>();\n readonly disableRule = input<(key: string, data?: unknown) => boolean>();\n readonly extraData = input<unknown>();\n readonly inverted = input<boolean | undefined>();\n // A bound list rides the tag, not the config bag: a YAML file cannot hold\n // rows a store computes. `MenuItem[]` is accepted because root groups are an\n // authoring shape — data is one flat group — and normalized on read.\n readonly options = input<MenuItem[] | MenuItem[][] | undefined>();\n readonly action = output<MenuItem>();\n protected override readonly subFolder = 'menu';\n private readonly selectorDir = viewChild(SelectorDirective);\n protected readonly contextMenuConfig = computed(\n () => (this.config() ?? {}) as ContextMenu\n );\n private readonly iconConfig = computed<Partial<Icon>>(() => {\n const toggle = this.toggle();\n const { closeIcon, icon } = this.contextMenuConfig();\n if (toggle) {\n return { name: 'x', ...closeIcon };\n }\n return { name: 'ellipsis-vertical', ...icon };\n });\n protected readonly triggerButtonConfig = computed(() => ({\n variant: 'ghost' as const,\n iconOnly: true as const,\n icon: this.iconConfig().name,\n label: 'actions',\n inverted: this.inverted() ?? this.contextMenuConfig().inverted,\n }));\n // `exclude` is not applied here: a menu nests, and a filter run once over the\n // root groups cannot reach an item a layer down, nor one a `file` parent has\n // not fetched yet. It is handed to the menu as `hide` instead, which the menu\n // re-applies at whatever depth is on screen.\n private readonly contextMenuOptions = computed<MenuItem[][]>(() => {\n const supplied = this.options();\n if (supplied) {\n // The input overrides the config bag the way `inverted` already does.\n return Array.isArray(supplied[0])\n ? (supplied as MenuItem[][])\n : [supplied as MenuItem[]];\n }\n return this.contextMenuConfig().options ?? [];\n });\n protected readonly selectorConfig = computed<\n SelectorConfig<ContextMenuBoxComponent> | undefined\n >(() => {\n // The overlay-bearing primitives' DesignMode rule (ADR 0003): a Canvas\n // owns the click — the ControlLayer selects, never the menu — so the\n // directive is handed nothing to open. An undefined config is the whole\n // suppression, the directive having no `base` to open on.\n if (this.isDesignMode) return undefined;\n return {\n component: ContextMenuBoxComponent,\n base: 'm-context-menu',\n width: this.contextMenuConfig().width ?? '250px',\n height: this.contextMenuConfig().height ?? 'auto',\n align: this.contextMenuConfig().align,\n toggle: true,\n bindings: [\n inputBinding('options', this.contextMenuOptions),\n inputBinding('hide', this.exclude),\n inputBinding('visibilityRule', this.visibilityRule),\n inputBinding('disableRule', this.disableRule),\n inputBinding('extraData', this.extraData),\n outputBinding('action', (event: MenuItem) => {\n this.action.emit(event);\n this.selectorDir()?.close();\n }),\n ],\n };\n });\n}\n"],"mappings":"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"}