@elasticias/core 1.0.13 → 1.0.15

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.
@@ -1557,21 +1557,26 @@ function isTypingTarget(target) {
1557
1557
  }
1558
1558
 
1559
1559
  /** Reads the platform once. `userAgentData` is the current standard; the
1560
- * `platform` string fallback covers browsers that don't expose it yet. */
1561
- function detectMacPlatform() {
1560
+ * `platform` string fallback covers browsers that don't expose it yet.
1561
+ *
1562
+ * The test is "Apple", not "Mac". An iPhone reports `iPhone` and an iPad
1563
+ * reports either `iPad` or, since iPadOS 13, the same `MacIntel` a desktop
1564
+ * does. A narrower `/mac/i` told every iOS device with a keyboard that the
1565
+ * modifier was Ctrl, which is the one thing it is not. */
1566
+ function detectApplePlatform() {
1562
1567
  if (typeof navigator === 'undefined')
1563
1568
  return false;
1564
1569
  const uaData = navigator
1565
1570
  .userAgentData;
1566
1571
  const platform = uaData?.platform ?? navigator.platform ?? '';
1567
- return /mac/i.test(platform);
1572
+ return /mac|iphone|ipad|ipod/i.test(platform);
1568
1573
  }
1569
1574
  /**
1570
- * Detected once, at module load. `formatShortcut` uses it by default, and
1571
- * `ef-shortcuts-dialog` reads it directly to decide whether its "Ctrl on
1572
- * Windows and Linux" line is news (it isn't, on a Mac) or worth a sentence.
1575
+ * Detected once, at module load. `formatShortcut` uses it to choose between
1576
+ * the Command glyphs and the Ctrl words. True for every Apple platform, not
1577
+ * just the desktop: an iPad with a keyboard sends Command like a Mac does.
1573
1578
  */
1574
- const isMacPlatform = detectMacPlatform();
1579
+ const isMacPlatform = detectApplePlatform();
1575
1580
  const MAC_MODIFIER_GLYPHS = {
1576
1581
  mod: '⌘',
1577
1582
  shift: '⇧',
@@ -1648,7 +1653,11 @@ function formatShortcut(keys, mac = isMacPlatform) {
1648
1653
  *
1649
1654
  * Two things make this safe to leave switched on everywhere:
1650
1655
  * - The dispatcher ignores keydown while the target is an input, textarea,
1651
- * select, or anything `contenteditable`. See `isTypingTarget`.
1656
+ * select, or anything `contenteditable`, unless the combo includes
1657
+ * `mod`. A bare key or a Shift/Alt combo could be real typing (Alt and
1658
+ * AltGr both produce characters on several layouts this app ships), but
1659
+ * `mod` never does, and a save/search shortcut is normally pressed from
1660
+ * inside the very field it acts on. See `isTypingTarget`.
1652
1661
  * - `preventDefault` is only called once a registration actually matches,
1653
1662
  * so an unmapped key never loses its browser default.
1654
1663
  *
@@ -1729,9 +1738,17 @@ class EfShortcutService {
1729
1738
  }
1730
1739
  }
1731
1740
  onKeydown = (event) => {
1732
- if (isTypingTarget(event.target))
1733
- return;
1734
1741
  const combo = comboFromEvent(event, isMacPlatform);
1742
+ // A bare key, or one held with only Shift or Alt, is something the
1743
+ // user could plausibly be typing (Alt/AltGr produces real
1744
+ // characters on several layouts this app ships, French and
1745
+ // Moroccan included), so those stay inert in a field. `mod` never
1746
+ // types a character: Ctrl+S saves from inside a form field in
1747
+ // every application there is, and a form field is the only place
1748
+ // a save shortcut is ever actually pressed from.
1749
+ const isModCombo = combo.split('+').includes('mod');
1750
+ if (!isModCombo && isTypingTarget(event.target))
1751
+ return;
1735
1752
  for (const shortcut of this.registry().values()) {
1736
1753
  if (shortcut.keys !== combo)
1737
1754
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"elasticias-core.mjs","sources":["../../../../libs/core/src/lib/services/loader.service.ts","../../../../libs/core/src/lib/services/cache.service.ts","../../../../libs/core/src/lib/services/toast.service.ts","../../../../libs/core/src/lib/services/confirm-dialog.service.ts","../../../../libs/core/src/lib/guards/screen.guard.ts","../../../../libs/core/src/lib/theme/app-state.ts","../../../../libs/core/src/lib/theme/ef-theme-config.service.ts","../../../../libs/core/src/lib/theme/ef-theme.ts","../../../../libs/core/src/lib/theme/locales/primeng-en.ts","../../../../libs/core/src/lib/theme/locales/primeng-fr.ts","../../../../libs/core/src/lib/theme/locales/primeng-ar.ts","../../../../libs/core/src/lib/modules/ef-module-registry.ts","../../../../libs/core/src/lib/modules/ef-active-module.service.ts","../../../../libs/core/src/lib/responsive/ef-viewport.service.ts","../../../../libs/core/src/lib/auth/ef-permission.service.ts","../../../../libs/core/src/lib/auth/ef-session.token.ts","../../../../libs/core/src/lib/build/ef-build-info.token.ts","../../../../libs/core/src/lib/shortcuts/shortcut-keys.ts","../../../../libs/core/src/lib/shortcuts/format-shortcut.ts","../../../../libs/core/src/lib/shortcuts/ef-shortcut.service.ts","../../../../libs/core/src/elasticias-core.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class LoaderService {\n private loadingSubject = new BehaviorSubject<boolean>(false);\n isLoading$ = this.loadingSubject.asObservable();\n\n show(): void {\n this.loadingSubject.next(true);\n }\n\n hide(): void {\n this.loadingSubject.next(false);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { StorageUtils } from '@elasticias/utils';\n\n@Injectable({ providedIn: 'root' })\nexport class CacheService {\n private cache: Record<string, unknown> = {};\n private useLocalStorage = false;\n\n configure(useLocalStorage = false): void {\n this.useLocalStorage = useLocalStorage;\n }\n\n getCache<T>(key: string): T | null {\n return this.useLocalStorage ? StorageUtils.getLocal<T>(key) : (this.cache[key] as T) ?? null;\n }\n\n setCache(key: string, value: unknown): void {\n if (this.useLocalStorage) {\n StorageUtils.setLocal(key, value);\n } else {\n this.cache[key] = value;\n }\n }\n\n updateCache(key: string, newValue: unknown): void {\n if (this.useLocalStorage) {\n const current = StorageUtils.getLocal(key);\n if (current && typeof current === 'object' && typeof newValue === 'object') {\n StorageUtils.setLocal(key, { ...(current as object), ...(newValue as object) });\n } else {\n StorageUtils.setLocal(key, newValue);\n }\n } else {\n const current = this.cache[key];\n if (current && typeof current === 'object' && typeof newValue === 'object') {\n this.cache[key] = { ...(current as object), ...(newValue as object) };\n } else {\n this.cache[key] = newValue;\n }\n }\n }\n\n removeCache(key: string): void {\n if (this.useLocalStorage) {\n StorageUtils.removeLocal(key);\n } else {\n delete this.cache[key];\n }\n }\n\n clearAllCache(): void {\n if (this.useLocalStorage) {\n StorageUtils.clearLocal();\n } else {\n this.cache = {};\n }\n }\n\n hasCache(key: string): boolean {\n return this.useLocalStorage ? StorageUtils.existsLocal(key) : key in this.cache;\n }\n}\n","import { Injectable, Injector, inject, signal } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MessageService } from 'primeng/api';\n\n/**\n * Toast severities — mapped 1:1 to the Comptoir status spectrum:\n * `info` → processing, `success` → delivered, `warn` → pending,\n * `error` → cancelled.\n */\nexport type EfToastSeverity = 'info' | 'success' | 'warn' | 'error';\n\n/** Optional inline action button rendered at the end of a toast. */\nexport interface EfToastAction {\n /** Translation key for the button label — preferred. */\n labelKey?: string;\n /** Direct label fallback when `labelKey` is empty. */\n label?: string;\n\n /** Visual tone — `'ghost'` (default) or `'primary'` for the\n * destructive / confirm action. */\n severity?: 'ghost' | 'primary';\n\n /** Click handler. */\n command?: () => void;\n\n /** Auto-close the toast after the click runs (default `true`). */\n dismissOnClick?: boolean;\n}\n\n/**\n * Toast options accepted by `EfToastService.show()`. Either a literal\n * `title` / `text` or their `*Key` translation variants — keys win\n * unless empty.\n */\nexport interface EfToastOptions {\n severity?: EfToastSeverity;\n title?: string;\n titleKey?: string;\n text?: string;\n textKey?: string;\n /** Auto-dismiss in ms; `0` = sticky (no auto-dismiss). */\n life?: number;\n actions?: EfToastAction[];\n}\n\n/** Active toast — instance held in `EfToastService.toasts`. */\nexport interface EfToast {\n id: number;\n severity: EfToastSeverity;\n title: string;\n text: string;\n life: number;\n actions?: EfToastAction[];\n}\n\n/**\n * Comptoir toast service — V2 successor to the legacy `ToastService`.\n *\n * Owns a signal-based queue (`toasts`) consumed by\n * `<ef-toast-region>`, AND forwards every toast to PrimeNG's\n * `MessageService` for back-compat with `<p-toast>` (still used by\n * ClientApp v1). Either renderer picks the toasts up; both work.\n *\n * Default i18n keys (override per-call via `titleKey` / `textKey`):\n * - `ef_toast_info_title`, `ef_toast_info_default`\n * - `ef_toast_success_title`, `ef_toast_success_default`\n * - `ef_toast_warn_title`, `ef_toast_warn_default`\n * - `ef_toast_error_title`, `ef_toast_error_default`\n *\n * Default lifespans: info 5s, success 4s, warn 6s, error 8s.\n */\n@Injectable({ providedIn: 'root' })\nexport class EfToastService {\n private static readonly LIFE_INFO = 5000;\n private static readonly LIFE_SUCCESS = 4000;\n private static readonly LIFE_WARN = 6000;\n private static readonly LIFE_ERROR = 8000;\n\n /**\n * Lazy holders. Resolving TranslateService eagerly at construction\n * time pulls in HttpClient → HTTP_INTERCEPTORS → AuthorizeInterceptor\n * → AuthorizeService → ToastService → cycle. We defer to the first\n * actual translate / message-publish call.\n */\n private readonly injector = inject(Injector);\n private _translate?: TranslateService;\n private _messageService?: MessageService | null;\n private _messageServiceResolved = false;\n\n private nextId = 1;\n\n /** Live queue — `<ef-toast-region>` renders this. */\n readonly toasts = signal<ReadonlyArray<EfToast>>([]);\n\n /* ── Convenience methods (back-compat with the legacy\n ToastService signature: `(message?, title?, life?)`). ── */\n\n showInfo(message?: string, title?: string, life: number = EfToastService.LIFE_INFO): void {\n this.show({\n severity: 'info',\n title: title ?? this.t('ef_toast_info_title'),\n text: message ?? this.t('ef_toast_info_default'),\n life,\n });\n }\n\n showSuccess(message?: string, title?: string, life: number = EfToastService.LIFE_SUCCESS): void {\n this.show({\n severity: 'success',\n title: title ?? this.t('ef_toast_success_title'),\n text: message ?? this.t('ef_toast_success_default'),\n life,\n });\n }\n\n showWarn(message?: string, title?: string, life: number = EfToastService.LIFE_WARN): void {\n this.show({\n severity: 'warn',\n title: title ?? this.t('ef_toast_warn_title'),\n text: message ?? this.t('ef_toast_warn_default'),\n life,\n });\n }\n\n showError(message?: string, title?: string, life: number = EfToastService.LIFE_ERROR): void {\n this.show({\n severity: 'error',\n title: title ?? this.t('ef_toast_error_title'),\n text: message ?? this.t('ef_toast_error_default'),\n life,\n });\n }\n\n /** Generic show — opts can mix `title`/`titleKey`, `text`/`textKey`. */\n show(opts: EfToastOptions): EfToast {\n const severity = opts.severity ?? 'info';\n const toast: EfToast = {\n id: this.nextId++,\n severity,\n title: this.resolve(opts.title, opts.titleKey, this.defaultTitleKey(severity)),\n text: this.resolve(opts.text, opts.textKey, undefined),\n life: opts.life ?? this.defaultLife(severity),\n actions: opts.actions,\n };\n\n // Collapse a burst of identical toasts into one. A dashboard fans\n // out to many independent queries, so one rejected filter used to\n // stack the same message once per widget -- seven copies of \"a\n // validation error occurred\", burying the screen. Only toasts that\n // are still on screen dedupe, so the same message shown again later\n // still appears.\n const duplicate = this.toasts().find(\n t =>\n t.severity === toast.severity &&\n t.title === toast.title &&\n t.text === toast.text,\n );\n if (duplicate) return duplicate;\n\n this.toasts.update(list => [...list, toast]);\n\n // Forward to PrimeNG MessageService so v1's <p-toast> still\n // catches the toast. Sticky in PrimeNG is `life: 0`.\n this.messageService?.add({\n severity: toast.severity,\n summary: toast.title,\n detail: toast.text,\n life: toast.life || undefined,\n sticky: toast.life === 0,\n });\n\n return toast;\n }\n\n private get messageService(): MessageService | null {\n if (!this._messageServiceResolved) {\n this._messageServiceResolved = true;\n this._messageService = this.injector.get(MessageService, null, { optional: true });\n }\n return this._messageService ?? null;\n }\n\n dismiss(id: number): void {\n this.toasts.update(list => list.filter(t => t.id !== id));\n }\n\n clear(): void {\n this.toasts.set([]);\n this.messageService?.clear();\n }\n\n /* (messageService getter is defined just below `show` to keep it\n close to where it's consumed.) */\n\n /* ── Internals ─────────────────────────────────────────────── */\n\n private resolve(\n literal: string | undefined,\n key: string | undefined,\n fallbackKey: string | undefined,\n ): string {\n if (literal != null) return literal;\n if (key) return this.t(key);\n if (fallbackKey) return this.t(fallbackKey);\n return '';\n }\n\n private t(key: string): string {\n // Lazy-resolve TranslateService — see the field comment above\n // for the AuthorizeService cycle this avoids.\n this._translate ??= this.injector.get(TranslateService);\n const value = this._translate.instant(key);\n // `instant()` returns the key when no translation is loaded;\n // fall through to empty string so untranslated toasts don't\n // surface internal keys to end users.\n return value === key ? '' : value;\n }\n\n private defaultLife(severity: EfToastSeverity): number {\n switch (severity) {\n case 'info': return EfToastService.LIFE_INFO;\n case 'success': return EfToastService.LIFE_SUCCESS;\n case 'warn': return EfToastService.LIFE_WARN;\n case 'error': return EfToastService.LIFE_ERROR;\n }\n }\n\n private defaultTitleKey(severity: EfToastSeverity): string {\n return `ef_toast_${severity}_title`;\n }\n}\n\n/**\n * @deprecated Use `EfToastService` — same instance, new name. The\n * alias keeps existing imports compiling during the v1 → V2\n * migration.\n */\nexport { EfToastService as ToastService };\n","import { inject, Injectable } from '@angular/core';\nimport { ConfirmationService } from 'primeng/api';\n\n@Injectable({ providedIn: 'root' })\nexport class ConfirmDialogService {\n private readonly confirmationService = inject(ConfirmationService);\n\n confirm(\n message: string,\n acceptCallback?: () => void,\n rejectCallback?: () => void,\n event?: Event\n ): void {\n this.confirmationService.confirm({\n target: event ? (event.target as EventTarget) : undefined,\n message,\n header: 'Confirmation',\n closable: true,\n closeOnEscape: true,\n icon: 'pi pi-exclamation-triangle',\n rejectButtonProps: {\n label: 'Annuler',\n severity: 'secondary',\n outlined: true,\n },\n acceptButtonProps: {\n label: 'Confirmer',\n },\n accept: () => acceptCallback?.(),\n reject: () => rejectCallback?.(),\n });\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { StorageUtils } from '@elasticias/utils';\nimport { Permissions } from '@elasticias/types';\n\n/**\n * Configuration for the screen guard factory.\n */\nexport interface ScreenGuardConfig {\n /** Storage key where screen grants are stored (default: 'CURRENT_USER_GRANTS') */\n grantsStorageKey?: string;\n /** Route to redirect to when access is denied (default: '/') */\n deniedRedirect?: string;\n /** Minimum required permission to access the screen (default: Permissions.Read) */\n requiredPermission?: Permissions;\n /** Storage type to read grants from (default: 'session') */\n storageType?: 'local' | 'session';\n}\n\n/**\n * Creates a reusable Angular route guard that checks screen-level permissions.\n *\n * Usage in route definitions:\n * ```typescript\n * {\n * path: 'countries',\n * data: { screenCode: 'Countries' },\n * canActivate: [screenGuard()],\n * children: [\n * { path: '', component: CountriesComponent },\n * { path: 'details/:id', component: CountriesDetailsComponent },\n * ]\n * }\n * ```\n *\n * The guard reads the `screenCode` from route data (traversing parent routes)\n * and checks if the current user has at least the required permission (default: Read).\n */\nexport function screenGuard(config?: ScreenGuardConfig): CanActivateFn {\n return (route: ActivatedRouteSnapshot) => {\n const router = inject(Router);\n const grantsKey = config?.grantsStorageKey ?? 'CURRENT_USER_GRANTS';\n const deniedRedirect = config?.deniedRedirect ?? '/';\n const requiredPermission = config?.requiredPermission ?? Permissions.Read;\n const storageType = config?.storageType ?? 'local';\n\n const screenCode = getScreenCode(route);\n\n // If no screenCode found on this route or any parent, allow access\n if (!screenCode) {\n return true;\n }\n\n const screenGrants = storageType === 'session'\n ? StorageUtils.getSession<Record<string, { permissions?: string[] }>>(grantsKey)\n : StorageUtils.getLocal<Record<string, { permissions?: string[] }>>(grantsKey);\n\n if (!screenGrants) {\n router.navigate([deniedRedirect]);\n return false;\n }\n\n const grant = screenGrants[screenCode];\n if (!grant?.permissions?.includes(requiredPermission)) {\n router.navigate([deniedRedirect]);\n return false;\n }\n\n return true;\n };\n}\n\n/**\n * Walks up the route tree to find the nearest screenCode in route data.\n */\nfunction getScreenCode(route: ActivatedRouteSnapshot): string | undefined {\n let current: ActivatedRouteSnapshot | null = route;\n while (current) {\n const code = current.data?.['screenCode'] as string | undefined;\n if (code) return code;\n current = current.parent;\n }\n return undefined;\n}\n\n/**\n * Utility function to check if the current user has a specific permission on a screen.\n * Can be used in components/services outside of route guards.\n */\nexport function hasScreenPermission(\n screenCode: string,\n permission: Permissions,\n grantsStorageKey = 'CURRENT_USER_GRANTS',\n storageType: 'local' | 'session' = 'local'\n): boolean {\n const screenGrants = storageType === 'session'\n ? StorageUtils.getSession<Record<string, { permissions?: string[] }>>(grantsStorageKey)\n : StorageUtils.getLocal<Record<string, { permissions?: string[] }>>(grantsStorageKey);\n if (!screenGrants) return false;\n\n const grant = screenGrants[screenCode];\n return grant?.permissions?.includes(permission) ?? false;\n}\n","export interface AppState {\n preset?: string;\n primary?: string;\n surface?: string;\n darkTheme?: boolean;\n menuActive?: boolean;\n mobileMenuVisible?: boolean;\n designerKey?: string;\n RTL?: boolean;\n}\n\nexport const DEFAULT_APP_STATE: AppState = {\n preset: 'Lara',\n primary: 'noir',\n surface: null as any,\n darkTheme: false,\n menuActive: true,\n mobileMenuVisible: false,\n designerKey: 'primeng-designer-theme',\n RTL: false\n};\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { computed, effect, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport { palette, updatePrimaryPalette } from '@primeng/themes';\nimport { StorageUtils } from '@elasticias/utils';\nimport { AppState, DEFAULT_APP_STATE } from './app-state';\n\n/**\n * Service that manages theme state: preset, primary color, surface, dark mode, RTL.\n * State is persisted to localStorage so user preferences survive page reloads.\n *\n * Apps can extend this service or use it directly.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class EfThemeConfigService {\n private readonly STORAGE_KEY = 'APP_CONFIG_STATE';\n\n appState = signal<AppState>(null as any);\n\n designerActive = signal(false);\n\n newsActive = signal(false);\n\n document = inject(DOCUMENT);\n\n platformId = inject(PLATFORM_ID);\n\n theme = computed(() => (this.appState()?.darkTheme ? 'dark' : 'light'));\n\n transitionComplete = signal<boolean>(false);\n\n constructor() {\n const initialState = this.loadAppState();\n this.appState.set({ ...initialState });\n\n // Apply preset class + RTL synchronously so the first paint has\n // the right theme — the effect below picks up subsequent changes\n // (including any subclass `appState.update()` issued before its\n // first run).\n this.updatePresetClass(initialState);\n if (isPlatformBrowser(this.platformId) && initialState?.RTL) {\n this.document.documentElement.setAttribute('dir', 'rtl');\n }\n\n effect(() => {\n const state = this.appState();\n if (!state) return;\n this.saveAppState(state);\n this.updatePresetClass(state);\n this.handleDarkModeTransition(state);\n this.applyRTL(state);\n });\n }\n\n private static readonly PRESET_CLASS_MAP: Record<string, string> = {\n Aura: 'theme-compact',\n Lara: 'theme-modern',\n Material: 'theme-material',\n Nora: 'theme-classic',\n Comptoir: 'theme-comptoir',\n };\n\n private static readonly TENANT_RAMP_STOPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900] as const;\n\n private static readonly ALL_THEME_CLASSES = Object.values(EfThemeConfigService.PRESET_CLASS_MAP);\n\n private updatePresetClass(state: AppState): void {\n if (isPlatformBrowser(this.platformId)) {\n const body = this.document.body;\n body.classList.remove(...EfThemeConfigService.ALL_THEME_CLASSES);\n if (state.preset) {\n const cls = EfThemeConfigService.PRESET_CLASS_MAP[state.preset];\n if (cls) {\n body.classList.add(cls);\n }\n }\n }\n }\n\n private handleDarkModeTransition(state: AppState): void {\n if (isPlatformBrowser(this.platformId)) {\n if ((document as any).startViewTransition) {\n this.startViewTransition(state);\n } else {\n this.toggleDarkMode(state);\n this.onTransitionEnd();\n }\n }\n }\n\n private startViewTransition(state: AppState): void {\n const transition = (document as any).startViewTransition(() => {\n this.toggleDarkMode(state);\n });\n\n transition.ready\n .then(() => this.onTransitionEnd())\n .catch(() => { /* view transition aborted */ });\n }\n\n private toggleDarkMode(state: AppState): void {\n if (state.darkTheme) {\n this.document.documentElement.classList.add('p-dark');\n } else {\n this.document.documentElement.classList.remove('p-dark');\n }\n }\n\n private onTransitionEnd() {\n this.transitionComplete.set(true);\n setTimeout(() => {\n this.transitionComplete.set(false);\n });\n }\n\n private applyRTL(state: AppState): void {\n if (isPlatformBrowser(this.platformId)) {\n const setDir = () => {\n if (state.RTL) {\n this.document.documentElement.setAttribute('dir', 'rtl');\n } else {\n this.document.documentElement.removeAttribute('dir');\n }\n };\n\n if ((document as any).startViewTransition) {\n const t = (document as any).startViewTransition(() => setDir());\n t.ready.catch(() => { /* view transition aborted */ });\n } else {\n setDir();\n }\n }\n }\n\n hideMenu() {\n this.appState.update((state) => ({ ...state, menuActive: false }));\n }\n\n showMenu() {\n this.appState.update((state) => ({ ...state, menuActive: true }));\n }\n\n toggleMobileMenu() {\n this.appState.update((state) => ({\n ...state,\n mobileMenuVisible: !state.mobileMenuVisible\n }));\n }\n\n closeMobileMenu() {\n this.appState.update((state) => ({\n ...state,\n mobileMenuVisible: false\n }));\n }\n\n openMobileMenu() {\n this.appState.update((state) => ({\n ...state,\n mobileMenuVisible: true\n }));\n }\n\n hideNews() {\n this.newsActive.set(false);\n }\n\n showNews() {\n this.newsActive.set(true);\n }\n\n showDesigner() {\n this.designerActive.set(true);\n }\n\n hideDesigner() {\n this.designerActive.set(false);\n }\n\n private loadAppState(): AppState {\n if (isPlatformBrowser(this.platformId)) {\n const storedState = StorageUtils.getLocal<AppState>(this.STORAGE_KEY);\n if (storedState) {\n return storedState;\n }\n }\n return { ...DEFAULT_APP_STATE };\n }\n\n private saveAppState(state: AppState): void {\n if (isPlatformBrowser(this.platformId)) {\n StorageUtils.setLocal(this.STORAGE_KEY, state);\n }\n }\n\n /**\n * Applies a tenant's brand color across both PrimeNG's primary palette\n * and the Comptoir `--tenant-*` CSS variables.\n *\n * Generates a 50–950 ramp from the input hex via PrimeNG's `palette()`\n * helper, hands the full ramp to `updatePrimaryPalette()`, and writes\n * stops 50–900 onto `documentElement.style` so the SCSS layer's\n * `var(--tenant-*)` references resolve to the tenant's color.\n *\n * Call this whenever the active tenant changes (e.g., from an effect\n * watching `tenantService.storeConfig().primaryColor`).\n */\n setTenantAccent(hex: string): void {\n if (!hex) return;\n\n const ramp = palette(hex) as Record<string, string>;\n if (!ramp) return;\n\n updatePrimaryPalette(ramp);\n\n if (isPlatformBrowser(this.platformId)) {\n const root = this.document.documentElement;\n for (const stop of EfThemeConfigService.TENANT_RAMP_STOPS) {\n const value = ramp[String(stop)];\n if (value) {\n root.style.setProperty(`--tenant-${stop}`, value);\n }\n }\n }\n }\n}\n","import { definePreset } from '@primeng/themes';\nimport Aura from '@primeng/themes/aura';\nimport Lara from '@primeng/themes/lara';\n\n/* ──────────────────────────────────────────────────────────────────\n * LEGACY: Noir preset (Aura base, monochrome surface palette).\n * Kept for backward-compat with apps that haven't migrated to\n * Comptoir. Phase 5 of the design-system plan retrofits consumers\n * to EfComptoirTheme; once that lands, Noir + EfTheme can be\n * deleted.\n * ────────────────────────────────────────────────────────────── */\n\nconst Noir = definePreset(Aura, {\n semantic: {\n primary: {\n 50: '{surface.50}',\n 100: '{surface.100}',\n 200: '{surface.200}',\n 300: '{surface.300}',\n 400: '{surface.400}',\n 500: '{surface.500}',\n 600: '{surface.600}',\n 700: '{surface.700}',\n 800: '{surface.800}',\n 900: '{surface.900}',\n 950: '{surface.950}'\n },\n colorScheme: {\n light: {\n primary: {\n color: '{primary.950}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.800}',\n activeColor: '{primary.700}'\n },\n highlight: {\n background: '{primary.950}',\n focusBackground: '{primary.700}',\n color: '#ffffff',\n focusColor: '#ffffff'\n }\n },\n dark: {\n primary: {\n color: '{primary.50}',\n contrastColor: '{primary.950}',\n hoverColor: '{primary.200}',\n activeColor: '{primary.300}'\n },\n highlight: {\n background: '{primary.50}',\n focusBackground: '{primary.300}',\n color: '{primary.950}',\n focusColor: '{primary.950}'\n }\n }\n }\n }\n});\n\n/**\n * Default Elasticias theme configuration for PrimeNG.\n * Uses the Noir preset (surface-based primary colors) with dark mode support.\n *\n * @deprecated Migrate to {@link EfComptoirTheme} as part of Phase 5 of the\n * design-system plan. Will be removed once all consumers have moved.\n */\nexport const EfTheme = {\n preset: Noir,\n options: {\n darkModeSelector: '.p-dark',\n }\n};\n\nexport default EfTheme;\n\n/* ──────────────────────────────────────────────────────────────────\n * COMPTOIR: ink surface + tenant primary (Lara base).\n * Surface palette is the ink ramp from libs/tokens/colors.json.\n * Primary palette defaults to the parfumerie sample tenant; it is\n * runtime-replaced by EfThemeConfigService.setTenantAccent(hex)\n * via PrimeNG's updatePrimaryPalette() API.\n * ────────────────────────────────────────────────────────────── */\n\nconst ComptoirPreset = definePreset(Lara, {\n semantic: {\n primary: {\n 50: '#f7f0f4',\n 100: '#ecdce5',\n 200: '#d8b4c5',\n 300: '#b87a99',\n 400: '#934e74',\n 500: '#6f3257',\n 600: '#54243f',\n 700: '#401a30',\n 800: '#2c1221',\n 900: '#1a0913',\n 950: '#0d040a'\n },\n /* ──────────────────────────────────────────────────────────────\n * Control sizing (ADR-009). The native \"comptoir\" variant is the\n * default render path and is pinned to --hit-base (40px) in CSS;\n * these tokens align the OPT-IN PrimeNG variant (p-select filter,\n * p-multiselect, p-inputnumber stepper, etc.) to the same canonical\n * heights so the two paths agree:\n * base → 40px (--hit-base) sm → 32px (--hit) lg → 48px (--hit-touch, POS/mobile)\n * Lara form-field height ≈ paddingY*2 + lineHeight(1.5)*fontSize(14px) + 2px border.\n * base: 8px*2 + 21 + 2 ≈ 40px · sm: 5px*2 + ~18 + 2 ≈ 32px · lg: 12px*2 + 21 + 2 ≈ 48px\n * NOTE: exact pixel height depends on the app's root font-size; the\n * native default path is the verified one — confirm the PrimeNG\n * opt-in controls visually in the running app and nudge paddingY if\n * they read 1-2px off. Border radius matches --r-md (12px). */\n formField: {\n paddingX: '0.75rem',\n paddingY: '0.5rem',\n borderRadius: '12px',\n sm: {\n fontSize: '0.78rem',\n paddingX: '0.625rem',\n paddingY: '0.3125rem'\n },\n lg: {\n fontSize: '0.9375rem',\n paddingX: '0.875rem',\n paddingY: '0.75rem'\n }\n },\n colorScheme: {\n light: {\n primary: {\n color: '{primary.500}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.600}',\n activeColor: '{primary.700}'\n },\n surface: {\n 0: '#ffffff',\n 50: '#f8f9fb',\n 100: '#f1f3f6',\n 200: '#e4e8ee',\n 300: '#cdd3dd',\n 400: '#9ca5b3',\n 500: '#6c7280',\n 600: '#4a4f5a',\n 700: '#2f3239',\n 800: '#1d1f24',\n 900: '#0f1115',\n 950: '#06070a'\n },\n highlight: {\n background: '{primary.500}',\n focusBackground: '{primary.600}',\n color: '#ffffff',\n focusColor: '#ffffff'\n }\n },\n dark: {\n primary: {\n color: '{primary.400}',\n contrastColor: '{primary.950}',\n hoverColor: '{primary.300}',\n activeColor: '{primary.200}'\n },\n surface: {\n 0: '#000000',\n 50: '#06070a',\n 100: '#0f1115',\n 200: '#1d1f24',\n 300: '#2f3239',\n 400: '#4a4f5a',\n 500: '#6c7280',\n 600: '#9ca5b3',\n 700: '#cdd3dd',\n 800: '#e4e8ee',\n 900: '#f1f3f6',\n 950: '#f8f9fb'\n },\n highlight: {\n background: '{primary.400}',\n focusBackground: '{primary.300}',\n color: '{primary.950}',\n focusColor: '{primary.950}'\n }\n }\n }\n }\n});\n\n/**\n * Comptoir theme configuration for PrimeNG (Phase 1 / design-system v0.2).\n * Surface palette = ink ramp; primary palette = tenant accent\n * (runtime-driven via `EfThemeConfigService.setTenantAccent(hex)`).\n *\n * Usage with providePrimeNG:\n * ```ts\n * providePrimeNG({ theme: EfComptoirTheme, ripple: true })\n * ```\n *\n * Pair with `state.preset = 'Comptoir'` so the body class becomes\n * `theme-comptoir` (avoids legacy `theme-modern` radius overrides).\n */\nexport const EfComptoirTheme = {\n preset: ComptoirPreset,\n options: {\n darkModeSelector: '.p-dark',\n }\n};\n","import { Translation } from 'primeng/api';\n\n/**\n * English locale for PrimeNG components.\n *\n * Usage:\n * ```ts\n * import { PRIMENG_EN_LOCALE } from '@elasticias/core';\n * this.primeng.translation = PRIMENG_EN_LOCALE;\n * ```\n */\nexport const PRIMENG_EN_LOCALE: Translation = {\n startsWith: 'Starts with',\n contains: 'Contains',\n notContains: 'Not contains',\n endsWith: 'Ends with',\n equals: 'Equals',\n notEquals: 'Not equals',\n noFilter: 'No Filter',\n lt: 'Less than',\n lte: 'Less than or equal to',\n gt: 'Greater than',\n gte: 'Greater than or equal to',\n dateIs: 'Date is',\n dateIsNot: 'Date is not',\n dateBefore: 'Date is before',\n dateAfter: 'Date is after',\n clear: 'Clear',\n apply: 'Apply',\n matchAll: 'Match All',\n matchAny: 'Match Any',\n addRule: 'Add Rule',\n removeRule: 'Remove Rule',\n accept: 'Yes',\n reject: 'No',\n choose: 'Choose',\n upload: 'Upload',\n cancel: 'Cancel',\n completed: 'Completed',\n pending: 'Pending',\n fileSizeTypes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n chooseYear: 'Choose Year',\n chooseMonth: 'Choose Month',\n chooseDate: 'Choose Date',\n prevDecade: 'Previous Decade',\n nextDecade: 'Next Decade',\n prevYear: 'Previous Year',\n nextYear: 'Next Year',\n prevMonth: 'Previous Month',\n nextMonth: 'Next Month',\n prevHour: 'Previous Hour',\n nextHour: 'Next Hour',\n prevMinute: 'Previous Minute',\n nextMinute: 'Next Minute',\n prevSecond: 'Previous Second',\n nextSecond: 'Next Second',\n am: 'AM',\n pm: 'PM',\n today: 'Today',\n weekHeader: 'Wk',\n firstDayOfWeek: 0,\n showMonthAfterYear: false,\n dateFormat: 'mm/dd/yy',\n weak: 'Weak',\n medium: 'Medium',\n strong: 'Strong',\n passwordPrompt: 'Enter a password',\n emptyFilterMessage: 'No results found',\n searchMessage: '{0} results are available',\n selectionMessage: '{0} items selected',\n emptySelectionMessage: 'No selected item',\n emptySearchMessage: 'No results found',\n emptyMessage: 'No available options',\n aria: {\n trueLabel: 'True',\n falseLabel: 'False',\n nullLabel: 'Not Selected',\n star: '1 star',\n stars: '{star} stars',\n selectAll: 'All items selected',\n unselectAll: 'All items unselected',\n close: 'Close',\n previous: 'Previous',\n next: 'Next',\n navigation: 'Navigation',\n scrollTop: 'Scroll Top',\n moveTop: 'Move Top',\n moveUp: 'Move Up',\n moveDown: 'Move Down',\n moveBottom: 'Move Bottom',\n moveToTarget: 'Move to Target',\n moveToSource: 'Move to Source',\n moveAllToTarget: 'Move All to Target',\n moveAllToSource: 'Move All to Source',\n pageLabel: 'Page {page}',\n firstPageLabel: 'First Page',\n lastPageLabel: 'Last Page',\n nextPageLabel: 'Next Page',\n prevPageLabel: 'Previous Page',\n rowsPerPageLabel: 'Rows per page',\n jumpToPageDropdownLabel: 'Jump to Page Dropdown',\n jumpToPageInputLabel: 'Jump to Page Input',\n selectRow: 'Row Selected',\n unselectRow: 'Row Unselected',\n expandRow: 'Row Expanded',\n collapseRow: 'Row Collapsed',\n showFilterMenu: 'Show Filter Menu',\n hideFilterMenu: 'Hide Filter Menu',\n filterOperator: 'Filter Operator',\n filterConstraint: 'Filter Constraint',\n editRow: 'Row Edit',\n saveEdit: 'Save Edit',\n cancelEdit: 'Cancel Edit',\n listView: 'List View',\n gridView: 'Grid View',\n slide: 'Slide',\n slideNumber: '{slideNumber}',\n zoomImage: 'Zoom Image',\n zoomIn: 'Zoom In',\n zoomOut: 'Zoom Out',\n rotateRight: 'Rotate Right',\n rotateLeft: 'Rotate Left',\n listLabel: 'Option List',\n },\n} as Translation;\n","import { Translation } from 'primeng/api';\n\n/**\n * French locale for PrimeNG components.\n *\n * Usage:\n * ```ts\n * import { PRIMENG_FR_LOCALE } from '@elasticias/core';\n * this.primeng.translation = PRIMENG_FR_LOCALE;\n * ```\n */\nexport const PRIMENG_FR_LOCALE: Translation = {\n startsWith: 'Commence par',\n contains: 'Contient',\n notContains: 'Ne contient pas',\n endsWith: 'Se termine par',\n equals: 'Égal à',\n notEquals: 'Différent de',\n noFilter: 'Aucun filtre',\n lt: 'Inférieur à',\n lte: 'Inférieur ou égal à',\n gt: 'Supérieur à',\n gte: 'Supérieur ou égal à',\n dateIs: 'La date est',\n dateIsNot: \"La date n'est pas\",\n dateBefore: 'La date est avant',\n dateAfter: 'La date est après',\n clear: 'Effacer',\n apply: 'Appliquer',\n matchAll: 'Correspond à tous',\n matchAny: \"Correspond à n'importe quel\",\n addRule: 'Ajouter une règle',\n removeRule: 'Supprimer la règle',\n accept: 'Oui',\n reject: 'Non',\n choose: 'Choisir',\n upload: 'Télécharger',\n cancel: 'Annuler',\n completed: 'Terminé',\n pending: 'En attente',\n fileSizeTypes: ['o', 'Ko', 'Mo', 'Go', 'To', 'Po', 'Eo', 'Zo', 'Yo'],\n dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],\n dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],\n dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],\n monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],\n monthNamesShort: ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jun', 'Jul', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc'],\n chooseYear: \"Choisir l'année\",\n chooseMonth: 'Choisir le mois',\n chooseDate: 'Choisir la date',\n prevDecade: 'Décennie précédente',\n nextDecade: 'Décennie suivante',\n prevYear: 'Année précédente',\n nextYear: 'Année suivante',\n prevMonth: 'Mois précédent',\n nextMonth: 'Mois suivant',\n prevHour: 'Heure précédente',\n nextHour: 'Heure suivante',\n prevMinute: 'Minute précédente',\n nextMinute: 'Minute suivante',\n prevSecond: 'Seconde précédente',\n nextSecond: 'Seconde suivante',\n am: 'AM',\n pm: 'PM',\n today: \"Aujourd'hui\",\n weekHeader: 'Sem',\n firstDayOfWeek: 1,\n showMonthAfterYear: false,\n dateFormat: 'dd/mm/yy',\n weak: 'Faible',\n medium: 'Moyen',\n strong: 'Fort',\n passwordPrompt: 'Entrez un mot de passe',\n emptyFilterMessage: 'Aucun résultat trouvé',\n searchMessage: '{0} résultats sont disponibles',\n selectionMessage: '{0} éléments sélectionnés',\n emptySelectionMessage: 'Aucun élément sélectionné',\n emptySearchMessage: 'Aucun résultat trouvé',\n emptyMessage: 'Aucune option disponible',\n aria: {\n trueLabel: 'Vrai',\n falseLabel: 'Faux',\n nullLabel: 'Non sélectionné',\n star: '1 étoile',\n stars: '{star} étoiles',\n selectAll: 'Tous les éléments sélectionnés',\n unselectAll: 'Tous les éléments désélectionnés',\n close: 'Fermer',\n previous: 'Précédent',\n next: 'Suivant',\n navigation: 'Navigation',\n scrollTop: 'Défiler vers le haut',\n moveTop: 'Déplacer vers le haut',\n moveUp: 'Déplacer vers le haut',\n moveDown: 'Déplacer vers le bas',\n moveBottom: 'Déplacer vers le bas',\n moveToTarget: 'Déplacer vers la cible',\n moveToSource: 'Déplacer vers la source',\n moveAllToTarget: 'Tout déplacer vers la cible',\n moveAllToSource: 'Tout déplacer vers la source',\n pageLabel: 'Page {page}',\n firstPageLabel: 'Première page',\n lastPageLabel: 'Dernière page',\n nextPageLabel: 'Page suivante',\n prevPageLabel: 'Page précédente',\n rowsPerPageLabel: 'Lignes par page',\n jumpToPageDropdownLabel: 'Aller à la page',\n jumpToPageInputLabel: 'Aller à la page',\n selectRow: 'Ligne sélectionnée',\n unselectRow: 'Ligne désélectionnée',\n expandRow: 'Ligne développée',\n collapseRow: 'Ligne réduite',\n showFilterMenu: 'Afficher le menu de filtrage',\n hideFilterMenu: 'Masquer le menu de filtrage',\n filterOperator: 'Opérateur de filtrage',\n filterConstraint: 'Contrainte de filtrage',\n editRow: 'Modifier la ligne',\n saveEdit: 'Enregistrer la modification',\n cancelEdit: 'Annuler la modification',\n listView: 'Vue en liste',\n gridView: 'Vue en grille',\n slide: 'Glisser',\n slideNumber: '{slideNumber}',\n zoomImage: \"Agrandir l'image\",\n zoomIn: 'Zoomer',\n zoomOut: 'Dézoomer',\n rotateRight: 'Faire pivoter à droite',\n rotateLeft: 'Faire pivoter à gauche',\n listLabel: 'Liste',\n },\n} as Translation;\n","import { Translation } from 'primeng/api';\n\n/**\n * Arabic locale for PrimeNG components (Moroccan month names).\n *\n * Usage:\n * ```ts\n * import { PRIMENG_AR_LOCALE } from '@elasticias/core';\n * this.primeng.translation = PRIMENG_AR_LOCALE;\n * ```\n */\nexport const PRIMENG_AR_LOCALE: Translation = {\n startsWith: 'يبدأ بـ',\n contains: 'يحتوي على',\n notContains: 'لا يحتوي على',\n endsWith: 'ينتهي بـ',\n equals: 'يساوي',\n notEquals: 'لا يساوي',\n noFilter: 'بدون فلتر',\n lt: 'أقل من',\n lte: 'أقل من أو يساوي',\n gt: 'أكبر من',\n gte: 'أكبر من أو يساوي',\n dateIs: 'التاريخ هو',\n dateIsNot: 'التاريخ ليس',\n dateBefore: 'التاريخ قبل',\n dateAfter: 'التاريخ بعد',\n clear: 'مسح',\n apply: 'تطبيق',\n matchAll: 'تطابق الكل',\n matchAny: 'تطابق أي',\n addRule: 'إضافة قاعدة',\n removeRule: 'حذف القاعدة',\n accept: 'نعم',\n reject: 'لا',\n choose: 'اختيار',\n upload: 'رفع',\n cancel: 'إلغاء',\n completed: 'مكتمل',\n pending: 'قيد الانتظار',\n fileSizeTypes: ['بايت', 'ك.ب', 'م.ب', 'ج.ب', 'ت.ب', 'ب.ب', 'إ.ب', 'ز.ب', 'ي.ب'],\n dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n dayNamesShort: ['أحد', 'اثن', 'ثلا', 'أرب', 'خمي', 'جمع', 'سبت'],\n dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n monthNames: ['يناير', 'فبراير', 'مارس', 'أبريل', 'ماي', 'يونيو', 'يوليوز', 'غشت', 'شتنبر', 'أكتوبر', 'نونبر', 'دجنبر'],\n monthNamesShort: ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'غشت', 'شتن', 'أكت', 'نون', 'دجن'],\n chooseYear: 'اختر السنة',\n chooseMonth: 'اختر الشهر',\n chooseDate: 'اختر التاريخ',\n prevDecade: 'العقد السابق',\n nextDecade: 'العقد التالي',\n prevYear: 'السنة السابقة',\n nextYear: 'السنة التالية',\n prevMonth: 'الشهر السابق',\n nextMonth: 'الشهر التالي',\n prevHour: 'الساعة السابقة',\n nextHour: 'الساعة التالية',\n prevMinute: 'الدقيقة السابقة',\n nextMinute: 'الدقيقة التالية',\n prevSecond: 'الثانية السابقة',\n nextSecond: 'الثانية التالية',\n am: 'ص',\n pm: 'م',\n today: 'اليوم',\n weekHeader: 'أس',\n firstDayOfWeek: 1,\n showMonthAfterYear: false,\n dateFormat: 'dd/mm/yy',\n weak: 'ضعيف',\n medium: 'متوسط',\n strong: 'قوي',\n passwordPrompt: 'أدخل كلمة المرور',\n emptyFilterMessage: 'لم يتم العثور على نتائج',\n searchMessage: '{0} نتائج متاحة',\n selectionMessage: '{0} عناصر محددة',\n emptySelectionMessage: 'لا يوجد عنصر محدد',\n emptySearchMessage: 'لم يتم العثور على نتائج',\n emptyMessage: 'لا توجد خيارات متاحة',\n aria: {\n trueLabel: 'صحيح',\n falseLabel: 'خاطئ',\n nullLabel: 'غير محدد',\n star: 'نجمة واحدة',\n stars: '{star} نجوم',\n selectAll: 'تم تحديد جميع العناصر',\n unselectAll: 'تم إلغاء تحديد جميع العناصر',\n close: 'إغلاق',\n previous: 'السابق',\n next: 'التالي',\n navigation: 'التنقل',\n scrollTop: 'التمرير للأعلى',\n moveTop: 'نقل للأعلى',\n moveUp: 'نقل للأعلى',\n moveDown: 'نقل للأسفل',\n moveBottom: 'نقل للأسفل',\n moveToTarget: 'نقل إلى الهدف',\n moveToSource: 'نقل إلى المصدر',\n moveAllToTarget: 'نقل الكل إلى الهدف',\n moveAllToSource: 'نقل الكل إلى المصدر',\n pageLabel: 'صفحة {page}',\n firstPageLabel: 'الصفحة الأولى',\n lastPageLabel: 'الصفحة الأخيرة',\n nextPageLabel: 'الصفحة التالية',\n prevPageLabel: 'الصفحة السابقة',\n rowsPerPageLabel: 'سطور في الصفحة',\n jumpToPageDropdownLabel: 'الانتقال إلى الصفحة',\n jumpToPageInputLabel: 'الانتقال إلى الصفحة',\n selectRow: 'تم تحديد السطر',\n unselectRow: 'تم إلغاء تحديد السطر',\n expandRow: 'تم توسيع السطر',\n collapseRow: 'تم طي السطر',\n showFilterMenu: 'إظهار قائمة الفلتر',\n hideFilterMenu: 'إخفاء قائمة الفلتر',\n filterOperator: 'عامل الفلتر',\n filterConstraint: 'قيد الفلتر',\n editRow: 'تعديل السطر',\n saveEdit: 'حفظ التعديل',\n cancelEdit: 'إلغاء التعديل',\n listView: 'عرض قائمة',\n gridView: 'عرض شبكة',\n slide: 'تمرير',\n slideNumber: '{slideNumber}',\n zoomImage: 'تكبير الصورة',\n zoomIn: 'تكبير',\n zoomOut: 'تصغير',\n rotateRight: 'تدوير لليمين',\n rotateLeft: 'تدوير لليسار',\n listLabel: 'قائمة',\n },\n} as Translation;\n","import { InjectionToken } from '@angular/core';\n\n/**\n * The eight ERP modules surfaced by Comptoir. New modules require\n * a matching `--m-{id}` token in the SCSS layer (libs/ui/src/lib/_comptoir.scss)\n * and a labelKey in the consuming app's i18n bundles.\n */\nexport type EfModuleId =\n | 'sales'\n | 'purchase'\n | 'stock'\n | 'pos'\n | 'marketing'\n | 'store'\n | 'finance'\n | 'admin';\n\nexport type EfNavAction = 'read' | 'write' | 'admin';\n\nexport interface EfNavItem {\n /** Stable identifier — usually matches the screen code (e.g. `Users`, `SalesOrders`). */\n id: string;\n labelKey: string;\n icon?: string;\n route: string;\n /** Minimum permission level required to render this item. Defaults to `read`. */\n requiredAction?: EfNavAction;\n /**\n * Optional count chip rendered after the label (e.g. `Commandes ⟨14⟩`).\n * Apps typically derive this from a service signal and patch the\n * registry — it can be number, string, or anything stringifiable.\n */\n badge?: string | number;\n}\n\nexport interface EfNavSection {\n id: string;\n labelKey?: string;\n items: EfNavItem[];\n}\n\nexport interface EfModule {\n id: EfModuleId;\n labelKey: string;\n /** PrimeNG icon class used by `ef-module-rail`, e.g. `pi pi-shopping-bag`. */\n icon: string;\n /**\n * CSS custom-property name (without the leading `--`) that the rail\n * applies to the module-current accent. Always `m-{id}` and resolves\n * via the SCSS layer's `[data-module]` selectors at runtime.\n */\n accent: `m-${EfModuleId}`;\n defaultRoute: string;\n navSections: EfNavSection[];\n /**\n * Logical grouping for rail divider placement. `ef-module-rail` renders\n * a 1px divider between two consecutive visible modules whose `group`\n * differs. Free string — `'operations' | 'commerce' | 'admin'` is the\n * conventional set but apps can use anything stable.\n */\n group?: string;\n}\n\n/**\n * Default skeleton for the eight ERP modules. Apps either consume this\n * directly via `EF_MODULES_TOKEN` or extend it with their own `navSections`.\n *\n * Phase 1 ships the metadata only — `ef-module-rail` (Phase 2) uses\n * `id` / `labelKey` / `icon` / `accent` / `defaultRoute`. `navSections`\n * are populated per-app as each module's screens land in Phase 4-5.\n */\nexport const EF_MODULES: ReadonlyArray<EfModule> = [\n {\n id: 'sales',\n labelKey: 'modules.sales',\n icon: 'pi pi-shopping-bag',\n accent: 'm-sales',\n defaultRoute: '/operations/sales',\n navSections: [],\n group: 'operations',\n },\n {\n id: 'purchase',\n labelKey: 'modules.purchase',\n icon: 'pi pi-truck',\n accent: 'm-purchase',\n defaultRoute: '/operations/purchase',\n navSections: [],\n group: 'operations',\n },\n {\n id: 'stock',\n labelKey: 'modules.stock',\n icon: 'pi pi-warehouse',\n accent: 'm-stock',\n defaultRoute: '/operations/stock',\n navSections: [],\n group: 'operations',\n },\n {\n id: 'pos',\n labelKey: 'modules.pos',\n icon: 'pi pi-shop',\n accent: 'm-pos',\n defaultRoute: '/pos',\n navSections: [],\n group: 'operations',\n },\n {\n id: 'marketing',\n labelKey: 'modules.marketing',\n icon: 'pi pi-megaphone',\n accent: 'm-marketing',\n defaultRoute: '/marketing',\n navSections: [],\n group: 'commerce',\n },\n {\n id: 'store',\n labelKey: 'modules.store',\n icon: 'pi pi-globe',\n accent: 'm-store',\n defaultRoute: '/store',\n navSections: [],\n group: 'commerce',\n },\n {\n id: 'finance',\n labelKey: 'modules.finance',\n icon: 'pi pi-chart-line',\n accent: 'm-finance',\n defaultRoute: '/finance',\n navSections: [],\n group: 'commerce',\n },\n {\n id: 'admin',\n labelKey: 'modules.admin',\n icon: 'pi pi-shield',\n accent: 'm-admin',\n defaultRoute: '/admin',\n navSections: [],\n group: 'admin',\n },\n];\n\n/**\n * DI token that the shell components (`ef-module-rail`, `ef-module-side`)\n * read from. Apps provide their own definition (typically extending\n * `EF_MODULES` with populated `navSections`):\n *\n * ```ts\n * providers: [\n * { provide: EF_MODULES_TOKEN, useValue: APP_MODULES }\n * ]\n * ```\n */\nexport const EF_MODULES_TOKEN = new InjectionToken<ReadonlyArray<EfModule>>(\n 'EF_MODULES',\n { providedIn: 'root', factory: () => EF_MODULES }\n);\n","import { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\nimport { EF_MODULES_TOKEN, EfModule, EfModuleId, EfNavItem } from './ef-module-registry';\n\n/**\n * Single source of truth for \"which ERP module is active right now.\"\n *\n * Watches the Router and matches the current URL against each module's\n * `defaultRoute`. The longest matching prefix wins, so `/operations/sales`\n * resolves to `sales` even though `/operations` could in theory match\n * something shorter.\n *\n * Consumers — `ef-module-rail`, `ef-module-side`, `ef-app-main`,\n * `ef-page-head` — read `activeModule()` and derive their state from it.\n *\n * Apps that navigate programmatically without a URL change (rare) can\n * call `setActiveModule(id)` to override.\n */\n@Injectable({ providedIn: 'root' })\nexport class EfActiveModuleService {\n private readonly router = inject(Router);\n private readonly modules = inject(EF_MODULES_TOKEN);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly _activeModule = signal<EfModule | null>(null);\n private readonly _activeNavItem = signal<EfNavItem | null>(null);\n\n readonly activeModule = this._activeModule.asReadonly();\n readonly activeModuleId = computed(() => this._activeModule()?.id ?? null);\n readonly activeNavItem = this._activeNavItem.asReadonly();\n\n constructor() {\n this.resolveFromUrl(this.router.url);\n\n this.router.events\n .pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(e => this.resolveFromUrl(e.urlAfterRedirects));\n }\n\n /**\n * Force the active module. Most apps don't need this — the router\n * subscription keeps `activeModule()` in sync automatically.\n */\n setActiveModule(id: EfModuleId | null): void {\n if (id === null) {\n this._activeModule.set(null);\n return;\n }\n const match = this.modules.find(m => m.id === id);\n if (match) this._activeModule.set(match);\n }\n\n private resolveFromUrl(url: string): void {\n const path = url.split('?')[0].split('#')[0];\n\n let bestModule: EfModule | null = null;\n let bestNavItem: EfNavItem | null = null;\n let bestLen = 0;\n for (const m of this.modules) {\n for (const route of this.routesFor(m)) {\n if (path === route || path.startsWith(route + '/')) {\n if (route.length > bestLen) {\n bestModule = m;\n bestNavItem = this.findNavItem(m, route);\n bestLen = route.length;\n }\n }\n }\n }\n this._activeModule.set(bestModule);\n this._activeNavItem.set(bestNavItem);\n }\n\n private findNavItem(m: EfModule, route: string): EfNavItem | null {\n for (const section of m.navSections) {\n for (const item of section.items) {\n if (item.route === route) return item;\n }\n }\n return null;\n }\n\n /**\n * Every URL prefix that should resolve back to this module: the\n * `defaultRoute` plus every nav item route. Modules whose nav items\n * span multiple URL prefixes (e.g. sales spread across `/operations/sales`\n * and `/parameters/sales`) need this to stay active across all of them.\n */\n private routesFor(m: EfModule): string[] {\n const routes: string[] = [m.defaultRoute];\n for (const section of m.navSections) {\n for (const item of section.items) {\n routes.push(item.route);\n }\n }\n return routes;\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { computed, DestroyRef, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\n\nexport type EfViewport = 'mobile' | 'tablet' | 'desktop';\n\ninterface ViewportQuery {\n viewport: EfViewport;\n query: string;\n}\n\nconst QUERIES: ViewportQuery[] = [\n { viewport: 'mobile', query: '(max-width: 767px)' },\n { viewport: 'tablet', query: '(min-width: 768px) and (max-width: 1279px)' },\n { viewport: 'desktop', query: '(min-width: 1280px)' },\n];\n\n/**\n * Emits the current viewport tier based on `window.matchMedia` breakpoints.\n *\n * Breakpoints come from `libs/tokens/targets.json`:\n * - mobile: ≤ 767px\n * - tablet: 768 – 1279px\n * - desktop: ≥ 1280px\n *\n * SSR-safe: returns `'desktop'` when `window` is unavailable.\n *\n * Usage:\n * ```ts\n * private viewport = inject(EfViewportService);\n *\n * isMobile = computed(() => this.viewport.current() === 'mobile');\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class EfViewportService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly _current = signal<EfViewport>('desktop');\n\n readonly current = this._current.asReadonly();\n readonly isMobile = computed(() => this._current() === 'mobile');\n readonly isTablet = computed(() => this._current() === 'tablet');\n readonly isDesktop = computed(() => this._current() === 'desktop');\n\n constructor() {\n if (!isPlatformBrowser(this.platformId)) return;\n\n const win = this.document.defaultView;\n if (!win || typeof win.matchMedia !== 'function') return;\n\n const lists = QUERIES.map(({ viewport, query }) => {\n const mql = win.matchMedia(query);\n const handler = (e: MediaQueryListEvent | MediaQueryList) => {\n if (e.matches) this._current.set(viewport);\n };\n handler(mql);\n mql.addEventListener('change', handler as (e: MediaQueryListEvent) => void);\n return { mql, handler };\n });\n\n this.destroyRef.onDestroy(() => {\n for (const { mql, handler } of lists) {\n mql.removeEventListener('change', handler as (e: MediaQueryListEvent) => void);\n }\n });\n }\n}\n","import { computed, inject, Injectable, Signal, signal } from '@angular/core';\nimport { EF_MODULES_TOKEN, EfModule, EfModuleId } from '../modules/ef-module-registry';\n\nexport type EfPermissionLevel = 'none' | 'read' | 'write' | 'admin';\n\nexport interface EfModulePermission {\n module: EfModuleId;\n level: EfPermissionLevel;\n}\n\nconst LEVEL_ORDER: Record<EfPermissionLevel, number> = {\n none: 0,\n read: 1,\n write: 2,\n admin: 3,\n};\n\nconst ACTION_REQUIRED: Record<Exclude<EfPermissionLevel, 'none'>, EfPermissionLevel> = {\n read: 'read',\n write: 'write',\n admin: 'admin',\n};\n\n/**\n * Module-scoped permission service.\n *\n * Apps populate it from their auth bootstrap once the user's profile is\n * loaded — typically via `setPermissions()` or by providing a custom\n * source signal:\n *\n * ```ts\n * // bootstrap.ts\n * const perms = inject(EfPermissionService);\n * perms.setPermissions(profile.permissions);\n * ```\n *\n * The service is the single source of truth for shell components\n * (`ef-module-rail`, `ef-module-side`, `*efCan` directive) and routing\n * defaults. Once the screens/menus → Mongo migration lands, the\n * permissions list will be served denormalized on the user/profile\n * document and consumed here without a join.\n */\n@Injectable({ providedIn: 'root' })\nexport class EfPermissionService {\n private readonly modules = inject(EF_MODULES_TOKEN);\n\n private readonly _permissions = signal<ReadonlyArray<EfModulePermission>>([]);\n\n readonly permissions = this._permissions.asReadonly();\n\n /**\n * Replace the current permission set. Pass `[]` to clear (e.g., on logout).\n */\n setPermissions(perms: ReadonlyArray<EfModulePermission>): void {\n this._permissions.set(perms);\n }\n\n /**\n * The level granted to the current user for a given module.\n * Returns `'none'` if the module is not in the permission set.\n */\n level(module: EfModuleId): EfPermissionLevel {\n return this._permissions().find(p => p.module === module)?.level ?? 'none';\n }\n\n /**\n * Whether the current user can perform `action` on `module`.\n * Levels are hierarchical: `admin` > `write` > `read` > `none`.\n */\n can(module: EfModuleId, action: Exclude<EfPermissionLevel, 'none'> = 'read'): boolean {\n return LEVEL_ORDER[this.level(module)] >= LEVEL_ORDER[ACTION_REQUIRED[action]];\n }\n\n /**\n * The list of modules the user can read, in registry order.\n * Used by `ef-module-rail` to decide which icons render.\n */\n readonly visibleModules: Signal<ReadonlyArray<EfModule>> = computed(() => {\n const perms = this._permissions();\n const granted = new Set(\n perms.filter(p => p.level !== 'none').map(p => p.module)\n );\n return this.modules.filter(m => granted.has(m.id));\n });\n\n /**\n * The first visible module — the default landing module after login.\n * Returns `null` when the user has no modules.\n */\n readonly defaultModule: Signal<EfModule | null> = computed(() => {\n return this.visibleModules()[0] ?? null;\n });\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * The bit of an app's session that shared chrome needs to act on.\n *\n * Signing out belongs to the app — it owns the auth client, the grant\n * refresh timer and where to land afterwards — but the control that\n * triggers it belongs to the shell. This token is the seam between them,\n * the same shape as `SCREEN_REF_DATA_SERVICE`.\n *\n * Components inject it optionally and hide their affordance when nothing\n * provides it, so an app that has not opted in shows no dead button.\n *\n * ```ts\n * // app.config.ts\n * { provide: EF_SESSION, useExisting: AuthorizeService }\n * ```\n */\nexport interface EfSession {\n /** End the session and send the user wherever the app decides. */\n logout(): void;\n}\n\nexport const EF_SESSION = new InjectionToken<EfSession>('EF_SESSION');\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Which build of the app is running.\n *\n * Apps generate this at build time — the framework cannot know it — and\n * provide it here so shared chrome can show it without importing anything\n * app-specific. `EfBuildStampComponent` is the intended consumer.\n *\n * ```ts\n * // app.config.ts\n * { provide: EF_BUILD_INFO, useValue: BUILD_INFO }\n * ```\n */\nexport interface EfBuildInfo {\n /** Release version. Empty when the app maintains none — consumers should\n * omit it rather than print a placeholder. */\n version: string;\n\n /** Short commit hash the build came from. */\n commit: string;\n\n /** Commit date as `YYYY-MM-DD` — what a reader actually recognises. */\n date: string;\n\n /** Branch the build came from, useful for telling develop from a release. */\n branch: string;\n\n /**\n * Which deployment this build was made for: `production`, `staging`,\n * `develop`, or `local`. Decided at build time from the ref, because a\n * production build is made from a tag rather than a branch.\n */\n environment: string;\n\n /**\n * The shared `@elasticias/*` packages this build was compiled against,\n * in the order the app wants them listed.\n *\n * Optional: an app that ships no shared packages, or generates its stamp\n * without resolving them, simply omits the key and consumers render\n * nothing rather than an empty group.\n */\n packages?: EfBuildPackage[];\n}\n\n/** One shared package and the version that went into the build. */\nexport interface EfBuildPackage {\n /** Package name as it appears in `package.json`, e.g. `@elasticias/ui`. */\n name: string;\n\n /** The version actually installed, not the range the app declared. */\n version: string;\n}\n\nexport const EF_BUILD_INFO = new InjectionToken<EfBuildInfo>('EF_BUILD_INFO');\n","/**\n * Key-combo parsing shared by `EfShortcutService` (matching a keydown event\n * against the registry) and `formatShortcut` (rendering a registration for\n * display). Kept internal to the shortcuts folder: neither export is part\n * of the public `@elasticias/core` surface.\n */\n\n/** Fixed order modifiers are stored and compared in, so `'shift+mod+x'`\n * and `'mod+shift+x'` normalise to the same string. */\nconst MODIFIER_ORDER = ['mod', 'shift', 'alt'] as const;\n\n/**\n * Physical-key `KeyboardEvent.code` values mapped to the token used in a\n * `keys` string. `code` identifies the physical key regardless of what\n * Shift makes it print, which is what lets `'shift+/'` match the key next\n * to Right Shift on a US layout even though pressing it actually produces\n * `'?'`.\n */\nconst CODE_KEYS: Record<string, string> = {\n Enter: 'enter',\n Escape: 'escape',\n Space: 'space',\n Backspace: 'backspace',\n Tab: 'tab',\n Slash: '/',\n};\n\n/** Normalises a `keys` registration string into a canonical, comparable\n * form: lowercase tokens, modifiers first in a fixed order. */\nexport function normaliseKeys(raw: string): string {\n const tokens = raw\n .toLowerCase()\n .split('+')\n .map(token => token.trim())\n .filter(Boolean);\n const modifierTokens = MODIFIER_ORDER.filter(modifier => tokens.includes(modifier));\n const rest = tokens.filter(token => !(MODIFIER_ORDER as readonly string[]).includes(token));\n return [...modifierTokens, ...rest].join('+');\n}\n\ninterface KeyEventLike {\n code: string;\n key: string;\n metaKey: boolean;\n ctrlKey: boolean;\n shiftKey: boolean;\n altKey: boolean;\n}\n\n/** The canonical key token for an event, independent of Shift. `KeyD`\n * is `'d'` whether or not Shift was held. */\nfunction keyToken(event: KeyEventLike): string {\n if (CODE_KEYS[event.code]) return CODE_KEYS[event.code];\n if (event.code?.startsWith('Key')) return event.code.slice(3).toLowerCase();\n if (event.code?.startsWith('Digit')) return event.code.slice(5);\n return event.key.toLowerCase();\n}\n\n/**\n * Builds the normalised combo a keydown event represents, e.g. `'mod+d'`.\n * `isMac` decides which physical modifier counts as `mod`: Meta on macOS,\n * Control everywhere else.\n */\nexport function comboFromEvent(event: KeyEventLike, isMac: boolean): string {\n const tokens: string[] = [];\n if (isMac ? event.metaKey : event.ctrlKey) tokens.push('mod');\n if (event.shiftKey) tokens.push('shift');\n if (event.altKey) tokens.push('alt');\n tokens.push(keyToken(event));\n return normaliseKeys(tokens.join('+'));\n}\n\n/**\n * True while the event target is a place the user is typing: an input, a\n * textarea, a select, or anything `contenteditable`. The dispatcher checks\n * this before anything else. Without it every shortcut key is a reserved\n * word in every text field in the app.\n */\nexport function isTypingTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n return target.isContentEditable;\n}\n","import { normaliseKeys } from './shortcut-keys';\n\n/** Reads the platform once. `userAgentData` is the current standard; the\n * `platform` string fallback covers browsers that don't expose it yet. */\nfunction detectMacPlatform(): boolean {\n if (typeof navigator === 'undefined') return false;\n const uaData = (navigator as Navigator & { userAgentData?: { platform?: string } })\n .userAgentData;\n const platform = uaData?.platform ?? navigator.platform ?? '';\n return /mac/i.test(platform);\n}\n\n/**\n * Detected once, at module load. `formatShortcut` uses it by default, and\n * `ef-shortcuts-dialog` reads it directly to decide whether its \"Ctrl on\n * Windows and Linux\" line is news (it isn't, on a Mac) or worth a sentence.\n */\nexport const isMacPlatform: boolean = detectMacPlatform();\n\nconst MAC_MODIFIER_GLYPHS: Record<string, string> = {\n mod: '⌘',\n shift: '⇧',\n alt: '⌥',\n};\n\nconst OTHER_MODIFIER_WORDS: Record<string, string> = {\n mod: 'Ctrl',\n shift: 'Shift',\n alt: 'Alt',\n};\n\n/** Named keys with a glyph of their own, distinct from their letter. */\nconst KEY_GLYPHS: Record<string, string> = {\n enter: '↵',\n escape: 'Esc',\n backspace: '⌫',\n space: 'Space',\n tab: 'Tab',\n};\n\n/**\n * A produced character that stands in for the whole combo. Shift plus the\n * physical `/` key always reads as the question mark it prints. Showing\n * it as `'Shift' + '/'` would describe the keys pressed rather than the\n * shortcut a person recognises.\n */\nconst SHIFTED_SYMBOL_GLYPHS: Record<string, string> = {\n '/': '?',\n};\n\n/**\n * Formats a `keys` registration for display. One registration, correct on\n * both platforms:\n *\n * - `'mod+d'` → `⌘D` on macOS, `Ctrl+D` elsewhere\n * - `'enter'` → `↵`\n * - `'e'` → `E`\n * - `'shift+/'` → `?`\n *\n * `mac` defaults to the platform this code is actually running on. Pass it\n * explicitly only to render for a platform other than the current one.\n */\nexport function formatShortcut(keys: string, mac: boolean = isMacPlatform): string {\n const tokens = normaliseKeys(keys).split('+');\n const key = tokens[tokens.length - 1];\n const modifiers = tokens.slice(0, -1);\n\n if (modifiers.length === 1 && modifiers[0] === 'shift' && SHIFTED_SYMBOL_GLYPHS[key]) {\n return SHIFTED_SYMBOL_GLYPHS[key];\n }\n\n const displayKey = KEY_GLYPHS[key] ?? key.toUpperCase();\n\n if (mac) {\n return modifiers.map(modifier => MAC_MODIFIER_GLYPHS[modifier] ?? modifier).join('') + displayKey;\n }\n\n const words = modifiers.map(modifier => OTHER_MODIFIER_WORDS[modifier] ?? modifier);\n return [...words, displayKey].join('+');\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { computed, DestroyRef, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport { isMacPlatform } from './format-shortcut';\nimport { comboFromEvent, isTypingTarget, normaliseKeys } from './shortcut-keys';\nimport { EfShortcut, EfShortcutGroup } from './ef-shortcut.types';\n\n/**\n * App-wide keyboard-shortcut registry, plus the single `document:keydown`\n * dispatcher that acts on it.\n *\n * ```ts\n * private readonly shortcuts = inject(EfShortcutService);\n *\n * constructor() {\n * // Auto-unregisters on this component's DestroyRef, called from a\n * // constructor / field initializer, an active injection context.\n * this.shortcuts.register({\n * id: 'sales-order.save',\n * keys: 'mod+s',\n * labelKey: 'sales_order_save',\n * group: 'shortcut_group_sales_order',\n * handler: () => this.save(),\n * });\n * }\n * ```\n *\n * Two things make this safe to leave switched on everywhere:\n * - The dispatcher ignores keydown while the target is an input, textarea,\n * select, or anything `contenteditable`. See `isTypingTarget`.\n * - `preventDefault` is only called once a registration actually matches,\n * so an unmapped key never loses its browser default.\n *\n * `list()` exposes the registry grouped for `ef-shortcuts-dialog`, as a\n * signal so the dialog reflects registrations and disposals live.\n */\n@Injectable({ providedIn: 'root' })\nexport class EfShortcutService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly registry = signal<ReadonlyMap<string, EfShortcut>>(new Map());\n\n /**\n * The registry, grouped for display and deduplicated by\n * (group, label, keys): several instances of the same conceptual\n * shortcut (one row-actions component per row, say) collapse to a\n * single line rather than repeating once per instance.\n */\n readonly list = computed<EfShortcutGroup[]>(() => {\n const deduped = new Map<string, EfShortcut>();\n for (const shortcut of this.registry().values()) {\n const key = `${shortcut.group}::${shortcut.labelKey}::${shortcut.keys}`;\n if (!deduped.has(key)) deduped.set(key, shortcut);\n }\n\n const byGroup = new Map<string, EfShortcut[]>();\n for (const shortcut of deduped.values()) {\n const group = byGroup.get(shortcut.group) ?? [];\n group.push(shortcut);\n byGroup.set(shortcut.group, group);\n }\n\n return Array.from(byGroup.entries()).map(([group, shortcuts]) => ({ group, shortcuts }));\n });\n\n constructor() {\n if (!isPlatformBrowser(this.platformId)) return;\n this.document.addEventListener('keydown', this.onKeydown);\n this.destroyRef.onDestroy(() => this.document.removeEventListener('keydown', this.onKeydown));\n }\n\n /**\n * Registers a shortcut and returns a disposer. When `register` is\n * called from an active injection context (a component constructor or\n * field initializer), the shortcut also auto-unregisters when that\n * context is destroyed. Call it explicitly elsewhere (a plain method,\n * a route resolver already outside construction) and dispose it\n * yourself.\n */\n register(shortcut: EfShortcut): () => void {\n const entry: EfShortcut = { ...shortcut, keys: normaliseKeys(shortcut.keys) };\n\n this.registry.update(map => {\n const next = new Map(map);\n next.set(entry.id, entry);\n return next;\n });\n\n const dispose = (): void => this.unregister(entry.id);\n this.tryGetCallerDestroyRef()?.onDestroy(dispose);\n return dispose;\n }\n\n /** Removes a registration by id. Safe to call twice: the disposer\n * returned by `register` calls this. */\n unregister(id: string): void {\n this.registry.update(map => {\n if (!map.has(id)) return map;\n const next = new Map(map);\n next.delete(id);\n return next;\n });\n }\n\n /** `inject()` throws outside an active injection context; that is how\n * a call from a plain method (as opposed to a constructor) is told\n * apart from one worth auto-disposing. */\n private tryGetCallerDestroyRef(): DestroyRef | null {\n try {\n return inject(DestroyRef, { optional: true });\n } catch {\n return null;\n }\n }\n\n private readonly onKeydown = (event: KeyboardEvent): void => {\n if (isTypingTarget(event.target)) return;\n\n const combo = comboFromEvent(event, isMacPlatform);\n for (const shortcut of this.registry().values()) {\n if (shortcut.keys !== combo) continue;\n if (shortcut.when && !shortcut.when()) continue;\n event.preventDefault();\n shortcut.handler();\n return;\n }\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"elasticias-core.mjs","sources":["../../../../libs/core/src/lib/services/loader.service.ts","../../../../libs/core/src/lib/services/cache.service.ts","../../../../libs/core/src/lib/services/toast.service.ts","../../../../libs/core/src/lib/services/confirm-dialog.service.ts","../../../../libs/core/src/lib/guards/screen.guard.ts","../../../../libs/core/src/lib/theme/app-state.ts","../../../../libs/core/src/lib/theme/ef-theme-config.service.ts","../../../../libs/core/src/lib/theme/ef-theme.ts","../../../../libs/core/src/lib/theme/locales/primeng-en.ts","../../../../libs/core/src/lib/theme/locales/primeng-fr.ts","../../../../libs/core/src/lib/theme/locales/primeng-ar.ts","../../../../libs/core/src/lib/modules/ef-module-registry.ts","../../../../libs/core/src/lib/modules/ef-active-module.service.ts","../../../../libs/core/src/lib/responsive/ef-viewport.service.ts","../../../../libs/core/src/lib/auth/ef-permission.service.ts","../../../../libs/core/src/lib/auth/ef-session.token.ts","../../../../libs/core/src/lib/build/ef-build-info.token.ts","../../../../libs/core/src/lib/shortcuts/shortcut-keys.ts","../../../../libs/core/src/lib/shortcuts/format-shortcut.ts","../../../../libs/core/src/lib/shortcuts/ef-shortcut.service.ts","../../../../libs/core/src/elasticias-core.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class LoaderService {\n private loadingSubject = new BehaviorSubject<boolean>(false);\n isLoading$ = this.loadingSubject.asObservable();\n\n show(): void {\n this.loadingSubject.next(true);\n }\n\n hide(): void {\n this.loadingSubject.next(false);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { StorageUtils } from '@elasticias/utils';\n\n@Injectable({ providedIn: 'root' })\nexport class CacheService {\n private cache: Record<string, unknown> = {};\n private useLocalStorage = false;\n\n configure(useLocalStorage = false): void {\n this.useLocalStorage = useLocalStorage;\n }\n\n getCache<T>(key: string): T | null {\n return this.useLocalStorage ? StorageUtils.getLocal<T>(key) : (this.cache[key] as T) ?? null;\n }\n\n setCache(key: string, value: unknown): void {\n if (this.useLocalStorage) {\n StorageUtils.setLocal(key, value);\n } else {\n this.cache[key] = value;\n }\n }\n\n updateCache(key: string, newValue: unknown): void {\n if (this.useLocalStorage) {\n const current = StorageUtils.getLocal(key);\n if (current && typeof current === 'object' && typeof newValue === 'object') {\n StorageUtils.setLocal(key, { ...(current as object), ...(newValue as object) });\n } else {\n StorageUtils.setLocal(key, newValue);\n }\n } else {\n const current = this.cache[key];\n if (current && typeof current === 'object' && typeof newValue === 'object') {\n this.cache[key] = { ...(current as object), ...(newValue as object) };\n } else {\n this.cache[key] = newValue;\n }\n }\n }\n\n removeCache(key: string): void {\n if (this.useLocalStorage) {\n StorageUtils.removeLocal(key);\n } else {\n delete this.cache[key];\n }\n }\n\n clearAllCache(): void {\n if (this.useLocalStorage) {\n StorageUtils.clearLocal();\n } else {\n this.cache = {};\n }\n }\n\n hasCache(key: string): boolean {\n return this.useLocalStorage ? StorageUtils.existsLocal(key) : key in this.cache;\n }\n}\n","import { Injectable, Injector, inject, signal } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MessageService } from 'primeng/api';\n\n/**\n * Toast severities — mapped 1:1 to the Comptoir status spectrum:\n * `info` → processing, `success` → delivered, `warn` → pending,\n * `error` → cancelled.\n */\nexport type EfToastSeverity = 'info' | 'success' | 'warn' | 'error';\n\n/** Optional inline action button rendered at the end of a toast. */\nexport interface EfToastAction {\n /** Translation key for the button label — preferred. */\n labelKey?: string;\n /** Direct label fallback when `labelKey` is empty. */\n label?: string;\n\n /** Visual tone — `'ghost'` (default) or `'primary'` for the\n * destructive / confirm action. */\n severity?: 'ghost' | 'primary';\n\n /** Click handler. */\n command?: () => void;\n\n /** Auto-close the toast after the click runs (default `true`). */\n dismissOnClick?: boolean;\n}\n\n/**\n * Toast options accepted by `EfToastService.show()`. Either a literal\n * `title` / `text` or their `*Key` translation variants — keys win\n * unless empty.\n */\nexport interface EfToastOptions {\n severity?: EfToastSeverity;\n title?: string;\n titleKey?: string;\n text?: string;\n textKey?: string;\n /** Auto-dismiss in ms; `0` = sticky (no auto-dismiss). */\n life?: number;\n actions?: EfToastAction[];\n}\n\n/** Active toast — instance held in `EfToastService.toasts`. */\nexport interface EfToast {\n id: number;\n severity: EfToastSeverity;\n title: string;\n text: string;\n life: number;\n actions?: EfToastAction[];\n}\n\n/**\n * Comptoir toast service — V2 successor to the legacy `ToastService`.\n *\n * Owns a signal-based queue (`toasts`) consumed by\n * `<ef-toast-region>`, AND forwards every toast to PrimeNG's\n * `MessageService` for back-compat with `<p-toast>` (still used by\n * ClientApp v1). Either renderer picks the toasts up; both work.\n *\n * Default i18n keys (override per-call via `titleKey` / `textKey`):\n * - `ef_toast_info_title`, `ef_toast_info_default`\n * - `ef_toast_success_title`, `ef_toast_success_default`\n * - `ef_toast_warn_title`, `ef_toast_warn_default`\n * - `ef_toast_error_title`, `ef_toast_error_default`\n *\n * Default lifespans: info 5s, success 4s, warn 6s, error 8s.\n */\n@Injectable({ providedIn: 'root' })\nexport class EfToastService {\n private static readonly LIFE_INFO = 5000;\n private static readonly LIFE_SUCCESS = 4000;\n private static readonly LIFE_WARN = 6000;\n private static readonly LIFE_ERROR = 8000;\n\n /**\n * Lazy holders. Resolving TranslateService eagerly at construction\n * time pulls in HttpClient → HTTP_INTERCEPTORS → AuthorizeInterceptor\n * → AuthorizeService → ToastService → cycle. We defer to the first\n * actual translate / message-publish call.\n */\n private readonly injector = inject(Injector);\n private _translate?: TranslateService;\n private _messageService?: MessageService | null;\n private _messageServiceResolved = false;\n\n private nextId = 1;\n\n /** Live queue — `<ef-toast-region>` renders this. */\n readonly toasts = signal<ReadonlyArray<EfToast>>([]);\n\n /* ── Convenience methods (back-compat with the legacy\n ToastService signature: `(message?, title?, life?)`). ── */\n\n showInfo(message?: string, title?: string, life: number = EfToastService.LIFE_INFO): void {\n this.show({\n severity: 'info',\n title: title ?? this.t('ef_toast_info_title'),\n text: message ?? this.t('ef_toast_info_default'),\n life,\n });\n }\n\n showSuccess(message?: string, title?: string, life: number = EfToastService.LIFE_SUCCESS): void {\n this.show({\n severity: 'success',\n title: title ?? this.t('ef_toast_success_title'),\n text: message ?? this.t('ef_toast_success_default'),\n life,\n });\n }\n\n showWarn(message?: string, title?: string, life: number = EfToastService.LIFE_WARN): void {\n this.show({\n severity: 'warn',\n title: title ?? this.t('ef_toast_warn_title'),\n text: message ?? this.t('ef_toast_warn_default'),\n life,\n });\n }\n\n showError(message?: string, title?: string, life: number = EfToastService.LIFE_ERROR): void {\n this.show({\n severity: 'error',\n title: title ?? this.t('ef_toast_error_title'),\n text: message ?? this.t('ef_toast_error_default'),\n life,\n });\n }\n\n /** Generic show — opts can mix `title`/`titleKey`, `text`/`textKey`. */\n show(opts: EfToastOptions): EfToast {\n const severity = opts.severity ?? 'info';\n const toast: EfToast = {\n id: this.nextId++,\n severity,\n title: this.resolve(opts.title, opts.titleKey, this.defaultTitleKey(severity)),\n text: this.resolve(opts.text, opts.textKey, undefined),\n life: opts.life ?? this.defaultLife(severity),\n actions: opts.actions,\n };\n\n // Collapse a burst of identical toasts into one. A dashboard fans\n // out to many independent queries, so one rejected filter used to\n // stack the same message once per widget -- seven copies of \"a\n // validation error occurred\", burying the screen. Only toasts that\n // are still on screen dedupe, so the same message shown again later\n // still appears.\n const duplicate = this.toasts().find(\n t =>\n t.severity === toast.severity &&\n t.title === toast.title &&\n t.text === toast.text,\n );\n if (duplicate) return duplicate;\n\n this.toasts.update(list => [...list, toast]);\n\n // Forward to PrimeNG MessageService so v1's <p-toast> still\n // catches the toast. Sticky in PrimeNG is `life: 0`.\n this.messageService?.add({\n severity: toast.severity,\n summary: toast.title,\n detail: toast.text,\n life: toast.life || undefined,\n sticky: toast.life === 0,\n });\n\n return toast;\n }\n\n private get messageService(): MessageService | null {\n if (!this._messageServiceResolved) {\n this._messageServiceResolved = true;\n this._messageService = this.injector.get(MessageService, null, { optional: true });\n }\n return this._messageService ?? null;\n }\n\n dismiss(id: number): void {\n this.toasts.update(list => list.filter(t => t.id !== id));\n }\n\n clear(): void {\n this.toasts.set([]);\n this.messageService?.clear();\n }\n\n /* (messageService getter is defined just below `show` to keep it\n close to where it's consumed.) */\n\n /* ── Internals ─────────────────────────────────────────────── */\n\n private resolve(\n literal: string | undefined,\n key: string | undefined,\n fallbackKey: string | undefined,\n ): string {\n if (literal != null) return literal;\n if (key) return this.t(key);\n if (fallbackKey) return this.t(fallbackKey);\n return '';\n }\n\n private t(key: string): string {\n // Lazy-resolve TranslateService — see the field comment above\n // for the AuthorizeService cycle this avoids.\n this._translate ??= this.injector.get(TranslateService);\n const value = this._translate.instant(key);\n // `instant()` returns the key when no translation is loaded;\n // fall through to empty string so untranslated toasts don't\n // surface internal keys to end users.\n return value === key ? '' : value;\n }\n\n private defaultLife(severity: EfToastSeverity): number {\n switch (severity) {\n case 'info': return EfToastService.LIFE_INFO;\n case 'success': return EfToastService.LIFE_SUCCESS;\n case 'warn': return EfToastService.LIFE_WARN;\n case 'error': return EfToastService.LIFE_ERROR;\n }\n }\n\n private defaultTitleKey(severity: EfToastSeverity): string {\n return `ef_toast_${severity}_title`;\n }\n}\n\n/**\n * @deprecated Use `EfToastService` — same instance, new name. The\n * alias keeps existing imports compiling during the v1 → V2\n * migration.\n */\nexport { EfToastService as ToastService };\n","import { inject, Injectable } from '@angular/core';\nimport { ConfirmationService } from 'primeng/api';\n\n@Injectable({ providedIn: 'root' })\nexport class ConfirmDialogService {\n private readonly confirmationService = inject(ConfirmationService);\n\n confirm(\n message: string,\n acceptCallback?: () => void,\n rejectCallback?: () => void,\n event?: Event\n ): void {\n this.confirmationService.confirm({\n target: event ? (event.target as EventTarget) : undefined,\n message,\n header: 'Confirmation',\n closable: true,\n closeOnEscape: true,\n icon: 'pi pi-exclamation-triangle',\n rejectButtonProps: {\n label: 'Annuler',\n severity: 'secondary',\n outlined: true,\n },\n acceptButtonProps: {\n label: 'Confirmer',\n },\n accept: () => acceptCallback?.(),\n reject: () => rejectCallback?.(),\n });\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { StorageUtils } from '@elasticias/utils';\nimport { Permissions } from '@elasticias/types';\n\n/**\n * Configuration for the screen guard factory.\n */\nexport interface ScreenGuardConfig {\n /** Storage key where screen grants are stored (default: 'CURRENT_USER_GRANTS') */\n grantsStorageKey?: string;\n /** Route to redirect to when access is denied (default: '/') */\n deniedRedirect?: string;\n /** Minimum required permission to access the screen (default: Permissions.Read) */\n requiredPermission?: Permissions;\n /** Storage type to read grants from (default: 'session') */\n storageType?: 'local' | 'session';\n}\n\n/**\n * Creates a reusable Angular route guard that checks screen-level permissions.\n *\n * Usage in route definitions:\n * ```typescript\n * {\n * path: 'countries',\n * data: { screenCode: 'Countries' },\n * canActivate: [screenGuard()],\n * children: [\n * { path: '', component: CountriesComponent },\n * { path: 'details/:id', component: CountriesDetailsComponent },\n * ]\n * }\n * ```\n *\n * The guard reads the `screenCode` from route data (traversing parent routes)\n * and checks if the current user has at least the required permission (default: Read).\n */\nexport function screenGuard(config?: ScreenGuardConfig): CanActivateFn {\n return (route: ActivatedRouteSnapshot) => {\n const router = inject(Router);\n const grantsKey = config?.grantsStorageKey ?? 'CURRENT_USER_GRANTS';\n const deniedRedirect = config?.deniedRedirect ?? '/';\n const requiredPermission = config?.requiredPermission ?? Permissions.Read;\n const storageType = config?.storageType ?? 'local';\n\n const screenCode = getScreenCode(route);\n\n // If no screenCode found on this route or any parent, allow access\n if (!screenCode) {\n return true;\n }\n\n const screenGrants = storageType === 'session'\n ? StorageUtils.getSession<Record<string, { permissions?: string[] }>>(grantsKey)\n : StorageUtils.getLocal<Record<string, { permissions?: string[] }>>(grantsKey);\n\n if (!screenGrants) {\n router.navigate([deniedRedirect]);\n return false;\n }\n\n const grant = screenGrants[screenCode];\n if (!grant?.permissions?.includes(requiredPermission)) {\n router.navigate([deniedRedirect]);\n return false;\n }\n\n return true;\n };\n}\n\n/**\n * Walks up the route tree to find the nearest screenCode in route data.\n */\nfunction getScreenCode(route: ActivatedRouteSnapshot): string | undefined {\n let current: ActivatedRouteSnapshot | null = route;\n while (current) {\n const code = current.data?.['screenCode'] as string | undefined;\n if (code) return code;\n current = current.parent;\n }\n return undefined;\n}\n\n/**\n * Utility function to check if the current user has a specific permission on a screen.\n * Can be used in components/services outside of route guards.\n */\nexport function hasScreenPermission(\n screenCode: string,\n permission: Permissions,\n grantsStorageKey = 'CURRENT_USER_GRANTS',\n storageType: 'local' | 'session' = 'local'\n): boolean {\n const screenGrants = storageType === 'session'\n ? StorageUtils.getSession<Record<string, { permissions?: string[] }>>(grantsStorageKey)\n : StorageUtils.getLocal<Record<string, { permissions?: string[] }>>(grantsStorageKey);\n if (!screenGrants) return false;\n\n const grant = screenGrants[screenCode];\n return grant?.permissions?.includes(permission) ?? false;\n}\n","export interface AppState {\n preset?: string;\n primary?: string;\n surface?: string;\n darkTheme?: boolean;\n menuActive?: boolean;\n mobileMenuVisible?: boolean;\n designerKey?: string;\n RTL?: boolean;\n}\n\nexport const DEFAULT_APP_STATE: AppState = {\n preset: 'Lara',\n primary: 'noir',\n surface: null as any,\n darkTheme: false,\n menuActive: true,\n mobileMenuVisible: false,\n designerKey: 'primeng-designer-theme',\n RTL: false\n};\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { computed, effect, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport { palette, updatePrimaryPalette } from '@primeng/themes';\nimport { StorageUtils } from '@elasticias/utils';\nimport { AppState, DEFAULT_APP_STATE } from './app-state';\n\n/**\n * Service that manages theme state: preset, primary color, surface, dark mode, RTL.\n * State is persisted to localStorage so user preferences survive page reloads.\n *\n * Apps can extend this service or use it directly.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class EfThemeConfigService {\n private readonly STORAGE_KEY = 'APP_CONFIG_STATE';\n\n appState = signal<AppState>(null as any);\n\n designerActive = signal(false);\n\n newsActive = signal(false);\n\n document = inject(DOCUMENT);\n\n platformId = inject(PLATFORM_ID);\n\n theme = computed(() => (this.appState()?.darkTheme ? 'dark' : 'light'));\n\n transitionComplete = signal<boolean>(false);\n\n constructor() {\n const initialState = this.loadAppState();\n this.appState.set({ ...initialState });\n\n // Apply preset class + RTL synchronously so the first paint has\n // the right theme — the effect below picks up subsequent changes\n // (including any subclass `appState.update()` issued before its\n // first run).\n this.updatePresetClass(initialState);\n if (isPlatformBrowser(this.platformId) && initialState?.RTL) {\n this.document.documentElement.setAttribute('dir', 'rtl');\n }\n\n effect(() => {\n const state = this.appState();\n if (!state) return;\n this.saveAppState(state);\n this.updatePresetClass(state);\n this.handleDarkModeTransition(state);\n this.applyRTL(state);\n });\n }\n\n private static readonly PRESET_CLASS_MAP: Record<string, string> = {\n Aura: 'theme-compact',\n Lara: 'theme-modern',\n Material: 'theme-material',\n Nora: 'theme-classic',\n Comptoir: 'theme-comptoir',\n };\n\n private static readonly TENANT_RAMP_STOPS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900] as const;\n\n private static readonly ALL_THEME_CLASSES = Object.values(EfThemeConfigService.PRESET_CLASS_MAP);\n\n private updatePresetClass(state: AppState): void {\n if (isPlatformBrowser(this.platformId)) {\n const body = this.document.body;\n body.classList.remove(...EfThemeConfigService.ALL_THEME_CLASSES);\n if (state.preset) {\n const cls = EfThemeConfigService.PRESET_CLASS_MAP[state.preset];\n if (cls) {\n body.classList.add(cls);\n }\n }\n }\n }\n\n private handleDarkModeTransition(state: AppState): void {\n if (isPlatformBrowser(this.platformId)) {\n if ((document as any).startViewTransition) {\n this.startViewTransition(state);\n } else {\n this.toggleDarkMode(state);\n this.onTransitionEnd();\n }\n }\n }\n\n private startViewTransition(state: AppState): void {\n const transition = (document as any).startViewTransition(() => {\n this.toggleDarkMode(state);\n });\n\n transition.ready\n .then(() => this.onTransitionEnd())\n .catch(() => { /* view transition aborted */ });\n }\n\n private toggleDarkMode(state: AppState): void {\n if (state.darkTheme) {\n this.document.documentElement.classList.add('p-dark');\n } else {\n this.document.documentElement.classList.remove('p-dark');\n }\n }\n\n private onTransitionEnd() {\n this.transitionComplete.set(true);\n setTimeout(() => {\n this.transitionComplete.set(false);\n });\n }\n\n private applyRTL(state: AppState): void {\n if (isPlatformBrowser(this.platformId)) {\n const setDir = () => {\n if (state.RTL) {\n this.document.documentElement.setAttribute('dir', 'rtl');\n } else {\n this.document.documentElement.removeAttribute('dir');\n }\n };\n\n if ((document as any).startViewTransition) {\n const t = (document as any).startViewTransition(() => setDir());\n t.ready.catch(() => { /* view transition aborted */ });\n } else {\n setDir();\n }\n }\n }\n\n hideMenu() {\n this.appState.update((state) => ({ ...state, menuActive: false }));\n }\n\n showMenu() {\n this.appState.update((state) => ({ ...state, menuActive: true }));\n }\n\n toggleMobileMenu() {\n this.appState.update((state) => ({\n ...state,\n mobileMenuVisible: !state.mobileMenuVisible\n }));\n }\n\n closeMobileMenu() {\n this.appState.update((state) => ({\n ...state,\n mobileMenuVisible: false\n }));\n }\n\n openMobileMenu() {\n this.appState.update((state) => ({\n ...state,\n mobileMenuVisible: true\n }));\n }\n\n hideNews() {\n this.newsActive.set(false);\n }\n\n showNews() {\n this.newsActive.set(true);\n }\n\n showDesigner() {\n this.designerActive.set(true);\n }\n\n hideDesigner() {\n this.designerActive.set(false);\n }\n\n private loadAppState(): AppState {\n if (isPlatformBrowser(this.platformId)) {\n const storedState = StorageUtils.getLocal<AppState>(this.STORAGE_KEY);\n if (storedState) {\n return storedState;\n }\n }\n return { ...DEFAULT_APP_STATE };\n }\n\n private saveAppState(state: AppState): void {\n if (isPlatformBrowser(this.platformId)) {\n StorageUtils.setLocal(this.STORAGE_KEY, state);\n }\n }\n\n /**\n * Applies a tenant's brand color across both PrimeNG's primary palette\n * and the Comptoir `--tenant-*` CSS variables.\n *\n * Generates a 50–950 ramp from the input hex via PrimeNG's `palette()`\n * helper, hands the full ramp to `updatePrimaryPalette()`, and writes\n * stops 50–900 onto `documentElement.style` so the SCSS layer's\n * `var(--tenant-*)` references resolve to the tenant's color.\n *\n * Call this whenever the active tenant changes (e.g., from an effect\n * watching `tenantService.storeConfig().primaryColor`).\n */\n setTenantAccent(hex: string): void {\n if (!hex) return;\n\n const ramp = palette(hex) as Record<string, string>;\n if (!ramp) return;\n\n updatePrimaryPalette(ramp);\n\n if (isPlatformBrowser(this.platformId)) {\n const root = this.document.documentElement;\n for (const stop of EfThemeConfigService.TENANT_RAMP_STOPS) {\n const value = ramp[String(stop)];\n if (value) {\n root.style.setProperty(`--tenant-${stop}`, value);\n }\n }\n }\n }\n}\n","import { definePreset } from '@primeng/themes';\nimport Aura from '@primeng/themes/aura';\nimport Lara from '@primeng/themes/lara';\n\n/* ──────────────────────────────────────────────────────────────────\n * LEGACY: Noir preset (Aura base, monochrome surface palette).\n * Kept for backward-compat with apps that haven't migrated to\n * Comptoir. Phase 5 of the design-system plan retrofits consumers\n * to EfComptoirTheme; once that lands, Noir + EfTheme can be\n * deleted.\n * ────────────────────────────────────────────────────────────── */\n\nconst Noir = definePreset(Aura, {\n semantic: {\n primary: {\n 50: '{surface.50}',\n 100: '{surface.100}',\n 200: '{surface.200}',\n 300: '{surface.300}',\n 400: '{surface.400}',\n 500: '{surface.500}',\n 600: '{surface.600}',\n 700: '{surface.700}',\n 800: '{surface.800}',\n 900: '{surface.900}',\n 950: '{surface.950}'\n },\n colorScheme: {\n light: {\n primary: {\n color: '{primary.950}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.800}',\n activeColor: '{primary.700}'\n },\n highlight: {\n background: '{primary.950}',\n focusBackground: '{primary.700}',\n color: '#ffffff',\n focusColor: '#ffffff'\n }\n },\n dark: {\n primary: {\n color: '{primary.50}',\n contrastColor: '{primary.950}',\n hoverColor: '{primary.200}',\n activeColor: '{primary.300}'\n },\n highlight: {\n background: '{primary.50}',\n focusBackground: '{primary.300}',\n color: '{primary.950}',\n focusColor: '{primary.950}'\n }\n }\n }\n }\n});\n\n/**\n * Default Elasticias theme configuration for PrimeNG.\n * Uses the Noir preset (surface-based primary colors) with dark mode support.\n *\n * @deprecated Migrate to {@link EfComptoirTheme} as part of Phase 5 of the\n * design-system plan. Will be removed once all consumers have moved.\n */\nexport const EfTheme = {\n preset: Noir,\n options: {\n darkModeSelector: '.p-dark',\n }\n};\n\nexport default EfTheme;\n\n/* ──────────────────────────────────────────────────────────────────\n * COMPTOIR: ink surface + tenant primary (Lara base).\n * Surface palette is the ink ramp from libs/tokens/colors.json.\n * Primary palette defaults to the parfumerie sample tenant; it is\n * runtime-replaced by EfThemeConfigService.setTenantAccent(hex)\n * via PrimeNG's updatePrimaryPalette() API.\n * ────────────────────────────────────────────────────────────── */\n\nconst ComptoirPreset = definePreset(Lara, {\n semantic: {\n primary: {\n 50: '#f7f0f4',\n 100: '#ecdce5',\n 200: '#d8b4c5',\n 300: '#b87a99',\n 400: '#934e74',\n 500: '#6f3257',\n 600: '#54243f',\n 700: '#401a30',\n 800: '#2c1221',\n 900: '#1a0913',\n 950: '#0d040a'\n },\n /* ──────────────────────────────────────────────────────────────\n * Control sizing (ADR-009). The native \"comptoir\" variant is the\n * default render path and is pinned to --hit-base (40px) in CSS;\n * these tokens align the OPT-IN PrimeNG variant (p-select filter,\n * p-multiselect, p-inputnumber stepper, etc.) to the same canonical\n * heights so the two paths agree:\n * base → 40px (--hit-base) sm → 32px (--hit) lg → 48px (--hit-touch, POS/mobile)\n * Lara form-field height ≈ paddingY*2 + lineHeight(1.5)*fontSize(14px) + 2px border.\n * base: 8px*2 + 21 + 2 ≈ 40px · sm: 5px*2 + ~18 + 2 ≈ 32px · lg: 12px*2 + 21 + 2 ≈ 48px\n * NOTE: exact pixel height depends on the app's root font-size; the\n * native default path is the verified one — confirm the PrimeNG\n * opt-in controls visually in the running app and nudge paddingY if\n * they read 1-2px off. Border radius matches --r-md (12px). */\n formField: {\n paddingX: '0.75rem',\n paddingY: '0.5rem',\n borderRadius: '12px',\n sm: {\n fontSize: '0.78rem',\n paddingX: '0.625rem',\n paddingY: '0.3125rem'\n },\n lg: {\n fontSize: '0.9375rem',\n paddingX: '0.875rem',\n paddingY: '0.75rem'\n }\n },\n colorScheme: {\n light: {\n primary: {\n color: '{primary.500}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.600}',\n activeColor: '{primary.700}'\n },\n surface: {\n 0: '#ffffff',\n 50: '#f8f9fb',\n 100: '#f1f3f6',\n 200: '#e4e8ee',\n 300: '#cdd3dd',\n 400: '#9ca5b3',\n 500: '#6c7280',\n 600: '#4a4f5a',\n 700: '#2f3239',\n 800: '#1d1f24',\n 900: '#0f1115',\n 950: '#06070a'\n },\n highlight: {\n background: '{primary.500}',\n focusBackground: '{primary.600}',\n color: '#ffffff',\n focusColor: '#ffffff'\n }\n },\n dark: {\n primary: {\n color: '{primary.400}',\n contrastColor: '{primary.950}',\n hoverColor: '{primary.300}',\n activeColor: '{primary.200}'\n },\n surface: {\n 0: '#000000',\n 50: '#06070a',\n 100: '#0f1115',\n 200: '#1d1f24',\n 300: '#2f3239',\n 400: '#4a4f5a',\n 500: '#6c7280',\n 600: '#9ca5b3',\n 700: '#cdd3dd',\n 800: '#e4e8ee',\n 900: '#f1f3f6',\n 950: '#f8f9fb'\n },\n highlight: {\n background: '{primary.400}',\n focusBackground: '{primary.300}',\n color: '{primary.950}',\n focusColor: '{primary.950}'\n }\n }\n }\n }\n});\n\n/**\n * Comptoir theme configuration for PrimeNG (Phase 1 / design-system v0.2).\n * Surface palette = ink ramp; primary palette = tenant accent\n * (runtime-driven via `EfThemeConfigService.setTenantAccent(hex)`).\n *\n * Usage with providePrimeNG:\n * ```ts\n * providePrimeNG({ theme: EfComptoirTheme, ripple: true })\n * ```\n *\n * Pair with `state.preset = 'Comptoir'` so the body class becomes\n * `theme-comptoir` (avoids legacy `theme-modern` radius overrides).\n */\nexport const EfComptoirTheme = {\n preset: ComptoirPreset,\n options: {\n darkModeSelector: '.p-dark',\n }\n};\n","import { Translation } from 'primeng/api';\n\n/**\n * English locale for PrimeNG components.\n *\n * Usage:\n * ```ts\n * import { PRIMENG_EN_LOCALE } from '@elasticias/core';\n * this.primeng.translation = PRIMENG_EN_LOCALE;\n * ```\n */\nexport const PRIMENG_EN_LOCALE: Translation = {\n startsWith: 'Starts with',\n contains: 'Contains',\n notContains: 'Not contains',\n endsWith: 'Ends with',\n equals: 'Equals',\n notEquals: 'Not equals',\n noFilter: 'No Filter',\n lt: 'Less than',\n lte: 'Less than or equal to',\n gt: 'Greater than',\n gte: 'Greater than or equal to',\n dateIs: 'Date is',\n dateIsNot: 'Date is not',\n dateBefore: 'Date is before',\n dateAfter: 'Date is after',\n clear: 'Clear',\n apply: 'Apply',\n matchAll: 'Match All',\n matchAny: 'Match Any',\n addRule: 'Add Rule',\n removeRule: 'Remove Rule',\n accept: 'Yes',\n reject: 'No',\n choose: 'Choose',\n upload: 'Upload',\n cancel: 'Cancel',\n completed: 'Completed',\n pending: 'Pending',\n fileSizeTypes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n chooseYear: 'Choose Year',\n chooseMonth: 'Choose Month',\n chooseDate: 'Choose Date',\n prevDecade: 'Previous Decade',\n nextDecade: 'Next Decade',\n prevYear: 'Previous Year',\n nextYear: 'Next Year',\n prevMonth: 'Previous Month',\n nextMonth: 'Next Month',\n prevHour: 'Previous Hour',\n nextHour: 'Next Hour',\n prevMinute: 'Previous Minute',\n nextMinute: 'Next Minute',\n prevSecond: 'Previous Second',\n nextSecond: 'Next Second',\n am: 'AM',\n pm: 'PM',\n today: 'Today',\n weekHeader: 'Wk',\n firstDayOfWeek: 0,\n showMonthAfterYear: false,\n dateFormat: 'mm/dd/yy',\n weak: 'Weak',\n medium: 'Medium',\n strong: 'Strong',\n passwordPrompt: 'Enter a password',\n emptyFilterMessage: 'No results found',\n searchMessage: '{0} results are available',\n selectionMessage: '{0} items selected',\n emptySelectionMessage: 'No selected item',\n emptySearchMessage: 'No results found',\n emptyMessage: 'No available options',\n aria: {\n trueLabel: 'True',\n falseLabel: 'False',\n nullLabel: 'Not Selected',\n star: '1 star',\n stars: '{star} stars',\n selectAll: 'All items selected',\n unselectAll: 'All items unselected',\n close: 'Close',\n previous: 'Previous',\n next: 'Next',\n navigation: 'Navigation',\n scrollTop: 'Scroll Top',\n moveTop: 'Move Top',\n moveUp: 'Move Up',\n moveDown: 'Move Down',\n moveBottom: 'Move Bottom',\n moveToTarget: 'Move to Target',\n moveToSource: 'Move to Source',\n moveAllToTarget: 'Move All to Target',\n moveAllToSource: 'Move All to Source',\n pageLabel: 'Page {page}',\n firstPageLabel: 'First Page',\n lastPageLabel: 'Last Page',\n nextPageLabel: 'Next Page',\n prevPageLabel: 'Previous Page',\n rowsPerPageLabel: 'Rows per page',\n jumpToPageDropdownLabel: 'Jump to Page Dropdown',\n jumpToPageInputLabel: 'Jump to Page Input',\n selectRow: 'Row Selected',\n unselectRow: 'Row Unselected',\n expandRow: 'Row Expanded',\n collapseRow: 'Row Collapsed',\n showFilterMenu: 'Show Filter Menu',\n hideFilterMenu: 'Hide Filter Menu',\n filterOperator: 'Filter Operator',\n filterConstraint: 'Filter Constraint',\n editRow: 'Row Edit',\n saveEdit: 'Save Edit',\n cancelEdit: 'Cancel Edit',\n listView: 'List View',\n gridView: 'Grid View',\n slide: 'Slide',\n slideNumber: '{slideNumber}',\n zoomImage: 'Zoom Image',\n zoomIn: 'Zoom In',\n zoomOut: 'Zoom Out',\n rotateRight: 'Rotate Right',\n rotateLeft: 'Rotate Left',\n listLabel: 'Option List',\n },\n} as Translation;\n","import { Translation } from 'primeng/api';\n\n/**\n * French locale for PrimeNG components.\n *\n * Usage:\n * ```ts\n * import { PRIMENG_FR_LOCALE } from '@elasticias/core';\n * this.primeng.translation = PRIMENG_FR_LOCALE;\n * ```\n */\nexport const PRIMENG_FR_LOCALE: Translation = {\n startsWith: 'Commence par',\n contains: 'Contient',\n notContains: 'Ne contient pas',\n endsWith: 'Se termine par',\n equals: 'Égal à',\n notEquals: 'Différent de',\n noFilter: 'Aucun filtre',\n lt: 'Inférieur à',\n lte: 'Inférieur ou égal à',\n gt: 'Supérieur à',\n gte: 'Supérieur ou égal à',\n dateIs: 'La date est',\n dateIsNot: \"La date n'est pas\",\n dateBefore: 'La date est avant',\n dateAfter: 'La date est après',\n clear: 'Effacer',\n apply: 'Appliquer',\n matchAll: 'Correspond à tous',\n matchAny: \"Correspond à n'importe quel\",\n addRule: 'Ajouter une règle',\n removeRule: 'Supprimer la règle',\n accept: 'Oui',\n reject: 'Non',\n choose: 'Choisir',\n upload: 'Télécharger',\n cancel: 'Annuler',\n completed: 'Terminé',\n pending: 'En attente',\n fileSizeTypes: ['o', 'Ko', 'Mo', 'Go', 'To', 'Po', 'Eo', 'Zo', 'Yo'],\n dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],\n dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],\n dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],\n monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],\n monthNamesShort: ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jun', 'Jul', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc'],\n chooseYear: \"Choisir l'année\",\n chooseMonth: 'Choisir le mois',\n chooseDate: 'Choisir la date',\n prevDecade: 'Décennie précédente',\n nextDecade: 'Décennie suivante',\n prevYear: 'Année précédente',\n nextYear: 'Année suivante',\n prevMonth: 'Mois précédent',\n nextMonth: 'Mois suivant',\n prevHour: 'Heure précédente',\n nextHour: 'Heure suivante',\n prevMinute: 'Minute précédente',\n nextMinute: 'Minute suivante',\n prevSecond: 'Seconde précédente',\n nextSecond: 'Seconde suivante',\n am: 'AM',\n pm: 'PM',\n today: \"Aujourd'hui\",\n weekHeader: 'Sem',\n firstDayOfWeek: 1,\n showMonthAfterYear: false,\n dateFormat: 'dd/mm/yy',\n weak: 'Faible',\n medium: 'Moyen',\n strong: 'Fort',\n passwordPrompt: 'Entrez un mot de passe',\n emptyFilterMessage: 'Aucun résultat trouvé',\n searchMessage: '{0} résultats sont disponibles',\n selectionMessage: '{0} éléments sélectionnés',\n emptySelectionMessage: 'Aucun élément sélectionné',\n emptySearchMessage: 'Aucun résultat trouvé',\n emptyMessage: 'Aucune option disponible',\n aria: {\n trueLabel: 'Vrai',\n falseLabel: 'Faux',\n nullLabel: 'Non sélectionné',\n star: '1 étoile',\n stars: '{star} étoiles',\n selectAll: 'Tous les éléments sélectionnés',\n unselectAll: 'Tous les éléments désélectionnés',\n close: 'Fermer',\n previous: 'Précédent',\n next: 'Suivant',\n navigation: 'Navigation',\n scrollTop: 'Défiler vers le haut',\n moveTop: 'Déplacer vers le haut',\n moveUp: 'Déplacer vers le haut',\n moveDown: 'Déplacer vers le bas',\n moveBottom: 'Déplacer vers le bas',\n moveToTarget: 'Déplacer vers la cible',\n moveToSource: 'Déplacer vers la source',\n moveAllToTarget: 'Tout déplacer vers la cible',\n moveAllToSource: 'Tout déplacer vers la source',\n pageLabel: 'Page {page}',\n firstPageLabel: 'Première page',\n lastPageLabel: 'Dernière page',\n nextPageLabel: 'Page suivante',\n prevPageLabel: 'Page précédente',\n rowsPerPageLabel: 'Lignes par page',\n jumpToPageDropdownLabel: 'Aller à la page',\n jumpToPageInputLabel: 'Aller à la page',\n selectRow: 'Ligne sélectionnée',\n unselectRow: 'Ligne désélectionnée',\n expandRow: 'Ligne développée',\n collapseRow: 'Ligne réduite',\n showFilterMenu: 'Afficher le menu de filtrage',\n hideFilterMenu: 'Masquer le menu de filtrage',\n filterOperator: 'Opérateur de filtrage',\n filterConstraint: 'Contrainte de filtrage',\n editRow: 'Modifier la ligne',\n saveEdit: 'Enregistrer la modification',\n cancelEdit: 'Annuler la modification',\n listView: 'Vue en liste',\n gridView: 'Vue en grille',\n slide: 'Glisser',\n slideNumber: '{slideNumber}',\n zoomImage: \"Agrandir l'image\",\n zoomIn: 'Zoomer',\n zoomOut: 'Dézoomer',\n rotateRight: 'Faire pivoter à droite',\n rotateLeft: 'Faire pivoter à gauche',\n listLabel: 'Liste',\n },\n} as Translation;\n","import { Translation } from 'primeng/api';\n\n/**\n * Arabic locale for PrimeNG components (Moroccan month names).\n *\n * Usage:\n * ```ts\n * import { PRIMENG_AR_LOCALE } from '@elasticias/core';\n * this.primeng.translation = PRIMENG_AR_LOCALE;\n * ```\n */\nexport const PRIMENG_AR_LOCALE: Translation = {\n startsWith: 'يبدأ بـ',\n contains: 'يحتوي على',\n notContains: 'لا يحتوي على',\n endsWith: 'ينتهي بـ',\n equals: 'يساوي',\n notEquals: 'لا يساوي',\n noFilter: 'بدون فلتر',\n lt: 'أقل من',\n lte: 'أقل من أو يساوي',\n gt: 'أكبر من',\n gte: 'أكبر من أو يساوي',\n dateIs: 'التاريخ هو',\n dateIsNot: 'التاريخ ليس',\n dateBefore: 'التاريخ قبل',\n dateAfter: 'التاريخ بعد',\n clear: 'مسح',\n apply: 'تطبيق',\n matchAll: 'تطابق الكل',\n matchAny: 'تطابق أي',\n addRule: 'إضافة قاعدة',\n removeRule: 'حذف القاعدة',\n accept: 'نعم',\n reject: 'لا',\n choose: 'اختيار',\n upload: 'رفع',\n cancel: 'إلغاء',\n completed: 'مكتمل',\n pending: 'قيد الانتظار',\n fileSizeTypes: ['بايت', 'ك.ب', 'م.ب', 'ج.ب', 'ت.ب', 'ب.ب', 'إ.ب', 'ز.ب', 'ي.ب'],\n dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n dayNamesShort: ['أحد', 'اثن', 'ثلا', 'أرب', 'خمي', 'جمع', 'سبت'],\n dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n monthNames: ['يناير', 'فبراير', 'مارس', 'أبريل', 'ماي', 'يونيو', 'يوليوز', 'غشت', 'شتنبر', 'أكتوبر', 'نونبر', 'دجنبر'],\n monthNamesShort: ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'غشت', 'شتن', 'أكت', 'نون', 'دجن'],\n chooseYear: 'اختر السنة',\n chooseMonth: 'اختر الشهر',\n chooseDate: 'اختر التاريخ',\n prevDecade: 'العقد السابق',\n nextDecade: 'العقد التالي',\n prevYear: 'السنة السابقة',\n nextYear: 'السنة التالية',\n prevMonth: 'الشهر السابق',\n nextMonth: 'الشهر التالي',\n prevHour: 'الساعة السابقة',\n nextHour: 'الساعة التالية',\n prevMinute: 'الدقيقة السابقة',\n nextMinute: 'الدقيقة التالية',\n prevSecond: 'الثانية السابقة',\n nextSecond: 'الثانية التالية',\n am: 'ص',\n pm: 'م',\n today: 'اليوم',\n weekHeader: 'أس',\n firstDayOfWeek: 1,\n showMonthAfterYear: false,\n dateFormat: 'dd/mm/yy',\n weak: 'ضعيف',\n medium: 'متوسط',\n strong: 'قوي',\n passwordPrompt: 'أدخل كلمة المرور',\n emptyFilterMessage: 'لم يتم العثور على نتائج',\n searchMessage: '{0} نتائج متاحة',\n selectionMessage: '{0} عناصر محددة',\n emptySelectionMessage: 'لا يوجد عنصر محدد',\n emptySearchMessage: 'لم يتم العثور على نتائج',\n emptyMessage: 'لا توجد خيارات متاحة',\n aria: {\n trueLabel: 'صحيح',\n falseLabel: 'خاطئ',\n nullLabel: 'غير محدد',\n star: 'نجمة واحدة',\n stars: '{star} نجوم',\n selectAll: 'تم تحديد جميع العناصر',\n unselectAll: 'تم إلغاء تحديد جميع العناصر',\n close: 'إغلاق',\n previous: 'السابق',\n next: 'التالي',\n navigation: 'التنقل',\n scrollTop: 'التمرير للأعلى',\n moveTop: 'نقل للأعلى',\n moveUp: 'نقل للأعلى',\n moveDown: 'نقل للأسفل',\n moveBottom: 'نقل للأسفل',\n moveToTarget: 'نقل إلى الهدف',\n moveToSource: 'نقل إلى المصدر',\n moveAllToTarget: 'نقل الكل إلى الهدف',\n moveAllToSource: 'نقل الكل إلى المصدر',\n pageLabel: 'صفحة {page}',\n firstPageLabel: 'الصفحة الأولى',\n lastPageLabel: 'الصفحة الأخيرة',\n nextPageLabel: 'الصفحة التالية',\n prevPageLabel: 'الصفحة السابقة',\n rowsPerPageLabel: 'سطور في الصفحة',\n jumpToPageDropdownLabel: 'الانتقال إلى الصفحة',\n jumpToPageInputLabel: 'الانتقال إلى الصفحة',\n selectRow: 'تم تحديد السطر',\n unselectRow: 'تم إلغاء تحديد السطر',\n expandRow: 'تم توسيع السطر',\n collapseRow: 'تم طي السطر',\n showFilterMenu: 'إظهار قائمة الفلتر',\n hideFilterMenu: 'إخفاء قائمة الفلتر',\n filterOperator: 'عامل الفلتر',\n filterConstraint: 'قيد الفلتر',\n editRow: 'تعديل السطر',\n saveEdit: 'حفظ التعديل',\n cancelEdit: 'إلغاء التعديل',\n listView: 'عرض قائمة',\n gridView: 'عرض شبكة',\n slide: 'تمرير',\n slideNumber: '{slideNumber}',\n zoomImage: 'تكبير الصورة',\n zoomIn: 'تكبير',\n zoomOut: 'تصغير',\n rotateRight: 'تدوير لليمين',\n rotateLeft: 'تدوير لليسار',\n listLabel: 'قائمة',\n },\n} as Translation;\n","import { InjectionToken } from '@angular/core';\n\n/**\n * The eight ERP modules surfaced by Comptoir. New modules require\n * a matching `--m-{id}` token in the SCSS layer (libs/ui/src/lib/_comptoir.scss)\n * and a labelKey in the consuming app's i18n bundles.\n */\nexport type EfModuleId =\n | 'sales'\n | 'purchase'\n | 'stock'\n | 'pos'\n | 'marketing'\n | 'store'\n | 'finance'\n | 'admin';\n\nexport type EfNavAction = 'read' | 'write' | 'admin';\n\nexport interface EfNavItem {\n /** Stable identifier — usually matches the screen code (e.g. `Users`, `SalesOrders`). */\n id: string;\n labelKey: string;\n icon?: string;\n route: string;\n /** Minimum permission level required to render this item. Defaults to `read`. */\n requiredAction?: EfNavAction;\n /**\n * Optional count chip rendered after the label (e.g. `Commandes ⟨14⟩`).\n * Apps typically derive this from a service signal and patch the\n * registry — it can be number, string, or anything stringifiable.\n */\n badge?: string | number;\n}\n\nexport interface EfNavSection {\n id: string;\n labelKey?: string;\n items: EfNavItem[];\n}\n\nexport interface EfModule {\n id: EfModuleId;\n labelKey: string;\n /** PrimeNG icon class used by `ef-module-rail`, e.g. `pi pi-shopping-bag`. */\n icon: string;\n /**\n * CSS custom-property name (without the leading `--`) that the rail\n * applies to the module-current accent. Always `m-{id}` and resolves\n * via the SCSS layer's `[data-module]` selectors at runtime.\n */\n accent: `m-${EfModuleId}`;\n defaultRoute: string;\n navSections: EfNavSection[];\n /**\n * Logical grouping for rail divider placement. `ef-module-rail` renders\n * a 1px divider between two consecutive visible modules whose `group`\n * differs. Free string — `'operations' | 'commerce' | 'admin'` is the\n * conventional set but apps can use anything stable.\n */\n group?: string;\n}\n\n/**\n * Default skeleton for the eight ERP modules. Apps either consume this\n * directly via `EF_MODULES_TOKEN` or extend it with their own `navSections`.\n *\n * Phase 1 ships the metadata only — `ef-module-rail` (Phase 2) uses\n * `id` / `labelKey` / `icon` / `accent` / `defaultRoute`. `navSections`\n * are populated per-app as each module's screens land in Phase 4-5.\n */\nexport const EF_MODULES: ReadonlyArray<EfModule> = [\n {\n id: 'sales',\n labelKey: 'modules.sales',\n icon: 'pi pi-shopping-bag',\n accent: 'm-sales',\n defaultRoute: '/operations/sales',\n navSections: [],\n group: 'operations',\n },\n {\n id: 'purchase',\n labelKey: 'modules.purchase',\n icon: 'pi pi-truck',\n accent: 'm-purchase',\n defaultRoute: '/operations/purchase',\n navSections: [],\n group: 'operations',\n },\n {\n id: 'stock',\n labelKey: 'modules.stock',\n icon: 'pi pi-warehouse',\n accent: 'm-stock',\n defaultRoute: '/operations/stock',\n navSections: [],\n group: 'operations',\n },\n {\n id: 'pos',\n labelKey: 'modules.pos',\n icon: 'pi pi-shop',\n accent: 'm-pos',\n defaultRoute: '/pos',\n navSections: [],\n group: 'operations',\n },\n {\n id: 'marketing',\n labelKey: 'modules.marketing',\n icon: 'pi pi-megaphone',\n accent: 'm-marketing',\n defaultRoute: '/marketing',\n navSections: [],\n group: 'commerce',\n },\n {\n id: 'store',\n labelKey: 'modules.store',\n icon: 'pi pi-globe',\n accent: 'm-store',\n defaultRoute: '/store',\n navSections: [],\n group: 'commerce',\n },\n {\n id: 'finance',\n labelKey: 'modules.finance',\n icon: 'pi pi-chart-line',\n accent: 'm-finance',\n defaultRoute: '/finance',\n navSections: [],\n group: 'commerce',\n },\n {\n id: 'admin',\n labelKey: 'modules.admin',\n icon: 'pi pi-shield',\n accent: 'm-admin',\n defaultRoute: '/admin',\n navSections: [],\n group: 'admin',\n },\n];\n\n/**\n * DI token that the shell components (`ef-module-rail`, `ef-module-side`)\n * read from. Apps provide their own definition (typically extending\n * `EF_MODULES` with populated `navSections`):\n *\n * ```ts\n * providers: [\n * { provide: EF_MODULES_TOKEN, useValue: APP_MODULES }\n * ]\n * ```\n */\nexport const EF_MODULES_TOKEN = new InjectionToken<ReadonlyArray<EfModule>>(\n 'EF_MODULES',\n { providedIn: 'root', factory: () => EF_MODULES }\n);\n","import { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\nimport { EF_MODULES_TOKEN, EfModule, EfModuleId, EfNavItem } from './ef-module-registry';\n\n/**\n * Single source of truth for \"which ERP module is active right now.\"\n *\n * Watches the Router and matches the current URL against each module's\n * `defaultRoute`. The longest matching prefix wins, so `/operations/sales`\n * resolves to `sales` even though `/operations` could in theory match\n * something shorter.\n *\n * Consumers — `ef-module-rail`, `ef-module-side`, `ef-app-main`,\n * `ef-page-head` — read `activeModule()` and derive their state from it.\n *\n * Apps that navigate programmatically without a URL change (rare) can\n * call `setActiveModule(id)` to override.\n */\n@Injectable({ providedIn: 'root' })\nexport class EfActiveModuleService {\n private readonly router = inject(Router);\n private readonly modules = inject(EF_MODULES_TOKEN);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly _activeModule = signal<EfModule | null>(null);\n private readonly _activeNavItem = signal<EfNavItem | null>(null);\n\n readonly activeModule = this._activeModule.asReadonly();\n readonly activeModuleId = computed(() => this._activeModule()?.id ?? null);\n readonly activeNavItem = this._activeNavItem.asReadonly();\n\n constructor() {\n this.resolveFromUrl(this.router.url);\n\n this.router.events\n .pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(e => this.resolveFromUrl(e.urlAfterRedirects));\n }\n\n /**\n * Force the active module. Most apps don't need this — the router\n * subscription keeps `activeModule()` in sync automatically.\n */\n setActiveModule(id: EfModuleId | null): void {\n if (id === null) {\n this._activeModule.set(null);\n return;\n }\n const match = this.modules.find(m => m.id === id);\n if (match) this._activeModule.set(match);\n }\n\n private resolveFromUrl(url: string): void {\n const path = url.split('?')[0].split('#')[0];\n\n let bestModule: EfModule | null = null;\n let bestNavItem: EfNavItem | null = null;\n let bestLen = 0;\n for (const m of this.modules) {\n for (const route of this.routesFor(m)) {\n if (path === route || path.startsWith(route + '/')) {\n if (route.length > bestLen) {\n bestModule = m;\n bestNavItem = this.findNavItem(m, route);\n bestLen = route.length;\n }\n }\n }\n }\n this._activeModule.set(bestModule);\n this._activeNavItem.set(bestNavItem);\n }\n\n private findNavItem(m: EfModule, route: string): EfNavItem | null {\n for (const section of m.navSections) {\n for (const item of section.items) {\n if (item.route === route) return item;\n }\n }\n return null;\n }\n\n /**\n * Every URL prefix that should resolve back to this module: the\n * `defaultRoute` plus every nav item route. Modules whose nav items\n * span multiple URL prefixes (e.g. sales spread across `/operations/sales`\n * and `/parameters/sales`) need this to stay active across all of them.\n */\n private routesFor(m: EfModule): string[] {\n const routes: string[] = [m.defaultRoute];\n for (const section of m.navSections) {\n for (const item of section.items) {\n routes.push(item.route);\n }\n }\n return routes;\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { computed, DestroyRef, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\n\nexport type EfViewport = 'mobile' | 'tablet' | 'desktop';\n\ninterface ViewportQuery {\n viewport: EfViewport;\n query: string;\n}\n\nconst QUERIES: ViewportQuery[] = [\n { viewport: 'mobile', query: '(max-width: 767px)' },\n { viewport: 'tablet', query: '(min-width: 768px) and (max-width: 1279px)' },\n { viewport: 'desktop', query: '(min-width: 1280px)' },\n];\n\n/**\n * Emits the current viewport tier based on `window.matchMedia` breakpoints.\n *\n * Breakpoints come from `libs/tokens/targets.json`:\n * - mobile: ≤ 767px\n * - tablet: 768 – 1279px\n * - desktop: ≥ 1280px\n *\n * SSR-safe: returns `'desktop'` when `window` is unavailable.\n *\n * Usage:\n * ```ts\n * private viewport = inject(EfViewportService);\n *\n * isMobile = computed(() => this.viewport.current() === 'mobile');\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class EfViewportService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly _current = signal<EfViewport>('desktop');\n\n readonly current = this._current.asReadonly();\n readonly isMobile = computed(() => this._current() === 'mobile');\n readonly isTablet = computed(() => this._current() === 'tablet');\n readonly isDesktop = computed(() => this._current() === 'desktop');\n\n constructor() {\n if (!isPlatformBrowser(this.platformId)) return;\n\n const win = this.document.defaultView;\n if (!win || typeof win.matchMedia !== 'function') return;\n\n const lists = QUERIES.map(({ viewport, query }) => {\n const mql = win.matchMedia(query);\n const handler = (e: MediaQueryListEvent | MediaQueryList) => {\n if (e.matches) this._current.set(viewport);\n };\n handler(mql);\n mql.addEventListener('change', handler as (e: MediaQueryListEvent) => void);\n return { mql, handler };\n });\n\n this.destroyRef.onDestroy(() => {\n for (const { mql, handler } of lists) {\n mql.removeEventListener('change', handler as (e: MediaQueryListEvent) => void);\n }\n });\n }\n}\n","import { computed, inject, Injectable, Signal, signal } from '@angular/core';\nimport { EF_MODULES_TOKEN, EfModule, EfModuleId } from '../modules/ef-module-registry';\n\nexport type EfPermissionLevel = 'none' | 'read' | 'write' | 'admin';\n\nexport interface EfModulePermission {\n module: EfModuleId;\n level: EfPermissionLevel;\n}\n\nconst LEVEL_ORDER: Record<EfPermissionLevel, number> = {\n none: 0,\n read: 1,\n write: 2,\n admin: 3,\n};\n\nconst ACTION_REQUIRED: Record<Exclude<EfPermissionLevel, 'none'>, EfPermissionLevel> = {\n read: 'read',\n write: 'write',\n admin: 'admin',\n};\n\n/**\n * Module-scoped permission service.\n *\n * Apps populate it from their auth bootstrap once the user's profile is\n * loaded — typically via `setPermissions()` or by providing a custom\n * source signal:\n *\n * ```ts\n * // bootstrap.ts\n * const perms = inject(EfPermissionService);\n * perms.setPermissions(profile.permissions);\n * ```\n *\n * The service is the single source of truth for shell components\n * (`ef-module-rail`, `ef-module-side`, `*efCan` directive) and routing\n * defaults. Once the screens/menus → Mongo migration lands, the\n * permissions list will be served denormalized on the user/profile\n * document and consumed here without a join.\n */\n@Injectable({ providedIn: 'root' })\nexport class EfPermissionService {\n private readonly modules = inject(EF_MODULES_TOKEN);\n\n private readonly _permissions = signal<ReadonlyArray<EfModulePermission>>([]);\n\n readonly permissions = this._permissions.asReadonly();\n\n /**\n * Replace the current permission set. Pass `[]` to clear (e.g., on logout).\n */\n setPermissions(perms: ReadonlyArray<EfModulePermission>): void {\n this._permissions.set(perms);\n }\n\n /**\n * The level granted to the current user for a given module.\n * Returns `'none'` if the module is not in the permission set.\n */\n level(module: EfModuleId): EfPermissionLevel {\n return this._permissions().find(p => p.module === module)?.level ?? 'none';\n }\n\n /**\n * Whether the current user can perform `action` on `module`.\n * Levels are hierarchical: `admin` > `write` > `read` > `none`.\n */\n can(module: EfModuleId, action: Exclude<EfPermissionLevel, 'none'> = 'read'): boolean {\n return LEVEL_ORDER[this.level(module)] >= LEVEL_ORDER[ACTION_REQUIRED[action]];\n }\n\n /**\n * The list of modules the user can read, in registry order.\n * Used by `ef-module-rail` to decide which icons render.\n */\n readonly visibleModules: Signal<ReadonlyArray<EfModule>> = computed(() => {\n const perms = this._permissions();\n const granted = new Set(\n perms.filter(p => p.level !== 'none').map(p => p.module)\n );\n return this.modules.filter(m => granted.has(m.id));\n });\n\n /**\n * The first visible module — the default landing module after login.\n * Returns `null` when the user has no modules.\n */\n readonly defaultModule: Signal<EfModule | null> = computed(() => {\n return this.visibleModules()[0] ?? null;\n });\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * The bit of an app's session that shared chrome needs to act on.\n *\n * Signing out belongs to the app — it owns the auth client, the grant\n * refresh timer and where to land afterwards — but the control that\n * triggers it belongs to the shell. This token is the seam between them,\n * the same shape as `SCREEN_REF_DATA_SERVICE`.\n *\n * Components inject it optionally and hide their affordance when nothing\n * provides it, so an app that has not opted in shows no dead button.\n *\n * ```ts\n * // app.config.ts\n * { provide: EF_SESSION, useExisting: AuthorizeService }\n * ```\n */\nexport interface EfSession {\n /** End the session and send the user wherever the app decides. */\n logout(): void;\n}\n\nexport const EF_SESSION = new InjectionToken<EfSession>('EF_SESSION');\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Which build of the app is running.\n *\n * Apps generate this at build time — the framework cannot know it — and\n * provide it here so shared chrome can show it without importing anything\n * app-specific. `EfBuildStampComponent` is the intended consumer.\n *\n * ```ts\n * // app.config.ts\n * { provide: EF_BUILD_INFO, useValue: BUILD_INFO }\n * ```\n */\nexport interface EfBuildInfo {\n /** Release version. Empty when the app maintains none — consumers should\n * omit it rather than print a placeholder. */\n version: string;\n\n /** Short commit hash the build came from. */\n commit: string;\n\n /** Commit date as `YYYY-MM-DD` — what a reader actually recognises. */\n date: string;\n\n /** Branch the build came from, useful for telling develop from a release. */\n branch: string;\n\n /**\n * Which deployment this build was made for: `production`, `staging`,\n * `develop`, or `local`. Decided at build time from the ref, because a\n * production build is made from a tag rather than a branch.\n */\n environment: string;\n\n /**\n * The shared `@elasticias/*` packages this build was compiled against,\n * in the order the app wants them listed.\n *\n * Optional: an app that ships no shared packages, or generates its stamp\n * without resolving them, simply omits the key and consumers render\n * nothing rather than an empty group.\n */\n packages?: EfBuildPackage[];\n}\n\n/** One shared package and the version that went into the build. */\nexport interface EfBuildPackage {\n /** Package name as it appears in `package.json`, e.g. `@elasticias/ui`. */\n name: string;\n\n /** The version actually installed, not the range the app declared. */\n version: string;\n}\n\nexport const EF_BUILD_INFO = new InjectionToken<EfBuildInfo>('EF_BUILD_INFO');\n","/**\n * Key-combo parsing shared by `EfShortcutService` (matching a keydown event\n * against the registry) and `formatShortcut` (rendering a registration for\n * display). Kept internal to the shortcuts folder: neither export is part\n * of the public `@elasticias/core` surface.\n */\n\n/** Fixed order modifiers are stored and compared in, so `'shift+mod+x'`\n * and `'mod+shift+x'` normalise to the same string. */\nconst MODIFIER_ORDER = ['mod', 'shift', 'alt'] as const;\n\n/**\n * Physical-key `KeyboardEvent.code` values mapped to the token used in a\n * `keys` string. `code` identifies the physical key regardless of what\n * Shift makes it print, which is what lets `'shift+/'` match the key next\n * to Right Shift on a US layout even though pressing it actually produces\n * `'?'`.\n */\nconst CODE_KEYS: Record<string, string> = {\n Enter: 'enter',\n Escape: 'escape',\n Space: 'space',\n Backspace: 'backspace',\n Tab: 'tab',\n Slash: '/',\n};\n\n/** Normalises a `keys` registration string into a canonical, comparable\n * form: lowercase tokens, modifiers first in a fixed order. */\nexport function normaliseKeys(raw: string): string {\n const tokens = raw\n .toLowerCase()\n .split('+')\n .map(token => token.trim())\n .filter(Boolean);\n const modifierTokens = MODIFIER_ORDER.filter(modifier => tokens.includes(modifier));\n const rest = tokens.filter(token => !(MODIFIER_ORDER as readonly string[]).includes(token));\n return [...modifierTokens, ...rest].join('+');\n}\n\ninterface KeyEventLike {\n code: string;\n key: string;\n metaKey: boolean;\n ctrlKey: boolean;\n shiftKey: boolean;\n altKey: boolean;\n}\n\n/** The canonical key token for an event, independent of Shift. `KeyD`\n * is `'d'` whether or not Shift was held. */\nfunction keyToken(event: KeyEventLike): string {\n if (CODE_KEYS[event.code]) return CODE_KEYS[event.code];\n if (event.code?.startsWith('Key')) return event.code.slice(3).toLowerCase();\n if (event.code?.startsWith('Digit')) return event.code.slice(5);\n return event.key.toLowerCase();\n}\n\n/**\n * Builds the normalised combo a keydown event represents, e.g. `'mod+d'`.\n * `isMac` decides which physical modifier counts as `mod`: Meta on macOS,\n * Control everywhere else.\n */\nexport function comboFromEvent(event: KeyEventLike, isMac: boolean): string {\n const tokens: string[] = [];\n if (isMac ? event.metaKey : event.ctrlKey) tokens.push('mod');\n if (event.shiftKey) tokens.push('shift');\n if (event.altKey) tokens.push('alt');\n tokens.push(keyToken(event));\n return normaliseKeys(tokens.join('+'));\n}\n\n/**\n * True while the event target is a place the user is typing: an input, a\n * textarea, a select, or anything `contenteditable`. The dispatcher checks\n * this before anything else. Without it every shortcut key is a reserved\n * word in every text field in the app.\n */\nexport function isTypingTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n return target.isContentEditable;\n}\n","import { normaliseKeys } from './shortcut-keys';\n\n/** Reads the platform once. `userAgentData` is the current standard; the\n * `platform` string fallback covers browsers that don't expose it yet.\n *\n * The test is \"Apple\", not \"Mac\". An iPhone reports `iPhone` and an iPad\n * reports either `iPad` or, since iPadOS 13, the same `MacIntel` a desktop\n * does. A narrower `/mac/i` told every iOS device with a keyboard that the\n * modifier was Ctrl, which is the one thing it is not. */\nfunction detectApplePlatform(): boolean {\n if (typeof navigator === 'undefined') return false;\n const uaData = (navigator as Navigator & { userAgentData?: { platform?: string } })\n .userAgentData;\n const platform = uaData?.platform ?? navigator.platform ?? '';\n return /mac|iphone|ipad|ipod/i.test(platform);\n}\n\n/**\n * Detected once, at module load. `formatShortcut` uses it to choose between\n * the Command glyphs and the Ctrl words. True for every Apple platform, not\n * just the desktop: an iPad with a keyboard sends Command like a Mac does.\n */\nexport const isMacPlatform: boolean = detectApplePlatform();\n\nconst MAC_MODIFIER_GLYPHS: Record<string, string> = {\n mod: '⌘',\n shift: '⇧',\n alt: '⌥',\n};\n\nconst OTHER_MODIFIER_WORDS: Record<string, string> = {\n mod: 'Ctrl',\n shift: 'Shift',\n alt: 'Alt',\n};\n\n/** Named keys with a glyph of their own, distinct from their letter. */\nconst KEY_GLYPHS: Record<string, string> = {\n enter: '↵',\n escape: 'Esc',\n backspace: '⌫',\n space: 'Space',\n tab: 'Tab',\n};\n\n/**\n * A produced character that stands in for the whole combo. Shift plus the\n * physical `/` key always reads as the question mark it prints. Showing\n * it as `'Shift' + '/'` would describe the keys pressed rather than the\n * shortcut a person recognises.\n */\nconst SHIFTED_SYMBOL_GLYPHS: Record<string, string> = {\n '/': '?',\n};\n\n/**\n * Formats a `keys` registration for display. One registration, correct on\n * both platforms:\n *\n * - `'mod+d'` → `⌘D` on macOS, `Ctrl+D` elsewhere\n * - `'enter'` → `↵`\n * - `'e'` → `E`\n * - `'shift+/'` → `?`\n *\n * `mac` defaults to the platform this code is actually running on. Pass it\n * explicitly only to render for a platform other than the current one.\n */\nexport function formatShortcut(keys: string, mac: boolean = isMacPlatform): string {\n const tokens = normaliseKeys(keys).split('+');\n const key = tokens[tokens.length - 1];\n const modifiers = tokens.slice(0, -1);\n\n if (modifiers.length === 1 && modifiers[0] === 'shift' && SHIFTED_SYMBOL_GLYPHS[key]) {\n return SHIFTED_SYMBOL_GLYPHS[key];\n }\n\n const displayKey = KEY_GLYPHS[key] ?? key.toUpperCase();\n\n if (mac) {\n return modifiers.map(modifier => MAC_MODIFIER_GLYPHS[modifier] ?? modifier).join('') + displayKey;\n }\n\n const words = modifiers.map(modifier => OTHER_MODIFIER_WORDS[modifier] ?? modifier);\n return [...words, displayKey].join('+');\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { computed, DestroyRef, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport { isMacPlatform } from './format-shortcut';\nimport { comboFromEvent, isTypingTarget, normaliseKeys } from './shortcut-keys';\nimport { EfShortcut, EfShortcutGroup } from './ef-shortcut.types';\n\n/**\n * App-wide keyboard-shortcut registry, plus the single `document:keydown`\n * dispatcher that acts on it.\n *\n * ```ts\n * private readonly shortcuts = inject(EfShortcutService);\n *\n * constructor() {\n * // Auto-unregisters on this component's DestroyRef, called from a\n * // constructor / field initializer, an active injection context.\n * this.shortcuts.register({\n * id: 'sales-order.save',\n * keys: 'mod+s',\n * labelKey: 'sales_order_save',\n * group: 'shortcut_group_sales_order',\n * handler: () => this.save(),\n * });\n * }\n * ```\n *\n * Two things make this safe to leave switched on everywhere:\n * - The dispatcher ignores keydown while the target is an input, textarea,\n * select, or anything `contenteditable`, unless the combo includes\n * `mod`. A bare key or a Shift/Alt combo could be real typing (Alt and\n * AltGr both produce characters on several layouts this app ships), but\n * `mod` never does, and a save/search shortcut is normally pressed from\n * inside the very field it acts on. See `isTypingTarget`.\n * - `preventDefault` is only called once a registration actually matches,\n * so an unmapped key never loses its browser default.\n *\n * `list()` exposes the registry grouped for `ef-shortcuts-dialog`, as a\n * signal so the dialog reflects registrations and disposals live.\n */\n@Injectable({ providedIn: 'root' })\nexport class EfShortcutService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly registry = signal<ReadonlyMap<string, EfShortcut>>(new Map());\n\n /**\n * The registry, grouped for display and deduplicated by\n * (group, label, keys): several instances of the same conceptual\n * shortcut (one row-actions component per row, say) collapse to a\n * single line rather than repeating once per instance.\n */\n readonly list = computed<EfShortcutGroup[]>(() => {\n const deduped = new Map<string, EfShortcut>();\n for (const shortcut of this.registry().values()) {\n const key = `${shortcut.group}::${shortcut.labelKey}::${shortcut.keys}`;\n if (!deduped.has(key)) deduped.set(key, shortcut);\n }\n\n const byGroup = new Map<string, EfShortcut[]>();\n for (const shortcut of deduped.values()) {\n const group = byGroup.get(shortcut.group) ?? [];\n group.push(shortcut);\n byGroup.set(shortcut.group, group);\n }\n\n return Array.from(byGroup.entries()).map(([group, shortcuts]) => ({ group, shortcuts }));\n });\n\n constructor() {\n if (!isPlatformBrowser(this.platformId)) return;\n this.document.addEventListener('keydown', this.onKeydown);\n this.destroyRef.onDestroy(() => this.document.removeEventListener('keydown', this.onKeydown));\n }\n\n /**\n * Registers a shortcut and returns a disposer. When `register` is\n * called from an active injection context (a component constructor or\n * field initializer), the shortcut also auto-unregisters when that\n * context is destroyed. Call it explicitly elsewhere (a plain method,\n * a route resolver already outside construction) and dispose it\n * yourself.\n */\n register(shortcut: EfShortcut): () => void {\n const entry: EfShortcut = { ...shortcut, keys: normaliseKeys(shortcut.keys) };\n\n this.registry.update(map => {\n const next = new Map(map);\n next.set(entry.id, entry);\n return next;\n });\n\n const dispose = (): void => this.unregister(entry.id);\n this.tryGetCallerDestroyRef()?.onDestroy(dispose);\n return dispose;\n }\n\n /** Removes a registration by id. Safe to call twice: the disposer\n * returned by `register` calls this. */\n unregister(id: string): void {\n this.registry.update(map => {\n if (!map.has(id)) return map;\n const next = new Map(map);\n next.delete(id);\n return next;\n });\n }\n\n /** `inject()` throws outside an active injection context; that is how\n * a call from a plain method (as opposed to a constructor) is told\n * apart from one worth auto-disposing. */\n private tryGetCallerDestroyRef(): DestroyRef | null {\n try {\n return inject(DestroyRef, { optional: true });\n } catch {\n return null;\n }\n }\n\n private readonly onKeydown = (event: KeyboardEvent): void => {\n const combo = comboFromEvent(event, isMacPlatform);\n\n // A bare key, or one held with only Shift or Alt, is something the\n // user could plausibly be typing (Alt/AltGr produces real\n // characters on several layouts this app ships, French and\n // Moroccan included), so those stay inert in a field. `mod` never\n // types a character: Ctrl+S saves from inside a form field in\n // every application there is, and a form field is the only place\n // a save shortcut is ever actually pressed from.\n const isModCombo = combo.split('+').includes('mod');\n if (!isModCombo && isTypingTarget(event.target)) return;\n\n for (const shortcut of this.registry().values()) {\n if (shortcut.keys !== combo) continue;\n if (shortcut.when && !shortcut.when()) continue;\n event.preventDefault();\n shortcut.handler();\n return;\n }\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elasticias/core",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.0",
6
6
  "@angular/core": "^21.0.0",
@@ -636,7 +636,11 @@ interface EfShortcutGroup {
636
636
  *
637
637
  * Two things make this safe to leave switched on everywhere:
638
638
  * - The dispatcher ignores keydown while the target is an input, textarea,
639
- * select, or anything `contenteditable`. See `isTypingTarget`.
639
+ * select, or anything `contenteditable`, unless the combo includes
640
+ * `mod`. A bare key or a Shift/Alt combo could be real typing (Alt and
641
+ * AltGr both produce characters on several layouts this app ships), but
642
+ * `mod` never does, and a save/search shortcut is normally pressed from
643
+ * inside the very field it acts on. See `isTypingTarget`.
640
644
  * - `preventDefault` is only called once a registration actually matches,
641
645
  * so an unmapped key never loses its browser default.
642
646
  *
@@ -678,9 +682,9 @@ declare class EfShortcutService {
678
682
  }
679
683
 
680
684
  /**
681
- * Detected once, at module load. `formatShortcut` uses it by default, and
682
- * `ef-shortcuts-dialog` reads it directly to decide whether its "Ctrl on
683
- * Windows and Linux" line is news (it isn't, on a Mac) or worth a sentence.
685
+ * Detected once, at module load. `formatShortcut` uses it to choose between
686
+ * the Command glyphs and the Ctrl words. True for every Apple platform, not
687
+ * just the desktop: an iPad with a keyboard sends Command like a Mac does.
684
688
  */
685
689
  declare const isMacPlatform: boolean;
686
690
  /**