@foxeltech/angular-ui 0.7.83 → 0.7.101

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.
Files changed (27) hide show
  1. package/components.css +40 -1
  2. package/fesm2022/foxeltech-angular-ui-chart.mjs +33 -3
  3. package/fesm2022/foxeltech-angular-ui-chart.mjs.map +1 -1
  4. package/fesm2022/foxeltech-angular-ui-flow.mjs +42 -5
  5. package/fesm2022/foxeltech-angular-ui-flow.mjs.map +1 -1
  6. package/fesm2022/foxeltech-angular-ui.mjs +559 -42
  7. package/fesm2022/foxeltech-angular-ui.mjs.map +1 -1
  8. package/package.json +3 -2
  9. package/src/lib/styles/components.css +40 -1
  10. package/src/lib/styles/utilities.css +2 -1
  11. package/src/lib/ui/components/breadcrumb/breadcrumb.component.css +262 -0
  12. package/src/lib/ui/components/breadcrumb/breadcrumb.component.html +91 -0
  13. package/src/lib/ui/components/button/button.component.html +1 -0
  14. package/src/lib/ui/components/filter-pills/filter-pills.component.html +1 -1
  15. package/src/lib/ui/components/load-status/load-status.component.css +96 -0
  16. package/src/lib/ui/components/load-status/load-status.component.html +20 -0
  17. package/src/lib/ui/components/master-detail/master-detail.component.css +63 -11
  18. package/src/lib/ui/components/master-detail/master-detail.component.html +71 -42
  19. package/src/lib/ui/components/route-skeleton/route-skeleton.component.css +1 -1
  20. package/src/lib/ui/components/segmented/segmented.component.html +3 -1
  21. package/src/lib/ui/components/severity-badges/severity-badges.component.html +1 -1
  22. package/src/lib/ui/components/stat-cards/stat-cards.component.css +18 -0
  23. package/src/lib/ui/components/stat-cards/stat-cards.component.html +3 -3
  24. package/types/foxeltech-angular-ui-chart.d.ts +18 -1
  25. package/types/foxeltech-angular-ui-flow.d.ts +7 -0
  26. package/types/foxeltech-angular-ui.d.ts +309 -8
  27. package/utilities.css +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"foxeltech-angular-ui.mjs","sources":["../../../projects/ui/src/lib/core/components/base.component.ts","../../../projects/ui/src/lib/ui/components/hero-icon/hero-icon.component.ts","../../../projects/ui/src/lib/ui/components/hero-icon/hero-icon.component.html","../../../projects/ui/src/lib/ui/components/toast/toast.component.ts","../../../projects/ui/src/lib/ui/components/toast/toast.component.html","../../../projects/ui/src/lib/ui/components/toast-container/toast-container.component.ts","../../../projects/ui/src/lib/ui/components/toast-container/toast-container.component.html","../../../projects/ui/src/lib/core/services/toastr.service.ts","../../../projects/ui/src/lib/core/utils.ts","../../../projects/ui/src/lib/core/services/http-wrapper.service.ts","../../../projects/ui/src/lib/core/components/base-table.component.ts","../../../projects/ui/src/lib/core/components/base-master-detail.component.ts","../../../projects/ui/src/lib/core/components/base-dialog.component.ts","../../../projects/ui/src/lib/core/services/loading.service.ts","../../../projects/ui/src/lib/core/services/route-skeleton.service.ts","../../../projects/ui/src/lib/core/services/storage.service.ts","../../../projects/ui/src/lib/core/resolvers/fx-list.resolver.ts","../../../projects/ui/src/lib/core/services/api-factory.ts","../../../projects/ui/src/lib/core/services/realtime-table-sync.ts","../../../projects/ui/src/lib/core/value-tone.util.ts","../../../projects/ui/src/lib/core/feature-flags.ts","../../../projects/ui/src/lib/core/validators.ts","../../../projects/ui/src/lib/translation/translation.module.ts","../../../projects/ui/src/lib/translation/translation.service.ts","../../../projects/ui/src/lib/core/services/permissions.service.ts","../../../projects/ui/src/lib/core/directives/has-permission.directive.ts","../../../projects/ui/src/lib/core/directives/trim.directive.ts","../../../projects/ui/src/lib/core/guards/permissions.guard.ts","../../../projects/ui/src/lib/core/services/auth-state.service.ts","../../../projects/ui/src/lib/core/interceptors/auth.interceptor.ts","../../../projects/ui/src/lib/core/services/breadcrumb.service.ts","../../../projects/ui/src/lib/core/services/theme.service.ts","../../../projects/ui/src/lib/core/services/notification.service.ts","../../../projects/ui/src/lib/ui/components/button/button.component.ts","../../../projects/ui/src/lib/ui/components/button/button.component.html","../../../projects/ui/src/lib/ui/dialogs/confirmation/confirmation.component.ts","../../../projects/ui/src/lib/ui/dialogs/confirmation/confirmation.component.html","../../../projects/ui/src/lib/core/services/dialog.service.ts","../../../projects/ui/src/lib/ui/components/fx-component.component.ts","../../../projects/ui/src/lib/ui/components/checkbox/checkbox.component.ts","../../../projects/ui/src/lib/ui/components/checkbox/checkbox.component.html","../../../projects/ui/src/lib/ui/components/circle-progress-bar/circle-progress-bar.component.ts","../../../projects/ui/src/lib/ui/components/circle-progress-bar/circle-progress-bar.component.html","../../../projects/ui/src/lib/ui/components/datetime-picker/datetime-picker.component.ts","../../../projects/ui/src/lib/ui/components/datetime-picker/datetime-picker.component.html","../../../projects/ui/src/lib/ui/components/dnd-upload/dnd-upload.component.ts","../../../projects/ui/src/lib/ui/components/dnd-upload/dnd-upload.component.html","../../../projects/ui/src/lib/ui/components/input/input.component.ts","../../../projects/ui/src/lib/ui/components/input/input.component.html","../../../projects/ui/src/lib/ui/components/loading-panel/loading-panel.component.ts","../../../projects/ui/src/lib/ui/components/loading-panel/loading-panel.component.html","../../../projects/ui/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.ts","../../../projects/ui/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.html","../../../projects/ui/src/lib/ui/components/radio-button/radio-button.component.ts","../../../projects/ui/src/lib/ui/components/radio-button/radio-button.component.html","../../../projects/ui/src/lib/ui/components/search-bar/search-bar.component.ts","../../../projects/ui/src/lib/ui/components/search-bar/search-bar.component.html","../../../projects/ui/src/lib/ui/components/select/select.component.ts","../../../projects/ui/src/lib/ui/components/select/select.component.html","../../../projects/ui/src/lib/ui/components/slider/slider.component.ts","../../../projects/ui/src/lib/ui/components/slider/slider.component.html","../../../projects/ui/src/lib/ui/components/switch/switch.component.ts","../../../projects/ui/src/lib/ui/components/switch/switch.component.html","../../../projects/ui/src/lib/ui/components/tab-component/tab.component.ts","../../../projects/ui/src/lib/ui/components/tab-group/tab-group.component.ts","../../../projects/ui/src/lib/ui/components/tab-group/tab-group.component.html","../../../projects/ui/src/lib/ui/components/table-cell/table-cell.component.ts","../../../projects/ui/src/lib/ui/components/table-cell/table-cell.component.html","../../../projects/ui/src/lib/ui/components/tag/tag.component.ts","../../../projects/ui/src/lib/ui/components/tag/tag.component.html","../../../projects/ui/src/lib/ui/components/tree-diagram/tree-diagram.component.ts","../../../projects/ui/src/lib/ui/components/tree-diagram/tree-diagram.component.html","../../../projects/ui/src/lib/ui/components/kanban-board/kanban-board.component.ts","../../../projects/ui/src/lib/ui/components/kanban-board/kanban-board.component.html","../../../projects/ui/src/lib/ui/components/drawer/drawer.component.ts","../../../projects/ui/src/lib/ui/components/drawer/drawer.component.html","../../../projects/ui/src/lib/ui/components/skeleton-list/skeleton-list.component.ts","../../../projects/ui/src/lib/ui/components/skeleton-list/skeleton-list.component.html","../../../projects/ui/src/lib/ui/components/skeleton-detail/skeleton-detail.component.ts","../../../projects/ui/src/lib/ui/components/skeleton-detail/skeleton-detail.component.html","../../../projects/ui/src/lib/ui/components/sparkbar/sparkbar.component.ts","../../../projects/ui/src/lib/ui/components/sparkbar/sparkbar.component.html","../../../projects/ui/src/lib/ui/components/stat-cards/stat-cards.component.ts","../../../projects/ui/src/lib/ui/components/stat-cards/stat-cards.component.html","../../../projects/ui/src/lib/ui/components/empty-state/empty-state.component.ts","../../../projects/ui/src/lib/ui/components/empty-state/empty-state.component.html","../../../projects/ui/src/lib/ui/components/filter-chips/filter-chips.component.ts","../../../projects/ui/src/lib/ui/components/filter-chips/filter-chips.component.html","../../../projects/ui/src/lib/ui/components/filter-pills/filter-pills.component.ts","../../../projects/ui/src/lib/ui/components/filter-pills/filter-pills.component.html","../../../projects/ui/src/lib/ui/components/stage-dots/stage-dots.component.ts","../../../projects/ui/src/lib/ui/components/stage-dots/stage-dots.component.html","../../../projects/ui/src/lib/ui/components/code-block/code-block.component.ts","../../../projects/ui/src/lib/ui/components/code-block/code-block.component.html","../../../projects/ui/src/lib/ui/components/screenshot-frame/screenshot-frame.component.ts","../../../projects/ui/src/lib/ui/components/screenshot-frame/screenshot-frame.component.html","../../../projects/ui/src/lib/ui/components/meter/meter.component.ts","../../../projects/ui/src/lib/ui/components/meter/meter.component.html","../../../projects/ui/src/lib/ui/components/section-card/section-card.component.ts","../../../projects/ui/src/lib/ui/components/section-card/section-card.component.html","../../../projects/ui/src/lib/ui/components/info-field/info-field.component.ts","../../../projects/ui/src/lib/ui/components/info-field/info-field.component.html","../../../projects/ui/src/lib/ui/components/severity-badges/severity-badges.component.ts","../../../projects/ui/src/lib/ui/components/severity-badges/severity-badges.component.html","../../../projects/ui/src/lib/ui/components/master-detail/master-detail.component.ts","../../../projects/ui/src/lib/ui/components/master-detail/master-detail.component.html","../../../projects/ui/src/lib/ui/components/menu/menu.component.ts","../../../projects/ui/src/lib/ui/components/menu/menu.component.html","../../../projects/ui/src/lib/ui/components/theme-picker/theme-picker.component.ts","../../../projects/ui/src/lib/ui/components/theme-picker/theme-picker.component.html","../../../projects/ui/src/lib/ui/components/pending-badge/pending-badge.component.ts","../../../projects/ui/src/lib/ui/components/pending-badge/pending-badge.component.html","../../../projects/ui/src/lib/ui/components/sample-frame/sample-frame.component.ts","../../../projects/ui/src/lib/ui/components/sample-frame/sample-frame.component.html","../../../projects/ui/src/lib/ui/components/score-badge/score-badge.component.ts","../../../projects/ui/src/lib/ui/components/score-badge/score-badge.component.html","../../../projects/ui/src/lib/ui/components/status-dot/status-dot.component.ts","../../../projects/ui/src/lib/ui/components/status-dot/status-dot.component.html","../../../projects/ui/src/lib/ui/components/segmented/segmented.component.ts","../../../projects/ui/src/lib/ui/components/segmented/segmented.component.html","../../../projects/ui/src/lib/ui/components/list-row/list-row.component.ts","../../../projects/ui/src/lib/ui/components/list-row/list-row.component.html","../../../projects/ui/src/lib/ui/components/bar-list/bar-list.component.ts","../../../projects/ui/src/lib/ui/components/bar-list/bar-list.component.html","../../../projects/ui/src/lib/ui/components/facets-rail/facets-rail.component.ts","../../../projects/ui/src/lib/ui/components/facets-rail/facets-rail.component.html","../../../projects/ui/src/lib/ui/components/project-card/project-card.component.ts","../../../projects/ui/src/lib/ui/components/project-card/project-card.component.html","../../../projects/ui/src/lib/ui/components/pipeline-stepper/pipeline-stepper.component.ts","../../../projects/ui/src/lib/ui/components/pipeline-stepper/pipeline-stepper.component.html","../../../projects/ui/src/lib/ui/components/skeleton-facets/skeleton-facets.component.ts","../../../projects/ui/src/lib/ui/components/skeleton-facets/skeleton-facets.component.html","../../../projects/ui/src/lib/ui/components/skeleton-dashboard/skeleton-dashboard.component.ts","../../../projects/ui/src/lib/ui/components/skeleton-dashboard/skeleton-dashboard.component.html","../../../projects/ui/src/lib/ui/components/route-skeleton/route-skeleton.component.ts","../../../projects/ui/src/lib/ui/components/route-skeleton/route-skeleton.component.html","../../../projects/ui/src/lib/ui/components/skeleton-frame/skeleton-frame.component.ts","../../../projects/ui/src/lib/ui/components/skeleton-frame/skeleton-frame.component.html","../../../projects/ui/src/lib/ui/components/index.ts","../../../projects/ui/src/lib/ui/dialogs/index.ts","../../../projects/ui/src/lib/ui/ui.module.ts","../../../projects/ui/src/public-api.ts","../../../projects/ui/src/foxeltech-angular-ui.ts"],"sourcesContent":["import { DestroyRef, Directive, Injector, OnDestroy, inject } from '@angular/core';\n\n@Directive()\nexport abstract class BaseComponent implements OnDestroy {\n protected injector: Injector;\n /** Teardown hook for subscriptions: takeUntilDestroyed(this.destroyRef). */\n protected destroyRef = inject(DestroyRef);\n\n constructor(injector?: Injector) {\n // Some subclasses historically passed non-injector values (e.g. dialog\n // data) to super(); fall back to the component's own injector so\n // this.injector.get(...) always works.\n this.injector = injector instanceof Injector ? injector : inject(Injector);\n }\n\n // eslint-disable-next-line @angular-eslint/no-empty-lifecycle-method -- subclasses across host apps call super.ngOnDestroy(); removing this breaks them at runtime\n ngOnDestroy(): void {}\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n InjectionToken,\n inject,\n isDevMode,\n input\n} from '@angular/core';\n\n/**\n * Where the generated Heroicons sprite is served from. Defaults to\n * 'fx-icons.svg' at the app base — consumers copy it from the package via an\n * angular.json assets glob (same pattern as the lib fonts):\n * { \"input\": \"node_modules/@foxeltech/angular-ui\", \"glob\": \"fx-icons.svg\", \"output\": \".\" }\n */\nexport const FX_ICON_SPRITE_URL = new InjectionToken<string>('FX_ICON_SPRITE_URL', {\n providedIn: 'root',\n factory: () => 'fx-icons.svg',\n});\n\nlet spriteChecked = false;\n\n/**\n * Heroicons rendered from the self-hosted sprite (see\n * scripts/generate-icon-sprite.mjs) — every 24px outline/solid icon is\n * available by name with no per-icon registration and no runtime icon\n * library. API kept compatible with the old @dimaslz/ng-heroicons wrapper.\n */\n@Component({\n selector: 'fx-ui-hero-icon',\n templateUrl: './hero-icon.component.html',\n styleUrl: './hero-icon.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeroIconComponent {\n readonly stroke = input(1.5);\n readonly icon = input<string>();\n readonly solid = input<boolean>();\n readonly outline = input<boolean>();\n readonly size = input<number>();\n readonly color = input<string>();\n readonly class = input<string>();\n\n readonly spriteUrl = inject(FX_ICON_SPRITE_URL);\n\n constructor() {\n // One warning per app when the sprite asset was not copied — otherwise\n // every icon just renders blank and nobody knows why.\n if (isDevMode() && !spriteChecked && typeof fetch === 'function') {\n spriteChecked = true;\n fetch(this.spriteUrl, { method: 'HEAD' })\n .then((r) => {\n if (!r.ok) throw new Error(String(r.status));\n })\n .catch(() =>\n console.warn(\n `[fx-ui-hero-icon] Sprite '${this.spriteUrl}' not found — add the fx-icons.svg ` +\n `assets glob from @foxeltech/angular-ui to angular.json (see FX_ICON_SPRITE_URL docs).`,\n ),\n );\n }\n }\n\n get href(): string {\n const name = this.solid() ? `${this.icon()}-solid` : this.icon();\n return `${this.spriteUrl}#${name}`;\n }\n}\n","<svg\n [attr.width]=\"size() || 24\"\n [attr.height]=\"size() || 24\"\n [attr.stroke-width]=\"solid() ? null : stroke()\"\n [style.color]=\"color() || null\"\n [class]=\"class()\"\n aria-hidden=\"true\"\n>\n <use [attr.href]=\"href\" />\n</svg>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n@Component({\n selector: 'fx-ui-toast',\n templateUrl: './toast.component.html',\n styleUrl: './toast.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, HeroIconComponent],\n})\nexport class ToastComponent {\n readonly toastId = input.required<number>();\n @Input() title?: string = '';\n readonly message = input('');\n readonly type = input<'success' | 'error' | 'info' | 'warning'>();\n}\n","<div\n animate.enter=\"horizontal-fade-in-animation\"\n animate.leave=\"horizontal-fade-out-animation\"\n [attr.role]=\"type() === 'error' ? 'alert' : 'status'\"\n class=\"flex border-l-[3px] items-center bg-bg-primary gap-semi min-w-[250px] max-w-[400px] px-large py-semi rounded shadow-lg transition-all duration-300 ease-in-out transform opacity-100 translate-y-0\"\n [ngClass]=\"{\n 'tone-border-success': type() === 'success',\n 'tone-border-danger': type() === 'error',\n 'border-warning': type() === 'warning',\n 'border-information': type() === 'info'\n }\"\n >\n <div class=\"\" aria-hidden=\"true\">\n @switch (type()) { @case('success') {\n <fx-ui-hero-icon\n icon=\"check-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"tone-fg-success\"\n ></fx-ui-hero-icon>\n } @case('error') {\n <fx-ui-hero-icon\n icon=\"exclamation-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"tone-fg-danger\"\n ></fx-ui-hero-icon>\n } @case('warning') {\n <fx-ui-hero-icon\n icon=\"exclamation-triangle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"tone-fg-warning\"\n ></fx-ui-hero-icon>\n } @default {\n <fx-ui-hero-icon\n icon=\"information-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"tone-fg-information\"\n ></fx-ui-hero-icon>\n } }\n </div>\n\n <div class=\"flex flex-col\">\n @if (title) {\n <strong class=\"txt-field-label\">{{ title }}</strong>\n }\n <p class=\"txt-default\">{{ message() }}</p>\n </div>\n </div>\n","import { ChangeDetectorRef, Component, ChangeDetectionStrategy } from '@angular/core';\nimport { ToastComponent } from '../toast/toast.component';\n// import { ToastData } from '../../../../public-api';\n\n@Component({\n selector: 'fx-ui-toast-container',\n templateUrl: './toast-container.component.html',\n styleUrl: './toast-container.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ToastComponent],\n})\nexport class ToastContainerComponent {\n toasts: any[] = [];\n\n constructor(private ref: ChangeDetectorRef) {}\n\n addToast(toast: any) {\n this.toasts.push(toast);\n this.ref.detectChanges()\n setTimeout(() => this.removeToast(toast.id), 3000);\n }\n\n removeToast(id: number) {\n this.toasts = this.toasts.filter(t => t.id !== id);\n this.ref.detectChanges();\n }\n}\n","<div\n class=\"fixed top-5 right-5 flex flex-col items-end gap-3 z-[10000] pointer-events-none\"\n>\n @for (toast of toasts; track toast) {\n <fx-ui-toast\n class=\"pointer-events-auto\"\n [toastId]=\"toast.id\"\n [message]=\"toast.message\"\n [title]=\"toast.title\"\n [type]=\"toast.type\"\n ></fx-ui-toast>\n }\n</div>","import { Injectable, ApplicationRef, ComponentRef, Injector, createComponent } from '@angular/core';\nimport { ToastContainerComponent } from '../../ui/components/toast-container/toast-container.component';\n\nexport interface ToastData {\n id: number;\n message: string;\n title?: string;\n type: 'success' | 'error' | 'info' | 'warning';\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FxToastrService {\n private containerRef?: ComponentRef<ToastContainerComponent>;\n private idCounter = 0;\n private recentMessages = new Set<string>();\n\n constructor(private appRef: ApplicationRef) {\n this.ensureContainerExists();\n }\n\n private ensureContainerExists() {\n if (!this.containerRef) {\n this.containerRef = createComponent(ToastContainerComponent, {\n environmentInjector: this.appRef.injector,\n });\n\n this.appRef.attachView(this.containerRef.hostView);\n document.body.appendChild(this.containerRef.location.nativeElement);\n }\n }\n\n private show(message: string, type: ToastData['type'], title?: string) {\n const dedupeKey = `${type}:${message}`;\n if (this.recentMessages.has(dedupeKey)) {\n return;\n }\n this.recentMessages.add(dedupeKey);\n setTimeout(() => this.recentMessages.delete(dedupeKey), 2000);\n\n const toast: ToastData = {\n id: ++this.idCounter,\n message,\n title,\n type,\n };\n\n this.containerRef?.instance.addToast(toast);\n }\n\n success(message: string, title?: string) {\n this.show(message, 'success', title);\n }\n\n error(message: string, title?: string) {\n this.show(message, 'error', title);\n }\n\n info(message: string, title?: string) {\n this.show(message, 'info', title);\n }\n\n warning(message: string, title?: string) {\n this.show(message, 'warning', title);\n }\n}\n","import { Observable, firstValueFrom } from 'rxjs';\nimport { NgForm } from '@angular/forms';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { TagType } from '../../public-api';\n\nexport class FxUtils {\n /** Dot-path accessor (lodash _.get replacement — supports 'a.b.c'). */\n static get(obj: any, path: string, defaultValue?: any): any {\n if (obj == null) return defaultValue;\n let cur: any = obj;\n for (const key of path.split('.')) {\n if (cur == null) return defaultValue;\n cur = cur[key];\n }\n return cur === undefined ? defaultValue : cur;\n }\n\n /** Dot-path setter (lodash _.set replacement — creates missing objects). */\n static set(obj: any, path: string, value: any): any {\n const keys = path.split('.');\n let cur: any = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n if (cur[keys[i]] == null || typeof cur[keys[i]] !== 'object') cur[keys[i]] = {};\n cur = cur[keys[i]];\n }\n cur[keys[keys.length - 1]] = value;\n return obj;\n }\n\n /** Structural equality (lodash _.isEqual replacement for plain data). */\n static deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n if (a == null || b == null || typeof a !== 'object' || typeof b !== 'object') return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n const ka = Object.keys(a);\n const kb = Object.keys(b);\n if (ka.length !== kb.length) return false;\n return ka.every((k) => FxUtils.deepEqual(a[k], b[k]));\n }\n\n /** Deep clone for plain data (objects/arrays/Date); functions stay by reference. */\n static cloneDeep<T>(v: T): T {\n if (v === null || typeof v !== 'object') return v;\n if (v instanceof Date) return new Date(v.getTime()) as any;\n if (Array.isArray(v)) return v.map((x) => FxUtils.cloneDeep(x)) as any;\n const out: any = {};\n for (const k of Object.keys(v as any)) out[k] = FxUtils.cloneDeep((v as any)[k]);\n return out;\n }\n\n private static async preresolve(promises: any, value: any, key?: string) {\n if (key === 'callback' || key === 'socket' || key === 'listener') {\n promises.push(value);\n return;\n }\n if (value instanceof Function) {\n this.preresolve(promises, value());\n } else if (value instanceof Array) {\n const inpromises: any = [];\n value.forEach((v) => {\n this.preresolve(inpromises, v);\n });\n promises.push(Promise.all(inpromises));\n } else if (value instanceof Observable) {\n promises.push(firstValueFrom(value));\n } else if (value instanceof Promise) {\n promises.push(value);\n } else if (value instanceof Object) {\n promises.push(this.resolve(value));\n } else {\n promises.push(value);\n }\n }\n\n static async resolve(value: object) {\n const keys = [];\n const promises: any = [];\n for (const i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n keys.push(i);\n this.preresolve(promises, (value as any)[i], i);\n }\n }\n const values = await Promise.all(promises);\n const raw = {};\n keys.forEach((key: string, index: number) => {\n FxUtils.set(raw, key, values[index]);\n });\n return raw;\n }\n\n static isNotNull(obj: any): boolean {\n return !this.isNull(obj);\n }\n\n static isNull(obj: any): boolean {\n return obj === undefined || obj === null;\n }\n\n static isFunction(obj: any): boolean {\n return this.isNotNull(obj) && obj instanceof Function;\n }\n\n static isNotFunction(obj: any): boolean {\n return !this.isFunction(obj);\n }\n\n static isStringEmpty(obj: string): boolean {\n return this.isNull(obj) || obj === '';\n }\n\n static isStringNotEmpty(obj: string): boolean {\n return !this.isStringEmpty(obj);\n }\n\n static isArrayEmpty(obj: any[]): boolean {\n return this.isNull(obj) || obj.length === 0;\n }\n\n static isArrayNotEmpty(obj: any[]): boolean {\n return !this.isArrayEmpty(obj);\n }\n\n static replaceStartWithAsterisk(inputString: string, numToReplace: number): string {\n if (numToReplace >= inputString.length) {\n return '*'.repeat(inputString.length);\n } else if (numToReplace <= 0) {\n return inputString;\n } else {\n const asterisks = '*'.repeat(numToReplace);\n const remainingString = inputString.substring(numToReplace);\n return asterisks + remainingString;\n }\n }\n\n static checkInvalidField(form: NgForm): void {\n Object.keys(form.controls).forEach((field) => {\n const control = form.controls[field];\n control.markAsTouched({ onlySelf: true });\n });\n }\n\n static checkInlineErrorField(err: any, f: NgForm) {\n if (err) {\n Object.keys(err).forEach((field) => {\n const formControl = f.form.get(field);\n\n if (formControl) {\n const error = { apiError: err[field] };\n formControl.setErrors(error);\n }\n });\n }\n }\n\n static isSameCollection(collection: any[], compareCollection: any): boolean {\n const a = new Set(collection ?? []);\n const b = new Set(compareCollection ?? []);\n return a.size === b.size && [...a].every((x) => b.has(x));\n }\n\n static isSameValue(model: any, compareModel: any) {\n return FxUtils.deepEqual(model, compareModel);\n }\n\n static parseError(err: HttpErrorResponse) {\n const status = err?.status;\n\n switch (status) {\n case 401:\n return 'Session timeout. Please login again.';\n case 403:\n return 'You do not have permission to perform this action.';\n case 404:\n return 'The requested resource was not found.';\n case 408:\n return 'The request timed out. Please try again.';\n case 409:\n return 'A conflict occurred. Please refresh and try again.';\n case 413:\n return 'The uploaded data is too large.';\n case 415:\n return 'Unsupported media type. Please check the file format.';\n case 429:\n return 'Too many requests. Please wait a moment and try again.';\n case 500:\n return 'An internal server error occurred. Please try again later.';\n case 502:\n return 'The server is temporarily unavailable. Please try again later.';\n case 503:\n return 'The service is currently unavailable. Please try again later.';\n case 504:\n return 'The server took too long to respond. Please try again later.';\n }\n\n const message = this.isStringEmpty(err?.error?.errors ?? '')\n ? (err?.error?.message ?? 'Unknown Error')\n : err?.error?.errors;\n\n if (this.isStringEmpty(err?.error?.code)) {\n return message;\n }\n return `${err?.error?.code}: ${message}`;\n }\n\n /**\n * Resolve a theme channel triple (`--danger: 255 122 0`) to a CSS colour.\n * Pass `legacyCommaSyntax: true` for canvas/ECharts consumers: canvas paints\n * both forms, but zrender's colour parser can't read the CSS4 space syntax\n * and renders slices black on hover when given it.\n */\n static convertColorFromVariable(\n name: string,\n alpha = 1,\n options?: { legacyCommaSyntax?: boolean },\n ): string {\n const value = getComputedStyle(document.body)\n .getPropertyValue(name)\n .trim()\n .replace(/\\s+/g, ' ');\n if (options?.legacyCommaSyntax) {\n const [r, g, b] = value.replace(/[/,]/g, ' ').split(/\\s+/).filter(Boolean);\n if (r === undefined || g === undefined || b === undefined) {\n return `rgba(148, 163, 184, ${alpha})`;\n }\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n return value ? `rgba(${value} / ${alpha})` : `rgba(255 255 255 / ${alpha})`;\n }\n\n /**\n * Status/severity string → tag tone.\n *\n * Coerces instead of trusting the argument: every caller feeds this raw API\n * values, and a numeric or null field used to throw\n * \"key.toLowerCase is not a function\" and take the whole screen down.\n * Non-string input simply falls through to the default tone.\n */\n static getTagClass(key: string, isCriticalExist = true): TagType {\n switch (String(key ?? '').toLowerCase()) {\n case 'error':\n case 'failed':\n case 'inactive':\n case 'critical':\n case 'stopped':\n return 'critical';\n case 'high':\n if (!isCriticalExist) {\n return 'critical';\n }\n return 'danger';\n case 'inprogress':\n case 'processing':\n case 'paused':\n case 'medium':\n case 'warning':\n return 'warning';\n case 'completed':\n case 'success':\n case 'active':\n case 'low':\n case 'running':\n return 'success';\n case 'queue':\n case 'waiting':\n case 'info':\n case 'system':\n return 'information';\n case 'discovery':\n return 'discovery';\n case 'disabled':\n default:\n return 'default';\n }\n }\n\n static validateEmail(value: string) {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n const isEmail = emailRegex.test(value);\n return isEmail;\n }\n\n /** Safe deep accessor with the org-wide empty placeholder. */\n static value(model: any, key: string, defaultValue: any = '---') {\n return FxUtils.get(model, key, defaultValue);\n }\n\n /**\n * Severity weight for ordering — kept next to getTagClass so ordering and\n * colouring can never drift apart.\n */\n static severityWeight(level: string): number {\n switch (String(level ?? '').toUpperCase()) {\n case 'CRITICAL':\n return 5;\n case 'HIGH':\n return 4;\n case 'MEDIUM':\n return 3;\n case 'LOW':\n return 2;\n case 'INFO':\n case 'INFORMATION':\n return 1;\n default:\n return 0;\n }\n }\n\n /** Org-wide date-time rendering (DD/MM/YYYY HH:mm:ss, local time). */\n static formatDateTime(time: string | Date): string {\n if (FxUtils.isNull(time)) return '';\n const d = time instanceof Date ? time : new Date(String(time).replace(' ', 'T'));\n if (isNaN(d.getTime())) return '';\n const p = (n: number) => String(n).padStart(2, '0');\n return `${p(d.getDate())}/${p(d.getMonth() + 1)}/${d.getFullYear()} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;\n }\n\n /** Seconds → compact duration (\"2d 4h\", \"3h 12m\", \"45s\"). */\n static formatDuration(totalSeconds: number): string {\n const sec = Number(totalSeconds);\n if (!Number.isFinite(sec) || sec < 0) return '';\n const d = Math.floor(sec / 86400);\n const h = Math.floor((sec % 86400) / 3600);\n const m = Math.floor((sec % 3600) / 60);\n const s = Math.floor(sec % 60);\n if (d > 0) return h > 0 ? `${d}d ${h}h` : `${d}d`;\n if (h > 0) return m > 0 ? `${h}h ${m}m` : `${h}h`;\n if (m > 0) return s > 0 ? `${m}m ${s}s` : `${m}m`;\n return `${s}s`;\n }\n\n /** Relative time within the last 24h (\"3 hours ago\"), else DD/MM/YYYY. */\n static formatRelative(time: string | Date): string {\n if (FxUtils.isNull(time)) return '';\n const d = time instanceof Date ? time : new Date(String(time).replace(' ', 'T'));\n if (isNaN(d.getTime())) return '';\n const diffMs = Date.now() - d.getTime();\n if (diffMs < 24 * 3600_000) {\n // Same wording moment.fromNow() produced for the < 24h range.\n const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });\n const mins = Math.round(diffMs / 60_000);\n if (Math.abs(mins) < 60) return rtf.format(-mins, 'minute');\n return rtf.format(-Math.round(mins / 60), 'hour');\n }\n const p = (n: number) => String(n).padStart(2, '0');\n return `${p(d.getDate())}/${p(d.getMonth() + 1)}/${d.getFullYear()}`;\n }\n\n /**\n * Normalize a snake_case + protobuf-Long API payload for camelCase binding:\n * - genuine snake_case keys -> camelCase (data-as-key entries such as DLL\n * names like \"kernel32.dll\" are left untouched by the strict regex);\n * - Long-encoded numbers `{ high, low, unsigned }` -> plain number.\n */\n static camelizeDeep(input: any): any {\n if (Array.isArray(input)) {\n return input.map((v) => FxUtils.camelizeDeep(v));\n }\n if (input !== null && typeof input === 'object') {\n const keys = Object.keys(input);\n if (\n keys.length === 3 &&\n keys.includes('high') &&\n keys.includes('low') &&\n keys.includes('unsigned')\n ) {\n const high = Number((input as any).high) || 0;\n const low = Number((input as any).low) || 0;\n return high * 4294967296 + (low >>> 0);\n }\n const out: any = {};\n for (const k of keys) {\n const nk = /^[a-z][a-z0-9]*(_[a-z0-9]+)+$/.test(k) ? k.replace(/_([a-z0-9])/g, (_m, c) => c.toUpperCase()) : k;\n out[nk] = FxUtils.camelizeDeep((input as any)[k]);\n }\n return out;\n }\n return input;\n }\n\n static formatSizeUnits(bytes: number) {\n if (bytes >= 1073741824) {\n return (bytes / 1073741824).toFixed(2) + ' GB';\n } else if (bytes >= 1048576) {\n return (bytes / 1048576).toFixed(2) + ' MB';\n } else if (bytes >= 1024) {\n return (bytes / 1024).toFixed(2) + ' KB';\n } else if (bytes > 1) {\n return bytes + ' bytes';\n } else if (bytes == 1) {\n return bytes + ' byte';\n }\n return '0 bytes';\n }\n}\n","import { HttpClient, HttpEvent, HttpHeaders, HttpRequest } from '@angular/common/http';\nimport { Observable, firstValueFrom } from 'rxjs';\n\nexport class HttpWrapper {\n constructor(public http: HttpClient, public baseURL: string) {}\n\n /**\n * Hook applied to every resolved response (get/post/put/delete and all verb\n * helpers built on them). Default is identity; override to normalize a\n * backend convention once (e.g. FxUtils.camelizeDeep for snake_case +\n * protobuf-Long payloads) instead of wrapping each method.\n */\n protected transformResponse(res: any): any {\n return res;\n }\n\n private addCredentials(options: any = {}): any {\n return {\n withCredentials: true,\n ...options,\n };\n }\n\n async get(url = '', params?: any): Promise<any> {\n const options = {\n withCredentials: true,\n params: {\n ...params,\n },\n };\n return this.transformResponse(await firstValueFrom(this.http.get(this.baseURL + url, options)));\n }\n\n async post(url: string, body: any = {}, options: any = {}): Promise<any> {\n return this.transformResponse(\n await firstValueFrom(this.http.post(this.baseURL + url, body, this.addCredentials(options))),\n );\n }\n\n async put(url: string, body: any, options: any = {}): Promise<any> {\n return this.transformResponse(\n await firstValueFrom(this.http.put(this.baseURL + url, body, this.addCredentials(options))),\n );\n }\n\n async delete(url: string, options: any = {}): Promise<any> {\n return this.transformResponse(\n await firstValueFrom(this.http.delete(this.baseURL + url, this.addCredentials(options))),\n );\n }\n\n upload(url: string, body: FormData, options: any = {}): Observable<HttpEvent<any>> {\n const req = new HttpRequest(\n 'POST',\n this.baseURL + url,\n body,\n {\n reportProgress: true,\n ...this.addCredentials(options)\n }\n );\n\n return this.http.request(req);\n }\n\n async search(params: any = {}) {\n return await this.get('/search', params);\n }\n\n async detail(params: any) {\n return await this.get(`/detail`, params);\n }\n\n async remove(params: any = {}) {\n return await this.delete(`/remove`, params);\n }\n\n async create(data: any) {\n return await this.post(`/create`, data);\n }\n\n async updateInfo(data: any, params?: any) {\n return await this.put(`/update-info`, data, { params: params });\n }\n\n async updateStatus(data: any, params?: any) {\n return await this.put(`/update-status`, data, { params: params });\n }\n\n async update(data: any, params?: any) {\n return await this.put(`/update`, data, { params: params });\n }\n\n async single(code: string) {\n return await this.post(`/${code}`, {});\n }\n\n async selectize() {\n return await this.post('/search', {});\n }\n\n async fetch(filter: any = {}, params: any = {}) {\n return await this.post('', filter, { params: params });\n }\n\n async published(idOrCode: string) {\n return await this.post(`/published/${idOrCode}`);\n }\n\n async unpublished(idOrCode: string) {\n return await this.post(`/unpublished/${idOrCode}`);\n }\n\n async terminated(idOrCode: string) {\n return await this.post(`/terminated/${idOrCode}`);\n }\n\n async disable(params: any) {\n return await this.post(`/disable`, params);\n }\n}\n","import { AfterViewInit, Directive, Injector, OnInit, Type, ViewChild, viewChild } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\nimport { MatTable, MatTableDataSource } from '@angular/material/table';\nimport { BaseComponent } from './base.component';\nimport { HttpWrapper } from '../services/http-wrapper.service';\nimport { FxToastrService } from '../services/toastr.service';\nimport { ChangeDetectorRef } from '@angular/core';\nimport { FxUtils } from '../utils';\nimport { Subject, debounceTime, distinctUntilChanged, firstValueFrom } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport interface TableResult<T> {\n data: T[];\n total: number;\n}\n\n/**\n * Filter bag for BaseTable screens. The platform-wide keys are declared so\n * templates keep dot access under noPropertyAccessFromIndexSignature;\n * screen-specific keys ride on the index signature (bracket access).\n */\nexport interface FxTableFilters {\n keyword?: string;\n status?: string;\n statuses?: string[];\n severity?: string;\n riskLevel?: string;\n priority?: string;\n category?: string;\n integrityLevel?: string;\n tags?: string[];\n name?: string;\n groupId?: string;\n [key: string]: any;\n}\n\n@Directive()\nexport class BaseTableComponent<T = any> extends BaseComponent implements OnInit, AfterViewInit {\n dataSource = new MatTableDataSource<T>();\n cols: string[] = [];\n total = 0;\n page = 0;\n pageSize = 10;\n filters: FxTableFilters = {};\n loading = false;\n expandedElement: T | null;\n toastr: FxToastrService;\n public _lock = false;\n keywordChange$ = new Subject<string>();\n dataSourcePlaceholder: any[];\n public config: {\n create?: {\n dialog?: Type<{}>;\n size?: string;\n disableClose?: boolean;\n label?: string;\n title?: string;\n message?: string;\n };\n update?: {\n dialog?: Type<{}>;\n size?: string;\n disableClose?: boolean;\n label?: string;\n title?: string;\n message?: string;\n };\n view?: {\n dialog?: Type<{}>;\n size?: string;\n disableClose?: boolean;\n label?: string;\n title?: string;\n message?: string;\n };\n delete?: {\n dialog?: Type<{}>;\n title?: string;\n message?: string;\n cancelTitle?: string;\n confirmTitle?: string;\n };\n updateStatus?: {\n message?: string;\n };\n };\n\n @ViewChild(MatPaginator) paginator!: MatPaginator;\n readonly table = viewChild.required(MatTable);\n\n constructor(\n injector: Injector,\n public api: HttpWrapper,\n public modal: MatDialog,\n public ref: ChangeDetectorRef,\n ) {\n super(injector);\n this.toastr = injector.get(FxToastrService);\n }\n\n ngOnInit(): void {\n this.keywordChange$\n .pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe(async () => {\n await this.refresh();\n });\n this.dataSourcePlaceholder = Array(this.pageSize).fill({});\n this.init();\n }\n\n public init() {}\n\n ngAfterViewInit(): void {\n if (this.paginator && this.paginator.page) {\n this.paginator.page.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n this.onPageChange(event);\n });\n }\n this.ref.detectChanges();\n }\n\n public async refresh(): Promise<void> {\n this.page = 0;\n if (this.paginator) {\n this.paginator.pageIndex = 0;\n }\n await this.fetch();\n }\n\n /**\n * Where the list is fetched from. Default (null) keeps the legacy behavior\n * of calling `api.search()` (GET /search) untouched. Subclasses whose list\n * lives elsewhere override this instead of re-implementing fetch() — and\n * keep the stale-response sequence guard for free.\n */\n protected listRequest(): { method: 'get' | 'post'; url: string } | null {\n return null;\n }\n\n /** Result keys the list/total are read from. Override alongside listRequest(). */\n protected listKey = 'data';\n protected totalKey = 'total';\n\n public setDataSource(result: any): void {\n this.dataSource.data = FxUtils.get(result, this.listKey);\n this.total = FxUtils.get(result, this.totalKey);\n }\n\n private _fetchSeq = 0;\n\n public async fetch(): Promise<void> {\n // Sequence guard: without it a slow earlier request could resolve after\n // a newer one and overwrite the table with stale data.\n const seq = ++this._fetchSeq;\n this.loading = true;\n try {\n const params = { page: (this.page ?? 0) + 1, pageSize: this.pageSize, ...this.filters };\n const req = this.listRequest();\n const result = req\n ? req.method === 'post'\n ? await this.api.post(req.url, params)\n : await this.api.get(req.url, params)\n : await this.api.search(params);\n if (seq !== this._fetchSeq) return;\n this.setDataSource(result);\n } catch (err: any) {\n if (seq !== this._fetchSeq) return;\n this.toastr.error(FxUtils.parseError(err));\n } finally {\n if (seq === this._fetchSeq) {\n this.loading = false;\n this.ref.detectChanges();\n }\n }\n }\n\n public async onPageChange(event: PageEvent) {\n this.page = event.pageIndex;\n this.pageSize = event.pageSize;\n await this.fetch();\n }\n\n public resolve() {\n return {};\n }\n\n public empty() {\n return {};\n }\n\n public onKeywordChange(keyword: string) {\n this.keywordChange$.next(keyword);\n }\n\n public async create() {\n const conf = this.config?.create;\n const dialog = conf?.dialog;\n const size = conf?.size;\n if (conf == null || dialog == null) {\n return;\n }\n if (this._lock) {\n return;\n }\n this._lock = true;\n\n let panelClass = 'fx-dialog';\n if (size == '100%') {\n panelClass = 'fx-fullsize-dialog';\n }\n\n const instance = this.modal.open(dialog, {\n panelClass: panelClass,\n autoFocus: 'first-tabbable',\n width: size,\n disableClose: conf.disableClose ?? false,\n // Dialogs are created by the root MatDialog: without this the dialog\n // component cannot see route-scoped providers (APIs) — NG0201.\n injector: this.injector,\n data: {\n method: 'create',\n data: this.empty(),\n title: conf.title,\n message: conf.message,\n resolve: this.resolve(),\n },\n });\n\n instance.afterClosed().subscribe((result: any) => {\n if (result) {\n this.refresh();\n }\n this._lock = false;\n });\n }\n\n public async update(model: T) {\n const conf = this.config?.update;\n const dialog = conf?.dialog;\n const size = conf?.size;\n if (dialog == null || conf == null) {\n return;\n }\n if (this._lock) {\n return;\n }\n this._lock = true;\n let panelClass = 'fx-dialog';\n if (size == '100%') {\n panelClass = 'fx-fullsize-dialog';\n }\n\n const instance = this.modal.open(dialog, {\n panelClass: panelClass,\n autoFocus: 'first-tabbable',\n width: size,\n disableClose: conf.disableClose ?? false,\n injector: this.injector,\n data: {\n method: 'update',\n data: model,\n title: conf.title,\n message: conf.message,\n resolve: this.resolve(),\n },\n });\n\n instance.afterClosed().subscribe((result: any) => {\n if (result) {\n this.refresh();\n }\n this._lock = false;\n });\n }\n\n public async view(model: T) {\n const conf = this.config?.view;\n const dialog = conf?.dialog;\n const size = conf?.size;\n if (dialog == null || conf == null) {\n return;\n }\n if (this._lock) {\n return;\n }\n this._lock = true;\n\n let panelClass = 'fx-dialog';\n if (size == '100%') {\n panelClass = 'fx-fullsize-dialog';\n }\n\n const instance = this.modal.open(dialog, {\n panelClass: panelClass,\n autoFocus: 'first-tabbable',\n width: size,\n disableClose: conf.disableClose ?? false,\n injector: this.injector,\n data: {\n data: model,\n title: conf.title,\n message: conf.message,\n resolve: this.resolve(),\n disabled: true,\n method: 'view',\n },\n });\n\n instance.afterClosed().subscribe(() => {\n this._lock = false;\n });\n }\n\n async delete(model: T) {\n const conf = this.config?.delete;\n const dialog = conf?.dialog;\n if (conf == null || dialog == null) {\n return;\n }\n if (this._lock) {\n return;\n }\n this._lock = true;\n\n try {\n const dialogRef = this.modal.open(dialog, {\n panelClass: 'fx-dialog',\n autoFocus: 'first-tabbable',\n width: '400px',\n injector: this.injector,\n data: {\n title: conf?.title,\n message: conf?.message,\n cancelLabel: (conf as any)?.cancelTitle,\n confirmLabel: (conf as any)?.confirmTitle,\n callback: async () => {\n await this.remove(model);\n },\n },\n });\n\n const state = await firstValueFrom(dialogRef.afterClosed());\n\n if (state) {\n try {\n await this.refresh();\n } catch (err: any) {\n this.toastr.error(FxUtils.parseError(err));\n }\n }\n } finally {\n this._lock = false;\n }\n }\n\n async remove(model: T) {\n try {\n return await this.api.remove({ ...model });\n } catch (err: any) {\n this.toastr.error(FxUtils.parseError(err));\n }\n }\n\n public tagClass(tag: string) {\n return FxUtils.getTagClass(tag, true);\n }\n\n public capitalize(label: string) {\n return label ? label.charAt(0).toUpperCase() + label.slice(1).toLowerCase() : label;\n }\n\n public value(model: any, key: string, defaultValue: any = '---') {\n return FxUtils.get(model, key, defaultValue);\n }\n\n public toggleExpand(element: any): void {\n this.expandedElement = this.expandedElement === element ? null : element;\n }\n\n async updateStatus(params: any) {\n try {\n await this.api.updateStatus(params);\n this.toastr.success(this.config?.updateStatus?.message ?? 'Update Success');\n } catch (err: any) {\n this.toastr.error(FxUtils.parseError(err));\n } finally {\n await this.refresh();\n }\n }\n}\n","import { ChangeDetectorRef, Directive, Injector } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { BaseTableComponent } from './base-table.component';\nimport { HttpWrapper } from '../services/http-wrapper.service';\nimport { FxUtils } from '../utils';\n\n/**\n * List + detail-pane counterpart of BaseTableComponent: the page keeps a\n * selectable row list on one side and a lazily fetched, per-id-cached detail\n * on the other. Pair it with `<fx-ui-master-detail>` which renders the\n * two-column shell from this state.\n *\n * Subclasses declare where ids and details come from:\n * protected override idKey = 'licenseId';\n * protected override detailUrl(id: string) { return `/license/${id}`; }\n * `detailUrl` returning null (the default) means the selected row itself is\n * the detail and no request is made.\n */\n@Directive()\nexport class BaseMasterDetailComponent<T = any> extends BaseTableComponent<T> {\n selectedId: string | null = null;\n selected: T | null = null;\n detailMap = new Map<string, any>();\n detailLoading = new Set<string>();\n\n // Explicit ctor: Ivy refuses to inherit a constructor whose `modal: any`\n // parameter is not DI-resolvable (NG2016).\n constructor(injector: Injector, api: HttpWrapper, modal: MatDialog, ref: ChangeDetectorRef) {\n super(injector, api, modal, ref);\n }\n\n /** Key the row id is read from. Override idOf() instead for composite ids. */\n protected idKey = 'id';\n\n public idOf(row: T): string | null {\n return this.value(row, this.idKey, null);\n }\n\n protected detailUrl(id: string): string | null {\n return null;\n }\n\n /** What the detail pane shows: the fetched detail when cached, else the row. */\n get detail(): any {\n return (this.selectedId != null && this.detailMap.get(this.selectedId)) || this.selected;\n }\n\n get detailBusy(): boolean {\n return this.selectedId != null && this.detailLoading.has(this.selectedId);\n }\n\n override setDataSource(result: any): void {\n super.setDataSource(result);\n this.autoSelectFirst();\n }\n\n /** Keep the previous selection when it survived the new page, else pick row 0. */\n autoSelectFirst(): void {\n const list = this.dataSource.data || [];\n if (!list.length) {\n this.selectedId = null;\n this.selected = null;\n return;\n }\n const still = list.find((row) => this.idOf(row) === this.selectedId);\n this.selectItem(still ?? list[0]);\n }\n\n selectItem(row: T): void {\n const id = this.idOf(row);\n this.selectedId = id;\n this.selected = row;\n if (id != null && !this.detailMap.has(id)) {\n this.fetchDetail(id);\n }\n }\n\n fetchDetail(id: string): void {\n const url = this.detailUrl(id);\n if (!url || this.detailLoading.has(id)) {\n return;\n }\n this.detailLoading.add(id);\n this.api\n .get(url)\n .then((res: any) => {\n // New Map identity so OnPush consumers of the pane see the change.\n this.detailMap = new Map(this.detailMap).set(id, res);\n })\n .catch((err: any) => {\n this.toastr.error(FxUtils.parseError(err));\n })\n .finally(() => {\n this.detailLoading.delete(id);\n this.ref.detectChanges();\n });\n }\n}\n","import { AfterViewInit, Directive, Inject, OnInit, viewChild } from '@angular/core';\nimport { BaseComponent } from './base.component';\nimport { NgForm } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { FxToastrService } from '../services/toastr.service';\nimport { HttpWrapper } from '../services/http-wrapper.service';\nimport { FxUtils } from '../utils';\n\n@Directive()\nexport class BaseDialogComponent<T = any> extends BaseComponent implements AfterViewInit, OnInit {\n readonly ngForm = viewChild<NgForm>('f');\n public method: string;\n public title: string;\n public model: any;\n public disabled: boolean;\n public loading: boolean;\n public message: string;\n public resolve: any;\n formChangesSubscription: any;\n public onSubmit = true;\n\n constructor(\n public ref: MatDialogRef<any>,\n @Inject(MAT_DIALOG_DATA) public bindings: any,\n public toastr: FxToastrService,\n public api: HttpWrapper,\n public dialog: MatDialog,\n ) {\n super();\n // Deep clone: a shallow clone let dialog edits mutate nested fields of\n // the live table row even when the user cancelled.\n this.model = FxUtils.cloneDeep(bindings?.['data']);\n this.method = bindings?.['method'];\n this.title = bindings?.['title'];\n this.disabled = bindings?.['disabled'];\n this.message = bindings?.['message'];\n this.resolve = bindings?.['resolve'];\n }\n\n // eslint-disable-next-line @angular-eslint/no-empty-lifecycle-method -- subclasses across host apps call super lifecycle methods; removing these breaks them at runtime\n ngAfterViewInit(): void {}\n\n // eslint-disable-next-line @angular-eslint/no-empty-lifecycle-method -- see ngAfterViewInit note\n ngOnInit(): void {}\n\n async accept(form: NgForm, params = null) {\n if (form.invalid) {\n FxUtils.checkInvalidField(form);\n return;\n }\n if (!this.disabled) {\n if (!this.validate()) return;\n if (this.method === 'create') {\n await this.create(params);\n return;\n } else {\n await this.update(params);\n return;\n }\n }\n\n this.cancel();\n }\n\n async create(params: any = null) {\n if (this.loading) {\n return;\n }\n this.loading = true;\n try {\n await this.api.create({ ...this.model, ...params });\n this.toastr.success(this.message);\n this.ref.close(true);\n } catch (error: any) {\n this.toastr.error(FxUtils.parseError(error));\n } finally {\n this.loading = false;\n }\n }\n\n async update(params: any = null) {\n if (this.loading) {\n return;\n }\n this.loading = true;\n try {\n await this.api.update({ ...this.model, ...params });\n this.toastr.success(this.message);\n this.ref.close(true);\n } catch (error: any) {\n this.toastr.error(FxUtils.parseError(error));\n } finally {\n this.loading = false;\n }\n }\n\n async updateInfo(params: any = null) {\n if (this.loading) {\n return;\n }\n this.loading = true;\n try {\n await this.api.updateInfo({ ...this.model, ...params });\n this.toastr.success(this.message);\n this.ref.close(true);\n } catch (error: any) {\n this.toastr.error(FxUtils.parseError(error));\n } finally {\n this.loading = false;\n }\n }\n\n cancel() {\n this.ref.close(false);\n }\n\n validate() {\n return true;\n }\n}\n","import { Injectable, EventEmitter } from '@angular/core';\n\n/**\n * Overlay chặn màn cho HÀNH ĐỘNG của người dùng (bấm nút, đổi trạng thái,\n * xuất báo cáo…). `app.html` của host bind `fx-ui-loading-panel` vào\n * `listenerAction`.\n *\n * ⚠️ **KHÔNG dùng cho điều hướng.** Channel `listener` + `start()`/`stop()` đã\n * bị XOÁ ở 0.7.70 (Pha 3). Điều hướng dùng skeleton: `FxRouteSkeletonService`\n * đọc `data.skeleton` của route đích và shell dựng `fx-ui-route-skeleton`.\n *\n * Vì sao xoá thay vì để lại: trước đó cả 46 call site đổ chung MỘT channel, lẫn\n * hai ngữ nghĩa (điều hướng vs hành động). Sau khi skeleton thay phần điều\n * hướng, `listener` không còn ai nghe — để lại là một cái bẫy: gọi `start()`\n * tưởng có overlay mà thực tế không có gì hiện.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class FxLoadingService {\n public listenerAction = new EventEmitter<boolean>();\n\n startAction() {\n this.listenerAction.emit(true);\n }\n\n stopAction() {\n this.listenerAction.emit(false);\n }\n}\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport {\n ActivatedRouteSnapshot,\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n Router,\n RoutesRecognized,\n} from '@angular/router';\nimport {\n FxSkeletonBlock,\n FxSkeletonHint,\n} from '../../ui/components/route-skeleton/route-skeleton.component';\n\n/**\n * Khai trên route: `data: { skeleton: 'table' }` (tên preset) hoặc\n * `data: { skeleton: ['heading', 'toolbar', 'table'] }` (mảng block, mô tả\n * ĐÚNG layout của màn — bảng ra bảng, chart ra chart).\n */\nexport const FX_SKELETON_DATA_KEY = 'skeleton';\n\n/**\n * Đọc `data.skeleton` của route đích rồi bật/tắt skeleton cho vùng nội dung.\n *\n * ⚠️ Vì sao phải nghe router event chứ không để từng màn tự lo: Angular\n * **không tạo component cho tới khi resolver xong**, nên trong lúc resolver\n * của một màn chạy thì component đó chưa tồn tại — không có gì để vẽ\n * skeleton. Chỉ shell (tồn tại trước) làm được.\n *\n * Mốc dùng là `RoutesRecognized` — event ĐẦU TIÊN mang `RouterStateSnapshot`,\n * và nó xảy ra TRƯỚC `ResolveStart`. `NavigationStart` thì chưa biết route\n * đích nên không đọc được hint.\n */\n@Injectable({ providedIn: 'root' })\nexport class FxRouteSkeletonService {\n private readonly router = inject(Router);\n\n private readonly _hint = signal<FxSkeletonHint | FxSkeletonBlock[] | null>(null);\n\n /** Hint đang hiển thị, `null` = không vẽ skeleton. */\n readonly hint = this._hint.asReadonly();\n readonly active = computed(() => this._hint() !== null);\n\n /**\n * Điều hướng nhanh hơn mốc này thì KHÔNG vẽ skeleton — tránh nháy một\n * nhịp khi resolver trả về gần như tức thì (dữ liệu đã cache).\n */\n private readonly graceMs = 150;\n\n private timer?: ReturnType<typeof setTimeout>;\n private started = false;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.clearTimer());\n }\n\n /** Gọi một lần từ shell (host và mỗi remote standalone). */\n start(): void {\n if (this.started) return;\n this.started = true;\n\n this.router.events.subscribe((event) => {\n if (event instanceof RoutesRecognized) {\n const hint = readHint(event.state.root);\n this.clearTimer();\n if (!hint) {\n this._hint.set(null);\n return;\n }\n this.timer = setTimeout(() => {\n this.timer = undefined;\n this._hint.set(hint);\n }, this.graceMs);\n return;\n }\n\n if (\n event instanceof NavigationEnd ||\n event instanceof NavigationCancel ||\n event instanceof NavigationError\n ) {\n this.clearTimer();\n this._hint.set(null);\n }\n });\n }\n\n private clearTimer(): void {\n if (this.timer !== undefined) {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n }\n}\n\n/**\n * Lấy hint ở nhánh SÂU NHẤT có khai — để route cha đặt mặc định và route con\n * ghi đè được.\n */\nfunction readHint(root: ActivatedRouteSnapshot): FxSkeletonHint | FxSkeletonBlock[] | null {\n let node: ActivatedRouteSnapshot | null = root;\n let found: FxSkeletonHint | FxSkeletonBlock[] | null = null;\n\n while (node) {\n const value = node.data?.[FX_SKELETON_DATA_KEY];\n // Chấp nhận cả tên preset và mảng block; mảng rỗng coi như không khai.\n if (typeof value === 'string' && value) found = value as FxSkeletonHint;\n else if (Array.isArray(value) && value.length) found = value as FxSkeletonBlock[];\n node = node.firstChild;\n }\n\n return found;\n}\n","import { Injectable } from '@angular/core';\nimport { FxUtils } from '../utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FxStorageService {\n resolve(key: string, value?: any): any {\n if (FxUtils.isNotNull(value)) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n const loc = localStorage.getItem(key);\n return loc ? JSON.parse(loc) : undefined;\n }\n\n remove(key: string) {\n localStorage.removeItem(key);\n }\n}\n","import { Type, inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, ResolveFn, RouterStateSnapshot } from '@angular/router';\nimport { HttpWrapper } from '../services/http-wrapper.service';\nimport { FxToastrService } from '../services/toastr.service';\nimport { FxStorageService } from '../services/storage.service';\nimport { FxUtils } from '../utils';\n\nexport interface FxListRequest {\n /** Defaults to 'get'. */\n method?: 'get' | 'post';\n url: string;\n /** Query params (get) — for post they are sent as the body unless `body` is set. */\n params?: any;\n body?: any;\n}\n\nexport interface FxListResolverContext {\n /** Page size remembered for this route url (FxStorageService convention), default 10. */\n pageSize: number;\n}\n\n/**\n * Chạy MỘT request cho list resolver, lỗi thì hiện toast đã parse.\n *\n * ⚠️ KHÔNG còn bật overlay chặn màn: điều hướng dùng skeleton\n * (`FxRouteSkeletonService` + `data.skeleton` trên route). `BaseResolver` đã bị\n * xoá ở 0.7.70 — mọi resolver giờ là `@Injectable()` thuần hoặc dùng factory\n * này.\n *\n * Usage:\n * resolve: { histories: fxListResolver(ScanManagementApi, (route, state, ctx) =>\n * ({ url: `/${route.paramMap.get('id')}/history`, params: { page: 1, pageSize: ctx.pageSize } })) }\n */\nexport function fxListResolver<A extends HttpWrapper>(\n apiType: Type<A>,\n request: (\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot,\n ctx: FxListResolverContext,\n ) => FxListRequest,\n): ResolveFn<any> {\n return async (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const api = inject(apiType);\n const toastr = inject(FxToastrService);\n const storage = inject(FxStorageService);\n try {\n const ctx: FxListResolverContext = { pageSize: storage.resolve(state.url) || 10 };\n const req = request(route, state, ctx);\n if ((req.method ?? 'get') === 'post') {\n return await api.post(req.url, req.body ?? req.params ?? {});\n }\n return await api.get(req.url, req.params);\n } catch (err: any) {\n toastr.error(FxUtils.parseError(err), 'Error');\n return null;\n }\n };\n}\n","import { Provider, Type } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { HttpWrapper } from './http-wrapper.service';\n\nexport type FxApiClass = Type<HttpWrapper> & { provider: Provider };\n\n/**\n * Factory for the 11-line HttpWrapper subclasses copy-pasted per endpoint.\n * Returns a distinct injectable class per call (so constructor injection by\n * type keeps working) without needing a decorator:\n *\n * export const ScanManagementApi = createApi(() => `${environment.baseService}/scarf/scan`);\n * // module: providers: [ScanManagementApi.provider]\n * // usage: constructor(private api: InstanceType<typeof ScanManagementApi>)\n *\n * `baseURL` accepts a string or a lazy factory (for environment-derived URLs).\n * An optional `transform` plugs into HttpWrapper.transformResponse — e.g.\n * FxUtils.camelizeDeep for snake_case/Long-encoded backends.\n *\n * IMPORTANT — when subclassing (`@Injectable() class X extends createApi(...)`),\n * declare an explicit `constructor(http: HttpClient) { super(http); }`.\n * The generated base carries no Angular factory metadata, so an inherited\n * constructor makes Ivy fall back to `new X()` with NO arguments: the class\n * silently gets `http = undefined` and every call fails at runtime while the\n * build stays green.\n */\nexport function createApi(\n baseURL: string | (() => string),\n transform?: (res: any) => any,\n): FxApiClass {\n class GeneratedApi extends HttpWrapper {\n static provider: Provider = {\n provide: GeneratedApi,\n useFactory: (http: HttpClient) => new GeneratedApi(http),\n deps: [HttpClient],\n };\n\n constructor(http: HttpClient) {\n super(http, typeof baseURL === 'function' ? baseURL() : baseURL);\n }\n\n protected override transformResponse(res: any): any {\n return transform ? transform(res) : res;\n }\n }\n return GeneratedApi as FxApiClass;\n}\n","import { DestroyRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subscription } from 'rxjs';\nimport { NotificationService } from './notification.service';\n\nexport interface RealtimeTableEvent<T> {\n /** Value the event is matched to a row with (via `matchKey`). */\n key: any;\n /** Fields to merge onto the matched row. */\n patch: Partial<T>;\n /** Marks a final state (e.g. COMPLETED) — forwarded to `onApplied`. */\n terminal?: boolean;\n}\n\nexport interface RealtimeTableSyncOptions<T> {\n /** Hub event name to subscribe to (via NotificationService.on$). */\n event: string;\n /** Parse the raw payload; return null to ignore the event. */\n parse: (raw: any) => RealtimeTableEvent<T> | null;\n /** Current table rows (live reference is fine). */\n getRows: () => T[];\n /** Replace table rows (callers usually also trigger change detection here). */\n setRows: (rows: T[]) => void;\n /** Key events match rows on (e.g. row.analyzeCode). */\n matchKey: (row: T) => any;\n /**\n * Stable identity used when merging a background re-fetch into the current\n * rows (existing row objects are patched in place so the table keeps their\n * identity — no flash).\n */\n identityKey: (row: T) => any;\n /** Background list re-fetch used to pick up rows that don't exist yet. */\n fetchList: () => Promise<{ rows: T[]; total?: number } | null>;\n /** Called after a patch lands on a row (change detection, terminal enrich…). */\n onApplied?: (row: T, event: RealtimeTableEvent<T>) => void;\n /** Called when a background re-fetch produced a new total. */\n onTotal?: (total: number) => void;\n /** Debounce for the background sync (default 1200ms). */\n debounceMs?: number;\n /** Consecutive no-op syncs before giving up on buffered keys (default 3). */\n idleCap?: number;\n}\n\n/**\n * Live-progress plumbing for server-paginated tables fed by hub events:\n * events matching a visible row are merged in place; events for rows that\n * are not in the list yet (a just-created record whose list read lags) are\n * buffered by key and replayed after a debounced, idle-capped background\n * re-fetch that merges by stable identity.\n *\n * The domain contract (event name, payload parsing, terminal semantics) is\n * injected via options — nothing app-specific lives here.\n */\nexport class RealtimeTableSync<T = any> {\n private pending = new Map<any, RealtimeTableEvent<T>>();\n private syncTimer: ReturnType<typeof setTimeout> | null = null;\n private idleSyncs = 0;\n private stopped = false;\n private subscription: Subscription | null = null;\n\n constructor(\n private notifications: NotificationService,\n private options: RealtimeTableSyncOptions<T>,\n ) {}\n\n /**\n * Subscribe to the hub event. Pass a DestroyRef to tie teardown to a\n * component lifecycle; stop() is still available for manual control.\n */\n start(destroyRef?: DestroyRef): this {\n const source = this.notifications.on$(this.options.event);\n const piped = destroyRef ? source.pipe(takeUntilDestroyed(destroyRef)) : source;\n this.stopped = false;\n this.subscription = piped.subscribe((raw: any) => this.handleEvent(raw));\n if (destroyRef) {\n destroyRef.onDestroy(() => this.stop());\n }\n return this;\n }\n\n stop(): void {\n this.stopped = true;\n this.subscription?.unsubscribe();\n this.subscription = null;\n if (this.syncTimer) {\n clearTimeout(this.syncTimer);\n this.syncTimer = null;\n }\n this.pending.clear();\n }\n\n /**\n * Replay buffered events onto the current rows (call from setDataSource so\n * a regular refresh also applies buffered progress). Returns true if\n * anything was applied.\n */\n applyPending(): boolean {\n if (!this.pending.size) return false;\n let changed = false;\n for (const row of this.options.getRows()) {\n const key = this.options.matchKey(row);\n const event = this.pending.get(key);\n if (!event) continue;\n Object.assign(row as any, event.patch);\n this.pending.delete(key);\n changed = true;\n this.options.onApplied?.(row, event);\n }\n if (changed) {\n this.options.setRows([...this.options.getRows()]);\n }\n return changed;\n }\n\n private handleEvent(raw: any): void {\n const event = this.options.parse(raw);\n if (!event) return;\n\n const row = this.options.getRows().find((r) => this.options.matchKey(r) === event.key);\n if (!row) {\n // Not in the list yet (e.g. just-created record whose list read lags):\n // keep only the latest state per key and schedule a background sync.\n this.pending.set(event.key, event);\n this.scheduleSync();\n return;\n }\n this.idleSyncs = 0;\n Object.assign(row as any, event.patch);\n this.options.setRows([...this.options.getRows()]);\n this.options.onApplied?.(row, event);\n }\n\n private scheduleSync(): void {\n const idleCap = this.options.idleCap ?? 3;\n if (this.syncTimer || this.stopped || this.idleSyncs >= idleCap) return;\n this.syncTimer = setTimeout(async () => {\n this.syncTimer = null;\n await this.syncFromServer();\n }, this.options.debounceMs ?? 1200);\n }\n\n private async syncFromServer(): Promise<void> {\n try {\n const result = await this.options.fetchList();\n if (this.stopped || !result) return;\n const existingByIdentity = new Map(\n this.options.getRows().map((r) => [this.options.identityKey(r), r]),\n );\n const merged = result.rows.map((item) => {\n const existing = existingByIdentity.get(this.options.identityKey(item));\n if (existing) {\n Object.assign(existing as any, item); // reuse the object → stable identity\n return existing;\n }\n return item;\n });\n this.options.setRows(merged);\n if (result.total !== undefined) {\n this.options.onTotal?.(result.total);\n }\n const applied = this.applyPending();\n this.idleSyncs = applied ? 0 : this.idleSyncs + 1;\n if (this.pending.size) {\n this.scheduleSync();\n }\n } catch {\n // Background sync is best-effort; the next event retries.\n this.idleSyncs += 1;\n }\n }\n}\n","import { FxUtils } from './utils';\n\n/**\n * Shared value→colour rules for report/metric displays.\n *\n * Every metric that varies in meaning (severity, score, count…) gets ONE rule\n * so the colour is consistent everywhere and callers never hardcode a tone\n * for a value that can be good or bad. Domain-specific rules (EPSS, exploit\n * maturity, license categories…) stay in the consuming app — only the\n * mechanism and the org-wide rules live here.\n *\n * There is intentionally NO `default` text/bg colour in the theme, so rule\n * helpers return `null` for \"no meaningful value\" and the `toneText` /\n * `toneBg` / `toneBadge` wrappers fall back to a neutral class.\n *\n * Every emitted Tailwind UTILITY must appear below as a WHOLE literal string —\n * the Tailwind content scanner (v4 has no safelist) only sees complete class\n * names. Never rebuild those with string interpolation.\n *\n * ⚠️ Ngoại lệ có chủ đích: `tone-tint-*`, `tone-fg-*`, `tone-dot-*` và\n * `tone-dot-chart-*` là CLASS CSS THẬT khai trong components.css, KHÔNG phải\n * utility Tailwind — chúng luôn tồn tại trong stylesheet nên ghép chuỗi\n * `tone-fg-${tone}` là an toàn. Đó chính là lý do chọn class thay vì utility:\n * ngoài việc tránh xung đột tên (`warning` trong theme Tailwind trỏ vào bộ\n * LEGACY `--og-tone-*`), nó còn xoá hẳn bẫy \"class ghép chuỗi bị vô hình\".\n */\nexport type Tone = 'critical' | 'danger' | 'warning' | 'success' | 'information';\n\nconst NEUTRAL_TEXT = 'text-text-secondary';\nconst NEUTRAL_BG = 'bg-bg-hover';\n\n/**\n * ⚠️ Trỏ vào `.tone-fg-*` của hệ MỚI, KHÔNG còn `text-critical` (bộ LEGACY\n * vivid). Bỏ sót chỗ này chính là lý do badge/chữ trong list ở mọi tab vẫn\n * ra màu cũ sau khi đã đổi `TONE_BADGE` (anh Tú báo 03/09).\n */\nconst TONE_TEXT: Record<string, string> = {\n critical: 'tone-fg-critical',\n danger: 'tone-fg-danger',\n warning: 'tone-fg-warning',\n success: 'tone-fg-success',\n information: 'tone-fg-information',\n discovery: 'tone-fg-discovery',\n};\n\n/** Nền ĐẶC — dùng cho trạng thái đang chọn. Xem `.tone-solid-*`. */\nconst TONE_BG: Record<string, string> = {\n critical: 'tone-solid-critical',\n danger: 'tone-solid-danger',\n warning: 'tone-solid-warning',\n success: 'tone-solid-success',\n information: 'tone-solid-information',\n discovery: 'tone-solid-discovery',\n};\n\n/**\n * ⚠️ ĐỪNG dùng `toneBadge()` cho badge CÓ CHẤM bên trong: Critical ra nền\n * đen đặc nên chấm (đỏ sẫm) nằm trên đó gần như vô hình. Demo chỉ dùng biến\n * thể `solid` cho badge severity ĐỨNG MỘT MÌNH; badge kèm `StatusDot` luôn\n * dùng nền MỀM. Chỗ đó hãy dùng `toneScale()`.\n *\n * Tông severity — theo ĐÚNG mô hình đo trên demo 03/09: token semantic\n * (`--og-negative`…) chứ không phải bộ vivid `--og-tone-*`, và Critical được\n * nhấn bằng nền ĐEN ĐẶC thay vì màu rực. Định nghĩa ở `.tone-tint-*` trong\n * components.css — xem comment ở đó để biết lý do không dùng utility Tailwind.\n *\n * `tone-tint-*` chỉ mang MÀU. Hình dạng pill nằm ở `.tone-badge` riêng, nên\n * ô icon vuông / chip filter dùng được màu mà không bị bo tròn 999px.\n */\n/**\n * Cố tình KHÔNG khoá vào `Record<Tone, …>`: `FxUtils.getTagClass()` còn trả\n * `discovery` (và `default`), mà `discovery` có đúng một biến thể tương ứng\n * trong demo là `.og-badge--accent`. `default` không có key → rơi về neutral.\n */\nconst TONE_TINT: Record<string, string> = {\n critical: 'tone-tint-critical',\n danger: 'tone-tint-danger',\n warning: 'tone-tint-warning',\n success: 'tone-tint-success',\n information: 'tone-tint-information',\n discovery: 'tone-tint-discovery',\n};\n\nfunction hasVal(v: any): boolean {\n if (v == null) return false;\n const s = String(v).trim();\n return s !== '' && s !== '-' && s !== '--';\n}\n\n/** Severity / risk-level string → tone (Critical & High → danger, Medium → warning, Low → success). */\nexport function severityTone(value: any): Tone | null {\n if (!hasVal(value)) return null;\n const t = FxUtils.getTagClass(String(value), true);\n return t === 'default' || t === 'discovery' ? null : (t as Tone);\n}\n\n/**\n * CVSS-style 0–10 score → tone, following the CVSS v3 qualitative bands\n * (≥9 Critical, ≥7 High, ≥4 Medium, else Low). Backends occasionally send a\n * 0–100 scale, so values > 10 are normalised down by /10.\n */\nexport function scoreTone(score: any): Tone | null {\n let n = Number(score);\n if (!Number.isFinite(n) || n <= 0) return null;\n if (n > 10) n = n / 10;\n if (n >= 9) return 'critical';\n if (n >= 7) return 'danger';\n if (n >= 4) return 'warning';\n return 'success';\n}\n\n/**\n * Count of \"bad\" things → tone: 0 is good (success), anything positive is bad.\n * `positiveTone` sets how severe a non-zero count reads (default `danger`;\n * pass `critical` for the worst metrics, `warning` for milder ones).\n * Non-numeric values (e.g. \"--\") return null → neutral.\n */\nexport function countTone(count: any, positiveTone: Tone = 'danger'): Tone | null {\n const n = Number(count);\n if (!Number.isFinite(n)) return null;\n return n > 0 ? positiveTone : 'success';\n}\n\n/** Tone → text colour class, with a neutral fallback when there is no value. */\nexport function toneText(tone: Tone | null): string {\n return tone ? TONE_TEXT[tone] : NEUTRAL_TEXT;\n}\n\n/** Tone → background colour class, with a neutral fallback when there is no value. */\nexport function toneBg(tone: Tone | null): string {\n return tone ? TONE_BG[tone] : NEUTRAL_BG;\n}\n\n/** Tone → soft pill/badge classes (tinted bg + matching text), neutral fallback. */\n/**\n * Badge severity MẶC ĐỊNH — nền MỀM theo thang đo, Critical ra **đỏ sẫm**.\n *\n * ⚠️ Trước đây hàm này trả nền ĐẶC (`tone-tint-*`, Critical = đen `--og-text`)\n * vì demo có biến thể `.og-badge--solid`. Nhưng demo chỉ dùng biến thể đó ở\n * ĐÚNG MỘT chỗ — badge severity trong danh sách findings — còn app mình gọi\n * `toneBadge()` ở khắp nơi (`project-card`, `score-badge`, `list-row`,\n * `severity-badges`, `tab-group`, badge trong hàng…). Kết quả: pill đen tràn\n * ra mọi màn, anh Tú báo 3 lần (03/09). Nên MẶC ĐỊNH đảo về nền mềm; muốn\n * pill đen thì gọi `toneBadgeSolid()` một cách tường minh.\n */\nexport function toneBadge(tone: Tone | string | null | undefined): string {\n return `tone-badge ${toneScale(tone)}`;\n}\n\n/**\n * Badge severity nền ĐẶC (Critical = `--og-text`, chữ `--og-surface`) — đúng\n * `.og-badge--solid` của demo. CHỈ dùng cho badge severity đứng một mình ở\n * nơi cần nhấn mạnh nhất; đừng dùng cho badge có chấm bên trong (chấm sẽ chìm).\n */\nexport function toneBadgeSolid(tone: Tone | string | null | undefined): string {\n return `tone-badge ${toneTint(tone)}`;\n}\n\n/**\n * Nhận `string` rộng chứ không chỉ `Tone`: rất nhiều call site truyền kết quả\n * của `FxUtils.getTagClass()` / tone tự tính, vốn là `string`. Tone lạ →\n * neutral, thay vì sinh ra class rác như thời còn ghép chuỗi `'bg-' + tone`.\n */\nconst isTone = (t: unknown): t is string =>\n typeof t === 'string' && Object.prototype.hasOwnProperty.call(TONE_TINT, t);\n\n/**\n * Chỉ MÀU của tông, không kèm hình dạng pill — cho ô icon, chip, ô nền.\n *\n * ⚠️ Đây là họ SOLID: `tone-tint-critical` đặt `background: --og-text`\n * (gần đen) VÀ `color: --og-surface` (trắng) trên CÙNG element.\n *\n * Hệ quả bắt buộc nhớ:\n * 1. Chỉ dùng cho **badge một phần tử**. Với hộp nhiều dòng thì con sẽ cần màu\n * chữ riêng, và nếu con ghi đè bằng `toneFg()` (đỏ sẫm) thì thành đỏ sẫm\n * trên gần đen — không đọc được. Đã bị đúng vậy ở hộp RISK của\n * `info-binary-detail` (anh Tú 03/09).\n * 2. **KHÔNG** đặt `toneFg()` lên phần tử con của một phần tử đã có\n * `toneTint()` — nó phá màu tương phản mà `toneTint` vừa đặt.\n *\n * Hộp/khối nhiều dòng thì dùng `toneScale()`: nền nhạt (color-mix 12%) + chữ\n * đúng tông, con chỉ cần THỪA HƯỞNG.\n */\nexport function toneTint(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? TONE_TINT[tone] : 'tone-tint-neutral';\n}\n\n/**\n * CHỮ theo tông — dùng thành viên dễ đọc nhất của mỗi họ severity, KHÔNG phải\n * ramp chart (ramp có `warning #f59e0b` chỉ 2.15:1 trên nền trắng). Xem\n * `.tone-fg-*` trong components.css.\n */\nexport function toneFg(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? `tone-fg-${tone}` : 'tone-fg-neutral';\n}\n\n/**\n * Tông THANG ĐO — cho filter chip severity. Critical ra ĐỎ SẪM (nền mềm pha\n * từ ramp `--og-sev-*`) thay vì pill đen đặc của `toneTint()`: chip filter là\n * một thang đo, không phải badge severity của một finding. Xem `.tone-scale-*`.\n */\nexport function toneScale(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? `tone-scale-${tone}` : 'tone-scale-neutral';\n}\n\n/** Viền theo tông — cho panel trạng thái (dropzone upload…). */\nexport function toneBorder(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? `tone-border-${tone}` : 'tone-border-neutral';\n}\n\n/**\n * CHẤM trạng thái trong hàng (`● Confirmed`) — demo dùng màu SEMANTIC\n * (`.og-statusdot--*`), không phải ramp chart.\n */\nexport function toneDot(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? `tone-dot-${tone}` : 'tone-dot-neutral';\n}\n\n/**\n * CHẤM LEGEND của chart — phải TRÙNG màu cung donut nên dùng ramp\n * `--og-sev-*`. Đừng dùng cho chấm trạng thái trong hàng.\n */\nexport function toneDotChart(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? `tone-dot-chart-${tone}` : 'tone-dot-chart-neutral';\n}\n\n/**\n * Tone → resolved CSS colour string for ECharts / canvas where a Tailwind\n * class can't be used (e.g. per-slice pie `itemStyle.color`). Emits the\n * legacy comma syntax — see FxUtils.convertColorFromVariable.\n */\nexport function toneColor(tone: Tone | null, alpha = 1): string {\n // Chart dùng ramp RIÊNG `--og-sev-*` (màu literal đo trên demo), không dùng\n // `--og-tone-*`. `information` không có trong ramp của demo (demo chỉ có 4\n // bậc Critical/High/Medium/Low) nên vẫn rơi về tone legacy.\n const SEV = new Set(['critical', 'danger', 'warning', 'success']);\n const name = tone ? (SEV.has(tone) ? `--og-sev-${tone}` : `--${tone}`) : '--text-secondary';\n return FxUtils.convertColorFromVariable(name, alpha, { legacyCommaSyntax: true });\n}\n","/**\n * Feature gating for the V2 rollout.\n *\n * Each app owns its own `environment.features` block, so the flags are passed\n * in rather than read here — the library has no environment of its own.\n *\n * readonly knowledge = featureEnabled(environment.features, 'knowledge');\n *\n * Why a helper instead of `environment.features?.x`: call sites were drifting\n * between truthy checks and `=== true`, some behind an `as any` cast that hides\n * a typo in the flag name. One function keeps the semantics identical\n * everywhere — a flag counts as on only when it is exactly `true`, so a missing\n * block, a missing key or a stale string value all read as off.\n */\nexport type FxFeatureFlags = Record<string, boolean | undefined> | undefined | null;\n\nexport function featureEnabled(flags: FxFeatureFlags, name: string): boolean {\n return flags?.[name] === true;\n}\n\n/** Convenience for templates that gate on several flags at once. */\nexport function anyFeatureEnabled(flags: FxFeatureFlags, ...names: string[]): boolean {\n return names.some((name) => featureEnabled(flags, name));\n}\n","import { ValidationErrors } from '@angular/forms';\n\nexport class FxValidators {\n /**\n * Name fields: firstName, lastName, groupName, projectName, displayName\n * Allows: letters (Unicode), spaces, hyphens, apostrophes, periods\n */\n static validateName(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[\\p{L}\\s'\\-.]{1,100}$/u;\n return regex.test(value) ? null : { invalidName: 'Only letters, spaces, hyphens, apostrophes, and periods are allowed (max 100 characters)' };\n }\n\n /**\n * Description fields\n * Allows: letters, digits, spaces, basic punctuation\n */\n static validateDescription(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[\\p{L}\\d\\s.,;:!?'/()\"&\\-\\n\\r]{1,500}$/u;\n return regex.test(value) ? null : { invalidDescription: 'Contains disallowed characters (max 500 characters)' };\n }\n\n /**\n * Email fields\n */\n static validateEmail(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return regex.test(value) ? null : { invalidEmail: 'Please enter a valid email address' };\n }\n\n /**\n * Phone fields\n * Allows: digits, optional leading +, spaces, hyphens, parentheses (7-15 digits)\n */\n static validatePhone(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^\\+?[\\d\\s\\-()]{7,20}$/;\n const digitCount = value.replace(/\\D/g, '').length;\n if (!regex.test(value) || digitCount < 7 || digitCount > 15) {\n return { invalidPhone: 'Please enter a valid phone number' };\n }\n return null;\n }\n\n /**\n * Code/identifier fields: server code, template code, templateId\n * Allows: alphanumeric, hyphens, underscores\n */\n static validateCode(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[a-zA-Z0-9_-]{1,50}$/;\n return regex.test(value) ? null : { invalidCode: 'Only letters, numbers, hyphens, and underscores are allowed (max 50 characters)' };\n }\n\n /**\n * Domain fields\n * Standard domain pattern with optional port\n */\n static validateDomain(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}(:\\d{1,5})?$/;\n return regex.test(value) ? null : { invalidDomain: 'Please enter a valid domain (e.g., mail.example.com)' };\n }\n\n /**\n * Subject fields (email subject)\n * Allows: letters, digits, spaces, common punctuation, template placeholders {{}}\n */\n static validateSubject(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[\\p{L}\\d\\s.,;:!?'/()\"&\\-{}]{1,200}$/u;\n return regex.test(value) ? null : { invalidSubject: 'Contains disallowed characters (max 200 characters)' };\n }\n\n /**\n * Tag fields\n * Allows: alphanumeric, hyphens, underscores, dots, spaces\n */\n static validateTag(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[a-zA-Z0-9_\\-.\\s]{1,50}$/;\n return regex.test(value) ? null : { invalidTag: 'Only letters, numbers, hyphens, underscores, dots, and spaces are allowed' };\n }\n\n /**\n * URL fields: proxy, masterUrl\n * Standard URL pattern\n */\n static validateUrl(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^https?:\\/\\/[a-zA-Z0-9\\-._~:/?#[\\]@!$&'()*+,;=%]{1,2000}$/;\n return regex.test(value) ? null : { invalidUrl: 'Please enter a valid URL (http:// or https://)' };\n }\n\n /**\n * Numeric string fields: timeout, memoryLimit, cpuCores\n * Allows: digits, optional decimal point\n */\n static validateNumeric(value: string): ValidationErrors | null {\n if (!value || value.toString().trim() === '') return null;\n const regex = /^\\d+(\\.\\d+)?$/;\n return regex.test(value.toString()) ? null : { invalidNumeric: 'Please enter a valid number' };\n }\n\n /**\n * Version fields (semver-like)\n * Allows: digits, dots, hyphens, plus, letters\n */\n static validateVersion(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[a-zA-Z0-9.\\-+]{1,50}$/;\n return regex.test(value) ? null : { invalidVersion: 'Please enter a valid version (e.g., 1.0.0)' };\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\n\nexport function HttpLoaderFactory(http: HttpClient) {\n return new TranslateHttpLoader(http, '/assets/i18n/', '.json');\n}\n\n@NgModule({\n imports: [TranslateModule],\n exports: [TranslateModule]\n})\nexport class TranslationModule {\n static forRoot(): ModuleWithProviders<TranslationModule> {\n return {\n ngModule: TranslationModule,\n providers: [\n {\n provide: TranslateLoader,\n useFactory: HttpLoaderFactory,\n deps: [HttpClient]\n }\n ]\n };\n }\n\n static forChild(): ModuleWithProviders<TranslationModule> {\n return {\n ngModule: TranslationModule,\n providers: []\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationService {\n private currentLangSubject = new BehaviorSubject<string>('en');\n readonly currentLang$ = this.currentLangSubject.asObservable();\n\n constructor(\n private translate: TranslateService,\n private http: HttpClient\n ) {\n // Default fallback\n this.translate.addLangs(['en', 'vi']);\n this.translate.setDefaultLang('en');\n }\n\n init(lang: string) {\n this.setLanguage(lang);\n }\n\n currentLang(): string {\n return this.translate.currentLang || this.translate.defaultLang;\n }\n\n setLanguage(lang: string) {\n this.translate.use(lang);\n this.currentLangSubject.next(lang);\n }\n\n loadTranslations(lang: string, path: string) {\n const url = `${path}${lang}.json`;\n this.http.get(url).subscribe({\n next: (translations: any) => {\n this.translate.setTranslation(lang, translations, true);\n },\n error: (err) => {\n console.warn(`[TranslationService] Failed to load ${url}`, err);\n }\n });\n }\n\n onLanguageChange(callback: (lang: string) => void) {\n this.currentLang$.subscribe(callback);\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PermissionService {\n private permissions: string[] = [];\n\n setPermissions(perms: string[]) {\n this.permissions = perms;\n }\n\n hasPermission(requiredPermissions: string[]): boolean {\n return requiredPermissions.some((permission: string) => this.permissions.includes(permission));\n }\n\n getPermissions(): string[] {\n return [...this.permissions];\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { PermissionService } from '../services/permissions.service';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector -- renaming is a breaking change for all host-app templates\n selector: '[hasPermission]'\n})\nexport class HasPermissionDirective {\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainerRef: ViewContainerRef,\n private permissionService: PermissionService\n ) {}\n\n @Input() set hasPermission(required: string | string[]) {\n const requiredPermissions = Array.isArray(required) ? required : [required];\n this.viewContainerRef.clear();\n if (this.permissionService.hasPermission(requiredPermissions)) {\n this.viewContainerRef.createEmbeddedView(this.templateRef);\n }\n }\n}\n","import { Directive, ElementRef, HostListener, inject, input } from '@angular/core';\nimport { NgControl } from '@angular/forms';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector -- renaming is a breaking change for all host-app templates\n selector: '[appTrimOnBlur]'\n})\nexport class TrimOnBlurDirective {\n readonly collapseWhitespace = input(false, { alias: \"appTrimOnBlurCollapse\" });\n\n /* Optional on purpose: the onBlur fallback below already handles the\n * no-form case, but the injection was required and crashed any unbound\n * input once the directive actually entered the compilation scope. */\n private ngControl = inject(NgControl, { optional: true });\n\n constructor(private el: ElementRef<HTMLInputElement>) {}\n\n @HostListener('blur')\n onBlur(): void {\n const native = this.el.nativeElement;\n if (!native) return;\n\n let value: string = native.value ?? '';\n\n if (this.collapseWhitespace()) {\n value = value.replace(/\\s+/g, ' ').trim();\n } else {\n value = value.trim();\n }\n\n if (native.value === value) return;\n\n native.value = value;\n\n if (this.ngControl && this.ngControl.control) {\n this.ngControl.control.setValue(value);\n } else {\n const ev = new Event('input', { bubbles: true });\n native.dispatchEvent(ev);\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, Router } from '@angular/router';\nimport { PermissionService } from '../services/permissions.service';\nimport { FxUtils } from '../utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PermissionGuard implements CanActivate {\n constructor(private permissionService: PermissionService, private router: Router) {}\n\n canActivate(route: any): boolean {\n const requiredPermissions = route.data?.['permissions'] as string[] | undefined;\n\n if (!requiredPermissions || this.permissionService.hasPermission(requiredPermissions)) {\n return true;\n }\n\n this.router.navigate(['/unauthorized']);\n return false;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthStateService {\n private _isLoggedIn$ = new BehaviorSubject<boolean | null>(null);\n readonly isLoggedIn$ = this._isLoggedIn$.asObservable();\n readonly unauthorized$ = new Subject<void>();\n\n constructor() {}\n\n setLoggedIn(value: boolean): void {\n this._isLoggedIn$.next(value);\n }\n\n get isLoggedIn(): boolean {\n return this._isLoggedIn$.value === true;\n }\n\n handleUnauthorized(): void {\n this.setLoggedIn(false);\n this.unauthorized$.next();\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n HttpEvent,\n HttpInterceptor,\n HttpHandler,\n HttpRequest,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { AuthStateService } from '../services/auth-state.service';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n private handlingUnauthorized = false;\n\n constructor(private authState: AuthStateService) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n // Multi-tenant: all tenant domains hit one shared API endpoint, so the\n // backend can no longer resolve the tenant from the Host header. Send the\n // originating domain explicitly for tenant resolution.\n const cloned = req.clone({\n withCredentials: true,\n setHeaders: { 'X-Tenant-Domain': window.location.hostname },\n });\n\n return next.handle(cloned).pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401 && !this.handlingUnauthorized) {\n this.handlingUnauthorized = true;\n this.authState.handleUnauthorized();\n setTimeout(() => {\n this.handlingUnauthorized = false;\n }, 2000);\n }\n return throwError(() => error);\n })\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\nexport interface Breadcrumb {\n label: string;\n url?: string;\n code?: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BreadcrumbService {\n private breadcrumbs$ = new BehaviorSubject<Breadcrumb[]>([]);\n\n set(breadcrumbs: Breadcrumb[]) {\n this.breadcrumbs$.next(breadcrumbs);\n }\n\n get() {\n return this.breadcrumbs$.asObservable();\n }\n\n clear() {\n this.breadcrumbs$.next([]);\n }\n}\n","import { Injectable, Renderer2, RendererFactory2 } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/** The six OgeniumDashboards themes. */\nexport type OgTheme = 'porcelain' | 'charcoal' | 'ivory' | 'studio' | 'blueprint' | 'terminal';\n\nexport const OG_THEMES: readonly OgTheme[] = [\n 'porcelain',\n 'charcoal',\n 'ivory',\n 'studio',\n 'blueprint',\n 'terminal',\n];\n\nexport const OG_LIGHT_THEMES: readonly OgTheme[] = ['porcelain', 'ivory', 'terminal'];\n\n/** Display metadata for theme pickers — accent/page swatches are brand constants. */\nexport interface OgThemeMeta {\n name: OgTheme;\n label: string;\n accent: string;\n pageBg: string;\n dark: boolean;\n}\n\nexport const OG_THEME_META: readonly OgThemeMeta[] = [\n { name: 'porcelain', label: 'Porcelain', accent: '#4a7dbd', pageBg: '#f2f2f1', dark: false },\n { name: 'charcoal', label: 'Charcoal', accent: '#8fc866', pageBg: '#1a1811', dark: true },\n { name: 'ivory', label: 'Ivory', accent: '#d97757', pageBg: '#e8e6e1', dark: false },\n { name: 'studio', label: 'Studio', accent: '#5a8fd6', pageBg: '#0e0e10', dark: true },\n { name: 'blueprint', label: 'Blueprint', accent: '#e07a3a', pageBg: '#0e0e10', dark: true },\n { name: 'terminal', label: 'Terminal', accent: '#3a55d9', pageBg: '#e8e6e1', dark: false },\n];\n\n/**\n * Theme NGƯỜI DÙNG được chọn (anh Tú chốt 31/08): chỉ còn một cặp\n * light/dark. Bốn theme còn lại vẫn tồn tại đầy đủ trong theme.css và\n * setTheme() vẫn nhận — chúng dùng cho trang /themes của demo và cho\n * harness screenshot chạy ma trận 6 theme; chỉ **giấu khỏi picker**.\n * Muốn mở lại: thêm tên vào mảng này, không phải dựng lại token.\n */\nexport const OG_PICKER_THEMES: readonly OgTheme[] = ['porcelain', 'charcoal'];\n\n/** OG_THEME_META đã lọc theo OG_PICKER_THEMES — nguồn duy nhất cho mọi picker. */\nexport const OG_PICKER_THEME_META: readonly OgThemeMeta[] = OG_THEME_META.filter((t) =>\n OG_PICKER_THEMES.includes(t.name)\n);\n\n/**\n * V2 theme switching: one `data-og-theme` attribute on <html> selects the\n * --og-* token block (theme.css). During the migration window the service\n * also mirrors the legacy `light_theme` class on <body> so remotes built\n * against the pre-V2 stylesheet keep resolving the correct palette\n * (see the SKEW SHIELD note in theme.css).\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private renderer: Renderer2;\n private lightClass = 'light_theme';\n private theme$ = new BehaviorSubject<OgTheme>('porcelain');\n themeStorageKey = 'host-theme';\n\n constructor(rendererFactory: RendererFactory2) {\n this.renderer = rendererFactory.createRenderer(null, null);\n this.setTheme(this.readSavedTheme());\n }\n\n /** Primary API: activate one of the six V2 themes. */\n setTheme(theme: OgTheme) {\n if (!OG_THEMES.includes(theme)) theme = 'porcelain';\n\n this.renderer.setAttribute(document.documentElement, 'data-og-theme', theme);\n\n // Skew shim for not-yet-migrated remote stylesheets (.light_theme era).\n if (this.isLightTheme(theme)) {\n this.renderer.addClass(document.body, this.lightClass);\n } else {\n this.renderer.removeClass(document.body, this.lightClass);\n }\n\n localStorage.setItem(this.themeStorageKey, theme);\n this.theme$.next(theme);\n\n // detail.dark is the pre-V2 contract (chart rebuilds on it); detail.theme\n // is new. Listeners must re-read colors on EVERY event — two light themes\n // can differ even though `dark` did not change.\n window.dispatchEvent(\n new CustomEvent('theme-changed', { detail: { dark: !this.isLightTheme(theme), theme } })\n );\n }\n\n themeChanges(): Observable<OgTheme> {\n return this.theme$.asObservable();\n }\n\n getCurrentTheme(): OgTheme {\n return this.theme$.value;\n }\n\n isLight(): boolean {\n return this.isLightTheme(this.theme$.value);\n }\n\n /** @deprecated V2: use setTheme(). Maps light→porcelain, dark→charcoal. */\n setLightMode(enable: boolean) {\n this.setTheme(enable ? 'porcelain' : 'charcoal');\n }\n\n /** @deprecated V2: use setTheme(). Flips between the two default themes. */\n toggleTheme() {\n this.setTheme(this.isLight() ? 'charcoal' : 'porcelain');\n }\n\n getLogoPath(): string {\n return 'assets/images/logo.png';\n }\n\n private isLightTheme(theme: OgTheme): boolean {\n return OG_LIGHT_THEMES.includes(theme);\n }\n\n private readSavedTheme(): OgTheme {\n const saved = localStorage.getItem(this.themeStorageKey);\n // Migrate pre-V2 stored values.\n if (saved === 'light') return 'porcelain';\n if (saved === 'dark') return 'charcoal';\n return OG_THEMES.includes(saved as OgTheme) ? (saved as OgTheme) : 'porcelain';\n }\n}\n","import { Injectable } from '@angular/core';\nimport * as signalR from '@microsoft/signalr';\nimport { Observable } from 'rxjs';\n\nexport type NotificationCallback = (...args: any[]) => void;\n\nexport interface NotificationConnectOptions {\n headers?: any;\n accessTokenFactory?: () => string | Promise<string>;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationService {\n private hubConnection: signalR.HubConnection | null = null;\n private connectionStatus: 'disconnected' | 'connecting' | 'connected' = 'disconnected';\n\n /**\n * Single source of truth for subscriptions. The hub connection gets exactly\n * one dispatcher per event, so:\n * - off(event, callback) can remove one subscriber without nuking the rest\n * (hubConnection.off(event) removes every handler for the event);\n * - handlers registered before connect() are attached once connected;\n * - handlers survive a re-connect that builds a new HubConnection.\n */\n private handlers = new Map<string, Set<NotificationCallback>>();\n\n private connectPromise: Promise<void> | null = null;\n private lastHubUrl: string | null = null;\n private lastOptions?: NotificationConnectOptions;\n private manualDisconnect = false;\n private restartAttempts = 0;\n private restartTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Connect to SignalR Hub. Overlapping calls share the same in-flight\n * promise instead of building two competing connections.\n */\n async connect(hubUrl: string, options?: NotificationConnectOptions): Promise<void> {\n if (this.hubConnection && this.connectionStatus === 'connected') {\n return;\n }\n if (this.connectPromise) {\n return this.connectPromise;\n }\n\n this.connectPromise = this.doConnect(hubUrl, options).finally(() => {\n this.connectPromise = null;\n });\n return this.connectPromise;\n }\n\n private async doConnect(hubUrl: string, options?: NotificationConnectOptions): Promise<void> {\n try {\n this.connectionStatus = 'connecting';\n this.manualDisconnect = false;\n this.lastHubUrl = hubUrl;\n this.lastOptions = options;\n\n const connectionOptions: signalR.IHttpConnectionOptions = {\n skipNegotiation: true,\n transport: signalR.HttpTransportType.WebSockets,\n withCredentials: true, // Include cookies if any\n ...options\n };\n\n this.hubConnection = new signalR.HubConnectionBuilder()\n .withUrl(hubUrl, connectionOptions)\n .withAutomaticReconnect()\n .configureLogging(signalR.LogLevel.Information)\n .build();\n\n // A new HubConnection knows nothing about previous listeners:\n // re-attach one dispatcher per known event.\n for (const eventName of this.handlers.keys()) {\n this.attachDispatcher(eventName);\n }\n\n // Fires when the automatic-reconnect policy is exhausted (or the\n // server closes the socket). Restart with backoff unless the app\n // disconnected on purpose.\n this.hubConnection.onclose((error) => {\n this.connectionStatus = 'disconnected';\n if (error) {\n console.error('SignalR connection closed with error:', error);\n }\n if (!this.manualDisconnect) {\n this.scheduleRestart();\n }\n });\n\n this.hubConnection.onreconnecting(() => {\n this.connectionStatus = 'connecting';\n });\n\n this.hubConnection.onreconnected(() => {\n this.connectionStatus = 'connected';\n this.restartAttempts = 0;\n });\n\n await this.hubConnection.start();\n this.connectionStatus = 'connected';\n this.restartAttempts = 0;\n } catch (error) {\n this.connectionStatus = 'disconnected';\n console.error('Error connecting to SignalR hub:', error);\n throw error;\n }\n }\n\n private scheduleRestart(): void {\n if (this.restartTimer || !this.lastHubUrl) {\n return;\n }\n const delay = Math.min(30_000, 1_000 * 2 ** this.restartAttempts++);\n this.restartTimer = setTimeout(async () => {\n this.restartTimer = null;\n try {\n await this.connect(this.lastHubUrl!, this.lastOptions);\n } catch {\n this.scheduleRestart();\n }\n }, delay);\n }\n\n /**\n * Disconnect from SignalR Hub. Stops any pending auto-restart.\n */\n async disconnect(): Promise<void> {\n this.manualDisconnect = true;\n if (this.restartTimer) {\n clearTimeout(this.restartTimer);\n this.restartTimer = null;\n }\n if (this.hubConnection) {\n try {\n await this.hubConnection.stop();\n this.connectionStatus = 'disconnected';\n } catch (error) {\n console.error('Error disconnecting from SignalR hub:', error);\n }\n }\n }\n\n /**\n * Listen to a specific event from the server. Safe to call before\n * connect(): the handler is attached once the connection is up.\n */\n on(eventName: string, callback: NotificationCallback): void {\n let set = this.handlers.get(eventName);\n if (!set) {\n set = new Set<NotificationCallback>();\n this.handlers.set(eventName, set);\n this.attachDispatcher(eventName);\n }\n set.add(callback);\n }\n\n /**\n * Remove listener(s) for an event.\n * Prefer passing the callback (or using on$()): calling off(event) without\n * one removes EVERY handler for the event, including other features'.\n */\n off(eventName: string, callback?: NotificationCallback): void {\n const set = this.handlers.get(eventName);\n if (!set) {\n return;\n }\n if (callback) {\n set.delete(callback);\n } else {\n console.warn(\n `NotificationService.off('${eventName}') without a callback removes ALL handlers for this event. ` +\n 'Pass the callback registered with on(), or migrate to on$().'\n );\n set.clear();\n }\n if (set.size === 0) {\n this.handlers.delete(eventName);\n this.hubConnection?.off(eventName);\n }\n }\n\n /**\n * Observable stream of an event. Teardown removes exactly this\n * subscriber — the safe replacement for manual on()/off().\n * Emits the event's first argument (SignalR payloads are single-arg here).\n */\n on$<T = any>(eventName: string): Observable<T> {\n return new Observable<T>((subscriber) => {\n const callback: NotificationCallback = (payload: T) => subscriber.next(payload);\n this.on(eventName, callback);\n return () => this.off(eventName, callback);\n });\n }\n\n private attachDispatcher(eventName: string): void {\n if (!this.hubConnection) {\n return;\n }\n this.hubConnection.on(eventName, (...args: any[]) => this.dispatch(eventName, args));\n }\n\n private dispatch(eventName: string, args: any[]): void {\n const set = this.handlers.get(eventName);\n if (!set) {\n return;\n }\n // Copy: a callback may add/remove handlers while we iterate.\n for (const callback of [...set]) {\n try {\n callback(...args);\n } catch (error) {\n console.error(`Error in '${eventName}' notification handler:`, error);\n }\n }\n }\n\n /**\n * Invoke a method on the server\n * @param methodName - Name of the method to invoke\n * @param args - Arguments to pass to the method\n */\n async invoke(methodName: string, ...args: any[]): Promise<any> {\n if (!this.hubConnection || this.connectionStatus !== 'connected') {\n throw new Error('Not connected to SignalR hub');\n }\n\n try {\n return await this.hubConnection.invoke(methodName, ...args);\n } catch (error) {\n console.error(`Error invoking method ${methodName}:`, error);\n throw error;\n }\n }\n\n /**\n * Get current connection status\n */\n getConnectionStatus(): 'disconnected' | 'connecting' | 'connected' {\n return this.connectionStatus;\n }\n\n /**\n * Get connection ID\n */\n getConnectionId(): string | null {\n return this.hubConnection?.connectionId ?? null;\n }\n}\n","import { Component, Input, ViewEncapsulation, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n@Component({\n selector: 'fx-ui-button',\n templateUrl: './button.component.html',\n styleUrl: './button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, HeroIconComponent],\n})\nexport class ButtonComponent {\n @Input() label: string;\n readonly disabled = input(false);\n readonly buttonVariant = input<'default' | 'primary' | 'success' | 'cta' | 'alternative'>('alternative');\n @Input() icon?: any;\n readonly class = input<any>();\n readonly loading = input(false);\n /** Native button type. Defaults to 'button' so it never implicitly submits a form. */\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n /** Accessible name for icon-only usage (icon set, no label). */\n readonly ariaLabel = input('');\n readonly clicked = output<void>();\n\n onClick() {\n if (!this.disabled()) this.clicked.emit();\n }\n}\n","<button\n [attr.type]=\"type()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-busy]=\"loading() || null\"\n [class]=\"class()\"\n [ngClass]=\"{\n 'btn-default': buttonVariant() === 'default',\n 'btn-primary': buttonVariant() === 'primary',\n 'btn-success': buttonVariant() === 'success',\n 'btn-cta': buttonVariant() === 'cta',\n 'btn-alternative': buttonVariant() === 'alternative',\n }\"\n [disabled]=\"disabled() || loading()\"\n (click)=\"onClick()\"\n>\n @if (loading()) {\n <div class=\"flex w-full items-center justify-center\" aria-hidden=\"true\">\n <svg\n [attr.fill]=\"\n buttonVariant() !== 'alternative' ? 'rgb(var(--text-primary))' : 'rgb(var(--primary))'\n \"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"4\" cy=\"12\" r=\"0\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_lo66\"\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_z0Or\"\n begin=\"spinner_lo66.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_JsnR\"\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_Aguh\"\n begin=\"spinner_JsnR.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_hSjk\"\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_UHR2\"\n begin=\"spinner_hSjk.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\">\n <animate\n id=\"spinner_4v5M\"\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_OLMs\"\n begin=\"spinner_4v5M.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n </circle>\n </svg>\n </div>\n } @else {\n <ng-container>\n <div class=\"flex items-center justify-center gap-small\">\n @if (icon) {\n <fx-ui-hero-icon\n [icon]=\"icon\"\n [size]=\"16\"\n class=\"flex\"\n [ngClass]=\"{\n 'text-text-inverse': buttonVariant() === 'default',\n 'text-text-primary': buttonVariant() === 'alternative',\n 'text-accent-contrast': buttonVariant() === 'primary',\n 'text-surface': buttonVariant() === 'success',\n 'text-white': buttonVariant() === 'cta',\n }\"\n ></fx-ui-hero-icon>\n }\n @if (label) {\n <!-- text-box: optical centering — Archivo's leading floats ink up otherwise -->\n <div class=\"[text-box:trim-both_cap_alphabetic]\">{{ label }}</div>\n }\n </div>\n </ng-container>\n }\n</button>\n","import { Component, Inject, ChangeDetectionStrategy } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef, MatDialogTitle, MatDialogContent, MatDialogActions } from '@angular/material/dialog';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport { ButtonComponent } from '../../components/button/button.component';\n\n@Component({\n selector: 'fx-ui-confirmation-dialog',\n templateUrl: './confirmation.component.html',\n styleUrl: './confirmation.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatDialogTitle,\n CdkScrollable,\n MatDialogContent,\n MatDialogActions,\n ButtonComponent,\n ],\n})\nexport class ConfirmationDialogComponent {\n loading = false;\n title = '';\n message = '';\n cancelLabel = 'Cancel';\n confirmLabel = 'Submit';\n\n constructor(\n private ref: MatDialogRef<ConfirmationDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public bindings: any\n ) {\n this.title = bindings?.['title'];\n this.message = bindings?.['message'];\n this.cancelLabel = bindings?.['cancelLabel'];\n this.confirmLabel = bindings?.['confirmLabel'];\n }\n\n async accept() {\n this.loading = true;\n if (this.bindings?.['callback']) {\n await this.bindings.callback();\n this.loading = false;\n }\n this.ref.close(true);\n }\n\n cancel() {\n this.ref.close(false);\n }\n}\n","<div animate.enter=\"fade-in-animation\" class=\"dialog-container\">\n <h1 mat-dialog-title class=\"txt-heading-05 dialog-header\">{{ title }}</h1>\n <mat-dialog-content>\n <div class=\"txt-default\">{{ message }}</div>\n </mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <fx-ui-button class=\"mr-1\" [label]=\"cancelLabel\" (clicked)=\"cancel()\"></fx-ui-button>\n <fx-ui-button\n buttonVariant=\"primary\"\n class=\"mr-1\"\n [label]=\"confirmLabel\"\n (clicked)=\"accept()\"\n [loading]=\"loading\"\n class=\"min-w-[100px]\"\n ></fx-ui-button>\n </mat-dialog-actions>\n</div>\n","import { Injectable, TemplateRef, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { ConfirmationDialogComponent } from '../../ui/dialogs/confirmation/confirmation.component';\n\nexport interface FxConfirmOptions {\n title?: string;\n message?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n}\n\n/**\n * Thin façade over MatDialog so app code never imports @angular/material\n * directly (behavior-layer rule, Playbook §5.1). Same semantics — the\n * returned ref is the Material one, typed through this service.\n */\n@Injectable({ providedIn: 'root' })\nexport class FxDialogService {\n private dialog = inject(MatDialog);\n\n open<T, D = any, R = any>(\n component: ComponentType<T> | TemplateRef<T>,\n config?: MatDialogConfig<D>,\n ): MatDialogRef<T, R> {\n return this.dialog.open(component, config);\n }\n\n /** Standard confirmation flow — resolves true when the user confirms. */\n async confirm(options: FxConfirmOptions = {}): Promise<boolean> {\n // ConfirmationDialogComponent reads MAT_DIALOG_DATA as its bindings and\n // closes with true/false.\n const ref = this.dialog.open(ConfirmationDialogComponent, { data: { ...options } });\n return !!(await firstValueFrom(ref.afterClosed()));\n }\n\n closeAll(): void {\n this.dialog.closeAll();\n }\n}\n","import { ChangeDetectorRef, Directive, Input, inject } from '@angular/core';\nimport { ControlValueAccessor, NgControl, ValidationErrors } from '@angular/forms';\nimport { FxUtils } from '../../core/utils';\n\nexport type ErrorMessages = Record<string, any>;\n\n@Directive()\nexport abstract class FxComponent<T> implements ControlValueAccessor {\n /**\n * Injected via inject() rather than a constructor parameter: parameter\n * decorators (@Optional/@Self) are NOT inherited by subclasses, which used\n * to make every control crash when used without a form binding, or silently\n * bind to an ancestor's NgControl.\n */\n public ngControl = inject(NgControl, { optional: true, self: true });\n\n /** With OnPush, programmatic writes (form.setValue / setDisabledState) must\n * mark the view — CVA calls come from outside the component's own events. */\n protected cdr = inject(ChangeDetectorRef);\n\n @Input() disabled = false;\n\n value: T;\n public onChange: (value: T) => void = () => undefined;\n public onTouched: () => void = () => undefined;\n\n validationError?: ErrorMessages;\n errorMessages?: ErrorMessages;\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n setValue(value: T) {\n if (this.onChange) {\n this.onChange(value);\n }\n }\n\n onEnter(value: T) {\n if (this.onChange) {\n this.onChange(value);\n }\n }\n\n writeValue(value: T): void {\n // Pass through as-is. Coercing null to '' here broke boolean/number\n // controls; string controls that want '' as their empty value override.\n this.value = value;\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n\n get invalid(): boolean {\n return !!(this.ngControl?.invalid && this.ngControl?.touched);\n }\n\n get errors(): Record<string, any> {\n return this.ngControl?.errors || {};\n }\n\n validate(validateFn?: (value: T) => ValidationErrors | null | undefined): void {\n if (this.invalid) return;\n if (validateFn) {\n const error = validateFn(this.value);\n if (FxUtils.isNotNull(error)) {\n this.setErrors(error ?? {});\n }\n }\n }\n\n public setErrors(error: ValidationErrors) {\n this.validationError = error;\n const control = this.ngControl?.control;\n if (!control) return;\n control.setErrors({ ...control.errors, ...error });\n }\n\n /**\n * Removes only the errors this component set imperatively via setErrors().\n * Errors owned by the validator pipeline (built-in or custom validators)\n * are left untouched.\n */\n public clearErrors() {\n const control = this.ngControl?.control;\n if (!control || !this.validationError) return;\n const remaining = { ...(control.errors || {}) };\n for (const key of Object.keys(this.validationError)) {\n delete remaining[key];\n }\n this.validationError = undefined;\n control.setErrors(Object.keys(remaining).length ? remaining : null);\n }\n\n getErrorMessage(label?: string): string | null {\n if (!this.errors) return null;\n const displayLabel = FxUtils.isStringEmpty(label ?? '') ? 'This field' : label;\n const defaultMessages: ErrorMessages = {\n required: `${displayLabel} is required`,\n minlength: `${displayLabel} minimum length is ${this.errors['minlength']?.requiredLength}`,\n email: 'Please enter a valid email',\n };\n const messages = { ...defaultMessages, ...this.validationError, ...this.errorMessages };\n const firstKey = Object.keys(this.errors)[0];\n return messages[firstKey] || `Invalid ${label ?? 'value'}`;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n Input,\n ChangeDetectionStrategy,\n input,\n output\n} from '@angular/core';\nimport { FxComponent } from '../fx-component.component';\nimport { NgClass } from '@angular/common';\n\n@Component({\n selector: 'fx-ui-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrl: './checkbox.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class CheckboxComponent extends FxComponent<any> implements AfterViewInit {\n @Input() label = '';\n readonly rounded = input<boolean>();\n readonly valueChange = output<boolean>();\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n override writeValue(value: any): void {\n this.value = value ?? false;\n }\n\n onInputChange(event: Event) {\n const checked = (event.target as HTMLInputElement).checked;\n this.value = checked;\n this.onChange(checked);\n this.valueChange.emit(checked);\n }\n\n markTouched() {\n this.onTouched();\n }\n}\n","<label\n class=\"flex items-center gap-normal cursor-pointer select-none\"\n [class.opacity-50]=\"disabled\"\n [class.cursor-not-allowed]=\"disabled\"\n>\n <!-- sr-only (not `hidden`): keeps the input focusable and in the a11y tree -->\n <input\n type=\"checkbox\"\n class=\"peer sr-only\"\n [checked]=\"value\"\n [disabled]=\"disabled\"\n (change)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n <span\n class=\"relative w-4 h-4 border rounded-full transition-colors duration-150 shrink-0 peer-focus-visible:ring-2 peer-focus-visible:ring-primary/50\"\n [ngClass]=\"{\n 'rounded-full': rounded(),\n 'rounded-sm': !rounded(),\n 'border-border-strong bg-transparent': !value,\n 'border-transparent bg-gradient-primary': value,\n }\"\n >\n <!-- Keep SVG space reserved always -->\n <span class=\"absolute inset-0 flex items-center justify-center\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-accent-contrast w-4 h-4 transition-opacity duration-150\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [style.opacity]=\"value ? 1 : 0\"\n >\n <path d=\"M5 13l4 4L19 7\" />\n </svg>\n </span>\n </span>\n\n @if (label) {\n <span class=\"mb-0 txt-field-label\">{{ label }}</span>\n }\n</label>\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\n\n@Component({\n selector: 'fx-ui-circle-progress-bar',\n templateUrl: './circle-progress-bar.component.html',\n styleUrl: './circle-progress-bar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CircleProgressBar {\n readonly percent = input(0);\n readonly showPercent = input(false);\n\n readonly radius = 35;\n readonly stroke = 10;\n readonly normalizedRadius = this.radius - this.stroke / 2;\n readonly circumference = 2 * Math.PI * this.normalizedRadius;\n\n get dashOffset(): number {\n const clamped = Math.max(0, Math.min(100, this.percent()));\n return this.circumference - (clamped / 100) * this.circumference;\n }\n\n get ariaLabel(): string {\n return `${Math.round(this.percent())}%`;\n }\n}\n","<div class=\"flex items-center justify-center w-full h-full\">\n <svg\n class=\"transform -rotate-90 block\"\n [attr.viewBox]=\"'0 0 ' + radius * 2 + ' ' + radius * 2\"\n width=\"100%\"\n height=\"100%\"\n >\n <circle\n class=\"opacity-20\"\n [attr.cx]=\"radius\"\n [attr.cy]=\"radius\"\n [attr.r]=\"normalizedRadius\"\n [attr.stroke-width]=\"stroke\"\n fill=\"transparent\"\n stroke=\"currentColor\"\n ></circle>\n\n <circle\n class=\"stroke-current\"\n [attr.cx]=\"radius\"\n [attr.cy]=\"radius\"\n [attr.r]=\"normalizedRadius\"\n [attr.stroke-width]=\"stroke\"\n fill=\"transparent\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"circumference\"\n [attr.stroke-dashoffset]=\"dashOffset\"\n style=\"transition: stroke-dashoffset 300ms linear\"\n ></circle>\n\n @if(showPercent()){\n <text\n [attr.x]=\"radius\"\n [attr.y]=\"radius\"\n dominant-baseline=\"central\"\n text-anchor=\"middle\"\n class=\"text-xs font-medium\"\n fill=\"currentColor\"\n >\n {{ percent() }}%\n </text>\n }\n </svg>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n input\n} from '@angular/core';\nimport { ErrorMessages, FxComponent } from '../fx-component.component';\nimport { ValidationErrors } from '@angular/forms';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatTimepickerModule } from '@angular/material/timepicker';\nimport { MAT_DATE_LOCALE, provideNativeDateAdapter } from '@angular/material/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nlet nextPickerId = 0;\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/**\n * Date/time field backed by first-party Material pickers (mat-datepicker +\n * mat-timepicker, the latter first-party since Material 19) — replaces the\n * former @danielmoncada/angular-datetime-picker + moment adapter stack.\n *\n * The public contract is unchanged: the CVA value is a plain string\n * ('YYYY-MM-DD HH:mm' for type 'both', 'YYYY-MM-DD' for 'calendar',\n * 'HH:mm' for 'timer'), so existing forms keep working as-is.\n */\n@Component({\n selector: 'fx-ui-datetime-picker',\n templateUrl: './datetime-picker.component.html',\n styleUrl: './datetime-picker.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDatepickerModule, MatTimepickerModule, HeroIconComponent],\n providers: [\n provideNativeDateAdapter(),\n // en-GB display ⇒ DD/MM/YYYY + 24h — matches FxUtils.formatDateTime.\n { provide: MAT_DATE_LOCALE, useValue: 'en-GB' },\n ],\n})\nexport class DatetimePicker extends FxComponent<any> implements AfterViewInit {\n @Input() label?: string;\n readonly placeholder = input('Select date and time');\n readonly required = input(false);\n /** 'both' | 'calendar' | 'timer' — same values the Owl picker accepted. */\n readonly type = input<'both' | 'calendar' | 'timer'>('both');\n readonly minDate = input<any>();\n readonly maxDate = input<any>();\n @Input() override errorMessages: ErrorMessages = {};\n readonly validateFn = input<(date: string) => ValidationErrors | null>();\n\n readonly fieldId = `fx-datetime-${nextPickerId++}`;\n\n /** Internal Date the Material pickers operate on; `value` stays a string. */\n dateValue: Date | null = null;\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n this.ref.detectChanges();\n });\n }\n\n get showDate(): boolean {\n return this.type() !== 'timer';\n }\n get showTime(): boolean {\n return this.type() !== 'calendar';\n }\n get min(): Date | null {\n return this.toDate(this.minDate());\n }\n get max(): Date | null {\n return this.toDate(this.maxDate());\n }\n\n onBlur() {\n this.onTouched();\n this.validate(this.validateFn());\n }\n\n override writeValue(value: any): void {\n this.value = value ?? '';\n this.dateValue = this.toDate(value);\n this.ref.markForCheck();\n }\n\n onDateChange(date: Date | null): void {\n if (this.disabled) return;\n const next = date ? new Date(date) : null;\n // Keep the already-picked time when only the calendar part changes.\n if (next && this.dateValue) {\n next.setHours(this.dateValue.getHours(), this.dateValue.getMinutes(), 0, 0);\n }\n this.commit(next);\n }\n\n onTimeChange(time: Date | null): void {\n if (this.disabled || !time) return;\n const next = this.dateValue ? new Date(this.dateValue) : new Date();\n next.setHours(time.getHours(), time.getMinutes(), 0, 0);\n this.commit(next);\n }\n\n private commit(next: Date | null): void {\n this.dateValue = next;\n this.value = this.format(next);\n this.onChange(this.value);\n this.onTouched();\n this.ref.markForCheck();\n }\n\n private toDate(value: any): Date | null {\n if (!value) return null;\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value;\n // Accepted string shapes: 'YYYY-MM-DD', 'YYYY-MM-DD HH:mm[:ss]', 'HH:mm'.\n const s = String(value).trim();\n if (/^\\d{2}:\\d{2}/.test(s)) {\n const d = new Date();\n d.setHours(+s.slice(0, 2), +s.slice(3, 5), 0, 0);\n return d;\n }\n const d = new Date(s.replace(' ', 'T'));\n return isNaN(d.getTime()) ? null : d;\n }\n\n private format(d: Date | null): string {\n if (!d) return '';\n const date = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n const time = `${pad(d.getHours())}:${pad(d.getMinutes())}`;\n const type = this.type();\n if (type === 'calendar') return date;\n if (type === 'timer') return time;\n return `${date} ${time}`;\n }\n}\n","<div class=\"flex flex-col mb-4 w-full text-left\">\n @if (label) {\n <label class=\"txt-field-label\" [attr.for]=\"fieldId\">\n {{ label }}\n @if (required()) {\n <span class=\"txt-required\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n\n <div class=\"flex gap-normal\">\n @if (showDate) {\n <div class=\"relative flex-1\">\n <input\n [id]=\"fieldId\"\n [matDatepicker]=\"datePicker\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled\"\n [min]=\"min\"\n [max]=\"max\"\n [value]=\"dateValue\"\n (dateChange)=\"onDateChange($event.value)\"\n (click)=\"!disabled && datePicker.open()\"\n (blur)=\"onBlur()\"\n readonly\n class=\"input-default pr-9\"\n />\n <span\n (click)=\"!disabled && datePicker.open()\"\n class=\"absolute inset-y-0 right-0 flex items-center pr-2.5 cursor-pointer text-text-placeholder hover:text-text-primary transition-colors\"\n >\n <fx-ui-hero-icon icon=\"calendar\" [size]=\"20\" class=\"text-text-primary\"></fx-ui-hero-icon>\n </span>\n <mat-datepicker #datePicker></mat-datepicker>\n </div>\n }\n @if (showTime) {\n <div class=\"relative\" [class.flex-1]=\"!showDate\" [class.w-32]=\"showDate\">\n <input\n [matTimepicker]=\"timePicker\"\n placeholder=\"HH:mm\"\n [disabled]=\"disabled\"\n [value]=\"dateValue\"\n (valueChange)=\"onTimeChange($event)\"\n (click)=\"!disabled && timePicker.open()\"\n (blur)=\"onBlur()\"\n readonly\n class=\"input-default pr-9\"\n />\n <span\n (click)=\"!disabled && timePicker.open()\"\n class=\"absolute inset-y-0 right-0 flex items-center pr-2.5 cursor-pointer text-text-placeholder hover:text-text-primary transition-colors\"\n >\n <fx-ui-hero-icon icon=\"clock\" [size]=\"20\" class=\"text-text-primary\"></fx-ui-hero-icon>\n </span>\n <mat-timepicker #timePicker></mat-timepicker>\n </div>\n }\n </div>\n @if (invalid) {\n <div class=\"txt-invalid\">{{ getErrorMessage(label) }}</div>\n }\n</div>\n","import { Component, Input, ChangeDetectorRef, inject, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { NgStyle } from '@angular/common';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nexport interface UploadResult {\n files: File[];\n accepted: File[];\n rejected: { file: File; reason: string }[];\n}\n\n@Component({\n selector: 'fx-ui-dnd-upload',\n templateUrl: './dnd-upload.component.html',\n styleUrl: './dnd-upload.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgStyle, HeroIconComponent],\n})\nexport class DndUploadComponent {\n private cdr = inject(ChangeDetectorRef);\n readonly multiple = input(false);\n @Input() accept = '';\n readonly maxSizeMB = input(10);\n readonly strictSize = input(true);\n /** Icon name from heroicons (outline). Default: 'arrow-up-tray' */\n readonly icon = input('arrow-up-tray');\n /** CSS color value for accent (border, icon, link). Default uses --gradient-primary-start */\n readonly accentColor = input('');\n\n readonly fileDrop = output<File[]>();\n readonly fileClick = output<void>();\n readonly uploadComplete = output<File[]>();\n readonly uploadError = output<{\n file: File;\n reason: string;\n}>();\n\n isDragOver = false;\n private isOpening = false;\n\n get accentStyle(): Record<string, string> {\n const accentColor = this.accentColor();\n if (!accentColor) return {};\n return { '--dnd-accent': accentColor } as Record<string, string>;\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n this.isDragOver = true;\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n this.isDragOver = false;\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n this.isDragOver = false;\n\n if (!event.dataTransfer?.files?.length) return;\n const files = Array.from(event.dataTransfer.files);\n this.processFiles(files);\n }\n\n onAreaClick(inputEl: HTMLInputElement | null, event?: Event) {\n if (this.isOpening) return;\n this.isOpening = true;\n\n this.fileClick.emit();\n (event?.currentTarget as HTMLElement)?.blur?.();\n\n setTimeout(() => {\n inputEl?.click();\n this.isOpening = false;\n this.cdr.markForCheck();\n }, 0);\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n if (!input.files?.length) return;\n const files = Array.from(input.files);\n this.processFiles(files);\n input.value = '';\n }\n\n private processFiles(files: File[]) {\n const valid: File[] = [];\n\n const acceptedTypes = this.accept\n .split(',')\n .map((t) => t.trim().toLowerCase())\n .filter((t) => t);\n\n for (const file of files) {\n const sizeMB = file.size / 1024 / 1024;\n if (this.strictSize() && sizeMB > this.maxSizeMB()) {\n this.uploadError.emit({\n file,\n reason: `File too large: ${sizeMB.toFixed(2)} MB > ${this.maxSizeMB()} MB`,\n });\n continue;\n }\n if (acceptedTypes.length && !this.isAccepted(file, acceptedTypes)) {\n this.uploadError.emit({\n file,\n reason: `File type not allowed: \"${file.name}\"`,\n });\n continue;\n }\n valid.push(file);\n }\n if (valid.length) {\n this.fileDrop.emit(valid);\n this.onUpload(valid);\n }\n }\n\n private onUpload(files: File[]) {\n this.uploadComplete.emit(files);\n }\n\n private isAccepted(file: File, accepted: string[]): boolean {\n const fileType = file.type.toLowerCase();\n const fileExt = '.' + file.name.split('.').pop()!.toLowerCase();\n\n return accepted.some((a) => {\n if (a.startsWith('.')) {\n return a === fileExt;\n }\n if (a.endsWith('/*')) {\n return fileType.startsWith(a.replace('/*', ''));\n }\n return a === fileType;\n });\n }\n}\n","<div\n class=\"dnd-wrapper\"\n [ngStyle]=\"accentStyle\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <div\n role=\"button\"\n tabindex=\"0\"\n class=\"dnd-area\"\n [class.drag-over]=\"isDragOver\"\n (click)=\"onAreaClick(fileInput, $event)\"\n (keydown.enter)=\"onAreaClick(fileInput, $event)\"\n >\n <fx-ui-hero-icon\n [icon]=\"icon()\"\n [size]=\"40\"\n class=\"flex dnd-icon\"\n ></fx-ui-hero-icon>\n <div class=\"dnd-text\">\n <span class=\"dnd-link\">Click to upload</span>\n <span class=\"dnd-or\">or drag and drop</span>\n </div>\n <div class=\"dnd-hint\">\n @if (accept) {\n Accepted: {{ accept }}\n } @else {\n Any file type\n }\n — Max {{ maxSizeMB() }} MB\n </div>\n\n <input\n #fileInput\n type=\"file\"\n class=\"dnd-input\"\n [attr.multiple]=\"multiple() ? '' : null\"\n [attr.accept]=\"accept\"\n (change)=\"onFileSelected($event)\"\n />\n </div>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n Input,\n ChangeDetectionStrategy,\n input,\n output\n} from '@angular/core';\nimport { ValidationErrors } from '@angular/forms';\nimport { FxComponent } from '../fx-component.component';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { TrimOnBlurDirective } from '../../../core/directives/trim.directive';\n\nlet nextInputId = 0;\n\n@Component({\n selector: 'fx-ui-input',\n templateUrl: './input.component.html',\n styleUrls: ['./input.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n HeroIconComponent,\n MatTooltip,\n TrimOnBlurDirective,\n ],\n})\nexport class InputComponent extends FxComponent<string> implements AfterViewInit {\n @Input() label = '';\n @Input() tooltip = '';\n @Input() type = 'text';\n readonly placeholder = input('');\n @Input() override errorMessages: Record<string, string> = {};\n readonly required = input<string | boolean>(false);\n @Input() suffixIcon?: string;\n readonly class = input<any>();\n readonly maxlength = input<number>();\n readonly validateFn = input<(value: string) => ValidationErrors | null>();\n readonly blurred = output<void>();\n readonly focused = output<void>();\n readonly suffixClick = output<void>();\n /** Accessible name for the suffix icon button (it renders no text). */\n readonly suffixAriaLabel = input('');\n\n readonly fieldId = `fx-input-${nextInputId++}`;\n showPassword = false;\n validateError: ValidationErrors | null = null;\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n override writeValue(value: string): void {\n this.value = value ?? '';\n }\n\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n let newValue = input.value;\n\n const maxlength = this.maxlength();\n if (maxlength && newValue.length > maxlength) {\n newValue = newValue.slice(0, maxlength);\n input.value = newValue;\n }\n\n this.value = newValue;\n this.onChange(this.value);\n }\n\n onFocus() {\n this.clearErrors();\n this.focused.emit();\n }\n\n onBlur() {\n this.onTouched();\n this.blurred.emit();\n const validateFn = this.validateFn();\n if (validateFn) {\n this.validateError = validateFn(this.value);\n this.validate(validateFn);\n }\n }\n\n togglePassword(): void {\n this.showPassword = !this.showPassword;\n }\n\n onSuffixClick(): void {\n if (this.type === 'password') {\n this.togglePassword();\n } else {\n this.suffixClick.emit();\n }\n }\n\n get displayType(): string {\n if (this.type === 'password' && this.showPassword) return 'text';\n if (this.type === 'otp') return 'number';\n return this.type;\n }\n}\n","<div class=\"mb-4 text-left w-full text-text-primary\" [class]=\"class()\">\n @if (label) {\n <label class=\"block txt-field-label\" [attr.for]=\"fieldId\">\n {{ label }}\n @if (required()) {\n <span class=\"txt-required\" aria-hidden=\"true\">*</span>\n }\n @if (tooltip) {\n <fx-ui-hero-icon\n icon=\"information-circle\"\n [size]=\"16\"\n class=\"inline-block align-middle ml-0.5 text-text-secondary cursor-help relative -top-px\"\n [matTooltip]=\"tooltip\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n ></fx-ui-hero-icon>\n }\n </label>\n }\n\n <div class=\"relative\">\n <input\n appTrimOnBlur\n [appTrimOnBlurCollapse]=\"true\"\n [id]=\"fieldId\"\n [type]=\"displayType\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.maxlength]=\"maxlength()\"\n [attr.aria-invalid]=\"invalid || null\"\n [attr.aria-describedby]=\"invalid ? fieldId + '-error' : null\"\n [attr.aria-required]=\"required() ? true : null\"\n [class]=\"type === 'otp' ? 'input-otp' : 'input-default'\"\n [class.input-invalid]=\"invalid\"\n [class.pr-8]=\"type === 'password' || suffixIcon\"\n [class.txt-otp-input]=\"type === 'otp'\"\n />\n @if (type === 'password' || suffixIcon) {\n <button\n type=\"button\"\n class=\"absolute inset-y-0 right-2 flex items-center text-text-primary hover:text-text-secondary\"\n (click)=\"onSuffixClick()\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"\n type === 'password'\n ? (showPassword ? 'Hide password' : 'Show password')\n : (suffixAriaLabel() || null)\n \"\n [attr.aria-pressed]=\"type === 'password' ? showPassword : null\"\n >\n @if (type === 'password') {\n <fx-ui-hero-icon\n [icon]=\"showPassword ? 'eye-slash' : 'eye'\"\n [size]=\"18\"\n class=\"text-text-primary\"\n aria-hidden=\"true\"\n ></fx-ui-hero-icon>\n } @else if (suffixIcon) {\n <fx-ui-hero-icon\n [icon]=\"suffixIcon\"\n [size]=\"18\"\n class=\"text-text-primary\"\n aria-hidden=\"true\"\n ></fx-ui-hero-icon>\n }\n </button>\n }\n </div>\n\n @if (invalid) {\n <div class=\"txt-invalid\" role=\"alert\" [id]=\"fieldId + '-error'\">\n {{ getErrorMessage(label) }}\n </div>\n }\n</div>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\n\n@Component({\n selector: 'fx-ui-loading-panel',\n templateUrl: './loading-panel.component.html',\n styleUrl: './loading-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LoadingPanel {\n readonly show = input(false);\n @Input() message?: string = \"Loading\";\n}\n","<!-- Full-screen glass overlay -->\n@if (show()) {\n <div\n class=\"fixed inset-0 z-50 flex items-center justify-center\"\n aria-hidden=\"false\"\n role=\"alert\"\n aria-busy=\"true\"\n >\n <div class=\"absolute inset-0 bg-bg-primary/30 backdrop-blur-xl\" aria-hidden=\"true\"></div>\n <div\n class=\"relative z-10 flex flex-col items-center gap-4 p-6 rounded-2xl shadow-xl bg-bg-primary/70 border border-border-strong backdrop-bg-primary/70\"\n style=\"min-width: 220px; max-width: 90%\"\n >\n <svg fill=\"url(#spinner-gradient)\" width=\"50\" height=\"50\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <linearGradient id=\"spinner-gradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" style=\"stop-color: rgb(var(--gradient-primary-start)); stop-opacity: 1\" />\n <stop offset=\"100%\" style=\"stop-color: rgb(var(--gradient-primary-end)); stop-opacity: 1\" />\n </linearGradient>\n </defs>\n <circle cx=\"4\" cy=\"12\" r=\"0\">\n <animate begin=\"0;spinner_z0Or.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"0;3\" fill=\"freeze\"/>\n <animate begin=\"spinner_OLMs.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"4;12\" fill=\"freeze\"/>\n <animate begin=\"spinner_UHR2.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"12;20\" fill=\"freeze\"/>\n <animate id=\"spinner_lo66\" begin=\"spinner_Aguh.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"3;0\" fill=\"freeze\"/>\n <animate id=\"spinner_z0Or\" begin=\"spinner_lo66.end\" attributeName=\"cx\" dur=\"0.001s\" values=\"20;4\" fill=\"freeze\"/>\n </circle>\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate begin=\"0;spinner_z0Or.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"4;12\" fill=\"freeze\"/>\n <animate begin=\"spinner_OLMs.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"12;20\" fill=\"freeze\"/>\n <animate id=\"spinner_JsnR\" begin=\"spinner_UHR2.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"3;0\" fill=\"freeze\"/>\n <animate id=\"spinner_Aguh\" begin=\"spinner_JsnR.end\" attributeName=\"cx\" dur=\"0.001s\" values=\"20;4\" fill=\"freeze\"/>\n <animate begin=\"spinner_Aguh.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"0;3\" fill=\"freeze\"/>\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\">\n <animate begin=\"0;spinner_z0Or.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"12;20\" fill=\"freeze\"/>\n <animate id=\"spinner_hSjk\" begin=\"spinner_OLMs.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"3;0\" fill=\"freeze\"/>\n <animate id=\"spinner_UHR2\" begin=\"spinner_hSjk.end\" attributeName=\"cx\" dur=\"0.001s\" values=\"20;4\" fill=\"freeze\"/>\n <animate begin=\"spinner_UHR2.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"0;3\" fill=\"freeze\"/>\n <animate begin=\"spinner_Aguh.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"4;12\" fill=\"freeze\"/>\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\">\n <animate id=\"spinner_4v5M\" begin=\"0;spinner_z0Or.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"3;0\" fill=\"freeze\"/>\n <animate id=\"spinner_OLMs\" begin=\"spinner_4v5M.end\" attributeName=\"cx\" dur=\"0.001s\" values=\"20;4\" fill=\"freeze\"/>\n <animate begin=\"spinner_OLMs.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"0;3\" fill=\"freeze\"/>\n <animate begin=\"spinner_UHR2.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"4;12\" fill=\"freeze\"/>\n <animate begin=\"spinner_Aguh.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"12;20\" fill=\"freeze\"/>\n </circle>\n </svg>\n @if (message) {\n <div class=\"text-sm text-text-primary text-center\">\n {{ message }}\n </div>\n }\n </div>\n </div>\n}\n","import { AfterViewInit, ChangeDetectorRef, Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { ErrorMessages, FxComponent } from '../fx-component.component';\nimport { NgClass } from '@angular/common';\n\nlet nextToggleGroupId = 0;\n\n@Component({\n selector: 'fx-ui-radio-toggle, [fx-ui-radio-toggle]',\n templateUrl: './radio-button-toggle.component.html',\n styleUrl: './radio-button-toggle.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class RadioButtonToggleComponent extends FxComponent<any> implements AfterViewInit {\n readonly groupId = `fx-radio-toggle-${nextToggleGroupId++}`;\n @Input() label?: string;\n readonly required = input<boolean | undefined>(false);\n readonly options = input<{\n label: string;\n value: any;\n icon?: any;\n}[]>([]);\n @Input() override errorMessages: ErrorMessages = {};\n readonly class = input<any>();\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n onSelectValue(value: any): void {\n if (this.disabled) return;\n this.value = value;\n this.onChange(value);\n this.onTouched();\n }\n}\n","<div class=\"flex flex-col text-left mb-4 w-full\" [class]=\"class()\">\n <!-- A radiogroup has no single control a <label> could point at — name it via aria-labelledby. -->\n @if(label){<span class=\"txt-field-label\" [id]=\"groupId + '-label'\">\n {{ label }}\n @if(required()) {<span class=\"txt-required\" aria-hidden=\"true\">*</span>} </span\n >}\n\n <div\n class=\"inline-flex w-full rounded-lg overflow-hidden\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label ? groupId + '-label' : null\"\n >\n @for(opt of options(); track opt){<button\n type=\"button\"\n role=\"radio\"\n [attr.aria-checked]=\"value === opt.value\"\n (click)=\"onSelectValue(opt.value)\"\n [disabled]=\"disabled\"\n [class.text-strong]=\"value !== opt.value\"\n class=\"flex-1 bg-bg-primary flex items-center pl-normal gap-normal h-10 rounded-md hover:bg-bg-hover transition-all duration-150 disabled:opacity-60 disabled:cursor-not-allowed\"\n >\n <span\n [ngClass]=\"{\n 'radio-checked': value === opt.value,\n 'radio-uncheck': value !== opt.value\n }\"\n class=\"radio-container\"\n >\n @if(value === opt.value) {<span class=\"radio-dot\"></span>}\n </span>\n\n <span class=\"txt-field-label mb-0\">{{ opt.label }}</span></button\n >}\n </div>\n\n @if(invalid){\n <div class=\"txt-invalid\">{{ getErrorMessage(label) }}</div>\n }\n</div>\n","import { AfterViewInit, ChangeDetectorRef, Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { ErrorMessages, FxComponent } from '../fx-component.component';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { NgClass } from '@angular/common';\n\nexport interface IRadioButton {\n label: string;\n value: any;\n description?: string;\n tooltip?: string;\n}\n\nlet nextRadioGroupId = 0;\n\n@Component({\n selector: 'fx-ui-radio',\n templateUrl: './radio-button.component.html',\n styleUrls: ['./radio-button.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n HeroIconComponent,\n MatTooltip,\n NgClass,\n ],\n})\nexport class RadioButtonComponent extends FxComponent<IRadioButton> implements AfterViewInit {\n readonly groupId = `fx-radio-${nextRadioGroupId++}`;\n @Input() label?: string;\n @Input() tooltip = '';\n readonly required = input<boolean | undefined>(false);\n readonly options = input<{\n label: string;\n value: any;\n icon?: any;\n tooltip?: string;\n}[]>([]);\n @Input() override errorMessages: ErrorMessages = {};\n readonly class = input<any>();\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n onSelectValue(value: any): void {\n if (this.disabled) return;\n this.value = value;\n this.onChange(value);\n this.onTouched();\n }\n}\n","<div\n class=\"w-full rounded-lg overflow-hidden\"\n [class]=\"class()\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label ? groupId + '-label' : null\"\n >\n <!-- A radiogroup has no single control a <label> could point at — name it via aria-labelledby. -->\n @if (label) {\n <span class=\"txt-field-label block\" [id]=\"groupId + '-label'\">\n {{ label }}\n @if (required()) {\n <span class=\"txt-required\" aria-hidden=\"true\">*</span>\n }\n @if (tooltip) {\n <fx-ui-hero-icon\n icon=\"information-circle\"\n [size]=\"16\"\n class=\"inline-block align-middle ml-0.5 text-text-secondary cursor-help relative -top-px\"\n [matTooltip]=\"tooltip\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n ></fx-ui-hero-icon>\n }\n </span>\n }\n\n @for (opt of options(); track opt) {\n <button\n type=\"button\"\n role=\"radio\"\n [attr.aria-checked]=\"value === opt.value\"\n (click)=\"onSelectValue(opt.value)\"\n [disabled]=\"disabled\"\n [class.text-strong]=\"value !== opt.value\"\n class=\"flex-1 px-normal w-full flex items-center gap-normal h-10 rounded-md hover:bg-bg-hover transition-all duration-150 disabled:opacity-60 disabled:cursor-not-allowed\"\n [matTooltip]=\"opt.tooltip || ''\"\n matTooltipPosition=\"right\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n >\n <span\n [ngClass]=\"{\n 'radio-checked': value === opt.value,\n 'radio-uncheck': value !== opt.value,\n }\"\n class=\"radio-container\"\n >\n @if (value === opt.value) {\n <span class=\"radio-dot\"></span>\n }\n </span>\n <span class=\"txt-default mb-0\">{{ opt.label }}</span>\n </button>\n }\n @if (invalid) {\n <div class=\"txt-invalid\">\n {{ getErrorMessage(label) }}\n </div>\n }\n</div>\n","import { AfterViewInit, ChangeDetectorRef, Component, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { FxComponent } from '../fx-component.component';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n@Component({\n selector: 'fx-ui-search-bar',\n templateUrl: './search-bar.component.html',\n styleUrl: './search-bar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class SearchBarComponent extends FxComponent<string> implements AfterViewInit {\n /** FxComponent leaves `value` undefined; without ngModel the input would\n render the literal string \"undefined\". */\n override value = '';\n\n readonly placeholder = input('Search...');\n readonly search = output<string>();\n readonly valueChange = output<string>();\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n override writeValue(value: string): void {\n this.value = value ?? '';\n }\n \n onValueChange(value: string) {\n this.value = value;\n this.setValue(value);\n this.valueChange.emit(value);\n }\n\n onEnterKey() {\n this.onEnter(this.value);\n this.search.emit(this.value.trim());\n }\n\n clear() {\n this.value = '';\n this.setValue(this.value);\n this.valueChange.emit('');\n this.search.emit('');\n }\n}\n","<div class=\"relative\">\n <fx-ui-hero-icon icon=\"magnifying-glass\" [size]=\"18\" class=\"absolute left-1 top-[3px] text-text-primary\"></fx-ui-hero-icon>\n <input\n type=\"text\"\n class=\"input-default px-9\"\n [attr.placeholder]=\"placeholder()\"\n [disabled]=\"disabled\"\n [value]=\"value\"\n (input)=\"onValueChange($any($event.target).value)\"\n (keydown.enter)=\"onEnterKey()\"\n />\n\n @if (value && !disabled) {\n <button\n type=\"button\"\n class=\"absolute inset-y-0 right-2 flex items-center text-text-primary hover:text-text-secondary\"\n (click)=\"clear()\"\n aria-label=\"Clear\"\n >\n <i class=\"material-symbols-outlined text-lg select-none\">close</i>\n </button>\n }\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n Input,\n OnChanges,\n OnInit,\n SimpleChanges,\n inject, ChangeDetectionStrategy,\n input,\n output\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FxComponent } from '../fx-component.component';\nimport { Subject, debounceTime, distinctUntilChanged } from 'rxjs';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { MatFormField, MatSelect, MatOption } from '@angular/material/select';\nimport { FormsModule } from '@angular/forms';\n\nlet nextSelectId = 0;\n\n@Component({\n selector: 'fx-ui-select',\n templateUrl: './select.component.html',\n styleUrls: ['./select.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n HeroIconComponent,\n MatTooltip,\n MatFormField,\n MatSelect,\n FormsModule,\n MatOption,\n ],\n})\nexport class SelectComponent\n extends FxComponent<string | string[]>\n implements AfterViewInit, OnInit, OnChanges\n{\n @Input() label = '';\n @Input() tooltip = '';\n readonly placeholder = input('');\n readonly options = input<{\n label: string;\n value: string;\n}[]>([]);\n readonly multiple = input(false);\n @Input() override errorMessages: Record<string, string> = {};\n readonly required = input(false);\n readonly class = input<any>();\n readonly enableSearch = input(false);\n readonly searchFn = input<(query: string) => Promise<{\n label: string;\n value: string;\n}[]>>();\n /** Emits the current value when the select panel closes (useful for multiple mode). */\n readonly closed = output<string | string[]>();\n\n readonly fieldId = `fx-select-${nextSelectId++}`;\n searchTerm = '';\n filteredOptions: { label: string; value: string }[] = [];\n private search$ = new Subject<string>();\n private destroyRef = inject(DestroyRef);\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n\n // mat-select treats '' as \"nothing selected\"; keep the legacy empty value.\n override writeValue(value: string | string[]): void {\n this.value = value ?? '';\n }\n\n ngOnInit(): void {\n this.filteredOptions = this.options();\n\n this.search$\n .pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe((term) => this.performSearch(term));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Sync the rendered list when options arrive/refresh asynchronously\n // (ngOnInit captures the initial — often empty — array only).\n if (changes['options']) {\n this.filteredOptions = this.options() ?? [];\n this.ref?.detectChanges();\n }\n }\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n onOpened(open: boolean) {\n if (open) {\n this.filteredOptions = this.options();\n if (this.enableSearch()) this.searchTerm = '';\n } else {\n this.closed.emit(this.value);\n }\n }\n\n onSearchChange(value: string) {\n if (!this.enableSearch()) return;\n this.search$.next(value);\n }\n\n async performSearch(term: string) {\n if (!this.enableSearch()) return;\n \n const searchFn = this.searchFn();\n if (!searchFn) {\n this.filteredOptions = this.options().filter((o) =>\n o.label?.toLowerCase().includes(term.toLowerCase())\n );\n this.ref.detectChanges();\n return;\n }\n \n const result = await searchFn(term);\n this.filteredOptions = result;\n\n Promise.resolve().then(() => this.ref.detectChanges());\n }\n\n onSelectionChange(value: any): void {\n this.value = value;\n this.onChange(this.value);\n }\n\n isSelected(value: string): boolean {\n if (Array.isArray(this.value)) {\n return this.value.includes(value);\n }\n return this.value === value;\n }\n}\n","<div class=\"mb-4 text-left w-full\" [class]=\"class()\">\n @if (label) {\n <label class=\"block txt-field-label\" [attr.for]=\"fieldId\">\n {{ label }}\n @if (required()) {\n <span class=\"txt-required\" aria-hidden=\"true\">*</span>\n }\n @if (tooltip) {\n <fx-ui-hero-icon\n icon=\"information-circle\"\n [size]=\"16\"\n class=\"inline-block align-middle ml-0.5 text-text-secondary cursor-help relative -top-px\"\n [matTooltip]=\"tooltip\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n ></fx-ui-hero-icon>\n }\n </label>\n }\n\n <mat-form-field\n [attr.invalid]=\"invalid || null\"\n class=\"fx-select-field w-full shadow-sm\"\n appearance=\"fill\"\n >\n <mat-select\n [id]=\"fieldId\"\n [required]=\"!!required()\"\n [attr.aria-invalid]=\"invalid || null\"\n [attr.aria-describedby]=\"invalid ? fieldId + '-error' : null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple()\"\n [value]=\"value\"\n (selectionChange)=\"onSelectionChange($event.value)\"\n (openedChange)=\"onOpened($event)\"\n (blur)=\"onTouched()\"\n >\n @if (enableSearch()) {\n <div class=\"px-semi w-full\">\n <input\n type=\"text\"\n aria-label=\"Search\"\n [placeholder]=\"'Search'\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\"\n (click)=\"$event.stopPropagation()\"\n class=\"text-text-primary placeholder:text-text-placeholder w-full bg-bg-primary border-b px-semi py-normal border-border-default focus:outline-none focus:border-gradient-primary-start focus-visible:ring-2 focus-visible:ring-primary/50 text-sm text-text-primary tracking-normal ring-0 transition-colors duration-500 ease-in-out\"\n />\n </div>\n }\n @for (option of filteredOptions; track option) {\n <mat-option [value]=\"option.value\">\n <span class=\"txt-default\">{{ option.label }}</span>\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n @if (invalid) {\n <div class=\"txt-invalid text-left\" role=\"alert\" [id]=\"fieldId + '-error'\">\n {{ getErrorMessage(label) }}\n </div>\n }\n</div>\n","import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, HostListener, ChangeDetectionStrategy, input, output, viewChild } from '@angular/core';\nimport { FxComponent } from '../fx-component.component';\nimport { NgClass, NgStyle } from '@angular/common';\nimport { InputComponent } from '../input/input.component';\n\n@Component({\n selector: 'fx-ui-slider',\n templateUrl: './slider.component.html',\n styleUrl: './slider.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n NgStyle,\n InputComponent,\n ],\n})\nexport class SliderComponent extends FxComponent<any> implements AfterViewInit {\n readonly trackRef = viewChild.required<ElementRef<HTMLElement>>('track');\n readonly thumbRef = viewChild.required<ElementRef<HTMLElement>>('thumb');\n\n readonly min = input(0);\n readonly max = input(100);\n readonly step = input(1);\n readonly vertical = input(false);\n readonly valueChange = output<number>();\n dragging = false;\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n\n ngAfterViewInit(): void {\n this._normalizeValue(this.value);\n this.ref.markForCheck();\n }\n\n override setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.ref.markForCheck();\n }\n\n override writeValue(value: number): void {\n this.value = this._normalizeValue(value ?? this.min());\n this.ref.markForCheck();\n }\n\n private _normalizeValue(v: number): number {\n if (!Number.isFinite(v)) v = this.min();\n const clamped = Math.min(this.max(), Math.max(this.min(), v));\n const stepped =\n Math.round((clamped - this.min()) / this.step()) * this.step() + this.min();\n const precision = Math.max(0, this._decimalPlaces(this.step()));\n return parseFloat(stepped.toFixed(precision));\n }\n\n private _decimalPlaces(n: number) {\n const s = String(n);\n if (s.indexOf('.') === -1) return 0;\n return s.length - s.indexOf('.') - 1;\n }\n\n /** Pointer events */\n onPointerDown(event: PointerEvent) {\n if (this.disabled) return;\n (event.target as Element).setPointerCapture(event.pointerId);\n this.dragging = true;\n this._setFromPointer(event);\n }\n\n onPointerMove(event: PointerEvent) {\n if (!this.dragging || this.disabled) return;\n this._setFromPointer(event);\n }\n\n onPointerUp(event: PointerEvent) {\n if (this.disabled) return;\n try {\n (event.target as Element).releasePointerCapture(event.pointerId);\n } catch {\n // pointer capture may already be released\n }\n this.dragging = false;\n this.onTouched();\n }\n\n private _setFromPointer(event: PointerEvent) {\n const newVal = this._coordToValue(event.clientX, event.clientY);\n this._applyValue(newVal);\n }\n\n private _coordToValue(clientX: number, clientY: number) {\n const rect = this.trackRef().nativeElement.getBoundingClientRect();\n let ratio = this.vertical()\n ? 1 - (clientY - rect.top) / rect.height\n : (clientX - rect.left) / rect.width;\n ratio = Math.min(1, Math.max(0, ratio));\n const raw = this.min() + ratio * (this.max() - this.min());\n return this._normalizeValue(raw);\n }\n\n onTrackClick(event: MouseEvent) {\n if (this.disabled) return;\n const newVal = this._coordToValue(event.clientX, event.clientY);\n this._applyValue(newVal);\n this.onTouched();\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(ev: KeyboardEvent) {\n if (this.disabled) return;\n const key = ev.key;\n const largeStep = (this.max() - this.min()) / 10;\n let delta = 0;\n if (key === 'ArrowLeft' || key === 'ArrowDown') delta = -this.step();\n else if (key === 'ArrowRight' || key === 'ArrowUp') delta = this.step();\n else if (key === 'PageDown') delta = -largeStep;\n else if (key === 'PageUp') delta = largeStep;\n else if (key === 'Home') return this._applyValue(this.min());\n else if (key === 'End') return this._applyValue(this.max());\n\n if (delta !== 0) {\n this._applyValue(this.value + delta);\n ev.preventDefault();\n }\n }\n\n private _applyValue(newVal: number) {\n const v = this._normalizeValue(newVal);\n if (v !== this.value) {\n this.value = v;\n this.ref.markForCheck();\n this.valueChange.emit(v);\n this.onChange(v);\n }\n }\n\n get percent(): number {\n const min = this.min();\n const max = this.max();\n if (max === min) return 0;\n return ((this.value - min) / (max - min)) * 100;\n }\n\n thumbStyle() {\n return this.vertical()\n ? { bottom: `${this.percent}%`, transform: 'translateY(50%)' }\n : { left: `${this.percent}%`, transform: 'translateX(-50%)' };\n }\n\n}\n","<div\n class=\"w-full select-none\"\n [class.cursor-not-allowed]=\"disabled\"\n [class.opacity-60]=\"disabled\"\n role=\"group\"\n >\n <!-- Track click is a pointer shortcut; the thumb button below owns keyboard/focus. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n #track\n class=\"relative touch-none py-4\"\n (click)=\"onTrackClick($event)\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-orientation]=\"vertical() ? 'vertical' : 'horizontal'\"\n >\n <div\n class=\"relative flex items-center\"\n [ngClass]=\"{ 'flex-col h-48': vertical() }\"\n >\n <div\n class=\"relative flex-1 rounded-full bg-track h-2\"\n [ngClass]=\"{ 'w-1 rotate-0 h-full w-auto bg-track': vertical() }\"\n >\n @if (!vertical()) {\n <div\n class=\"absolute left-0 top-0 h-full rounded-full bg-primary\"\n [style.width.%]=\"percent\"\n ></div>\n }\n\n @if (vertical()) {\n <div\n class=\"absolute bottom-0 left-0 w-full rounded-full bg-primary\"\n [style.height.%]=\"percent\"\n style=\"transform-origin: bottom;\"\n ></div>\n }\n\n <button\n #thumb\n type=\"button\"\n class=\"absolute -mt-1 -ml-1.5 w-4 h-4 rounded-full shadow focus:ring-primary bg-primary border-2 border-text-primary\"\n [ngStyle]=\"thumbStyle()\"\n role=\"slider\"\n aria-label=\"Slider\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value\"\n [attr.aria-disabled]=\"disabled\"\n tabindex=\"0\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n [disabled]=\"disabled\"\n ></button>\n </div>\n </div>\n </div>\n</div>\n","import { AfterViewInit, ChangeDetectorRef, Component, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { FxComponent } from '../fx-component.component';\nimport { NgClass } from '@angular/common';\n\n@Component({\n selector: 'fx-ui-switch',\n templateUrl: './switch.component.html',\n styleUrl: './switch.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class SwitchComponent extends FxComponent<any> implements AfterViewInit {\n readonly onSwitch = output<boolean>();\n /** Accessible name — the switch renders no visible text of its own. */\n readonly ariaLabel = input('');\n\n ngAfterViewInit(): void {\n this.cdr.detectChanges();\n }\n\n override writeValue(value: any): void {\n this.value = value ?? false;\n }\n\n toggle() {\n if (this.disabled) return;\n this.value = !this.value;\n this.onSwitch.emit(this.value);\n this.onChange(this.value);\n this.onTouched();\n }\n}\n","<button\n type=\"button\"\n role=\"switch\"\n [attr.aria-checked]=\"!!value\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [disabled]=\"disabled\"\n class=\"relative flex items-center w-10 h-5 rounded-full transition-colors duration-300 cursor-pointer disabled:cursor-not-allowed focus-visible:ring-2 focus-visible:ring-primary/50\"\n [ngClass]=\"{\n 'tone-solid-success': value && !disabled,\n 'bg-button-default': !value && !disabled,\n 'bg-bg-hover': disabled\n }\"\n (click)=\"toggle()\"\n>\n @if(value) {\n <i style=\"font-size: 20px;\" class=\"material-symbols-outlined absolute left-0.5 top-0 text-text-inverse\" aria-hidden=\"true\">check</i>\n\n }\n @if(!value) {\n <i style=\"font-size: 20px;\" class=\"material-symbols-outlined absolute right-0.5 top-0 text-text-inverse\" aria-hidden=\"true\">close</i>\n }\n <div\n class=\"absolute top-0.5 left-0.5 w-4 h-4 bg-text-inverse rounded-full shadow-md transform transition-transform duration-300\"\n [ngClass]=\"{ 'translate-x-5': value }\"\n ></div>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n TemplateRef,\n contentChild,\n input,\n} from '@angular/core';\nimport { Tone } from '../../../core/value-tone.util';\n\n/**\n * Một tab của `fx-ui-tab-group`.\n *\n * ⚠️ Nội dung tab PHẢI bọc trong `<ng-template>`:\n *\n * ```html\n * <fx-ui-tab [label]=\"'Components'\">\n * <ng-template>\n * <app-info-components … />\n * </ng-template>\n * </fx-ui-tab>\n * ```\n *\n * Vì sao bắt buộc: trước đây tab dùng `<ng-content>` bọc trong `<ng-template>`\n * của CHÍNH nó. Cách đó **không hoãn được gì** — `<ng-content>` chỉ CHIẾU node,\n * còn node do view khai báo (component cha) tạo **eager**. Kết quả: mọi tab đều\n * khởi tạo và gọi API ngay khi vào màn, dù người dùng chưa mở (đo được trên\n * scan-info: cả 8 cụm cùng fetch). Nhận `TemplateRef` từ cha thì nội dung chỉ\n * được dựng khi tab-group stamp template đó.\n *\n * Hệ quả cần biết: đổi tab sẽ **huỷ** nội dung tab cũ và dựng lại khi quay lại\n * — đúng bản chất lazy, giống `matTabContent` của Material.\n *\n * `descendants: false` để chỉ bắt `<ng-template>` là con TRỰC TIẾP, tránh nuốt\n * nhầm template lồng sâu bên trong nội dung tab.\n */\n@Component({\n selector: 'fx-ui-tab',\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TabComponent {\n readonly label = input.required<string>();\n @Input() icon?: string;\n /** Trailing count badge (V2 'page' variant); null/undefined hides it. */\n readonly count = input<number | null>(null);\n /** Tints the count badge (e.g. vulnerabilities tab shows a danger count). */\n readonly tone = input<Tone | null>(null);\n\n readonly content = contentChild.required(TemplateRef, { descendants: false });\n}\n","import {\n AfterContentInit,\n AfterViewChecked,\n Component,\n ElementRef,\n Input,\n OnChanges,\n Renderer2,\n SimpleChanges,\n HostListener, ChangeDetectorRef, inject, ChangeDetectionStrategy,\n contentChildren,\n input,\n output,\n viewChild\n} from '@angular/core';\nimport { TabComponent } from '../tab-component/tab.component';\nimport { toneBadge } from '../../../core/value-tone.util';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { InputComponent } from '../input/input.component';\n\n@Component({\n selector: 'fx-ui-tab-group',\n templateUrl: './tab-group.component.html',\n styleUrl: './tab-group.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n HeroIconComponent,\n NgClass,\n NgTemplateOutlet,\n InputComponent,\n ],\n})\nexport class TabGroupComponent implements AfterContentInit, AfterViewChecked, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n readonly tabs = contentChildren(TabComponent);\n @Input() activeIndex = 0;\n /** Emitted on user selection — enables [(activeIndex)] two-way binding. */\n readonly activeIndexChange = output<number>();\n /** 'page' = the V2 workspace tab strip (larger hit area, count badges). */\n readonly variant = input<'default' | 'page'>('default');\n\n readonly tabListRef = viewChild.required<ElementRef<HTMLElement>>('tabList');\n readonly underlineRef = viewChild<ElementRef<HTMLElement>>('underline');\n readonly pagePillRef = viewChild<ElementRef<HTMLElement>>('pagePill');\n\n /** Last applied pill geometry — skip DOM writes when nothing moved. */\n private pillState = { left: -1, width: -1, painted: false };\n\n canScrollLeft = false;\n canScrollRight = false;\n\n private animateDelay = 50;\n private scrollAmount = 160;\n private sidePadding = 32; // same as button width space\n\n constructor(private renderer: Renderer2) {}\n\n ngAfterContentInit() {\n setTimeout(() => {\n this.updateScrollButtons();\n this.updateUnderlinePosition();\n this.scrollToActiveTab(false);\n this.cdr.markForCheck();\n }, 0);\n }\n\n selectTab(index: number) {\n this.activeIndex = index;\n this.activeIndexChange.emit(index);\n this.scrollToActiveTab(true);\n }\n\n badgeClass(tab: TabComponent): string {\n return toneBadge(tab.tone());\n }\n\n /** Roving tablist keyboard nav: arrows move AND activate (selection follows focus). */\n onTabKeydown(event: KeyboardEvent, index: number) {\n const count = this.tabs().length;\n if (!count) return;\n let next: number;\n switch (event.key) {\n case 'ArrowRight':\n next = (index + 1) % count;\n break;\n case 'ArrowLeft':\n next = (index - 1 + count) % count;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = count - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n this.selectTab(next);\n const buttons = this.tabListRef().nativeElement.querySelectorAll('.tab-btn');\n (buttons[next] as HTMLElement | undefined)?.focus();\n }\n\n /** Parent-driven activeIndex (deep-link ?tab=, quick-links) must also move the pill. */\n ngOnChanges(changes: SimpleChanges) {\n if (changes['activeIndex'] && !changes['activeIndex'].firstChange) {\n setTimeout(() => this.scrollToActiveTab(false), 0);\n }\n }\n\n /**\n * Re-measure every view check: catches label-width changes (language switch,\n * count arriving) with cached geometry so the DOM write only happens when\n * the pill actually moved.\n */\n ngAfterViewChecked() {\n this.updatePagePill();\n }\n\n /** Slide the 'page' pill to the active tab (offset* is scroll-content relative). */\n private updatePagePill() {\n const pillEl = this.pagePillRef()?.nativeElement;\n if (!pillEl) return;\n const tabButtons = this.tabListRef().nativeElement.querySelectorAll('.tab-btn');\n const activeTab = tabButtons[this.activeIndex] as HTMLElement | undefined;\n if (!activeTab) return;\n\n const left = activeTab.offsetLeft;\n const width = activeTab.offsetWidth;\n if (width === 0) return; // hidden (display:none ancestors) — keep last state\n if (left === this.pillState.left && width === this.pillState.width) return;\n\n // First paint positions without transition — no fly-in from x=0 on load.\n if (!this.pillState.painted) {\n this.renderer.setStyle(pillEl, 'transition', 'none');\n requestAnimationFrame(() => this.renderer.removeStyle(pillEl, 'transition'));\n this.pillState.painted = true;\n }\n this.renderer.setStyle(pillEl, 'width', `${width}px`);\n this.renderer.setStyle(pillEl, 'transform', `translateX(${left}px)`);\n this.pillState = { ...this.pillState, left, width };\n }\n\n private updateUnderlinePosition() {\n // The 'page' variant slides .fx-tabs-pill instead (see updatePagePill);\n // the underline element only exists on the default variant.\n const underlineEl = this.underlineRef()?.nativeElement;\n if (!underlineEl) return;\n const tabListEl = this.tabListRef().nativeElement;\n const tabButtons = tabListEl.querySelectorAll('.tab-btn');\n const activeTab = tabButtons[this.activeIndex] as HTMLElement | undefined;\n \n if (!activeTab || !underlineEl) return;\n \n const tabRect = activeTab.getBoundingClientRect();\n const containerRect = tabListEl.getBoundingClientRect();\n \n // Calculate X position relative to scrollable area (not viewport)\n const translateX = tabRect.left - containerRect.left + tabListEl.scrollLeft - this.sidePadding;\n \n this.renderer.setStyle(underlineEl, 'width', `${activeTab.offsetWidth}px`);\n this.renderer.setStyle(underlineEl, 'transform', `translateX(${translateX}px)`);\n }\n \n\n private scrollToActiveTab(updateUnderlineAfter = true) {\n const tabListEl = this.tabListRef().nativeElement;\n const tabButtons = tabListEl.querySelectorAll('.tab-btn');\n const activeTab = tabButtons[this.activeIndex] as HTMLElement | undefined;\n\n if (!activeTab) return;\n\n const elLeft = activeTab.offsetLeft;\n const elRight = elLeft + activeTab.offsetWidth;\n const containerLeft = tabListEl.scrollLeft;\n const containerRight = containerLeft + tabListEl.clientWidth;\n\n if (elLeft < containerLeft) {\n tabListEl.scrollTo({ left: Math.max(elLeft - 32, 0), behavior: 'smooth' });\n } else if (elRight > containerRight) {\n const target = elRight - tabListEl.clientWidth + 32;\n tabListEl.scrollTo({ left: target, behavior: 'smooth' });\n }\n\n setTimeout(() => {\n this.updateScrollButtons();\n this.updateUnderlinePosition();\n this.cdr.markForCheck();\n }, updateUnderlineAfter ? this.animateDelay : 0);\n }\n\n scroll(direction: 'left' | 'right') {\n const tabListEl = this.tabListRef().nativeElement;\n const delta = direction === 'left' ? -this.scrollAmount : this.scrollAmount;\n tabListEl.scrollBy({ left: delta, behavior: 'smooth' });\n\n setTimeout(() => {\n this.updateScrollButtons();\n this.updateUnderlinePosition();\n this.cdr.markForCheck();\n }, this.animateDelay);\n }\n\n onScroll() {\n this.updateScrollButtons();\n this.updateUnderlinePosition();\n }\n\n private updateScrollButtons() {\n const el = this.tabListRef().nativeElement;\n const scrollLeft = el.scrollLeft;\n const maxScrollLeft = el.scrollWidth - el.clientWidth;\n \n this.canScrollLeft = scrollLeft > 2;\n \n this.canScrollRight = scrollLeft < maxScrollLeft - 2;\n }\n\n @HostListener('window:resize')\n onResize() {\n this.updateUnderlinePosition();\n this.updatePagePill();\n }\n}\n","<div class=\"relative\">\n <!-- Left scroll button -->\n <button\n class=\"left-scroll-button\"\n type=\"button\"\n aria-label=\"Scroll tabs left\"\n (click)=\"scroll('left')\"\n [style.opacity]=\"canScrollLeft ? 1 : 0\"\n [style.pointerEvents]=\"canScrollLeft ? 'auto' : 'none'\"\n [attr.tabindex]=\"canScrollLeft ? null : -1\"\n [attr.aria-hidden]=\"!canScrollLeft\"\n >\n <svg\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-5 w-5 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n <div\n #tabList\n role=\"tablist\"\n class=\"relative flex overflow-x-auto no-scrollbar scroll-smooth\"\n [class.fx-tabs-frame]=\"variant() === 'page'\"\n (scroll)=\"onScroll()\"\n >\n <!-- 'page' variant: one raised pill that SLIDES to the active tab\n (anh Tú 29/08 — same motion as fx-ui-segmented) -->\n @if (variant() === 'page') {\n <span #pagePill aria-hidden=\"true\" class=\"fx-tabs-pill\"></span>\n }\n @for (tab of tabs(); track tab; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"i === activeIndex\"\n [tabindex]=\"i === activeIndex ? 0 : -1\"\n (click)=\"selectTab(i)\"\n (keydown)=\"onTabKeydown($event, i)\"\n class=\"tab-btn tab-bar-btn\"\n [class.tab-bar-btn-page]=\"variant() === 'page'\"\n >\n <div class=\"flex flex-row items-center justify-center gap-xs\">\n @if (tab.icon) {\n <fx-ui-hero-icon\n [icon]=\"tab.icon\"\n [size]=\"variant() === 'page' ? 14 : 20\"\n class=\"flex mr-[2px]\"\n [ngClass]=\"\n variant() === 'page'\n ? i === activeIndex\n ? 'text-strong'\n : 'text-text-placeholder'\n : i === activeIndex\n ? 'text-accent-fg mb-small'\n : 'text-text-placeholder'\n \"\n ></fx-ui-hero-icon>\n }\n <div\n [ngClass]=\"\n variant() === 'page'\n ? i === activeIndex\n ? 'text-[13px] leading-none font-semibold text-strong [text-box:trim-both_cap_alphabetic]'\n : 'text-[13px] leading-none font-medium text-muted [text-box:trim-both_cap_alphabetic]'\n : i === activeIndex\n ? 'txt-field-label text-accent-fg'\n : 'txt-placeholder'\n \"\n >\n {{ tab.label() }}\n </div>\n @if (tab.count() !== null) {\n <span\n class=\"txt-tag-label px-normal py-[1px] rounded-pill\"\n [ngClass]=\"badgeClass(tab)\"\n style=\"font-family: var(--og-font-figure)\"\n >\n {{ tab.count() }}\n </span>\n }\n </div>\n </button>\n }\n\n @if (variant() !== 'page') {\n <span #underline class=\"underline\" style=\"width: 0; transform: translateX(0)\"></span>\n }\n </div>\n\n <button\n class=\"right-scroll-button\"\n type=\"button\"\n aria-label=\"Scroll tabs right\"\n (click)=\"scroll('right')\"\n [style.opacity]=\"canScrollRight ? 1 : 0\"\n [style.pointerEvents]=\"canScrollRight ? 'auto' : 'none'\"\n [attr.tabindex]=\"canScrollRight ? null : -1\"\n [attr.aria-hidden]=\"!canScrollRight\"\n >\n <svg\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-5 w-5 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n</div>\n\n<!-- Tab content -->\n<div class=\"transition-all duration-300 ease-in-out mt-4\">\n @for (tab of tabs(); track tab; let i = $index) {\n @if (i === activeIndex) {\n <div role=\"tabpanel\" class=\"animate-fadeIn\">\n <ng-container *ngTemplateOutlet=\"tab.content()\"></ng-container>\n </div>\n }\n }\n</div>\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\n\n@Component({\n selector: 'fx-ui-table-cell',\n templateUrl: './table-cell.component.html',\n styleUrl: './table-cell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableCell {\n readonly loading = input.required<boolean>();\n readonly skeletonClass = input('h-4 w-full');\n}\n","@if (!loading()) {\n <div animate.enter=\"fade-in-animation\" class=\"inline-block my-normal\">\n <ng-content />\n </div>\n} @else {\n <div animate.enter=\"fade-in-animation\" class=\"skeleton-load my-semi\" [class]=\"skeletonClass()\"></div>\n}\n","import { Component, Input, ChangeDetectionStrategy, input, output, Output, EventEmitter } from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nexport type TagType =\n | 'success'\n | 'warning'\n | 'critical'\n | 'information'\n | 'discovery'\n | 'default'\n | 'danger';\n\n@Component({\n selector: 'fx-ui-tag',\n templateUrl: './tag.component.html',\n styleUrl: './tag.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class TagComponent {\n readonly label = input<string>();\n readonly type = input<TagType>('default');\n readonly rounded = input(true);\n @Input() icon?: string;\n readonly solid = input(false);\n /* EventEmitter (not output()) on purpose: the template branches on\n * `clicked.observed` to only expose button semantics when someone listens —\n * OutputEmitterRef has no equivalent. */\n @Output() clicked = new EventEmitter<void>();\n\n onClick() {\n this.clicked.emit();\n }\n}\n","<!-- Interactive semantics only when a (clicked) listener is attached. -->\n<div\n (click)=\"onClick()\"\n (keydown.enter)=\"onClick()\"\n (keydown.space)=\"$event.preventDefault(); onClick()\"\n [attr.role]=\"clicked.observed ? 'button' : null\"\n [attr.tabindex]=\"clicked.observed ? 0 : null\"\n [class]=\"\n `flex flex-row gap-small ${rounded() ? 'tag-round' : 'tag-square'} tag-${type()}${solid() ? '-solid' : ''}${clicked.observed ? ' cursor-pointer focus-visible:ring-2 focus-visible:ring-primary/50' : ''}`\n \"\n>\n @if (icon) {\n <fx-ui-hero-icon\n [class]=\"`flex txt-tag-${type()} ${solid() && type() !== 'default' ? 'text-surface' : ''}`\"\n [icon]=\"icon\"\n [size]=\"18\"\n ></fx-ui-hero-icon>\n }\n\n <div [class]=\"`txt-tag-${type()} ${solid() && type() !== 'default' ? 'text-surface font-medium' : ''}`\">\n {{ label() }}\n </div>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n NgZone,\n OnDestroy,\n QueryList,\n ViewChildren, ChangeDetectionStrategy,\n input,\n viewChild\n} from '@angular/core';\n\nexport interface TreeNode {\n id: string;\n label: string;\n status?: string;\n children?: TreeNode[];\n}\n\n@Component({\n selector: 'fx-ui-tree-diagram',\n templateUrl: './tree-diagram.component.html',\n styleUrl: './tree-diagram.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TreeDiagram implements AfterViewInit, OnDestroy {\n readonly data = input.required<any>();\n\n readonly container = viewChild.required<ElementRef>('container');\n readonly root = viewChild.required<ElementRef>('root');\n @ViewChildren('child') children!: QueryList<ElementRef>;\n\n lines: any[] = [];\n svgWidth = 0;\n svgHeight = 0;\n\n private resizeObserver!: ResizeObserver;\n private rafId?: number;\n\n constructor(private zone: NgZone, private cdr: ChangeDetectorRef) {}\n\n ngAfterViewInit() {\n this.zone.runOutsideAngular(() => {\n this.resizeObserver = new ResizeObserver((entries) => {\n const rect = entries[0].contentRect;\n\n if (rect.width === 0 || rect.height === 0) return;\n\n this.scheduleDraw();\n });\n\n this.resizeObserver.observe(this.container().nativeElement);\n\n setTimeout(() => this.scheduleDraw(), 50);\n setTimeout(() => this.scheduleDraw(), 150);\n });\n\n this.children.changes.subscribe(() => this.scheduleDraw());\n }\n\n ngOnDestroy() {\n this.resizeObserver?.disconnect();\n if (this.rafId) cancelAnimationFrame(this.rafId);\n }\n\n private scheduleDraw() {\n if (this.rafId) cancelAnimationFrame(this.rafId);\n\n this.rafId = requestAnimationFrame(() => {\n this.drawLines();\n });\n }\n\n private drawLines() {\n const root = this.root();\n if (!root || !this.children.length) return;\n \n const containerEl = this.container().nativeElement;\n const rect = containerEl.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n \n const rootRect = root.nativeElement.getBoundingClientRect();\n \n const rootX = rootRect.left + rootRect.width / 2 - rect.left;\n const rootBottomY = rootRect.bottom - rect.top;\n \n const childRects = this.children.map(c =>\n c.nativeElement.getBoundingClientRect()\n );\n \n const childCenters = childRects.map(r => ({\n x: r.left + r.width / 2 - rect.left,\n y: r.top - rect.top\n }));\n \n const horizontalY = childCenters[0].y - 24;\n \n this.zone.run(() => {\n this.svgWidth = rect.width;\n this.svgHeight = rect.height;\n \n this.lines = [\n {\n x1: rootX,\n y1: rootBottomY,\n x2: rootX,\n y2: horizontalY\n },\n {\n x1: childCenters[0].x,\n y1: horizontalY,\n x2: childCenters[childCenters.length - 1].x,\n y2: horizontalY\n },\n ...childCenters.map(c => ({\n x1: c.x,\n y1: horizontalY,\n x2: c.x,\n y2: c.y\n }))\n ];\n });\n\n this.cdr.detectChanges();\n } \n}\n","<div class=\"relative p-8\" #container>\n\n <!-- ROOT -->\n <div\n #root\n class=\"mx-auto w-fit bg-accent text-accent-contrast px-7 py-3 rounded-md font-semibold text-center\"\n >\n {{ data().label }}\n </div>\n\n <!-- CHILDREN -->\n <div class=\"mt-16 flex justify-center gap-16\">\n @for (child of data().children; track child) {\n <div\n #child\n class=\"w-48 bg-surface-raised text-strong border border-border px-4 py-4 rounded-lg text-center\"\n >\n <div class=\"font-semibold text-lg\">{{ child.label }}</div>\n <div class=\"mt-1 text-sm opacity-90\">{{ child.status }}</div>\n </div>\n }\n </div>\n\n <!-- SVG CONNECTORS -->\n <svg\n class=\"absolute inset-0 pointer-events-none\"\n [attr.width]=\"svgWidth\"\n [attr.height]=\"svgHeight\"\n >\n @for (line of lines; track line) {\n <line\n [attr.x1]=\"line.x1\"\n [attr.y1]=\"line.y1\"\n [attr.x2]=\"line.x2\"\n [attr.y2]=\"line.y2\"\n stroke=\"rgb(var(--og-border-strong))\"\n stroke-width=\"2\"\n />\n }\n </svg>\n\n</div>\n","import { Component, ContentChild, Input, TemplateRef, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { CdkDragDrop, moveItemInArray, transferArrayItem, CdkDropList, CdkDrag, CdkDragPlaceholder } from '@angular/cdk/drag-drop';\nimport { KanbanColumn, ColumnChangedEvent } from './kanban-board.types';\nimport { NgTemplateOutlet } from '@angular/common';\n\n@Component({\n selector: 'fx-ui-kanban-board',\n templateUrl: './kanban-board.component.html',\n styleUrl: './kanban-board.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CdkDropList,\n CdkDrag,\n CdkDragPlaceholder,\n NgTemplateOutlet,\n ],\n})\nexport class KanbanBoardComponent<T = any> {\n readonly columns = input<KanbanColumn<T>[]>([]);\n @Input() itemTemplate?: TemplateRef<any>;\n readonly columnChanged = output<ColumnChangedEvent<T>>();\n\n /**\n * Get all column IDs for connecting drop lists\n */\n getColumnIds(): string[] {\n return this.columns().map((col) => col.id);\n }\n\n /**\n * Handle drop event when item is moved\n */\n onDrop(event: CdkDragDrop<T[]>, columnId: string) {\n const previousColumnId = event.previousContainer.id;\n const currentColumnId = columnId;\n\n if (event.previousContainer === event.container) {\n // Reorder within the same column\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n // Transfer between columns\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex\n );\n }\n\n // Emit the change event\n const item = event.container.data[event.currentIndex];\n this.columnChanged.emit({\n previousColumnId,\n currentColumnId,\n item,\n previousIndex: event.previousIndex,\n currentIndex: event.currentIndex,\n });\n }\n}\n","<div class=\"kanban-board\">\n <div class=\"kanban-columns\">\n @for (column of columns(); track column.id) {\n <div class=\"kanban-column\">\n <div class=\"kanban-column-header\">\n <h3 class=\"kanban-column-title\">{{ column.title }}</h3>\n <span class=\"kanban-column-count\">{{ column.items.length }}</span>\n </div>\n \n <div\n class=\"kanban-column-content\"\n cdkDropList\n [id]=\"column.id\"\n [cdkDropListData]=\"column.items\"\n [cdkDropListConnectedTo]=\"getColumnIds()\"\n (cdkDropListDropped)=\"onDrop($event, column.id)\"\n >\n @for (item of column.items; track $index) {\n <div class=\"kanban-item\" cdkDrag>\n <div class=\"kanban-item-placeholder\" *cdkDragPlaceholder></div>\n \n @if (itemTemplate) {\n <ng-container\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, index: $index }\"\n ></ng-container>\n } @else {\n <div class=\"kanban-item-default\">\n {{ item }}\n </div>\n }\n </div>\n }\n \n @if (column.items.length === 0) {\n <div class=\"kanban-column-empty\">\n Drop items here\n </div>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","import { Component, Input, OnInit, OnDestroy, ChangeDetectorRef, inject, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { Router, NavigationEnd, RouterLink } from '@angular/router';\nimport { Subject, filter, takeUntil } from 'rxjs';\nimport { DrawerItem } from './drawer.types';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n@Component({\n selector: 'fx-ui-drawer',\n templateUrl: './drawer.component.html',\n styleUrl: './drawer.component.scss',\n animations: [\n trigger('drawerExpand', [\n state('collapsed', style({ width: '70px' })),\n state('expanded', style({ width: '260px' })),\n transition('collapsed <=> expanded', animate('300ms cubic-bezier(0.4, 0, 0.2, 1)')),\n ]),\n trigger('accordionExpand', [\n state('collapsed', style({ height: '0', overflow: 'hidden', opacity: 0 })),\n state('expanded', style({ height: '*', overflow: 'visible', opacity: 1 })),\n transition('collapsed <=> expanded', animate('300ms cubic-bezier(0.4, 0, 0.2, 1)')),\n ]),\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n MatTooltip,\n HeroIconComponent,\n RouterLink,\n ],\n})\nexport class DrawerComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n readonly items = input<DrawerItem[]>([]);\n /** V2: bottom-pinned section (Administration group) — same item rendering,\n separated by a rule, above the [drawerFooter] slot and version. */\n readonly footerItems = input<DrawerItem[]>([]);\n @Input() isExpanded = true;\n @Input() logo?: string;\n /** Wordmark cạnh logo, chỉ hiện khi drawer mở. Bỏ trống = chỉ có mark. */\n @Input() logoText?: string;\n /** Dòng phụ dưới logoText (tagline/workspace). Chỉ hiện khi drawer mở. */\n @Input() logoSubtext?: string;\n @Input() version?: string;\n readonly toggleExpanded = output<boolean>();\n readonly itemClicked = output<DrawerItem>();\n\n expandedItems = new Set<string>();\n currentRoute = '';\n private destroy$ = new Subject<void>();\n\n constructor(private router: Router) {}\n\n ngOnInit(): void {\n // Track current route\n this.currentRoute = this.router.url;\n\n // Subscribe to route changes\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntil(this.destroy$),\n )\n .subscribe((event: any) => {\n this.currentRoute = event.urlAfterRedirects || event.url;\n this.autoExpandActiveParents();\n this.cdr.markForCheck();\n });\n\n // Auto-expand parents of active route on init\n this.autoExpandActiveParents();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n toggleDrawer(): void {\n this.isExpanded = !this.isExpanded;\n this.toggleExpanded.emit(this.isExpanded);\n }\n\n toggleAccordion(itemId: string): void {\n if (this.expandedItems.has(itemId)) {\n this.expandedItems.delete(itemId);\n } else {\n this.expandedItems.add(itemId);\n }\n }\n\n isAccordionExpanded(itemId: string): boolean {\n return this.expandedItems.has(itemId);\n }\n\n onItemClick(item: DrawerItem, event?: Event): void {\n // If item has children, toggle accordion\n if (item.children && item.children.length > 0) {\n event?.preventDefault();\n this.toggleAccordion(item.id);\n return;\n }\n\n // Emit click event\n this.itemClicked.emit(item);\n\n // If item has action, execute it\n if (item.action) {\n event?.preventDefault();\n item.action();\n }\n\n // Navigation is handled by routerLink in template\n }\n\n isActiveRoute(route?: string): boolean {\n if (!route) return false;\n return this.currentRoute === route || this.currentRoute.startsWith(route + '/');\n }\n\n hasActiveChild(item: DrawerItem): boolean {\n if (!item.children) return false;\n\n return item.children.some((child) => {\n if (this.isActiveRoute(child.route)) return true;\n if (child.children) return this.hasActiveChild(child);\n return false;\n });\n }\n\n private autoExpandActiveParents(): void {\n const expandParents = (items: DrawerItem[]): boolean => {\n for (const item of items) {\n if (item.route && this.isActiveRoute(item.route)) {\n return true;\n }\n if (item.children) {\n const hasActiveChild = expandParents(item.children);\n if (hasActiveChild) {\n this.expandedItems.add(item.id);\n return true;\n }\n }\n }\n return false;\n };\n\n expandParents(this.items());\n expandParents(this.footerItems());\n }\n\n getAccordionState(itemId: string): string {\n return this.isAccordionExpanded(itemId) ? 'expanded' : 'collapsed';\n }\n\n getDrawerState(): string {\n return this.isExpanded ? 'expanded' : 'collapsed';\n }\n}\n","<div class=\"drawer-host-wrapper\">\n <a href=\"/\" class=\"drawer-brand\" [class.is-collapsed]=\"!isExpanded\">\n @if (logo) {\n <img [src]=\"logo\" alt=\"Home\" class=\"drawer-brand-mark\" />\n } @else {\n <div class=\"drawer-brand-mark\"></div>\n }\n @if (isExpanded && (logoText || logoSubtext)) {\n <span class=\"drawer-brand-copy\">\n @if (logoText) {\n <span class=\"drawer-brand-text\">{{ logoText }}</span>\n }\n @if (logoSubtext) {\n <span class=\"drawer-brand-subtext\">{{ logoSubtext }}</span>\n }\n </span>\n }\n </a>\n <div class=\"drawer-container\" [@drawerExpand]=\"getDrawerState()\">\n <!-- Navigation Items -->\n <nav class=\"drawer-nav\">\n @for (item of items(); track item) {\n <ng-container\n *ngTemplateOutlet=\"drawerItem; context: { $implicit: item, level: 0 }\"\n ></ng-container>\n }\n </nav>\n\n <!-- V2: bottom section (Administration group, user block, …) -->\n <div class=\"mt-auto\">\n @if (footerItems().length) {\n <nav class=\"drawer-footer-nav\">\n @for (item of footerItems(); track item) {\n <ng-container\n *ngTemplateOutlet=\"drawerItem; context: { $implicit: item, level: 0 }\"\n ></ng-container>\n }\n </nav>\n }\n <ng-content select=\"[drawerFooter]\"></ng-content>\n </div>\n\n <!-- Version -->\n @if (version) {\n <div class=\"drawer-version\" [matTooltip]=\"!isExpanded ? version : ''\" matTooltipPosition=\"right\">\n @if (isExpanded) {\n <span>{{ version }}</span>\n }\n @if (!isExpanded) {\n <span class=\"drawer-version-dot\"></span>\n }\n </div>\n }\n </div>\n\n <!-- Floating Toggle Button on right border -->\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [attr.aria-label]=\"isExpanded ? 'Collapse navigation' : 'Expand navigation'\"\n [attr.aria-expanded]=\"isExpanded\"\n (click)=\"toggleDrawer()\"\n [matTooltip]=\"isExpanded ? 'Collapse' : 'Expand'\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n matTooltipPosition=\"right\"\n >\n <fx-ui-hero-icon\n [icon]=\"isExpanded ? 'chevron-left' : 'chevron-right'\"\n [size]=\"16\"\n class=\"text-text-primary\"\n ></fx-ui-hero-icon>\n </button>\n</div>\n\n<!-- Recursive Template for Drawer Items -->\n<ng-template #drawerItem let-item let-level=\"level\">\n @if (item.heading) {\n @if (isExpanded) {\n <div class=\"drawer-section-label\">{{ item.label }}</div>\n } @else {\n <div class=\"drawer-section-rule\"></div>\n }\n } @else {\n <div class=\"drawer-item-wrapper\">\n <!-- Item Button/Link -->\n @if (item.route && !item.children) {\n <a\n [routerLink]=\"item.route\"\n class=\"drawer-item\"\n [class.active]=\"isActiveRoute(item.route)\"\n [class.has-children]=\"item.children && item.children.length > 0\"\n [style.paddingLeft.px]=\"isExpanded ? 16 + level * 16 : 16\"\n [matTooltip]=\"!isExpanded ? item.label : ''\"\n matTooltipPosition=\"right\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n (click)=\"onItemClick(item, $event)\"\n >\n <div class=\"item-content\">\n <fx-ui-hero-icon [icon]=\"item.icon\" [size]=\"20\" class=\"item-icon\"></fx-ui-hero-icon>\n @if (isExpanded) {\n <span class=\"item-label\">{{ item.label }}</span>\n }\n </div>\n </a>\n }\n\n @if (!item.route || item.children) {\n <button\n type=\"button\"\n class=\"drawer-item\"\n [class.active]=\"isActiveRoute(item.route)\"\n [class.has-children]=\"item.children && item.children.length > 0\"\n [style.paddingLeft.px]=\"isExpanded ? 16 + level * 16 : 16\"\n [matTooltip]=\"!isExpanded ? item.label : ''\"\n matTooltipPosition=\"right\"\n matTooltipClass=\"text-text-primary text-sm font-semibold\"\n (click)=\"onItemClick(item, $event)\"\n >\n <div class=\"item-content\">\n <fx-ui-hero-icon [icon]=\"item.icon\" [size]=\"20\" class=\"item-icon\"></fx-ui-hero-icon>\n @if (isExpanded) {\n <span class=\"item-label\">{{ item.label }}</span>\n }\n @if (isExpanded && item.children && item.children.length > 0) {\n <fx-ui-hero-icon\n [icon]=\"'chevron-down'\"\n [size]=\"16\"\n class=\"chevron-icon\"\n [class.rotated]=\"isAccordionExpanded(item.id)\"\n ></fx-ui-hero-icon>\n }\n </div>\n </button>\n }\n\n <!-- Accordion Children -->\n @if (item.children && item.children.length > 0) {\n <div\n class=\"accordion-children\"\n [@accordionExpand]=\"getAccordionState(item.id)\"\n >\n @for (child of item.children; track child) {\n <ng-container\n *ngTemplateOutlet=\"drawerItem; context: { $implicit: child, level: level + 1 }\"\n ></ng-container>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\n\n/** Row-card skeleton placeholder for master-detail list panes. */\n@Component({\n selector: 'fx-ui-skeleton-list',\n templateUrl: './skeleton-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SkeletonListComponent {\n readonly rows = input(5);\n\n /** computed, không phải method: method trả mảng MỚI mỗi lần render. */\n readonly rowList = computed(() => range(this.rows()));\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"flex flex-col gap-normal\">\n @for (r of rowList(); track r) {\n <div class=\"rounded-lg border border-border-default p-semi\">\n <div class=\"flex items-center gap-normal mb-small\">\n <div class=\"w-8 h-8 rounded-lg skeleton-load shrink-0\"></div>\n <div class=\"h-4 flex-1 rounded skeleton-load\"></div>\n <div class=\"h-5 w-12 rounded-full skeleton-load shrink-0\"></div>\n </div>\n <div class=\"h-3 w-3/4 rounded skeleton-load\"></div>\n </div>\n }\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\n\nconst ROW_WIDTHS = [90, 70, 80, 60];\n\n/** Card-shaped skeleton placeholder for detail panels. */\n@Component({\n selector: 'fx-ui-skeleton-detail',\n templateUrl: './skeleton-detail.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SkeletonDetailComponent {\n /** Number of content cards rendered below the header card. */\n readonly cards = input(3);\n /** Rows per content card. */\n readonly rows = input(4);\n\n /** computed, không phải method: method trả mảng MỚI mỗi lần render. */\n readonly cardList = computed(() => range(this.cards()));\n readonly rowList = computed(() => range(this.rows()));\n\n rowWidth(i: number): number {\n return ROW_WIDTHS[i % ROW_WIDTHS.length];\n }\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"flex flex-col gap-xl\">\n <div class=\"card-common\">\n <div class=\"flex items-start gap-normal\">\n <div class=\"w-10 h-10 rounded-lg skeleton-load shrink-0\"></div>\n <div class=\"flex-1 min-w-0 flex flex-col gap-normal\">\n <div class=\"h-5 w-1/2 rounded skeleton-load\"></div>\n <div class=\"h-3 w-3/4 rounded skeleton-load\"></div>\n </div>\n </div>\n </div>\n\n @for (c of cardList(); track c) {\n <div class=\"card-common flex flex-col gap-large\">\n <div class=\"h-4 w-1/3 rounded skeleton-load\"></div>\n <div class=\"flex flex-col gap-normal\">\n @for (r of rowList(); track r) {\n <div class=\"h-3 rounded skeleton-load\" [style.width.%]=\"rowWidth(r)\"></div>\n }\n </div>\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBg } from '../../../core/value-tone.util';\n\n/**\n * V2 sparkbar — inline mini bar-trend (risk trend on project cards, deltas in\n * stat grids). Pure DOM, token-coloured; no chart engine.\n *\n * <fx-ui-sparkbar [values]=\"[3, 5, 2, 8, 6]\" />\n */\n@Component({\n selector: 'fx-ui-sparkbar',\n templateUrl: './sparkbar.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class SparkbarComponent {\n readonly values = input<number[]>([]);\n /** Bar colour; null renders the accent. */\n readonly tone = input<Tone | null>(null);\n readonly height = input(28);\n\n readonly bars = computed(() => {\n const values = this.values();\n const max = Math.max(...values, 1);\n // 8% floor so zero values still show a base mark.\n return values.map((v) => Math.max((v / max) * 100, 8));\n });\n\n barClass(): string {\n return this.tone() ? toneBg(this.tone()) : 'bg-accent';\n }\n}\n","<div\n class=\"flex items-end gap-[2px]\"\n [style.height.px]=\"height()\"\n role=\"img\"\n [attr.aria-label]=\"'Trend: ' + values().join(', ')\"\n>\n @for (bar of bars(); track $index) {\n <div\n class=\"flex-1 min-w-[3px] rounded-[1px] opacity-80\"\n [ngClass]=\"barClass()\"\n [style.height.%]=\"bar\"\n ></div>\n }\n</div>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { Tone, toneTint, toneText } from '../../../core/value-tone.util';\nimport { NgStyle, NgClass } from '@angular/common';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { SparkbarComponent } from '../sparkbar/sparkbar.component';\n\nexport interface FxStatCardDelta {\n /** Caller-formatted delta text (e.g. \"+12%\", \"-3\"). */\n value: string;\n direction: 'up' | 'down';\n /** Delta colour — up is not always good (findings up = danger). */\n tone?: Tone | null;\n}\n\nexport interface FxStatCard {\n /** Caller-translated caption. */\n label: string;\n value: string | number;\n /** hero-icon name shown in the tinted box. */\n icon?: string;\n /** Colours the number and the icon box; null/undefined renders neutral. */\n tone?: Tone | null;\n /** V2 StatGrid: trend chip beside the number. */\n delta?: FxStatCardDelta;\n /** V2 StatGrid: mini bar-trend under the caption. */\n spark?: number[];\n /** variant 'figure': caller-formatted sub-caption under the number (\"+1 since 4.8.0\"). */\n sub?: string;\n /** Colours the sub-caption; null/undefined renders muted. */\n subTone?: Tone | null;\n}\n\n/** KPI tile row: big number + tinted icon box + caption, in a responsive grid. */\n@Component({\n selector: 'fx-ui-stat-cards',\n templateUrl: './stat-cards.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgStyle,\n NgClass,\n HeroIconComponent,\n SparkbarComponent,\n ],\n})\nexport class StatCardsComponent {\n readonly cards = input<FxStatCard[]>([]);\n /**\n * 'tile' (default): tinted icon box + number + caption — the pre-V2 look.\n * 'figure': the V2 design's KPI column — caption on top, large figure-font\n * number, toned sub-caption underneath (no icon box).\n */\n readonly variant = input<'tile' | 'figure'>('tile');\n /** Grid columns; defaults to one column per card. */\n @Input() cols?: number;\n\n get gridColumns(): string {\n // No explicit cols → responsive auto-fit so tiles stack on narrow viewports.\n if (this.cols === undefined) {\n return 'repeat(auto-fit, minmax(180px, 1fr))';\n }\n return `repeat(${this.cols}, minmax(0, 1fr))`;\n }\n\n numClass(card: FxStatCard): string {\n return card.tone ? toneText(card.tone) : 'text-text-primary';\n }\n\n boxClass(card: FxStatCard): string {\n // Ô icon vuông: chỉ lấy MÀU, không lấy hình pill của badge.\n return toneTint(card.tone ?? null);\n }\n\n deltaClass(card: FxStatCard): string {\n return card.delta?.tone ? toneText(card.delta.tone) : 'text-muted';\n }\n\n subClass(card: FxStatCard): string {\n return card.subTone ? toneText(card.subTone) : 'text-text-secondary';\n }\n}\n","<div class=\"grid gap-normal\" [ngStyle]=\"{ 'grid-template-columns': gridColumns }\">\n @for (card of cards(); track card.label) {\n @if (variant() === 'figure') {\n <div class=\"card-common flex flex-col gap-small min-w-0\">\n <span class=\"txt-utility-caption text-text-secondary truncate\">{{ card.label }}</span>\n <span\n class=\"txt-heading-03\"\n [ngClass]=\"numClass(card)\"\n style=\"font-family: var(--og-font-figure)\"\n >{{ card.value }}</span\n >\n @if (card.sub) {\n <span class=\"txt-utility-caption\" [ngClass]=\"subClass(card)\">{{ card.sub }}</span>\n }\n @if (card.spark?.length) {\n <fx-ui-sparkbar class=\"mt-xs\" [values]=\"card.spark!\" [height]=\"16\" [tone]=\"card.tone ?? null\" />\n }\n </div>\n } @else {\n <div class=\"card-common flex items-center gap-normal\">\n @if (card.icon) {\n <div\n class=\"w-10 h-10 rounded-lg flex items-center justify-center shrink-0\"\n [ngClass]=\"boxClass(card)\"\n >\n <fx-ui-hero-icon [icon]=\"card.icon\" [size]=\"20\"></fx-ui-hero-icon>\n </div>\n }\n <div class=\"flex flex-col min-w-0 flex-1\">\n <div class=\"flex items-baseline gap-small\">\n <span\n class=\"txt-heading-04\"\n [ngClass]=\"numClass(card)\"\n style=\"font-family: var(--og-font-figure)\"\n >{{ card.value }}</span\n >\n @if (card.delta) {\n <span class=\"text-xs font-semibold\" [ngClass]=\"deltaClass(card)\">\n {{ card.delta.direction === 'up' ? '▲' : '▼' }} {{ card.delta.value }}\n </span>\n }\n </div>\n <span class=\"txt-utility-caption text-text-secondary truncate\">{{ card.label }}</span>\n @if (card.spark?.length) {\n <fx-ui-sparkbar class=\"mt-xs\" [values]=\"card.spark!\" [height]=\"16\" [tone]=\"card.tone ?? null\" />\n }\n </div>\n </div>\n }\n }\n</div>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n/** Centered \"no data\" block. The message is caller-translated (no i18n in lib). */\n@Component({\n selector: 'fx-ui-empty-state',\n templateUrl: './empty-state.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class EmptyStateComponent {\n readonly message = input('No data');\n /** Optional icon (hero-icon name). */\n @Input() icon?: any;\n /** Min height of the block, CSS length. */\n readonly height = input('120px');\n}\n","<div\n class=\"flex flex-col items-center justify-center gap-small w-full\"\n [style.minHeight]=\"height()\"\n>\n @if (icon) {\n <fx-ui-hero-icon class=\"text-text-placeholder\" [icon]=\"icon\" [size]=\"24\"></fx-ui-hero-icon>\n }\n <div class=\"txt-default text-text-placeholder\">{{ message() }}</div>\n</div>\n","import { Component, Input, ChangeDetectionStrategy, output } from '@angular/core';\nimport { Tone, severityTone, toneScale, toneBg } from '../../../core/value-tone.util';\nimport { NgClass } from '@angular/common';\n\nexport interface FxFilterChipOption {\n /** Caller-translated label. */\n label: string;\n /** '' (empty) renders as the neutral \"All\" chip. */\n value: string;\n}\n\n/**\n * Tone-tinted filter chip row. Replaces the per-tab chipClass() copies —\n * including their classic bug of comparing a hardcoded filter key: the active\n * chip here is always derived from [value].\n */\n@Component({\n selector: 'fx-ui-filter-chips',\n templateUrl: './filter-chips.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class FilterChipsComponent {\n @Input() options: FxFilterChipOption[] = [];\n /* Accepts undefined so screens can bind [value]=\"filters.x\" where the\n * filter bag keys are optional; '' and undefined both mean \"All\". */\n @Input() value: string | undefined = '';\n readonly valueChange = output<string>();\n /** Per-value tone overrides (e.g. { Safe: 'information', Protected: 'discovery' as any }). */\n @Input() toneOverrides: Record<string, Tone | null> = {};\n\n select(option: FxFilterChipOption): void {\n this.value = option.value;\n this.valueChange.emit(option.value);\n }\n\n chipClass(option: FxFilterChipOption): string {\n const active = (this.value ?? '') === option.value;\n // Chip \"All\" (value rỗng) khi ĐANG CHỌN dùng **accent** (xanh), không phải\n // nền đen — khớp demo (ref 11: pill \"All 40\" là accent). Nền đen chỉ dành\n // cho badge severity Critical (anh Tú chốt 03/09).\n if (!option.value) {\n return active\n ? 'bg-accent text-accent-contrast'\n : 'bg-bg-hover text-text-secondary hover:bg-accent-soft hover:text-accent-fg';\n }\n const tone =\n option.value in this.toneOverrides\n ? this.toneOverrides[option.value]\n : severityTone(option.value);\n if (!tone) {\n return active ? 'bg-accent text-accent-contrast' : `${toneScale(null)} hover:opacity-50`;\n }\n // Chip tự có hình dạng riêng → chỉ lấy MÀU. Dùng thang đo (`tone-scale-*`)\n // chứ KHÔNG dùng `toneTint`: Critical ở filter phải là đỏ sẫm, không phải\n // pill đen đặc (anh Tú báo 03/09).\n return active ? `${toneBg(tone)} text-text-focus` : `${toneScale(tone)} hover:opacity-50`;\n }\n}\n","<div class=\"flex flex-wrap items-center gap-small\">\n @for (option of options; track option.value) {\n <button\n type=\"button\"\n class=\"px-3 py-1 rounded-full txt-utility-caption font-medium transition-colors cursor-pointer\"\n [ngClass]=\"chipClass(option)\"\n (click)=\"select(option)\"\n >\n {{ option.label }}\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\n\nexport interface FxFilterPillOption {\n /** '' (empty) is the conventional \"All\" pill. */\n value: string;\n /** Caller-translated label. */\n label: string;\n /** Shown muted beside the label; null/undefined renders no count. */\n count?: number | null;\n}\n\n/**\n * V2 filter pills — the quick-filter row above ranked lists (design refs 02,\n * 03, 11): outlined capsules with a muted count, the active one filled with\n * the primary text colour.\n *\n * Distinct from `fx-ui-filter-chips`, which tints each chip by its severity\n * tone and carries no count. Presentational: the caller owns the filter state.\n *\n * <fx-ui-filter-pills [options]=\"pills\" [value]=\"filters.status\"\n * (valueChange)=\"filters.status = $event; refresh()\" />\n */\n@Component({\n selector: 'fx-ui-filter-pills',\n templateUrl: './filter-pills.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class FilterPillsComponent {\n readonly options = input<FxFilterPillOption[]>([]);\n /** Accepts undefined so screens can bind an optional filter-bag key. */\n readonly value = input<string | undefined>('');\n readonly valueChange = output<string>();\n\n isActive(option: FxFilterPillOption): boolean {\n return (this.value() ?? '') === option.value;\n }\n\n /**\n * Pill ĐANG CHỌN dùng **accent** (xanh), không phải nền đen — khớp demo:\n * design ref 11 vẽ pill \"All 40\" là pill accent. Nền đen `--og-text` chỉ\n * dành cho badge severity Critical (`.og-badge--solid`), không dùng cho\n * trạng thái chọn của filter (anh Tú chốt 03/09).\n */\n pillClass(option: FxFilterPillOption): string {\n return this.isActive(option)\n ? 'bg-accent text-accent-contrast border-accent'\n : 'border-border-default text-text-secondary hover:border-border-strong';\n }\n\n countClass(option: FxFilterPillOption): string {\n return this.isActive(option) ? 'opacity-70' : 'text-text-placeholder';\n }\n}\n","<div class=\"flex flex-wrap items-center gap-small\">\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n [attr.aria-pressed]=\"isActive(option)\"\n class=\"flex items-center gap-small px-semi py-xs rounded-full border txt-utility-caption font-bold cursor-pointer transition-colors\"\n [ngClass]=\"pillClass(option)\"\n (click)=\"valueChange.emit(option.value)\"\n >\n {{ option.label }}\n @if (option.count !== null && option.count !== undefined) {\n <span [ngClass]=\"countClass(option)\" style=\"font-family: var(--og-font-figure)\">{{ option.count }}</span>\n }\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\n\n/**\n * V2 stage progress dots — the walkthrough position indicator on the attack\n * chain toolbar (design refs 04, 07): one dot per stage, the current one drawn\n * as a wider accent bar, visited ones solid, the rest faint.\n *\n * <fx-ui-stage-dots [count]=\"8\" [current]=\"stageIndex()\"\n * (dotClick)=\"goToStage($event)\" />\n */\n@Component({\n selector: 'fx-ui-stage-dots',\n templateUrl: './stage-dots.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class StageDotsComponent {\n readonly count = input(0);\n /** 0-based current stage; -1 (default) means none selected yet. */\n readonly current = input(-1);\n /** Emit the clicked stage index; wire it to make the dots navigable. */\n readonly dotClick = output<number>();\n\n readonly dots = computed(() => Array.from({ length: Math.max(0, this.count()) }, (_, i) => i));\n\n dotClass(index: number): string {\n const current = this.current();\n if (index === current) return 'w-5 bg-accent';\n if (current >= 0 && index < current) return 'w-1.5 bg-text-placeholder';\n return 'w-1.5 bg-border-strong';\n }\n}\n","<div class=\"flex items-center gap-xs\" role=\"tablist\">\n @for (i of dots(); track i) {\n <button\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"i === current()\"\n [attr.aria-label]=\"'Stage ' + (i + 1)\"\n class=\"h-1.5 rounded-full cursor-pointer transition-all duration-150 hover:opacity-70\"\n [ngClass]=\"dotClass(i)\"\n (click)=\"dotClick.emit(i)\"\n ></button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * V2 evidence code block — the mono panel that carries a process tree, a\n * command line or any captured text (design ref 05, \"Process tree\").\n *\n * Whitespace is preserved and the box scrolls on its own rather than pushing\n * the page wide, so ASCII trees survive narrow viewports.\n *\n * <fx-ui-code-block [label]=\"'analyze.processTree' | translate\" [code]=\"tree\" />\n */\n@Component({\n selector: 'fx-ui-code-block',\n templateUrl: './code-block.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CodeBlockComponent {\n readonly code = input('');\n /** Caller-translated caption above the box; omit for a bare block. */\n readonly label = input('');\n /** Scroll cap; empty grows with the content. */\n readonly maxHeight = input('');\n}\n","@if (label()) {\n <div class=\"txt-utility-caption font-bold text-text-secondary mb-normal\">{{ label() }}</div>\n}\n<pre\n class=\"m-0 p-large rounded-control border border-border bg-surface overflow-auto txt-body-compact-01 text-strong\"\n [style.max-height]=\"maxHeight() || null\"\n style=\"font-family: var(--og-font-mono); white-space: pre; tab-size: 2\"\n>{{ code() }}</pre>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n/**\n * V2 captured-evidence frame — a faux window chrome (traffic lights + mono file\n * name + timestamp) around a screenshot, with a placeholder when the image is\n * missing (design ref 05, \"Screenshot\").\n *\n * <fx-ui-screenshot-frame [label]=\"'analyze.screenshot' | translate\"\n * fileName=\"chain-05.png\" timestamp=\"09:42:18\"\n * [src]=\"url\" [caption]=\"caption\" />\n */\n@Component({\n selector: 'fx-ui-screenshot-frame',\n templateUrl: './screenshot-frame.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class ScreenshotFrameComponent {\n /** Caller-translated caption above the frame; omit for a bare frame. */\n readonly label = input('');\n readonly fileName = input('');\n readonly timestamp = input('');\n /** Image URL; empty renders the placeholder body. */\n readonly src = input('');\n /** Caller-translated line under (or inside) the frame. */\n readonly caption = input('');\n readonly alt = input('');\n readonly height = input('180px');\n}\n","@if (label()) {\n <div class=\"txt-utility-caption font-bold text-text-secondary mb-normal\">{{ label() }}</div>\n}\n<div class=\"rounded-control border border-border bg-surface overflow-hidden\">\n <!-- Window chrome: traffic lights + mono file name + capture time -->\n <div class=\"flex items-center gap-small px-normal py-small border-b border-border bg-surface-sunken\">\n <span class=\"flex items-center gap-xs shrink-0\">\n <span class=\"w-2 h-2 rounded-full bg-critical/70\"></span>\n <span class=\"w-2 h-2 rounded-full bg-warning/70\"></span>\n <span class=\"w-2 h-2 rounded-full bg-success/70\"></span>\n </span>\n @if (fileName()) {\n <span class=\"txt-utility-caption text-text-secondary truncate\" style=\"font-family: var(--og-font-mono)\">\n {{ fileName() }}\n </span>\n }\n @if (timestamp()) {\n <span class=\"txt-utility-caption text-text-placeholder shrink-0\" style=\"font-family: var(--og-font-mono)\">\n · {{ timestamp() }}\n </span>\n }\n </div>\n\n @if (src()) {\n <img [src]=\"src()\" [alt]=\"alt() || fileName()\" class=\"block w-full object-cover\" [style.height]=\"height()\" />\n } @else {\n <div\n class=\"flex flex-col items-center justify-center gap-normal px-large text-center\"\n [style.height]=\"height()\"\n >\n <fx-ui-hero-icon icon=\"camera\" [size]=\"22\" class=\"flex text-text-placeholder\"></fx-ui-hero-icon>\n @if (caption()) {\n <span class=\"txt-utility-caption text-text-placeholder max-w-[280px]\">{{ caption() }}</span>\n }\n </div>\n }\n</div>\n@if (src() && caption()) {\n <div class=\"txt-utility-caption text-text-placeholder mt-normal\">{{ caption() }}</div>\n}\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { Tone, toneBg } from '../../../core/value-tone.util';\nimport { NgClass } from '@angular/common';\n\n/** Thin tone-coloured progress/score bar with optional label and caption. */\n@Component({\n selector: 'fx-ui-meter',\n templateUrl: './meter.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class MeterComponent {\n @Input() value = 0;\n @Input() max = 10;\n readonly tone = input<Tone | null>(null);\n /** Caller-translated texts; omitted → bar only. */\n @Input() label?: string;\n @Input() caption?: string;\n\n get percent(): number {\n const max = Number(this.max) || 1;\n const pct = (Number(this.value) / max) * 100;\n return Math.min(100, Math.max(0, pct));\n }\n\n get fillClass(): string {\n return toneBg(this.tone());\n }\n}\n","<div class=\"flex flex-col gap-small w-full\">\n @if (label || caption) {\n <div class=\"flex items-center justify-between gap-normal\">\n @if (label) {\n <span class=\"txt-field-label !mb-0\">{{ label }}</span>\n }\n @if (caption) {\n <span class=\"txt-utility-caption text-text-secondary\">{{ caption }}</span>\n }\n </div>\n }\n <div\n class=\"h-2 rounded-full bg-bg-hover overflow-hidden\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"max\"\n [attr.aria-valuenow]=\"value\"\n [attr.aria-label]=\"label || null\"\n >\n <div class=\"h-full rounded-full\" [ngClass]=\"fillClass\" [style.width.%]=\"percent\"></div>\n </div>\n</div>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { Tone, toneText } from '../../../core/value-tone.util';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { NgClass } from '@angular/common';\n\n/**\n * Panel section: card with a header and projected body.\n * - titleStyle 'heading' (default): icon + heading, the pre-V2 look\n * - titleStyle 'eyebrow': the V2 design's panel header — small tracked\n * caption on the left, muted [aside] text on the right\n *\n * The host is a flex column (not the custom element's inline default) so that\n * in a CSS grid row every card stretches to the row height and panels line up\n * (anh Tú 04/09); a footer projected with `mt-auto` sticks to the bottom.\n */\n@Component({\n selector: 'fx-ui-section-card',\n templateUrl: './section-card.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent, NgClass],\n host: { class: 'flex flex-col min-w-0' },\n})\nexport class SectionCardComponent {\n /** Caller-translated heading. */\n readonly title = input('');\n /** hero-icon name; omitted → text-only header. */\n @Input() icon?: any;\n readonly iconTone = input<Tone | null>(null);\n readonly titleStyle = input<'heading' | 'eyebrow'>('heading');\n /** Caller-translated right-aligned hint (eyebrow style). */\n readonly aside = input('');\n\n get iconClass(): string {\n const iconTone = this.iconTone();\n return iconTone ? toneText(iconTone) : 'text-text-secondary';\n }\n}\n","<!-- flex column filling the host: cards in one grid row share a height and a\n projected footer can sit at the bottom with `mt-auto` (design 01). -->\n<div class=\"card-common bg-surface flex flex-col flex-1 min-h-0\">\n @if (titleStyle() === 'eyebrow') {\n <div class=\"flex items-baseline justify-between gap-normal mb-large\">\n <span class=\"txt-eyebrow\">{{ title() }}</span>\n @if (aside()) {\n <span class=\"txt-utility-description text-right\">{{ aside() }}</span>\n }\n </div>\n } @else {\n <div class=\"flex items-center gap-normal mb-large\">\n @if (icon) {\n <fx-ui-hero-icon [ngClass]=\"iconClass\" [icon]=\"icon\" [size]=\"18\"></fx-ui-hero-icon>\n }\n <span class=\"txt-heading-06\">{{ title() }}</span>\n </div>\n }\n <ng-content></ng-content>\n</div>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { Tone, toneText } from '../../../core/value-tone.util';\nimport { NgClass } from '@angular/common';\n\n/**\n * Label-over-value field for detail panels. The label uses txt-field-label\n * with its baked-in margin neutralised (the known mb-1 alignment gotcha) —\n * spacing is owned by this component.\n */\n@Component({\n selector: 'fx-ui-info-field',\n templateUrl: './info-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class InfoFieldComponent {\n /** Caller-translated label. */\n readonly label = input('');\n @Input() value: string | number | null | undefined;\n /** Colours the value; null/undefined renders the primary text colour. */\n @Input() tone: Tone | null = null;\n /** Monospace value (hashes, paths). */\n @Input() mono = false;\n /** Placeholder when value is empty. */\n readonly placeholder = input('---');\n\n get displayValue(): string {\n if (this.value === null || this.value === undefined || this.value === '') {\n return this.placeholder();\n }\n return String(this.value);\n }\n\n get valueClass(): string {\n const toneClass = this.tone ? toneText(this.tone) : 'text-text-primary';\n return this.mono ? `${toneClass} font-mono break-all` : toneClass;\n }\n}\n","<div class=\"flex flex-col gap-small min-w-0\">\n <span class=\"txt-field-label !mb-0\">{{ label() }}</span>\n <span class=\"txt-default\" [ngClass]=\"valueClass\">{{ displayValue }}</span>\n</div>\n","import { Component, Input, ChangeDetectionStrategy, output } from '@angular/core';\nimport { Tone, toneBadge } from '../../../core/value-tone.util';\nimport { NgClass } from '@angular/common';\n\nexport interface FxSeverityBadge {\n key: string;\n label: string | number;\n tone: Tone | null;\n}\n\n/**\n * Compact total/critical/high/medium(/low) badge cluster used in table cells.\n * Pass counts via [stats]; missing fields are skipped. Labels are numbers, so\n * no i18n is involved; the total badge renders neutral.\n */\n@Component({\n selector: 'fx-ui-severity-badges',\n templateUrl: './severity-badges.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class SeverityBadgesComponent {\n @Input() stats: {\n total?: number;\n critical?: number;\n high?: number;\n medium?: number;\n low?: number;\n } | null = null;\n /** Show zero-count badges (default true, mirrors the table-cell usage). */\n @Input() showZero = true;\n /** Append the severity letter to counts (\"3C\", \"5H\", \"2M\") per the report design. */\n @Input() suffixed = false;\n readonly badgeClick = output<string>();\n\n private static readonly TONES: Record<string, Tone | null> = {\n total: null,\n critical: 'critical',\n high: 'danger',\n medium: 'warning',\n low: 'success',\n };\n\n get badges(): FxSeverityBadge[] {\n const s = this.stats ?? {};\n return (['total', 'critical', 'high', 'medium', 'low'] as const)\n .filter((key) => s[key] !== undefined && (this.showZero || Number(s[key]) > 0))\n .map((key) => {\n const count = Number(s[key]) || 0;\n const label =\n this.suffixed && key !== 'total' ? `${count}${key.charAt(0).toUpperCase()}` : count;\n return { key, label, tone: SeverityBadgesComponent.TONES[key] };\n });\n }\n\n badgeClass(badge: FxSeverityBadge): string {\n return badge.tone ? toneBadge(badge.tone) : 'bg-bg-hover text-text-primary';\n }\n}\n","<div class=\"flex items-center gap-small\">\n @for (badge of badges; track badge.key) {\n <button\n type=\"button\"\n class=\"px-2 py-0.5 rounded-full txt-utility-caption font-medium cursor-pointer focus-visible:ring-2 focus-visible:ring-primary/50\"\n [ngClass]=\"badgeClass(badge)\"\n [attr.aria-label]=\"badge.key + ': ' + badge.label\"\n (click)=\"badgeClick.emit(badge.key)\"\n >{{ badge.label }}</button>\n }\n</div>\n","import { Component, Input, TemplateRef, AfterViewInit, AfterContentInit, ElementRef, inject, input, contentChild, viewChild } from '@angular/core';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { BaseMasterDetailComponent } from '../../../core/components/base-master-detail.component';\nimport { SkeletonListComponent } from '../skeleton-list/skeleton-list.component';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { EmptyStateComponent } from '../empty-state/empty-state.component';\nimport { SkeletonDetailComponent } from '../skeleton-detail/skeleton-detail.component';\n\nlet nextUid = 0;\n\n/**\n * Master-detail shell driven by a BaseMasterDetailComponent. Two-column by\n * default; projecting a [mdFacets] block (V2 lookup screens) adds a third\n * facets-rail column before the list. The host page projects its own\n * header/filters and supplies templates for the parts that vary per entity:\n *\n * <fx-ui-master-detail [table]=\"this\" [emptyMessage]=\"'noData' | translate\">\n * <div mdFacets>…<fx-ui-facets-rail …/>…</div> <!-- optional, V2 -->\n * <div mdHeader>…title / stat cards…</div>\n * <div mdFilters>…search bar / filter chips…</div>\n * <ng-template #row let-item let-selected=\"selected\">…row body…</ng-template>\n * <ng-template #detail let-detail>…detail pane…</ng-template>\n * </fx-ui-master-detail>\n *\n * The list behaves as a single-select listbox: the selected option is the\n * tab stop, ArrowUp/Down/Home/End move the selection.\n */\n@Component({\n selector: 'fx-ui-master-detail',\n templateUrl: './master-detail.component.html',\n styleUrl: './master-detail.component.css',\n imports: [\n SkeletonListComponent,\n NgClass,\n NgTemplateOutlet,\n EmptyStateComponent,\n MatPaginator,\n SkeletonDetailComponent,\n ],\n})\nexport class MasterDetailComponent implements AfterViewInit, AfterContentInit {\n private hostEl = inject(ElementRef<HTMLElement>);\n\n /** True when the host projected a [mdFacets] block — switches to 3 columns. */\n hasFacets = false;\n\n @Input() table!: BaseMasterDetailComponent<any>;\n /** Fixed list-pane width on lg+ viewports (stacked full-width below). */\n readonly listWidth = input('420px');\n /**\n * Chiều cao CHUNG của cả ba cụm (facets / list / detail). Mặc định trừ phần\n * chrome phía trên (topbar + tab strip + context line) khỏi viewport để\n * bảng ba cột vừa đúng một màn, không kéo trang cuộn theo.\n * Chỉ có tác dụng từ 1080px — xem `.fx-md-row` trong CSS.\n */\n readonly paneHeight = input('calc(100vh - 300px)');\n readonly pageSizeOptions = input([5, 10, 20, 50]);\n /** Labels come in via inputs — the lib carries no i18n. */\n readonly emptyMessage = input('No data');\n readonly listLabel = input('');\n readonly skeletonCards = input(3);\n /** 'prevnext' renders the V2 \"X of Y\" + Prev/Next controls instead of the\n Material paginator (which stays in the DOM, hidden — it is the paging\n engine BaseTable subscribes to). */\n readonly paginationStyle = input<'paginator' | 'prevnext'>('paginator');\n /** Caller-translated Prev/Next labels (\"X of Y\" is numeric). */\n readonly prevLabel = input('Prev');\n readonly nextLabel = input('Next');\n\n readonly rowTemplate = contentChild.required<TemplateRef<any>>('row');\n readonly detailTemplate = contentChild.required<TemplateRef<any>>('detail');\n readonly paginator = viewChild.required(MatPaginator);\n\n readonly uid = `fx-md-${nextUid++}`;\n\n ngAfterContentInit(): void {\n this.hasFacets = !!this.hostEl.nativeElement.querySelector('[mdFacets]');\n }\n\n ngAfterViewInit(): void {\n // The paginator lives in this view, not the host page's, so the host's\n // @ViewChild(MatPaginator) never finds it. Hand it to the table so\n // refresh() keeps resetting pageIndex.\n if (this.table) {\n this.table.paginator = this.paginator();\n }\n }\n\n /** \"X of Y\" range text for the prevnext pagination style. */\n rangeText(): string {\n const total = this.table.total ?? 0;\n if (!total) return '0 of 0';\n const page = this.paginator().pageIndex;\n const size = this.table.pageSize;\n const from = page * size + 1;\n const to = Math.min((page + 1) * size, total);\n return `${from}–${to} of ${total}`;\n }\n\n isSelected(row: any): boolean {\n return this.table.idOf(row) === this.table.selectedId;\n }\n\n optionId(index: number): string {\n return `${this.uid}-opt-${index}`;\n }\n\n onKeydown(event: KeyboardEvent, index: number): void {\n const rows = this.table.dataSource.data || [];\n if (!rows.length) {\n return;\n }\n let next: number;\n switch (event.key) {\n case 'ArrowDown':\n next = Math.min(index + 1, rows.length - 1);\n break;\n case 'ArrowUp':\n next = Math.max(index - 1, 0);\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = rows.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n if (next === index) {\n return;\n }\n this.table.selectItem(rows[next]);\n const el = document.getElementById(this.optionId(next));\n el?.focus();\n el?.scrollIntoView({ block: 'nearest' });\n }\n}\n","<!-- 3 cụm CHUNG chiều cao, mỗi cụm SCROLL RIÊNG (anh Tú chốt 03/09).\n `items-stretch` + chiều cao đặt trên hàng (xem .fx-md-row trong CSS) để\n cả ba pane bằng nhau; mỗi pane là flex-col + min-h-0 và chỉ phần thân\n `overflow-auto flex-1` cuộn — header/filter/paginator đứng yên.\n ⚠️ Hướng hàng + chiều cao do CONTAINER QUERY trong CSS quyết định (theo\n bề rộng của chính hàng), KHÔNG phải `lg:flex-row`. Đừng thêm lại class\n `lg:*` ở đây — `lg` trong lib là 1080px và viewport là proxy sai; xem\n ghi chú đầu master-detail.component.css. -->\n<div\n class=\"fx-md-row flex flex-col items-stretch gap-xl\"\n [style.--fx-md-list-width]=\"listWidth()\"\n [style.--fx-md-pane-h]=\"paneHeight()\"\n>\n <!-- Facets rail (V2 3-column lookup) — wrapper always rendered so ng-content\n stays unconditional; hidden when the host projects nothing. -->\n <div\n class=\"fx-md-facets card-common bg-surface flex flex-col min-h-0\"\n [class.hidden]=\"!hasFacets\"\n >\n <div class=\"flex-1 min-h-0 overflow-auto pr-xs\">\n <ng-content select=\"[mdFacets]\"></ng-content>\n </div>\n </div>\n\n <!-- Master: list pane -->\n <div class=\"fx-md-list card-common flex flex-col min-h-0\">\n <ng-content select=\"[mdHeader]\"></ng-content>\n <ng-content select=\"[mdFilters]\"></ng-content>\n <div\n class=\"flex flex-col gap-normal overflow-auto pr-xs flex-1 min-h-0\"\n role=\"listbox\"\n [attr.aria-label]=\"listLabel() || null\"\n >\n @if (table.loading) {\n <fx-ui-skeleton-list [rows]=\"table.pageSize\"></fx-ui-skeleton-list>\n } @else {\n @for (row of table.dataSource.data; track table.idOf(row); let i = $index) {\n <button\n type=\"button\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [attr.aria-selected]=\"isSelected(row)\"\n [tabindex]=\"isSelected(row) ? 0 : -1\"\n (click)=\"table.selectItem(row)\"\n (keydown)=\"onKeydown($event, i)\"\n class=\"text-left rounded-lg border p-semi transition-colors\"\n [ngClass]=\"\n isSelected(row)\n ? 'border-accent bg-accent-soft/60'\n : 'border-border-default hover:border-border-interactive bg-bg-primary'\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"rowTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: row, selected: isSelected(row) }\"\n ></ng-container>\n </button>\n }\n @if (!table.dataSource.data.length) {\n <fx-ui-empty-state [message]=\"emptyMessage()\"></fx-ui-empty-state>\n }\n }\n </div>\n <!-- No (page) binding: ngAfterViewInit hands this paginator to the table,\n whose own BaseTable subscription (running after this child's hook)\n wires page events — a binding here would double-fetch every change. -->\n <mat-paginator\n class=\"mt-normal\"\n [class.fx-md-paginator-hidden]=\"paginationStyle() === 'prevnext'\"\n [length]=\"table.total\"\n [pageSize]=\"table.pageSize\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n ></mat-paginator>\n @if (paginationStyle() === 'prevnext') {\n <div class=\"flex items-center justify-between mt-normal\">\n <span class=\"txt-utility-description\" style=\"font-family: var(--og-font-figure)\">\n {{ rangeText() }}\n </span>\n <div class=\"flex gap-small\">\n <button\n type=\"button\"\n class=\"btn-alternative !h-8 !px-semi text-sm\"\n [disabled]=\"!paginator().hasPreviousPage()\"\n (click)=\"paginator().previousPage()\"\n >\n {{ prevLabel() }}\n </button>\n <button\n type=\"button\"\n class=\"btn-alternative !h-8 !px-semi text-sm\"\n [disabled]=\"!paginator().hasNextPage()\"\n (click)=\"paginator().nextPage()\"\n >\n {{ nextLabel() }}\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Detail pane -->\n <div class=\"fx-md-detail w-full min-w-0 flex flex-col min-h-0\">\n <div class=\"flex-1 min-h-0 overflow-auto\">\n @if (table.selected) {\n @if (table.detailBusy) {\n <fx-ui-skeleton-detail [cards]=\"skeletonCards()\"></fx-ui-skeleton-detail>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"detailTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: table.detail, selected: table.selected }\"\n ></ng-container>\n }\n } @else {\n <div class=\"card-common flex items-center justify-center h-full min-h-[300px]\">\n <fx-ui-empty-state [message]=\"emptyMessage()\"></fx-ui-empty-state>\n </div>\n }\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output\n} from '@angular/core';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { Tone } from '../../../core/value-tone.util';\n\nexport interface FxMenuItem {\n /** Caller-translated label. */\n label: string;\n /** Optional hero-icon name shown before the label. */\n icon?: string;\n /** Danger/warning items get the matching text tone. */\n tone?: Tone | null;\n disabled?: boolean;\n /** Free-form identifier handed back on (select). */\n value?: any;\n}\n\n/**\n * Row-action dropdown wrapper over mat-menu (behavior-layer rule, Playbook\n * §5.1 — apps never import @angular/material directly). Project the trigger\n * content; items render from [items] and come back through (select).\n *\n * <fx-ui-menu [items]=\"actions\" (select)=\"onAction($event)\">\n * <fx-ui-hero-icon icon=\"ellipsis-vertical\" [size]=\"20\" />\n * </fx-ui-menu>\n */\n@Component({\n selector: 'fx-ui-menu',\n templateUrl: './menu.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatMenuModule, HeroIconComponent],\n})\nexport class MenuComponent {\n readonly items = input<FxMenuItem[]>([]);\n readonly disabled = input(false);\n /** Accessible name for the trigger button. */\n readonly ariaLabel = input('Open menu');\n readonly select = output<FxMenuItem>();\n\n toneClass(item: FxMenuItem): string {\n switch (item.tone) {\n case 'critical':\n case 'danger':\n return 'tone-fg-danger';\n case 'warning':\n return 'tone-fg-warning';\n case 'success':\n return 'tone-fg-success';\n case 'information':\n return 'tone-fg-information';\n default:\n return 'text-text-primary';\n }\n }\n}\n","<button\n type=\"button\"\n class=\"inline-flex items-center justify-center rounded-lg p-1 hover:bg-bg-hover transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n [matMenuTriggerFor]=\"menu\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <ng-content></ng-content>\n</button>\n\n<mat-menu #menu=\"matMenu\">\n @for (item of items(); track item.label) {\n <button\n mat-menu-item\n type=\"button\"\n [disabled]=\"item.disabled\"\n (click)=\"select.emit(item)\"\n >\n <span class=\"flex items-center gap-normal\" [class]=\"toneClass(item)\">\n @if (item.icon) {\n <fx-ui-hero-icon [icon]=\"item.icon\" [size]=\"18\"></fx-ui-hero-icon>\n }\n <span>{{ item.label }}</span>\n </span>\n </button>\n }\n</mat-menu>\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport {\n OG_PICKER_THEME_META,\n OG_THEME_META,\n OgTheme,\n OgThemeMeta,\n ThemeService,\n} from '../../../core/services/theme.service';\n\n/**\n * V2 theme picker — dropdown các theme OgeniumDashboards cho chọn\n * (OG_PICKER_THEME_META: porcelain/charcoal), mỗi dòng có swatch accent +\n * page. Drives ThemeService.setTheme(); replaces the pre-V2 sun/moon toggle\n * (behavior-layer rule: mat-menu stays inside the lib, apps never import\n * @angular/material directly).\n *\n * <fx-ui-theme-picker />\n */\n@Component({\n selector: 'fx-ui-theme-picker',\n templateUrl: './theme-picker.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatMenuModule, HeroIconComponent],\n})\nexport class ThemePickerComponent {\n private themeService = inject(ThemeService);\n\n readonly themes: readonly OgThemeMeta[] = OG_PICKER_THEME_META;\n readonly current = toSignal(this.themeService.themeChanges(), {\n initialValue: this.themeService.getCurrentTheme(),\n });\n\n /** Tra trên bộ ĐẦY ĐỦ: theme đang active có thể là một trong 4 theme đã ẩn\n khỏi picker (deep-link /themes, localStorage cũ) — nhãn vẫn phải đúng. */\n currentMeta(): OgThemeMeta {\n return OG_THEME_META.find((t) => t.name === this.current()) ?? this.themes[0];\n }\n\n select(theme: OgTheme) {\n this.themeService.setTheme(theme);\n }\n}\n","<button\n type=\"button\"\n [matMenuTriggerFor]=\"themeMenu\"\n class=\"flex items-center gap-small px-normal py-small rounded-control border border-border-default bg-transparent cursor-pointer hover:bg-bg-hover transition-colors\"\n aria-label=\"Change theme\"\n>\n <span\n class=\"w-4 h-4 rounded-full border border-border-strong/30 shrink-0\"\n [style.background]=\"\n 'linear-gradient(135deg, ' +\n currentMeta().accent +\n ' 50%, ' +\n currentMeta().pageBg +\n ' 50%)'\n \"\n ></span>\n <span class=\"txt-body-01 hidden md:inline\">{{ currentMeta().label }}</span>\n <fx-ui-hero-icon icon=\"chevron-down\" [size]=\"14\" class=\"flex text-text-secondary\" />\n</button>\n\n<mat-menu #themeMenu=\"matMenu\">\n @for (theme of themes; track theme.name) {\n <button\n mat-menu-item\n type=\"button\"\n (click)=\"select(theme.name)\"\n [attr.aria-current]=\"theme.name === current() ? 'true' : null\"\n >\n <div class=\"flex items-center gap-normal min-w-40\">\n <span\n class=\"w-5 h-5 rounded-full border border-border-strong/30 shrink-0\"\n [style.background]=\"\n 'linear-gradient(135deg, ' + theme.accent + ' 50%, ' + theme.pageBg + ' 50%)'\n \"\n ></span>\n <span class=\"txt-body-01 flex-1\">{{ theme.label }}</span>\n <span class=\"txt-utility-description\">{{ theme.dark ? 'Dark' : 'Light' }}</span>\n @if (theme.name === current()) {\n <fx-ui-hero-icon icon=\"check\" [size]=\"16\" class=\"flex text-text-selected\" />\n }\n </div>\n </button>\n }\n</mat-menu>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n/**\n * \"Waiting on the backend\" marker (anh Tú 29/08).\n *\n * Put this on any UI the V2 design calls for but no endpoint feeds yet, so the\n * gap is visible in the product instead of living only in a backlog file.\n * `grep -r \"fx-ui-pending-badge\"` then lists every outstanding field.\n *\n * <fx-ui-pending-badge [field]=\"'confirmed-chains weekly series'\" />\n *\n * Keep the copy factual: it states that data is missing, never fakes a value.\n * Styling is neutral on purpose (anh Tú 04/09): a hint, not a warning.\n */\n@Component({\n selector: 'fx-ui-pending-badge',\n templateUrl: './pending-badge.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class PendingBadgeComponent {\n /** Caller-translated chip text. */\n readonly label = input('Pending API');\n /**\n * What exactly is missing — shown as the title tooltip so a reviewer can read\n * the required field without opening the code.\n */\n readonly field = input('');\n /** 'chip' (default) sits inline; 'dot' is a bare marker for dense rows. */\n readonly variant = input<'chip' | 'dot'>('chip');\n\n get tooltip(): string {\n return this.field() ? `${this.label()} — ${this.field()}` : this.label();\n }\n}\n","@if (variant() === 'dot') {\n <span\n class=\"inline-block w-[7px] h-[7px] rounded-full bg-muted/60 align-middle\"\n [attr.title]=\"tooltip\"\n [attr.aria-label]=\"tooltip\"\n ></span>\n} @else {\n <span\n class=\"inline-flex items-center gap-xs px-small py-[1px] rounded-pill border border-border-subtle bg-neutral-soft text-muted txt-tag-label whitespace-nowrap align-middle\"\n [attr.title]=\"tooltip\"\n >\n <fx-ui-hero-icon icon=\"clock\" [size]=\"11\" class=\"flex\" />\n {{ label() }}\n </span>\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n/**\n * Wraps UI that is rendered from PLACEHOLDER data so the layout can be\n * reviewed before its endpoint exists (anh Tú 29/08: \"muốn có full giao diện\n * trước để review\").\n *\n * The marker is deliberately quiet (anh Tú 04/09: no yellow frame, just a\n * subtle \"Pending API\" chip): a neutral chip above the block, with the label\n * and missing field in its tooltip. The content itself is non-interactive so\n * sample shapes are never mistaken for live state. Drop the wrapper (and the\n * sample input) the moment the API lands.\n *\n * The pending chip is inlined rather than composed from fx-ui-pending-badge:\n * one lib component importing another inside the same barrel tripped NG0919\n * (metadata read before definition) in consuming apps.\n *\n * <fx-ui-sample-frame [field]=\"'weekly activity'\" [label]=\"'Sample layout'\">\n * …chart rendered from sample series…\n * </fx-ui-sample-frame>\n */\n@Component({\n selector: 'fx-ui-sample-frame',\n templateUrl: './sample-frame.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n // Flex column so a frame placed in a stretched card can hand the remaining\n // height to its content (e.g. a chart with height=\"100%\") — panels in one\n // row then end on the same line (anh Tú 04/09).\n host: { class: 'flex flex-col min-h-0' },\n})\nexport class SampleFrameComponent {\n /** Caller-translated block label — surfaces in the chip tooltip only. */\n readonly label = input('Sample layout');\n /** Field the backend still owes — shown on the pending badge tooltip. */\n readonly field = input('');\n /** Caller-translated pending-chip text. */\n readonly pendingLabel = input('Pending API');\n\n get tooltip(): string {\n const head = `${this.label()} · ${this.pendingLabel()}`;\n return this.field() ? `${head} — ${this.field()}` : head;\n }\n}\n","<div class=\"relative flex flex-col flex-1 min-h-0\">\n <!-- One quiet chip marks the block as sample data; the tooltip names the\n missing field. flex-wrap so the chip drops a line in narrow rails. -->\n <div class=\"flex flex-wrap items-center gap-small mb-small\">\n <span\n class=\"inline-flex items-center gap-xs px-small py-[1px] rounded-pill border border-border-subtle bg-neutral-soft text-muted txt-tag-label whitespace-nowrap\"\n [attr.title]=\"tooltip\"\n >\n <fx-ui-hero-icon icon=\"clock\" [size]=\"11\" class=\"flex\" />\n {{ pendingLabel() }}\n </span>\n </div>\n <!-- Sample content is non-interactive: nothing here reflects real state. -->\n <div class=\"pointer-events-none select-none opacity-90 flex-1 min-h-0 flex flex-col\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBadge } from '../../../core/value-tone.util';\n\n/**\n * V2 score badge — the risk/score chip used on attack-path rows, dashboard\n * panels and project tiles. Colour comes from the 0–100 risk band unless an\n * explicit tone is given (bands: ≥90 critical, ≥70 danger, ≥40 warning, else\n * success — same thresholds as value-tone's scoreTone on a 0–100 scale).\n */\n@Component({\n selector: 'fx-ui-score-badge',\n templateUrl: './score-badge.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class ScoreBadgeComponent {\n readonly score = input.required<number | string>();\n /** Denominator shown as \"98 / 100\"; omit for a bare score. */\n readonly outOf = input<number | null>(null);\n /** Overrides the band-derived tone. */\n readonly tone = input<Tone | null>(null);\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n\n readonly resolvedTone = computed<Tone | null>(() => {\n const explicit = this.tone();\n if (explicit) return explicit;\n const value = Number(this.score());\n if (!isFinite(value)) return null;\n if (value >= 90) return 'critical';\n if (value >= 70) return 'danger';\n if (value >= 40) return 'warning';\n return 'success';\n });\n\n badgeClass(): string {\n return toneBadge(this.resolvedTone());\n }\n\n sizeClass(): string {\n switch (this.size()) {\n case 'sm':\n return 'text-xs px-normal py-[1px]';\n case 'lg':\n return 'text-2xl px-semi py-small font-semibold';\n default:\n return 'text-sm px-semi py-xs font-semibold';\n }\n }\n}\n","<span\n class=\"inline-flex items-center justify-center rounded-control whitespace-nowrap\"\n [ngClass]=\"[badgeClass(), sizeClass()]\"\n style=\"font-family: var(--og-font-figure)\"\n>\n {{ score() }}@if (outOf() !== null) {<span class=\"opacity-60\">&nbsp;/&nbsp;{{ outOf() }}</span>}\n</span>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBg } from '../../../core/value-tone.util';\n\n/**\n * V2 StatusDot — tiny tone-coloured indicator used in list rows, project\n * cards and stat grids. Optional pulse for \"live\" states (running scans).\n *\n * <fx-ui-status-dot tone=\"success\" />\n * <fx-ui-status-dot tone=\"warning\" [pulse]=\"true\" />\n */\n@Component({\n selector: 'fx-ui-status-dot',\n templateUrl: './status-dot.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class StatusDotComponent {\n readonly tone = input<Tone | null>(null);\n /** Diameter in px. */\n readonly size = input(8);\n readonly pulse = input(false);\n\n dotClass(): string {\n return toneBg(this.tone());\n }\n}\n","<span\n class=\"relative inline-flex shrink-0\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n>\n @if (pulse()) {\n <span\n class=\"absolute inline-flex h-full w-full rounded-full opacity-60 animate-ping motion-reduce:animate-none\"\n [ngClass]=\"dotClass()\"\n ></span>\n }\n <span class=\"relative inline-flex h-full w-full rounded-full\" [ngClass]=\"dotClass()\"></span>\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n afterRenderEffect,\n computed,\n input,\n model,\n signal,\n untracked,\n viewChildren,\n} from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nexport interface FxSegmentedOption {\n value: string | number;\n /** Caller-translated label. */\n label: string;\n /** Optional hero-icon before the label. */\n icon?: string;\n /** Optional trailing count chip. */\n count?: number;\n disabled?: boolean;\n}\n\n/**\n * V2 segmented control — mode toggles (Essentials/Advanced), Catalog/Table\n * view switches, sub-navigation inside a tab. Generic n-option control; the\n * semantics live with the caller.\n *\n * Rendered as a compact pill group (anh Tú 29/08): equal-width options inside\n * a rounded-full track, with a single \"thumb\" that SLIDES to the active\n * option (transform transition — no per-button background repaint).\n *\n * <fx-ui-segmented [options]=\"modes\" [(value)]=\"mode\" />\n */\n@Component({\n selector: 'fx-ui-segmented',\n templateUrl: './segmented.component.html',\n styleUrl: './segmented.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class SegmentedComponent {\n readonly options = input<FxSegmentedOption[]>([]);\n readonly value = model<string | number | null>(null);\n /** Accessible name for the group. */\n readonly ariaLabel = input('View mode');\n /**\n * Both variants share the pill shape; they differ in the thumb fill:\n * 'default': raised surface thumb — view switches (Catalog/Table, ref 10).\n * 'pill': accent-filled thumb — the Essential/Advanced depth toggle\n * (design refs 04/05).\n */\n readonly variant = input<'default' | 'pill'>('default');\n /**\n * 'equal' (default): every segment takes the same width (view toggles such\n * as Catalog | Table). 'content': each segment is as wide as its label —\n * the demo's detail-pane tabs (\"Affected software · Summary · Evidence\"),\n * where equal columns would truncate the long label in a narrow pane.\n */\n readonly fit = input<'equal' | 'content'>('equal');\n\n private readonly optionEls = viewChildren<ElementRef<HTMLButtonElement>>('opt');\n /** Measured box of the active segment — only used when fit === 'content'. */\n private readonly thumbBox = signal<{ left: number; width: number } | null>(null);\n\n constructor() {\n // Content-fit segments have no shared width to derive the thumb from, so\n // measure the active button after each render that could move it.\n afterRenderEffect(() => {\n const index = this.activeIndex();\n this.options();\n const els = this.optionEls();\n if (this.fit() !== 'content' || index < 0 || !els[index]) {\n untracked(() => this.thumbBox.set(null));\n return;\n }\n const el = els[index].nativeElement;\n const box = { left: el.offsetLeft, width: el.offsetWidth };\n untracked(() => {\n const prev = this.thumbBox();\n if (!prev || prev.left !== box.left || prev.width !== box.width) this.thumbBox.set(box);\n });\n });\n }\n\n /** Index the sliding thumb sits on; -1 hides it (no/unknown selection). */\n readonly activeIndex = computed(() =>\n this.options().findIndex((o) => o.value === this.value())\n );\n\n /** Equal-width tracks → the thumb is 1/n of the inner width and slides by\n * multiples of its own width. Pure CSS transform, nothing to measure. */\n readonly thumbWidth = computed(() => {\n const box = this.thumbBox();\n if (this.fit() === 'content') return box ? `${box.width}px` : '0px';\n return `calc((100% - 6px) / ${this.options().length || 1})`;\n });\n\n readonly thumbTransform = computed(() => {\n const box = this.thumbBox();\n if (this.fit() === 'content') return box ? `translateX(${box.left - 3}px)` : 'none';\n return `translateX(${this.activeIndex() * 100}%)`;\n });\n\n readonly gridClass = computed(() => (this.fit() === 'content' ? 'auto-cols-auto' : 'auto-cols-fr'));\n\n select(option: FxSegmentedOption) {\n if (option.disabled || option.value === this.value()) return;\n this.value.set(option.value);\n }\n\n thumbClass(): string {\n return this.variant() === 'pill'\n ? 'bg-accent'\n : 'bg-surface-raised border border-border shadow-sm';\n }\n\n optionClass(option: FxSegmentedOption): string {\n if (option.value !== this.value()) {\n return 'text-muted hover:text-strong';\n }\n return this.variant() === 'pill' ? 'text-accent-contrast' : 'text-strong';\n }\n}\n","<div\n class=\"relative inline-grid max-w-full grid-flow-col items-stretch p-[3px] bg-surface-sunken border border-border rounded-full\"\n [class]=\"gridClass()\"\n role=\"group\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <!-- Sliding thumb: one element that translates to the active option -->\n @if (activeIndex() >= 0) {\n <span\n aria-hidden=\"true\"\n class=\"fx-segmented__thumb absolute top-[3px] bottom-[3px] left-[3px] rounded-full pointer-events-none\"\n [class]=\"thumbClass()\"\n [style.width]=\"thumbWidth()\"\n [style.transform]=\"thumbTransform()\"\n ></span>\n }\n @for (option of options(); track option.value) {\n <button\n #opt\n type=\"button\"\n (click)=\"select(option)\"\n [disabled]=\"option.disabled\"\n [attr.aria-pressed]=\"option.value === value()\"\n class=\"relative z-[1] flex min-w-0 items-center justify-center gap-xs px-semi py-[5px] rounded-full text-[13px] leading-none font-medium whitespace-nowrap transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed\"\n [class]=\"optionClass(option)\"\n >\n @if (option.icon) {\n <fx-ui-hero-icon [icon]=\"option.icon\" [size]=\"14\" class=\"flex\" />\n }\n <!-- text-box trims Archivo's uneven leading → true optical centering\n (Chrome 128+/Safari 18.2+; older browsers ignore it harmlessly).\n truncate adds overflow:hidden, and the trimmed box ends at cap\n height / baseline — so the dot on \"i\" and the tail on \"y\" fall\n outside it and get clipped. py/-my pair gives both back without\n changing the control's height. -->\n <span class=\"min-w-0 truncate py-[3px] -my-[3px] [text-box:trim-both_cap_alphabetic]\">{{ option.label }}</span>\n @if (option.count !== undefined) {\n <span class=\"txt-tag-label px-small rounded-pill bg-neutral-soft text-neutral-soft-fg\">\n {{ option.count }}\n </span>\n }\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBadge } from '../../../core/value-tone.util';\nimport { StatusDotComponent } from '../status-dot/status-dot.component';\n\nexport interface FxListRowBadge {\n /** Caller-translated label. */\n label: string;\n tone?: Tone | null;\n}\n\n/**\n * V2 ListRow — presentational body for master-detail #row templates and other\n * selectable lists: status dot + title, trailing badges, meta line. Extra\n * content projects below the meta line.\n *\n * <ng-template #row let-item>\n * <fx-ui-list-row\n * [title]=\"item.name\"\n * [meta]=\"item.version + ' · ' + item.date\"\n * [dotTone]=\"statusTone(item)\"\n * [badges]=\"[{ label: item.severity, tone: severityTone(item.severity) }]\"\n * />\n * </ng-template>\n */\n@Component({\n selector: 'fx-ui-list-row',\n templateUrl: './list-row.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, StatusDotComponent],\n})\nexport class ListRowComponent {\n readonly title = input.required<string>();\n readonly meta = input('');\n readonly badges = input<FxListRowBadge[]>([]);\n readonly dotTone = input<Tone | null | undefined>(undefined);\n readonly dotPulse = input(false);\n\n badgeClass(badge: FxListRowBadge): string {\n return toneBadge(badge.tone ?? null);\n }\n}\n","<div class=\"flex items-center gap-normal min-w-0\">\n @if (dotTone() !== undefined) {\n <fx-ui-status-dot [tone]=\"dotTone() ?? null\" [pulse]=\"dotPulse()\" />\n }\n <span class=\"txt-body-medium-01 truncate flex-1\">{{ title() }}</span>\n @for (badge of badges(); track badge.label) {\n <span\n class=\"txt-tag-label px-normal py-[1px] rounded-pill whitespace-nowrap\"\n [ngClass]=\"badgeClass(badge)\"\n >\n {{ badge.label }}\n </span>\n }\n</div>\n@if (meta()) {\n <div class=\"txt-utility-description mt-xs truncate\" [class.ml-large]=\"dotTone() !== undefined\">\n {{ meta() }}\n </div>\n}\n<ng-content></ng-content>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBg } from '../../../core/value-tone.util';\n\nexport interface FxBarListItem {\n /** Caller-translated label. */\n label: string;\n value: number;\n /** Shown instead of the raw value (e.g. \"9.8\", \"82%\"). */\n valueLabel?: string;\n /** Bar colour; null/undefined renders the accent. */\n tone?: Tone | null;\n /** Secondary line under the label. */\n meta?: string;\n /** Free-form identifier handed back on (select). */\n data?: any;\n}\n\n/**\n * V2 BarList — ranked horizontal bars (\"Top projects by risk\", \"Top critical\n * attack paths\"). Pure DOM (accessible, token-native, clickable) — charts via\n * ECharts are for time series, not rankings.\n *\n * <fx-ui-bar-list [items]=\"topRisk\" (select)=\"open($event)\" />\n */\n@Component({\n selector: 'fx-ui-bar-list',\n templateUrl: './bar-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class BarListComponent {\n readonly items = input<FxBarListItem[]>([]);\n /** Rows render as buttons only when true (a (select) listener exists). */\n readonly interactive = input(false);\n readonly select = output<FxBarListItem>();\n\n readonly max = computed(() => Math.max(...this.items().map((i) => i.value), 1));\n\n widthOf(item: FxBarListItem): number {\n return Math.max((item.value / this.max()) * 100, 2);\n }\n\n barClass(item: FxBarListItem): string {\n return item.tone ? toneBg(item.tone) : 'bg-accent';\n }\n\n onSelect(item: FxBarListItem) {\n if (this.interactive()) this.select.emit(item);\n }\n}\n","<div class=\"flex flex-col gap-small\">\n @for (item of items(); track item.label) {\n <button\n type=\"button\"\n class=\"text-left rounded-control px-normal py-small -mx-normal transition-colors\"\n [class.hover:bg-surface-sunken]=\"interactive()\"\n [class.cursor-default]=\"!interactive()\"\n [tabindex]=\"interactive() ? 0 : -1\"\n (click)=\"onSelect(item)\"\n >\n <div class=\"flex items-baseline justify-between gap-normal\">\n <span class=\"txt-body-medium-01 truncate\">{{ item.label }}</span>\n <span class=\"text-sm font-semibold text-strong shrink-0\" style=\"font-family: var(--og-font-figure)\">\n {{ item.valueLabel ?? item.value }}\n </span>\n </div>\n @if (item.meta) {\n <div class=\"txt-utility-description truncate\">{{ item.meta }}</div>\n }\n <div class=\"mt-xs h-[var(--og-track-h)] rounded-pill bg-track overflow-hidden\">\n <div\n class=\"h-full rounded-pill transition-all duration-500\"\n [ngClass]=\"barClass(item)\"\n [style.width.%]=\"widthOf(item)\"\n ></div>\n </div>\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneText } from '../../../core/value-tone.util';\nimport { StatusDotComponent } from '../status-dot/status-dot.component';\n\nexport interface FxFacetOption {\n value: string | number;\n /** Caller-translated label. */\n label: string;\n count?: number;\n /** Optional tone dot before the label (severity facets). */\n tone?: Tone | null;\n}\n\nexport interface FxFacetGroup {\n id: string;\n /** Caller-translated group heading. */\n label: string;\n /** Multi-select (checkbox semantics); default single-select toggle. */\n multi?: boolean;\n options: FxFacetOption[];\n}\n\nexport type FxFacetSelection = Record<string, (string | number)[]>;\n\n/**\n * V2 facets rail — the first column of 3-column lookup screens: filter groups\n * with counts + a Reset link. Presentational: filtering itself stays in the\n * page (feed the emitted selection into BaseMasterDetail filters).\n *\n * <div mdFacets>\n * <fx-ui-facets-rail [groups]=\"facetGroups\" [selection]=\"facets\"\n * (selectionChange)=\"onFacets($event)\" />\n * </div>\n */\n@Component({\n selector: 'fx-ui-facets-rail',\n templateUrl: './facets-rail.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, StatusDotComponent],\n})\nexport class FacetsRailComponent {\n readonly groups = input<FxFacetGroup[]>([]);\n readonly selection = input<FxFacetSelection>({});\n /** Caller-translated label for the reset affordance. */\n readonly resetLabel = input('Reset');\n readonly selectionChange = output<FxFacetSelection>();\n\n readonly hasSelection = computed(() =>\n Object.values(this.selection()).some((values) => values?.length)\n );\n\n isSelected(group: FxFacetGroup, option: FxFacetOption): boolean {\n return (this.selection()[group.id] ?? []).includes(option.value);\n }\n\n toggle(group: FxFacetGroup, option: FxFacetOption) {\n const current = this.selection()[group.id] ?? [];\n let next: (string | number)[];\n if (group.multi) {\n next = current.includes(option.value)\n ? current.filter((v) => v !== option.value)\n : [...current, option.value];\n } else {\n next = current.includes(option.value) ? [] : [option.value];\n }\n this.selectionChange.emit({ ...this.selection(), [group.id]: next });\n }\n\n reset() {\n this.selectionChange.emit({});\n }\n\n toneClass(option: FxFacetOption): string {\n return option.tone ? toneText(option.tone) : '';\n }\n}\n","<div class=\"flex flex-col gap-large\">\n @if (hasSelection()) {\n <button type=\"button\" class=\"txt-link self-end\" (click)=\"reset()\">\n {{ resetLabel() }}\n </button>\n }\n @for (group of groups(); track group.id) {\n <div role=\"group\" [attr.aria-label]=\"group.label\">\n <div class=\"txt-eyebrow mb-small\">{{ group.label }}</div>\n <div class=\"flex flex-col gap-xs\">\n @for (option of group.options; track option.value) {\n <button\n type=\"button\"\n (click)=\"toggle(group, option)\"\n [attr.aria-pressed]=\"isSelected(group, option)\"\n class=\"flex items-center gap-normal px-normal py-small rounded-control text-left transition-colors\"\n [ngClass]=\"\n isSelected(group, option)\n ? 'bg-accent-soft text-accent-soft-fg font-medium'\n : 'text-body hover:bg-surface-sunken'\n \"\n >\n @if (option.tone) {\n <fx-ui-status-dot [tone]=\"option.tone\" [size]=\"7\" />\n }\n <span class=\"text-sm truncate flex-1\">{{ option.label }}</span>\n @if (option.count !== undefined) {\n <span class=\"txt-tag-label text-faint\" style=\"font-family: var(--og-font-figure)\">\n {{ option.count }}\n </span>\n }\n </button>\n }\n </div>\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBadge } from '../../../core/value-tone.util';\nimport { SparkbarComponent } from '../sparkbar/sparkbar.component';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nexport interface FxProjectCardChip {\n /** Caller-translated label. */\n label: string;\n tone?: Tone | null;\n}\n\nexport interface FxProjectCardMetric {\n /** Caller-formatted figure (\"128\", \"--\"). */\n value: string | number;\n /** Caller-translated caption under the figure. */\n label: string;\n}\n\nexport interface FxProjectCard {\n name: string;\n description?: string;\n /** 1–2 char initials rendered in an accent-soft square (design 12). */\n avatar?: string;\n /** Small line under the name (schedule / scope) with an optional hero-icon. */\n sub?: { icon?: string; label: string };\n /** Score chip top-right (\"High · 82\"); rendered as a toned pill. */\n score?: string | number;\n scoreTone?: Tone | null;\n /** Caption under the score chip (kept for pre-V2 callers). */\n scoreLabel?: string;\n /** Risk-trend sparkbar values (pre-V2 look; prefer `trend`). */\n spark?: number[];\n /**\n * Design-12 risk trend: one toned block per period, oldest first, with a\n * caption line underneath (\"risk trend\" · \"128 analyses\").\n */\n trend?: { tones: (Tone | null)[]; caption?: string; aside?: string };\n chips?: FxProjectCardChip[];\n /** Metric columns (Binaries · Findings · …): figure + caption. */\n metrics?: FxProjectCardMetric[];\n /** Footer meta line (e.g. \"Last analysis · 2d ago\"). */\n meta?: string;\n /** Footer link label right of the meta (\"Open ›\"); the whole card emits (open). */\n openLabel?: string;\n /** Free-form identifier handed back on (open). */\n data?: any;\n}\n\n/** Trend blocks are softened solids — whole literals (Tailwind v4 has no safelist). */\nconst TREND_BLOCK: Record<Tone, string> = {\n critical: 'tone-dot-chart-critical',\n danger: 'tone-dot-chart-danger',\n warning: 'tone-dot-chart-warning',\n success: 'tone-dot-chart-success',\n information: 'tone-dot-chart-information',\n};\n\n/**\n * V2 project card — the Project Management catalog tile (design 12): initials\n * avatar + name + schedule line, toned score chip, risk-trend blocks, metric\n * columns and a \"Last analysis · … / Open ›\" footer.\n *\n * <fx-ui-project-card [card]=\"project\" (open)=\"goTo(project)\" />\n */\n@Component({\n selector: 'fx-ui-project-card',\n templateUrl: './project-card.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, SparkbarComponent, HeroIconComponent],\n // Flex column host: in a grid every card stretches to the row height and the\n // footer sits on one baseline across the row (anh Tú 04/09).\n host: { class: 'flex flex-col min-w-0' },\n})\nexport class ProjectCardComponent {\n readonly card = input.required<FxProjectCard>();\n readonly open = output<FxProjectCard>();\n\n scoreChipClass(): string {\n return toneBadge(this.card().scoreTone ?? null);\n }\n\n chipClass(chip: FxProjectCardChip): string {\n return toneBadge(chip.tone ?? null);\n }\n\n blockClass(tone: Tone | null): string {\n return tone ? TREND_BLOCK[tone] : 'bg-bg-hover';\n }\n}\n","<button\n type=\"button\"\n class=\"card-common bg-surface w-full flex-1 flex flex-col gap-normal hover:border-accent hover:shadow-md transition-all\"\n (click)=\"open.emit(card())\"\n>\n <!-- Header: avatar + name/sub + score chip (design 12) -->\n <div class=\"flex items-start justify-between gap-normal w-full\">\n <div class=\"flex items-start gap-normal min-w-0\">\n @if (card().avatar) {\n <span\n class=\"w-9 h-9 rounded-control bg-accent-soft text-accent flex items-center justify-center shrink-0 txt-utility-caption font-bold uppercase\"\n style=\"font-family: var(--og-font-figure)\"\n >{{ card().avatar }}</span\n >\n }\n <!-- min-h 46px = name (24) + mt-xs (2) + sub (20): reserves the two-line\n header even when a card has no sub line, so trend/metric rows line\n up across the grid row (measured 04/09). -->\n <div class=\"min-w-0 min-h-[46px]\">\n <div class=\"txt-heading-06 truncate text-left\">{{ card().name }}</div>\n @if (card().sub; as sub) {\n <div class=\"flex items-center gap-xs txt-utility-description mt-xs\">\n @if (sub.icon) {\n <fx-ui-hero-icon [icon]=\"sub.icon\" [size]=\"13\" class=\"flex shrink-0\" />\n }\n <span class=\"truncate\">{{ sub.label }}</span>\n </div>\n } @else if (card().description) {\n <div class=\"txt-card-content truncate mt-xs text-left\">{{ card().description }}</div>\n }\n </div>\n </div>\n @if (card().score !== undefined) {\n <div class=\"text-right shrink-0\">\n <span\n class=\"txt-tag-label px-normal py-[2px] rounded-pill whitespace-nowrap\"\n [ngClass]=\"scoreChipClass()\"\n >{{ card().score }}</span\n >\n @if (card().scoreLabel) {\n <div class=\"txt-utility-description mt-xs\">{{ card().scoreLabel }}</div>\n }\n </div>\n }\n </div>\n\n @if (card().chips?.length) {\n <div class=\"flex flex-wrap gap-xs w-full\">\n @for (chip of card().chips; track chip.label) {\n <span class=\"txt-tag-label px-normal py-[1px] rounded-pill\" [ngClass]=\"chipClass(chip)\">\n {{ chip.label }}\n </span>\n }\n </div>\n }\n\n <!-- Design-12 risk trend: toned blocks + caption line -->\n @if (card().trend; as trend) {\n <div class=\"w-full\">\n <div class=\"flex gap-xs w-full\">\n @for (tone of trend.tones; track $index) {\n <span class=\"flex-1 h-4 rounded-[2px]\" [ngClass]=\"blockClass(tone)\"></span>\n }\n </div>\n @if (trend.caption || trend.aside) {\n <div class=\"flex items-center justify-between mt-xs txt-utility-description font-mono\">\n <span>{{ trend.caption }}</span>\n <span>{{ trend.aside }}</span>\n </div>\n }\n </div>\n }\n\n @if (card().spark?.length) {\n <fx-ui-sparkbar class=\"w-full\" [values]=\"card().spark!\" [height]=\"24\" />\n }\n\n <!-- Metric columns: figure + caption (design 12) -->\n @if (card().metrics?.length) {\n <div\n class=\"grid gap-normal w-full\"\n [style.grid-template-columns]=\"'repeat(' + card().metrics!.length + ', minmax(0, 1fr))'\"\n >\n @for (m of card().metrics; track m.label) {\n <div class=\"min-w-0 text-left\">\n <div class=\"txt-heading-06\" style=\"font-family: var(--og-font-figure)\">{{ m.value }}</div>\n <div class=\"txt-utility-description truncate\">{{ m.label }}</div>\n </div>\n }\n </div>\n }\n\n @if (card().meta || card().openLabel) {\n <!-- mt-auto: footers line up across a grid row whatever each card holds -->\n <div\n class=\"flex items-center justify-between w-full pt-normal mt-auto border-t border-border-default\"\n >\n <span class=\"txt-utility-description text-left\">{{ card().meta }}</span>\n @if (card().openLabel) {\n <span class=\"txt-utility-caption font-bold text-accent whitespace-nowrap\"\n >{{ card().openLabel }} ›</span\n >\n }\n </div>\n }\n</button>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nexport type FxPipelineStageState = 'pending' | 'active' | 'done' | 'error';\n\nexport interface FxPipelineStage {\n id: string;\n /** Caller-translated label. */\n label: string;\n state?: FxPipelineStageState;\n /** Small line under the label (e.g. \"optional\", a duration). */\n description?: string;\n}\n\n/**\n * V2 pipeline stepper — the New Analysis 7-stage pipeline header. Renders the\n * stage strip only; the page owns the stage bodies (project the current one\n * below). Stage states are data — the parent decides what is done/active.\n *\n * <fx-ui-pipeline-stepper [stages]=\"stages\" (stageClick)=\"goTo($event)\">\n * …current stage body…\n * </fx-ui-pipeline-stepper>\n */\n@Component({\n selector: 'fx-ui-pipeline-stepper',\n templateUrl: './pipeline-stepper.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, HeroIconComponent],\n})\nexport class PipelineStepperComponent {\n readonly stages = input<FxPipelineStage[]>([]);\n /** Only done stages are click-navigable (review a completed step). */\n readonly clickable = input(true);\n readonly stageClick = output<number>();\n\n stateOf(stage: FxPipelineStage): FxPipelineStageState {\n return stage.state ?? 'pending';\n }\n\n circleClass(stage: FxPipelineStage): string {\n switch (this.stateOf(stage)) {\n case 'done':\n return 'bg-accent text-accent-contrast border-accent';\n case 'active':\n return 'bg-accent-soft text-accent-soft-fg border-accent';\n case 'error':\n return 'tone-scale-danger tone-border-danger';\n default:\n return 'bg-surface text-faint border-border';\n }\n }\n\n labelClass(stage: FxPipelineStage): string {\n switch (this.stateOf(stage)) {\n case 'active':\n return 'text-strong font-semibold';\n case 'done':\n return 'text-body';\n case 'error':\n return 'tone-fg-danger';\n default:\n return 'text-faint';\n }\n }\n\n connectorClass(stage: FxPipelineStage): string {\n return this.stateOf(stage) === 'done' ? 'bg-accent' : 'bg-border';\n }\n\n canClick(stage: FxPipelineStage): boolean {\n return this.clickable() && this.stateOf(stage) === 'done';\n }\n\n onStageClick(stage: FxPipelineStage, index: number) {\n if (this.canClick(stage)) this.stageClick.emit(index);\n }\n}\n","<ol class=\"flex items-start overflow-x-auto pb-small\" role=\"list\">\n @for (stage of stages(); track stage.id; let i = $index; let last = $last) {\n <li class=\"flex items-start\" [class.flex-1]=\"!last\" [attr.aria-current]=\"stateOf(stage) === 'active' ? 'step' : null\">\n <button\n type=\"button\"\n class=\"flex flex-col items-center gap-xs min-w-20 px-xs\"\n [class.cursor-pointer]=\"canClick(stage)\"\n [class.cursor-default]=\"!canClick(stage)\"\n [tabindex]=\"canClick(stage) ? 0 : -1\"\n (click)=\"onStageClick(stage, i)\"\n >\n <span\n class=\"w-8 h-8 rounded-full border-2 flex items-center justify-center text-sm font-semibold transition-colors\"\n [ngClass]=\"circleClass(stage)\"\n >\n @switch (stateOf(stage)) {\n @case ('done') {\n <fx-ui-hero-icon icon=\"check\" [size]=\"16\" class=\"flex\" />\n }\n @case ('error') {\n <fx-ui-hero-icon icon=\"exclamation-triangle\" [size]=\"16\" class=\"flex\" />\n }\n @default {\n {{ i + 1 }}\n }\n }\n </span>\n <span class=\"text-xs text-center whitespace-nowrap\" [ngClass]=\"labelClass(stage)\">\n {{ stage.label }}\n </span>\n @if (stage.description) {\n <span class=\"txt-utility-description text-center whitespace-nowrap\">\n {{ stage.description }}\n </span>\n }\n </button>\n @if (!last) {\n <div class=\"flex-1 h-[2px] mt-4 mx-xs rounded-pill min-w-6\" [ngClass]=\"connectorClass(stage)\"></div>\n }\n </li>\n }\n</ol>\n<div class=\"mt-large\">\n <ng-content></ng-content>\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\n\n/** Facets-rail skeleton: N nhóm, mỗi nhóm một eyebrow + vài dòng lựa chọn. */\n@Component({\n selector: 'fx-ui-skeleton-facets',\n templateUrl: './skeleton-facets.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SkeletonFacetsComponent {\n readonly groups = input(3);\n readonly rows = input(4);\n\n // computed, không phải method — xem [[skeleton-ng0956-array-holes]].\n readonly groupList = computed(() => range(this.groups()));\n readonly rowList = computed(() => range(this.rows()));\n\n rowWidth(i: number): number {\n return [80, 65, 72, 58][i % 4];\n }\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"flex flex-col gap-xl\">\n @for (g of groupList(); track g) {\n <div class=\"flex flex-col gap-normal\">\n <div class=\"h-3 w-20 rounded skeleton-load\"></div>\n <div class=\"flex flex-col gap-small\">\n @for (r of rowList(); track r) {\n <div class=\"flex items-center gap-normal\">\n <div class=\"w-3.5 h-3.5 rounded skeleton-load shrink-0\"></div>\n <div class=\"h-3 rounded skeleton-load\" [style.width.%]=\"rowWidth(r)\"></div>\n </div>\n }\n </div>\n </div>\n }\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\n\n/** Dashboard skeleton: một hàng KPI + N panel có vùng chart. */\n@Component({\n selector: 'fx-ui-skeleton-dashboard',\n templateUrl: './skeleton-dashboard.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SkeletonDashboardComponent {\n readonly kpis = input(4);\n readonly panels = input(2);\n\n readonly kpiList = computed(() => range(this.kpis()));\n readonly panelList = computed(() => range(this.panels()));\n readonly barList = computed(() => range(7));\n\n /** Chiều cao cột giả — dựng hình chart mà không cần dữ liệu. */\n barHeight(i: number): number {\n return [45, 70, 35, 85, 55, 75, 40][i % 7];\n }\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"flex flex-col gap-xl\">\n <div class=\"grid gap-xl grid-cols-2 md:grid-cols-4\">\n @for (k of kpiList(); track k) {\n <div class=\"card-common flex flex-col gap-normal\">\n <div class=\"h-3 w-16 rounded skeleton-load\"></div>\n <div class=\"h-7 w-24 rounded skeleton-load\"></div>\n <div class=\"h-3 w-20 rounded skeleton-load\"></div>\n </div>\n }\n </div>\n\n <div class=\"grid gap-xl grid-cols-1 md:grid-cols-2\">\n @for (p of panelList(); track p) {\n <div class=\"card-common flex flex-col gap-large\">\n <div class=\"h-4 w-1/3 rounded skeleton-load\"></div>\n <div class=\"flex items-end gap-normal h-40\">\n @for (b of barList(); track b) {\n <div class=\"flex-1 rounded-t skeleton-load\" [style.height.%]=\"barHeight(b)\"></div>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\nimport { SkeletonListComponent } from '../skeleton-list/skeleton-list.component';\nimport { SkeletonDetailComponent } from '../skeleton-detail/skeleton-detail.component';\nimport { SkeletonFacetsComponent } from '../skeleton-facets/skeleton-facets.component';\n\n/**\n * Một KHỐI trong skeleton của màn. Ghép các khối này theo đúng thứ tự của màn\n * thật thì skeleton mới khớp layout — bảng ra bảng, chart ra chart.\n *\n * - `heading` H1 + subline + `count` nút hành động (mặc định 2, 0 = không có)\n * - `toolbar` search bar + `count` filter pill (mặc định 2)\n * - `table` bảng, skeleton theo TỪNG Ô (`columns` / `rows`)\n * - `cards` lưới card (catalog) — `count` / `cols`\n * - `stat-cards` hàng stat tile rời — `count`\n * - `kpi-strip` MỘT card chia cột, số to (kiểu `app-dash-kpi-row`) — `count`\n * - `panels` lưới section-card có vùng chart — `count` / `cols`\n * - `card` một section-card đơn\n * - `tabs` dải tab\n * - `facets` 3 cụm facets/list/detail\n * - `detail` cụm card detail\n * - `form` card form\n */\nexport type FxSkeletonBlockKind =\n | 'heading'\n | 'toolbar'\n | 'table'\n | 'cards'\n | 'stat-cards'\n | 'kpi-strip'\n | 'panels'\n | 'card'\n | 'tabs'\n | 'facets'\n | 'detail'\n | 'form';\n\nexport interface FxSkeletonBlockSpec {\n kind: FxSkeletonBlockKind;\n /**\n * Số phần tử con:\n * - `heading`: số nút hành động (0 = màn không có CTA)\n * - `toolbar`: số filter pill\n * - `panels` `cards` `stat-cards` `kpi-strip` `tabs`: số khối\n */\n count?: number;\n /** `panels` `cards`: số cột ở breakpoint lớn. */\n cols?: number;\n /** `table`: số cột và số hàng. */\n columns?: number;\n rows?: number;\n}\n\nexport type FxSkeletonBlock = FxSkeletonBlockKind | FxSkeletonBlockSpec;\n\n/**\n * Tên gọn cho các layout dùng lại được. Route nên khai thẳng mảng block khi\n * layout của nó khác preset — chính app biết layout của mình, không phải lib.\n */\nexport type FxSkeletonHint =\n | 'table'\n | 'panels'\n | 'dashboard'\n | 'tabs-facets'\n | 'facets'\n | 'detail'\n | 'form';\n\nconst PRESETS: Record<FxSkeletonHint, FxSkeletonBlock[]> = {\n table: ['heading', 'toolbar', 'table'],\n panels: [\n 'heading',\n 'stat-cards',\n { kind: 'panels', count: 3, cols: 3 },\n 'toolbar',\n { kind: 'cards', count: 6, cols: 3 },\n ],\n dashboard: [\n 'heading',\n 'kpi-strip',\n { kind: 'panels', count: 2 },\n { kind: 'panels', count: 2 },\n 'card',\n ],\n 'tabs-facets': ['tabs', 'facets'],\n facets: ['facets'],\n detail: ['detail'],\n form: ['heading', 'form'],\n};\n\n/**\n * Skeleton cho vùng NỘI DUNG trong lúc resolver của route đang chạy.\n *\n * ⚠️ Vì sao skeleton phải nằm ở shell chứ không ở từng màn: Angular **không\n * tạo component cho tới khi resolver xong**, nên một màn không thể tự vẽ\n * skeleton của chính nó trong lúc resolver của nó chạy. Thứ vẽ được phải tồn\n * tại TRƯỚC component đó → shell + router event. Xem `FxRouteSkeletonService`.\n */\n@Component({\n selector: 'fx-ui-route-skeleton',\n templateUrl: './route-skeleton.component.html',\n styleUrl: './route-skeleton.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SkeletonListComponent, SkeletonDetailComponent, SkeletonFacetsComponent],\n})\nexport class RouteSkeletonComponent {\n /** Tên preset, hoặc mảng block mô tả đúng layout của màn. */\n readonly hint = input<FxSkeletonHint | FxSkeletonBlock[] | null>('table');\n\n readonly blocks = computed<FxSkeletonBlockSpec[]>(() => {\n const value = this.hint();\n // Mảng rỗng / tên preset lạ / null đều rơi về preset bảng: mục tiêu của cả\n // cơ chế này là KHÔNG BAO GIỜ để vùng nội dung trắng, nên vẽ hình generic\n // vẫn hơn không vẽ gì.\n const list =\n Array.isArray(value) && value.length\n ? value\n : (PRESETS[value as FxSkeletonHint] ?? PRESETS.table);\n return list.map((b) => (typeof b === 'string' ? { kind: b } : b));\n });\n\n cols(b: FxSkeletonBlockSpec): number[] {\n return range(b.columns ?? 6);\n }\n\n rows(b: FxSkeletonBlockSpec): number[] {\n return range(b.rows ?? 8);\n }\n\n items(b: FxSkeletonBlockSpec, fallback: number): number[] {\n return range(b.count ?? fallback);\n }\n\n /** Lớp lưới cho `panels`/`cards` — Tailwind v4 không có safelist nên phải\n * là chuỗi tĩnh, không ghép động. */\n gridClass(b: FxSkeletonBlockSpec): string {\n switch (b.cols ?? 2) {\n case 1:\n return 'grid-cols-1';\n case 3:\n return 'grid-cols-1 md:grid-cols-3';\n case 4:\n return 'grid-cols-2 md:grid-cols-4';\n default:\n return 'grid-cols-1 md:grid-cols-2';\n }\n }\n\n /** Header ngắn hơn ô dữ liệu, cột đầu rộng nhất (thường là tên). */\n headWidth(c: number): number {\n return c === 0 ? 55 : [40, 34, 46, 30, 38][c % 5];\n }\n\n /**\n * Bề rộng đổi theo cả hàng và cột — cùng bề rộng thì khối skeleton trông\n * như một hình chữ nhật đặc, mất cảm giác \"từng field\".\n */\n cellWidth(r: number, c: number): number {\n if (c === 0) return [92, 78, 85, 70][r % 4];\n return [62, 48, 74, 55, 66, 42][(r + c) % 6];\n }\n\n barHeight(i: number): number {\n return [45, 70, 35, 85, 55, 75, 40][i % 7];\n }\n\n readonly bars = range(7);\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"w-full flex flex-col gap-xl\">\n @for (b of blocks(); track $index) {\n @switch (b.kind) {\n @case ('heading') {\n <div data-fx-skel=\"heading\" class=\"flex flex-col md:flex-row md:items-start justify-between gap-normal\">\n <div class=\"flex flex-col gap-small\">\n <div class=\"skeleton-load h-7 w-64\"></div>\n <div class=\"skeleton-load h-3 w-32\"></div>\n </div>\n @if (items(b, 2).length) {\n <div class=\"flex items-center gap-normal\">\n @for (a of items(b, 2); track a) {\n <div class=\"skeleton-load h-9 rounded-lg\" [class]=\"a === 0 ? 'w-28' : 'w-32'\"></div>\n }\n </div>\n }\n </div>\n }\n\n @case ('toolbar') {\n <div data-fx-skel=\"toolbar\" class=\"flex flex-wrap items-center gap-normal\">\n <div class=\"skeleton-load h-9 w-72 rounded-lg\"></div>\n @for (f of items(b, 2); track f) {\n <div class=\"skeleton-load h-7 rounded-full\" [class]=\"f % 2 ? 'w-24' : 'w-20'\"></div>\n }\n </div>\n }\n\n @case ('table') {\n <!-- Bảng: mỗi Ô là một `.skeleton-load` riêng, đúng cách\n `fx-ui-table-cell [loading]` làm trên bảng thật. -->\n <div data-fx-skel=\"table\" class=\"card-common overflow-x-auto\">\n <table class=\"w-full\">\n <thead>\n <tr class=\"border-b border-border-default\">\n @for (c of cols(b); track c) {\n <th class=\"px-normal py-semi text-left\">\n <div class=\"skeleton-load h-3\" [style.width.%]=\"headWidth(c)\"></div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (r of rows(b); track r) {\n <tr class=\"border-b border-border-subtle\">\n @for (c of cols(b); track c) {\n <td class=\"px-normal py-semi align-middle\">\n <div class=\"skeleton-load h-4\" [style.width.%]=\"cellWidth(r, c)\"></div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @case ('stat-cards') {\n <div data-fx-skel=\"stat-cards\" class=\"grid gap-normal grid-cols-2 md:grid-cols-4\">\n @for (i of items(b, 4); track i) {\n <div class=\"card-common flex flex-col gap-normal\">\n <div class=\"skeleton-load h-3 w-16\"></div>\n <div class=\"skeleton-load h-8 w-24\"></div>\n <div class=\"skeleton-load h-3 w-20\"></div>\n </div>\n }\n </div>\n }\n\n @case ('kpi-strip') {\n <!-- MỘT card chia cột (kiểu app-dash-kpi-row), không phải các tile rời -->\n <div data-fx-skel=\"kpi-strip\" class=\"card-common !p-0\">\n <div class=\"grid grid-cols-2 md:grid-cols-4\">\n @for (i of items(b, 4); track i) {\n <div\n class=\"flex flex-col gap-normal px-xl py-large border-border-subtle\"\n [class.border-l]=\"!$first\"\n >\n <div class=\"skeleton-load h-3 w-20\"></div>\n <div class=\"skeleton-load h-9 w-28\"></div>\n <div class=\"skeleton-load h-3 w-24\"></div>\n </div>\n }\n </div>\n </div>\n }\n\n @case ('panels') {\n <div data-fx-skel=\"panels\" class=\"grid gap-xl\" [class]=\"gridClass(b)\">\n @for (i of items(b, 2); track i) {\n <div class=\"card-common flex flex-col gap-large\">\n <div class=\"skeleton-load h-4 w-1/3\"></div>\n <div class=\"flex items-end gap-normal h-40\">\n @for (x of bars; track x) {\n <div class=\"skeleton-load flex-1 rounded-t\" [style.height.%]=\"barHeight(x)\"></div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @case ('cards') {\n <div data-fx-skel=\"cards\" class=\"grid gap-xl\" [class]=\"gridClass(b)\">\n @for (i of items(b, 6); track i) {\n <div class=\"card-common flex flex-col gap-normal\">\n <div class=\"flex items-center gap-normal\">\n <div class=\"skeleton-load w-9 h-9 rounded-lg shrink-0\"></div>\n <div class=\"flex flex-col gap-small flex-1 min-w-0\">\n <div class=\"skeleton-load h-4 w-3/4\"></div>\n <div class=\"skeleton-load h-3 w-1/2\"></div>\n </div>\n <div class=\"skeleton-load h-5 w-14 rounded-full shrink-0\"></div>\n </div>\n <div class=\"grid grid-cols-4 gap-normal pt-normal border-t border-border-subtle\">\n @for (m of [0, 1, 2, 3]; track m) {\n <div class=\"flex flex-col gap-small\">\n <div class=\"skeleton-load h-2.5 w-full\"></div>\n <div class=\"skeleton-load h-4 w-2/3\"></div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @case ('card') {\n <div data-fx-skel=\"card\" class=\"card-common flex flex-col gap-large\">\n <div class=\"skeleton-load h-4 w-1/3\"></div>\n <div class=\"flex flex-col gap-normal\">\n @for (r of [0, 1, 2, 3]; track r) {\n <div class=\"skeleton-load h-3\" [style.width.%]=\"cellWidth(r, 1)\"></div>\n }\n </div>\n </div>\n }\n\n @case ('tabs') {\n <div data-fx-skel=\"tabs\" class=\"flex items-center gap-large border-b border-border-default pb-normal\">\n @for (t of items(b, 6); track t) {\n <div class=\"flex items-center gap-small\">\n <div class=\"skeleton-load w-4 h-4\"></div>\n <div class=\"skeleton-load h-3 w-16\"></div>\n </div>\n }\n </div>\n }\n\n @case ('facets') {\n <div data-fx-skel=\"facets\" class=\"fx-rs-row\">\n <div class=\"fx-rs-facets card-common overflow-hidden\">\n <fx-ui-skeleton-facets />\n </div>\n <div class=\"fx-rs-list card-common overflow-hidden\">\n <fx-ui-skeleton-list [rows]=\"6\" />\n </div>\n <div class=\"flex-1 min-w-0 overflow-hidden\">\n <fx-ui-skeleton-detail />\n </div>\n </div>\n }\n\n @case ('detail') {\n <fx-ui-skeleton-detail data-fx-skel=\"detail\" />\n }\n\n @case ('form') {\n <div data-fx-skel=\"form\" class=\"card-common flex flex-col gap-large\">\n @for (r of [0, 1, 2, 3]; track r) {\n <div class=\"flex flex-col gap-small\">\n <div class=\"skeleton-load h-3 w-24\"></div>\n <div class=\"skeleton-load h-9 w-full rounded-lg\"></div>\n </div>\n }\n <div class=\"flex justify-end gap-normal\">\n <div class=\"skeleton-load h-9 w-24 rounded-lg\"></div>\n <div class=\"skeleton-load h-9 w-28 rounded-lg\"></div>\n </div>\n </div>\n }\n }\n }\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\nimport {\n FxSkeletonBlock,\n FxSkeletonHint,\n RouteSkeletonComponent,\n} from '../route-skeleton/route-skeleton.component';\n\n/**\n * Skeleton của cả AppFrame (drawer + topbar + vùng nội dung).\n *\n * Chỉ dùng cho giai đoạn **bootstrap**, khi shell của host còn CHƯA tồn tại\n * (App.ngOnInit đang kiểm tenant + session, router chưa initialNavigation).\n * Mọi điều hướng SAU đó đã có shell thật → dùng `fx-ui-route-skeleton` bên\n * trong vùng nội dung, đừng vẽ lại cả frame.\n *\n * ⚠️ `contentHint` là thứ làm F5 không còn vẽ hình generic. Lần điều hướng ĐẦU\n * tạo ra chính `HomeComponent` — nơi chứa `fx-ui-route-skeleton` — nên vùng nội\n * dung không thể tự vẽ skeleton của route ở lần đó. Truyền hint vào đây để\n * frame dựng đúng composition của màn đích ngay từ F5.\n */\n@Component({\n selector: 'fx-ui-skeleton-frame',\n templateUrl: './skeleton-frame.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouteSkeletonComponent],\n})\nexport class SkeletonFrameComponent {\n readonly navItems = input(7);\n\n /** Composition của route đích; null thì vẽ khối generic. */\n readonly contentHint = input<FxSkeletonHint | FxSkeletonBlock[] | null>(null);\n\n readonly navList = computed(() => range(this.navItems()));\n\n navWidth(i: number): number {\n return [70, 55, 62, 48, 66, 52, 58][i % 7];\n }\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"flex h-screen w-full overflow-hidden bg-bg-primary\">\n <!-- drawer -->\n <div\n class=\"hidden md:flex w-[260px] shrink-0 flex-col gap-xl border-r border-border-subtle p-semi\"\n >\n <div class=\"flex items-center gap-normal\">\n <div class=\"w-6 h-6 rounded skeleton-load shrink-0\"></div>\n <div class=\"flex flex-col gap-small flex-1 min-w-0\">\n <div class=\"h-3.5 w-20 rounded skeleton-load\"></div>\n <div class=\"h-2.5 w-full rounded skeleton-load\"></div>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-small\">\n @for (n of navList(); track n) {\n <div class=\"flex items-center gap-normal py-1\">\n <div class=\"w-4 h-4 rounded skeleton-load shrink-0\"></div>\n <div class=\"h-3 rounded skeleton-load\" [style.width.%]=\"navWidth(n)\"></div>\n </div>\n }\n </div>\n\n <div class=\"mt-auto flex items-center gap-normal border-t border-border-subtle pt-semi\">\n <div class=\"w-8 h-8 rounded-full skeleton-load shrink-0\"></div>\n <div class=\"flex flex-col gap-small flex-1 min-w-0\">\n <div class=\"h-3 w-24 rounded skeleton-load\"></div>\n <div class=\"h-2.5 w-32 rounded skeleton-load\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-1 min-w-0 flex-col\">\n <!-- topbar -->\n <div\n class=\"flex h-14 shrink-0 items-center gap-normal border-b border-border-subtle px-semi\"\n >\n <div class=\"h-3.5 w-40 rounded skeleton-load\"></div>\n <div class=\"ml-auto h-8 w-32 rounded-lg skeleton-load\"></div>\n </div>\n\n <!-- content: dựng đúng composition của route đích nếu đã biết -->\n <div class=\"flex-1 min-h-0 overflow-hidden p-semi\">\n @if (contentHint(); as hint) {\n <fx-ui-route-skeleton [hint]=\"hint\" />\n } @else {\n <div class=\"flex flex-col gap-xl\">\n <div class=\"h-6 w-1/4 rounded skeleton-load\"></div>\n <div class=\"grid gap-xl grid-cols-2 md:grid-cols-4\">\n <div class=\"h-24 rounded-lg skeleton-load\"></div>\n <div class=\"h-24 rounded-lg skeleton-load\"></div>\n <div class=\"h-24 rounded-lg skeleton-load\"></div>\n <div class=\"h-24 rounded-lg skeleton-load\"></div>\n </div>\n <div class=\"h-64 rounded-lg skeleton-load\"></div>\n </div>\n }\n </div>\n </div>\n</div>\n","import { ButtonComponent } from './button/button.component';\nimport { CheckboxComponent } from './checkbox/checkbox.component';\nimport { CircleProgressBar } from './circle-progress-bar/circle-progress-bar.component';\nimport { DatetimePicker } from './datetime-picker/datetime-picker.component';\nimport { DndUploadComponent } from './dnd-upload/dnd-upload.component';\nimport { HeroIconComponent } from './hero-icon/hero-icon.component';\nimport { InputComponent } from './input/input.component';\nimport { LoadingPanel } from './loading-panel/loading-panel.component';\nimport { RadioButtonToggleComponent } from './radio-button-toggle/radio-button-toggle.component';\nimport { RadioButtonComponent } from './radio-button/radio-button.component';\nimport { SearchBarComponent } from './search-bar/search-bar.component';\nimport { SelectComponent } from './select/select.component';\nimport { SliderComponent } from './slider/slider.component';\nimport { SwitchComponent } from './switch/switch.component';\nimport { TabComponent } from './tab-component/tab.component';\nimport { TabGroupComponent } from './tab-group/tab-group.component';\nimport { TableCell } from './table-cell/table-cell.component';\nimport { TagComponent } from './tag/tag.component';\nimport { ToastContainerComponent } from './toast-container/toast-container.component';\nimport { ToastComponent } from './toast/toast.component';\nimport { TreeDiagram } from './tree-diagram/tree-diagram.component';\nimport { KanbanBoardComponent } from './kanban-board/kanban-board.component';\nimport { DrawerComponent } from './drawer/drawer.component';\nimport { SkeletonListComponent } from './skeleton-list/skeleton-list.component';\nimport { SkeletonDetailComponent } from './skeleton-detail/skeleton-detail.component';\nimport { StatCardsComponent } from './stat-cards/stat-cards.component';\nimport { EmptyStateComponent } from './empty-state/empty-state.component';\nimport { FilterChipsComponent } from './filter-chips/filter-chips.component';\nimport { FilterPillsComponent } from './filter-pills/filter-pills.component';\nimport { StageDotsComponent } from './stage-dots/stage-dots.component';\nimport { CodeBlockComponent } from './code-block/code-block.component';\nimport { ScreenshotFrameComponent } from './screenshot-frame/screenshot-frame.component';\nimport { MeterComponent } from './meter/meter.component';\nimport { SectionCardComponent } from './section-card/section-card.component';\nimport { InfoFieldComponent } from './info-field/info-field.component';\nimport { SeverityBadgesComponent } from './severity-badges/severity-badges.component';\nimport { MasterDetailComponent } from './master-detail/master-detail.component';\nimport { MenuComponent } from './menu/menu.component';\nimport { ThemePickerComponent } from './theme-picker/theme-picker.component';\nimport { PendingBadgeComponent } from './pending-badge/pending-badge.component';\nimport { SampleFrameComponent } from './sample-frame/sample-frame.component';\nimport { ScoreBadgeComponent } from './score-badge/score-badge.component';\nimport { StatusDotComponent } from './status-dot/status-dot.component';\nimport { SparkbarComponent } from './sparkbar/sparkbar.component';\nimport { SegmentedComponent } from './segmented/segmented.component';\nimport { ListRowComponent } from './list-row/list-row.component';\nimport { BarListComponent } from './bar-list/bar-list.component';\nimport { FacetsRailComponent } from './facets-rail/facets-rail.component';\nimport { ProjectCardComponent } from './project-card/project-card.component';\nimport { PipelineStepperComponent } from './pipeline-stepper/pipeline-stepper.component';\nimport { SkeletonFacetsComponent } from './skeleton-facets/skeleton-facets.component';\nimport { SkeletonDashboardComponent } from './skeleton-dashboard/skeleton-dashboard.component';\nimport { SkeletonFrameComponent } from './skeleton-frame/skeleton-frame.component';\nimport { RouteSkeletonComponent } from './route-skeleton/route-skeleton.component';\n\nexport { ButtonComponent } from './button/button.component';\nexport { CheckboxComponent } from './checkbox/checkbox.component';\nexport { CircleProgressBar } from './circle-progress-bar/circle-progress-bar.component';\nexport { TreeDiagram } from './tree-diagram/tree-diagram.component';\nexport { DatetimePicker } from './datetime-picker/datetime-picker.component';\nexport { DndUploadComponent } from './dnd-upload/dnd-upload.component';\nexport { HeroIconComponent } from './hero-icon/hero-icon.component';\nexport { InputComponent } from './input/input.component';\nexport { LoadingPanel } from './loading-panel/loading-panel.component';\nexport { RadioButtonToggleComponent } from './radio-button-toggle/radio-button-toggle.component';\nexport { RadioButtonComponent } from './radio-button/radio-button.component';\nexport { SearchBarComponent } from './search-bar/search-bar.component';\nexport { SelectComponent } from './select/select.component';\nexport { SliderComponent } from './slider/slider.component';\nexport { SwitchComponent } from './switch/switch.component';\nexport { TabComponent } from './tab-component/tab.component';\nexport { TabGroupComponent } from './tab-group/tab-group.component';\nexport { TagComponent } from './tag/tag.component';\nexport { ToastContainerComponent } from './toast-container/toast-container.component';\nexport { ToastComponent } from './toast/toast.component';\nexport { TableCell } from './table-cell/table-cell.component';\nexport { KanbanBoardComponent } from './kanban-board/kanban-board.component';\nexport { DrawerComponent } from './drawer/drawer.component';\nexport type { DrawerItem } from './drawer/drawer.types';\nexport { SkeletonListComponent } from './skeleton-list/skeleton-list.component';\nexport { SkeletonDetailComponent } from './skeleton-detail/skeleton-detail.component';\nexport { StatCardsComponent } from './stat-cards/stat-cards.component';\nexport type { FxStatCard } from './stat-cards/stat-cards.component';\nexport { EmptyStateComponent } from './empty-state/empty-state.component';\nexport { FilterChipsComponent } from './filter-chips/filter-chips.component';\nexport { FilterPillsComponent } from './filter-pills/filter-pills.component';\nexport { StageDotsComponent } from './stage-dots/stage-dots.component';\nexport { CodeBlockComponent } from './code-block/code-block.component';\nexport { ScreenshotFrameComponent } from './screenshot-frame/screenshot-frame.component';\nexport type { FxFilterChipOption } from './filter-chips/filter-chips.component';\nexport { MeterComponent } from './meter/meter.component';\nexport { SectionCardComponent } from './section-card/section-card.component';\nexport { InfoFieldComponent } from './info-field/info-field.component';\nexport { SeverityBadgesComponent } from './severity-badges/severity-badges.component';\nexport type { FxSeverityBadge } from './severity-badges/severity-badges.component';\nexport { MasterDetailComponent } from './master-detail/master-detail.component';\nexport { MenuComponent } from './menu/menu.component';\nexport type { FxMenuItem } from './menu/menu.component';\nexport { ThemePickerComponent } from './theme-picker/theme-picker.component';\nexport * from './score-badge/score-badge.component';\nexport * from './status-dot/status-dot.component';\nexport * from './sparkbar/sparkbar.component';\nexport * from './segmented/segmented.component';\nexport * from './list-row/list-row.component';\nexport * from './bar-list/bar-list.component';\nexport * from './facets-rail/facets-rail.component';\nexport * from './project-card/project-card.component';\nexport * from './pipeline-stepper/pipeline-stepper.component';\nexport * from './skeleton-facets/skeleton-facets.component';\nexport * from './skeleton-dashboard/skeleton-dashboard.component';\nexport * from './skeleton-frame/skeleton-frame.component';\nexport * from './route-skeleton/route-skeleton.component';\n\nexport const FX_COMPONENTS = [\n InputComponent,\n SelectComponent,\n RadioButtonComponent,\n CheckboxComponent,\n DndUploadComponent,\n ButtonComponent,\n RadioButtonToggleComponent,\n DatetimePicker,\n LoadingPanel,\n SearchBarComponent,\n TabGroupComponent,\n TabComponent,\n HeroIconComponent,\n ToastComponent,\n ToastContainerComponent,\n TagComponent,\n SliderComponent,\n SwitchComponent,\n CircleProgressBar,\n TreeDiagram,\n TableCell,\n KanbanBoardComponent,\n DrawerComponent,\n SkeletonListComponent,\n SkeletonDetailComponent,\n StatCardsComponent,\n EmptyStateComponent,\n FilterChipsComponent,\n FilterPillsComponent,\n StageDotsComponent,\n CodeBlockComponent,\n ScreenshotFrameComponent,\n MeterComponent,\n SectionCardComponent,\n InfoFieldComponent,\n SeverityBadgesComponent,\n MasterDetailComponent,\n MenuComponent,\n ThemePickerComponent,\n PendingBadgeComponent,\n SampleFrameComponent,\n ScoreBadgeComponent,\n StatusDotComponent,\n SparkbarComponent,\n SegmentedComponent,\n ListRowComponent,\n BarListComponent,\n FacetsRailComponent,\n ProjectCardComponent,\n PipelineStepperComponent,\n SkeletonFacetsComponent,\n SkeletonDashboardComponent,\n SkeletonFrameComponent,\n RouteSkeletonComponent,\n];\n","import { ConfirmationDialogComponent } from \"./confirmation/confirmation.component\";\n\nexport { ConfirmationDialogComponent } from \"./confirmation/confirmation.component\";\n\nexport const DIALOGS_COMPONENT = [\n ConfirmationDialogComponent\n]","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { FX_COMPONENTS } from './components';\nimport { DIALOGS_COMPONENT } from './dialogs';\nimport { HasPermissionDirective } from '../core/directives/has-permission.directive';\nimport { TrimOnBlurDirective } from '../core/directives/trim.directive';\n\n/**\n * Compatibility barrel over the (now standalone) core components.\n *\n * Deliberately NOT re-exported anymore: Angular Material —\n * Material is a behavior layer that stays an\n * implementation detail of this lib (Playbook §5.1); each standalone\n * component imports what it needs itself. Apps consume fx-ui-* only.\n *\n * Heavy components live in secondary entry points and are not part of this\n * barrel: @foxeltech/angular-ui/chart, /flow, /rich-text.\n */\n@NgModule({\n imports: [\n FormsModule,\n ReactiveFormsModule,\n RouterModule,\n HasPermissionDirective,\n TrimOnBlurDirective,\n ...FX_COMPONENTS,\n ...DIALOGS_COMPONENT,\n ],\n exports: [\n ...FX_COMPONENTS,\n ...DIALOGS_COMPONENT,\n FormsModule,\n ReactiveFormsModule,\n RouterModule,\n HasPermissionDirective,\n TrimOnBlurDirective,\n ],\n})\nexport class UiModule { }\n","/*\n * Public API Surface of ui\n */\n\nexport * from './lib/core/components/base.component';\nexport * from './lib/core/components/base-table.component';\nexport * from './lib/core/components/base-master-detail.component';\nexport * from './lib/core/components/base-dialog.component';\nexport * from './lib/core/services/http-wrapper.service';\nexport * from './lib/core/services/toastr.service';\nexport * from './lib/core/services/loading.service';\nexport * from './lib/core/services/route-skeleton.service';\nexport * from './lib/core/resolvers/fx-list.resolver';\nexport * from './lib/core/services/api-factory';\nexport * from './lib/core/services/realtime-table-sync';\nexport * from './lib/core/utils';\nexport * from './lib/core/value-tone.util';\nexport * from './lib/core/feature-flags';\nexport * from './lib/core/validators';\nexport * from './lib/translation/translation.module';\nexport * from './lib/translation/translation.service';\nexport * from './lib/core/directives/has-permission.directive';\nexport * from './lib/core/directives/trim.directive';\nexport * from './lib/core/guards/permissions.guard';\nexport * from './lib/core/services/permissions.service';\nexport * from './lib/core/services/storage.service';\nexport * from './lib/core/interceptors/auth.interceptor';\nexport * from './lib/core/services/auth-state.service';\nexport * from './lib/core/services/breadcrumb.service';\nexport * from './lib/core/services/theme.service';\nexport * from './lib/core/services/notification.service';\nexport * from './lib/core/services/dialog.service';\n\nexport * from './lib/ui/components/fx-component.component'\nexport * from './lib/ui/ui.module';\nexport * from './lib/ui/components/button/button.component';\nexport * from './lib/ui/components/checkbox/checkbox.component';\nexport * from './lib/ui/components/datetime-picker/datetime-picker.component';\nexport * from './lib/ui/components/dnd-upload/dnd-upload.component';\nexport * from './lib/ui/components/input/input.component';\nexport * from './lib/ui/components/radio-button/radio-button.component';\nexport * from './lib/ui/components/radio-button-toggle/radio-button-toggle.component';\nexport * from './lib/ui/components/select/select.component';\nexport * from './lib/ui/components/loading-panel/loading-panel.component';\nexport * from './lib/ui/components/tab-group/tab-group.component';\nexport * from './lib/ui/components/tab-component/tab.component';\nexport * from './lib/ui/components/search-bar/search-bar.component';\nexport * from './lib/ui/components/hero-icon/hero-icon.component';\nexport * from './lib/ui/components/toast/toast.component';\nexport * from './lib/ui/components/toast-container/toast-container.component';\nexport * from './lib/ui/components/tag/tag.component';\nexport * from './lib/ui/components/slider/slider.component';\nexport * from './lib/ui/dialogs/confirmation/confirmation.component';\nexport * from './lib/ui/components/switch/switch.component';\nexport * from './lib/ui/components/circle-progress-bar/circle-progress-bar.component';\nexport * from './lib/ui/components/tree-diagram/tree-diagram.component';\nexport * from './lib/ui/components/table-cell/table-cell.component';\nexport * from './lib/ui/components/kanban-board/kanban-board.component';\nexport * from './lib/ui/components/kanban-board/kanban-board.types';\nexport * from './lib/ui/components/drawer/drawer.component';\nexport * from './lib/ui/components/drawer/drawer.types';\nexport * from './lib/ui/components/skeleton-list/skeleton-list.component';\nexport * from './lib/ui/components/skeleton-detail/skeleton-detail.component';\nexport * from './lib/ui/components/skeleton-facets/skeleton-facets.component';\nexport * from './lib/ui/components/skeleton-dashboard/skeleton-dashboard.component';\nexport * from './lib/ui/components/skeleton-frame/skeleton-frame.component';\nexport * from './lib/ui/components/route-skeleton/route-skeleton.component';\nexport * from './lib/ui/components/stat-cards/stat-cards.component';\nexport * from './lib/ui/components/empty-state/empty-state.component';\nexport * from './lib/ui/components/filter-chips/filter-chips.component';\nexport * from './lib/ui/components/filter-pills/filter-pills.component';\nexport * from './lib/ui/components/stage-dots/stage-dots.component';\nexport * from './lib/ui/components/code-block/code-block.component';\nexport * from './lib/ui/components/screenshot-frame/screenshot-frame.component';\nexport * from './lib/ui/components/meter/meter.component';\nexport * from './lib/ui/components/section-card/section-card.component';\nexport * from './lib/ui/components/info-field/info-field.component';\nexport * from './lib/ui/components/severity-badges/severity-badges.component';\nexport * from './lib/ui/components/master-detail/master-detail.component';\nexport * from './lib/ui/components/menu/menu.component';\nexport * from './lib/ui/components/theme-picker/theme-picker.component';\nexport * from './lib/ui/components/pending-badge/pending-badge.component';\nexport * from './lib/ui/components/sample-frame/sample-frame.component';\nexport * from './lib/ui/components/score-badge/score-badge.component';\nexport * from './lib/ui/components/status-dot/status-dot.component';\nexport * from './lib/ui/components/sparkbar/sparkbar.component';\nexport * from './lib/ui/components/segmented/segmented.component';\nexport * from './lib/ui/components/list-row/list-row.component';\nexport * from './lib/ui/components/bar-list/bar-list.component';\nexport * from './lib/ui/components/facets-rail/facets-rail.component';\nexport * from './lib/ui/components/project-card/project-card.component';\nexport * from './lib/ui/components/pipeline-stepper/pipeline-stepper.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.HttpWrapper","i2","i2.FxToastrService","i3.HttpWrapper","i1","i1.PermissionService","i1.AuthStateService","range"],"mappings":"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"}
1
+ {"version":3,"file":"foxeltech-angular-ui.mjs","sources":["../../../projects/ui/src/lib/core/components/base.component.ts","../../../projects/ui/src/lib/core/services/load-status.service.ts","../../../projects/ui/src/lib/ui/components/hero-icon/hero-icon.component.ts","../../../projects/ui/src/lib/ui/components/hero-icon/hero-icon.component.html","../../../projects/ui/src/lib/ui/components/toast/toast.component.ts","../../../projects/ui/src/lib/ui/components/toast/toast.component.html","../../../projects/ui/src/lib/ui/components/toast-container/toast-container.component.ts","../../../projects/ui/src/lib/ui/components/toast-container/toast-container.component.html","../../../projects/ui/src/lib/core/services/toastr.service.ts","../../../projects/ui/src/lib/core/utils.ts","../../../projects/ui/src/lib/core/services/http-wrapper.service.ts","../../../projects/ui/src/lib/core/components/base-table.component.ts","../../../projects/ui/src/lib/core/components/base-master-detail.component.ts","../../../projects/ui/src/lib/core/components/base-dialog.component.ts","../../../projects/ui/src/lib/core/services/loading.service.ts","../../../projects/ui/src/lib/core/services/route-skeleton.service.ts","../../../projects/ui/src/lib/core/services/storage.service.ts","../../../projects/ui/src/lib/core/resolvers/fx-list.resolver.ts","../../../projects/ui/src/lib/core/services/api-factory.ts","../../../projects/ui/src/lib/core/services/realtime-table-sync.ts","../../../projects/ui/src/lib/core/value-tone.util.ts","../../../projects/ui/src/lib/core/feature-flags.ts","../../../projects/ui/src/lib/core/validators.ts","../../../projects/ui/src/lib/translation/translation.module.ts","../../../projects/ui/src/lib/translation/translation.service.ts","../../../projects/ui/src/lib/core/services/permissions.service.ts","../../../projects/ui/src/lib/core/directives/has-permission.directive.ts","../../../projects/ui/src/lib/core/directives/trim.directive.ts","../../../projects/ui/src/lib/core/guards/permissions.guard.ts","../../../projects/ui/src/lib/core/services/auth-state.service.ts","../../../projects/ui/src/lib/core/interceptors/auth.interceptor.ts","../../../projects/ui/src/lib/core/services/breadcrumb.service.ts","../../../projects/ui/src/lib/core/services/theme.service.ts","../../../projects/ui/src/lib/core/services/notification.service.ts","../../../projects/ui/src/lib/ui/components/button/button.component.ts","../../../projects/ui/src/lib/ui/components/button/button.component.html","../../../projects/ui/src/lib/ui/dialogs/confirmation/confirmation.component.ts","../../../projects/ui/src/lib/ui/dialogs/confirmation/confirmation.component.html","../../../projects/ui/src/lib/core/services/dialog.service.ts","../../../projects/ui/src/lib/ui/components/fx-component.component.ts","../../../projects/ui/src/lib/ui/components/checkbox/checkbox.component.ts","../../../projects/ui/src/lib/ui/components/checkbox/checkbox.component.html","../../../projects/ui/src/lib/ui/components/circle-progress-bar/circle-progress-bar.component.ts","../../../projects/ui/src/lib/ui/components/circle-progress-bar/circle-progress-bar.component.html","../../../projects/ui/src/lib/ui/components/datetime-picker/datetime-picker.component.ts","../../../projects/ui/src/lib/ui/components/datetime-picker/datetime-picker.component.html","../../../projects/ui/src/lib/ui/components/dnd-upload/dnd-upload.component.ts","../../../projects/ui/src/lib/ui/components/dnd-upload/dnd-upload.component.html","../../../projects/ui/src/lib/ui/components/input/input.component.ts","../../../projects/ui/src/lib/ui/components/input/input.component.html","../../../projects/ui/src/lib/ui/components/loading-panel/loading-panel.component.ts","../../../projects/ui/src/lib/ui/components/loading-panel/loading-panel.component.html","../../../projects/ui/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.ts","../../../projects/ui/src/lib/ui/components/radio-button-toggle/radio-button-toggle.component.html","../../../projects/ui/src/lib/ui/components/radio-button/radio-button.component.ts","../../../projects/ui/src/lib/ui/components/radio-button/radio-button.component.html","../../../projects/ui/src/lib/ui/components/search-bar/search-bar.component.ts","../../../projects/ui/src/lib/ui/components/search-bar/search-bar.component.html","../../../projects/ui/src/lib/ui/components/select/select.component.ts","../../../projects/ui/src/lib/ui/components/select/select.component.html","../../../projects/ui/src/lib/ui/components/slider/slider.component.ts","../../../projects/ui/src/lib/ui/components/slider/slider.component.html","../../../projects/ui/src/lib/ui/components/switch/switch.component.ts","../../../projects/ui/src/lib/ui/components/switch/switch.component.html","../../../projects/ui/src/lib/ui/components/tab-component/tab.component.ts","../../../projects/ui/src/lib/ui/components/tab-group/tab-group.component.ts","../../../projects/ui/src/lib/ui/components/tab-group/tab-group.component.html","../../../projects/ui/src/lib/ui/components/table-cell/table-cell.component.ts","../../../projects/ui/src/lib/ui/components/table-cell/table-cell.component.html","../../../projects/ui/src/lib/ui/components/tag/tag.component.ts","../../../projects/ui/src/lib/ui/components/tag/tag.component.html","../../../projects/ui/src/lib/ui/components/tree-diagram/tree-diagram.component.ts","../../../projects/ui/src/lib/ui/components/tree-diagram/tree-diagram.component.html","../../../projects/ui/src/lib/ui/components/kanban-board/kanban-board.component.ts","../../../projects/ui/src/lib/ui/components/kanban-board/kanban-board.component.html","../../../projects/ui/src/lib/ui/components/drawer/drawer.component.ts","../../../projects/ui/src/lib/ui/components/drawer/drawer.component.html","../../../projects/ui/src/lib/ui/components/skeleton-list/skeleton-list.component.ts","../../../projects/ui/src/lib/ui/components/skeleton-list/skeleton-list.component.html","../../../projects/ui/src/lib/ui/components/skeleton-detail/skeleton-detail.component.ts","../../../projects/ui/src/lib/ui/components/skeleton-detail/skeleton-detail.component.html","../../../projects/ui/src/lib/ui/components/sparkbar/sparkbar.component.ts","../../../projects/ui/src/lib/ui/components/sparkbar/sparkbar.component.html","../../../projects/ui/src/lib/ui/motion/motion.util.ts","../../../projects/ui/src/lib/ui/motion/count-up.directive.ts","../../../projects/ui/src/lib/ui/components/stat-cards/stat-cards.component.ts","../../../projects/ui/src/lib/ui/components/stat-cards/stat-cards.component.html","../../../projects/ui/src/lib/ui/components/empty-state/empty-state.component.ts","../../../projects/ui/src/lib/ui/components/empty-state/empty-state.component.html","../../../projects/ui/src/lib/ui/components/filter-chips/filter-chips.component.ts","../../../projects/ui/src/lib/ui/components/filter-chips/filter-chips.component.html","../../../projects/ui/src/lib/ui/components/filter-pills/filter-pills.component.ts","../../../projects/ui/src/lib/ui/components/filter-pills/filter-pills.component.html","../../../projects/ui/src/lib/ui/components/stage-dots/stage-dots.component.ts","../../../projects/ui/src/lib/ui/components/stage-dots/stage-dots.component.html","../../../projects/ui/src/lib/ui/components/code-block/code-block.component.ts","../../../projects/ui/src/lib/ui/components/code-block/code-block.component.html","../../../projects/ui/src/lib/ui/components/screenshot-frame/screenshot-frame.component.ts","../../../projects/ui/src/lib/ui/components/screenshot-frame/screenshot-frame.component.html","../../../projects/ui/src/lib/ui/components/meter/meter.component.ts","../../../projects/ui/src/lib/ui/components/meter/meter.component.html","../../../projects/ui/src/lib/ui/components/section-card/section-card.component.ts","../../../projects/ui/src/lib/ui/components/section-card/section-card.component.html","../../../projects/ui/src/lib/ui/components/info-field/info-field.component.ts","../../../projects/ui/src/lib/ui/components/info-field/info-field.component.html","../../../projects/ui/src/lib/ui/components/severity-badges/severity-badges.component.ts","../../../projects/ui/src/lib/ui/components/severity-badges/severity-badges.component.html","../../../projects/ui/src/lib/ui/components/master-detail/master-detail.component.ts","../../../projects/ui/src/lib/ui/components/master-detail/master-detail.component.html","../../../projects/ui/src/lib/ui/components/menu/menu.component.ts","../../../projects/ui/src/lib/ui/components/menu/menu.component.html","../../../projects/ui/src/lib/ui/components/theme-picker/theme-picker.component.ts","../../../projects/ui/src/lib/ui/components/theme-picker/theme-picker.component.html","../../../projects/ui/src/lib/ui/components/pending-badge/pending-badge.component.ts","../../../projects/ui/src/lib/ui/components/pending-badge/pending-badge.component.html","../../../projects/ui/src/lib/ui/components/breadcrumb/breadcrumb.component.ts","../../../projects/ui/src/lib/ui/components/breadcrumb/breadcrumb.component.html","../../../projects/ui/src/lib/ui/components/load-status/load-status.component.ts","../../../projects/ui/src/lib/ui/components/load-status/load-status.component.html","../../../projects/ui/src/lib/ui/components/sample-frame/sample-frame.component.ts","../../../projects/ui/src/lib/ui/components/sample-frame/sample-frame.component.html","../../../projects/ui/src/lib/ui/components/score-badge/score-badge.component.ts","../../../projects/ui/src/lib/ui/components/score-badge/score-badge.component.html","../../../projects/ui/src/lib/ui/components/status-dot/status-dot.component.ts","../../../projects/ui/src/lib/ui/components/status-dot/status-dot.component.html","../../../projects/ui/src/lib/ui/components/segmented/segmented.component.ts","../../../projects/ui/src/lib/ui/components/segmented/segmented.component.html","../../../projects/ui/src/lib/ui/components/list-row/list-row.component.ts","../../../projects/ui/src/lib/ui/components/list-row/list-row.component.html","../../../projects/ui/src/lib/ui/components/bar-list/bar-list.component.ts","../../../projects/ui/src/lib/ui/components/bar-list/bar-list.component.html","../../../projects/ui/src/lib/ui/components/facets-rail/facets-rail.component.ts","../../../projects/ui/src/lib/ui/components/facets-rail/facets-rail.component.html","../../../projects/ui/src/lib/ui/components/project-card/project-card.component.ts","../../../projects/ui/src/lib/ui/components/project-card/project-card.component.html","../../../projects/ui/src/lib/ui/components/pipeline-stepper/pipeline-stepper.component.ts","../../../projects/ui/src/lib/ui/components/pipeline-stepper/pipeline-stepper.component.html","../../../projects/ui/src/lib/ui/components/skeleton-facets/skeleton-facets.component.ts","../../../projects/ui/src/lib/ui/components/skeleton-facets/skeleton-facets.component.html","../../../projects/ui/src/lib/ui/components/skeleton-dashboard/skeleton-dashboard.component.ts","../../../projects/ui/src/lib/ui/components/skeleton-dashboard/skeleton-dashboard.component.html","../../../projects/ui/src/lib/ui/components/route-skeleton/route-skeleton.component.ts","../../../projects/ui/src/lib/ui/components/route-skeleton/route-skeleton.component.html","../../../projects/ui/src/lib/ui/components/skeleton-frame/skeleton-frame.component.ts","../../../projects/ui/src/lib/ui/components/skeleton-frame/skeleton-frame.component.html","../../../projects/ui/src/lib/ui/components/index.ts","../../../projects/ui/src/lib/ui/dialogs/index.ts","../../../projects/ui/src/lib/ui/motion/reveal.directive.ts","../../../projects/ui/src/lib/ui/motion/reveal-group.directive.ts","../../../projects/ui/src/lib/ui/motion/index.ts","../../../projects/ui/src/lib/ui/ui.module.ts","../../../projects/ui/src/public-api.ts","../../../projects/ui/src/foxeltech-angular-ui.ts"],"sourcesContent":["import { DestroyRef, Directive, Injector, OnDestroy, inject } from '@angular/core';\n\n@Directive()\nexport abstract class BaseComponent implements OnDestroy {\n protected injector: Injector;\n /** Teardown hook for subscriptions: takeUntilDestroyed(this.destroyRef). */\n protected destroyRef = inject(DestroyRef);\n\n constructor(injector?: Injector) {\n // Some subclasses historically passed non-injector values (e.g. dialog\n // data) to super(); fall back to the component's own injector so\n // this.injector.get(...) always works.\n this.injector = injector instanceof Injector ? injector : inject(Injector);\n }\n\n // eslint-disable-next-line @angular-eslint/no-empty-lifecycle-method -- subclasses across host apps call super.ngOnDestroy(); removing this breaks them at runtime\n ngOnDestroy(): void {}\n}\n","import { Injectable, computed, signal } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nexport interface FxLoadJob {\n id: number;\n /** Short caller-supplied label — \"summary\", \"history\", \"projects\". */\n label: string;\n}\n\n/**\n * Backend-request bookkeeping behind the topbar load status (design\n * \"Loading States\", 04/09): while any tracked request is in flight the shell\n * shows a spinner + \"Loading <label> · k of n\" and a thin indeterminate bar;\n * once the batch settles it shows \"● Up to date · just now\".\n *\n * A batch = every job started while at least one job is still pending. When\n * the last one settles the batch closes (`lastUpdated` moves) and the next\n * job opens a fresh count — so \"k of n\" always reads against the requests of\n * the current page load, not the session total.\n *\n * Wire-ups: `fxListResolver` and `BaseTableComponent.fetch()` track\n * automatically; screens with their own fetches call `track()`.\n */\n@Injectable({ providedIn: 'root' })\nexport class FxLoadStatusService {\n private seq = 0;\n private readonly _pending = signal<FxLoadJob[]>([]);\n private readonly _batchTotal = signal(0);\n private readonly _lastUpdated = signal<Date | null>(null);\n private readonly _reload = new Subject<void>();\n\n /** Jobs still in flight, oldest first. */\n readonly pending = this._pending.asReadonly();\n /** Requests started in the current batch. */\n readonly total = this._batchTotal.asReadonly();\n readonly done = computed(() => Math.max(0, this._batchTotal() - this._pending().length));\n readonly loading = computed(() => this._pending().length > 0);\n /** Label of the oldest pending request — what the status line names. */\n readonly current = computed(() => this._pending()[0]?.label ?? '');\n /** When the last batch settled; null until the first one does. */\n readonly lastUpdated = this._lastUpdated.asReadonly();\n /** Fired by the topbar ↻ — the shell decides how to re-fetch the route. */\n readonly reload$ = this._reload.asObservable();\n\n /** Register a request; call the returned function when it settles. */\n begin(label: string): () => void {\n const job: FxLoadJob = { id: ++this.seq, label };\n if (this._pending().length === 0) this._batchTotal.set(0);\n this._batchTotal.update((n) => n + 1);\n this._pending.update((list) => [...list, job]);\n let ended = false;\n return () => {\n if (ended) return;\n ended = true;\n this._pending.update((list) => list.filter((j) => j.id !== job.id));\n if (this._pending().length === 0) this._lastUpdated.set(new Date());\n };\n }\n\n /** Track a promise (or a factory producing one) under `label`. */\n async track<T>(label: string, work: Promise<T> | (() => Promise<T>)): Promise<T> {\n const end = this.begin(label);\n try {\n return await (typeof work === 'function' ? work() : work);\n } finally {\n end();\n }\n }\n\n requestReload(): void {\n this._reload.next();\n }\n\n /** Short label from a request url: `/TEST1/history` → \"history\", `/search` → \"search\". */\n static labelFromUrl(url: string): string {\n const parts = String(url).split('?')[0].split('/').filter(Boolean);\n return parts[parts.length - 1] ?? 'data';\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n InjectionToken,\n inject,\n isDevMode,\n input\n} from '@angular/core';\n\n/**\n * Where the generated Heroicons sprite is served from. Defaults to\n * 'fx-icons.svg' at the app base — consumers copy it from the package via an\n * angular.json assets glob (same pattern as the lib fonts):\n * { \"input\": \"node_modules/@foxeltech/angular-ui\", \"glob\": \"fx-icons.svg\", \"output\": \".\" }\n */\nexport const FX_ICON_SPRITE_URL = new InjectionToken<string>('FX_ICON_SPRITE_URL', {\n providedIn: 'root',\n factory: () => 'fx-icons.svg',\n});\n\nlet spriteChecked = false;\n\n/**\n * Heroicons rendered from the self-hosted sprite (see\n * scripts/generate-icon-sprite.mjs) — every 24px outline/solid icon is\n * available by name with no per-icon registration and no runtime icon\n * library. API kept compatible with the old @dimaslz/ng-heroicons wrapper.\n */\n@Component({\n selector: 'fx-ui-hero-icon',\n templateUrl: './hero-icon.component.html',\n styleUrl: './hero-icon.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HeroIconComponent {\n readonly stroke = input(1.5);\n readonly icon = input<string>();\n readonly solid = input<boolean>();\n readonly outline = input<boolean>();\n readonly size = input<number>();\n readonly color = input<string>();\n readonly class = input<string>();\n\n readonly spriteUrl = inject(FX_ICON_SPRITE_URL);\n\n constructor() {\n // One warning per app when the sprite asset was not copied — otherwise\n // every icon just renders blank and nobody knows why.\n if (isDevMode() && !spriteChecked && typeof fetch === 'function') {\n spriteChecked = true;\n fetch(this.spriteUrl, { method: 'HEAD' })\n .then((r) => {\n if (!r.ok) throw new Error(String(r.status));\n })\n .catch(() =>\n console.warn(\n `[fx-ui-hero-icon] Sprite '${this.spriteUrl}' not found — add the fx-icons.svg ` +\n `assets glob from @foxeltech/angular-ui to angular.json (see FX_ICON_SPRITE_URL docs).`,\n ),\n );\n }\n }\n\n get href(): string {\n const name = this.solid() ? `${this.icon()}-solid` : this.icon();\n return `${this.spriteUrl}#${name}`;\n }\n}\n","<svg\n [attr.width]=\"size() || 24\"\n [attr.height]=\"size() || 24\"\n [attr.stroke-width]=\"solid() ? null : stroke()\"\n [style.color]=\"color() || null\"\n [class]=\"class()\"\n aria-hidden=\"true\"\n>\n <use [attr.href]=\"href\" />\n</svg>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n@Component({\n selector: 'fx-ui-toast',\n templateUrl: './toast.component.html',\n styleUrl: './toast.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, HeroIconComponent],\n})\nexport class ToastComponent {\n readonly toastId = input.required<number>();\n @Input() title?: string = '';\n readonly message = input('');\n readonly type = input<'success' | 'error' | 'info' | 'warning'>();\n}\n","<div\n animate.enter=\"horizontal-fade-in-animation\"\n animate.leave=\"horizontal-fade-out-animation\"\n [attr.role]=\"type() === 'error' ? 'alert' : 'status'\"\n class=\"flex border-l-[3px] items-center bg-bg-primary gap-semi min-w-[250px] max-w-[400px] px-large py-semi rounded shadow-lg transition-all duration-300 ease-in-out transform opacity-100 translate-y-0\"\n [ngClass]=\"{\n 'tone-border-success': type() === 'success',\n 'tone-border-danger': type() === 'error',\n 'border-warning': type() === 'warning',\n 'border-information': type() === 'info'\n }\"\n >\n <div class=\"\" aria-hidden=\"true\">\n @switch (type()) { @case('success') {\n <fx-ui-hero-icon\n icon=\"check-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"tone-fg-success\"\n ></fx-ui-hero-icon>\n } @case('error') {\n <fx-ui-hero-icon\n icon=\"exclamation-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"tone-fg-danger\"\n ></fx-ui-hero-icon>\n } @case('warning') {\n <fx-ui-hero-icon\n icon=\"exclamation-triangle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"tone-fg-warning\"\n ></fx-ui-hero-icon>\n } @default {\n <fx-ui-hero-icon\n icon=\"information-circle\"\n [solid]=\"true\"\n [size]=\"30\"\n class=\"tone-fg-information\"\n ></fx-ui-hero-icon>\n } }\n </div>\n\n <div class=\"flex flex-col\">\n @if (title) {\n <strong class=\"txt-field-label\">{{ title }}</strong>\n }\n <p class=\"txt-default\">{{ message() }}</p>\n </div>\n </div>\n","import { ChangeDetectorRef, Component, ChangeDetectionStrategy } from '@angular/core';\nimport { ToastComponent } from '../toast/toast.component';\n// import { ToastData } from '../../../../public-api';\n\n@Component({\n selector: 'fx-ui-toast-container',\n templateUrl: './toast-container.component.html',\n styleUrl: './toast-container.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ToastComponent],\n})\nexport class ToastContainerComponent {\n toasts: any[] = [];\n\n constructor(private ref: ChangeDetectorRef) {}\n\n addToast(toast: any) {\n this.toasts.push(toast);\n this.ref.detectChanges()\n setTimeout(() => this.removeToast(toast.id), 3000);\n }\n\n removeToast(id: number) {\n this.toasts = this.toasts.filter(t => t.id !== id);\n this.ref.detectChanges();\n }\n}\n","<div\n class=\"fixed top-5 right-5 flex flex-col items-end gap-3 z-[10000] pointer-events-none\"\n>\n @for (toast of toasts; track toast) {\n <fx-ui-toast\n class=\"pointer-events-auto\"\n [toastId]=\"toast.id\"\n [message]=\"toast.message\"\n [title]=\"toast.title\"\n [type]=\"toast.type\"\n ></fx-ui-toast>\n }\n</div>","import { Injectable, ApplicationRef, ComponentRef, Injector, createComponent } from '@angular/core';\nimport { ToastContainerComponent } from '../../ui/components/toast-container/toast-container.component';\n\nexport interface ToastData {\n id: number;\n message: string;\n title?: string;\n type: 'success' | 'error' | 'info' | 'warning';\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FxToastrService {\n private containerRef?: ComponentRef<ToastContainerComponent>;\n private idCounter = 0;\n private recentMessages = new Set<string>();\n\n constructor(private appRef: ApplicationRef) {\n this.ensureContainerExists();\n }\n\n private ensureContainerExists() {\n if (!this.containerRef) {\n this.containerRef = createComponent(ToastContainerComponent, {\n environmentInjector: this.appRef.injector,\n });\n\n this.appRef.attachView(this.containerRef.hostView);\n document.body.appendChild(this.containerRef.location.nativeElement);\n }\n }\n\n private show(message: string, type: ToastData['type'], title?: string) {\n const dedupeKey = `${type}:${message}`;\n if (this.recentMessages.has(dedupeKey)) {\n return;\n }\n this.recentMessages.add(dedupeKey);\n setTimeout(() => this.recentMessages.delete(dedupeKey), 2000);\n\n const toast: ToastData = {\n id: ++this.idCounter,\n message,\n title,\n type,\n };\n\n this.containerRef?.instance.addToast(toast);\n }\n\n success(message: string, title?: string) {\n this.show(message, 'success', title);\n }\n\n error(message: string, title?: string) {\n this.show(message, 'error', title);\n }\n\n info(message: string, title?: string) {\n this.show(message, 'info', title);\n }\n\n warning(message: string, title?: string) {\n this.show(message, 'warning', title);\n }\n}\n","import { Observable, firstValueFrom } from 'rxjs';\nimport { NgForm } from '@angular/forms';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { TagType } from '../../public-api';\n\nexport class FxUtils {\n /** Dot-path accessor (lodash _.get replacement — supports 'a.b.c'). */\n static get(obj: any, path: string, defaultValue?: any): any {\n if (obj == null) return defaultValue;\n let cur: any = obj;\n for (const key of path.split('.')) {\n if (cur == null) return defaultValue;\n cur = cur[key];\n }\n return cur === undefined ? defaultValue : cur;\n }\n\n /** Dot-path setter (lodash _.set replacement — creates missing objects). */\n static set(obj: any, path: string, value: any): any {\n const keys = path.split('.');\n let cur: any = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n if (cur[keys[i]] == null || typeof cur[keys[i]] !== 'object') cur[keys[i]] = {};\n cur = cur[keys[i]];\n }\n cur[keys[keys.length - 1]] = value;\n return obj;\n }\n\n /** Structural equality (lodash _.isEqual replacement for plain data). */\n static deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n if (a == null || b == null || typeof a !== 'object' || typeof b !== 'object') return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n const ka = Object.keys(a);\n const kb = Object.keys(b);\n if (ka.length !== kb.length) return false;\n return ka.every((k) => FxUtils.deepEqual(a[k], b[k]));\n }\n\n /** Deep clone for plain data (objects/arrays/Date); functions stay by reference. */\n static cloneDeep<T>(v: T): T {\n if (v === null || typeof v !== 'object') return v;\n if (v instanceof Date) return new Date(v.getTime()) as any;\n if (Array.isArray(v)) return v.map((x) => FxUtils.cloneDeep(x)) as any;\n const out: any = {};\n for (const k of Object.keys(v as any)) out[k] = FxUtils.cloneDeep((v as any)[k]);\n return out;\n }\n\n private static async preresolve(promises: any, value: any, key?: string) {\n if (key === 'callback' || key === 'socket' || key === 'listener') {\n promises.push(value);\n return;\n }\n if (value instanceof Function) {\n this.preresolve(promises, value());\n } else if (value instanceof Array) {\n const inpromises: any = [];\n value.forEach((v) => {\n this.preresolve(inpromises, v);\n });\n promises.push(Promise.all(inpromises));\n } else if (value instanceof Observable) {\n promises.push(firstValueFrom(value));\n } else if (value instanceof Promise) {\n promises.push(value);\n } else if (value instanceof Object) {\n promises.push(this.resolve(value));\n } else {\n promises.push(value);\n }\n }\n\n static async resolve(value: object) {\n const keys = [];\n const promises: any = [];\n for (const i in value) {\n if (Object.prototype.hasOwnProperty.call(value, i)) {\n keys.push(i);\n this.preresolve(promises, (value as any)[i], i);\n }\n }\n const values = await Promise.all(promises);\n const raw = {};\n keys.forEach((key: string, index: number) => {\n FxUtils.set(raw, key, values[index]);\n });\n return raw;\n }\n\n static isNotNull(obj: any): boolean {\n return !this.isNull(obj);\n }\n\n static isNull(obj: any): boolean {\n return obj === undefined || obj === null;\n }\n\n static isFunction(obj: any): boolean {\n return this.isNotNull(obj) && obj instanceof Function;\n }\n\n static isNotFunction(obj: any): boolean {\n return !this.isFunction(obj);\n }\n\n static isStringEmpty(obj: string): boolean {\n return this.isNull(obj) || obj === '';\n }\n\n static isStringNotEmpty(obj: string): boolean {\n return !this.isStringEmpty(obj);\n }\n\n static isArrayEmpty(obj: any[]): boolean {\n return this.isNull(obj) || obj.length === 0;\n }\n\n static isArrayNotEmpty(obj: any[]): boolean {\n return !this.isArrayEmpty(obj);\n }\n\n static replaceStartWithAsterisk(inputString: string, numToReplace: number): string {\n if (numToReplace >= inputString.length) {\n return '*'.repeat(inputString.length);\n } else if (numToReplace <= 0) {\n return inputString;\n } else {\n const asterisks = '*'.repeat(numToReplace);\n const remainingString = inputString.substring(numToReplace);\n return asterisks + remainingString;\n }\n }\n\n static checkInvalidField(form: NgForm): void {\n Object.keys(form.controls).forEach((field) => {\n const control = form.controls[field];\n control.markAsTouched({ onlySelf: true });\n });\n }\n\n static checkInlineErrorField(err: any, f: NgForm) {\n if (err) {\n Object.keys(err).forEach((field) => {\n const formControl = f.form.get(field);\n\n if (formControl) {\n const error = { apiError: err[field] };\n formControl.setErrors(error);\n }\n });\n }\n }\n\n static isSameCollection(collection: any[], compareCollection: any): boolean {\n const a = new Set(collection ?? []);\n const b = new Set(compareCollection ?? []);\n return a.size === b.size && [...a].every((x) => b.has(x));\n }\n\n static isSameValue(model: any, compareModel: any) {\n return FxUtils.deepEqual(model, compareModel);\n }\n\n static parseError(err: HttpErrorResponse) {\n const status = err?.status;\n\n switch (status) {\n case 401:\n return 'Session timeout. Please login again.';\n case 403:\n return 'You do not have permission to perform this action.';\n case 404:\n return 'The requested resource was not found.';\n case 408:\n return 'The request timed out. Please try again.';\n case 409:\n return 'A conflict occurred. Please refresh and try again.';\n case 413:\n return 'The uploaded data is too large.';\n case 415:\n return 'Unsupported media type. Please check the file format.';\n case 429:\n return 'Too many requests. Please wait a moment and try again.';\n case 500:\n return 'An internal server error occurred. Please try again later.';\n case 502:\n return 'The server is temporarily unavailable. Please try again later.';\n case 503:\n return 'The service is currently unavailable. Please try again later.';\n case 504:\n return 'The server took too long to respond. Please try again later.';\n }\n\n const message = this.isStringEmpty(err?.error?.errors ?? '')\n ? (err?.error?.message ?? 'Unknown Error')\n : err?.error?.errors;\n\n if (this.isStringEmpty(err?.error?.code)) {\n return message;\n }\n return `${err?.error?.code}: ${message}`;\n }\n\n /**\n * Resolve a theme channel triple (`--danger: 255 122 0`) to a CSS colour.\n * Pass `legacyCommaSyntax: true` for canvas/ECharts consumers: canvas paints\n * both forms, but zrender's colour parser can't read the CSS4 space syntax\n * and renders slices black on hover when given it.\n */\n static convertColorFromVariable(\n name: string,\n alpha = 1,\n options?: { legacyCommaSyntax?: boolean },\n ): string {\n const value = getComputedStyle(document.body)\n .getPropertyValue(name)\n .trim()\n .replace(/\\s+/g, ' ');\n if (options?.legacyCommaSyntax) {\n const [r, g, b] = value.replace(/[/,]/g, ' ').split(/\\s+/).filter(Boolean);\n if (r === undefined || g === undefined || b === undefined) {\n return `rgba(148, 163, 184, ${alpha})`;\n }\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n return value ? `rgba(${value} / ${alpha})` : `rgba(255 255 255 / ${alpha})`;\n }\n\n /**\n * Status/severity string → tag tone.\n *\n * Coerces instead of trusting the argument: every caller feeds this raw API\n * values, and a numeric or null field used to throw\n * \"key.toLowerCase is not a function\" and take the whole screen down.\n * Non-string input simply falls through to the default tone.\n */\n static getTagClass(key: string, isCriticalExist = true): TagType {\n switch (String(key ?? '').toLowerCase()) {\n case 'error':\n case 'failed':\n case 'inactive':\n case 'critical':\n case 'stopped':\n return 'critical';\n case 'high':\n if (!isCriticalExist) {\n return 'critical';\n }\n return 'danger';\n case 'inprogress':\n case 'processing':\n case 'paused':\n case 'medium':\n case 'warning':\n return 'warning';\n case 'completed':\n case 'success':\n case 'active':\n case 'low':\n case 'running':\n return 'success';\n case 'queue':\n case 'waiting':\n case 'info':\n case 'system':\n return 'information';\n case 'discovery':\n return 'discovery';\n case 'disabled':\n default:\n return 'default';\n }\n }\n\n static validateEmail(value: string) {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n const isEmail = emailRegex.test(value);\n return isEmail;\n }\n\n /** Safe deep accessor with the org-wide empty placeholder. */\n static value(model: any, key: string, defaultValue: any = '---') {\n return FxUtils.get(model, key, defaultValue);\n }\n\n /**\n * Severity weight for ordering — kept next to getTagClass so ordering and\n * colouring can never drift apart.\n */\n static severityWeight(level: string): number {\n switch (String(level ?? '').toUpperCase()) {\n case 'CRITICAL':\n return 5;\n case 'HIGH':\n return 4;\n case 'MEDIUM':\n return 3;\n case 'LOW':\n return 2;\n case 'INFO':\n case 'INFORMATION':\n return 1;\n default:\n return 0;\n }\n }\n\n /** Org-wide date-time rendering (DD/MM/YYYY HH:mm:ss, local time). */\n static formatDateTime(time: string | Date): string {\n if (FxUtils.isNull(time)) return '';\n const d = time instanceof Date ? time : new Date(String(time).replace(' ', 'T'));\n if (isNaN(d.getTime())) return '';\n const p = (n: number) => String(n).padStart(2, '0');\n return `${p(d.getDate())}/${p(d.getMonth() + 1)}/${d.getFullYear()} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;\n }\n\n /** Seconds → compact duration (\"2d 4h\", \"3h 12m\", \"45s\"). */\n static formatDuration(totalSeconds: number): string {\n const sec = Number(totalSeconds);\n if (!Number.isFinite(sec) || sec < 0) return '';\n const d = Math.floor(sec / 86400);\n const h = Math.floor((sec % 86400) / 3600);\n const m = Math.floor((sec % 3600) / 60);\n const s = Math.floor(sec % 60);\n if (d > 0) return h > 0 ? `${d}d ${h}h` : `${d}d`;\n if (h > 0) return m > 0 ? `${h}h ${m}m` : `${h}h`;\n if (m > 0) return s > 0 ? `${m}m ${s}s` : `${m}m`;\n return `${s}s`;\n }\n\n /** Relative time within the last 24h (\"3 hours ago\"), else DD/MM/YYYY. */\n static formatRelative(time: string | Date): string {\n if (FxUtils.isNull(time)) return '';\n const d = time instanceof Date ? time : new Date(String(time).replace(' ', 'T'));\n if (isNaN(d.getTime())) return '';\n const diffMs = Date.now() - d.getTime();\n if (diffMs < 24 * 3600_000) {\n // Same wording moment.fromNow() produced for the < 24h range.\n const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });\n const mins = Math.round(diffMs / 60_000);\n if (Math.abs(mins) < 60) return rtf.format(-mins, 'minute');\n return rtf.format(-Math.round(mins / 60), 'hour');\n }\n const p = (n: number) => String(n).padStart(2, '0');\n return `${p(d.getDate())}/${p(d.getMonth() + 1)}/${d.getFullYear()}`;\n }\n\n /**\n * Normalize a snake_case + protobuf-Long API payload for camelCase binding:\n * - genuine snake_case keys -> camelCase (data-as-key entries such as DLL\n * names like \"kernel32.dll\" are left untouched by the strict regex);\n * - Long-encoded numbers `{ high, low, unsigned }` -> plain number.\n */\n static camelizeDeep(input: any): any {\n if (Array.isArray(input)) {\n return input.map((v) => FxUtils.camelizeDeep(v));\n }\n if (input !== null && typeof input === 'object') {\n const keys = Object.keys(input);\n if (\n keys.length === 3 &&\n keys.includes('high') &&\n keys.includes('low') &&\n keys.includes('unsigned')\n ) {\n const high = Number((input as any).high) || 0;\n const low = Number((input as any).low) || 0;\n return high * 4294967296 + (low >>> 0);\n }\n const out: any = {};\n for (const k of keys) {\n const nk = /^[a-z][a-z0-9]*(_[a-z0-9]+)+$/.test(k) ? k.replace(/_([a-z0-9])/g, (_m, c) => c.toUpperCase()) : k;\n out[nk] = FxUtils.camelizeDeep((input as any)[k]);\n }\n return out;\n }\n return input;\n }\n\n static formatSizeUnits(bytes: number) {\n if (bytes >= 1073741824) {\n return (bytes / 1073741824).toFixed(2) + ' GB';\n } else if (bytes >= 1048576) {\n return (bytes / 1048576).toFixed(2) + ' MB';\n } else if (bytes >= 1024) {\n return (bytes / 1024).toFixed(2) + ' KB';\n } else if (bytes > 1) {\n return bytes + ' bytes';\n } else if (bytes == 1) {\n return bytes + ' byte';\n }\n return '0 bytes';\n }\n}\n","import { HttpClient, HttpEvent, HttpHeaders, HttpRequest } from '@angular/common/http';\nimport { Observable, firstValueFrom } from 'rxjs';\n\nexport class HttpWrapper {\n constructor(public http: HttpClient, public baseURL: string) {}\n\n /**\n * Hook applied to every resolved response (get/post/put/delete and all verb\n * helpers built on them). Default is identity; override to normalize a\n * backend convention once (e.g. FxUtils.camelizeDeep for snake_case +\n * protobuf-Long payloads) instead of wrapping each method.\n */\n protected transformResponse(res: any): any {\n return res;\n }\n\n private addCredentials(options: any = {}): any {\n return {\n withCredentials: true,\n ...options,\n };\n }\n\n async get(url = '', params?: any): Promise<any> {\n const options = {\n withCredentials: true,\n params: {\n ...params,\n },\n };\n return this.transformResponse(await firstValueFrom(this.http.get(this.baseURL + url, options)));\n }\n\n async post(url: string, body: any = {}, options: any = {}): Promise<any> {\n return this.transformResponse(\n await firstValueFrom(this.http.post(this.baseURL + url, body, this.addCredentials(options))),\n );\n }\n\n async put(url: string, body: any, options: any = {}): Promise<any> {\n return this.transformResponse(\n await firstValueFrom(this.http.put(this.baseURL + url, body, this.addCredentials(options))),\n );\n }\n\n async delete(url: string, options: any = {}): Promise<any> {\n return this.transformResponse(\n await firstValueFrom(this.http.delete(this.baseURL + url, this.addCredentials(options))),\n );\n }\n\n upload(url: string, body: FormData, options: any = {}): Observable<HttpEvent<any>> {\n const req = new HttpRequest(\n 'POST',\n this.baseURL + url,\n body,\n {\n reportProgress: true,\n ...this.addCredentials(options)\n }\n );\n\n return this.http.request(req);\n }\n\n async search(params: any = {}) {\n return await this.get('/search', params);\n }\n\n async detail(params: any) {\n return await this.get(`/detail`, params);\n }\n\n async remove(params: any = {}) {\n return await this.delete(`/remove`, params);\n }\n\n async create(data: any) {\n return await this.post(`/create`, data);\n }\n\n async updateInfo(data: any, params?: any) {\n return await this.put(`/update-info`, data, { params: params });\n }\n\n async updateStatus(data: any, params?: any) {\n return await this.put(`/update-status`, data, { params: params });\n }\n\n async update(data: any, params?: any) {\n return await this.put(`/update`, data, { params: params });\n }\n\n async single(code: string) {\n return await this.post(`/${code}`, {});\n }\n\n async selectize() {\n return await this.post('/search', {});\n }\n\n async fetch(filter: any = {}, params: any = {}) {\n return await this.post('', filter, { params: params });\n }\n\n async published(idOrCode: string) {\n return await this.post(`/published/${idOrCode}`);\n }\n\n async unpublished(idOrCode: string) {\n return await this.post(`/unpublished/${idOrCode}`);\n }\n\n async terminated(idOrCode: string) {\n return await this.post(`/terminated/${idOrCode}`);\n }\n\n async disable(params: any) {\n return await this.post(`/disable`, params);\n }\n}\n","import { AfterViewInit, Directive, Injector, OnInit, Type, ViewChild, viewChild } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\nimport { MatTable, MatTableDataSource } from '@angular/material/table';\nimport { BaseComponent } from './base.component';\nimport { HttpWrapper } from '../services/http-wrapper.service';\nimport { FxLoadStatusService } from '../services/load-status.service';\nimport { FxToastrService } from '../services/toastr.service';\nimport { ChangeDetectorRef } from '@angular/core';\nimport { FxUtils } from '../utils';\nimport { Subject, Subscription, debounceTime, distinctUntilChanged, firstValueFrom } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport interface TableResult<T> {\n data: T[];\n total: number;\n}\n\n/**\n * Filter bag for BaseTable screens. The platform-wide keys are declared so\n * templates keep dot access under noPropertyAccessFromIndexSignature;\n * screen-specific keys ride on the index signature (bracket access).\n */\nexport interface FxTableFilters {\n keyword?: string;\n status?: string;\n statuses?: string[];\n severity?: string;\n riskLevel?: string;\n priority?: string;\n category?: string;\n integrityLevel?: string;\n tags?: string[];\n name?: string;\n groupId?: string;\n [key: string]: any;\n}\n\n@Directive()\nexport class BaseTableComponent<T = any> extends BaseComponent implements OnInit, AfterViewInit {\n dataSource = new MatTableDataSource<T>();\n cols: string[] = [];\n total = 0;\n page = 0;\n pageSize = 10;\n filters: FxTableFilters = {};\n loading = false;\n expandedElement: T | null;\n toastr: FxToastrService;\n /** Topbar load status; optional so hand-rolled test injectors keep working. */\n protected loadStatus: FxLoadStatusService | null = null;\n public _lock = false;\n keywordChange$ = new Subject<string>();\n dataSourcePlaceholder: any[];\n public config: {\n create?: {\n dialog?: Type<{}>;\n size?: string;\n disableClose?: boolean;\n label?: string;\n title?: string;\n message?: string;\n };\n update?: {\n dialog?: Type<{}>;\n size?: string;\n disableClose?: boolean;\n label?: string;\n title?: string;\n message?: string;\n };\n view?: {\n dialog?: Type<{}>;\n size?: string;\n disableClose?: boolean;\n label?: string;\n title?: string;\n message?: string;\n };\n delete?: {\n dialog?: Type<{}>;\n title?: string;\n message?: string;\n cancelTitle?: string;\n confirmTitle?: string;\n };\n updateStatus?: {\n message?: string;\n };\n };\n\n /**\n * The paging engine. Either the page's own <mat-paginator> (found by the\n * ViewChild query) or one handed in by a child such as fx-ui-master-detail,\n * whose paginator lives in ITS view where the query cannot see it.\n *\n * ⚠️ A plain `@ViewChild` property was clobbered: the query re-runs before\n * every ngAfterViewInit and, finding nothing, wrote `undefined` over the\n * instance the child had assigned a moment earlier — so page events were\n * never subscribed and Prev/Next changed the range text but not the rows\n * (anh Tú 04/09). The setter attaches on any real assignment and ignores\n * `undefined`, so whichever side provides the paginator wins.\n */\n @ViewChild(MatPaginator)\n set paginator(p: MatPaginator | undefined) {\n if (!p || p === this._paginator) return;\n this._paginator = p;\n this._pageSub?.unsubscribe();\n this._pageSub = p.page.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n void this.onPageChange(event);\n });\n }\n get paginator(): MatPaginator {\n return this._paginator!;\n }\n private _paginator?: MatPaginator;\n private _pageSub?: Subscription;\n readonly table = viewChild.required(MatTable);\n\n constructor(\n injector: Injector,\n public api: HttpWrapper,\n public modal: MatDialog,\n public ref: ChangeDetectorRef,\n ) {\n super(injector);\n this.toastr = injector.get(FxToastrService);\n this.loadStatus = injector.get(FxLoadStatusService, null);\n }\n\n ngOnInit(): void {\n this.keywordChange$\n .pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe(async () => {\n await this.refresh();\n });\n this.dataSourcePlaceholder = Array(this.pageSize).fill({});\n this.init();\n }\n\n public init() {}\n\n ngAfterViewInit(): void {\n // Page events are wired by the `paginator` setter (see above).\n this.ref.detectChanges();\n }\n\n public async refresh(): Promise<void> {\n this.page = 0;\n if (this.paginator) {\n this.paginator.pageIndex = 0;\n }\n await this.fetch();\n }\n\n /**\n * Where the list is fetched from. Default (null) keeps the legacy behavior\n * of calling `api.search()` (GET /search) untouched. Subclasses whose list\n * lives elsewhere override this instead of re-implementing fetch() — and\n * keep the stale-response sequence guard for free.\n */\n protected listRequest(): { method: 'get' | 'post'; url: string } | null {\n return null;\n }\n\n /** Result keys the list/total are read from. Override alongside listRequest(). */\n protected listKey = 'data';\n protected totalKey = 'total';\n\n public setDataSource(result: any): void {\n this.dataSource.data = FxUtils.get(result, this.listKey);\n this.total = FxUtils.get(result, this.totalKey);\n }\n\n private _fetchSeq = 0;\n\n public async fetch(): Promise<void> {\n // Sequence guard: without it a slow earlier request could resolve after\n // a newer one and overwrite the table with stale data.\n const seq = ++this._fetchSeq;\n this.loading = true;\n const endStatus = this.loadStatus?.begin(this.listKey) ?? null;\n try {\n const params = { page: (this.page ?? 0) + 1, pageSize: this.pageSize, ...this.filters };\n const req = this.listRequest();\n const result = req\n ? req.method === 'post'\n ? await this.api.post(req.url, params)\n : await this.api.get(req.url, params)\n : await this.api.search(params);\n if (seq !== this._fetchSeq) return;\n this.setDataSource(result);\n } catch (err: any) {\n if (seq !== this._fetchSeq) return;\n this.toastr.error(FxUtils.parseError(err));\n } finally {\n endStatus?.();\n if (seq === this._fetchSeq) {\n this.loading = false;\n this.ref.detectChanges();\n }\n }\n }\n\n public async onPageChange(event: PageEvent) {\n this.page = event.pageIndex;\n this.pageSize = event.pageSize;\n await this.fetch();\n }\n\n public resolve() {\n return {};\n }\n\n public empty() {\n return {};\n }\n\n public onKeywordChange(keyword: string) {\n this.keywordChange$.next(keyword);\n }\n\n public async create() {\n const conf = this.config?.create;\n const dialog = conf?.dialog;\n const size = conf?.size;\n if (conf == null || dialog == null) {\n return;\n }\n if (this._lock) {\n return;\n }\n this._lock = true;\n\n let panelClass = 'fx-dialog';\n if (size == '100%') {\n panelClass = 'fx-fullsize-dialog';\n }\n\n const instance = this.modal.open(dialog, {\n panelClass: panelClass,\n autoFocus: 'first-tabbable',\n width: size,\n disableClose: conf.disableClose ?? false,\n // Dialogs are created by the root MatDialog: without this the dialog\n // component cannot see route-scoped providers (APIs) — NG0201.\n injector: this.injector,\n data: {\n method: 'create',\n data: this.empty(),\n title: conf.title,\n message: conf.message,\n resolve: this.resolve(),\n },\n });\n\n instance.afterClosed().subscribe((result: any) => {\n if (result) {\n this.refresh();\n }\n this._lock = false;\n });\n }\n\n public async update(model: T) {\n const conf = this.config?.update;\n const dialog = conf?.dialog;\n const size = conf?.size;\n if (dialog == null || conf == null) {\n return;\n }\n if (this._lock) {\n return;\n }\n this._lock = true;\n let panelClass = 'fx-dialog';\n if (size == '100%') {\n panelClass = 'fx-fullsize-dialog';\n }\n\n const instance = this.modal.open(dialog, {\n panelClass: panelClass,\n autoFocus: 'first-tabbable',\n width: size,\n disableClose: conf.disableClose ?? false,\n injector: this.injector,\n data: {\n method: 'update',\n data: model,\n title: conf.title,\n message: conf.message,\n resolve: this.resolve(),\n },\n });\n\n instance.afterClosed().subscribe((result: any) => {\n if (result) {\n this.refresh();\n }\n this._lock = false;\n });\n }\n\n public async view(model: T) {\n const conf = this.config?.view;\n const dialog = conf?.dialog;\n const size = conf?.size;\n if (dialog == null || conf == null) {\n return;\n }\n if (this._lock) {\n return;\n }\n this._lock = true;\n\n let panelClass = 'fx-dialog';\n if (size == '100%') {\n panelClass = 'fx-fullsize-dialog';\n }\n\n const instance = this.modal.open(dialog, {\n panelClass: panelClass,\n autoFocus: 'first-tabbable',\n width: size,\n disableClose: conf.disableClose ?? false,\n injector: this.injector,\n data: {\n data: model,\n title: conf.title,\n message: conf.message,\n resolve: this.resolve(),\n disabled: true,\n method: 'view',\n },\n });\n\n instance.afterClosed().subscribe(() => {\n this._lock = false;\n });\n }\n\n async delete(model: T) {\n const conf = this.config?.delete;\n const dialog = conf?.dialog;\n if (conf == null || dialog == null) {\n return;\n }\n if (this._lock) {\n return;\n }\n this._lock = true;\n\n try {\n const dialogRef = this.modal.open(dialog, {\n panelClass: 'fx-dialog',\n autoFocus: 'first-tabbable',\n width: '400px',\n injector: this.injector,\n data: {\n title: conf?.title,\n message: conf?.message,\n cancelLabel: (conf as any)?.cancelTitle,\n confirmLabel: (conf as any)?.confirmTitle,\n callback: async () => {\n await this.remove(model);\n },\n },\n });\n\n const state = await firstValueFrom(dialogRef.afterClosed());\n\n if (state) {\n try {\n await this.refresh();\n } catch (err: any) {\n this.toastr.error(FxUtils.parseError(err));\n }\n }\n } finally {\n this._lock = false;\n }\n }\n\n async remove(model: T) {\n try {\n return await this.api.remove({ ...model });\n } catch (err: any) {\n this.toastr.error(FxUtils.parseError(err));\n }\n }\n\n public tagClass(tag: string) {\n return FxUtils.getTagClass(tag, true);\n }\n\n public capitalize(label: string) {\n return label ? label.charAt(0).toUpperCase() + label.slice(1).toLowerCase() : label;\n }\n\n public value(model: any, key: string, defaultValue: any = '---') {\n return FxUtils.get(model, key, defaultValue);\n }\n\n public toggleExpand(element: any): void {\n this.expandedElement = this.expandedElement === element ? null : element;\n }\n\n async updateStatus(params: any) {\n try {\n await this.api.updateStatus(params);\n this.toastr.success(this.config?.updateStatus?.message ?? 'Update Success');\n } catch (err: any) {\n this.toastr.error(FxUtils.parseError(err));\n } finally {\n await this.refresh();\n }\n }\n}\n","import { ChangeDetectorRef, Directive, Injector } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { BaseTableComponent } from './base-table.component';\nimport { HttpWrapper } from '../services/http-wrapper.service';\nimport { FxUtils } from '../utils';\n\n/**\n * List + detail-pane counterpart of BaseTableComponent: the page keeps a\n * selectable row list on one side and a lazily fetched, per-id-cached detail\n * on the other. Pair it with `<fx-ui-master-detail>` which renders the\n * two-column shell from this state.\n *\n * Subclasses declare where ids and details come from:\n * protected override idKey = 'licenseId';\n * protected override detailUrl(id: string) { return `/license/${id}`; }\n * `detailUrl` returning null (the default) means the selected row itself is\n * the detail and no request is made.\n */\n@Directive()\nexport class BaseMasterDetailComponent<T = any> extends BaseTableComponent<T> {\n selectedId: string | null = null;\n selected: T | null = null;\n detailMap = new Map<string, any>();\n detailLoading = new Set<string>();\n\n // Explicit ctor: Ivy refuses to inherit a constructor whose `modal: any`\n // parameter is not DI-resolvable (NG2016).\n constructor(injector: Injector, api: HttpWrapper, modal: MatDialog, ref: ChangeDetectorRef) {\n super(injector, api, modal, ref);\n }\n\n /** Key the row id is read from. Override idOf() instead for composite ids. */\n protected idKey = 'id';\n\n public idOf(row: T): string | null {\n return this.value(row, this.idKey, null);\n }\n\n protected detailUrl(id: string): string | null {\n return null;\n }\n\n /** What the detail pane shows: the fetched detail when cached, else the row. */\n get detail(): any {\n return (this.selectedId != null && this.detailMap.get(this.selectedId)) || this.selected;\n }\n\n get detailBusy(): boolean {\n return this.selectedId != null && this.detailLoading.has(this.selectedId);\n }\n\n override setDataSource(result: any): void {\n super.setDataSource(result);\n this.autoSelectFirst();\n }\n\n /** Keep the previous selection when it survived the new page, else pick row 0. */\n autoSelectFirst(): void {\n const list = this.dataSource.data || [];\n if (!list.length) {\n this.selectedId = null;\n this.selected = null;\n return;\n }\n const still = list.find((row) => this.idOf(row) === this.selectedId);\n this.selectItem(still ?? list[0]);\n }\n\n selectItem(row: T): void {\n const id = this.idOf(row);\n this.selectedId = id;\n this.selected = row;\n if (id != null && !this.detailMap.has(id)) {\n this.fetchDetail(id);\n }\n }\n\n fetchDetail(id: string): void {\n const url = this.detailUrl(id);\n if (!url || this.detailLoading.has(id)) {\n return;\n }\n this.detailLoading.add(id);\n this.api\n .get(url)\n .then((res: any) => {\n // New Map identity so OnPush consumers of the pane see the change.\n this.detailMap = new Map(this.detailMap).set(id, res);\n })\n .catch((err: any) => {\n this.toastr.error(FxUtils.parseError(err));\n })\n .finally(() => {\n this.detailLoading.delete(id);\n this.ref.detectChanges();\n });\n }\n}\n","import { AfterViewInit, Directive, Inject, OnInit, viewChild } from '@angular/core';\nimport { BaseComponent } from './base.component';\nimport { NgForm } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { FxToastrService } from '../services/toastr.service';\nimport { HttpWrapper } from '../services/http-wrapper.service';\nimport { FxUtils } from '../utils';\n\n@Directive()\nexport class BaseDialogComponent<T = any> extends BaseComponent implements AfterViewInit, OnInit {\n readonly ngForm = viewChild<NgForm>('f');\n public method: string;\n public title: string;\n public model: any;\n public disabled: boolean;\n public loading: boolean;\n public message: string;\n public resolve: any;\n formChangesSubscription: any;\n public onSubmit = true;\n\n constructor(\n public ref: MatDialogRef<any>,\n @Inject(MAT_DIALOG_DATA) public bindings: any,\n public toastr: FxToastrService,\n public api: HttpWrapper,\n public dialog: MatDialog,\n ) {\n super();\n // Deep clone: a shallow clone let dialog edits mutate nested fields of\n // the live table row even when the user cancelled.\n this.model = FxUtils.cloneDeep(bindings?.['data']);\n this.method = bindings?.['method'];\n this.title = bindings?.['title'];\n this.disabled = bindings?.['disabled'];\n this.message = bindings?.['message'];\n this.resolve = bindings?.['resolve'];\n }\n\n // eslint-disable-next-line @angular-eslint/no-empty-lifecycle-method -- subclasses across host apps call super lifecycle methods; removing these breaks them at runtime\n ngAfterViewInit(): void {}\n\n // eslint-disable-next-line @angular-eslint/no-empty-lifecycle-method -- see ngAfterViewInit note\n ngOnInit(): void {}\n\n async accept(form: NgForm, params = null) {\n if (form.invalid) {\n FxUtils.checkInvalidField(form);\n return;\n }\n if (!this.disabled) {\n if (!this.validate()) return;\n if (this.method === 'create') {\n await this.create(params);\n return;\n } else {\n await this.update(params);\n return;\n }\n }\n\n this.cancel();\n }\n\n async create(params: any = null) {\n if (this.loading) {\n return;\n }\n this.loading = true;\n try {\n await this.api.create({ ...this.model, ...params });\n this.toastr.success(this.message);\n this.ref.close(true);\n } catch (error: any) {\n this.toastr.error(FxUtils.parseError(error));\n } finally {\n this.loading = false;\n }\n }\n\n async update(params: any = null) {\n if (this.loading) {\n return;\n }\n this.loading = true;\n try {\n await this.api.update({ ...this.model, ...params });\n this.toastr.success(this.message);\n this.ref.close(true);\n } catch (error: any) {\n this.toastr.error(FxUtils.parseError(error));\n } finally {\n this.loading = false;\n }\n }\n\n async updateInfo(params: any = null) {\n if (this.loading) {\n return;\n }\n this.loading = true;\n try {\n await this.api.updateInfo({ ...this.model, ...params });\n this.toastr.success(this.message);\n this.ref.close(true);\n } catch (error: any) {\n this.toastr.error(FxUtils.parseError(error));\n } finally {\n this.loading = false;\n }\n }\n\n cancel() {\n this.ref.close(false);\n }\n\n validate() {\n return true;\n }\n}\n","import { Injectable, EventEmitter } from '@angular/core';\n\n/**\n * Overlay chặn màn cho HÀNH ĐỘNG của người dùng (bấm nút, đổi trạng thái,\n * xuất báo cáo…). `app.html` của host bind `fx-ui-loading-panel` vào\n * `listenerAction`.\n *\n * ⚠️ **KHÔNG dùng cho điều hướng.** Channel `listener` + `start()`/`stop()` đã\n * bị XOÁ ở 0.7.70 (Pha 3). Điều hướng dùng skeleton: `FxRouteSkeletonService`\n * đọc `data.skeleton` của route đích và shell dựng `fx-ui-route-skeleton`.\n *\n * Vì sao xoá thay vì để lại: trước đó cả 46 call site đổ chung MỘT channel, lẫn\n * hai ngữ nghĩa (điều hướng vs hành động). Sau khi skeleton thay phần điều\n * hướng, `listener` không còn ai nghe — để lại là một cái bẫy: gọi `start()`\n * tưởng có overlay mà thực tế không có gì hiện.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class FxLoadingService {\n public listenerAction = new EventEmitter<boolean>();\n\n startAction() {\n this.listenerAction.emit(true);\n }\n\n stopAction() {\n this.listenerAction.emit(false);\n }\n}\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport {\n ActivatedRouteSnapshot,\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n Router,\n RoutesRecognized,\n} from '@angular/router';\nimport {\n FxSkeletonBlock,\n FxSkeletonHint,\n} from '../../ui/components/route-skeleton/route-skeleton.component';\n\n/**\n * Khai trên route: `data: { skeleton: 'table' }` (tên preset) hoặc\n * `data: { skeleton: ['heading', 'toolbar', 'table'] }` (mảng block, mô tả\n * ĐÚNG layout của màn — bảng ra bảng, chart ra chart).\n */\nexport const FX_SKELETON_DATA_KEY = 'skeleton';\n\n/**\n * Đọc `data.skeleton` của route đích rồi bật/tắt skeleton cho vùng nội dung.\n *\n * ⚠️ Vì sao phải nghe router event chứ không để từng màn tự lo: Angular\n * **không tạo component cho tới khi resolver xong**, nên trong lúc resolver\n * của một màn chạy thì component đó chưa tồn tại — không có gì để vẽ\n * skeleton. Chỉ shell (tồn tại trước) làm được.\n *\n * Mốc dùng là `RoutesRecognized` — event ĐẦU TIÊN mang `RouterStateSnapshot`,\n * và nó xảy ra TRƯỚC `ResolveStart`. `NavigationStart` thì chưa biết route\n * đích nên không đọc được hint.\n */\n@Injectable({ providedIn: 'root' })\nexport class FxRouteSkeletonService {\n private readonly router = inject(Router);\n\n private readonly _hint = signal<FxSkeletonHint | FxSkeletonBlock[] | null>(null);\n\n /** Hint đang hiển thị, `null` = không vẽ skeleton. */\n readonly hint = this._hint.asReadonly();\n readonly active = computed(() => this._hint() !== null);\n\n /**\n * Điều hướng nhanh hơn mốc này thì KHÔNG vẽ skeleton — tránh nháy một\n * nhịp khi resolver trả về gần như tức thì (dữ liệu đã cache).\n */\n private readonly graceMs = 150;\n\n private timer?: ReturnType<typeof setTimeout>;\n private started = false;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.clearTimer());\n }\n\n /** Gọi một lần từ shell (host và mỗi remote standalone). */\n start(): void {\n if (this.started) return;\n this.started = true;\n\n this.router.events.subscribe((event) => {\n if (event instanceof RoutesRecognized) {\n const hint = readHint(event.state.root);\n this.clearTimer();\n if (!hint) {\n this._hint.set(null);\n return;\n }\n this.timer = setTimeout(() => {\n this.timer = undefined;\n this._hint.set(hint);\n }, this.graceMs);\n return;\n }\n\n if (\n event instanceof NavigationEnd ||\n event instanceof NavigationCancel ||\n event instanceof NavigationError\n ) {\n this.clearTimer();\n this._hint.set(null);\n }\n });\n }\n\n private clearTimer(): void {\n if (this.timer !== undefined) {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n }\n}\n\n/**\n * Lấy hint ở nhánh SÂU NHẤT có khai — để route cha đặt mặc định và route con\n * ghi đè được.\n */\nfunction readHint(root: ActivatedRouteSnapshot): FxSkeletonHint | FxSkeletonBlock[] | null {\n let node: ActivatedRouteSnapshot | null = root;\n let found: FxSkeletonHint | FxSkeletonBlock[] | null = null;\n\n while (node) {\n const value = node.data?.[FX_SKELETON_DATA_KEY];\n // Chấp nhận cả tên preset và mảng block; mảng rỗng coi như không khai.\n if (typeof value === 'string' && value) found = value as FxSkeletonHint;\n else if (Array.isArray(value) && value.length) found = value as FxSkeletonBlock[];\n node = node.firstChild;\n }\n\n return found;\n}\n","import { Injectable } from '@angular/core';\nimport { FxUtils } from '../utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FxStorageService {\n resolve(key: string, value?: any): any {\n if (FxUtils.isNotNull(value)) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n const loc = localStorage.getItem(key);\n return loc ? JSON.parse(loc) : undefined;\n }\n\n remove(key: string) {\n localStorage.removeItem(key);\n }\n}\n","import { Type, inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, ResolveFn, RouterStateSnapshot } from '@angular/router';\nimport { HttpWrapper } from '../services/http-wrapper.service';\nimport { FxToastrService } from '../services/toastr.service';\nimport { FxStorageService } from '../services/storage.service';\nimport { FxUtils } from '../utils';\nimport { FxLoadStatusService } from '../services/load-status.service';\n\nexport interface FxListRequest {\n /** Defaults to 'get'. */\n method?: 'get' | 'post';\n url: string;\n /** Query params (get) — for post they are sent as the body unless `body` is set. */\n params?: any;\n body?: any;\n}\n\nexport interface FxListResolverContext {\n /** Page size remembered for this route url (FxStorageService convention), default 10. */\n pageSize: number;\n}\n\n/**\n * Chạy MỘT request cho list resolver, lỗi thì hiện toast đã parse.\n *\n * ⚠️ KHÔNG còn bật overlay chặn màn: điều hướng dùng skeleton\n * (`FxRouteSkeletonService` + `data.skeleton` trên route). `BaseResolver` đã bị\n * xoá ở 0.7.70 — mọi resolver giờ là `@Injectable()` thuần hoặc dùng factory\n * này.\n *\n * Usage:\n * resolve: { histories: fxListResolver(ScanManagementApi, (route, state, ctx) =>\n * ({ url: `/${route.paramMap.get('id')}/history`, params: { page: 1, pageSize: ctx.pageSize } })) }\n */\nexport function fxListResolver<A extends HttpWrapper>(\n apiType: Type<A>,\n request: (\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot,\n ctx: FxListResolverContext,\n ) => FxListRequest,\n): ResolveFn<any> {\n return async (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const api = inject(apiType);\n const toastr = inject(FxToastrService);\n const storage = inject(FxStorageService);\n const status = inject(FxLoadStatusService);\n let end: (() => void) | null = null;\n try {\n const ctx: FxListResolverContext = { pageSize: storage.resolve(state.url) || 10 };\n const req = request(route, state, ctx);\n // Topbar \"Loading <x> · k of n\" — one job per resolver request.\n end = status.begin(FxLoadStatusService.labelFromUrl(req.url));\n if ((req.method ?? 'get') === 'post') {\n return await api.post(req.url, req.body ?? req.params ?? {});\n }\n return await api.get(req.url, req.params);\n } catch (err: any) {\n toastr.error(FxUtils.parseError(err), 'Error');\n return null;\n } finally {\n end?.();\n }\n };\n}\n","import { Provider, Type } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { HttpWrapper } from './http-wrapper.service';\n\nexport type FxApiClass = Type<HttpWrapper> & { provider: Provider };\n\n/**\n * Factory for the 11-line HttpWrapper subclasses copy-pasted per endpoint.\n * Returns a distinct injectable class per call (so constructor injection by\n * type keeps working) without needing a decorator:\n *\n * export const ScanManagementApi = createApi(() => `${environment.baseService}/scarf/scan`);\n * // module: providers: [ScanManagementApi.provider]\n * // usage: constructor(private api: InstanceType<typeof ScanManagementApi>)\n *\n * `baseURL` accepts a string or a lazy factory (for environment-derived URLs).\n * An optional `transform` plugs into HttpWrapper.transformResponse — e.g.\n * FxUtils.camelizeDeep for snake_case/Long-encoded backends.\n *\n * IMPORTANT — when subclassing (`@Injectable() class X extends createApi(...)`),\n * declare an explicit `constructor(http: HttpClient) { super(http); }`.\n * The generated base carries no Angular factory metadata, so an inherited\n * constructor makes Ivy fall back to `new X()` with NO arguments: the class\n * silently gets `http = undefined` and every call fails at runtime while the\n * build stays green.\n */\nexport function createApi(\n baseURL: string | (() => string),\n transform?: (res: any) => any,\n): FxApiClass {\n class GeneratedApi extends HttpWrapper {\n static provider: Provider = {\n provide: GeneratedApi,\n useFactory: (http: HttpClient) => new GeneratedApi(http),\n deps: [HttpClient],\n };\n\n constructor(http: HttpClient) {\n super(http, typeof baseURL === 'function' ? baseURL() : baseURL);\n }\n\n protected override transformResponse(res: any): any {\n return transform ? transform(res) : res;\n }\n }\n return GeneratedApi as FxApiClass;\n}\n","import { DestroyRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subscription } from 'rxjs';\nimport { NotificationService } from './notification.service';\n\nexport interface RealtimeTableEvent<T> {\n /** Value the event is matched to a row with (via `matchKey`). */\n key: any;\n /** Fields to merge onto the matched row. */\n patch: Partial<T>;\n /** Marks a final state (e.g. COMPLETED) — forwarded to `onApplied`. */\n terminal?: boolean;\n}\n\nexport interface RealtimeTableSyncOptions<T> {\n /** Hub event name to subscribe to (via NotificationService.on$). */\n event: string;\n /** Parse the raw payload; return null to ignore the event. */\n parse: (raw: any) => RealtimeTableEvent<T> | null;\n /** Current table rows (live reference is fine). */\n getRows: () => T[];\n /** Replace table rows (callers usually also trigger change detection here). */\n setRows: (rows: T[]) => void;\n /** Key events match rows on (e.g. row.analyzeCode). */\n matchKey: (row: T) => any;\n /**\n * Stable identity used when merging a background re-fetch into the current\n * rows (existing row objects are patched in place so the table keeps their\n * identity — no flash).\n */\n identityKey: (row: T) => any;\n /** Background list re-fetch used to pick up rows that don't exist yet. */\n fetchList: () => Promise<{ rows: T[]; total?: number } | null>;\n /** Called after a patch lands on a row (change detection, terminal enrich…). */\n onApplied?: (row: T, event: RealtimeTableEvent<T>) => void;\n /** Called when a background re-fetch produced a new total. */\n onTotal?: (total: number) => void;\n /** Debounce for the background sync (default 1200ms). */\n debounceMs?: number;\n /** Consecutive no-op syncs before giving up on buffered keys (default 3). */\n idleCap?: number;\n}\n\n/**\n * Live-progress plumbing for server-paginated tables fed by hub events:\n * events matching a visible row are merged in place; events for rows that\n * are not in the list yet (a just-created record whose list read lags) are\n * buffered by key and replayed after a debounced, idle-capped background\n * re-fetch that merges by stable identity.\n *\n * The domain contract (event name, payload parsing, terminal semantics) is\n * injected via options — nothing app-specific lives here.\n */\nexport class RealtimeTableSync<T = any> {\n private pending = new Map<any, RealtimeTableEvent<T>>();\n private syncTimer: ReturnType<typeof setTimeout> | null = null;\n private idleSyncs = 0;\n private stopped = false;\n private subscription: Subscription | null = null;\n\n constructor(\n private notifications: NotificationService,\n private options: RealtimeTableSyncOptions<T>,\n ) {}\n\n /**\n * Subscribe to the hub event. Pass a DestroyRef to tie teardown to a\n * component lifecycle; stop() is still available for manual control.\n */\n start(destroyRef?: DestroyRef): this {\n const source = this.notifications.on$(this.options.event);\n const piped = destroyRef ? source.pipe(takeUntilDestroyed(destroyRef)) : source;\n this.stopped = false;\n this.subscription = piped.subscribe((raw: any) => this.handleEvent(raw));\n if (destroyRef) {\n destroyRef.onDestroy(() => this.stop());\n }\n return this;\n }\n\n stop(): void {\n this.stopped = true;\n this.subscription?.unsubscribe();\n this.subscription = null;\n if (this.syncTimer) {\n clearTimeout(this.syncTimer);\n this.syncTimer = null;\n }\n this.pending.clear();\n }\n\n /**\n * Replay buffered events onto the current rows (call from setDataSource so\n * a regular refresh also applies buffered progress). Returns true if\n * anything was applied.\n */\n applyPending(): boolean {\n if (!this.pending.size) return false;\n let changed = false;\n for (const row of this.options.getRows()) {\n const key = this.options.matchKey(row);\n const event = this.pending.get(key);\n if (!event) continue;\n Object.assign(row as any, event.patch);\n this.pending.delete(key);\n changed = true;\n this.options.onApplied?.(row, event);\n }\n if (changed) {\n this.options.setRows([...this.options.getRows()]);\n }\n return changed;\n }\n\n private handleEvent(raw: any): void {\n const event = this.options.parse(raw);\n if (!event) return;\n\n const row = this.options.getRows().find((r) => this.options.matchKey(r) === event.key);\n if (!row) {\n // Not in the list yet (e.g. just-created record whose list read lags):\n // keep only the latest state per key and schedule a background sync.\n this.pending.set(event.key, event);\n this.scheduleSync();\n return;\n }\n this.idleSyncs = 0;\n Object.assign(row as any, event.patch);\n this.options.setRows([...this.options.getRows()]);\n this.options.onApplied?.(row, event);\n }\n\n private scheduleSync(): void {\n const idleCap = this.options.idleCap ?? 3;\n if (this.syncTimer || this.stopped || this.idleSyncs >= idleCap) return;\n this.syncTimer = setTimeout(async () => {\n this.syncTimer = null;\n await this.syncFromServer();\n }, this.options.debounceMs ?? 1200);\n }\n\n private async syncFromServer(): Promise<void> {\n try {\n const result = await this.options.fetchList();\n if (this.stopped || !result) return;\n const existingByIdentity = new Map(\n this.options.getRows().map((r) => [this.options.identityKey(r), r]),\n );\n const merged = result.rows.map((item) => {\n const existing = existingByIdentity.get(this.options.identityKey(item));\n if (existing) {\n Object.assign(existing as any, item); // reuse the object → stable identity\n return existing;\n }\n return item;\n });\n this.options.setRows(merged);\n if (result.total !== undefined) {\n this.options.onTotal?.(result.total);\n }\n const applied = this.applyPending();\n this.idleSyncs = applied ? 0 : this.idleSyncs + 1;\n if (this.pending.size) {\n this.scheduleSync();\n }\n } catch {\n // Background sync is best-effort; the next event retries.\n this.idleSyncs += 1;\n }\n }\n}\n","import { FxUtils } from './utils';\n\n/**\n * Shared value→colour rules for report/metric displays.\n *\n * Every metric that varies in meaning (severity, score, count…) gets ONE rule\n * so the colour is consistent everywhere and callers never hardcode a tone\n * for a value that can be good or bad. Domain-specific rules (EPSS, exploit\n * maturity, license categories…) stay in the consuming app — only the\n * mechanism and the org-wide rules live here.\n *\n * There is intentionally NO `default` text/bg colour in the theme, so rule\n * helpers return `null` for \"no meaningful value\" and the `toneText` /\n * `toneBg` / `toneBadge` wrappers fall back to a neutral class.\n *\n * Every emitted Tailwind UTILITY must appear below as a WHOLE literal string —\n * the Tailwind content scanner (v4 has no safelist) only sees complete class\n * names. Never rebuild those with string interpolation.\n *\n * ⚠️ Ngoại lệ có chủ đích: `tone-tint-*`, `tone-fg-*`, `tone-dot-*` và\n * `tone-dot-chart-*` là CLASS CSS THẬT khai trong components.css, KHÔNG phải\n * utility Tailwind — chúng luôn tồn tại trong stylesheet nên ghép chuỗi\n * `tone-fg-${tone}` là an toàn. Đó chính là lý do chọn class thay vì utility:\n * ngoài việc tránh xung đột tên (`warning` trong theme Tailwind trỏ vào bộ\n * LEGACY `--og-tone-*`), nó còn xoá hẳn bẫy \"class ghép chuỗi bị vô hình\".\n */\nexport type Tone = 'critical' | 'danger' | 'warning' | 'success' | 'information';\n\nconst NEUTRAL_TEXT = 'text-text-secondary';\nconst NEUTRAL_BG = 'bg-bg-hover';\n\n/**\n * ⚠️ Trỏ vào `.tone-fg-*` của hệ MỚI, KHÔNG còn `text-critical` (bộ LEGACY\n * vivid). Bỏ sót chỗ này chính là lý do badge/chữ trong list ở mọi tab vẫn\n * ra màu cũ sau khi đã đổi `TONE_BADGE` (anh Tú báo 03/09).\n */\nconst TONE_TEXT: Record<string, string> = {\n critical: 'tone-fg-critical',\n danger: 'tone-fg-danger',\n warning: 'tone-fg-warning',\n success: 'tone-fg-success',\n information: 'tone-fg-information',\n discovery: 'tone-fg-discovery',\n};\n\n/** Nền ĐẶC — dùng cho trạng thái đang chọn. Xem `.tone-solid-*`. */\nconst TONE_BG: Record<string, string> = {\n critical: 'tone-solid-critical',\n danger: 'tone-solid-danger',\n warning: 'tone-solid-warning',\n success: 'tone-solid-success',\n information: 'tone-solid-information',\n discovery: 'tone-solid-discovery',\n};\n\n/**\n * ⚠️ ĐỪNG dùng `toneBadge()` cho badge CÓ CHẤM bên trong: Critical ra nền\n * đen đặc nên chấm (đỏ sẫm) nằm trên đó gần như vô hình. Demo chỉ dùng biến\n * thể `solid` cho badge severity ĐỨNG MỘT MÌNH; badge kèm `StatusDot` luôn\n * dùng nền MỀM. Chỗ đó hãy dùng `toneScale()`.\n *\n * Tông severity — theo ĐÚNG mô hình đo trên demo 03/09: token semantic\n * (`--og-negative`…) chứ không phải bộ vivid `--og-tone-*`, và Critical được\n * nhấn bằng nền ĐEN ĐẶC thay vì màu rực. Định nghĩa ở `.tone-tint-*` trong\n * components.css — xem comment ở đó để biết lý do không dùng utility Tailwind.\n *\n * `tone-tint-*` chỉ mang MÀU. Hình dạng pill nằm ở `.tone-badge` riêng, nên\n * ô icon vuông / chip filter dùng được màu mà không bị bo tròn 999px.\n */\n/**\n * Cố tình KHÔNG khoá vào `Record<Tone, …>`: `FxUtils.getTagClass()` còn trả\n * `discovery` (và `default`), mà `discovery` có đúng một biến thể tương ứng\n * trong demo là `.og-badge--accent`. `default` không có key → rơi về neutral.\n */\nconst TONE_TINT: Record<string, string> = {\n critical: 'tone-tint-critical',\n danger: 'tone-tint-danger',\n warning: 'tone-tint-warning',\n success: 'tone-tint-success',\n information: 'tone-tint-information',\n discovery: 'tone-tint-discovery',\n};\n\nfunction hasVal(v: any): boolean {\n if (v == null) return false;\n const s = String(v).trim();\n return s !== '' && s !== '-' && s !== '--';\n}\n\n/** Severity / risk-level string → tone (Critical & High → danger, Medium → warning, Low → success). */\nexport function severityTone(value: any): Tone | null {\n if (!hasVal(value)) return null;\n const t = FxUtils.getTagClass(String(value), true);\n return t === 'default' || t === 'discovery' ? null : (t as Tone);\n}\n\n/**\n * CVSS-style 0–10 score → tone, following the CVSS v3 qualitative bands\n * (≥9 Critical, ≥7 High, ≥4 Medium, else Low). Backends occasionally send a\n * 0–100 scale, so values > 10 are normalised down by /10.\n */\nexport function scoreTone(score: any): Tone | null {\n let n = Number(score);\n if (!Number.isFinite(n) || n <= 0) return null;\n if (n > 10) n = n / 10;\n if (n >= 9) return 'critical';\n if (n >= 7) return 'danger';\n if (n >= 4) return 'warning';\n return 'success';\n}\n\n/**\n * Count of \"bad\" things → tone: 0 is good (success), anything positive is bad.\n * `positiveTone` sets how severe a non-zero count reads (default `danger`;\n * pass `critical` for the worst metrics, `warning` for milder ones).\n * Non-numeric values (e.g. \"--\") return null → neutral.\n */\nexport function countTone(count: any, positiveTone: Tone = 'danger'): Tone | null {\n const n = Number(count);\n if (!Number.isFinite(n)) return null;\n return n > 0 ? positiveTone : 'success';\n}\n\n/** Tone → text colour class, with a neutral fallback when there is no value. */\nexport function toneText(tone: Tone | null): string {\n return tone ? TONE_TEXT[tone] : NEUTRAL_TEXT;\n}\n\n/** Tone → background colour class, with a neutral fallback when there is no value. */\nexport function toneBg(tone: Tone | null): string {\n return tone ? TONE_BG[tone] : NEUTRAL_BG;\n}\n\n/** Tone → soft pill/badge classes (tinted bg + matching text), neutral fallback. */\n/**\n * Badge severity MẶC ĐỊNH — nền MỀM theo thang đo, Critical ra **đỏ sẫm**.\n *\n * ⚠️ Trước đây hàm này trả nền ĐẶC (`tone-tint-*`, Critical = đen `--og-text`)\n * vì demo có biến thể `.og-badge--solid`. Nhưng demo chỉ dùng biến thể đó ở\n * ĐÚNG MỘT chỗ — badge severity trong danh sách findings — còn app mình gọi\n * `toneBadge()` ở khắp nơi (`project-card`, `score-badge`, `list-row`,\n * `severity-badges`, `tab-group`, badge trong hàng…). Kết quả: pill đen tràn\n * ra mọi màn, anh Tú báo 3 lần (03/09). Nên MẶC ĐỊNH đảo về nền mềm; muốn\n * pill đen thì gọi `toneBadgeSolid()` một cách tường minh.\n */\nexport function toneBadge(tone: Tone | string | null | undefined): string {\n return `tone-badge ${toneScale(tone)}`;\n}\n\n/**\n * Badge severity nền ĐẶC (Critical = `--og-text`, chữ `--og-surface`) — đúng\n * `.og-badge--solid` của demo. CHỈ dùng cho badge severity đứng một mình ở\n * nơi cần nhấn mạnh nhất; đừng dùng cho badge có chấm bên trong (chấm sẽ chìm).\n */\nexport function toneBadgeSolid(tone: Tone | string | null | undefined): string {\n return `tone-badge ${toneTint(tone)}`;\n}\n\n/**\n * Nhận `string` rộng chứ không chỉ `Tone`: rất nhiều call site truyền kết quả\n * của `FxUtils.getTagClass()` / tone tự tính, vốn là `string`. Tone lạ →\n * neutral, thay vì sinh ra class rác như thời còn ghép chuỗi `'bg-' + tone`.\n */\nconst isTone = (t: unknown): t is string =>\n typeof t === 'string' && Object.prototype.hasOwnProperty.call(TONE_TINT, t);\n\n/**\n * Chỉ MÀU của tông, không kèm hình dạng pill — cho ô icon, chip, ô nền.\n *\n * ⚠️ Đây là họ SOLID: `tone-tint-critical` đặt `background: --og-text`\n * (gần đen) VÀ `color: --og-surface` (trắng) trên CÙNG element.\n *\n * Hệ quả bắt buộc nhớ:\n * 1. Chỉ dùng cho **badge một phần tử**. Với hộp nhiều dòng thì con sẽ cần màu\n * chữ riêng, và nếu con ghi đè bằng `toneFg()` (đỏ sẫm) thì thành đỏ sẫm\n * trên gần đen — không đọc được. Đã bị đúng vậy ở hộp RISK của\n * `info-binary-detail` (anh Tú 03/09).\n * 2. **KHÔNG** đặt `toneFg()` lên phần tử con của một phần tử đã có\n * `toneTint()` — nó phá màu tương phản mà `toneTint` vừa đặt.\n *\n * Hộp/khối nhiều dòng thì dùng `toneScale()`: nền nhạt (color-mix 12%) + chữ\n * đúng tông, con chỉ cần THỪA HƯỞNG.\n */\nexport function toneTint(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? TONE_TINT[tone] : 'tone-tint-neutral';\n}\n\n/**\n * CHỮ theo tông — dùng thành viên dễ đọc nhất của mỗi họ severity, KHÔNG phải\n * ramp chart (ramp có `warning #f59e0b` chỉ 2.15:1 trên nền trắng). Xem\n * `.tone-fg-*` trong components.css.\n */\nexport function toneFg(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? `tone-fg-${tone}` : 'tone-fg-neutral';\n}\n\n/**\n * Tông THANG ĐO — cho filter chip severity. Critical ra ĐỎ SẪM (nền mềm pha\n * từ ramp `--og-sev-*`) thay vì pill đen đặc của `toneTint()`: chip filter là\n * một thang đo, không phải badge severity của một finding. Xem `.tone-scale-*`.\n */\nexport function toneScale(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? `tone-scale-${tone}` : 'tone-scale-neutral';\n}\n\n/** Viền theo tông — cho panel trạng thái (dropzone upload…). */\nexport function toneBorder(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? `tone-border-${tone}` : 'tone-border-neutral';\n}\n\n/**\n * CHẤM trạng thái trong hàng (`● Confirmed`) — demo dùng màu SEMANTIC\n * (`.og-statusdot--*`), không phải ramp chart.\n */\nexport function toneDot(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? `tone-dot-${tone}` : 'tone-dot-neutral';\n}\n\n/**\n * CHẤM LEGEND của chart — phải TRÙNG màu cung donut nên dùng ramp\n * `--og-sev-*`. Đừng dùng cho chấm trạng thái trong hàng.\n */\nexport function toneDotChart(tone: Tone | string | null | undefined): string {\n return isTone(tone) ? `tone-dot-chart-${tone}` : 'tone-dot-chart-neutral';\n}\n\n/**\n * Tone → resolved CSS colour string for ECharts / canvas where a Tailwind\n * class can't be used (e.g. per-slice pie `itemStyle.color`). Emits the\n * legacy comma syntax — see FxUtils.convertColorFromVariable.\n */\nexport function toneColor(tone: Tone | null, alpha = 1): string {\n // Chart dùng ramp RIÊNG `--og-sev-*` (màu literal đo trên demo), không dùng\n // `--og-tone-*`. `information` không có trong ramp của demo (demo chỉ có 4\n // bậc Critical/High/Medium/Low) nên vẫn rơi về tone legacy.\n const SEV = new Set(['critical', 'danger', 'warning', 'success']);\n const name = tone ? (SEV.has(tone) ? `--og-sev-${tone}` : `--${tone}`) : '--text-secondary';\n return FxUtils.convertColorFromVariable(name, alpha, { legacyCommaSyntax: true });\n}\n","/**\n * Feature gating for the V2 rollout.\n *\n * Each app owns its own `environment.features` block, so the flags are passed\n * in rather than read here — the library has no environment of its own.\n *\n * readonly knowledge = featureEnabled(environment.features, 'knowledge');\n *\n * Why a helper instead of `environment.features?.x`: call sites were drifting\n * between truthy checks and `=== true`, some behind an `as any` cast that hides\n * a typo in the flag name. One function keeps the semantics identical\n * everywhere — a flag counts as on only when it is exactly `true`, so a missing\n * block, a missing key or a stale string value all read as off.\n */\nexport type FxFeatureFlags = Record<string, boolean | undefined> | undefined | null;\n\nexport function featureEnabled(flags: FxFeatureFlags, name: string): boolean {\n return flags?.[name] === true;\n}\n\n/** Convenience for templates that gate on several flags at once. */\nexport function anyFeatureEnabled(flags: FxFeatureFlags, ...names: string[]): boolean {\n return names.some((name) => featureEnabled(flags, name));\n}\n","import { ValidationErrors } from '@angular/forms';\n\nexport class FxValidators {\n /**\n * Name fields: firstName, lastName, groupName, projectName, displayName\n * Allows: letters (Unicode), spaces, hyphens, apostrophes, periods\n */\n static validateName(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[\\p{L}\\s'\\-.]{1,100}$/u;\n return regex.test(value) ? null : { invalidName: 'Only letters, spaces, hyphens, apostrophes, and periods are allowed (max 100 characters)' };\n }\n\n /**\n * Description fields\n * Allows: letters, digits, spaces, basic punctuation\n */\n static validateDescription(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[\\p{L}\\d\\s.,;:!?'/()\"&\\-\\n\\r]{1,500}$/u;\n return regex.test(value) ? null : { invalidDescription: 'Contains disallowed characters (max 500 characters)' };\n }\n\n /**\n * Email fields\n */\n static validateEmail(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return regex.test(value) ? null : { invalidEmail: 'Please enter a valid email address' };\n }\n\n /**\n * Phone fields\n * Allows: digits, optional leading +, spaces, hyphens, parentheses (7-15 digits)\n */\n static validatePhone(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^\\+?[\\d\\s\\-()]{7,20}$/;\n const digitCount = value.replace(/\\D/g, '').length;\n if (!regex.test(value) || digitCount < 7 || digitCount > 15) {\n return { invalidPhone: 'Please enter a valid phone number' };\n }\n return null;\n }\n\n /**\n * Code/identifier fields: server code, template code, templateId\n * Allows: alphanumeric, hyphens, underscores\n */\n static validateCode(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[a-zA-Z0-9_-]{1,50}$/;\n return regex.test(value) ? null : { invalidCode: 'Only letters, numbers, hyphens, and underscores are allowed (max 50 characters)' };\n }\n\n /**\n * Domain fields\n * Standard domain pattern with optional port\n */\n static validateDomain(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}(:\\d{1,5})?$/;\n return regex.test(value) ? null : { invalidDomain: 'Please enter a valid domain (e.g., mail.example.com)' };\n }\n\n /**\n * Subject fields (email subject)\n * Allows: letters, digits, spaces, common punctuation, template placeholders {{}}\n */\n static validateSubject(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[\\p{L}\\d\\s.,;:!?'/()\"&\\-{}]{1,200}$/u;\n return regex.test(value) ? null : { invalidSubject: 'Contains disallowed characters (max 200 characters)' };\n }\n\n /**\n * Tag fields\n * Allows: alphanumeric, hyphens, underscores, dots, spaces\n */\n static validateTag(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[a-zA-Z0-9_\\-.\\s]{1,50}$/;\n return regex.test(value) ? null : { invalidTag: 'Only letters, numbers, hyphens, underscores, dots, and spaces are allowed' };\n }\n\n /**\n * URL fields: proxy, masterUrl\n * Standard URL pattern\n */\n static validateUrl(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^https?:\\/\\/[a-zA-Z0-9\\-._~:/?#[\\]@!$&'()*+,;=%]{1,2000}$/;\n return regex.test(value) ? null : { invalidUrl: 'Please enter a valid URL (http:// or https://)' };\n }\n\n /**\n * Numeric string fields: timeout, memoryLimit, cpuCores\n * Allows: digits, optional decimal point\n */\n static validateNumeric(value: string): ValidationErrors | null {\n if (!value || value.toString().trim() === '') return null;\n const regex = /^\\d+(\\.\\d+)?$/;\n return regex.test(value.toString()) ? null : { invalidNumeric: 'Please enter a valid number' };\n }\n\n /**\n * Version fields (semver-like)\n * Allows: digits, dots, hyphens, plus, letters\n */\n static validateVersion(value: string): ValidationErrors | null {\n if (!value || value.trim() === '') return null;\n const regex = /^[a-zA-Z0-9.\\-+]{1,50}$/;\n return regex.test(value) ? null : { invalidVersion: 'Please enter a valid version (e.g., 1.0.0)' };\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\n\nexport function HttpLoaderFactory(http: HttpClient) {\n return new TranslateHttpLoader(http, '/assets/i18n/', '.json');\n}\n\n@NgModule({\n imports: [TranslateModule],\n exports: [TranslateModule]\n})\nexport class TranslationModule {\n static forRoot(): ModuleWithProviders<TranslationModule> {\n return {\n ngModule: TranslationModule,\n providers: [\n {\n provide: TranslateLoader,\n useFactory: HttpLoaderFactory,\n deps: [HttpClient]\n }\n ]\n };\n }\n\n static forChild(): ModuleWithProviders<TranslationModule> {\n return {\n ngModule: TranslationModule,\n providers: []\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslationService {\n private currentLangSubject = new BehaviorSubject<string>('en');\n readonly currentLang$ = this.currentLangSubject.asObservable();\n\n constructor(\n private translate: TranslateService,\n private http: HttpClient\n ) {\n // Default fallback\n this.translate.addLangs(['en', 'vi']);\n this.translate.setDefaultLang('en');\n }\n\n init(lang: string) {\n this.setLanguage(lang);\n }\n\n currentLang(): string {\n return this.translate.currentLang || this.translate.defaultLang;\n }\n\n setLanguage(lang: string) {\n this.translate.use(lang);\n this.currentLangSubject.next(lang);\n }\n\n loadTranslations(lang: string, path: string) {\n const url = `${path}${lang}.json`;\n this.http.get(url).subscribe({\n next: (translations: any) => {\n this.translate.setTranslation(lang, translations, true);\n },\n error: (err) => {\n console.warn(`[TranslationService] Failed to load ${url}`, err);\n }\n });\n }\n\n onLanguageChange(callback: (lang: string) => void) {\n this.currentLang$.subscribe(callback);\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PermissionService {\n private permissions: string[] = [];\n\n setPermissions(perms: string[]) {\n this.permissions = perms;\n }\n\n hasPermission(requiredPermissions: string[]): boolean {\n return requiredPermissions.some((permission: string) => this.permissions.includes(permission));\n }\n\n getPermissions(): string[] {\n return [...this.permissions];\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { PermissionService } from '../services/permissions.service';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector -- renaming is a breaking change for all host-app templates\n selector: '[hasPermission]'\n})\nexport class HasPermissionDirective {\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainerRef: ViewContainerRef,\n private permissionService: PermissionService\n ) {}\n\n @Input() set hasPermission(required: string | string[]) {\n const requiredPermissions = Array.isArray(required) ? required : [required];\n this.viewContainerRef.clear();\n if (this.permissionService.hasPermission(requiredPermissions)) {\n this.viewContainerRef.createEmbeddedView(this.templateRef);\n }\n }\n}\n","import { Directive, ElementRef, HostListener, inject, input } from '@angular/core';\nimport { NgControl } from '@angular/forms';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector -- renaming is a breaking change for all host-app templates\n selector: '[appTrimOnBlur]'\n})\nexport class TrimOnBlurDirective {\n readonly collapseWhitespace = input(false, { alias: \"appTrimOnBlurCollapse\" });\n\n /* Optional on purpose: the onBlur fallback below already handles the\n * no-form case, but the injection was required and crashed any unbound\n * input once the directive actually entered the compilation scope. */\n private ngControl = inject(NgControl, { optional: true });\n\n constructor(private el: ElementRef<HTMLInputElement>) {}\n\n @HostListener('blur')\n onBlur(): void {\n const native = this.el.nativeElement;\n if (!native) return;\n\n let value: string = native.value ?? '';\n\n if (this.collapseWhitespace()) {\n value = value.replace(/\\s+/g, ' ').trim();\n } else {\n value = value.trim();\n }\n\n if (native.value === value) return;\n\n native.value = value;\n\n if (this.ngControl && this.ngControl.control) {\n this.ngControl.control.setValue(value);\n } else {\n const ev = new Event('input', { bubbles: true });\n native.dispatchEvent(ev);\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, Router } from '@angular/router';\nimport { PermissionService } from '../services/permissions.service';\nimport { FxUtils } from '../utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PermissionGuard implements CanActivate {\n constructor(private permissionService: PermissionService, private router: Router) {}\n\n canActivate(route: any): boolean {\n const requiredPermissions = route.data?.['permissions'] as string[] | undefined;\n\n if (!requiredPermissions || this.permissionService.hasPermission(requiredPermissions)) {\n return true;\n }\n\n this.router.navigate(['/unauthorized']);\n return false;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthStateService {\n private _isLoggedIn$ = new BehaviorSubject<boolean | null>(null);\n readonly isLoggedIn$ = this._isLoggedIn$.asObservable();\n readonly unauthorized$ = new Subject<void>();\n\n constructor() {}\n\n setLoggedIn(value: boolean): void {\n this._isLoggedIn$.next(value);\n }\n\n get isLoggedIn(): boolean {\n return this._isLoggedIn$.value === true;\n }\n\n handleUnauthorized(): void {\n this.setLoggedIn(false);\n this.unauthorized$.next();\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n HttpEvent,\n HttpInterceptor,\n HttpHandler,\n HttpRequest,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { AuthStateService } from '../services/auth-state.service';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n private handlingUnauthorized = false;\n\n constructor(private authState: AuthStateService) {}\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n // Multi-tenant: all tenant domains hit one shared API endpoint, so the\n // backend can no longer resolve the tenant from the Host header. Send the\n // originating domain explicitly for tenant resolution.\n const cloned = req.clone({\n withCredentials: true,\n setHeaders: { 'X-Tenant-Domain': window.location.hostname },\n });\n\n return next.handle(cloned).pipe(\n catchError((error: HttpErrorResponse) => {\n if (error.status === 401 && !this.handlingUnauthorized) {\n this.handlingUnauthorized = true;\n this.authState.handleUnauthorized();\n setTimeout(() => {\n this.handlingUnauthorized = false;\n }, 2000);\n }\n return throwError(() => error);\n })\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n/** One row of a crumb's switcher panel. */\nexport interface BreadcrumbOption {\n label: string;\n value: string;\n /** Where picking the row navigates. */\n url: string;\n /** Muted trailing text (a risk chip, a date, a status). */\n meta?: string;\n}\n\n/**\n * V2 topbar (design 02/12/13): a crumb that names an entity — the project, the\n * analysed binary — is a bordered chip with a dropdown to switch to a sibling.\n * The caller owns the data: `load` runs on open and on every keystroke.\n */\nexport interface BreadcrumbSwitcher {\n /** Panel heading, e.g. \"Switch project\". */\n title: string;\n /** Search box placeholder; omit to render no search box. */\n filterPlaceholder?: string;\n /** Value of the option currently in scope — rendered with a check mark. */\n selected?: string;\n /** Options for the keyword ('' on open). Caller-translated labels. */\n load: (keyword: string) => Promise<BreadcrumbOption[]>;\n /** Copy for an empty result. */\n emptyLabel?: string;\n /** Quiet link under the options — \"View all projects\". */\n viewAll?: { label: string; url: string };\n /** Accent-soft CTA at the bottom — \"Create project\". */\n create?: { label: string; url: string };\n /** Options render in the mono face (binary identities). */\n mono?: boolean;\n}\n\nexport interface Breadcrumb {\n label: string;\n url?: string;\n code?: string;\n /**\n * Heroicon drawn in accent before the label. Setting it (or `switcher`)\n * turns the crumb into a chip — the design's project / analysis pickers.\n */\n icon?: string;\n /** Mono face for binary identities (\"rocketchat.exe · 4.8.1\"). */\n mono?: boolean;\n /** Dropdown to switch the entity this crumb names. */\n switcher?: BreadcrumbSwitcher;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BreadcrumbService {\n private breadcrumbs$ = new BehaviorSubject<Breadcrumb[]>([]);\n\n set(breadcrumbs: Breadcrumb[]) {\n this.breadcrumbs$.next(breadcrumbs);\n }\n\n get() {\n return this.breadcrumbs$.asObservable();\n }\n\n clear() {\n this.breadcrumbs$.next([]);\n }\n}\n","import { Injectable, Renderer2, RendererFactory2 } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/** The six OgeniumDashboards themes. */\nexport type OgTheme = 'porcelain' | 'charcoal' | 'ivory' | 'studio' | 'blueprint' | 'terminal';\n\nexport const OG_THEMES: readonly OgTheme[] = [\n 'porcelain',\n 'charcoal',\n 'ivory',\n 'studio',\n 'blueprint',\n 'terminal',\n];\n\nexport const OG_LIGHT_THEMES: readonly OgTheme[] = ['porcelain', 'ivory', 'terminal'];\n\n/** Display metadata for theme pickers — accent/page swatches are brand constants. */\nexport interface OgThemeMeta {\n name: OgTheme;\n label: string;\n accent: string;\n pageBg: string;\n dark: boolean;\n}\n\nexport const OG_THEME_META: readonly OgThemeMeta[] = [\n { name: 'porcelain', label: 'Porcelain', accent: '#4a7dbd', pageBg: '#f2f2f1', dark: false },\n { name: 'charcoal', label: 'Charcoal', accent: '#8fc866', pageBg: '#1a1811', dark: true },\n { name: 'ivory', label: 'Ivory', accent: '#d97757', pageBg: '#e8e6e1', dark: false },\n { name: 'studio', label: 'Studio', accent: '#5a8fd6', pageBg: '#0e0e10', dark: true },\n { name: 'blueprint', label: 'Blueprint', accent: '#e07a3a', pageBg: '#0e0e10', dark: true },\n { name: 'terminal', label: 'Terminal', accent: '#3a55d9', pageBg: '#e8e6e1', dark: false },\n];\n\n/**\n * Theme NGƯỜI DÙNG được chọn (anh Tú chốt 31/08): chỉ còn một cặp\n * light/dark. Bốn theme còn lại vẫn tồn tại đầy đủ trong theme.css và\n * setTheme() vẫn nhận — chúng dùng cho trang /themes của demo và cho\n * harness screenshot chạy ma trận 6 theme; chỉ **giấu khỏi picker**.\n * Muốn mở lại: thêm tên vào mảng này, không phải dựng lại token.\n */\nexport const OG_PICKER_THEMES: readonly OgTheme[] = ['porcelain', 'charcoal'];\n\n/** OG_THEME_META đã lọc theo OG_PICKER_THEMES — nguồn duy nhất cho mọi picker. */\nexport const OG_PICKER_THEME_META: readonly OgThemeMeta[] = OG_THEME_META.filter((t) =>\n OG_PICKER_THEMES.includes(t.name)\n);\n\n/**\n * V2 theme switching: one `data-og-theme` attribute on <html> selects the\n * --og-* token block (theme.css). During the migration window the service\n * also mirrors the legacy `light_theme` class on <body> so remotes built\n * against the pre-V2 stylesheet keep resolving the correct palette\n * (see the SKEW SHIELD note in theme.css).\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private renderer: Renderer2;\n private lightClass = 'light_theme';\n private theme$ = new BehaviorSubject<OgTheme>('porcelain');\n themeStorageKey = 'host-theme';\n\n constructor(rendererFactory: RendererFactory2) {\n this.renderer = rendererFactory.createRenderer(null, null);\n this.setTheme(this.readSavedTheme());\n }\n\n /** Primary API: activate one of the six V2 themes. */\n setTheme(theme: OgTheme) {\n if (!OG_THEMES.includes(theme)) theme = 'porcelain';\n\n this.renderer.setAttribute(document.documentElement, 'data-og-theme', theme);\n\n // Skew shim for not-yet-migrated remote stylesheets (.light_theme era).\n if (this.isLightTheme(theme)) {\n this.renderer.addClass(document.body, this.lightClass);\n } else {\n this.renderer.removeClass(document.body, this.lightClass);\n }\n\n localStorage.setItem(this.themeStorageKey, theme);\n this.theme$.next(theme);\n\n // detail.dark is the pre-V2 contract (chart rebuilds on it); detail.theme\n // is new. Listeners must re-read colors on EVERY event — two light themes\n // can differ even though `dark` did not change.\n window.dispatchEvent(\n new CustomEvent('theme-changed', { detail: { dark: !this.isLightTheme(theme), theme } })\n );\n }\n\n themeChanges(): Observable<OgTheme> {\n return this.theme$.asObservable();\n }\n\n getCurrentTheme(): OgTheme {\n return this.theme$.value;\n }\n\n isLight(): boolean {\n return this.isLightTheme(this.theme$.value);\n }\n\n /** @deprecated V2: use setTheme(). Maps light→porcelain, dark→charcoal. */\n setLightMode(enable: boolean) {\n this.setTheme(enable ? 'porcelain' : 'charcoal');\n }\n\n /** @deprecated V2: use setTheme(). Flips between the two default themes. */\n toggleTheme() {\n this.setTheme(this.isLight() ? 'charcoal' : 'porcelain');\n }\n\n getLogoPath(): string {\n return 'assets/images/logo.png';\n }\n\n private isLightTheme(theme: OgTheme): boolean {\n return OG_LIGHT_THEMES.includes(theme);\n }\n\n private readSavedTheme(): OgTheme {\n const saved = localStorage.getItem(this.themeStorageKey);\n // Migrate pre-V2 stored values.\n if (saved === 'light') return 'porcelain';\n if (saved === 'dark') return 'charcoal';\n return OG_THEMES.includes(saved as OgTheme) ? (saved as OgTheme) : 'porcelain';\n }\n}\n","import { Injectable } from '@angular/core';\nimport * as signalR from '@microsoft/signalr';\nimport { Observable } from 'rxjs';\n\nexport type NotificationCallback = (...args: any[]) => void;\n\nexport interface NotificationConnectOptions {\n headers?: any;\n accessTokenFactory?: () => string | Promise<string>;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationService {\n private hubConnection: signalR.HubConnection | null = null;\n private connectionStatus: 'disconnected' | 'connecting' | 'connected' = 'disconnected';\n\n /**\n * Single source of truth for subscriptions. The hub connection gets exactly\n * one dispatcher per event, so:\n * - off(event, callback) can remove one subscriber without nuking the rest\n * (hubConnection.off(event) removes every handler for the event);\n * - handlers registered before connect() are attached once connected;\n * - handlers survive a re-connect that builds a new HubConnection.\n */\n private handlers = new Map<string, Set<NotificationCallback>>();\n\n private connectPromise: Promise<void> | null = null;\n private lastHubUrl: string | null = null;\n private lastOptions?: NotificationConnectOptions;\n private manualDisconnect = false;\n private restartAttempts = 0;\n private restartTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Connect to SignalR Hub. Overlapping calls share the same in-flight\n * promise instead of building two competing connections.\n */\n async connect(hubUrl: string, options?: NotificationConnectOptions): Promise<void> {\n if (this.hubConnection && this.connectionStatus === 'connected') {\n return;\n }\n if (this.connectPromise) {\n return this.connectPromise;\n }\n\n this.connectPromise = this.doConnect(hubUrl, options).finally(() => {\n this.connectPromise = null;\n });\n return this.connectPromise;\n }\n\n private async doConnect(hubUrl: string, options?: NotificationConnectOptions): Promise<void> {\n try {\n this.connectionStatus = 'connecting';\n this.manualDisconnect = false;\n this.lastHubUrl = hubUrl;\n this.lastOptions = options;\n\n const connectionOptions: signalR.IHttpConnectionOptions = {\n skipNegotiation: true,\n transport: signalR.HttpTransportType.WebSockets,\n withCredentials: true, // Include cookies if any\n ...options\n };\n\n this.hubConnection = new signalR.HubConnectionBuilder()\n .withUrl(hubUrl, connectionOptions)\n .withAutomaticReconnect()\n .configureLogging(signalR.LogLevel.Information)\n .build();\n\n // A new HubConnection knows nothing about previous listeners:\n // re-attach one dispatcher per known event.\n for (const eventName of this.handlers.keys()) {\n this.attachDispatcher(eventName);\n }\n\n // Fires when the automatic-reconnect policy is exhausted (or the\n // server closes the socket). Restart with backoff unless the app\n // disconnected on purpose.\n this.hubConnection.onclose((error) => {\n this.connectionStatus = 'disconnected';\n if (error) {\n console.error('SignalR connection closed with error:', error);\n }\n if (!this.manualDisconnect) {\n this.scheduleRestart();\n }\n });\n\n this.hubConnection.onreconnecting(() => {\n this.connectionStatus = 'connecting';\n });\n\n this.hubConnection.onreconnected(() => {\n this.connectionStatus = 'connected';\n this.restartAttempts = 0;\n });\n\n await this.hubConnection.start();\n this.connectionStatus = 'connected';\n this.restartAttempts = 0;\n } catch (error) {\n this.connectionStatus = 'disconnected';\n console.error('Error connecting to SignalR hub:', error);\n throw error;\n }\n }\n\n private scheduleRestart(): void {\n if (this.restartTimer || !this.lastHubUrl) {\n return;\n }\n const delay = Math.min(30_000, 1_000 * 2 ** this.restartAttempts++);\n this.restartTimer = setTimeout(async () => {\n this.restartTimer = null;\n try {\n await this.connect(this.lastHubUrl!, this.lastOptions);\n } catch {\n this.scheduleRestart();\n }\n }, delay);\n }\n\n /**\n * Disconnect from SignalR Hub. Stops any pending auto-restart.\n */\n async disconnect(): Promise<void> {\n this.manualDisconnect = true;\n if (this.restartTimer) {\n clearTimeout(this.restartTimer);\n this.restartTimer = null;\n }\n if (this.hubConnection) {\n try {\n await this.hubConnection.stop();\n this.connectionStatus = 'disconnected';\n } catch (error) {\n console.error('Error disconnecting from SignalR hub:', error);\n }\n }\n }\n\n /**\n * Listen to a specific event from the server. Safe to call before\n * connect(): the handler is attached once the connection is up.\n */\n on(eventName: string, callback: NotificationCallback): void {\n let set = this.handlers.get(eventName);\n if (!set) {\n set = new Set<NotificationCallback>();\n this.handlers.set(eventName, set);\n this.attachDispatcher(eventName);\n }\n set.add(callback);\n }\n\n /**\n * Remove listener(s) for an event.\n * Prefer passing the callback (or using on$()): calling off(event) without\n * one removes EVERY handler for the event, including other features'.\n */\n off(eventName: string, callback?: NotificationCallback): void {\n const set = this.handlers.get(eventName);\n if (!set) {\n return;\n }\n if (callback) {\n set.delete(callback);\n } else {\n console.warn(\n `NotificationService.off('${eventName}') without a callback removes ALL handlers for this event. ` +\n 'Pass the callback registered with on(), or migrate to on$().'\n );\n set.clear();\n }\n if (set.size === 0) {\n this.handlers.delete(eventName);\n this.hubConnection?.off(eventName);\n }\n }\n\n /**\n * Observable stream of an event. Teardown removes exactly this\n * subscriber — the safe replacement for manual on()/off().\n * Emits the event's first argument (SignalR payloads are single-arg here).\n */\n on$<T = any>(eventName: string): Observable<T> {\n return new Observable<T>((subscriber) => {\n const callback: NotificationCallback = (payload: T) => subscriber.next(payload);\n this.on(eventName, callback);\n return () => this.off(eventName, callback);\n });\n }\n\n private attachDispatcher(eventName: string): void {\n if (!this.hubConnection) {\n return;\n }\n this.hubConnection.on(eventName, (...args: any[]) => this.dispatch(eventName, args));\n }\n\n private dispatch(eventName: string, args: any[]): void {\n const set = this.handlers.get(eventName);\n if (!set) {\n return;\n }\n // Copy: a callback may add/remove handlers while we iterate.\n for (const callback of [...set]) {\n try {\n callback(...args);\n } catch (error) {\n console.error(`Error in '${eventName}' notification handler:`, error);\n }\n }\n }\n\n /**\n * Invoke a method on the server\n * @param methodName - Name of the method to invoke\n * @param args - Arguments to pass to the method\n */\n async invoke(methodName: string, ...args: any[]): Promise<any> {\n if (!this.hubConnection || this.connectionStatus !== 'connected') {\n throw new Error('Not connected to SignalR hub');\n }\n\n try {\n return await this.hubConnection.invoke(methodName, ...args);\n } catch (error) {\n console.error(`Error invoking method ${methodName}:`, error);\n throw error;\n }\n }\n\n /**\n * Get current connection status\n */\n getConnectionStatus(): 'disconnected' | 'connecting' | 'connected' {\n return this.connectionStatus;\n }\n\n /**\n * Get connection ID\n */\n getConnectionId(): string | null {\n return this.hubConnection?.connectionId ?? null;\n }\n}\n","import { Component, Input, ViewEncapsulation, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n@Component({\n selector: 'fx-ui-button',\n templateUrl: './button.component.html',\n styleUrl: './button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, HeroIconComponent],\n})\nexport class ButtonComponent {\n @Input() label: string;\n readonly disabled = input(false);\n readonly buttonVariant = input<'default' | 'primary' | 'success' | 'cta' | 'alternative'>('alternative');\n @Input() icon?: any;\n readonly class = input<any>();\n readonly loading = input(false);\n /** Native button type. Defaults to 'button' so it never implicitly submits a form. */\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n /** Accessible name for icon-only usage (icon set, no label). */\n readonly ariaLabel = input('');\n readonly clicked = output<void>();\n\n onClick() {\n if (!this.disabled()) this.clicked.emit();\n }\n}\n","<button\n [attr.type]=\"type()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-busy]=\"loading() || null\"\n [class]=\"class()\"\n [ngClass]=\"{\n 'fx-btn--icon': !!icon && !label,\n 'btn-default': buttonVariant() === 'default',\n 'btn-primary': buttonVariant() === 'primary',\n 'btn-success': buttonVariant() === 'success',\n 'btn-cta': buttonVariant() === 'cta',\n 'btn-alternative': buttonVariant() === 'alternative',\n }\"\n [disabled]=\"disabled() || loading()\"\n (click)=\"onClick()\"\n>\n @if (loading()) {\n <div class=\"flex w-full items-center justify-center\" aria-hidden=\"true\">\n <svg\n [attr.fill]=\"\n buttonVariant() !== 'alternative' ? 'rgb(var(--text-primary))' : 'rgb(var(--primary))'\n \"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"4\" cy=\"12\" r=\"0\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_lo66\"\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_z0Or\"\n begin=\"spinner_lo66.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_JsnR\"\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_Aguh\"\n begin=\"spinner_JsnR.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\">\n <animate\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_hSjk\"\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_UHR2\"\n begin=\"spinner_hSjk.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\">\n <animate\n id=\"spinner_4v5M\"\n begin=\"0;spinner_z0Or.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"3;0\"\n fill=\"freeze\"\n />\n <animate\n id=\"spinner_OLMs\"\n begin=\"spinner_4v5M.end\"\n attributeName=\"cx\"\n dur=\"0.001s\"\n values=\"20;4\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_OLMs.end\"\n attributeName=\"r\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"0;3\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_UHR2.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"4;12\"\n fill=\"freeze\"\n />\n <animate\n begin=\"spinner_Aguh.end\"\n attributeName=\"cx\"\n calcMode=\"spline\"\n dur=\"0.5s\"\n keySplines=\".36,.6,.31,1\"\n values=\"12;20\"\n fill=\"freeze\"\n />\n </circle>\n </svg>\n </div>\n } @else {\n <ng-container>\n <div class=\"flex items-center justify-center gap-small\">\n @if (icon) {\n <fx-ui-hero-icon\n [icon]=\"icon\"\n [size]=\"16\"\n class=\"flex\"\n [ngClass]=\"{\n 'text-text-inverse': buttonVariant() === 'default',\n 'text-text-primary': buttonVariant() === 'alternative',\n 'text-accent-contrast': buttonVariant() === 'primary',\n 'text-surface': buttonVariant() === 'success',\n 'text-white': buttonVariant() === 'cta',\n }\"\n ></fx-ui-hero-icon>\n }\n @if (label) {\n <!-- text-box: optical centering — Archivo's leading floats ink up otherwise -->\n <div class=\"[text-box:trim-both_cap_alphabetic]\">{{ label }}</div>\n }\n </div>\n </ng-container>\n }\n</button>\n","import { Component, Inject, ChangeDetectionStrategy } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef, MatDialogTitle, MatDialogContent, MatDialogActions } from '@angular/material/dialog';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport { ButtonComponent } from '../../components/button/button.component';\n\n@Component({\n selector: 'fx-ui-confirmation-dialog',\n templateUrl: './confirmation.component.html',\n styleUrl: './confirmation.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatDialogTitle,\n CdkScrollable,\n MatDialogContent,\n MatDialogActions,\n ButtonComponent,\n ],\n})\nexport class ConfirmationDialogComponent {\n loading = false;\n title = '';\n message = '';\n cancelLabel = 'Cancel';\n confirmLabel = 'Submit';\n\n constructor(\n private ref: MatDialogRef<ConfirmationDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public bindings: any\n ) {\n this.title = bindings?.['title'];\n this.message = bindings?.['message'];\n this.cancelLabel = bindings?.['cancelLabel'];\n this.confirmLabel = bindings?.['confirmLabel'];\n }\n\n async accept() {\n this.loading = true;\n if (this.bindings?.['callback']) {\n await this.bindings.callback();\n this.loading = false;\n }\n this.ref.close(true);\n }\n\n cancel() {\n this.ref.close(false);\n }\n}\n","<div animate.enter=\"fade-in-animation\" class=\"dialog-container\">\n <h1 mat-dialog-title class=\"txt-heading-05 dialog-header\">{{ title }}</h1>\n <mat-dialog-content>\n <div class=\"txt-default\">{{ message }}</div>\n </mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <fx-ui-button class=\"mr-1\" [label]=\"cancelLabel\" (clicked)=\"cancel()\"></fx-ui-button>\n <fx-ui-button\n buttonVariant=\"primary\"\n class=\"mr-1\"\n [label]=\"confirmLabel\"\n (clicked)=\"accept()\"\n [loading]=\"loading\"\n class=\"min-w-[100px]\"\n ></fx-ui-button>\n </mat-dialog-actions>\n</div>\n","import { Injectable, TemplateRef, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { ConfirmationDialogComponent } from '../../ui/dialogs/confirmation/confirmation.component';\n\nexport interface FxConfirmOptions {\n title?: string;\n message?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n}\n\n/**\n * Thin façade over MatDialog so app code never imports @angular/material\n * directly (behavior-layer rule, Playbook §5.1). Same semantics — the\n * returned ref is the Material one, typed through this service.\n */\n@Injectable({ providedIn: 'root' })\nexport class FxDialogService {\n private dialog = inject(MatDialog);\n\n open<T, D = any, R = any>(\n component: ComponentType<T> | TemplateRef<T>,\n config?: MatDialogConfig<D>,\n ): MatDialogRef<T, R> {\n return this.dialog.open(component, config);\n }\n\n /** Standard confirmation flow — resolves true when the user confirms. */\n async confirm(options: FxConfirmOptions = {}): Promise<boolean> {\n // ConfirmationDialogComponent reads MAT_DIALOG_DATA as its bindings and\n // closes with true/false.\n const ref = this.dialog.open(ConfirmationDialogComponent, { data: { ...options } });\n return !!(await firstValueFrom(ref.afterClosed()));\n }\n\n closeAll(): void {\n this.dialog.closeAll();\n }\n}\n","import { ChangeDetectorRef, Directive, Input, inject } from '@angular/core';\nimport { ControlValueAccessor, NgControl, ValidationErrors } from '@angular/forms';\nimport { FxUtils } from '../../core/utils';\n\nexport type ErrorMessages = Record<string, any>;\n\n@Directive()\nexport abstract class FxComponent<T> implements ControlValueAccessor {\n /**\n * Injected via inject() rather than a constructor parameter: parameter\n * decorators (@Optional/@Self) are NOT inherited by subclasses, which used\n * to make every control crash when used without a form binding, or silently\n * bind to an ancestor's NgControl.\n */\n public ngControl = inject(NgControl, { optional: true, self: true });\n\n /** With OnPush, programmatic writes (form.setValue / setDisabledState) must\n * mark the view — CVA calls come from outside the component's own events. */\n protected cdr = inject(ChangeDetectorRef);\n\n @Input() disabled = false;\n\n value: T;\n public onChange: (value: T) => void = () => undefined;\n public onTouched: () => void = () => undefined;\n\n validationError?: ErrorMessages;\n errorMessages?: ErrorMessages;\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n setValue(value: T) {\n if (this.onChange) {\n this.onChange(value);\n }\n }\n\n onEnter(value: T) {\n if (this.onChange) {\n this.onChange(value);\n }\n }\n\n writeValue(value: T): void {\n // Pass through as-is. Coercing null to '' here broke boolean/number\n // controls; string controls that want '' as their empty value override.\n this.value = value;\n this.cdr.markForCheck();\n }\n\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n\n get invalid(): boolean {\n return !!(this.ngControl?.invalid && this.ngControl?.touched);\n }\n\n get errors(): Record<string, any> {\n return this.ngControl?.errors || {};\n }\n\n validate(validateFn?: (value: T) => ValidationErrors | null | undefined): void {\n if (this.invalid) return;\n if (validateFn) {\n const error = validateFn(this.value);\n if (FxUtils.isNotNull(error)) {\n this.setErrors(error ?? {});\n }\n }\n }\n\n public setErrors(error: ValidationErrors) {\n this.validationError = error;\n const control = this.ngControl?.control;\n if (!control) return;\n control.setErrors({ ...control.errors, ...error });\n }\n\n /**\n * Removes only the errors this component set imperatively via setErrors().\n * Errors owned by the validator pipeline (built-in or custom validators)\n * are left untouched.\n */\n public clearErrors() {\n const control = this.ngControl?.control;\n if (!control || !this.validationError) return;\n const remaining = { ...(control.errors || {}) };\n for (const key of Object.keys(this.validationError)) {\n delete remaining[key];\n }\n this.validationError = undefined;\n control.setErrors(Object.keys(remaining).length ? remaining : null);\n }\n\n getErrorMessage(label?: string): string | null {\n if (!this.errors) return null;\n const displayLabel = FxUtils.isStringEmpty(label ?? '') ? 'This field' : label;\n const defaultMessages: ErrorMessages = {\n required: `${displayLabel} is required`,\n minlength: `${displayLabel} minimum length is ${this.errors['minlength']?.requiredLength}`,\n email: 'Please enter a valid email',\n };\n const messages = { ...defaultMessages, ...this.validationError, ...this.errorMessages };\n const firstKey = Object.keys(this.errors)[0];\n return messages[firstKey] || `Invalid ${label ?? 'value'}`;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n Input,\n ChangeDetectionStrategy,\n input,\n output\n} from '@angular/core';\nimport { FxComponent } from '../fx-component.component';\nimport { NgClass } from '@angular/common';\n\n@Component({\n selector: 'fx-ui-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrl: './checkbox.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class CheckboxComponent extends FxComponent<any> implements AfterViewInit {\n @Input() label = '';\n readonly rounded = input<boolean>();\n readonly valueChange = output<boolean>();\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n override writeValue(value: any): void {\n this.value = value ?? false;\n }\n\n onInputChange(event: Event) {\n const checked = (event.target as HTMLInputElement).checked;\n this.value = checked;\n this.onChange(checked);\n this.valueChange.emit(checked);\n }\n\n markTouched() {\n this.onTouched();\n }\n}\n","<label\n class=\"flex items-center gap-normal cursor-pointer select-none\"\n [class.opacity-50]=\"disabled\"\n [class.cursor-not-allowed]=\"disabled\"\n>\n <!-- sr-only (not `hidden`): keeps the input focusable and in the a11y tree -->\n <input\n type=\"checkbox\"\n class=\"peer sr-only\"\n [checked]=\"value\"\n [disabled]=\"disabled\"\n (change)=\"onInputChange($event)\"\n (blur)=\"onTouched()\"\n />\n <span\n class=\"relative w-4 h-4 border rounded-full transition-colors duration-150 shrink-0 peer-focus-visible:ring-2 peer-focus-visible:ring-primary/50\"\n [ngClass]=\"{\n 'rounded-full': rounded(),\n 'rounded-sm': !rounded(),\n 'border-border-strong bg-transparent': !value,\n 'border-transparent bg-gradient-primary': value,\n }\"\n >\n <!-- Keep SVG space reserved always -->\n <span class=\"absolute inset-0 flex items-center justify-center\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-accent-contrast w-4 h-4 transition-opacity duration-150\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n [style.opacity]=\"value ? 1 : 0\"\n >\n <path d=\"M5 13l4 4L19 7\" />\n </svg>\n </span>\n </span>\n\n @if (label) {\n <span class=\"mb-0 txt-field-label\">{{ label }}</span>\n }\n</label>\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\n\n@Component({\n selector: 'fx-ui-circle-progress-bar',\n templateUrl: './circle-progress-bar.component.html',\n styleUrl: './circle-progress-bar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CircleProgressBar {\n readonly percent = input(0);\n readonly showPercent = input(false);\n\n readonly radius = 35;\n readonly stroke = 10;\n readonly normalizedRadius = this.radius - this.stroke / 2;\n readonly circumference = 2 * Math.PI * this.normalizedRadius;\n\n get dashOffset(): number {\n const clamped = Math.max(0, Math.min(100, this.percent()));\n return this.circumference - (clamped / 100) * this.circumference;\n }\n\n get ariaLabel(): string {\n return `${Math.round(this.percent())}%`;\n }\n}\n","<div class=\"flex items-center justify-center w-full h-full\">\n <svg\n class=\"transform -rotate-90 block\"\n [attr.viewBox]=\"'0 0 ' + radius * 2 + ' ' + radius * 2\"\n width=\"100%\"\n height=\"100%\"\n >\n <circle\n class=\"opacity-20\"\n [attr.cx]=\"radius\"\n [attr.cy]=\"radius\"\n [attr.r]=\"normalizedRadius\"\n [attr.stroke-width]=\"stroke\"\n fill=\"transparent\"\n stroke=\"currentColor\"\n ></circle>\n\n <circle\n class=\"stroke-current\"\n [attr.cx]=\"radius\"\n [attr.cy]=\"radius\"\n [attr.r]=\"normalizedRadius\"\n [attr.stroke-width]=\"stroke\"\n fill=\"transparent\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"circumference\"\n [attr.stroke-dashoffset]=\"dashOffset\"\n style=\"transition: stroke-dashoffset 300ms linear\"\n ></circle>\n\n @if(showPercent()){\n <text\n [attr.x]=\"radius\"\n [attr.y]=\"radius\"\n dominant-baseline=\"central\"\n text-anchor=\"middle\"\n class=\"text-xs font-medium\"\n fill=\"currentColor\"\n >\n {{ percent() }}%\n </text>\n }\n </svg>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n input\n} from '@angular/core';\nimport { ErrorMessages, FxComponent } from '../fx-component.component';\nimport { ValidationErrors } from '@angular/forms';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatTimepickerModule } from '@angular/material/timepicker';\nimport { MAT_DATE_LOCALE, provideNativeDateAdapter } from '@angular/material/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nlet nextPickerId = 0;\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/**\n * Date/time field backed by first-party Material pickers (mat-datepicker +\n * mat-timepicker, the latter first-party since Material 19) — replaces the\n * former @danielmoncada/angular-datetime-picker + moment adapter stack.\n *\n * The public contract is unchanged: the CVA value is a plain string\n * ('YYYY-MM-DD HH:mm' for type 'both', 'YYYY-MM-DD' for 'calendar',\n * 'HH:mm' for 'timer'), so existing forms keep working as-is.\n */\n@Component({\n selector: 'fx-ui-datetime-picker',\n templateUrl: './datetime-picker.component.html',\n styleUrl: './datetime-picker.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDatepickerModule, MatTimepickerModule, HeroIconComponent],\n providers: [\n provideNativeDateAdapter(),\n // en-GB display ⇒ DD/MM/YYYY + 24h — matches FxUtils.formatDateTime.\n { provide: MAT_DATE_LOCALE, useValue: 'en-GB' },\n ],\n})\nexport class DatetimePicker extends FxComponent<any> implements AfterViewInit {\n @Input() label?: string;\n readonly placeholder = input('Select date and time');\n readonly required = input(false);\n /** 'both' | 'calendar' | 'timer' — same values the Owl picker accepted. */\n readonly type = input<'both' | 'calendar' | 'timer'>('both');\n readonly minDate = input<any>();\n readonly maxDate = input<any>();\n @Input() override errorMessages: ErrorMessages = {};\n readonly validateFn = input<(date: string) => ValidationErrors | null>();\n\n readonly fieldId = `fx-datetime-${nextPickerId++}`;\n\n /** Internal Date the Material pickers operate on; `value` stays a string. */\n dateValue: Date | null = null;\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n this.ref.detectChanges();\n });\n }\n\n get showDate(): boolean {\n return this.type() !== 'timer';\n }\n get showTime(): boolean {\n return this.type() !== 'calendar';\n }\n get min(): Date | null {\n return this.toDate(this.minDate());\n }\n get max(): Date | null {\n return this.toDate(this.maxDate());\n }\n\n onBlur() {\n this.onTouched();\n this.validate(this.validateFn());\n }\n\n override writeValue(value: any): void {\n this.value = value ?? '';\n this.dateValue = this.toDate(value);\n this.ref.markForCheck();\n }\n\n onDateChange(date: Date | null): void {\n if (this.disabled) return;\n const next = date ? new Date(date) : null;\n // Keep the already-picked time when only the calendar part changes.\n if (next && this.dateValue) {\n next.setHours(this.dateValue.getHours(), this.dateValue.getMinutes(), 0, 0);\n }\n this.commit(next);\n }\n\n onTimeChange(time: Date | null): void {\n if (this.disabled || !time) return;\n const next = this.dateValue ? new Date(this.dateValue) : new Date();\n next.setHours(time.getHours(), time.getMinutes(), 0, 0);\n this.commit(next);\n }\n\n private commit(next: Date | null): void {\n this.dateValue = next;\n this.value = this.format(next);\n this.onChange(this.value);\n this.onTouched();\n this.ref.markForCheck();\n }\n\n private toDate(value: any): Date | null {\n if (!value) return null;\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value;\n // Accepted string shapes: 'YYYY-MM-DD', 'YYYY-MM-DD HH:mm[:ss]', 'HH:mm'.\n const s = String(value).trim();\n if (/^\\d{2}:\\d{2}/.test(s)) {\n const d = new Date();\n d.setHours(+s.slice(0, 2), +s.slice(3, 5), 0, 0);\n return d;\n }\n const d = new Date(s.replace(' ', 'T'));\n return isNaN(d.getTime()) ? null : d;\n }\n\n private format(d: Date | null): string {\n if (!d) return '';\n const date = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n const time = `${pad(d.getHours())}:${pad(d.getMinutes())}`;\n const type = this.type();\n if (type === 'calendar') return date;\n if (type === 'timer') return time;\n return `${date} ${time}`;\n }\n}\n","<div class=\"flex flex-col mb-4 w-full text-left\">\n @if (label) {\n <label class=\"txt-field-label\" [attr.for]=\"fieldId\">\n {{ label }}\n @if (required()) {\n <span class=\"txt-required\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n\n <div class=\"flex gap-normal\">\n @if (showDate) {\n <div class=\"relative flex-1\">\n <input\n [id]=\"fieldId\"\n [matDatepicker]=\"datePicker\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled\"\n [min]=\"min\"\n [max]=\"max\"\n [value]=\"dateValue\"\n (dateChange)=\"onDateChange($event.value)\"\n (click)=\"!disabled && datePicker.open()\"\n (blur)=\"onBlur()\"\n readonly\n class=\"input-default pr-9\"\n />\n <span\n (click)=\"!disabled && datePicker.open()\"\n class=\"absolute inset-y-0 right-0 flex items-center pr-2.5 cursor-pointer text-text-placeholder hover:text-text-primary transition-colors\"\n >\n <fx-ui-hero-icon icon=\"calendar\" [size]=\"20\" class=\"text-text-primary\"></fx-ui-hero-icon>\n </span>\n <mat-datepicker #datePicker></mat-datepicker>\n </div>\n }\n @if (showTime) {\n <div class=\"relative\" [class.flex-1]=\"!showDate\" [class.w-32]=\"showDate\">\n <input\n [matTimepicker]=\"timePicker\"\n placeholder=\"HH:mm\"\n [disabled]=\"disabled\"\n [value]=\"dateValue\"\n (valueChange)=\"onTimeChange($event)\"\n (click)=\"!disabled && timePicker.open()\"\n (blur)=\"onBlur()\"\n readonly\n class=\"input-default pr-9\"\n />\n <span\n (click)=\"!disabled && timePicker.open()\"\n class=\"absolute inset-y-0 right-0 flex items-center pr-2.5 cursor-pointer text-text-placeholder hover:text-text-primary transition-colors\"\n >\n <fx-ui-hero-icon icon=\"clock\" [size]=\"20\" class=\"text-text-primary\"></fx-ui-hero-icon>\n </span>\n <mat-timepicker #timePicker></mat-timepicker>\n </div>\n }\n </div>\n @if (invalid) {\n <div class=\"txt-invalid\">{{ getErrorMessage(label) }}</div>\n }\n</div>\n","import { Component, Input, ChangeDetectorRef, inject, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { NgStyle } from '@angular/common';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nexport interface UploadResult {\n files: File[];\n accepted: File[];\n rejected: { file: File; reason: string }[];\n}\n\n@Component({\n selector: 'fx-ui-dnd-upload',\n templateUrl: './dnd-upload.component.html',\n styleUrl: './dnd-upload.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgStyle, HeroIconComponent],\n})\nexport class DndUploadComponent {\n private cdr = inject(ChangeDetectorRef);\n readonly multiple = input(false);\n @Input() accept = '';\n readonly maxSizeMB = input(10);\n readonly strictSize = input(true);\n /** Icon name from heroicons (outline). Default: 'arrow-up-tray' */\n readonly icon = input('arrow-up-tray');\n /** CSS color value for accent (border, icon, link). Default uses --gradient-primary-start */\n readonly accentColor = input('');\n\n readonly fileDrop = output<File[]>();\n readonly fileClick = output<void>();\n readonly uploadComplete = output<File[]>();\n readonly uploadError = output<{\n file: File;\n reason: string;\n}>();\n\n isDragOver = false;\n private isOpening = false;\n\n get accentStyle(): Record<string, string> {\n const accentColor = this.accentColor();\n if (!accentColor) return {};\n return { '--dnd-accent': accentColor } as Record<string, string>;\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n this.isDragOver = true;\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n this.isDragOver = false;\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n this.isDragOver = false;\n\n if (!event.dataTransfer?.files?.length) return;\n const files = Array.from(event.dataTransfer.files);\n this.processFiles(files);\n }\n\n onAreaClick(inputEl: HTMLInputElement | null, event?: Event) {\n if (this.isOpening) return;\n this.isOpening = true;\n\n this.fileClick.emit();\n (event?.currentTarget as HTMLElement)?.blur?.();\n\n setTimeout(() => {\n inputEl?.click();\n this.isOpening = false;\n this.cdr.markForCheck();\n }, 0);\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n if (!input.files?.length) return;\n const files = Array.from(input.files);\n this.processFiles(files);\n input.value = '';\n }\n\n private processFiles(files: File[]) {\n const valid: File[] = [];\n\n const acceptedTypes = this.accept\n .split(',')\n .map((t) => t.trim().toLowerCase())\n .filter((t) => t);\n\n for (const file of files) {\n const sizeMB = file.size / 1024 / 1024;\n if (this.strictSize() && sizeMB > this.maxSizeMB()) {\n this.uploadError.emit({\n file,\n reason: `File too large: ${sizeMB.toFixed(2)} MB > ${this.maxSizeMB()} MB`,\n });\n continue;\n }\n if (acceptedTypes.length && !this.isAccepted(file, acceptedTypes)) {\n this.uploadError.emit({\n file,\n reason: `File type not allowed: \"${file.name}\"`,\n });\n continue;\n }\n valid.push(file);\n }\n if (valid.length) {\n this.fileDrop.emit(valid);\n this.onUpload(valid);\n }\n }\n\n private onUpload(files: File[]) {\n this.uploadComplete.emit(files);\n }\n\n private isAccepted(file: File, accepted: string[]): boolean {\n const fileType = file.type.toLowerCase();\n const fileExt = '.' + file.name.split('.').pop()!.toLowerCase();\n\n return accepted.some((a) => {\n if (a.startsWith('.')) {\n return a === fileExt;\n }\n if (a.endsWith('/*')) {\n return fileType.startsWith(a.replace('/*', ''));\n }\n return a === fileType;\n });\n }\n}\n","<div\n class=\"dnd-wrapper\"\n [ngStyle]=\"accentStyle\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <div\n role=\"button\"\n tabindex=\"0\"\n class=\"dnd-area\"\n [class.drag-over]=\"isDragOver\"\n (click)=\"onAreaClick(fileInput, $event)\"\n (keydown.enter)=\"onAreaClick(fileInput, $event)\"\n >\n <fx-ui-hero-icon\n [icon]=\"icon()\"\n [size]=\"40\"\n class=\"flex dnd-icon\"\n ></fx-ui-hero-icon>\n <div class=\"dnd-text\">\n <span class=\"dnd-link\">Click to upload</span>\n <span class=\"dnd-or\">or drag and drop</span>\n </div>\n <div class=\"dnd-hint\">\n @if (accept) {\n Accepted: {{ accept }}\n } @else {\n Any file type\n }\n — Max {{ maxSizeMB() }} MB\n </div>\n\n <input\n #fileInput\n type=\"file\"\n class=\"dnd-input\"\n [attr.multiple]=\"multiple() ? '' : null\"\n [attr.accept]=\"accept\"\n (change)=\"onFileSelected($event)\"\n />\n </div>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n Input,\n ChangeDetectionStrategy,\n input,\n output\n} from '@angular/core';\nimport { ValidationErrors } from '@angular/forms';\nimport { FxComponent } from '../fx-component.component';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { TrimOnBlurDirective } from '../../../core/directives/trim.directive';\n\nlet nextInputId = 0;\n\n@Component({\n selector: 'fx-ui-input',\n templateUrl: './input.component.html',\n styleUrls: ['./input.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n HeroIconComponent,\n MatTooltip,\n TrimOnBlurDirective,\n ],\n})\nexport class InputComponent extends FxComponent<string> implements AfterViewInit {\n @Input() label = '';\n @Input() tooltip = '';\n @Input() type = 'text';\n readonly placeholder = input('');\n @Input() override errorMessages: Record<string, string> = {};\n readonly required = input<string | boolean>(false);\n @Input() suffixIcon?: string;\n readonly class = input<any>();\n readonly maxlength = input<number>();\n readonly validateFn = input<(value: string) => ValidationErrors | null>();\n readonly blurred = output<void>();\n readonly focused = output<void>();\n readonly suffixClick = output<void>();\n /** Accessible name for the suffix icon button (it renders no text). */\n readonly suffixAriaLabel = input('');\n\n readonly fieldId = `fx-input-${nextInputId++}`;\n showPassword = false;\n validateError: ValidationErrors | null = null;\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n override writeValue(value: string): void {\n this.value = value ?? '';\n }\n\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n let newValue = input.value;\n\n const maxlength = this.maxlength();\n if (maxlength && newValue.length > maxlength) {\n newValue = newValue.slice(0, maxlength);\n input.value = newValue;\n }\n\n this.value = newValue;\n this.onChange(this.value);\n }\n\n onFocus() {\n this.clearErrors();\n this.focused.emit();\n }\n\n onBlur() {\n this.onTouched();\n this.blurred.emit();\n const validateFn = this.validateFn();\n if (validateFn) {\n this.validateError = validateFn(this.value);\n this.validate(validateFn);\n }\n }\n\n togglePassword(): void {\n this.showPassword = !this.showPassword;\n }\n\n onSuffixClick(): void {\n if (this.type === 'password') {\n this.togglePassword();\n } else {\n this.suffixClick.emit();\n }\n }\n\n get displayType(): string {\n if (this.type === 'password' && this.showPassword) return 'text';\n if (this.type === 'otp') return 'number';\n return this.type;\n }\n}\n","<div class=\"mb-4 text-left w-full text-text-primary\" [class]=\"class()\">\n @if (label) {\n <label class=\"block txt-field-label\" [attr.for]=\"fieldId\">\n {{ label }}\n @if (required()) {\n <span class=\"txt-required\" aria-hidden=\"true\">*</span>\n }\n @if (tooltip) {\n <fx-ui-hero-icon\n icon=\"information-circle\"\n [size]=\"16\"\n class=\"inline-block align-middle ml-0.5 text-text-secondary cursor-help relative -top-px\"\n [matTooltip]=\"tooltip\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n ></fx-ui-hero-icon>\n }\n </label>\n }\n\n <div class=\"relative\">\n <input\n appTrimOnBlur\n [appTrimOnBlurCollapse]=\"true\"\n [id]=\"fieldId\"\n [type]=\"displayType\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.maxlength]=\"maxlength()\"\n [attr.aria-invalid]=\"invalid || null\"\n [attr.aria-describedby]=\"invalid ? fieldId + '-error' : null\"\n [attr.aria-required]=\"required() ? true : null\"\n [class]=\"type === 'otp' ? 'input-otp' : 'input-default'\"\n [class.input-invalid]=\"invalid\"\n [class.pr-8]=\"type === 'password' || suffixIcon\"\n [class.txt-otp-input]=\"type === 'otp'\"\n />\n @if (type === 'password' || suffixIcon) {\n <button\n type=\"button\"\n class=\"absolute inset-y-0 right-2 flex items-center text-text-primary hover:text-text-secondary\"\n (click)=\"onSuffixClick()\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"\n type === 'password'\n ? (showPassword ? 'Hide password' : 'Show password')\n : (suffixAriaLabel() || null)\n \"\n [attr.aria-pressed]=\"type === 'password' ? showPassword : null\"\n >\n @if (type === 'password') {\n <fx-ui-hero-icon\n [icon]=\"showPassword ? 'eye-slash' : 'eye'\"\n [size]=\"18\"\n class=\"text-text-primary\"\n aria-hidden=\"true\"\n ></fx-ui-hero-icon>\n } @else if (suffixIcon) {\n <fx-ui-hero-icon\n [icon]=\"suffixIcon\"\n [size]=\"18\"\n class=\"text-text-primary\"\n aria-hidden=\"true\"\n ></fx-ui-hero-icon>\n }\n </button>\n }\n </div>\n\n @if (invalid) {\n <div class=\"txt-invalid\" role=\"alert\" [id]=\"fieldId + '-error'\">\n {{ getErrorMessage(label) }}\n </div>\n }\n</div>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\n\n@Component({\n selector: 'fx-ui-loading-panel',\n templateUrl: './loading-panel.component.html',\n styleUrl: './loading-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LoadingPanel {\n readonly show = input(false);\n @Input() message?: string = \"Loading\";\n}\n","<!-- Full-screen glass overlay -->\n@if (show()) {\n <div\n class=\"fixed inset-0 z-50 flex items-center justify-center\"\n aria-hidden=\"false\"\n role=\"alert\"\n aria-busy=\"true\"\n >\n <div class=\"absolute inset-0 bg-bg-primary/30 backdrop-blur-xl\" aria-hidden=\"true\"></div>\n <div\n class=\"relative z-10 flex flex-col items-center gap-4 p-6 rounded-2xl shadow-xl bg-bg-primary/70 border border-border-strong backdrop-bg-primary/70\"\n style=\"min-width: 220px; max-width: 90%\"\n >\n <svg fill=\"url(#spinner-gradient)\" width=\"50\" height=\"50\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <linearGradient id=\"spinner-gradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" style=\"stop-color: rgb(var(--gradient-primary-start)); stop-opacity: 1\" />\n <stop offset=\"100%\" style=\"stop-color: rgb(var(--gradient-primary-end)); stop-opacity: 1\" />\n </linearGradient>\n </defs>\n <circle cx=\"4\" cy=\"12\" r=\"0\">\n <animate begin=\"0;spinner_z0Or.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"0;3\" fill=\"freeze\"/>\n <animate begin=\"spinner_OLMs.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"4;12\" fill=\"freeze\"/>\n <animate begin=\"spinner_UHR2.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"12;20\" fill=\"freeze\"/>\n <animate id=\"spinner_lo66\" begin=\"spinner_Aguh.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"3;0\" fill=\"freeze\"/>\n <animate id=\"spinner_z0Or\" begin=\"spinner_lo66.end\" attributeName=\"cx\" dur=\"0.001s\" values=\"20;4\" fill=\"freeze\"/>\n </circle>\n <circle cx=\"4\" cy=\"12\" r=\"3\">\n <animate begin=\"0;spinner_z0Or.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"4;12\" fill=\"freeze\"/>\n <animate begin=\"spinner_OLMs.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"12;20\" fill=\"freeze\"/>\n <animate id=\"spinner_JsnR\" begin=\"spinner_UHR2.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"3;0\" fill=\"freeze\"/>\n <animate id=\"spinner_Aguh\" begin=\"spinner_JsnR.end\" attributeName=\"cx\" dur=\"0.001s\" values=\"20;4\" fill=\"freeze\"/>\n <animate begin=\"spinner_Aguh.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"0;3\" fill=\"freeze\"/>\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\">\n <animate begin=\"0;spinner_z0Or.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"12;20\" fill=\"freeze\"/>\n <animate id=\"spinner_hSjk\" begin=\"spinner_OLMs.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"3;0\" fill=\"freeze\"/>\n <animate id=\"spinner_UHR2\" begin=\"spinner_hSjk.end\" attributeName=\"cx\" dur=\"0.001s\" values=\"20;4\" fill=\"freeze\"/>\n <animate begin=\"spinner_UHR2.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"0;3\" fill=\"freeze\"/>\n <animate begin=\"spinner_Aguh.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"4;12\" fill=\"freeze\"/>\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\">\n <animate id=\"spinner_4v5M\" begin=\"0;spinner_z0Or.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"3;0\" fill=\"freeze\"/>\n <animate id=\"spinner_OLMs\" begin=\"spinner_4v5M.end\" attributeName=\"cx\" dur=\"0.001s\" values=\"20;4\" fill=\"freeze\"/>\n <animate begin=\"spinner_OLMs.end\" attributeName=\"r\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"0;3\" fill=\"freeze\"/>\n <animate begin=\"spinner_UHR2.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"4;12\" fill=\"freeze\"/>\n <animate begin=\"spinner_Aguh.end\" attributeName=\"cx\" calcMode=\"spline\" dur=\"0.5s\" keySplines=\".36,.6,.31,1\" values=\"12;20\" fill=\"freeze\"/>\n </circle>\n </svg>\n @if (message) {\n <div class=\"text-sm text-text-primary text-center\">\n {{ message }}\n </div>\n }\n </div>\n </div>\n}\n","import { AfterViewInit, ChangeDetectorRef, Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { ErrorMessages, FxComponent } from '../fx-component.component';\nimport { NgClass } from '@angular/common';\n\nlet nextToggleGroupId = 0;\n\n@Component({\n selector: 'fx-ui-radio-toggle, [fx-ui-radio-toggle]',\n templateUrl: './radio-button-toggle.component.html',\n styleUrl: './radio-button-toggle.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class RadioButtonToggleComponent extends FxComponent<any> implements AfterViewInit {\n readonly groupId = `fx-radio-toggle-${nextToggleGroupId++}`;\n @Input() label?: string;\n readonly required = input<boolean | undefined>(false);\n readonly options = input<{\n label: string;\n value: any;\n icon?: any;\n}[]>([]);\n @Input() override errorMessages: ErrorMessages = {};\n readonly class = input<any>();\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n onSelectValue(value: any): void {\n if (this.disabled) return;\n this.value = value;\n this.onChange(value);\n this.onTouched();\n }\n}\n","<div class=\"flex flex-col text-left mb-4 w-full\" [class]=\"class()\">\n <!-- A radiogroup has no single control a <label> could point at — name it via aria-labelledby. -->\n @if(label){<span class=\"txt-field-label\" [id]=\"groupId + '-label'\">\n {{ label }}\n @if(required()) {<span class=\"txt-required\" aria-hidden=\"true\">*</span>} </span\n >}\n\n <div\n class=\"inline-flex w-full rounded-lg overflow-hidden\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label ? groupId + '-label' : null\"\n >\n @for(opt of options(); track opt){<button\n type=\"button\"\n role=\"radio\"\n [attr.aria-checked]=\"value === opt.value\"\n (click)=\"onSelectValue(opt.value)\"\n [disabled]=\"disabled\"\n [class.text-strong]=\"value !== opt.value\"\n class=\"flex-1 bg-bg-primary flex items-center pl-normal gap-normal h-10 rounded-md hover:bg-bg-hover transition-all duration-150 disabled:opacity-60 disabled:cursor-not-allowed\"\n >\n <span\n [ngClass]=\"{\n 'radio-checked': value === opt.value,\n 'radio-uncheck': value !== opt.value\n }\"\n class=\"radio-container\"\n >\n @if(value === opt.value) {<span class=\"radio-dot\"></span>}\n </span>\n\n <span class=\"txt-field-label mb-0\">{{ opt.label }}</span></button\n >}\n </div>\n\n @if(invalid){\n <div class=\"txt-invalid\">{{ getErrorMessage(label) }}</div>\n }\n</div>\n","import { AfterViewInit, ChangeDetectorRef, Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { ErrorMessages, FxComponent } from '../fx-component.component';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { NgClass } from '@angular/common';\n\nexport interface IRadioButton {\n label: string;\n value: any;\n description?: string;\n tooltip?: string;\n}\n\nlet nextRadioGroupId = 0;\n\n@Component({\n selector: 'fx-ui-radio',\n templateUrl: './radio-button.component.html',\n styleUrls: ['./radio-button.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n HeroIconComponent,\n MatTooltip,\n NgClass,\n ],\n})\nexport class RadioButtonComponent extends FxComponent<IRadioButton> implements AfterViewInit {\n readonly groupId = `fx-radio-${nextRadioGroupId++}`;\n @Input() label?: string;\n @Input() tooltip = '';\n readonly required = input<boolean | undefined>(false);\n readonly options = input<{\n label: string;\n value: any;\n icon?: any;\n tooltip?: string;\n}[]>([]);\n @Input() override errorMessages: ErrorMessages = {};\n readonly class = input<any>();\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n onSelectValue(value: any): void {\n if (this.disabled) return;\n this.value = value;\n this.onChange(value);\n this.onTouched();\n }\n}\n","<div\n class=\"w-full rounded-lg overflow-hidden\"\n [class]=\"class()\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label ? groupId + '-label' : null\"\n >\n <!-- A radiogroup has no single control a <label> could point at — name it via aria-labelledby. -->\n @if (label) {\n <span class=\"txt-field-label block\" [id]=\"groupId + '-label'\">\n {{ label }}\n @if (required()) {\n <span class=\"txt-required\" aria-hidden=\"true\">*</span>\n }\n @if (tooltip) {\n <fx-ui-hero-icon\n icon=\"information-circle\"\n [size]=\"16\"\n class=\"inline-block align-middle ml-0.5 text-text-secondary cursor-help relative -top-px\"\n [matTooltip]=\"tooltip\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n ></fx-ui-hero-icon>\n }\n </span>\n }\n\n @for (opt of options(); track opt) {\n <button\n type=\"button\"\n role=\"radio\"\n [attr.aria-checked]=\"value === opt.value\"\n (click)=\"onSelectValue(opt.value)\"\n [disabled]=\"disabled\"\n [class.text-strong]=\"value !== opt.value\"\n class=\"flex-1 px-normal w-full flex items-center gap-normal h-10 rounded-md hover:bg-bg-hover transition-all duration-150 disabled:opacity-60 disabled:cursor-not-allowed\"\n [matTooltip]=\"opt.tooltip || ''\"\n matTooltipPosition=\"right\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n >\n <span\n [ngClass]=\"{\n 'radio-checked': value === opt.value,\n 'radio-uncheck': value !== opt.value,\n }\"\n class=\"radio-container\"\n >\n @if (value === opt.value) {\n <span class=\"radio-dot\"></span>\n }\n </span>\n <span class=\"txt-default mb-0\">{{ opt.label }}</span>\n </button>\n }\n @if (invalid) {\n <div class=\"txt-invalid\">\n {{ getErrorMessage(label) }}\n </div>\n }\n</div>\n","import { AfterViewInit, ChangeDetectorRef, Component, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { FxComponent } from '../fx-component.component';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n@Component({\n selector: 'fx-ui-search-bar',\n templateUrl: './search-bar.component.html',\n styleUrl: './search-bar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class SearchBarComponent extends FxComponent<string> implements AfterViewInit {\n /** FxComponent leaves `value` undefined; without ngModel the input would\n render the literal string \"undefined\". */\n override value = '';\n\n readonly placeholder = input('Search...');\n readonly search = output<string>();\n readonly valueChange = output<string>();\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n override writeValue(value: string): void {\n this.value = value ?? '';\n }\n \n onValueChange(value: string) {\n this.value = value;\n this.setValue(value);\n this.valueChange.emit(value);\n }\n\n onEnterKey() {\n this.onEnter(this.value);\n this.search.emit(this.value.trim());\n }\n\n clear() {\n this.value = '';\n this.setValue(this.value);\n this.valueChange.emit('');\n this.search.emit('');\n }\n}\n","<div class=\"relative\">\n <fx-ui-hero-icon icon=\"magnifying-glass\" [size]=\"18\" class=\"absolute left-1 top-[3px] text-text-primary\"></fx-ui-hero-icon>\n <input\n type=\"text\"\n class=\"input-default px-9\"\n [attr.placeholder]=\"placeholder()\"\n [disabled]=\"disabled\"\n [value]=\"value\"\n (input)=\"onValueChange($any($event.target).value)\"\n (keydown.enter)=\"onEnterKey()\"\n />\n\n @if (value && !disabled) {\n <button\n type=\"button\"\n class=\"absolute inset-y-0 right-2 flex items-center text-text-primary hover:text-text-secondary\"\n (click)=\"clear()\"\n aria-label=\"Clear\"\n >\n <i class=\"material-symbols-outlined text-lg select-none\">close</i>\n </button>\n }\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n Input,\n OnChanges,\n OnInit,\n SimpleChanges,\n inject, ChangeDetectionStrategy,\n input,\n output\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FxComponent } from '../fx-component.component';\nimport { Subject, debounceTime, distinctUntilChanged } from 'rxjs';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { MatFormField, MatSelect, MatOption } from '@angular/material/select';\nimport { FormsModule } from '@angular/forms';\n\nlet nextSelectId = 0;\n\n@Component({\n selector: 'fx-ui-select',\n templateUrl: './select.component.html',\n styleUrls: ['./select.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n HeroIconComponent,\n MatTooltip,\n MatFormField,\n MatSelect,\n FormsModule,\n MatOption,\n ],\n})\nexport class SelectComponent\n extends FxComponent<string | string[]>\n implements AfterViewInit, OnInit, OnChanges\n{\n @Input() label = '';\n @Input() tooltip = '';\n readonly placeholder = input('');\n readonly options = input<{\n label: string;\n value: string;\n}[]>([]);\n readonly multiple = input(false);\n @Input() override errorMessages: Record<string, string> = {};\n readonly required = input(false);\n readonly class = input<any>();\n readonly enableSearch = input(false);\n readonly searchFn = input<(query: string) => Promise<{\n label: string;\n value: string;\n}[]>>();\n /** Emits the current value when the select panel closes (useful for multiple mode). */\n readonly closed = output<string | string[]>();\n\n readonly fieldId = `fx-select-${nextSelectId++}`;\n searchTerm = '';\n filteredOptions: { label: string; value: string }[] = [];\n private search$ = new Subject<string>();\n private destroyRef = inject(DestroyRef);\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n\n // mat-select treats '' as \"nothing selected\"; keep the legacy empty value.\n override writeValue(value: string | string[]): void {\n this.value = value ?? '';\n }\n\n ngOnInit(): void {\n this.filteredOptions = this.options();\n\n this.search$\n .pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe((term) => this.performSearch(term));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Sync the rendered list when options arrive/refresh asynchronously\n // (ngOnInit captures the initial — often empty — array only).\n if (changes['options']) {\n this.filteredOptions = this.options() ?? [];\n this.ref?.detectChanges();\n }\n }\n ngAfterViewInit(): void {\n this.ref.detectChanges();\n }\n\n onOpened(open: boolean) {\n if (open) {\n this.filteredOptions = this.options();\n if (this.enableSearch()) this.searchTerm = '';\n } else {\n this.closed.emit(this.value);\n }\n }\n\n onSearchChange(value: string) {\n if (!this.enableSearch()) return;\n this.search$.next(value);\n }\n\n async performSearch(term: string) {\n if (!this.enableSearch()) return;\n \n const searchFn = this.searchFn();\n if (!searchFn) {\n this.filteredOptions = this.options().filter((o) =>\n o.label?.toLowerCase().includes(term.toLowerCase())\n );\n this.ref.detectChanges();\n return;\n }\n \n const result = await searchFn(term);\n this.filteredOptions = result;\n\n Promise.resolve().then(() => this.ref.detectChanges());\n }\n\n onSelectionChange(value: any): void {\n this.value = value;\n this.onChange(this.value);\n }\n\n isSelected(value: string): boolean {\n if (Array.isArray(this.value)) {\n return this.value.includes(value);\n }\n return this.value === value;\n }\n}\n","<div class=\"mb-4 text-left w-full\" [class]=\"class()\">\n @if (label) {\n <label class=\"block txt-field-label\" [attr.for]=\"fieldId\">\n {{ label }}\n @if (required()) {\n <span class=\"txt-required\" aria-hidden=\"true\">*</span>\n }\n @if (tooltip) {\n <fx-ui-hero-icon\n icon=\"information-circle\"\n [size]=\"16\"\n class=\"inline-block align-middle ml-0.5 text-text-secondary cursor-help relative -top-px\"\n [matTooltip]=\"tooltip\"\n matTooltipPosition=\"above\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n ></fx-ui-hero-icon>\n }\n </label>\n }\n\n <mat-form-field\n [attr.invalid]=\"invalid || null\"\n class=\"fx-select-field w-full shadow-sm\"\n appearance=\"fill\"\n >\n <mat-select\n [id]=\"fieldId\"\n [required]=\"!!required()\"\n [attr.aria-invalid]=\"invalid || null\"\n [attr.aria-describedby]=\"invalid ? fieldId + '-error' : null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple()\"\n [value]=\"value\"\n (selectionChange)=\"onSelectionChange($event.value)\"\n (openedChange)=\"onOpened($event)\"\n (blur)=\"onTouched()\"\n >\n @if (enableSearch()) {\n <div class=\"px-semi w-full\">\n <input\n type=\"text\"\n aria-label=\"Search\"\n [placeholder]=\"'Search'\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\"\n (click)=\"$event.stopPropagation()\"\n class=\"text-text-primary placeholder:text-text-placeholder w-full bg-bg-primary border-b px-semi py-normal border-border-default focus:outline-none focus:border-gradient-primary-start focus-visible:ring-2 focus-visible:ring-primary/50 text-sm text-text-primary tracking-normal ring-0 transition-colors duration-500 ease-in-out\"\n />\n </div>\n }\n @for (option of filteredOptions; track option) {\n <mat-option [value]=\"option.value\">\n <span class=\"txt-default\">{{ option.label }}</span>\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n @if (invalid) {\n <div class=\"txt-invalid text-left\" role=\"alert\" [id]=\"fieldId + '-error'\">\n {{ getErrorMessage(label) }}\n </div>\n }\n</div>\n","import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, HostListener, ChangeDetectionStrategy, input, output, viewChild } from '@angular/core';\nimport { FxComponent } from '../fx-component.component';\nimport { NgClass, NgStyle } from '@angular/common';\nimport { InputComponent } from '../input/input.component';\n\n@Component({\n selector: 'fx-ui-slider',\n templateUrl: './slider.component.html',\n styleUrl: './slider.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n NgStyle,\n InputComponent,\n ],\n})\nexport class SliderComponent extends FxComponent<any> implements AfterViewInit {\n readonly trackRef = viewChild.required<ElementRef<HTMLElement>>('track');\n readonly thumbRef = viewChild.required<ElementRef<HTMLElement>>('thumb');\n\n readonly min = input(0);\n readonly max = input(100);\n readonly step = input(1);\n readonly vertical = input(false);\n readonly valueChange = output<number>();\n dragging = false;\n\n constructor(private ref: ChangeDetectorRef) {\n super();\n }\n\n ngAfterViewInit(): void {\n this._normalizeValue(this.value);\n this.ref.markForCheck();\n }\n\n override setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.ref.markForCheck();\n }\n\n override writeValue(value: number): void {\n this.value = this._normalizeValue(value ?? this.min());\n this.ref.markForCheck();\n }\n\n private _normalizeValue(v: number): number {\n if (!Number.isFinite(v)) v = this.min();\n const clamped = Math.min(this.max(), Math.max(this.min(), v));\n const stepped =\n Math.round((clamped - this.min()) / this.step()) * this.step() + this.min();\n const precision = Math.max(0, this._decimalPlaces(this.step()));\n return parseFloat(stepped.toFixed(precision));\n }\n\n private _decimalPlaces(n: number) {\n const s = String(n);\n if (s.indexOf('.') === -1) return 0;\n return s.length - s.indexOf('.') - 1;\n }\n\n /** Pointer events */\n onPointerDown(event: PointerEvent) {\n if (this.disabled) return;\n (event.target as Element).setPointerCapture(event.pointerId);\n this.dragging = true;\n this._setFromPointer(event);\n }\n\n onPointerMove(event: PointerEvent) {\n if (!this.dragging || this.disabled) return;\n this._setFromPointer(event);\n }\n\n onPointerUp(event: PointerEvent) {\n if (this.disabled) return;\n try {\n (event.target as Element).releasePointerCapture(event.pointerId);\n } catch {\n // pointer capture may already be released\n }\n this.dragging = false;\n this.onTouched();\n }\n\n private _setFromPointer(event: PointerEvent) {\n const newVal = this._coordToValue(event.clientX, event.clientY);\n this._applyValue(newVal);\n }\n\n private _coordToValue(clientX: number, clientY: number) {\n const rect = this.trackRef().nativeElement.getBoundingClientRect();\n let ratio = this.vertical()\n ? 1 - (clientY - rect.top) / rect.height\n : (clientX - rect.left) / rect.width;\n ratio = Math.min(1, Math.max(0, ratio));\n const raw = this.min() + ratio * (this.max() - this.min());\n return this._normalizeValue(raw);\n }\n\n onTrackClick(event: MouseEvent) {\n if (this.disabled) return;\n const newVal = this._coordToValue(event.clientX, event.clientY);\n this._applyValue(newVal);\n this.onTouched();\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(ev: KeyboardEvent) {\n if (this.disabled) return;\n const key = ev.key;\n const largeStep = (this.max() - this.min()) / 10;\n let delta = 0;\n if (key === 'ArrowLeft' || key === 'ArrowDown') delta = -this.step();\n else if (key === 'ArrowRight' || key === 'ArrowUp') delta = this.step();\n else if (key === 'PageDown') delta = -largeStep;\n else if (key === 'PageUp') delta = largeStep;\n else if (key === 'Home') return this._applyValue(this.min());\n else if (key === 'End') return this._applyValue(this.max());\n\n if (delta !== 0) {\n this._applyValue(this.value + delta);\n ev.preventDefault();\n }\n }\n\n private _applyValue(newVal: number) {\n const v = this._normalizeValue(newVal);\n if (v !== this.value) {\n this.value = v;\n this.ref.markForCheck();\n this.valueChange.emit(v);\n this.onChange(v);\n }\n }\n\n get percent(): number {\n const min = this.min();\n const max = this.max();\n if (max === min) return 0;\n return ((this.value - min) / (max - min)) * 100;\n }\n\n thumbStyle() {\n return this.vertical()\n ? { bottom: `${this.percent}%`, transform: 'translateY(50%)' }\n : { left: `${this.percent}%`, transform: 'translateX(-50%)' };\n }\n\n}\n","<div\n class=\"w-full select-none\"\n [class.cursor-not-allowed]=\"disabled\"\n [class.opacity-60]=\"disabled\"\n role=\"group\"\n >\n <!-- Track click is a pointer shortcut; the thumb button below owns keyboard/focus. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n #track\n class=\"relative touch-none py-4\"\n (click)=\"onTrackClick($event)\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-orientation]=\"vertical() ? 'vertical' : 'horizontal'\"\n >\n <div\n class=\"relative flex items-center\"\n [ngClass]=\"{ 'flex-col h-48': vertical() }\"\n >\n <div\n class=\"relative flex-1 rounded-full bg-track h-2\"\n [ngClass]=\"{ 'w-1 rotate-0 h-full w-auto bg-track': vertical() }\"\n >\n @if (!vertical()) {\n <div\n class=\"absolute left-0 top-0 h-full rounded-full bg-primary\"\n [style.width.%]=\"percent\"\n ></div>\n }\n\n @if (vertical()) {\n <div\n class=\"absolute bottom-0 left-0 w-full rounded-full bg-primary\"\n [style.height.%]=\"percent\"\n style=\"transform-origin: bottom;\"\n ></div>\n }\n\n <button\n #thumb\n type=\"button\"\n class=\"absolute -mt-1 -ml-1.5 w-4 h-4 rounded-full shadow focus:ring-primary bg-primary border-2 border-text-primary\"\n [ngStyle]=\"thumbStyle()\"\n role=\"slider\"\n aria-label=\"Slider\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value\"\n [attr.aria-disabled]=\"disabled\"\n tabindex=\"0\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n [disabled]=\"disabled\"\n ></button>\n </div>\n </div>\n </div>\n</div>\n","import { AfterViewInit, ChangeDetectorRef, Component, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { FxComponent } from '../fx-component.component';\nimport { NgClass } from '@angular/common';\n\n@Component({\n selector: 'fx-ui-switch',\n templateUrl: './switch.component.html',\n styleUrl: './switch.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class SwitchComponent extends FxComponent<any> implements AfterViewInit {\n readonly onSwitch = output<boolean>();\n /** Accessible name — the switch renders no visible text of its own. */\n readonly ariaLabel = input('');\n\n ngAfterViewInit(): void {\n this.cdr.detectChanges();\n }\n\n override writeValue(value: any): void {\n this.value = value ?? false;\n }\n\n toggle() {\n if (this.disabled) return;\n this.value = !this.value;\n this.onSwitch.emit(this.value);\n this.onChange(this.value);\n this.onTouched();\n }\n}\n","<button\n type=\"button\"\n role=\"switch\"\n [attr.aria-checked]=\"!!value\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [disabled]=\"disabled\"\n class=\"relative flex items-center w-10 h-5 rounded-full transition-colors duration-300 cursor-pointer disabled:cursor-not-allowed focus-visible:ring-2 focus-visible:ring-primary/50\"\n [ngClass]=\"{\n 'tone-solid-success': value && !disabled,\n 'bg-button-default': !value && !disabled,\n 'bg-bg-hover': disabled\n }\"\n (click)=\"toggle()\"\n>\n @if(value) {\n <i style=\"font-size: 20px;\" class=\"material-symbols-outlined absolute left-0.5 top-0 text-text-inverse\" aria-hidden=\"true\">check</i>\n\n }\n @if(!value) {\n <i style=\"font-size: 20px;\" class=\"material-symbols-outlined absolute right-0.5 top-0 text-text-inverse\" aria-hidden=\"true\">close</i>\n }\n <div\n class=\"absolute top-0.5 left-0.5 w-4 h-4 bg-text-inverse rounded-full shadow-md transform transition-transform duration-300\"\n [ngClass]=\"{ 'translate-x-5': value }\"\n ></div>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n TemplateRef,\n contentChild,\n input,\n} from '@angular/core';\nimport { Tone } from '../../../core/value-tone.util';\n\n/**\n * Một tab của `fx-ui-tab-group`.\n *\n * ⚠️ Nội dung tab PHẢI bọc trong `<ng-template>`:\n *\n * ```html\n * <fx-ui-tab [label]=\"'Components'\">\n * <ng-template>\n * <app-info-components … />\n * </ng-template>\n * </fx-ui-tab>\n * ```\n *\n * Vì sao bắt buộc: trước đây tab dùng `<ng-content>` bọc trong `<ng-template>`\n * của CHÍNH nó. Cách đó **không hoãn được gì** — `<ng-content>` chỉ CHIẾU node,\n * còn node do view khai báo (component cha) tạo **eager**. Kết quả: mọi tab đều\n * khởi tạo và gọi API ngay khi vào màn, dù người dùng chưa mở (đo được trên\n * scan-info: cả 8 cụm cùng fetch). Nhận `TemplateRef` từ cha thì nội dung chỉ\n * được dựng khi tab-group stamp template đó.\n *\n * Hệ quả cần biết: đổi tab sẽ **huỷ** nội dung tab cũ và dựng lại khi quay lại\n * — đúng bản chất lazy, giống `matTabContent` của Material.\n *\n * `descendants: false` để chỉ bắt `<ng-template>` là con TRỰC TIẾP, tránh nuốt\n * nhầm template lồng sâu bên trong nội dung tab.\n */\n@Component({\n selector: 'fx-ui-tab',\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TabComponent {\n readonly label = input.required<string>();\n @Input() icon?: string;\n /** Trailing count badge (V2 'page' variant); null/undefined hides it. */\n readonly count = input<number | null>(null);\n /** Tints the count badge (e.g. vulnerabilities tab shows a danger count). */\n readonly tone = input<Tone | null>(null);\n\n readonly content = contentChild.required(TemplateRef, { descendants: false });\n}\n","import {\n AfterContentInit,\n AfterViewChecked,\n Component,\n ElementRef,\n Input,\n OnChanges,\n Renderer2,\n SimpleChanges,\n HostListener, ChangeDetectorRef, inject, ChangeDetectionStrategy,\n contentChildren,\n input,\n output,\n viewChild\n} from '@angular/core';\nimport { TabComponent } from '../tab-component/tab.component';\nimport { toneBadge } from '../../../core/value-tone.util';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { InputComponent } from '../input/input.component';\n\n@Component({\n selector: 'fx-ui-tab-group',\n templateUrl: './tab-group.component.html',\n styleUrl: './tab-group.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n HeroIconComponent,\n NgClass,\n NgTemplateOutlet,\n InputComponent,\n ],\n})\nexport class TabGroupComponent implements AfterContentInit, AfterViewChecked, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n readonly tabs = contentChildren(TabComponent);\n @Input() activeIndex = 0;\n /** Emitted on user selection — enables [(activeIndex)] two-way binding. */\n readonly activeIndexChange = output<number>();\n /** 'page' = the V2 workspace tab strip (larger hit area, count badges). */\n readonly variant = input<'default' | 'page'>('default');\n\n readonly tabListRef = viewChild.required<ElementRef<HTMLElement>>('tabList');\n readonly underlineRef = viewChild<ElementRef<HTMLElement>>('underline');\n readonly pagePillRef = viewChild<ElementRef<HTMLElement>>('pagePill');\n\n /** Last applied pill geometry — skip DOM writes when nothing moved. */\n private pillState = { left: -1, width: -1, painted: false };\n\n canScrollLeft = false;\n canScrollRight = false;\n\n private animateDelay = 50;\n private scrollAmount = 160;\n private sidePadding = 32; // same as button width space\n\n constructor(private renderer: Renderer2) {}\n\n ngAfterContentInit() {\n setTimeout(() => {\n this.updateScrollButtons();\n this.updateUnderlinePosition();\n this.scrollToActiveTab(false);\n this.cdr.markForCheck();\n }, 0);\n }\n\n selectTab(index: number) {\n this.activeIndex = index;\n this.activeIndexChange.emit(index);\n this.scrollToActiveTab(true);\n }\n\n badgeClass(tab: TabComponent): string {\n return toneBadge(tab.tone());\n }\n\n /** Roving tablist keyboard nav: arrows move AND activate (selection follows focus). */\n onTabKeydown(event: KeyboardEvent, index: number) {\n const count = this.tabs().length;\n if (!count) return;\n let next: number;\n switch (event.key) {\n case 'ArrowRight':\n next = (index + 1) % count;\n break;\n case 'ArrowLeft':\n next = (index - 1 + count) % count;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = count - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n this.selectTab(next);\n const buttons = this.tabListRef().nativeElement.querySelectorAll('.tab-btn');\n (buttons[next] as HTMLElement | undefined)?.focus();\n }\n\n /** Parent-driven activeIndex (deep-link ?tab=, quick-links) must also move the pill. */\n ngOnChanges(changes: SimpleChanges) {\n if (changes['activeIndex'] && !changes['activeIndex'].firstChange) {\n setTimeout(() => this.scrollToActiveTab(false), 0);\n }\n }\n\n /**\n * Re-measure every view check: catches label-width changes (language switch,\n * count arriving) with cached geometry so the DOM write only happens when\n * the pill actually moved.\n */\n ngAfterViewChecked() {\n this.updatePagePill();\n }\n\n /** Slide the 'page' pill to the active tab (offset* is scroll-content relative). */\n private updatePagePill() {\n const pillEl = this.pagePillRef()?.nativeElement;\n if (!pillEl) return;\n const tabButtons = this.tabListRef().nativeElement.querySelectorAll('.tab-btn');\n const activeTab = tabButtons[this.activeIndex] as HTMLElement | undefined;\n if (!activeTab) return;\n\n const left = activeTab.offsetLeft;\n const width = activeTab.offsetWidth;\n if (width === 0) return; // hidden (display:none ancestors) — keep last state\n if (left === this.pillState.left && width === this.pillState.width) return;\n\n // First paint positions without transition — no fly-in from x=0 on load.\n if (!this.pillState.painted) {\n this.renderer.setStyle(pillEl, 'transition', 'none');\n requestAnimationFrame(() => this.renderer.removeStyle(pillEl, 'transition'));\n this.pillState.painted = true;\n }\n this.renderer.setStyle(pillEl, 'width', `${width}px`);\n this.renderer.setStyle(pillEl, 'transform', `translateX(${left}px)`);\n this.pillState = { ...this.pillState, left, width };\n }\n\n private updateUnderlinePosition() {\n // The 'page' variant slides .fx-tabs-pill instead (see updatePagePill);\n // the underline element only exists on the default variant.\n const underlineEl = this.underlineRef()?.nativeElement;\n if (!underlineEl) return;\n const tabListEl = this.tabListRef().nativeElement;\n const tabButtons = tabListEl.querySelectorAll('.tab-btn');\n const activeTab = tabButtons[this.activeIndex] as HTMLElement | undefined;\n \n if (!activeTab || !underlineEl) return;\n \n const tabRect = activeTab.getBoundingClientRect();\n const containerRect = tabListEl.getBoundingClientRect();\n \n // Calculate X position relative to scrollable area (not viewport)\n const translateX = tabRect.left - containerRect.left + tabListEl.scrollLeft - this.sidePadding;\n \n this.renderer.setStyle(underlineEl, 'width', `${activeTab.offsetWidth}px`);\n this.renderer.setStyle(underlineEl, 'transform', `translateX(${translateX}px)`);\n }\n \n\n private scrollToActiveTab(updateUnderlineAfter = true) {\n const tabListEl = this.tabListRef().nativeElement;\n const tabButtons = tabListEl.querySelectorAll('.tab-btn');\n const activeTab = tabButtons[this.activeIndex] as HTMLElement | undefined;\n\n if (!activeTab) return;\n\n const elLeft = activeTab.offsetLeft;\n const elRight = elLeft + activeTab.offsetWidth;\n const containerLeft = tabListEl.scrollLeft;\n const containerRight = containerLeft + tabListEl.clientWidth;\n\n if (elLeft < containerLeft) {\n tabListEl.scrollTo({ left: Math.max(elLeft - 32, 0), behavior: 'smooth' });\n } else if (elRight > containerRight) {\n const target = elRight - tabListEl.clientWidth + 32;\n tabListEl.scrollTo({ left: target, behavior: 'smooth' });\n }\n\n setTimeout(() => {\n this.updateScrollButtons();\n this.updateUnderlinePosition();\n this.cdr.markForCheck();\n }, updateUnderlineAfter ? this.animateDelay : 0);\n }\n\n scroll(direction: 'left' | 'right') {\n const tabListEl = this.tabListRef().nativeElement;\n const delta = direction === 'left' ? -this.scrollAmount : this.scrollAmount;\n tabListEl.scrollBy({ left: delta, behavior: 'smooth' });\n\n setTimeout(() => {\n this.updateScrollButtons();\n this.updateUnderlinePosition();\n this.cdr.markForCheck();\n }, this.animateDelay);\n }\n\n onScroll() {\n this.updateScrollButtons();\n this.updateUnderlinePosition();\n }\n\n private updateScrollButtons() {\n const el = this.tabListRef().nativeElement;\n const scrollLeft = el.scrollLeft;\n const maxScrollLeft = el.scrollWidth - el.clientWidth;\n \n this.canScrollLeft = scrollLeft > 2;\n \n this.canScrollRight = scrollLeft < maxScrollLeft - 2;\n }\n\n @HostListener('window:resize')\n onResize() {\n this.updateUnderlinePosition();\n this.updatePagePill();\n }\n}\n","<div class=\"relative\">\n <!-- Left scroll button -->\n <button\n class=\"left-scroll-button\"\n type=\"button\"\n aria-label=\"Scroll tabs left\"\n (click)=\"scroll('left')\"\n [style.opacity]=\"canScrollLeft ? 1 : 0\"\n [style.pointerEvents]=\"canScrollLeft ? 'auto' : 'none'\"\n [attr.tabindex]=\"canScrollLeft ? null : -1\"\n [attr.aria-hidden]=\"!canScrollLeft\"\n >\n <svg\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-5 w-5 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n <div\n #tabList\n role=\"tablist\"\n class=\"relative flex overflow-x-auto no-scrollbar scroll-smooth\"\n [class.fx-tabs-frame]=\"variant() === 'page'\"\n (scroll)=\"onScroll()\"\n >\n <!-- 'page' variant: one raised pill that SLIDES to the active tab\n (anh Tú 29/08 — same motion as fx-ui-segmented) -->\n @if (variant() === 'page') {\n <span #pagePill aria-hidden=\"true\" class=\"fx-tabs-pill\"></span>\n }\n @for (tab of tabs(); track tab; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"i === activeIndex\"\n [tabindex]=\"i === activeIndex ? 0 : -1\"\n (click)=\"selectTab(i)\"\n (keydown)=\"onTabKeydown($event, i)\"\n class=\"tab-btn tab-bar-btn\"\n [class.tab-bar-btn-page]=\"variant() === 'page'\"\n >\n <div class=\"flex flex-row items-center justify-center gap-xs\">\n @if (tab.icon) {\n <fx-ui-hero-icon\n [icon]=\"tab.icon\"\n [size]=\"variant() === 'page' ? 14 : 20\"\n class=\"flex mr-[2px]\"\n [ngClass]=\"\n variant() === 'page'\n ? i === activeIndex\n ? 'text-strong'\n : 'text-text-placeholder'\n : i === activeIndex\n ? 'text-accent-fg mb-small'\n : 'text-text-placeholder'\n \"\n ></fx-ui-hero-icon>\n }\n <div\n [ngClass]=\"\n variant() === 'page'\n ? i === activeIndex\n ? 'text-[13px] leading-none font-semibold text-strong [text-box:trim-both_cap_alphabetic]'\n : 'text-[13px] leading-none font-medium text-muted [text-box:trim-both_cap_alphabetic]'\n : i === activeIndex\n ? 'txt-field-label text-accent-fg'\n : 'txt-placeholder'\n \"\n >\n {{ tab.label() }}\n </div>\n @if (tab.count() !== null) {\n <span\n class=\"txt-tag-label px-normal py-[1px] rounded-pill\"\n [ngClass]=\"badgeClass(tab)\"\n style=\"font-family: var(--og-font-figure)\"\n >\n {{ tab.count() }}\n </span>\n }\n </div>\n </button>\n }\n\n @if (variant() !== 'page') {\n <span #underline class=\"underline\" style=\"width: 0; transform: translateX(0)\"></span>\n }\n </div>\n\n <button\n class=\"right-scroll-button\"\n type=\"button\"\n aria-label=\"Scroll tabs right\"\n (click)=\"scroll('right')\"\n [style.opacity]=\"canScrollRight ? 1 : 0\"\n [style.pointerEvents]=\"canScrollRight ? 'auto' : 'none'\"\n [attr.tabindex]=\"canScrollRight ? null : -1\"\n [attr.aria-hidden]=\"!canScrollRight\"\n >\n <svg\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-5 w-5 text-text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n</div>\n\n<!-- Tab content -->\n<div class=\"transition-all duration-300 ease-in-out mt-4\">\n @for (tab of tabs(); track tab; let i = $index) {\n @if (i === activeIndex) {\n <div role=\"tabpanel\" class=\"animate-fadeIn\">\n <ng-container *ngTemplateOutlet=\"tab.content()\"></ng-container>\n </div>\n }\n }\n</div>\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\n\n@Component({\n selector: 'fx-ui-table-cell',\n templateUrl: './table-cell.component.html',\n styleUrl: './table-cell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableCell {\n readonly loading = input.required<boolean>();\n readonly skeletonClass = input('h-4 w-full');\n}\n","@if (!loading()) {\n <div animate.enter=\"fade-in-animation\" class=\"inline-block my-normal\">\n <ng-content />\n </div>\n} @else {\n <div animate.enter=\"fade-in-animation\" class=\"skeleton-load my-semi\" [class]=\"skeletonClass()\"></div>\n}\n","import { Component, Input, ChangeDetectionStrategy, input, output, Output, EventEmitter } from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nexport type TagType =\n | 'success'\n | 'warning'\n | 'critical'\n | 'information'\n | 'discovery'\n | 'default'\n | 'danger';\n\n@Component({\n selector: 'fx-ui-tag',\n templateUrl: './tag.component.html',\n styleUrl: './tag.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class TagComponent {\n readonly label = input<string>();\n readonly type = input<TagType>('default');\n readonly rounded = input(true);\n @Input() icon?: string;\n readonly solid = input(false);\n /* EventEmitter (not output()) on purpose: the template branches on\n * `clicked.observed` to only expose button semantics when someone listens —\n * OutputEmitterRef has no equivalent. */\n @Output() clicked = new EventEmitter<void>();\n\n onClick() {\n this.clicked.emit();\n }\n}\n","<!-- Interactive semantics only when a (clicked) listener is attached. -->\n<div\n (click)=\"onClick()\"\n (keydown.enter)=\"onClick()\"\n (keydown.space)=\"$event.preventDefault(); onClick()\"\n [attr.role]=\"clicked.observed ? 'button' : null\"\n [attr.tabindex]=\"clicked.observed ? 0 : null\"\n [class]=\"\n `flex flex-row gap-small ${rounded() ? 'tag-round' : 'tag-square'} tag-${type()}${solid() ? '-solid' : ''}${clicked.observed ? ' cursor-pointer focus-visible:ring-2 focus-visible:ring-primary/50' : ''}`\n \"\n>\n @if (icon) {\n <fx-ui-hero-icon\n [class]=\"`flex txt-tag-${type()} ${solid() && type() !== 'default' ? 'text-surface' : ''}`\"\n [icon]=\"icon\"\n [size]=\"18\"\n ></fx-ui-hero-icon>\n }\n\n <div [class]=\"`txt-tag-${type()} ${solid() && type() !== 'default' ? 'text-surface font-medium' : ''}`\">\n {{ label() }}\n </div>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n NgZone,\n OnDestroy,\n QueryList,\n ViewChildren, ChangeDetectionStrategy,\n input,\n viewChild\n} from '@angular/core';\n\nexport interface TreeNode {\n id: string;\n label: string;\n status?: string;\n children?: TreeNode[];\n}\n\n@Component({\n selector: 'fx-ui-tree-diagram',\n templateUrl: './tree-diagram.component.html',\n styleUrl: './tree-diagram.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TreeDiagram implements AfterViewInit, OnDestroy {\n readonly data = input.required<any>();\n\n readonly container = viewChild.required<ElementRef>('container');\n readonly root = viewChild.required<ElementRef>('root');\n @ViewChildren('child') children!: QueryList<ElementRef>;\n\n lines: any[] = [];\n svgWidth = 0;\n svgHeight = 0;\n\n private resizeObserver!: ResizeObserver;\n private rafId?: number;\n\n constructor(private zone: NgZone, private cdr: ChangeDetectorRef) {}\n\n ngAfterViewInit() {\n this.zone.runOutsideAngular(() => {\n this.resizeObserver = new ResizeObserver((entries) => {\n const rect = entries[0].contentRect;\n\n if (rect.width === 0 || rect.height === 0) return;\n\n this.scheduleDraw();\n });\n\n this.resizeObserver.observe(this.container().nativeElement);\n\n setTimeout(() => this.scheduleDraw(), 50);\n setTimeout(() => this.scheduleDraw(), 150);\n });\n\n this.children.changes.subscribe(() => this.scheduleDraw());\n }\n\n ngOnDestroy() {\n this.resizeObserver?.disconnect();\n if (this.rafId) cancelAnimationFrame(this.rafId);\n }\n\n private scheduleDraw() {\n if (this.rafId) cancelAnimationFrame(this.rafId);\n\n this.rafId = requestAnimationFrame(() => {\n this.drawLines();\n });\n }\n\n private drawLines() {\n const root = this.root();\n if (!root || !this.children.length) return;\n \n const containerEl = this.container().nativeElement;\n const rect = containerEl.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n \n const rootRect = root.nativeElement.getBoundingClientRect();\n \n const rootX = rootRect.left + rootRect.width / 2 - rect.left;\n const rootBottomY = rootRect.bottom - rect.top;\n \n const childRects = this.children.map(c =>\n c.nativeElement.getBoundingClientRect()\n );\n \n const childCenters = childRects.map(r => ({\n x: r.left + r.width / 2 - rect.left,\n y: r.top - rect.top\n }));\n \n const horizontalY = childCenters[0].y - 24;\n \n this.zone.run(() => {\n this.svgWidth = rect.width;\n this.svgHeight = rect.height;\n \n this.lines = [\n {\n x1: rootX,\n y1: rootBottomY,\n x2: rootX,\n y2: horizontalY\n },\n {\n x1: childCenters[0].x,\n y1: horizontalY,\n x2: childCenters[childCenters.length - 1].x,\n y2: horizontalY\n },\n ...childCenters.map(c => ({\n x1: c.x,\n y1: horizontalY,\n x2: c.x,\n y2: c.y\n }))\n ];\n });\n\n this.cdr.detectChanges();\n } \n}\n","<div class=\"relative p-8\" #container>\n\n <!-- ROOT -->\n <div\n #root\n class=\"mx-auto w-fit bg-accent text-accent-contrast px-7 py-3 rounded-md font-semibold text-center\"\n >\n {{ data().label }}\n </div>\n\n <!-- CHILDREN -->\n <div class=\"mt-16 flex justify-center gap-16\">\n @for (child of data().children; track child) {\n <div\n #child\n class=\"w-48 bg-surface-raised text-strong border border-border px-4 py-4 rounded-lg text-center\"\n >\n <div class=\"font-semibold text-lg\">{{ child.label }}</div>\n <div class=\"mt-1 text-sm opacity-90\">{{ child.status }}</div>\n </div>\n }\n </div>\n\n <!-- SVG CONNECTORS -->\n <svg\n class=\"absolute inset-0 pointer-events-none\"\n [attr.width]=\"svgWidth\"\n [attr.height]=\"svgHeight\"\n >\n @for (line of lines; track line) {\n <line\n [attr.x1]=\"line.x1\"\n [attr.y1]=\"line.y1\"\n [attr.x2]=\"line.x2\"\n [attr.y2]=\"line.y2\"\n stroke=\"rgb(var(--og-border-strong))\"\n stroke-width=\"2\"\n />\n }\n </svg>\n\n</div>\n","import { Component, ContentChild, Input, TemplateRef, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { CdkDragDrop, moveItemInArray, transferArrayItem, CdkDropList, CdkDrag, CdkDragPlaceholder } from '@angular/cdk/drag-drop';\nimport { KanbanColumn, ColumnChangedEvent } from './kanban-board.types';\nimport { NgTemplateOutlet } from '@angular/common';\n\n@Component({\n selector: 'fx-ui-kanban-board',\n templateUrl: './kanban-board.component.html',\n styleUrl: './kanban-board.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CdkDropList,\n CdkDrag,\n CdkDragPlaceholder,\n NgTemplateOutlet,\n ],\n})\nexport class KanbanBoardComponent<T = any> {\n readonly columns = input<KanbanColumn<T>[]>([]);\n @Input() itemTemplate?: TemplateRef<any>;\n readonly columnChanged = output<ColumnChangedEvent<T>>();\n\n /**\n * Get all column IDs for connecting drop lists\n */\n getColumnIds(): string[] {\n return this.columns().map((col) => col.id);\n }\n\n /**\n * Handle drop event when item is moved\n */\n onDrop(event: CdkDragDrop<T[]>, columnId: string) {\n const previousColumnId = event.previousContainer.id;\n const currentColumnId = columnId;\n\n if (event.previousContainer === event.container) {\n // Reorder within the same column\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n // Transfer between columns\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex\n );\n }\n\n // Emit the change event\n const item = event.container.data[event.currentIndex];\n this.columnChanged.emit({\n previousColumnId,\n currentColumnId,\n item,\n previousIndex: event.previousIndex,\n currentIndex: event.currentIndex,\n });\n }\n}\n","<div class=\"kanban-board\">\n <div class=\"kanban-columns\">\n @for (column of columns(); track column.id) {\n <div class=\"kanban-column\">\n <div class=\"kanban-column-header\">\n <h3 class=\"kanban-column-title\">{{ column.title }}</h3>\n <span class=\"kanban-column-count\">{{ column.items.length }}</span>\n </div>\n \n <div\n class=\"kanban-column-content\"\n cdkDropList\n [id]=\"column.id\"\n [cdkDropListData]=\"column.items\"\n [cdkDropListConnectedTo]=\"getColumnIds()\"\n (cdkDropListDropped)=\"onDrop($event, column.id)\"\n >\n @for (item of column.items; track $index) {\n <div class=\"kanban-item\" cdkDrag>\n <div class=\"kanban-item-placeholder\" *cdkDragPlaceholder></div>\n \n @if (itemTemplate) {\n <ng-container\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, index: $index }\"\n ></ng-container>\n } @else {\n <div class=\"kanban-item-default\">\n {{ item }}\n </div>\n }\n </div>\n }\n \n @if (column.items.length === 0) {\n <div class=\"kanban-column-empty\">\n Drop items here\n </div>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","import { Component, Input, OnInit, OnDestroy, ChangeDetectorRef, inject, ChangeDetectionStrategy, input, output } from '@angular/core';\nimport { Router, NavigationEnd, RouterLink } from '@angular/router';\nimport { Subject, filter, takeUntil } from 'rxjs';\nimport { DrawerItem } from './drawer.types';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n@Component({\n selector: 'fx-ui-drawer',\n templateUrl: './drawer.component.html',\n styleUrl: './drawer.component.scss',\n animations: [\n trigger('drawerExpand', [\n state('collapsed', style({ width: '70px' })),\n state('expanded', style({ width: '260px' })),\n transition('collapsed <=> expanded', animate('300ms cubic-bezier(0.4, 0, 0.2, 1)')),\n ]),\n trigger('accordionExpand', [\n state('collapsed', style({ height: '0', overflow: 'hidden', opacity: 0 })),\n state('expanded', style({ height: '*', overflow: 'visible', opacity: 1 })),\n transition('collapsed <=> expanded', animate('300ms cubic-bezier(0.4, 0, 0.2, 1)')),\n ]),\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n MatTooltip,\n HeroIconComponent,\n RouterLink,\n ],\n})\nexport class DrawerComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n readonly items = input<DrawerItem[]>([]);\n /** V2: bottom-pinned section (Administration group) — same item rendering,\n separated by a rule, above the [drawerFooter] slot and version. */\n readonly footerItems = input<DrawerItem[]>([]);\n @Input() isExpanded = true;\n @Input() logo?: string;\n /** Wordmark cạnh logo, chỉ hiện khi drawer mở. Bỏ trống = chỉ có mark. */\n @Input() logoText?: string;\n /** Dòng phụ dưới logoText (tagline/workspace). Chỉ hiện khi drawer mở. */\n @Input() logoSubtext?: string;\n @Input() version?: string;\n readonly toggleExpanded = output<boolean>();\n readonly itemClicked = output<DrawerItem>();\n\n expandedItems = new Set<string>();\n currentRoute = '';\n private destroy$ = new Subject<void>();\n\n constructor(private router: Router) {}\n\n ngOnInit(): void {\n // Track current route\n this.currentRoute = this.router.url;\n\n // Subscribe to route changes\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntil(this.destroy$),\n )\n .subscribe((event: any) => {\n this.currentRoute = event.urlAfterRedirects || event.url;\n this.autoExpandActiveParents();\n this.cdr.markForCheck();\n });\n\n // Auto-expand parents of active route on init\n this.autoExpandActiveParents();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n toggleDrawer(): void {\n this.isExpanded = !this.isExpanded;\n this.toggleExpanded.emit(this.isExpanded);\n }\n\n toggleAccordion(itemId: string): void {\n if (this.expandedItems.has(itemId)) {\n this.expandedItems.delete(itemId);\n } else {\n this.expandedItems.add(itemId);\n }\n }\n\n isAccordionExpanded(itemId: string): boolean {\n return this.expandedItems.has(itemId);\n }\n\n onItemClick(item: DrawerItem, event?: Event): void {\n // If item has children, toggle accordion\n if (item.children && item.children.length > 0) {\n event?.preventDefault();\n this.toggleAccordion(item.id);\n return;\n }\n\n // Emit click event\n this.itemClicked.emit(item);\n\n // If item has action, execute it\n if (item.action) {\n event?.preventDefault();\n item.action();\n }\n\n // Navigation is handled by routerLink in template\n }\n\n isActiveRoute(route?: string): boolean {\n if (!route) return false;\n return this.currentRoute === route || this.currentRoute.startsWith(route + '/');\n }\n\n hasActiveChild(item: DrawerItem): boolean {\n if (!item.children) return false;\n\n return item.children.some((child) => {\n if (this.isActiveRoute(child.route)) return true;\n if (child.children) return this.hasActiveChild(child);\n return false;\n });\n }\n\n private autoExpandActiveParents(): void {\n const expandParents = (items: DrawerItem[]): boolean => {\n for (const item of items) {\n if (item.route && this.isActiveRoute(item.route)) {\n return true;\n }\n if (item.children) {\n const hasActiveChild = expandParents(item.children);\n if (hasActiveChild) {\n this.expandedItems.add(item.id);\n return true;\n }\n }\n }\n return false;\n };\n\n expandParents(this.items());\n expandParents(this.footerItems());\n }\n\n getAccordionState(itemId: string): string {\n return this.isAccordionExpanded(itemId) ? 'expanded' : 'collapsed';\n }\n\n getDrawerState(): string {\n return this.isExpanded ? 'expanded' : 'collapsed';\n }\n}\n","<div class=\"drawer-host-wrapper\">\n <a href=\"/\" class=\"drawer-brand\" [class.is-collapsed]=\"!isExpanded\">\n @if (logo) {\n <img [src]=\"logo\" alt=\"Home\" class=\"drawer-brand-mark\" />\n } @else {\n <div class=\"drawer-brand-mark\"></div>\n }\n @if (isExpanded && (logoText || logoSubtext)) {\n <span class=\"drawer-brand-copy\">\n @if (logoText) {\n <span class=\"drawer-brand-text\">{{ logoText }}</span>\n }\n @if (logoSubtext) {\n <span class=\"drawer-brand-subtext\">{{ logoSubtext }}</span>\n }\n </span>\n }\n </a>\n <div class=\"drawer-container\" [@drawerExpand]=\"getDrawerState()\">\n <!-- Navigation Items -->\n <nav class=\"drawer-nav\">\n @for (item of items(); track item) {\n <ng-container\n *ngTemplateOutlet=\"drawerItem; context: { $implicit: item, level: 0 }\"\n ></ng-container>\n }\n </nav>\n\n <!-- V2: bottom section (Administration group, user block, …) -->\n <div class=\"mt-auto\">\n @if (footerItems().length) {\n <nav class=\"drawer-footer-nav\">\n @for (item of footerItems(); track item) {\n <ng-container\n *ngTemplateOutlet=\"drawerItem; context: { $implicit: item, level: 0 }\"\n ></ng-container>\n }\n </nav>\n }\n <ng-content select=\"[drawerFooter]\"></ng-content>\n </div>\n\n <!-- Version -->\n @if (version) {\n <div class=\"drawer-version\" [matTooltip]=\"!isExpanded ? version : ''\" matTooltipPosition=\"right\">\n @if (isExpanded) {\n <span>{{ version }}</span>\n }\n @if (!isExpanded) {\n <span class=\"drawer-version-dot\"></span>\n }\n </div>\n }\n </div>\n\n <!-- Floating Toggle Button on right border -->\n <button\n type=\"button\"\n class=\"toggle-btn\"\n [attr.aria-label]=\"isExpanded ? 'Collapse navigation' : 'Expand navigation'\"\n [attr.aria-expanded]=\"isExpanded\"\n (click)=\"toggleDrawer()\"\n [matTooltip]=\"isExpanded ? 'Collapse' : 'Expand'\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n matTooltipPosition=\"right\"\n >\n <fx-ui-hero-icon\n [icon]=\"isExpanded ? 'chevron-left' : 'chevron-right'\"\n [size]=\"16\"\n class=\"text-text-primary\"\n ></fx-ui-hero-icon>\n </button>\n</div>\n\n<!-- Recursive Template for Drawer Items -->\n<ng-template #drawerItem let-item let-level=\"level\">\n @if (item.heading) {\n @if (isExpanded) {\n <div class=\"drawer-section-label\">{{ item.label }}</div>\n } @else {\n <div class=\"drawer-section-rule\"></div>\n }\n } @else {\n <div class=\"drawer-item-wrapper\">\n <!-- Item Button/Link -->\n @if (item.route && !item.children) {\n <a\n [routerLink]=\"item.route\"\n class=\"drawer-item\"\n [class.active]=\"isActiveRoute(item.route)\"\n [class.has-children]=\"item.children && item.children.length > 0\"\n [style.paddingLeft.px]=\"isExpanded ? 16 + level * 16 : 16\"\n [matTooltip]=\"!isExpanded ? item.label : ''\"\n matTooltipPosition=\"right\"\n matTooltipClass=\"text-text-primary text-xs font-semibold\"\n (click)=\"onItemClick(item, $event)\"\n >\n <div class=\"item-content\">\n <fx-ui-hero-icon [icon]=\"item.icon\" [size]=\"20\" class=\"item-icon\"></fx-ui-hero-icon>\n @if (isExpanded) {\n <span class=\"item-label\">{{ item.label }}</span>\n }\n </div>\n </a>\n }\n\n @if (!item.route || item.children) {\n <button\n type=\"button\"\n class=\"drawer-item\"\n [class.active]=\"isActiveRoute(item.route)\"\n [class.has-children]=\"item.children && item.children.length > 0\"\n [style.paddingLeft.px]=\"isExpanded ? 16 + level * 16 : 16\"\n [matTooltip]=\"!isExpanded ? item.label : ''\"\n matTooltipPosition=\"right\"\n matTooltipClass=\"text-text-primary text-sm font-semibold\"\n (click)=\"onItemClick(item, $event)\"\n >\n <div class=\"item-content\">\n <fx-ui-hero-icon [icon]=\"item.icon\" [size]=\"20\" class=\"item-icon\"></fx-ui-hero-icon>\n @if (isExpanded) {\n <span class=\"item-label\">{{ item.label }}</span>\n }\n @if (isExpanded && item.children && item.children.length > 0) {\n <fx-ui-hero-icon\n [icon]=\"'chevron-down'\"\n [size]=\"16\"\n class=\"chevron-icon\"\n [class.rotated]=\"isAccordionExpanded(item.id)\"\n ></fx-ui-hero-icon>\n }\n </div>\n </button>\n }\n\n <!-- Accordion Children -->\n @if (item.children && item.children.length > 0) {\n <div\n class=\"accordion-children\"\n [@accordionExpand]=\"getAccordionState(item.id)\"\n >\n @for (child of item.children; track child) {\n <ng-container\n *ngTemplateOutlet=\"drawerItem; context: { $implicit: child, level: level + 1 }\"\n ></ng-container>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\n\n/** Row-card skeleton placeholder for master-detail list panes. */\n@Component({\n selector: 'fx-ui-skeleton-list',\n templateUrl: './skeleton-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SkeletonListComponent {\n readonly rows = input(5);\n\n /** computed, không phải method: method trả mảng MỚI mỗi lần render. */\n readonly rowList = computed(() => range(this.rows()));\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"flex flex-col gap-normal\">\n @for (r of rowList(); track r) {\n <div class=\"rounded-lg border border-border-default p-semi\">\n <div class=\"flex items-center gap-normal mb-small\">\n <div class=\"w-8 h-8 rounded-lg skeleton-load shrink-0\"></div>\n <div class=\"h-4 flex-1 rounded skeleton-load\"></div>\n <div class=\"h-5 w-12 rounded-full skeleton-load shrink-0\"></div>\n </div>\n <div class=\"h-3 w-3/4 rounded skeleton-load\"></div>\n </div>\n }\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\n\nconst ROW_WIDTHS = [90, 70, 80, 60];\n\n/** Card-shaped skeleton placeholder for detail panels. */\n@Component({\n selector: 'fx-ui-skeleton-detail',\n templateUrl: './skeleton-detail.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SkeletonDetailComponent {\n /** Number of content cards rendered below the header card. */\n readonly cards = input(3);\n /** Rows per content card. */\n readonly rows = input(4);\n\n /** computed, không phải method: method trả mảng MỚI mỗi lần render. */\n readonly cardList = computed(() => range(this.cards()));\n readonly rowList = computed(() => range(this.rows()));\n\n rowWidth(i: number): number {\n return ROW_WIDTHS[i % ROW_WIDTHS.length];\n }\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"flex flex-col gap-xl\">\n <div class=\"card-common\">\n <div class=\"flex items-start gap-normal\">\n <div class=\"w-10 h-10 rounded-lg skeleton-load shrink-0\"></div>\n <div class=\"flex-1 min-w-0 flex flex-col gap-normal\">\n <div class=\"h-5 w-1/2 rounded skeleton-load\"></div>\n <div class=\"h-3 w-3/4 rounded skeleton-load\"></div>\n </div>\n </div>\n </div>\n\n @for (c of cardList(); track c) {\n <div class=\"card-common flex flex-col gap-large\">\n <div class=\"h-4 w-1/3 rounded skeleton-load\"></div>\n <div class=\"flex flex-col gap-normal\">\n @for (r of rowList(); track r) {\n <div class=\"h-3 rounded skeleton-load\" [style.width.%]=\"rowWidth(r)\"></div>\n }\n </div>\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBg } from '../../../core/value-tone.util';\n\n/**\n * V2 sparkbar — inline mini bar-trend (risk trend on project cards, deltas in\n * stat grids). Pure DOM, token-coloured; no chart engine.\n *\n * <fx-ui-sparkbar [values]=\"[3, 5, 2, 8, 6]\" />\n */\n@Component({\n selector: 'fx-ui-sparkbar',\n templateUrl: './sparkbar.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class SparkbarComponent {\n readonly values = input<number[]>([]);\n /** Bar colour; null renders the accent. */\n readonly tone = input<Tone | null>(null);\n readonly height = input(28);\n\n readonly bars = computed(() => {\n const values = this.values();\n const max = Math.max(...values, 1);\n // 8% floor so zero values still show a base mark.\n return values.map((v) => Math.max((v / max) * 100, 8));\n });\n\n barClass(): string {\n return this.tone() ? toneBg(this.tone()) : 'bg-accent';\n }\n}\n","<div\n class=\"flex items-end gap-[2px]\"\n [style.height.px]=\"height()\"\n role=\"img\"\n [attr.aria-label]=\"'Trend: ' + values().join(', ')\"\n>\n @for (bar of bars(); track $index) {\n <div\n class=\"flex-1 min-w-[3px] rounded-[1px] opacity-80\"\n [ngClass]=\"barClass()\"\n [style.height.%]=\"bar\"\n ></div>\n }\n</div>\n","/** Users who asked the OS for reduced motion get instant state changes. */\nexport function fxMotionAllowed(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n !window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\n/** Shared timing so every screen moves the same way. */\nexport const FX_MOTION = {\n duration: 0.5,\n /** Delay between consecutive slots. */\n stagger: 0.06,\n /** Never let a long list push the last item beyond this delay. */\n maxSlot: 12,\n travelPx: 12,\n ease: 'power2.out',\n} as const;\n","import { Directive, ElementRef, OnDestroy, effect, inject, input } from '@angular/core';\nimport gsap from 'gsap';\nimport { fxMotionAllowed } from './motion.util';\n\n/**\n * Counts a figure up from 0 (GSAP) whenever its value changes.\n *\n * <span [fxCountUp]=\"card.value\"></span>\n *\n * Numbers tween over 0.8 s and render with the user's locale grouping; any\n * non-numeric value ('--', '98 / 100', '1,224') is written verbatim so pending\n * or composite figures never animate to nonsense. Reduced motion → final value.\n */\n@Directive({\n selector: '[fxCountUp]',\n})\nexport class FxCountUpDirective implements OnDestroy {\n readonly fxCountUp = input<number | string | null | undefined>(undefined);\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private tween?: gsap.core.Tween;\n private readonly state = { v: 0 };\n\n constructor() {\n effect(() => {\n const raw = this.fxCountUp();\n const n = typeof raw === 'number' ? raw : Number(raw);\n const numeric = raw !== '' && raw !== null && raw !== undefined && Number.isFinite(n);\n this.tween?.kill();\n if (!numeric) {\n this.el.textContent = raw === null || raw === undefined ? '' : String(raw);\n return;\n }\n if (!fxMotionAllowed()) {\n this.state.v = n;\n this.el.textContent = this.format(n);\n return;\n }\n this.tween = gsap.to(this.state, {\n v: n,\n duration: 0.8,\n ease: 'power2.out',\n onUpdate: () => (this.el.textContent = this.format(this.state.v)),\n onComplete: () => (this.el.textContent = this.format(n)),\n });\n });\n }\n\n private format(v: number): string {\n return Math.round(v).toLocaleString();\n }\n\n ngOnDestroy(): void {\n this.tween?.kill();\n }\n}\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { Tone, toneTint, toneText } from '../../../core/value-tone.util';\nimport { NgStyle, NgClass } from '@angular/common';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { SparkbarComponent } from '../sparkbar/sparkbar.component';\nimport { FxCountUpDirective } from '../../motion/count-up.directive';\n\nexport interface FxStatCardDelta {\n /** Caller-formatted delta text (e.g. \"+12%\", \"-3\"). */\n value: string;\n direction: 'up' | 'down';\n /** Delta colour — up is not always good (findings up = danger). */\n tone?: Tone | null;\n}\n\nexport interface FxStatCard {\n /** Caller-translated caption. */\n label: string;\n value: string | number;\n /** hero-icon name shown in the tinted box. */\n icon?: string;\n /** Colours the number and the icon box; null/undefined renders neutral. */\n tone?: Tone | null;\n /** V2 StatGrid: trend chip beside the number. */\n delta?: FxStatCardDelta;\n /** V2 StatGrid: mini bar-trend under the caption. */\n spark?: number[];\n /** variant 'figure': caller-formatted sub-caption under the number (\"+1 since 4.8.0\"). */\n sub?: string;\n /** Colours the sub-caption; null/undefined renders muted. */\n subTone?: Tone | null;\n}\n\n/** KPI tile row: big number + tinted icon box + caption, in a responsive grid. */\n@Component({\n selector: 'fx-ui-stat-cards',\n templateUrl: './stat-cards.component.html',\n styleUrl: './stat-cards.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgStyle,\n NgClass,\n HeroIconComponent,\n SparkbarComponent,\n FxCountUpDirective,\n ],\n})\nexport class StatCardsComponent {\n readonly cards = input<FxStatCard[]>([]);\n /**\n * 'tile' (default): tinted icon box + number + caption — the pre-V2 look.\n * 'figure': the V2 design's KPI column — caption on top, large figure-font\n * number, toned sub-caption underneath (no icon box).\n */\n readonly variant = input<'tile' | 'figure'>('tile');\n /** Grid columns; defaults to one column per card. */\n @Input() cols?: number;\n\n /**\n * Column count for the ≥ md (720px) container. Below that the CSS takes\n * over (2-up, then 1-up under 360px) — see stat-cards.component.css — so an\n * explicit `cols` never squeezes four figures into a phone-width row.\n */\n get gridColumns(): string {\n if (this.cols === undefined) {\n return 'repeat(auto-fit, minmax(min(180px, 100%), 1fr))';\n }\n return `repeat(${this.cols}, minmax(0, 1fr))`;\n }\n\n\n numClass(card: FxStatCard): string {\n return card.tone ? toneText(card.tone) : 'text-text-primary';\n }\n\n boxClass(card: FxStatCard): string {\n // Ô icon vuông: chỉ lấy MÀU, không lấy hình pill của badge.\n return toneTint(card.tone ?? null);\n }\n\n deltaClass(card: FxStatCard): string {\n return card.delta?.tone ? toneText(card.delta.tone) : 'text-muted';\n }\n\n subClass(card: FxStatCard): string {\n return card.subTone ? toneText(card.subTone) : 'text-text-secondary';\n }\n}\n","<div class=\"fx-stat-grid grid gap-normal\" [ngStyle]=\"{ 'grid-template-columns': gridColumns }\">\n @for (card of cards(); track card.label) {\n @if (variant() === 'figure') {\n <div class=\"card-common flex flex-col gap-small min-w-0\">\n <span class=\"txt-utility-caption text-text-secondary truncate\">{{ card.label }}</span>\n <span\n class=\"txt-heading-03\"\n [ngClass]=\"numClass(card)\"\n style=\"font-family: var(--og-font-figure)\"\n ><span [fxCountUp]=\"card.value\"></span></span\n >\n @if (card.sub) {\n <span class=\"txt-utility-caption\" [ngClass]=\"subClass(card)\">{{ card.sub }}</span>\n }\n @if (card.spark?.length) {\n <fx-ui-sparkbar class=\"mt-xs\" [values]=\"card.spark!\" [height]=\"16\" [tone]=\"card.tone ?? null\" />\n }\n </div>\n } @else {\n <div class=\"card-common flex items-center gap-normal\">\n @if (card.icon) {\n <div\n class=\"w-10 h-10 rounded-lg flex items-center justify-center shrink-0\"\n [ngClass]=\"boxClass(card)\"\n >\n <fx-ui-hero-icon [icon]=\"card.icon\" [size]=\"20\"></fx-ui-hero-icon>\n </div>\n }\n <div class=\"flex flex-col min-w-0 flex-1\">\n <div class=\"flex items-baseline gap-small\">\n <span\n class=\"txt-heading-04\"\n [ngClass]=\"numClass(card)\"\n style=\"font-family: var(--og-font-figure)\"\n ><span [fxCountUp]=\"card.value\"></span></span\n >\n @if (card.delta) {\n <span class=\"text-xs font-semibold\" [ngClass]=\"deltaClass(card)\">\n {{ card.delta.direction === 'up' ? '▲' : '▼' }} {{ card.delta.value }}\n </span>\n }\n </div>\n <span class=\"txt-utility-caption text-text-secondary truncate\">{{ card.label }}</span>\n @if (card.spark?.length) {\n <fx-ui-sparkbar class=\"mt-xs\" [values]=\"card.spark!\" [height]=\"16\" [tone]=\"card.tone ?? null\" />\n }\n </div>\n </div>\n }\n }\n</div>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n/** Centered \"no data\" block. The message is caller-translated (no i18n in lib). */\n@Component({\n selector: 'fx-ui-empty-state',\n templateUrl: './empty-state.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class EmptyStateComponent {\n readonly message = input('No data');\n /** Optional icon (hero-icon name). */\n @Input() icon?: any;\n /** Min height of the block, CSS length. */\n readonly height = input('120px');\n}\n","<div\n class=\"flex flex-col items-center justify-center gap-small w-full\"\n [style.minHeight]=\"height()\"\n>\n @if (icon) {\n <fx-ui-hero-icon class=\"text-text-placeholder\" [icon]=\"icon\" [size]=\"24\"></fx-ui-hero-icon>\n }\n <div class=\"txt-default text-text-placeholder\">{{ message() }}</div>\n</div>\n","import { Component, Input, ChangeDetectionStrategy, output } from '@angular/core';\nimport { Tone, severityTone, toneScale, toneBg } from '../../../core/value-tone.util';\nimport { NgClass } from '@angular/common';\n\nexport interface FxFilterChipOption {\n /** Caller-translated label. */\n label: string;\n /** '' (empty) renders as the neutral \"All\" chip. */\n value: string;\n}\n\n/**\n * Tone-tinted filter chip row. Replaces the per-tab chipClass() copies —\n * including their classic bug of comparing a hardcoded filter key: the active\n * chip here is always derived from [value].\n */\n@Component({\n selector: 'fx-ui-filter-chips',\n templateUrl: './filter-chips.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class FilterChipsComponent {\n @Input() options: FxFilterChipOption[] = [];\n /* Accepts undefined so screens can bind [value]=\"filters.x\" where the\n * filter bag keys are optional; '' and undefined both mean \"All\". */\n @Input() value: string | undefined = '';\n readonly valueChange = output<string>();\n /** Per-value tone overrides (e.g. { Safe: 'information', Protected: 'discovery' as any }). */\n @Input() toneOverrides: Record<string, Tone | null> = {};\n\n select(option: FxFilterChipOption): void {\n this.value = option.value;\n this.valueChange.emit(option.value);\n }\n\n chipClass(option: FxFilterChipOption): string {\n const active = (this.value ?? '') === option.value;\n // Chip \"All\" (value rỗng) khi ĐANG CHỌN dùng **accent** (xanh), không phải\n // nền đen — khớp demo (ref 11: pill \"All 40\" là accent). Nền đen chỉ dành\n // cho badge severity Critical (anh Tú chốt 03/09).\n if (!option.value) {\n return active\n ? 'bg-accent text-accent-contrast'\n : 'bg-bg-hover text-text-secondary hover:bg-accent-soft hover:text-accent-fg';\n }\n const tone =\n option.value in this.toneOverrides\n ? this.toneOverrides[option.value]\n : severityTone(option.value);\n if (!tone) {\n return active ? 'bg-accent text-accent-contrast' : `${toneScale(null)} hover:opacity-50`;\n }\n // Chip tự có hình dạng riêng → chỉ lấy MÀU. Dùng thang đo (`tone-scale-*`)\n // chứ KHÔNG dùng `toneTint`: Critical ở filter phải là đỏ sẫm, không phải\n // pill đen đặc (anh Tú báo 03/09).\n return active ? `${toneBg(tone)} text-text-focus` : `${toneScale(tone)} hover:opacity-50`;\n }\n}\n","<div class=\"flex flex-wrap items-center gap-small\">\n @for (option of options; track option.value) {\n <button\n type=\"button\"\n class=\"px-3 py-1 rounded-full txt-utility-caption font-medium transition-colors cursor-pointer\"\n [ngClass]=\"chipClass(option)\"\n (click)=\"select(option)\"\n >\n {{ option.label }}\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\n\nexport interface FxFilterPillOption {\n /** '' (empty) is the conventional \"All\" pill. */\n value: string;\n /** Caller-translated label. */\n label: string;\n /** Shown muted beside the label; null/undefined renders no count. */\n count?: number | null;\n}\n\n/**\n * V2 filter pills — the quick-filter row above ranked lists (design refs 02,\n * 03, 11): outlined capsules with a muted count, the active one filled with\n * the primary text colour.\n *\n * Distinct from `fx-ui-filter-chips`, which tints each chip by its severity\n * tone and carries no count. Presentational: the caller owns the filter state.\n *\n * <fx-ui-filter-pills [options]=\"pills\" [value]=\"filters.status\"\n * (valueChange)=\"filters.status = $event; refresh()\" />\n */\n@Component({\n selector: 'fx-ui-filter-pills',\n templateUrl: './filter-pills.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class FilterPillsComponent {\n readonly options = input<FxFilterPillOption[]>([]);\n /** Accepts undefined so screens can bind an optional filter-bag key. */\n readonly value = input<string | undefined>('');\n readonly valueChange = output<string>();\n /**\n * Fill of the ACTIVE pill. 'accent' (default, design 11 vulnerabilities);\n * 'solid' = `--og-text` on inverse text — the demo's Attack-paths panel on\n * the Overview tab (design 02 \"All paths 164\") and Recent analyses (design 13).\n */\n readonly tone = input<'accent' | 'solid'>('accent');\n\n isActive(option: FxFilterPillOption): boolean {\n return (this.value() ?? '') === option.value;\n }\n\n /**\n * Pill ĐANG CHỌN dùng **accent** (xanh), không phải nền đen — khớp demo:\n * design ref 11 vẽ pill \"All 40\" là pill accent. Nền đen `--og-text` chỉ\n * dành cho badge severity Critical (`.og-badge--solid`), không dùng cho\n * trạng thái chọn của filter (anh Tú chốt 03/09).\n */\n pillClass(option: FxFilterPillOption): string {\n if (!this.isActive(option)) {\n return 'border-border-default text-text-secondary hover:border-border-strong';\n }\n return this.tone() === 'solid'\n ? 'bg-text-primary text-text-inverse border-text-primary'\n : 'bg-accent text-accent-contrast border-accent';\n }\n\n countClass(option: FxFilterPillOption): string {\n return this.isActive(option) ? 'opacity-70' : 'text-text-placeholder';\n }\n}\n","<div class=\"flex flex-wrap items-center gap-small\">\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n [attr.aria-pressed]=\"isActive(option)\"\n class=\"flex items-center gap-small px-[11px] py-[4px] rounded-full border txt-utility-caption font-bold cursor-pointer transition-colors\"\n [ngClass]=\"pillClass(option)\"\n (click)=\"valueChange.emit(option.value)\"\n >\n {{ option.label }}\n @if (option.count !== null && option.count !== undefined) {\n <span [ngClass]=\"countClass(option)\" style=\"font-family: var(--og-font-figure)\">{{ option.count }}</span>\n }\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\n\n/**\n * V2 stage progress dots — the walkthrough position indicator on the attack\n * chain toolbar (design refs 04, 07): one dot per stage, the current one drawn\n * as a wider accent bar, visited ones solid, the rest faint.\n *\n * <fx-ui-stage-dots [count]=\"8\" [current]=\"stageIndex()\"\n * (dotClick)=\"goToStage($event)\" />\n */\n@Component({\n selector: 'fx-ui-stage-dots',\n templateUrl: './stage-dots.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class StageDotsComponent {\n readonly count = input(0);\n /** 0-based current stage; -1 (default) means none selected yet. */\n readonly current = input(-1);\n /** Emit the clicked stage index; wire it to make the dots navigable. */\n readonly dotClick = output<number>();\n\n readonly dots = computed(() => Array.from({ length: Math.max(0, this.count()) }, (_, i) => i));\n\n dotClass(index: number): string {\n const current = this.current();\n if (index === current) return 'w-5 bg-accent';\n if (current >= 0 && index < current) return 'w-1.5 bg-text-placeholder';\n return 'w-1.5 bg-border-strong';\n }\n}\n","<div class=\"flex items-center gap-xs\" role=\"tablist\">\n @for (i of dots(); track i) {\n <button\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"i === current()\"\n [attr.aria-label]=\"'Stage ' + (i + 1)\"\n class=\"h-1.5 rounded-full cursor-pointer transition-all duration-150 hover:opacity-70\"\n [ngClass]=\"dotClass(i)\"\n (click)=\"dotClick.emit(i)\"\n ></button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * V2 evidence code block — the mono panel that carries a process tree, a\n * command line or any captured text (design ref 05, \"Process tree\").\n *\n * Whitespace is preserved and the box scrolls on its own rather than pushing\n * the page wide, so ASCII trees survive narrow viewports.\n *\n * <fx-ui-code-block [label]=\"'analyze.processTree' | translate\" [code]=\"tree\" />\n */\n@Component({\n selector: 'fx-ui-code-block',\n templateUrl: './code-block.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CodeBlockComponent {\n readonly code = input('');\n /** Caller-translated caption above the box; omit for a bare block. */\n readonly label = input('');\n /** Scroll cap; empty grows with the content. */\n readonly maxHeight = input('');\n}\n","@if (label()) {\n <div class=\"txt-utility-caption font-bold text-text-secondary mb-normal\">{{ label() }}</div>\n}\n<pre\n class=\"m-0 p-large rounded-control border border-border bg-surface overflow-auto txt-body-compact-01 text-strong\"\n [style.max-height]=\"maxHeight() || null\"\n style=\"font-family: var(--og-font-mono); white-space: pre; tab-size: 2\"\n>{{ code() }}</pre>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n/**\n * V2 captured-evidence frame — a faux window chrome (traffic lights + mono file\n * name + timestamp) around a screenshot, with a placeholder when the image is\n * missing (design ref 05, \"Screenshot\").\n *\n * <fx-ui-screenshot-frame [label]=\"'analyze.screenshot' | translate\"\n * fileName=\"chain-05.png\" timestamp=\"09:42:18\"\n * [src]=\"url\" [caption]=\"caption\" />\n */\n@Component({\n selector: 'fx-ui-screenshot-frame',\n templateUrl: './screenshot-frame.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class ScreenshotFrameComponent {\n /** Caller-translated caption above the frame; omit for a bare frame. */\n readonly label = input('');\n readonly fileName = input('');\n readonly timestamp = input('');\n /** Image URL; empty renders the placeholder body. */\n readonly src = input('');\n /** Caller-translated line under (or inside) the frame. */\n readonly caption = input('');\n readonly alt = input('');\n readonly height = input('180px');\n}\n","@if (label()) {\n <div class=\"txt-utility-caption font-bold text-text-secondary mb-normal\">{{ label() }}</div>\n}\n<div class=\"rounded-control border border-border bg-surface overflow-hidden\">\n <!-- Window chrome: traffic lights + mono file name + capture time -->\n <div class=\"flex items-center gap-small px-normal py-small border-b border-border bg-surface-sunken\">\n <span class=\"flex items-center gap-xs shrink-0\">\n <span class=\"w-2 h-2 rounded-full bg-critical/70\"></span>\n <span class=\"w-2 h-2 rounded-full bg-warning/70\"></span>\n <span class=\"w-2 h-2 rounded-full bg-success/70\"></span>\n </span>\n @if (fileName()) {\n <span class=\"txt-utility-caption text-text-secondary truncate\" style=\"font-family: var(--og-font-mono)\">\n {{ fileName() }}\n </span>\n }\n @if (timestamp()) {\n <span class=\"txt-utility-caption text-text-placeholder shrink-0\" style=\"font-family: var(--og-font-mono)\">\n · {{ timestamp() }}\n </span>\n }\n </div>\n\n @if (src()) {\n <img [src]=\"src()\" [alt]=\"alt() || fileName()\" class=\"block w-full object-cover\" [style.height]=\"height()\" />\n } @else {\n <div\n class=\"flex flex-col items-center justify-center gap-normal px-large text-center\"\n [style.height]=\"height()\"\n >\n <fx-ui-hero-icon icon=\"camera\" [size]=\"22\" class=\"flex text-text-placeholder\"></fx-ui-hero-icon>\n @if (caption()) {\n <span class=\"txt-utility-caption text-text-placeholder max-w-[280px]\">{{ caption() }}</span>\n }\n </div>\n }\n</div>\n@if (src() && caption()) {\n <div class=\"txt-utility-caption text-text-placeholder mt-normal\">{{ caption() }}</div>\n}\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { Tone, toneBg } from '../../../core/value-tone.util';\nimport { NgClass } from '@angular/common';\n\n/** Thin tone-coloured progress/score bar with optional label and caption. */\n@Component({\n selector: 'fx-ui-meter',\n templateUrl: './meter.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class MeterComponent {\n @Input() value = 0;\n @Input() max = 10;\n readonly tone = input<Tone | null>(null);\n /** Caller-translated texts; omitted → bar only. */\n @Input() label?: string;\n @Input() caption?: string;\n\n get percent(): number {\n const max = Number(this.max) || 1;\n const pct = (Number(this.value) / max) * 100;\n return Math.min(100, Math.max(0, pct));\n }\n\n get fillClass(): string {\n return toneBg(this.tone());\n }\n}\n","<div class=\"flex flex-col gap-small w-full\">\n @if (label || caption) {\n <div class=\"flex items-center justify-between gap-normal\">\n @if (label) {\n <span class=\"txt-field-label !mb-0\">{{ label }}</span>\n }\n @if (caption) {\n <span class=\"txt-utility-caption text-text-secondary\">{{ caption }}</span>\n }\n </div>\n }\n <div\n class=\"h-2 rounded-full bg-bg-hover overflow-hidden\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"max\"\n [attr.aria-valuenow]=\"value\"\n [attr.aria-label]=\"label || null\"\n >\n <div class=\"h-full rounded-full\" [ngClass]=\"fillClass\" [style.width.%]=\"percent\"></div>\n </div>\n</div>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { Tone, toneText } from '../../../core/value-tone.util';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { NgClass } from '@angular/common';\n\n/**\n * Panel section: card with a header and projected body.\n * - titleStyle 'heading' (default): icon + heading, the pre-V2 look\n * - titleStyle 'eyebrow': the V2 design's panel header — small tracked\n * caption on the left, muted [aside] text on the right\n *\n * The host is a flex column (not the custom element's inline default) so that\n * in a CSS grid row every card stretches to the row height and panels line up\n * (anh Tú 04/09); a footer projected with `mt-auto` sticks to the bottom.\n */\n@Component({\n selector: 'fx-ui-section-card',\n templateUrl: './section-card.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent, NgClass],\n host: { class: 'flex flex-col min-w-0' },\n})\nexport class SectionCardComponent {\n /** Caller-translated heading. */\n readonly title = input('');\n /** hero-icon name; omitted → text-only header. */\n @Input() icon?: any;\n readonly iconTone = input<Tone | null>(null);\n readonly titleStyle = input<'heading' | 'eyebrow'>('heading');\n /** Caller-translated right-aligned hint (eyebrow style). */\n readonly aside = input('');\n\n get iconClass(): string {\n const iconTone = this.iconTone();\n return iconTone ? toneText(iconTone) : 'text-text-secondary';\n }\n}\n","<!-- flex column filling the host: cards in one grid row share a height and a\n projected footer can sit at the bottom with `mt-auto` (design 01). -->\n<div class=\"card-common bg-surface flex flex-col flex-1 min-h-0\">\n @if (titleStyle() === 'eyebrow') {\n <div class=\"flex items-baseline justify-between gap-normal mb-large\">\n <span class=\"txt-eyebrow\">{{ title() }}</span>\n @if (aside()) {\n <span class=\"txt-utility-description text-right\">{{ aside() }}</span>\n }\n </div>\n } @else {\n <div class=\"flex items-center gap-normal mb-large\">\n @if (icon) {\n <fx-ui-hero-icon [ngClass]=\"iconClass\" [icon]=\"icon\" [size]=\"18\"></fx-ui-hero-icon>\n }\n <span class=\"txt-heading-06\">{{ title() }}</span>\n </div>\n }\n <ng-content></ng-content>\n</div>\n","import { Component, Input, ChangeDetectionStrategy, input } from '@angular/core';\nimport { Tone, toneText } from '../../../core/value-tone.util';\nimport { NgClass } from '@angular/common';\n\n/**\n * Label-over-value field for detail panels. The label uses txt-field-label\n * with its baked-in margin neutralised (the known mb-1 alignment gotcha) —\n * spacing is owned by this component.\n */\n@Component({\n selector: 'fx-ui-info-field',\n templateUrl: './info-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class InfoFieldComponent {\n /** Caller-translated label. */\n readonly label = input('');\n @Input() value: string | number | null | undefined;\n /** Colours the value; null/undefined renders the primary text colour. */\n @Input() tone: Tone | null = null;\n /** Monospace value (hashes, paths). */\n @Input() mono = false;\n /** Placeholder when value is empty. */\n readonly placeholder = input('---');\n\n get displayValue(): string {\n if (this.value === null || this.value === undefined || this.value === '') {\n return this.placeholder();\n }\n return String(this.value);\n }\n\n get valueClass(): string {\n const toneClass = this.tone ? toneText(this.tone) : 'text-text-primary';\n return this.mono ? `${toneClass} font-mono break-all` : toneClass;\n }\n}\n","<div class=\"flex flex-col gap-small min-w-0\">\n <span class=\"txt-field-label !mb-0\">{{ label() }}</span>\n <span class=\"txt-default\" [ngClass]=\"valueClass\">{{ displayValue }}</span>\n</div>\n","import { Component, Input, ChangeDetectionStrategy, output } from '@angular/core';\nimport { Tone, toneBadge } from '../../../core/value-tone.util';\nimport { NgClass } from '@angular/common';\n\nexport interface FxSeverityBadge {\n key: string;\n label: string | number;\n tone: Tone | null;\n}\n\n/**\n * Compact total/critical/high/medium(/low) badge cluster used in table cells.\n * Pass counts via [stats]; missing fields are skipped. Labels are numbers, so\n * no i18n is involved; the total badge renders neutral.\n */\n@Component({\n selector: 'fx-ui-severity-badges',\n templateUrl: './severity-badges.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class SeverityBadgesComponent {\n @Input() stats: {\n total?: number;\n critical?: number;\n high?: number;\n medium?: number;\n low?: number;\n } | null = null;\n /** Show zero-count badges (default true, mirrors the table-cell usage). */\n @Input() showZero = true;\n /** Append the severity letter to counts (\"3C\", \"5H\", \"2M\") per the report design. */\n @Input() suffixed = false;\n readonly badgeClick = output<string>();\n\n private static readonly TONES: Record<string, Tone | null> = {\n total: null,\n critical: 'critical',\n high: 'danger',\n medium: 'warning',\n low: 'success',\n };\n\n get badges(): FxSeverityBadge[] {\n const s = this.stats ?? {};\n return (['total', 'critical', 'high', 'medium', 'low'] as const)\n .filter((key) => s[key] !== undefined && (this.showZero || Number(s[key]) > 0))\n .map((key) => {\n const count = Number(s[key]) || 0;\n const label =\n this.suffixed && key !== 'total' ? `${count}${key.charAt(0).toUpperCase()}` : count;\n return { key, label, tone: SeverityBadgesComponent.TONES[key] };\n });\n }\n\n badgeClass(badge: FxSeverityBadge): string {\n return badge.tone ? toneBadge(badge.tone) : 'bg-bg-hover text-text-primary';\n }\n}\n","<div class=\"flex items-center gap-small\">\n @for (badge of badges; track badge.key) {\n <button\n type=\"button\"\n class=\"px-2 py-[3px] rounded-full txt-utility-caption font-medium cursor-pointer focus-visible:ring-2 focus-visible:ring-primary/50\"\n [ngClass]=\"badgeClass(badge)\"\n [attr.aria-label]=\"badge.key + ': ' + badge.label\"\n (click)=\"badgeClick.emit(badge.key)\"\n >{{ badge.label }}</button>\n }\n</div>\n","import { Component, Input, TemplateRef, AfterViewInit, AfterContentInit, ElementRef, inject, input, contentChild, viewChild, linkedSignal } from '@angular/core';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { BaseMasterDetailComponent } from '../../../core/components/base-master-detail.component';\nimport { SkeletonListComponent } from '../skeleton-list/skeleton-list.component';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { EmptyStateComponent } from '../empty-state/empty-state.component';\nimport { SkeletonDetailComponent } from '../skeleton-detail/skeleton-detail.component';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nlet nextUid = 0;\n\n/**\n * Master-detail shell driven by a BaseMasterDetailComponent. Two-column by\n * default; projecting a [mdFacets] block (V2 lookup screens) adds a third\n * facets-rail column before the list. The host page projects its own\n * header/filters and supplies templates for the parts that vary per entity:\n *\n * <fx-ui-master-detail [table]=\"this\" [emptyMessage]=\"'noData' | translate\">\n * <div mdFacets>…<fx-ui-facets-rail …/>…</div> <!-- optional, V2 -->\n * <div mdHeader>…title / stat cards…</div>\n * <div mdFilters>…search bar / filter chips…</div>\n * <ng-template #row let-item let-selected=\"selected\">…row body…</ng-template>\n * <ng-template #detail let-detail>…detail pane…</ng-template>\n * </fx-ui-master-detail>\n *\n * The list behaves as a single-select listbox: the selected option is the\n * tab stop, ArrowUp/Down/Home/End move the selection.\n */\n@Component({\n selector: 'fx-ui-master-detail',\n templateUrl: './master-detail.component.html',\n styleUrl: './master-detail.component.css',\n imports: [\n SkeletonListComponent,\n NgClass,\n NgTemplateOutlet,\n EmptyStateComponent,\n MatPaginator,\n SkeletonDetailComponent,\n HeroIconComponent,\n ],\n})\nexport class MasterDetailComponent implements AfterViewInit, AfterContentInit {\n private hostEl = inject(ElementRef<HTMLElement>);\n\n /** True when the host projected a [mdFacets] block — switches to 3 columns. */\n hasFacets = false;\n\n @Input() table!: BaseMasterDetailComponent<any>;\n /** Fixed list-pane width on lg+ viewports (stacked full-width below). */\n readonly listWidth = input('420px');\n /**\n * Chiều cao CHUNG của cả ba cụm (facets / list / detail). Mặc định trừ phần\n * chrome phía trên (topbar + tab strip + context line) khỏi viewport để\n * bảng ba cột vừa đúng một màn, không kéo trang cuộn theo.\n * Chỉ có tác dụng từ 1080px — xem `.fx-md-row` trong CSS.\n */\n readonly paneHeight = input('calc(100vh - 300px)');\n readonly pageSizeOptions = input([5, 10, 20, 50]);\n /** Labels come in via inputs — the lib carries no i18n. */\n readonly emptyMessage = input('No data');\n readonly listLabel = input('');\n readonly skeletonCards = input(3);\n /** 'prevnext' renders the V2 \"X of Y\" + Prev/Next controls instead of the\n Material paginator (which stays in the DOM, hidden — it is the paging\n engine BaseTable subscribes to). */\n readonly paginationStyle = input<'paginator' | 'prevnext'>('paginator');\n /** Caller-translated Prev/Next labels (\"X of Y\" is numeric). */\n readonly prevLabel = input('Prev');\n readonly nextLabel = input('Next');\n /** \"Page 1 of 4\" (design 11/14/17) — the two words, caller-translated. */\n readonly pageLabel = input('Page');\n readonly ofLabel = input('of');\n /**\n * Facets rail open (design 11/14) or collapsed to a 40px strip (design 17).\n * The user can toggle either way; this only sets the initial state.\n */\n readonly facetsOpen = input(true);\n /** Caller-translated rail heading (\"Scope & facets\"). */\n readonly facetsLabel = input('Scope & facets');\n readonly expandFacetsLabel = input('Show scope & facets');\n readonly collapseFacetsLabel = input('Hide scope & facets');\n /** Current rail state — follows `facetsOpen` until the user toggles. */\n readonly railOpen = linkedSignal(() => this.facetsOpen());\n\n readonly rowTemplate = contentChild.required<TemplateRef<any>>('row');\n readonly detailTemplate = contentChild.required<TemplateRef<any>>('detail');\n readonly paginator = viewChild.required(MatPaginator);\n\n readonly uid = `fx-md-${nextUid++}`;\n\n ngAfterContentInit(): void {\n this.hasFacets = !!this.hostEl.nativeElement.querySelector('[mdFacets]');\n // Stacked layout (container narrower than md = 720px): start with the rail\n // collapsed so the list is the first thing on screen — an open rail with\n // six facet groups pushed the list a full screen down on phones\n // (anh Tú 04/09 mobile audit). The user can still expand it.\n if (this.hasFacets && this.hostEl.nativeElement.clientWidth > 0 && this.hostEl.nativeElement.clientWidth < 720) {\n this.railOpen.set(false);\n }\n }\n\n ngAfterViewInit(): void {\n // The paginator lives in this view, not the host page's, so the host's\n // @ViewChild(MatPaginator) never finds it. Hand it to the table so\n // refresh() keeps resetting pageIndex.\n if (this.table) {\n this.table.paginator = this.paginator();\n }\n }\n\n /** \"Page X of Y\" for the prevnext pagination style (design 11/14/17). */\n rangeText(): string {\n const total = this.table.total ?? 0;\n const size = this.table.pageSize || 1;\n const pages = Math.max(1, Math.ceil(total / size));\n const page = Math.min(pages, (this.paginator().pageIndex ?? 0) + 1);\n return `${this.pageLabel()} ${page} ${this.ofLabel()} ${pages}`;\n }\n\n isSelected(row: any): boolean {\n return this.table.idOf(row) === this.table.selectedId;\n }\n\n optionId(index: number): string {\n return `${this.uid}-opt-${index}`;\n }\n\n onKeydown(event: KeyboardEvent, index: number): void {\n const rows = this.table.dataSource.data || [];\n if (!rows.length) {\n return;\n }\n let next: number;\n switch (event.key) {\n case 'ArrowDown':\n next = Math.min(index + 1, rows.length - 1);\n break;\n case 'ArrowUp':\n next = Math.max(index - 1, 0);\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = rows.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n if (next === index) {\n return;\n }\n this.table.selectItem(rows[next]);\n const el = document.getElementById(this.optionId(next));\n el?.focus();\n el?.scrollIntoView({ block: 'nearest' });\n }\n}\n","<!-- ONE frame, three columns (designs 11/14/17): facets rail · list · detail,\n separated by hairlines, sharing one height; only each pane's body scrolls.\n Row direction / height come from the CONTAINER QUERY in the CSS (the row's\n own width), never from `lg:*` — see the note at the top of the .css. -->\n<div\n class=\"fx-md-row flex flex-col items-stretch\"\n [class.fx-md-row--rail-open]=\"railOpen()\"\n [style.--fx-md-list-width]=\"listWidth()\"\n [style.--fx-md-pane-h]=\"paneHeight()\"\n>\n <!-- Facets rail — collapsible (» / «), collapsed = 40px strip with the label\n set vertically. The [mdFacets] projection is unconditional (hasFacets is\n detected by querying it) and only hidden while collapsed. -->\n <aside\n class=\"fx-md-facets flex flex-col min-h-0 min-w-0\"\n [class.hidden]=\"!hasFacets\"\n [class.fx-md-facets--open]=\"railOpen()\"\n >\n <div class=\"fx-md-rail-head flex items-center gap-small px-normal py-semi border-b border-border-subtle shrink-0\" [class.hidden]=\"!railOpen()\">\n <button\n type=\"button\"\n class=\"flex items-center justify-center w-6 h-6 rounded-control text-muted hover:bg-bg-hover shrink-0\"\n [attr.aria-label]=\"collapseFacetsLabel()\"\n (click)=\"railOpen.set(false)\"\n >\n <fx-ui-hero-icon icon=\"chevron-double-left\" [size]=\"14\" class=\"flex\" />\n </button>\n <span class=\"txt-eyebrow truncate\">{{ facetsLabel() }}</span>\n </div>\n <div class=\"flex-1 min-h-0 overflow-auto px-normal py-normal\" [class.hidden]=\"!railOpen()\">\n <ng-content select=\"[mdFacets]\"></ng-content>\n </div>\n <button\n type=\"button\"\n class=\"fx-md-rail-toggle flex items-center gap-normal text-muted hover:bg-bg-hover transition-colors\"\n [class.hidden]=\"railOpen()\"\n [attr.aria-label]=\"expandFacetsLabel()\"\n [attr.aria-expanded]=\"false\"\n (click)=\"railOpen.set(true)\"\n >\n <fx-ui-hero-icon icon=\"chevron-double-right\" [size]=\"14\" class=\"flex shrink-0\" />\n <span class=\"fx-md-rail-label txt-eyebrow whitespace-nowrap\">{{ facetsLabel() }}</span>\n </button>\n </aside>\n\n <!-- Master: list pane -->\n <section class=\"fx-md-list flex flex-col min-h-0 min-w-0\">\n <div class=\"fx-md-list-head px-large pt-large pb-small border-b border-border-subtle shrink-0\">\n <ng-content select=\"[mdHeader]\"></ng-content>\n <ng-content select=\"[mdFilters]\"></ng-content>\n </div>\n <div\n class=\"flex flex-col overflow-auto flex-1 min-h-0\"\n role=\"listbox\"\n [attr.aria-label]=\"listLabel() || null\"\n >\n @if (table.loading) {\n <div class=\"px-large py-normal\">\n <fx-ui-skeleton-list [rows]=\"table.pageSize\"></fx-ui-skeleton-list>\n </div>\n } @else {\n @for (row of table.dataSource.data; track table.idOf(row); let i = $index) {\n <!-- Hairline rows; the selected one is tinted with an accent bar on\n the left (design 11/14 selected finding / component). -->\n <button\n type=\"button\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [attr.aria-selected]=\"isSelected(row)\"\n [tabindex]=\"isSelected(row) ? 0 : -1\"\n (click)=\"table.selectItem(row)\"\n (keydown)=\"onKeydown($event, i)\"\n class=\"text-left px-large py-semi border-l-2 border-b border-b-border-subtle transition-colors\"\n [ngClass]=\"\n isSelected(row)\n ? 'border-l-accent bg-accent-soft/60'\n : 'border-l-transparent hover:bg-surface-sunken'\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"rowTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: row, selected: isSelected(row) }\"\n ></ng-container>\n </button>\n }\n @if (!table.dataSource.data.length) {\n <div class=\"px-large py-large\">\n <fx-ui-empty-state [message]=\"emptyMessage()\"></fx-ui-empty-state>\n </div>\n }\n }\n </div>\n <!-- No (page) binding: ngAfterViewInit hands this paginator to the table,\n whose own BaseTable subscription (running after this child's hook)\n wires page events — a binding here would double-fetch every change. -->\n <mat-paginator\n class=\"fx-md-paginator\"\n [class.fx-md-paginator-hidden]=\"paginationStyle() === 'prevnext'\"\n [length]=\"table.total\"\n [pageSize]=\"table.pageSize\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n ></mat-paginator>\n @if (paginationStyle() === 'prevnext') {\n <div class=\"flex items-center justify-between gap-normal px-large py-normal border-t border-border-subtle shrink-0\">\n <span class=\"txt-utility-description\" style=\"font-family: var(--og-font-figure)\">\n {{ rangeText() }}\n </span>\n <div class=\"flex gap-small\">\n <button\n type=\"button\"\n class=\"btn-alternative !h-8 !px-semi text-sm\"\n [disabled]=\"!paginator().hasPreviousPage()\"\n (click)=\"paginator().previousPage()\"\n >\n {{ prevLabel() }}\n </button>\n <button\n type=\"button\"\n class=\"btn-alternative !h-8 !px-semi text-sm\"\n [disabled]=\"!paginator().hasNextPage()\"\n (click)=\"paginator().nextPage()\"\n >\n {{ nextLabel() }}\n </button>\n </div>\n </div>\n }\n </section>\n\n <!-- Detail pane -->\n <section class=\"fx-md-detail w-full min-w-0 flex flex-col min-h-0\">\n <div class=\"flex-1 min-h-0 overflow-auto px-large py-large\">\n @if (table.selected) {\n @if (table.detailBusy) {\n <fx-ui-skeleton-detail [cards]=\"skeletonCards()\"></fx-ui-skeleton-detail>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"detailTemplate()\"\n [ngTemplateOutletContext]=\"{ $implicit: table.detail, selected: table.selected }\"\n ></ng-container>\n }\n } @else {\n <div class=\"flex items-center justify-center h-full min-h-[300px]\">\n <fx-ui-empty-state [message]=\"emptyMessage()\"></fx-ui-empty-state>\n </div>\n }\n </div>\n </section>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n output\n} from '@angular/core';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport { Tone } from '../../../core/value-tone.util';\n\nexport interface FxMenuItem {\n /** Caller-translated label. */\n label: string;\n /** Optional hero-icon name shown before the label. */\n icon?: string;\n /** Danger/warning items get the matching text tone. */\n tone?: Tone | null;\n disabled?: boolean;\n /** Free-form identifier handed back on (select). */\n value?: any;\n}\n\n/**\n * Row-action dropdown wrapper over mat-menu (behavior-layer rule, Playbook\n * §5.1 — apps never import @angular/material directly). Project the trigger\n * content; items render from [items] and come back through (select).\n *\n * <fx-ui-menu [items]=\"actions\" (select)=\"onAction($event)\">\n * <fx-ui-hero-icon icon=\"ellipsis-vertical\" [size]=\"20\" />\n * </fx-ui-menu>\n */\n@Component({\n selector: 'fx-ui-menu',\n templateUrl: './menu.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatMenuModule, HeroIconComponent],\n})\nexport class MenuComponent {\n readonly items = input<FxMenuItem[]>([]);\n readonly disabled = input(false);\n /** Accessible name for the trigger button. */\n readonly ariaLabel = input('Open menu');\n readonly select = output<FxMenuItem>();\n\n toneClass(item: FxMenuItem): string {\n switch (item.tone) {\n case 'critical':\n case 'danger':\n return 'tone-fg-danger';\n case 'warning':\n return 'tone-fg-warning';\n case 'success':\n return 'tone-fg-success';\n case 'information':\n return 'tone-fg-information';\n default:\n return 'text-text-primary';\n }\n }\n}\n","<button\n type=\"button\"\n class=\"inline-flex items-center justify-center rounded-lg p-1 hover:bg-bg-hover transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n [matMenuTriggerFor]=\"menu\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <ng-content></ng-content>\n</button>\n\n<mat-menu #menu=\"matMenu\">\n @for (item of items(); track item.label) {\n <button\n mat-menu-item\n type=\"button\"\n [disabled]=\"item.disabled\"\n (click)=\"select.emit(item)\"\n >\n <span class=\"flex items-center gap-normal\" [class]=\"toneClass(item)\">\n @if (item.icon) {\n <fx-ui-hero-icon [icon]=\"item.icon\" [size]=\"18\"></fx-ui-hero-icon>\n }\n <span>{{ item.label }}</span>\n </span>\n </button>\n }\n</mat-menu>\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport {\n OG_PICKER_THEME_META,\n OG_THEME_META,\n OgTheme,\n OgThemeMeta,\n ThemeService,\n} from '../../../core/services/theme.service';\n\n/**\n * V2 theme picker — dropdown các theme OgeniumDashboards cho chọn\n * (OG_PICKER_THEME_META: porcelain/charcoal), mỗi dòng có swatch accent +\n * page. Drives ThemeService.setTheme(); replaces the pre-V2 sun/moon toggle\n * (behavior-layer rule: mat-menu stays inside the lib, apps never import\n * @angular/material directly).\n *\n * <fx-ui-theme-picker />\n */\n@Component({\n selector: 'fx-ui-theme-picker',\n templateUrl: './theme-picker.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatMenuModule, HeroIconComponent],\n})\nexport class ThemePickerComponent {\n private themeService = inject(ThemeService);\n\n readonly themes: readonly OgThemeMeta[] = OG_PICKER_THEME_META;\n readonly current = toSignal(this.themeService.themeChanges(), {\n initialValue: this.themeService.getCurrentTheme(),\n });\n\n /** Tra trên bộ ĐẦY ĐỦ: theme đang active có thể là một trong 4 theme đã ẩn\n khỏi picker (deep-link /themes, localStorage cũ) — nhãn vẫn phải đúng. */\n currentMeta(): OgThemeMeta {\n return OG_THEME_META.find((t) => t.name === this.current()) ?? this.themes[0];\n }\n\n select(theme: OgTheme) {\n this.themeService.setTheme(theme);\n }\n}\n","<button\n type=\"button\"\n [matMenuTriggerFor]=\"themeMenu\"\n class=\"flex items-center gap-small px-normal py-small rounded-control border border-border-default bg-transparent cursor-pointer hover:bg-bg-hover transition-colors\"\n aria-label=\"Change theme\"\n>\n <span\n class=\"w-4 h-4 rounded-full border border-border-strong/30 shrink-0\"\n [style.background]=\"\n 'linear-gradient(135deg, ' +\n currentMeta().accent +\n ' 50%, ' +\n currentMeta().pageBg +\n ' 50%)'\n \"\n ></span>\n <span class=\"txt-body-01 hidden md:inline\">{{ currentMeta().label }}</span>\n <fx-ui-hero-icon icon=\"chevron-down\" [size]=\"14\" class=\"flex text-text-secondary\" />\n</button>\n\n<mat-menu #themeMenu=\"matMenu\">\n @for (theme of themes; track theme.name) {\n <button\n mat-menu-item\n type=\"button\"\n (click)=\"select(theme.name)\"\n [attr.aria-current]=\"theme.name === current() ? 'true' : null\"\n >\n <div class=\"flex items-center gap-normal min-w-40\">\n <span\n class=\"w-5 h-5 rounded-full border border-border-strong/30 shrink-0\"\n [style.background]=\"\n 'linear-gradient(135deg, ' + theme.accent + ' 50%, ' + theme.pageBg + ' 50%)'\n \"\n ></span>\n <span class=\"txt-body-01 flex-1\">{{ theme.label }}</span>\n <span class=\"txt-utility-description\">{{ theme.dark ? 'Dark' : 'Light' }}</span>\n @if (theme.name === current()) {\n <fx-ui-hero-icon icon=\"check\" [size]=\"16\" class=\"flex text-text-selected\" />\n }\n </div>\n </button>\n }\n</mat-menu>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n/**\n * \"Waiting on the backend\" marker (anh Tú 29/08).\n *\n * Put this on any UI the V2 design calls for but no endpoint feeds yet, so the\n * gap is visible in the product instead of living only in a backlog file.\n * `grep -r \"fx-ui-pending-badge\"` then lists every outstanding field.\n *\n * <fx-ui-pending-badge [field]=\"'confirmed-chains weekly series'\" />\n *\n * Keep the copy factual: it states that data is missing, never fakes a value.\n * Styling is neutral on purpose (anh Tú 04/09): a hint, not a warning.\n */\n@Component({\n selector: 'fx-ui-pending-badge',\n templateUrl: './pending-badge.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class PendingBadgeComponent {\n /** Caller-translated chip text. */\n readonly label = input('Pending API');\n /**\n * What exactly is missing — shown as the title tooltip so a reviewer can read\n * the required field without opening the code.\n */\n readonly field = input('');\n /** 'chip' (default) sits inline; 'dot' is a bare marker for dense rows. */\n readonly variant = input<'chip' | 'dot'>('chip');\n\n get tooltip(): string {\n return this.field() ? `${this.label()} — ${this.field()}` : this.label();\n }\n}\n","@if (variant() === 'dot') {\n <span\n class=\"inline-block w-[7px] h-[7px] rounded-full bg-muted/60 align-middle\"\n [attr.title]=\"tooltip\"\n [attr.aria-label]=\"tooltip\"\n ></span>\n} @else {\n <span\n class=\"inline-flex items-center gap-xs px-small py-[1px] rounded-pill border border-border-subtle bg-neutral-soft text-muted txt-tag-label whitespace-nowrap align-middle\"\n [attr.title]=\"tooltip\"\n >\n <fx-ui-hero-icon icon=\"clock\" [size]=\"11\" class=\"flex\" />\n {{ label() }}\n </span>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n inject,\n signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\nimport {\n Breadcrumb,\n BreadcrumbOption,\n BreadcrumbService,\n} from '../../../core/services/breadcrumb.service';\n\n/**\n * V2 topbar breadcrumb (design 02/12/13, measured on the demo 04/09).\n *\n * Projects / [◳ RocketChat ▾] / [⬡ rocketchat.exe · 4.8.1 ▾]\n *\n * Plain crumbs are quiet links (12.5px / 500 / muted); the last one is strong.\n * A crumb with `icon` or `switcher` renders as a chip — hairline border,\n * surface fill, 1px shadow — and a `switcher` opens a listbox with a filter\n * box, the sibling options, an optional \"View all\" row and a \"Create\" CTA.\n * Data comes from the app through `BreadcrumbService`; this component only\n * draws and navigates.\n */\n@Component({\n selector: 'fx-ui-breadcrumb',\n templateUrl: './breadcrumb.component.html',\n styleUrl: './breadcrumb.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class BreadcrumbComponent {\n private readonly service = inject(BreadcrumbService);\n private readonly router = inject(Router);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n readonly crumbs = toSignal(this.service.get(), { initialValue: [] as Breadcrumb[] });\n\n /** Index of the crumb whose switcher panel is open; null = closed. */\n readonly openIndex = signal<number | null>(null);\n readonly options = signal<BreadcrumbOption[]>([]);\n readonly loading = signal(false);\n readonly keyword = signal('');\n /** Drops results of a superseded load (typing fast, reopening). */\n private loadSeq = 0;\n\n isChip(crumb: Breadcrumb): boolean {\n return !!(crumb.icon || crumb.switcher);\n }\n\n onChipClick(crumb: Breadcrumb, index: number, event: MouseEvent): void {\n event.stopPropagation();\n if (crumb.switcher) {\n if (this.openIndex() === index) {\n this.close();\n } else {\n this.open(crumb, index);\n }\n return;\n }\n if (crumb.url) this.navigate(crumb.url);\n }\n\n private open(crumb: Breadcrumb, index: number): void {\n this.openIndex.set(index);\n this.keyword.set('');\n void this.load(crumb, '');\n // Focus the filter box once it exists so typing starts immediately.\n setTimeout(() => {\n this.host.nativeElement.querySelector<HTMLInputElement>('.fx-crumb-panel__filter')?.focus();\n });\n }\n\n close(): void {\n this.openIndex.set(null);\n this.options.set([]);\n this.loading.set(false);\n }\n\n onFilter(crumb: Breadcrumb, value: string): void {\n this.keyword.set(value);\n void this.load(crumb, value);\n }\n\n private async load(crumb: Breadcrumb, keyword: string): Promise<void> {\n const switcher = crumb.switcher;\n if (!switcher) return;\n const seq = ++this.loadSeq;\n this.loading.set(true);\n try {\n const rows = await switcher.load(keyword);\n if (seq !== this.loadSeq) return;\n this.options.set(rows ?? []);\n } catch {\n if (seq !== this.loadSeq) return;\n this.options.set([]);\n } finally {\n if (seq === this.loadSeq) this.loading.set(false);\n }\n }\n\n pick(option: BreadcrumbOption, event: Event): void {\n event.stopPropagation();\n this.close();\n this.navigate(option.url);\n }\n\n go(event: Event, url?: string): void {\n event.preventDefault();\n event.stopPropagation();\n this.close();\n if (url) this.navigate(url);\n }\n\n private navigate(url: string): void {\n this.router.navigateByUrl(url).catch(() => {\n window.location.href = url;\n });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (this.openIndex() === null) return;\n if (!this.host.nativeElement.contains(event.target as Node)) this.close();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.openIndex() !== null) this.close();\n }\n}\n","<nav aria-label=\"Breadcrumb\" class=\"fx-crumbs\">\n @for (crumb of crumbs(); track $index; let last = $last; let i = $index) {\n @if (i > 0) {\n <span aria-hidden=\"true\" class=\"fx-crumb-sep\">/</span>\n }\n @if (isChip(crumb)) {\n <span class=\"relative inline-flex min-w-0\">\n <button\n type=\"button\"\n class=\"fx-crumb-chip\"\n [class.fx-crumb-chip--mono]=\"crumb.mono\"\n [attr.aria-haspopup]=\"crumb.switcher ? 'listbox' : null\"\n [attr.aria-expanded]=\"crumb.switcher ? openIndex() === i : null\"\n [attr.title]=\"crumb.switcher?.title || crumb.label\"\n (click)=\"onChipClick(crumb, i, $event)\"\n >\n @if (crumb.icon) {\n <fx-ui-hero-icon [icon]=\"crumb.icon\" [size]=\"13\" class=\"flex shrink-0 text-accent\" />\n }\n <span class=\"truncate\">{{ crumb.label }}</span>\n @if (crumb.switcher) {\n <fx-ui-hero-icon icon=\"chevron-down\" [size]=\"10\" class=\"flex shrink-0 text-faint\" />\n }\n </button>\n\n @if (crumb.switcher; as sw) {\n @if (openIndex() === i) {\n <div role=\"listbox\" class=\"fx-crumb-panel\" [class.fx-crumb-panel--mono]=\"sw.mono\">\n <div class=\"fx-crumb-panel__title\">{{ sw.title }}</div>\n @if (sw.filterPlaceholder) {\n <input\n type=\"search\"\n class=\"fx-crumb-panel__filter\"\n [placeholder]=\"sw.filterPlaceholder\"\n [attr.aria-label]=\"sw.filterPlaceholder\"\n [value]=\"keyword()\"\n (input)=\"onFilter(crumb, $any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n @if (loading() && options().length === 0) {\n <div class=\"fx-crumb-panel__skeleton\" aria-busy=\"true\">\n <span></span><span></span><span></span>\n </div>\n } @else if (options().length === 0) {\n <div class=\"fx-crumb-panel__empty\">{{ sw.emptyLabel || '—' }}</div>\n }\n @for (opt of options(); track opt.value) {\n <button\n type=\"button\"\n role=\"option\"\n class=\"fx-crumb-panel__opt\"\n [class.fx-crumb-panel__opt--on]=\"opt.value === sw.selected\"\n [attr.aria-selected]=\"opt.value === sw.selected\"\n (click)=\"pick(opt, $event)\"\n >\n <span class=\"truncate\">{{ opt.label }}</span>\n @if (opt.meta) {\n <span class=\"fx-crumb-panel__meta\">{{ opt.meta }}</span>\n }\n @if (opt.value === sw.selected) {\n <fx-ui-hero-icon icon=\"check\" [size]=\"13\" class=\"flex shrink-0 text-strong\" />\n }\n </button>\n }\n @if (sw.viewAll || sw.create) {\n <div class=\"fx-crumb-panel__rule\"></div>\n }\n @if (sw.viewAll; as more) {\n <button type=\"button\" class=\"fx-crumb-panel__more\" (click)=\"go($event, more.url)\">\n <fx-ui-hero-icon icon=\"ellipsis-horizontal\" [size]=\"13\" class=\"flex shrink-0 text-faint\" />\n {{ more.label }}\n </button>\n }\n @if (sw.create; as create) {\n <button type=\"button\" class=\"fx-crumb-panel__create\" (click)=\"go($event, create.url)\">\n <fx-ui-hero-icon icon=\"plus\" [size]=\"14\" class=\"flex shrink-0\" />\n {{ create.label }}\n </button>\n }\n </div>\n }\n }\n </span>\n } @else if (!last && crumb.url) {\n <a class=\"fx-crumb-link\" [href]=\"crumb.url\" (click)=\"go($event, crumb.url)\">{{ crumb.label }}</a>\n } @else {\n <span class=\"fx-crumb-current\">{{ crumb.label }}</span>\n }\n }\n</nav>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { FxLoadStatusService } from '../../../core/services/load-status.service';\n\n/**\n * Topbar load status (design \"Loading States\", measured 04/09):\n *\n * ◌ Loading charts · 1 of 4 → while requests are pending\n * ● Up to date · just now ↻ → once the batch settled\n *\n * Mono 10.5px; muted while loading, faint when idle; 11px spinner (2px ring,\n * accent top). With `bar` a 2px indeterminate strip is drawn along the top\n * edge of the nearest positioned ancestor (the topbar) while loading.\n * Labels are caller-translated inputs; the ↻ button emits `reload`.\n */\n@Component({\n selector: 'fx-ui-load-status',\n templateUrl: './load-status.component.html',\n styleUrl: './load-status.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LoadStatusComponent {\n readonly status = inject(FxLoadStatusService);\n\n readonly loadingLabel = input('Loading');\n readonly ofLabel = input('of');\n readonly upToDateLabel = input('Up to date');\n readonly justNowLabel = input('just now');\n /** `{n}` is replaced by the minute count. */\n readonly minutesAgoLabel = input('{n} min ago');\n readonly reloadLabel = input('Reload data');\n /** Draw the 2px indeterminate bar along the top of the positioned ancestor. */\n readonly bar = input(false);\n /** Show the ↻ button. */\n readonly showReload = input(true);\n\n readonly reload = output<void>();\n\n /** Ticks every 30 s so \"just now\" ages into \"N min ago\" without traffic. */\n private readonly tick = signal(0);\n\n constructor() {\n const timer = setInterval(() => this.tick.update((n) => n + 1), 30_000);\n inject(DestroyRef).onDestroy(() => clearInterval(timer));\n }\n\n readonly loadingText = computed(() => {\n const total = Math.max(this.status.total(), 1);\n const done = Math.min(this.status.done(), total);\n const label = this.status.current();\n return `${this.loadingLabel()}${label ? ' ' + label : ''} · ${done} ${this.ofLabel()} ${total}`;\n });\n\n readonly idleText = computed(() => {\n this.tick();\n const at = this.status.lastUpdated();\n if (!at) return this.upToDateLabel();\n const minutes = Math.floor((Date.now() - at.getTime()) / 60_000);\n const when = minutes < 1 ? this.justNowLabel() : this.minutesAgoLabel().replace('{n}', String(minutes));\n return `${this.upToDateLabel()} · ${when}`;\n });\n\n onReload(): void {\n this.reload.emit();\n this.status.requestReload();\n }\n}\n","@if (bar() && status.loading()) {\n <div class=\"fx-load-bar\" aria-hidden=\"true\"><div class=\"fx-load-bar__run\"></div></div>\n}\n<div class=\"fx-load-status\" role=\"status\" aria-live=\"polite\" [class.fx-load-status--idle]=\"!status.loading()\">\n @if (status.loading()) {\n <span class=\"fx-load-spinner\" aria-hidden=\"true\"></span>\n <span class=\"truncate\">{{ loadingText() }}</span>\n } @else {\n <span class=\"fx-load-dot\" aria-hidden=\"true\">●</span>\n <span class=\"truncate\">{{ idleText() }}</span>\n }\n</div>\n@if (showReload()) {\n <button type=\"button\" class=\"fx-load-reload\" [attr.aria-label]=\"reloadLabel()\" [title]=\"reloadLabel()\" (click)=\"onReload()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 12a9 9 0 1 1-3.1-6.8\" />\n <path d=\"M21 3v6h-6\" />\n </svg>\n </button>\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\n/**\n * Wraps UI that is rendered from PLACEHOLDER data so the layout can be\n * reviewed before its endpoint exists (anh Tú 29/08: \"muốn có full giao diện\n * trước để review\").\n *\n * The marker is deliberately quiet (anh Tú 04/09: no yellow frame, just a\n * subtle \"Pending API\" chip): a neutral chip above the block, with the label\n * and missing field in its tooltip. The content itself is non-interactive so\n * sample shapes are never mistaken for live state. Drop the wrapper (and the\n * sample input) the moment the API lands.\n *\n * The pending chip is inlined rather than composed from fx-ui-pending-badge:\n * one lib component importing another inside the same barrel tripped NG0919\n * (metadata read before definition) in consuming apps.\n *\n * <fx-ui-sample-frame [field]=\"'weekly activity'\" [label]=\"'Sample layout'\">\n * …chart rendered from sample series…\n * </fx-ui-sample-frame>\n */\n@Component({\n selector: 'fx-ui-sample-frame',\n templateUrl: './sample-frame.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n // Flex column so a frame placed in a stretched card can hand the remaining\n // height to its content (e.g. a chart with height=\"100%\") — panels in one\n // row then end on the same line (anh Tú 04/09).\n host: { class: 'flex flex-col min-h-0' },\n})\nexport class SampleFrameComponent {\n /** Caller-translated block label — surfaces in the chip tooltip only. */\n readonly label = input('Sample layout');\n /** Field the backend still owes — shown on the pending badge tooltip. */\n readonly field = input('');\n /** Caller-translated pending-chip text. */\n readonly pendingLabel = input('Pending API');\n\n get tooltip(): string {\n const head = `${this.label()} · ${this.pendingLabel()}`;\n return this.field() ? `${head} — ${this.field()}` : head;\n }\n}\n","<div class=\"relative flex flex-col flex-1 min-h-0\">\n <!-- One quiet chip marks the block as sample data; the tooltip names the\n missing field. flex-wrap so the chip drops a line in narrow rails. -->\n <div class=\"flex flex-wrap items-center gap-small mb-small\">\n <span\n class=\"inline-flex items-center gap-xs px-small py-[1px] rounded-pill border border-border-subtle bg-neutral-soft text-muted txt-tag-label whitespace-nowrap\"\n [attr.title]=\"tooltip\"\n >\n <fx-ui-hero-icon icon=\"clock\" [size]=\"11\" class=\"flex\" />\n {{ pendingLabel() }}\n </span>\n </div>\n <!-- Sample content is non-interactive: nothing here reflects real state. -->\n <div class=\"pointer-events-none select-none opacity-90 flex-1 min-h-0 flex flex-col\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBadge } from '../../../core/value-tone.util';\n\n/**\n * V2 score badge — the risk/score chip used on attack-path rows, dashboard\n * panels and project tiles. Colour comes from the 0–100 risk band unless an\n * explicit tone is given (bands: ≥90 critical, ≥70 danger, ≥40 warning, else\n * success — same thresholds as value-tone's scoreTone on a 0–100 scale).\n */\n@Component({\n selector: 'fx-ui-score-badge',\n templateUrl: './score-badge.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class ScoreBadgeComponent {\n readonly score = input.required<number | string>();\n /** Denominator shown as \"98 / 100\"; omit for a bare score. */\n readonly outOf = input<number | null>(null);\n /** Overrides the band-derived tone. */\n readonly tone = input<Tone | null>(null);\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n\n readonly resolvedTone = computed<Tone | null>(() => {\n const explicit = this.tone();\n if (explicit) return explicit;\n const value = Number(this.score());\n if (!isFinite(value)) return null;\n if (value >= 90) return 'critical';\n if (value >= 70) return 'danger';\n if (value >= 40) return 'warning';\n return 'success';\n });\n\n badgeClass(): string {\n return toneBadge(this.resolvedTone());\n }\n\n sizeClass(): string {\n switch (this.size()) {\n case 'sm':\n return 'text-xs px-normal py-[3px]';\n case 'lg':\n return 'text-2xl px-semi py-small font-semibold';\n default:\n return 'text-sm px-semi py-xs font-semibold';\n }\n }\n}\n","<span\n class=\"inline-flex items-center justify-center rounded-control whitespace-nowrap\"\n [ngClass]=\"[badgeClass(), sizeClass()]\"\n style=\"font-family: var(--og-font-figure)\"\n>\n {{ score() }}@if (outOf() !== null) {<span class=\"opacity-60\">&nbsp;/&nbsp;{{ outOf() }}</span>}\n</span>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBg } from '../../../core/value-tone.util';\n\n/**\n * V2 StatusDot — tiny tone-coloured indicator used in list rows, project\n * cards and stat grids. Optional pulse for \"live\" states (running scans).\n *\n * <fx-ui-status-dot tone=\"success\" />\n * <fx-ui-status-dot tone=\"warning\" [pulse]=\"true\" />\n */\n@Component({\n selector: 'fx-ui-status-dot',\n templateUrl: './status-dot.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class StatusDotComponent {\n readonly tone = input<Tone | null>(null);\n /** Diameter in px. */\n readonly size = input(8);\n readonly pulse = input(false);\n\n dotClass(): string {\n return toneBg(this.tone());\n }\n}\n","<span\n class=\"relative inline-flex shrink-0\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\"\n>\n @if (pulse()) {\n <span\n class=\"absolute inline-flex h-full w-full rounded-full opacity-60 animate-ping motion-reduce:animate-none\"\n [ngClass]=\"dotClass()\"\n ></span>\n }\n <span class=\"relative inline-flex h-full w-full rounded-full\" [ngClass]=\"dotClass()\"></span>\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n afterRenderEffect,\n computed,\n input,\n model,\n signal,\n untracked,\n viewChildren,\n} from '@angular/core';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nexport interface FxSegmentedOption {\n value: string | number;\n /** Caller-translated label. */\n label: string;\n /** Optional hero-icon before the label. */\n icon?: string;\n /** Optional trailing count chip. */\n count?: number;\n disabled?: boolean;\n}\n\n/**\n * V2 segmented control — mode toggles (Essentials/Advanced), Catalog/Table\n * view switches, sub-navigation inside a tab. Generic n-option control; the\n * semantics live with the caller.\n *\n * Rendered as a compact pill group (anh Tú 29/08): equal-width options inside\n * a rounded-full track, with a single \"thumb\" that SLIDES to the active\n * option (transform transition — no per-button background repaint).\n *\n * <fx-ui-segmented [options]=\"modes\" [(value)]=\"mode\" />\n */\n@Component({\n selector: 'fx-ui-segmented',\n templateUrl: './segmented.component.html',\n styleUrl: './segmented.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [HeroIconComponent],\n})\nexport class SegmentedComponent {\n readonly options = input<FxSegmentedOption[]>([]);\n readonly value = model<string | number | null>(null);\n /** Accessible name for the group. */\n readonly ariaLabel = input('View mode');\n /**\n * Both variants share the pill shape; they differ in the thumb fill:\n * 'default': raised surface thumb — view switches (Catalog/Table, ref 10).\n * 'pill': accent-filled thumb — the Essential/Advanced depth toggle\n * (design refs 04/05).\n */\n readonly variant = input<'default' | 'pill'>('default');\n /**\n * 'equal' (default): every segment takes the same width (view toggles such\n * as Catalog | Table). 'content': each segment is as wide as its label —\n * the demo's detail-pane tabs (\"Affected software · Summary · Evidence\"),\n * where equal columns would truncate the long label in a narrow pane.\n */\n readonly fit = input<'equal' | 'content'>('equal');\n\n private readonly optionEls = viewChildren<ElementRef<HTMLButtonElement>>('opt');\n /** Measured box of the active segment — only used when fit === 'content'. */\n private readonly thumbBox = signal<{ left: number; width: number } | null>(null);\n\n constructor() {\n // Content-fit segments have no shared width to derive the thumb from, so\n // measure the active button after each render that could move it.\n afterRenderEffect(() => {\n const index = this.activeIndex();\n this.options();\n const els = this.optionEls();\n if (this.fit() !== 'content' || index < 0 || !els[index]) {\n untracked(() => this.thumbBox.set(null));\n return;\n }\n const el = els[index].nativeElement;\n const box = { left: el.offsetLeft, width: el.offsetWidth };\n untracked(() => {\n const prev = this.thumbBox();\n if (!prev || prev.left !== box.left || prev.width !== box.width) this.thumbBox.set(box);\n });\n });\n }\n\n /** Index the sliding thumb sits on; -1 hides it (no/unknown selection). */\n readonly activeIndex = computed(() =>\n this.options().findIndex((o) => o.value === this.value())\n );\n\n /** Equal-width tracks → the thumb is 1/n of the inner width and slides by\n * multiples of its own width. Pure CSS transform, nothing to measure. */\n readonly thumbWidth = computed(() => {\n const box = this.thumbBox();\n if (this.fit() === 'content') return box ? `${box.width}px` : '0px';\n return `calc((100% - 6px) / ${this.options().length || 1})`;\n });\n\n readonly thumbTransform = computed(() => {\n const box = this.thumbBox();\n if (this.fit() === 'content') return box ? `translateX(${box.left - 3}px)` : 'none';\n return `translateX(${this.activeIndex() * 100}%)`;\n });\n\n readonly gridClass = computed(() => (this.fit() === 'content' ? 'auto-cols-auto' : 'auto-cols-fr'));\n\n select(option: FxSegmentedOption) {\n if (option.disabled || option.value === this.value()) return;\n this.value.set(option.value);\n }\n\n thumbClass(): string {\n return this.variant() === 'pill'\n ? 'bg-accent'\n : 'bg-surface-raised border border-border shadow-sm';\n }\n\n optionClass(option: FxSegmentedOption): string {\n if (option.value !== this.value()) {\n return 'text-muted hover:text-strong';\n }\n return this.variant() === 'pill' ? 'text-accent-contrast' : 'text-strong';\n }\n}\n","<div\n class=\"relative inline-grid max-w-full grid-flow-col items-stretch p-[3px] bg-surface-sunken border border-border rounded-full\"\n [class]=\"gridClass()\"\n role=\"group\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n <!-- Sliding thumb: one element that translates to the active option -->\n @if (activeIndex() >= 0) {\n <span\n aria-hidden=\"true\"\n class=\"fx-segmented__thumb absolute top-[3px] bottom-[3px] left-[3px] rounded-full pointer-events-none\"\n [class]=\"thumbClass()\"\n [style.width]=\"thumbWidth()\"\n [style.transform]=\"thumbTransform()\"\n ></span>\n }\n <!-- option 30px tall (7px × 18px padding): the text-box trim below collapses the\n glyph box to ~8px, so padding alone left the pill at 22px (anh Tú 04/09) -->\n @for (option of options(); track option.value) {\n <button\n #opt\n type=\"button\"\n (click)=\"select(option)\"\n [disabled]=\"option.disabled\"\n [attr.aria-pressed]=\"option.value === value()\"\n class=\"relative z-[1] flex min-w-0 min-h-[30px] items-center justify-center gap-xs px-[18px] py-[7px] rounded-full text-[13px] leading-none font-medium whitespace-nowrap transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed\"\n [class]=\"optionClass(option)\"\n >\n @if (option.icon) {\n <fx-ui-hero-icon [icon]=\"option.icon\" [size]=\"14\" class=\"flex\" />\n }\n <!-- text-box trims Archivo's uneven leading → true optical centering\n (Chrome 128+/Safari 18.2+; older browsers ignore it harmlessly).\n truncate adds overflow:hidden, and the trimmed box ends at cap\n height / baseline — so the dot on \"i\" and the tail on \"y\" fall\n outside it and get clipped. py/-my pair gives both back without\n changing the control's height. -->\n <span class=\"min-w-0 truncate py-[3px] -my-[3px] [text-box:trim-both_cap_alphabetic]\">{{ option.label }}</span>\n @if (option.count !== undefined) {\n <span class=\"txt-tag-label px-small rounded-pill bg-neutral-soft text-neutral-soft-fg\">\n {{ option.count }}\n </span>\n }\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBadge } from '../../../core/value-tone.util';\nimport { StatusDotComponent } from '../status-dot/status-dot.component';\n\nexport interface FxListRowBadge {\n /** Caller-translated label. */\n label: string;\n tone?: Tone | null;\n}\n\n/**\n * V2 ListRow — presentational body for master-detail #row templates and other\n * selectable lists: status dot + title, trailing badges, meta line. Extra\n * content projects below the meta line.\n *\n * <ng-template #row let-item>\n * <fx-ui-list-row\n * [title]=\"item.name\"\n * [meta]=\"item.version + ' · ' + item.date\"\n * [dotTone]=\"statusTone(item)\"\n * [badges]=\"[{ label: item.severity, tone: severityTone(item.severity) }]\"\n * />\n * </ng-template>\n */\n@Component({\n selector: 'fx-ui-list-row',\n templateUrl: './list-row.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, StatusDotComponent],\n})\nexport class ListRowComponent {\n readonly title = input.required<string>();\n readonly meta = input('');\n readonly badges = input<FxListRowBadge[]>([]);\n readonly dotTone = input<Tone | null | undefined>(undefined);\n readonly dotPulse = input(false);\n\n badgeClass(badge: FxListRowBadge): string {\n return toneBadge(badge.tone ?? null);\n }\n}\n","<div class=\"flex items-center gap-normal min-w-0\">\n @if (dotTone() !== undefined) {\n <fx-ui-status-dot [tone]=\"dotTone() ?? null\" [pulse]=\"dotPulse()\" />\n }\n <span class=\"txt-body-medium-01 truncate flex-1\">{{ title() }}</span>\n @for (badge of badges(); track badge.label) {\n <span\n class=\"txt-tag-label px-normal py-[1px] rounded-pill whitespace-nowrap\"\n [ngClass]=\"badgeClass(badge)\"\n >\n {{ badge.label }}\n </span>\n }\n</div>\n@if (meta()) {\n <div class=\"txt-utility-description mt-xs truncate\" [class.ml-large]=\"dotTone() !== undefined\">\n {{ meta() }}\n </div>\n}\n<ng-content></ng-content>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBg } from '../../../core/value-tone.util';\n\nexport interface FxBarListItem {\n /** Caller-translated label. */\n label: string;\n value: number;\n /** Shown instead of the raw value (e.g. \"9.8\", \"82%\"). */\n valueLabel?: string;\n /** Bar colour; null/undefined renders the accent. */\n tone?: Tone | null;\n /** Secondary line under the label. */\n meta?: string;\n /** Free-form identifier handed back on (select). */\n data?: any;\n}\n\n/**\n * V2 BarList — ranked horizontal bars (\"Top projects by risk\", \"Top critical\n * attack paths\"). Pure DOM (accessible, token-native, clickable) — charts via\n * ECharts are for time series, not rankings.\n *\n * <fx-ui-bar-list [items]=\"topRisk\" (select)=\"open($event)\" />\n */\n@Component({\n selector: 'fx-ui-bar-list',\n templateUrl: './bar-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass],\n})\nexport class BarListComponent {\n readonly items = input<FxBarListItem[]>([]);\n /** Rows render as buttons only when true (a (select) listener exists). */\n readonly interactive = input(false);\n readonly select = output<FxBarListItem>();\n\n readonly max = computed(() => Math.max(...this.items().map((i) => i.value), 1));\n\n widthOf(item: FxBarListItem): number {\n return Math.max((item.value / this.max()) * 100, 2);\n }\n\n barClass(item: FxBarListItem): string {\n return item.tone ? toneBg(item.tone) : 'bg-accent';\n }\n\n onSelect(item: FxBarListItem) {\n if (this.interactive()) this.select.emit(item);\n }\n}\n","<div class=\"flex flex-col gap-small\">\n @for (item of items(); track item.label) {\n <button\n type=\"button\"\n class=\"text-left rounded-control px-normal py-small -mx-normal transition-colors\"\n [class.hover:bg-surface-sunken]=\"interactive()\"\n [class.cursor-default]=\"!interactive()\"\n [tabindex]=\"interactive() ? 0 : -1\"\n (click)=\"onSelect(item)\"\n >\n <div class=\"flex items-baseline justify-between gap-normal\">\n <span class=\"txt-body-medium-01 truncate\">{{ item.label }}</span>\n <span class=\"text-sm font-semibold text-strong shrink-0\" style=\"font-family: var(--og-font-figure)\">\n {{ item.valueLabel ?? item.value }}\n </span>\n </div>\n @if (item.meta) {\n <div class=\"txt-utility-description truncate\">{{ item.meta }}</div>\n }\n <div class=\"mt-xs h-[var(--og-track-h)] rounded-pill bg-track overflow-hidden\">\n <div\n class=\"h-full rounded-pill transition-all duration-500\"\n [ngClass]=\"barClass(item)\"\n [style.width.%]=\"widthOf(item)\"\n ></div>\n </div>\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneText } from '../../../core/value-tone.util';\nimport { StatusDotComponent } from '../status-dot/status-dot.component';\n\nexport interface FxFacetOption {\n value: string | number;\n /** Caller-translated label. */\n label: string;\n count?: number;\n /** Optional tone dot before the label (severity facets). */\n tone?: Tone | null;\n}\n\nexport interface FxFacetGroup {\n id: string;\n /** Caller-translated group heading. */\n label: string;\n /** Multi-select (checkbox semantics); default single-select toggle. */\n multi?: boolean;\n options: FxFacetOption[];\n}\n\nexport type FxFacetSelection = Record<string, (string | number)[]>;\n\n/**\n * V2 facets rail — the first column of 3-column lookup screens: filter groups\n * with counts + a Reset link. Presentational: filtering itself stays in the\n * page (feed the emitted selection into BaseMasterDetail filters).\n *\n * <div mdFacets>\n * <fx-ui-facets-rail [groups]=\"facetGroups\" [selection]=\"facets\"\n * (selectionChange)=\"onFacets($event)\" />\n * </div>\n */\n@Component({\n selector: 'fx-ui-facets-rail',\n templateUrl: './facets-rail.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, StatusDotComponent],\n})\nexport class FacetsRailComponent {\n readonly groups = input<FxFacetGroup[]>([]);\n readonly selection = input<FxFacetSelection>({});\n /** Caller-translated label for the reset affordance. */\n readonly resetLabel = input('Reset');\n readonly selectionChange = output<FxFacetSelection>();\n\n readonly hasSelection = computed(() =>\n Object.values(this.selection()).some((values) => values?.length)\n );\n\n isSelected(group: FxFacetGroup, option: FxFacetOption): boolean {\n return (this.selection()[group.id] ?? []).includes(option.value);\n }\n\n toggle(group: FxFacetGroup, option: FxFacetOption) {\n const current = this.selection()[group.id] ?? [];\n let next: (string | number)[];\n if (group.multi) {\n next = current.includes(option.value)\n ? current.filter((v) => v !== option.value)\n : [...current, option.value];\n } else {\n next = current.includes(option.value) ? [] : [option.value];\n }\n this.selectionChange.emit({ ...this.selection(), [group.id]: next });\n }\n\n reset() {\n this.selectionChange.emit({});\n }\n\n toneClass(option: FxFacetOption): string {\n return option.tone ? toneText(option.tone) : '';\n }\n}\n","<div class=\"flex flex-col gap-large\">\n @if (hasSelection()) {\n <button type=\"button\" class=\"txt-link self-end\" (click)=\"reset()\">\n {{ resetLabel() }}\n </button>\n }\n @for (group of groups(); track group.id) {\n <div role=\"group\" [attr.aria-label]=\"group.label\">\n <div class=\"txt-eyebrow mb-small\">{{ group.label }}</div>\n <div class=\"flex flex-col gap-xs\">\n @for (option of group.options; track option.value) {\n <button\n type=\"button\"\n (click)=\"toggle(group, option)\"\n [attr.aria-pressed]=\"isSelected(group, option)\"\n class=\"flex items-center gap-normal px-normal py-small rounded-control text-left transition-colors\"\n [ngClass]=\"\n isSelected(group, option)\n ? 'bg-accent-soft text-accent-soft-fg font-medium'\n : 'text-body hover:bg-surface-sunken'\n \"\n >\n @if (option.tone) {\n <fx-ui-status-dot [tone]=\"option.tone\" [size]=\"7\" />\n }\n <span class=\"text-sm truncate flex-1\">{{ option.label }}</span>\n @if (option.count !== undefined) {\n <span class=\"txt-tag-label text-faint\" style=\"font-family: var(--og-font-figure)\">\n {{ option.count }}\n </span>\n }\n </button>\n }\n </div>\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { Tone, toneBadge } from '../../../core/value-tone.util';\nimport { SparkbarComponent } from '../sparkbar/sparkbar.component';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nexport interface FxProjectCardChip {\n /** Caller-translated label. */\n label: string;\n tone?: Tone | null;\n}\n\nexport interface FxProjectCardMetric {\n /** Caller-formatted figure (\"128\", \"--\"). */\n value: string | number;\n /** Caller-translated caption under the figure. */\n label: string;\n}\n\nexport interface FxProjectCard {\n name: string;\n description?: string;\n /** 1–2 char initials rendered in an accent-soft square (design 12). */\n avatar?: string;\n /** Small line under the name (schedule / scope) with an optional hero-icon. */\n sub?: { icon?: string; label: string };\n /** Score chip top-right (\"High · 82\"); rendered as a toned pill. */\n score?: string | number;\n scoreTone?: Tone | null;\n /** Caption under the score chip (kept for pre-V2 callers). */\n scoreLabel?: string;\n /** Risk-trend sparkbar values (pre-V2 look; prefer `trend`). */\n spark?: number[];\n /**\n * Design-12 risk trend: one toned block per period, oldest first, with a\n * caption line underneath (\"risk trend\" · \"128 analyses\").\n */\n trend?: { tones: (Tone | null)[]; caption?: string; aside?: string };\n chips?: FxProjectCardChip[];\n /** Metric columns (Binaries · Findings · …): figure + caption. */\n metrics?: FxProjectCardMetric[];\n /** Footer meta line (e.g. \"Last analysis · 2d ago\"). */\n meta?: string;\n /** Footer link label right of the meta (\"Open ›\"); the whole card emits (open). */\n openLabel?: string;\n /** Free-form identifier handed back on (open). */\n data?: any;\n}\n\n/** Trend blocks are softened solids — whole literals (Tailwind v4 has no safelist). */\nconst TREND_BLOCK: Record<Tone, string> = {\n critical: 'tone-dot-chart-critical',\n danger: 'tone-dot-chart-danger',\n warning: 'tone-dot-chart-warning',\n success: 'tone-dot-chart-success',\n information: 'tone-dot-chart-information',\n};\n\n/**\n * V2 project card — the Project Management catalog tile (design 12): initials\n * avatar + name + schedule line, toned score chip, risk-trend blocks, metric\n * columns and a \"Last analysis · … / Open ›\" footer.\n *\n * <fx-ui-project-card [card]=\"project\" (open)=\"goTo(project)\" />\n */\n@Component({\n selector: 'fx-ui-project-card',\n templateUrl: './project-card.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, SparkbarComponent, HeroIconComponent],\n // Flex column host: in a grid every card stretches to the row height and the\n // footer sits on one baseline across the row (anh Tú 04/09).\n host: { class: 'flex flex-col min-w-0' },\n})\nexport class ProjectCardComponent {\n readonly card = input.required<FxProjectCard>();\n readonly open = output<FxProjectCard>();\n\n scoreChipClass(): string {\n return toneBadge(this.card().scoreTone ?? null);\n }\n\n chipClass(chip: FxProjectCardChip): string {\n return toneBadge(chip.tone ?? null);\n }\n\n blockClass(tone: Tone | null): string {\n return tone ? TREND_BLOCK[tone] : 'bg-bg-hover';\n }\n}\n","<button\n type=\"button\"\n class=\"card-common bg-surface w-full flex-1 flex flex-col gap-normal hover:border-accent hover:shadow-md transition-all\"\n (click)=\"open.emit(card())\"\n>\n <!-- Header: avatar + name/sub + score chip (design 12) -->\n <div class=\"flex items-start justify-between gap-normal w-full\">\n <div class=\"flex items-start gap-normal min-w-0\">\n @if (card().avatar) {\n <span\n class=\"w-9 h-9 rounded-control bg-accent-soft text-accent flex items-center justify-center shrink-0 txt-utility-caption font-bold uppercase\"\n style=\"font-family: var(--og-font-figure)\"\n >{{ card().avatar }}</span\n >\n }\n <!-- min-h 46px = name (24) + mt-xs (2) + sub (20): reserves the two-line\n header even when a card has no sub line, so trend/metric rows line\n up across the grid row (measured 04/09). -->\n <div class=\"min-w-0 min-h-[46px]\">\n <div class=\"txt-heading-06 truncate text-left\">{{ card().name }}</div>\n @if (card().sub; as sub) {\n <div class=\"flex items-center gap-xs txt-utility-description mt-xs\">\n @if (sub.icon) {\n <fx-ui-hero-icon [icon]=\"sub.icon\" [size]=\"13\" class=\"flex shrink-0\" />\n }\n <span class=\"truncate\">{{ sub.label }}</span>\n </div>\n } @else if (card().description) {\n <div class=\"txt-card-content truncate mt-xs text-left\">{{ card().description }}</div>\n }\n </div>\n </div>\n @if (card().score !== undefined) {\n <div class=\"text-right shrink-0\">\n <span\n class=\"txt-tag-label px-normal py-[2px] rounded-pill whitespace-nowrap\"\n [ngClass]=\"scoreChipClass()\"\n >{{ card().score }}</span\n >\n @if (card().scoreLabel) {\n <div class=\"txt-utility-description mt-xs\">{{ card().scoreLabel }}</div>\n }\n </div>\n }\n </div>\n\n @if (card().chips?.length) {\n <div class=\"flex flex-wrap gap-xs w-full\">\n @for (chip of card().chips; track chip.label) {\n <span class=\"txt-tag-label px-normal py-[1px] rounded-pill\" [ngClass]=\"chipClass(chip)\">\n {{ chip.label }}\n </span>\n }\n </div>\n }\n\n <!-- Design-12 risk trend: toned blocks + caption line -->\n @if (card().trend; as trend) {\n <div class=\"w-full\">\n <div class=\"flex gap-xs w-full\">\n @for (tone of trend.tones; track $index) {\n <span class=\"flex-1 h-4 rounded-[2px]\" [ngClass]=\"blockClass(tone)\"></span>\n }\n </div>\n @if (trend.caption || trend.aside) {\n <div class=\"flex items-center justify-between mt-xs txt-utility-description font-mono\">\n <span>{{ trend.caption }}</span>\n <span>{{ trend.aside }}</span>\n </div>\n }\n </div>\n }\n\n @if (card().spark?.length) {\n <fx-ui-sparkbar class=\"w-full\" [values]=\"card().spark!\" [height]=\"24\" />\n }\n\n <!-- Metric columns: figure + caption (design 12) -->\n @if (card().metrics?.length) {\n <div\n class=\"grid gap-normal w-full\"\n [style.grid-template-columns]=\"'repeat(' + card().metrics!.length + ', minmax(0, 1fr))'\"\n >\n @for (m of card().metrics; track m.label) {\n <div class=\"min-w-0 text-left\">\n <div class=\"txt-heading-06\" style=\"font-family: var(--og-font-figure)\">{{ m.value }}</div>\n <div class=\"txt-utility-description truncate\">{{ m.label }}</div>\n </div>\n }\n </div>\n }\n\n @if (card().meta || card().openLabel) {\n <!-- mt-auto: footers line up across a grid row whatever each card holds -->\n <div\n class=\"flex items-center justify-between w-full pt-normal mt-auto border-t border-border-default\"\n >\n <span class=\"txt-utility-description text-left\">{{ card().meta }}</span>\n @if (card().openLabel) {\n <span class=\"txt-utility-caption font-bold text-accent whitespace-nowrap\"\n >{{ card().openLabel }} ›</span\n >\n }\n </div>\n }\n</button>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { HeroIconComponent } from '../hero-icon/hero-icon.component';\n\nexport type FxPipelineStageState = 'pending' | 'active' | 'done' | 'error';\n\nexport interface FxPipelineStage {\n id: string;\n /** Caller-translated label. */\n label: string;\n state?: FxPipelineStageState;\n /** Small line under the label (e.g. \"optional\", a duration). */\n description?: string;\n}\n\n/**\n * V2 pipeline stepper — the New Analysis 7-stage pipeline header. Renders the\n * stage strip only; the page owns the stage bodies (project the current one\n * below). Stage states are data — the parent decides what is done/active.\n *\n * <fx-ui-pipeline-stepper [stages]=\"stages\" (stageClick)=\"goTo($event)\">\n * …current stage body…\n * </fx-ui-pipeline-stepper>\n */\n@Component({\n selector: 'fx-ui-pipeline-stepper',\n templateUrl: './pipeline-stepper.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, HeroIconComponent],\n})\nexport class PipelineStepperComponent {\n readonly stages = input<FxPipelineStage[]>([]);\n /** Only done stages are click-navigable (review a completed step). */\n readonly clickable = input(true);\n readonly stageClick = output<number>();\n\n stateOf(stage: FxPipelineStage): FxPipelineStageState {\n return stage.state ?? 'pending';\n }\n\n circleClass(stage: FxPipelineStage): string {\n switch (this.stateOf(stage)) {\n case 'done':\n return 'bg-accent text-accent-contrast border-accent';\n case 'active':\n return 'bg-accent-soft text-accent-soft-fg border-accent';\n case 'error':\n return 'tone-scale-danger tone-border-danger';\n default:\n return 'bg-surface text-faint border-border';\n }\n }\n\n labelClass(stage: FxPipelineStage): string {\n switch (this.stateOf(stage)) {\n case 'active':\n return 'text-strong font-semibold';\n case 'done':\n return 'text-body';\n case 'error':\n return 'tone-fg-danger';\n default:\n return 'text-faint';\n }\n }\n\n connectorClass(stage: FxPipelineStage): string {\n return this.stateOf(stage) === 'done' ? 'bg-accent' : 'bg-border';\n }\n\n canClick(stage: FxPipelineStage): boolean {\n return this.clickable() && this.stateOf(stage) === 'done';\n }\n\n onStageClick(stage: FxPipelineStage, index: number) {\n if (this.canClick(stage)) this.stageClick.emit(index);\n }\n}\n","<ol class=\"flex items-start overflow-x-auto pb-small\" role=\"list\">\n @for (stage of stages(); track stage.id; let i = $index; let last = $last) {\n <li class=\"flex items-start\" [class.flex-1]=\"!last\" [attr.aria-current]=\"stateOf(stage) === 'active' ? 'step' : null\">\n <button\n type=\"button\"\n class=\"flex flex-col items-center gap-xs min-w-20 px-xs\"\n [class.cursor-pointer]=\"canClick(stage)\"\n [class.cursor-default]=\"!canClick(stage)\"\n [tabindex]=\"canClick(stage) ? 0 : -1\"\n (click)=\"onStageClick(stage, i)\"\n >\n <span\n class=\"w-8 h-8 rounded-full border-2 flex items-center justify-center text-sm font-semibold transition-colors\"\n [ngClass]=\"circleClass(stage)\"\n >\n @switch (stateOf(stage)) {\n @case ('done') {\n <fx-ui-hero-icon icon=\"check\" [size]=\"16\" class=\"flex\" />\n }\n @case ('error') {\n <fx-ui-hero-icon icon=\"exclamation-triangle\" [size]=\"16\" class=\"flex\" />\n }\n @default {\n {{ i + 1 }}\n }\n }\n </span>\n <span class=\"text-xs text-center whitespace-nowrap\" [ngClass]=\"labelClass(stage)\">\n {{ stage.label }}\n </span>\n @if (stage.description) {\n <span class=\"txt-utility-description text-center whitespace-nowrap\">\n {{ stage.description }}\n </span>\n }\n </button>\n @if (!last) {\n <div class=\"flex-1 h-[2px] mt-4 mx-xs rounded-pill min-w-6\" [ngClass]=\"connectorClass(stage)\"></div>\n }\n </li>\n }\n</ol>\n<div class=\"mt-large\">\n <ng-content></ng-content>\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\n\n/** Facets-rail skeleton: N nhóm, mỗi nhóm một eyebrow + vài dòng lựa chọn. */\n@Component({\n selector: 'fx-ui-skeleton-facets',\n templateUrl: './skeleton-facets.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SkeletonFacetsComponent {\n readonly groups = input(3);\n readonly rows = input(4);\n\n // computed, không phải method — xem [[skeleton-ng0956-array-holes]].\n readonly groupList = computed(() => range(this.groups()));\n readonly rowList = computed(() => range(this.rows()));\n\n rowWidth(i: number): number {\n return [80, 65, 72, 58][i % 4];\n }\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"flex flex-col gap-xl\">\n @for (g of groupList(); track g) {\n <div class=\"flex flex-col gap-normal\">\n <div class=\"h-3 w-20 rounded skeleton-load\"></div>\n <div class=\"flex flex-col gap-small\">\n @for (r of rowList(); track r) {\n <div class=\"flex items-center gap-normal\">\n <div class=\"w-3.5 h-3.5 rounded skeleton-load shrink-0\"></div>\n <div class=\"h-3 rounded skeleton-load\" [style.width.%]=\"rowWidth(r)\"></div>\n </div>\n }\n </div>\n </div>\n }\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\n\n/** Dashboard skeleton: một hàng KPI + N panel có vùng chart. */\n@Component({\n selector: 'fx-ui-skeleton-dashboard',\n templateUrl: './skeleton-dashboard.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SkeletonDashboardComponent {\n readonly kpis = input(4);\n readonly panels = input(2);\n\n readonly kpiList = computed(() => range(this.kpis()));\n readonly panelList = computed(() => range(this.panels()));\n readonly barList = computed(() => range(7));\n\n /** Chiều cao cột giả — dựng hình chart mà không cần dữ liệu. */\n barHeight(i: number): number {\n return [45, 70, 35, 85, 55, 75, 40][i % 7];\n }\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"flex flex-col gap-xl\">\n <div class=\"grid gap-xl grid-cols-2 md:grid-cols-4\">\n @for (k of kpiList(); track k) {\n <div class=\"card-common flex flex-col gap-normal\">\n <div class=\"h-3 w-16 rounded skeleton-load\"></div>\n <div class=\"h-7 w-24 rounded skeleton-load\"></div>\n <div class=\"h-3 w-20 rounded skeleton-load\"></div>\n </div>\n }\n </div>\n\n <div class=\"grid gap-xl grid-cols-1 md:grid-cols-2\">\n @for (p of panelList(); track p) {\n <div class=\"card-common flex flex-col gap-large\">\n <div class=\"h-4 w-1/3 rounded skeleton-load\"></div>\n <div class=\"flex items-end gap-normal h-40\">\n @for (b of barList(); track b) {\n <div class=\"flex-1 rounded-t skeleton-load\" [style.height.%]=\"barHeight(b)\"></div>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\nimport { SkeletonListComponent } from '../skeleton-list/skeleton-list.component';\nimport { SkeletonDetailComponent } from '../skeleton-detail/skeleton-detail.component';\nimport { SkeletonFacetsComponent } from '../skeleton-facets/skeleton-facets.component';\n\n/**\n * Một KHỐI trong skeleton của màn. Ghép các khối này theo đúng thứ tự của màn\n * thật thì skeleton mới khớp layout — bảng ra bảng, chart ra chart.\n *\n * - `heading` H1 + subline + `count` nút hành động (mặc định 2, 0 = không có)\n * - `toolbar` search bar + `count` filter pill (mặc định 2)\n * - `table` bảng, skeleton theo TỪNG Ô (`columns` / `rows`)\n * - `cards` lưới card (catalog) — `count` / `cols`\n * - `stat-cards` hàng stat tile rời — `count`\n * - `kpi-strip` MỘT card chia cột, số to (kiểu `app-dash-kpi-row`) — `count`\n * - `panels` lưới section-card có vùng chart — `count` / `cols`\n * - `card` một section-card đơn\n * - `tabs` dải tab\n * - `facets` 3 cụm facets/list/detail\n * - `detail` cụm card detail\n * - `form` card form\n */\nexport type FxSkeletonBlockKind =\n | 'heading'\n | 'toolbar'\n | 'table'\n | 'cards'\n | 'stat-cards'\n | 'kpi-strip'\n | 'panels'\n | 'card'\n | 'tabs'\n | 'facets'\n | 'detail'\n | 'form';\n\nexport interface FxSkeletonBlockSpec {\n kind: FxSkeletonBlockKind;\n /**\n * Số phần tử con:\n * - `heading`: số nút hành động (0 = màn không có CTA)\n * - `toolbar`: số filter pill\n * - `panels` `cards` `stat-cards` `kpi-strip` `tabs`: số khối\n */\n count?: number;\n /** `panels` `cards`: số cột ở breakpoint lớn. */\n cols?: number;\n /** `table`: số cột và số hàng. */\n columns?: number;\n rows?: number;\n}\n\nexport type FxSkeletonBlock = FxSkeletonBlockKind | FxSkeletonBlockSpec;\n\n/**\n * Tên gọn cho các layout dùng lại được. Route nên khai thẳng mảng block khi\n * layout của nó khác preset — chính app biết layout của mình, không phải lib.\n */\nexport type FxSkeletonHint =\n | 'table'\n | 'panels'\n | 'dashboard'\n | 'tabs-facets'\n | 'facets'\n | 'detail'\n | 'form';\n\nconst PRESETS: Record<FxSkeletonHint, FxSkeletonBlock[]> = {\n table: ['heading', 'toolbar', 'table'],\n panels: [\n 'heading',\n 'stat-cards',\n { kind: 'panels', count: 3, cols: 3 },\n 'toolbar',\n { kind: 'cards', count: 6, cols: 3 },\n ],\n dashboard: [\n 'heading',\n 'kpi-strip',\n { kind: 'panels', count: 2 },\n { kind: 'panels', count: 2 },\n 'card',\n ],\n 'tabs-facets': ['tabs', 'facets'],\n facets: ['facets'],\n detail: ['detail'],\n form: ['heading', 'form'],\n};\n\n/**\n * Skeleton cho vùng NỘI DUNG trong lúc resolver của route đang chạy.\n *\n * ⚠️ Vì sao skeleton phải nằm ở shell chứ không ở từng màn: Angular **không\n * tạo component cho tới khi resolver xong**, nên một màn không thể tự vẽ\n * skeleton của chính nó trong lúc resolver của nó chạy. Thứ vẽ được phải tồn\n * tại TRƯỚC component đó → shell + router event. Xem `FxRouteSkeletonService`.\n */\n@Component({\n selector: 'fx-ui-route-skeleton',\n templateUrl: './route-skeleton.component.html',\n styleUrl: './route-skeleton.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SkeletonListComponent, SkeletonDetailComponent, SkeletonFacetsComponent],\n})\nexport class RouteSkeletonComponent {\n /** Tên preset, hoặc mảng block mô tả đúng layout của màn. */\n readonly hint = input<FxSkeletonHint | FxSkeletonBlock[] | null>('table');\n\n readonly blocks = computed<FxSkeletonBlockSpec[]>(() => {\n const value = this.hint();\n // Mảng rỗng / tên preset lạ / null đều rơi về preset bảng: mục tiêu của cả\n // cơ chế này là KHÔNG BAO GIỜ để vùng nội dung trắng, nên vẽ hình generic\n // vẫn hơn không vẽ gì.\n const list =\n Array.isArray(value) && value.length\n ? value\n : (PRESETS[value as FxSkeletonHint] ?? PRESETS.table);\n return list.map((b) => (typeof b === 'string' ? { kind: b } : b));\n });\n\n cols(b: FxSkeletonBlockSpec): number[] {\n return range(b.columns ?? 6);\n }\n\n rows(b: FxSkeletonBlockSpec): number[] {\n return range(b.rows ?? 8);\n }\n\n items(b: FxSkeletonBlockSpec, fallback: number): number[] {\n return range(b.count ?? fallback);\n }\n\n /** Lớp lưới cho `panels`/`cards` — Tailwind v4 không có safelist nên phải\n * là chuỗi tĩnh, không ghép động. */\n gridClass(b: FxSkeletonBlockSpec): string {\n switch (b.cols ?? 2) {\n case 1:\n return 'grid-cols-1';\n case 3:\n return 'grid-cols-1 md:grid-cols-3';\n case 4:\n return 'grid-cols-2 md:grid-cols-4';\n default:\n return 'grid-cols-1 md:grid-cols-2';\n }\n }\n\n /** Header ngắn hơn ô dữ liệu, cột đầu rộng nhất (thường là tên). */\n headWidth(c: number): number {\n return c === 0 ? 55 : [40, 34, 46, 30, 38][c % 5];\n }\n\n /**\n * Bề rộng đổi theo cả hàng và cột — cùng bề rộng thì khối skeleton trông\n * như một hình chữ nhật đặc, mất cảm giác \"từng field\".\n */\n cellWidth(r: number, c: number): number {\n if (c === 0) return [92, 78, 85, 70][r % 4];\n return [62, 48, 74, 55, 66, 42][(r + c) % 6];\n }\n\n barHeight(i: number): number {\n return [45, 70, 35, 85, 55, 75, 40][i % 7];\n }\n\n readonly bars = range(7);\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"w-full flex flex-col gap-xl\">\n @for (b of blocks(); track $index) {\n @switch (b.kind) {\n @case ('heading') {\n <div data-fx-skel=\"heading\" class=\"flex flex-col md:flex-row md:items-start justify-between gap-normal\">\n <div class=\"flex flex-col gap-small\">\n <div class=\"skeleton-load h-7 w-64\"></div>\n <div class=\"skeleton-load h-3 w-32\"></div>\n </div>\n @if (items(b, 2).length) {\n <div class=\"flex items-center gap-normal\">\n @for (a of items(b, 2); track a) {\n <div class=\"skeleton-load h-9 rounded-lg\" [class]=\"a === 0 ? 'w-28' : 'w-32'\"></div>\n }\n </div>\n }\n </div>\n }\n\n @case ('toolbar') {\n <div data-fx-skel=\"toolbar\" class=\"flex flex-wrap items-center gap-normal\">\n <div class=\"skeleton-load h-9 w-72 rounded-lg\"></div>\n @for (f of items(b, 2); track f) {\n <div class=\"skeleton-load h-7 rounded-full\" [class]=\"f % 2 ? 'w-24' : 'w-20'\"></div>\n }\n </div>\n }\n\n @case ('table') {\n <!-- Bảng: mỗi Ô là một `.skeleton-load` riêng, đúng cách\n `fx-ui-table-cell [loading]` làm trên bảng thật. -->\n <div data-fx-skel=\"table\" class=\"card-common overflow-x-auto\">\n <table class=\"w-full\">\n <thead>\n <tr class=\"border-b border-border-default\">\n @for (c of cols(b); track c) {\n <th class=\"px-normal py-semi text-left\">\n <div class=\"skeleton-load h-3\" [style.width.%]=\"headWidth(c)\"></div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (r of rows(b); track r) {\n <tr class=\"border-b border-border-subtle\">\n @for (c of cols(b); track c) {\n <td class=\"px-normal py-semi align-middle\">\n <div class=\"skeleton-load h-4\" [style.width.%]=\"cellWidth(r, c)\"></div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @case ('stat-cards') {\n <div data-fx-skel=\"stat-cards\" class=\"grid gap-normal grid-cols-2 md:grid-cols-4\">\n @for (i of items(b, 4); track i) {\n <div class=\"card-common flex flex-col gap-normal\">\n <div class=\"skeleton-load h-3 w-16\"></div>\n <div class=\"skeleton-load h-8 w-24\"></div>\n <div class=\"skeleton-load h-3 w-20\"></div>\n </div>\n }\n </div>\n }\n\n @case ('kpi-strip') {\n <!-- MỘT card chia cột (kiểu app-dash-kpi-row), không phải các tile rời -->\n <div data-fx-skel=\"kpi-strip\" class=\"card-common !p-0\">\n <div class=\"grid grid-cols-2 md:grid-cols-4\">\n @for (i of items(b, 4); track i) {\n <div\n class=\"flex flex-col gap-normal px-xl py-large border-border-subtle\"\n [class.border-l]=\"!$first\"\n >\n <div class=\"skeleton-load h-3 w-20\"></div>\n <div class=\"skeleton-load h-9 w-28\"></div>\n <div class=\"skeleton-load h-3 w-24\"></div>\n </div>\n }\n </div>\n </div>\n }\n\n @case ('panels') {\n <div data-fx-skel=\"panels\" class=\"grid gap-xl\" [class]=\"gridClass(b)\">\n @for (i of items(b, 2); track i) {\n <div class=\"card-common flex flex-col gap-large\">\n <div class=\"skeleton-load h-4 w-1/3\"></div>\n <div class=\"flex items-end gap-normal h-40\">\n @for (x of bars; track x) {\n <div class=\"skeleton-load flex-1 rounded-t\" [style.height.%]=\"barHeight(x)\"></div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @case ('cards') {\n <div data-fx-skel=\"cards\" class=\"grid gap-xl\" [class]=\"gridClass(b)\">\n @for (i of items(b, 6); track i) {\n <div class=\"card-common flex flex-col gap-normal\">\n <div class=\"flex items-center gap-normal\">\n <div class=\"skeleton-load w-9 h-9 rounded-lg shrink-0\"></div>\n <div class=\"flex flex-col gap-small flex-1 min-w-0\">\n <div class=\"skeleton-load h-4 w-3/4\"></div>\n <div class=\"skeleton-load h-3 w-1/2\"></div>\n </div>\n <div class=\"skeleton-load h-5 w-14 rounded-full shrink-0\"></div>\n </div>\n <div class=\"grid grid-cols-4 gap-normal pt-normal border-t border-border-subtle\">\n @for (m of [0, 1, 2, 3]; track m) {\n <div class=\"flex flex-col gap-small\">\n <div class=\"skeleton-load h-2.5 w-full\"></div>\n <div class=\"skeleton-load h-4 w-2/3\"></div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @case ('card') {\n <div data-fx-skel=\"card\" class=\"card-common flex flex-col gap-large\">\n <div class=\"skeleton-load h-4 w-1/3\"></div>\n <div class=\"flex flex-col gap-normal\">\n @for (r of [0, 1, 2, 3]; track r) {\n <div class=\"skeleton-load h-3\" [style.width.%]=\"cellWidth(r, 1)\"></div>\n }\n </div>\n </div>\n }\n\n @case ('tabs') {\n <div data-fx-skel=\"tabs\" class=\"flex items-center gap-large border-b border-border-default pb-normal\">\n @for (t of items(b, 6); track t) {\n <div class=\"flex items-center gap-small\">\n <div class=\"skeleton-load w-4 h-4\"></div>\n <div class=\"skeleton-load h-3 w-16\"></div>\n </div>\n }\n </div>\n }\n\n @case ('facets') {\n <div data-fx-skel=\"facets\" class=\"fx-rs-row\">\n <div class=\"fx-rs-facets card-common overflow-hidden\">\n <fx-ui-skeleton-facets />\n </div>\n <div class=\"fx-rs-list card-common overflow-hidden\">\n <fx-ui-skeleton-list [rows]=\"6\" />\n </div>\n <div class=\"flex-1 min-w-0 overflow-hidden\">\n <fx-ui-skeleton-detail />\n </div>\n </div>\n }\n\n @case ('detail') {\n <fx-ui-skeleton-detail data-fx-skel=\"detail\" />\n }\n\n @case ('form') {\n <div data-fx-skel=\"form\" class=\"card-common flex flex-col gap-large\">\n @for (r of [0, 1, 2, 3]; track r) {\n <div class=\"flex flex-col gap-small\">\n <div class=\"skeleton-load h-3 w-24\"></div>\n <div class=\"skeleton-load h-9 w-full rounded-lg\"></div>\n </div>\n }\n <div class=\"flex justify-end gap-normal\">\n <div class=\"skeleton-load h-9 w-24 rounded-lg\"></div>\n <div class=\"skeleton-load h-9 w-28 rounded-lg\"></div>\n </div>\n </div>\n }\n }\n }\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\nimport {\n FxSkeletonBlock,\n FxSkeletonHint,\n RouteSkeletonComponent,\n} from '../route-skeleton/route-skeleton.component';\n\n/**\n * Skeleton của cả AppFrame (drawer + topbar + vùng nội dung).\n *\n * Chỉ dùng cho giai đoạn **bootstrap**, khi shell của host còn CHƯA tồn tại\n * (App.ngOnInit đang kiểm tenant + session, router chưa initialNavigation).\n * Mọi điều hướng SAU đó đã có shell thật → dùng `fx-ui-route-skeleton` bên\n * trong vùng nội dung, đừng vẽ lại cả frame.\n *\n * ⚠️ `contentHint` là thứ làm F5 không còn vẽ hình generic. Lần điều hướng ĐẦU\n * tạo ra chính `HomeComponent` — nơi chứa `fx-ui-route-skeleton` — nên vùng nội\n * dung không thể tự vẽ skeleton của route ở lần đó. Truyền hint vào đây để\n * frame dựng đúng composition của màn đích ngay từ F5.\n */\n@Component({\n selector: 'fx-ui-skeleton-frame',\n templateUrl: './skeleton-frame.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouteSkeletonComponent],\n})\nexport class SkeletonFrameComponent {\n readonly navItems = input(7);\n\n /** Composition của route đích; null thì vẽ khối generic. */\n readonly contentHint = input<FxSkeletonHint | FxSkeletonBlock[] | null>(null);\n\n readonly navList = computed(() => range(this.navItems()));\n\n navWidth(i: number): number {\n return [70, 55, 62, 48, 66, 52, 58][i % 7];\n }\n}\n\nfunction range(n: number): number[] {\n return Array.from({ length: Math.max(0, Number(n) || 0) }, (_, i) => i);\n}\n","<div class=\"flex h-screen w-full overflow-hidden bg-bg-primary\">\n <!-- drawer -->\n <div\n class=\"hidden md:flex w-[260px] shrink-0 flex-col gap-xl border-r border-border-subtle p-semi\"\n >\n <div class=\"flex items-center gap-normal\">\n <div class=\"w-6 h-6 rounded skeleton-load shrink-0\"></div>\n <div class=\"flex flex-col gap-small flex-1 min-w-0\">\n <div class=\"h-3.5 w-20 rounded skeleton-load\"></div>\n <div class=\"h-2.5 w-full rounded skeleton-load\"></div>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-small\">\n @for (n of navList(); track n) {\n <div class=\"flex items-center gap-normal py-1\">\n <div class=\"w-4 h-4 rounded skeleton-load shrink-0\"></div>\n <div class=\"h-3 rounded skeleton-load\" [style.width.%]=\"navWidth(n)\"></div>\n </div>\n }\n </div>\n\n <div class=\"mt-auto flex items-center gap-normal border-t border-border-subtle pt-semi\">\n <div class=\"w-8 h-8 rounded-full skeleton-load shrink-0\"></div>\n <div class=\"flex flex-col gap-small flex-1 min-w-0\">\n <div class=\"h-3 w-24 rounded skeleton-load\"></div>\n <div class=\"h-2.5 w-32 rounded skeleton-load\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-1 min-w-0 flex-col\">\n <!-- topbar -->\n <div\n class=\"flex h-14 shrink-0 items-center gap-normal border-b border-border-subtle px-semi\"\n >\n <div class=\"h-3.5 w-40 rounded skeleton-load\"></div>\n <div class=\"ml-auto h-8 w-32 rounded-lg skeleton-load\"></div>\n </div>\n\n <!-- content: dựng đúng composition của route đích nếu đã biết -->\n <div class=\"flex-1 min-h-0 overflow-hidden p-semi\">\n @if (contentHint(); as hint) {\n <fx-ui-route-skeleton [hint]=\"hint\" />\n } @else {\n <div class=\"flex flex-col gap-xl\">\n <div class=\"h-6 w-1/4 rounded skeleton-load\"></div>\n <div class=\"grid gap-xl grid-cols-2 md:grid-cols-4\">\n <div class=\"h-24 rounded-lg skeleton-load\"></div>\n <div class=\"h-24 rounded-lg skeleton-load\"></div>\n <div class=\"h-24 rounded-lg skeleton-load\"></div>\n <div class=\"h-24 rounded-lg skeleton-load\"></div>\n </div>\n <div class=\"h-64 rounded-lg skeleton-load\"></div>\n </div>\n }\n </div>\n </div>\n</div>\n","import { ButtonComponent } from './button/button.component';\nimport { CheckboxComponent } from './checkbox/checkbox.component';\nimport { CircleProgressBar } from './circle-progress-bar/circle-progress-bar.component';\nimport { DatetimePicker } from './datetime-picker/datetime-picker.component';\nimport { DndUploadComponent } from './dnd-upload/dnd-upload.component';\nimport { HeroIconComponent } from './hero-icon/hero-icon.component';\nimport { InputComponent } from './input/input.component';\nimport { LoadingPanel } from './loading-panel/loading-panel.component';\nimport { RadioButtonToggleComponent } from './radio-button-toggle/radio-button-toggle.component';\nimport { RadioButtonComponent } from './radio-button/radio-button.component';\nimport { SearchBarComponent } from './search-bar/search-bar.component';\nimport { SelectComponent } from './select/select.component';\nimport { SliderComponent } from './slider/slider.component';\nimport { SwitchComponent } from './switch/switch.component';\nimport { TabComponent } from './tab-component/tab.component';\nimport { TabGroupComponent } from './tab-group/tab-group.component';\nimport { TableCell } from './table-cell/table-cell.component';\nimport { TagComponent } from './tag/tag.component';\nimport { ToastContainerComponent } from './toast-container/toast-container.component';\nimport { ToastComponent } from './toast/toast.component';\nimport { TreeDiagram } from './tree-diagram/tree-diagram.component';\nimport { KanbanBoardComponent } from './kanban-board/kanban-board.component';\nimport { DrawerComponent } from './drawer/drawer.component';\nimport { SkeletonListComponent } from './skeleton-list/skeleton-list.component';\nimport { SkeletonDetailComponent } from './skeleton-detail/skeleton-detail.component';\nimport { StatCardsComponent } from './stat-cards/stat-cards.component';\nimport { EmptyStateComponent } from './empty-state/empty-state.component';\nimport { FilterChipsComponent } from './filter-chips/filter-chips.component';\nimport { FilterPillsComponent } from './filter-pills/filter-pills.component';\nimport { StageDotsComponent } from './stage-dots/stage-dots.component';\nimport { CodeBlockComponent } from './code-block/code-block.component';\nimport { ScreenshotFrameComponent } from './screenshot-frame/screenshot-frame.component';\nimport { MeterComponent } from './meter/meter.component';\nimport { SectionCardComponent } from './section-card/section-card.component';\nimport { InfoFieldComponent } from './info-field/info-field.component';\nimport { SeverityBadgesComponent } from './severity-badges/severity-badges.component';\nimport { MasterDetailComponent } from './master-detail/master-detail.component';\nimport { MenuComponent } from './menu/menu.component';\nimport { ThemePickerComponent } from './theme-picker/theme-picker.component';\nimport { PendingBadgeComponent } from './pending-badge/pending-badge.component';\nimport { BreadcrumbComponent } from './breadcrumb/breadcrumb.component';\nimport { LoadStatusComponent } from './load-status/load-status.component';\nimport { SampleFrameComponent } from './sample-frame/sample-frame.component';\nimport { ScoreBadgeComponent } from './score-badge/score-badge.component';\nimport { StatusDotComponent } from './status-dot/status-dot.component';\nimport { SparkbarComponent } from './sparkbar/sparkbar.component';\nimport { SegmentedComponent } from './segmented/segmented.component';\nimport { ListRowComponent } from './list-row/list-row.component';\nimport { BarListComponent } from './bar-list/bar-list.component';\nimport { FacetsRailComponent } from './facets-rail/facets-rail.component';\nimport { ProjectCardComponent } from './project-card/project-card.component';\nimport { PipelineStepperComponent } from './pipeline-stepper/pipeline-stepper.component';\nimport { SkeletonFacetsComponent } from './skeleton-facets/skeleton-facets.component';\nimport { SkeletonDashboardComponent } from './skeleton-dashboard/skeleton-dashboard.component';\nimport { SkeletonFrameComponent } from './skeleton-frame/skeleton-frame.component';\nimport { RouteSkeletonComponent } from './route-skeleton/route-skeleton.component';\n\nexport { ButtonComponent } from './button/button.component';\nexport { CheckboxComponent } from './checkbox/checkbox.component';\nexport { CircleProgressBar } from './circle-progress-bar/circle-progress-bar.component';\nexport { TreeDiagram } from './tree-diagram/tree-diagram.component';\nexport { DatetimePicker } from './datetime-picker/datetime-picker.component';\nexport { DndUploadComponent } from './dnd-upload/dnd-upload.component';\nexport { HeroIconComponent } from './hero-icon/hero-icon.component';\nexport { InputComponent } from './input/input.component';\nexport { LoadingPanel } from './loading-panel/loading-panel.component';\nexport { RadioButtonToggleComponent } from './radio-button-toggle/radio-button-toggle.component';\nexport { RadioButtonComponent } from './radio-button/radio-button.component';\nexport { SearchBarComponent } from './search-bar/search-bar.component';\nexport { SelectComponent } from './select/select.component';\nexport { SliderComponent } from './slider/slider.component';\nexport { SwitchComponent } from './switch/switch.component';\nexport { TabComponent } from './tab-component/tab.component';\nexport { TabGroupComponent } from './tab-group/tab-group.component';\nexport { TagComponent } from './tag/tag.component';\nexport { ToastContainerComponent } from './toast-container/toast-container.component';\nexport { ToastComponent } from './toast/toast.component';\nexport { TableCell } from './table-cell/table-cell.component';\nexport { KanbanBoardComponent } from './kanban-board/kanban-board.component';\nexport { DrawerComponent } from './drawer/drawer.component';\nexport type { DrawerItem } from './drawer/drawer.types';\nexport { SkeletonListComponent } from './skeleton-list/skeleton-list.component';\nexport { SkeletonDetailComponent } from './skeleton-detail/skeleton-detail.component';\nexport { StatCardsComponent } from './stat-cards/stat-cards.component';\nexport { BreadcrumbComponent } from './breadcrumb/breadcrumb.component';\nexport { LoadStatusComponent } from './load-status/load-status.component';\nexport type { FxStatCard } from './stat-cards/stat-cards.component';\nexport { EmptyStateComponent } from './empty-state/empty-state.component';\nexport { FilterChipsComponent } from './filter-chips/filter-chips.component';\nexport { FilterPillsComponent } from './filter-pills/filter-pills.component';\nexport { StageDotsComponent } from './stage-dots/stage-dots.component';\nexport { CodeBlockComponent } from './code-block/code-block.component';\nexport { ScreenshotFrameComponent } from './screenshot-frame/screenshot-frame.component';\nexport type { FxFilterChipOption } from './filter-chips/filter-chips.component';\nexport { MeterComponent } from './meter/meter.component';\nexport { SectionCardComponent } from './section-card/section-card.component';\nexport { InfoFieldComponent } from './info-field/info-field.component';\nexport { SeverityBadgesComponent } from './severity-badges/severity-badges.component';\nexport type { FxSeverityBadge } from './severity-badges/severity-badges.component';\nexport { MasterDetailComponent } from './master-detail/master-detail.component';\nexport { MenuComponent } from './menu/menu.component';\nexport type { FxMenuItem } from './menu/menu.component';\nexport { ThemePickerComponent } from './theme-picker/theme-picker.component';\nexport * from './score-badge/score-badge.component';\nexport * from './status-dot/status-dot.component';\nexport * from './sparkbar/sparkbar.component';\nexport * from './segmented/segmented.component';\nexport * from './list-row/list-row.component';\nexport * from './bar-list/bar-list.component';\nexport * from './facets-rail/facets-rail.component';\nexport * from './project-card/project-card.component';\nexport * from './pipeline-stepper/pipeline-stepper.component';\nexport * from './skeleton-facets/skeleton-facets.component';\nexport * from './skeleton-dashboard/skeleton-dashboard.component';\nexport * from './skeleton-frame/skeleton-frame.component';\nexport * from './route-skeleton/route-skeleton.component';\n\nexport const FX_COMPONENTS = [\n InputComponent,\n SelectComponent,\n RadioButtonComponent,\n CheckboxComponent,\n DndUploadComponent,\n ButtonComponent,\n RadioButtonToggleComponent,\n DatetimePicker,\n LoadingPanel,\n SearchBarComponent,\n TabGroupComponent,\n TabComponent,\n HeroIconComponent,\n ToastComponent,\n ToastContainerComponent,\n TagComponent,\n SliderComponent,\n SwitchComponent,\n CircleProgressBar,\n TreeDiagram,\n TableCell,\n KanbanBoardComponent,\n DrawerComponent,\n SkeletonListComponent,\n SkeletonDetailComponent,\n StatCardsComponent,\n EmptyStateComponent,\n FilterChipsComponent,\n FilterPillsComponent,\n StageDotsComponent,\n CodeBlockComponent,\n ScreenshotFrameComponent,\n MeterComponent,\n SectionCardComponent,\n InfoFieldComponent,\n SeverityBadgesComponent,\n MasterDetailComponent,\n MenuComponent,\n ThemePickerComponent,\n PendingBadgeComponent,\n BreadcrumbComponent,\n LoadStatusComponent,\n SampleFrameComponent,\n ScoreBadgeComponent,\n StatusDotComponent,\n SparkbarComponent,\n SegmentedComponent,\n ListRowComponent,\n BarListComponent,\n FacetsRailComponent,\n ProjectCardComponent,\n PipelineStepperComponent,\n SkeletonFacetsComponent,\n SkeletonDashboardComponent,\n SkeletonFrameComponent,\n RouteSkeletonComponent,\n];\n","import { ConfirmationDialogComponent } from \"./confirmation/confirmation.component\";\n\nexport { ConfirmationDialogComponent } from \"./confirmation/confirmation.component\";\n\nexport const DIALOGS_COMPONENT = [\n ConfirmationDialogComponent\n]","import { Directive, ElementRef, afterNextRender, inject, input } from '@angular/core';\nimport gsap from 'gsap';\nimport { FX_MOTION, fxMotionAllowed } from './motion.util';\n\n/**\n * Staggered entrance for one element (GSAP).\n *\n * <fx-ui-section-card [fxReveal]=\"2\">…</fx-ui-section-card>\n *\n * The host starts invisible and rises into place; `fxReveal` is its slot in\n * the stagger (× 60 ms). Elements that mount later (async lists) animate on\n * their own mount, so late data arrives with motion instead of a jump.\n * Reduced-motion users see the final state immediately. For a whole page use\n * `fxRevealGroup` on the container instead of numbering children by hand.\n */\n@Directive({\n selector: '[fxReveal]',\n})\nexport class FxRevealDirective {\n /** Stagger slot; 0 = first. */\n readonly fxReveal = input<number | string | undefined>(0);\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n constructor() {\n if (!fxMotionAllowed()) return;\n // Hide before first paint — otherwise the element flashes, then animates.\n this.el.style.opacity = '0';\n afterNextRender(() => fxRevealElement(this.el, Number(this.fxReveal()) || 0));\n }\n}\n\n/** Run the standard reveal on an element at the given stagger slot. */\nexport function fxRevealElement(el: HTMLElement, slot = 0): void {\n gsap.fromTo(\n el,\n { opacity: 0, y: FX_MOTION.travelPx },\n {\n opacity: 1,\n y: 0,\n duration: FX_MOTION.duration,\n delay: Math.min(Math.max(slot, 0), FX_MOTION.maxSlot) * FX_MOTION.stagger,\n ease: FX_MOTION.ease,\n clearProps: 'opacity,transform',\n overwrite: 'auto',\n },\n );\n}\n","import { Directive, ElementRef, OnDestroy, afterNextRender, inject, input } from '@angular/core';\nimport { fxMotionAllowed } from './motion.util';\nimport { fxRevealElement } from './reveal.directive';\n\n/**\n * One attribute on a page root reveals its sections top-to-bottom.\n *\n * <div fxRevealGroup> ← page root\n * <div>heading…</div> ← slot 0\n * <fx-ui-stat-cards …/> ← slot 1\n * <div class=\"grid …\">…</div> ← slot 2 (the grid moves as one block)\n * </div>\n *\n * Direct element children present at first render get consecutive slots.\n * Children added later (a list that arrives after its request, an `@if` that\n * flips) are revealed as they mount, so async content never pops in flat.\n * Skeletons (`fx-ui-route-skeleton`, `[aria-busy]`) are left alone. Replaces\n * the page-level `animate.enter=\"fade-in-animation\"` one-shot fade.\n */\n@Directive({\n selector: '[fxRevealGroup]',\n})\nexport class FxRevealGroupDirective implements OnDestroy {\n /** Cap on how many children get their own slot; the rest share the last one. */\n readonly fxRevealGroup = input<number | string | undefined>(undefined);\n\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private observer?: MutationObserver;\n private readonly seen = new WeakSet<Element>();\n\n constructor() {\n if (!fxMotionAllowed()) return;\n // Children are hidden right away so nothing paints before its reveal.\n for (const child of this.children()) this.hide(child);\n afterNextRender(() => {\n const kids = this.children();\n kids.forEach((child, i) => this.reveal(child, i));\n this.observer = new MutationObserver((records) => {\n for (const r of records) {\n r.addedNodes.forEach((n) => {\n if (n instanceof HTMLElement && n.parentElement === this.el && this.eligible(n) && !this.seen.has(n)) {\n this.hide(n);\n this.reveal(n, 0);\n }\n });\n }\n });\n this.observer.observe(this.el, { childList: true });\n });\n }\n\n private children(): HTMLElement[] {\n return Array.from(this.el.children).filter(\n (c): c is HTMLElement => c instanceof HTMLElement && this.eligible(c),\n );\n }\n\n private eligible(c: HTMLElement): boolean {\n const tag = c.tagName.toLowerCase();\n return tag !== 'fx-ui-route-skeleton' && tag !== 'script' && tag !== 'style' && !c.hasAttribute('aria-busy');\n }\n\n private hide(c: HTMLElement): void {\n if (this.seen.has(c)) return;\n this.seen.add(c);\n c.style.opacity = '0';\n }\n\n private reveal(c: HTMLElement, slot: number): void {\n const cap = Number(this.fxRevealGroup());\n fxRevealElement(c, Number.isFinite(cap) && cap > 0 ? Math.min(slot, cap) : slot);\n }\n\n ngOnDestroy(): void {\n this.observer?.disconnect();\n }\n}\n","import { FxCountUpDirective } from './count-up.directive';\nimport { FxRevealGroupDirective } from './reveal-group.directive';\nimport { FxRevealDirective } from './reveal.directive';\n\nexport { FxCountUpDirective } from './count-up.directive';\nexport { FxRevealGroupDirective } from './reveal-group.directive';\nexport { FxRevealDirective, fxRevealElement } from './reveal.directive';\nexport { FX_MOTION, fxMotionAllowed } from './motion.util';\n\n/** Motion directives exported by UiModule (GSAP-based, reduced-motion aware). */\nexport const FX_MOTION_DIRECTIVES = [FxRevealDirective, FxRevealGroupDirective, FxCountUpDirective] as const;\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { FX_COMPONENTS } from './components';\nimport { DIALOGS_COMPONENT } from './dialogs';\nimport { HasPermissionDirective } from '../core/directives/has-permission.directive';\nimport { TrimOnBlurDirective } from '../core/directives/trim.directive';\nimport { FX_MOTION_DIRECTIVES } from './motion';\n\n/**\n * Compatibility barrel over the (now standalone) core components.\n *\n * Deliberately NOT re-exported anymore: Angular Material —\n * Material is a behavior layer that stays an\n * implementation detail of this lib (Playbook §5.1); each standalone\n * component imports what it needs itself. Apps consume fx-ui-* only.\n *\n * Heavy components live in secondary entry points and are not part of this\n * barrel: @foxeltech/angular-ui/chart, /flow, /rich-text.\n */\n@NgModule({\n imports: [\n FormsModule,\n ReactiveFormsModule,\n RouterModule,\n HasPermissionDirective,\n TrimOnBlurDirective,\n ...FX_COMPONENTS,\n ...DIALOGS_COMPONENT,\n ...FX_MOTION_DIRECTIVES,\n ],\n exports: [\n ...FX_COMPONENTS,\n ...DIALOGS_COMPONENT,\n ...FX_MOTION_DIRECTIVES,\n FormsModule,\n ReactiveFormsModule,\n RouterModule,\n HasPermissionDirective,\n TrimOnBlurDirective,\n ],\n})\nexport class UiModule { }\n","/*\n * Public API Surface of ui\n */\n\nexport * from './lib/core/components/base.component';\nexport * from './lib/core/components/base-table.component';\nexport * from './lib/core/components/base-master-detail.component';\nexport * from './lib/core/components/base-dialog.component';\nexport * from './lib/core/services/http-wrapper.service';\nexport * from './lib/core/services/toastr.service';\nexport * from './lib/core/services/loading.service';\nexport * from './lib/core/services/route-skeleton.service';\nexport * from './lib/core/resolvers/fx-list.resolver';\nexport * from './lib/core/services/api-factory';\nexport * from './lib/core/services/realtime-table-sync';\nexport * from './lib/core/utils';\nexport * from './lib/core/value-tone.util';\nexport * from './lib/core/feature-flags';\nexport * from './lib/core/validators';\nexport * from './lib/translation/translation.module';\nexport * from './lib/translation/translation.service';\nexport * from './lib/core/directives/has-permission.directive';\nexport * from './lib/core/directives/trim.directive';\nexport * from './lib/core/guards/permissions.guard';\nexport * from './lib/core/services/permissions.service';\nexport * from './lib/core/services/storage.service';\nexport * from './lib/core/interceptors/auth.interceptor';\nexport * from './lib/core/services/auth-state.service';\nexport * from './lib/core/services/breadcrumb.service';\nexport * from './lib/core/services/load-status.service';\nexport * from './lib/core/services/theme.service';\nexport * from './lib/core/services/notification.service';\nexport * from './lib/core/services/dialog.service';\n\nexport * from './lib/ui/components/fx-component.component'\nexport * from './lib/ui/ui.module';\nexport * from './lib/ui/components/button/button.component';\nexport * from './lib/ui/components/breadcrumb/breadcrumb.component';\nexport * from './lib/ui/components/load-status/load-status.component';\nexport * from './lib/ui/components/checkbox/checkbox.component';\nexport * from './lib/ui/components/datetime-picker/datetime-picker.component';\nexport * from './lib/ui/components/dnd-upload/dnd-upload.component';\nexport * from './lib/ui/components/input/input.component';\nexport * from './lib/ui/components/radio-button/radio-button.component';\nexport * from './lib/ui/components/radio-button-toggle/radio-button-toggle.component';\nexport * from './lib/ui/components/select/select.component';\nexport * from './lib/ui/components/loading-panel/loading-panel.component';\nexport * from './lib/ui/components/tab-group/tab-group.component';\nexport * from './lib/ui/components/tab-component/tab.component';\nexport * from './lib/ui/components/search-bar/search-bar.component';\nexport * from './lib/ui/components/hero-icon/hero-icon.component';\nexport * from './lib/ui/components/toast/toast.component';\nexport * from './lib/ui/components/toast-container/toast-container.component';\nexport * from './lib/ui/components/tag/tag.component';\nexport * from './lib/ui/components/slider/slider.component';\nexport * from './lib/ui/dialogs/confirmation/confirmation.component';\nexport * from './lib/ui/components/switch/switch.component';\nexport * from './lib/ui/components/circle-progress-bar/circle-progress-bar.component';\nexport * from './lib/ui/components/tree-diagram/tree-diagram.component';\nexport * from './lib/ui/components/table-cell/table-cell.component';\nexport * from './lib/ui/components/kanban-board/kanban-board.component';\nexport * from './lib/ui/components/kanban-board/kanban-board.types';\nexport * from './lib/ui/components/drawer/drawer.component';\nexport * from './lib/ui/components/drawer/drawer.types';\nexport * from './lib/ui/components/skeleton-list/skeleton-list.component';\nexport * from './lib/ui/components/skeleton-detail/skeleton-detail.component';\nexport * from './lib/ui/components/skeleton-facets/skeleton-facets.component';\nexport * from './lib/ui/components/skeleton-dashboard/skeleton-dashboard.component';\nexport * from './lib/ui/components/skeleton-frame/skeleton-frame.component';\nexport * from './lib/ui/components/route-skeleton/route-skeleton.component';\nexport * from './lib/ui/components/stat-cards/stat-cards.component';\nexport * from './lib/ui/components/empty-state/empty-state.component';\nexport * from './lib/ui/components/filter-chips/filter-chips.component';\nexport * from './lib/ui/components/filter-pills/filter-pills.component';\nexport * from './lib/ui/components/stage-dots/stage-dots.component';\nexport * from './lib/ui/components/code-block/code-block.component';\nexport * from './lib/ui/components/screenshot-frame/screenshot-frame.component';\nexport * from './lib/ui/components/meter/meter.component';\nexport * from './lib/ui/components/section-card/section-card.component';\nexport * from './lib/ui/components/info-field/info-field.component';\nexport * from './lib/ui/components/severity-badges/severity-badges.component';\nexport * from './lib/ui/components/master-detail/master-detail.component';\nexport * from './lib/ui/components/menu/menu.component';\nexport * from './lib/ui/components/theme-picker/theme-picker.component';\nexport * from './lib/ui/components/pending-badge/pending-badge.component';\nexport * from './lib/ui/components/sample-frame/sample-frame.component';\nexport * from './lib/ui/components/score-badge/score-badge.component';\nexport * from './lib/ui/components/status-dot/status-dot.component';\nexport * from './lib/ui/components/sparkbar/sparkbar.component';\nexport * from './lib/ui/components/segmented/segmented.component';\nexport * from './lib/ui/components/list-row/list-row.component';\nexport * from './lib/ui/components/bar-list/bar-list.component';\nexport * from './lib/ui/components/facets-rail/facets-rail.component';\nexport * from './lib/ui/components/project-card/project-card.component';\nexport * from './lib/ui/components/pipeline-stepper/pipeline-stepper.component';\nexport * from './lib/ui/motion';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.HttpWrapper","i2","i2.FxToastrService","i3.HttpWrapper","i1","i1.PermissionService","i1.AuthStateService","range"],"mappings":"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"}