@africanies/angular-web-sdk 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/.nx/cache/12276756491762927325/dist/libs/africanies-theme/README.md +46 -0
  2. package/.nx/cache/12276756491762927325/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +215 -0
  3. package/.nx/cache/12276756491762927325/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -0
  4. package/.nx/cache/12276756491762927325/dist/libs/africanies-theme/package.json +35 -0
  5. package/.nx/cache/12276756491762927325/dist/libs/africanies-theme/tailwind-preset.cjs +245 -0
  6. package/.nx/cache/12276756491762927325/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +157 -0
  7. package/.nx/cache/17491371155400585077/dist/libs/africanies-core/README.md +85 -0
  8. package/.nx/cache/17491371155400585077/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +4546 -0
  9. package/.nx/cache/17491371155400585077/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -0
  10. package/.nx/cache/17491371155400585077/dist/libs/africanies-core/package.json +31 -0
  11. package/.nx/cache/17491371155400585077/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +2740 -0
  12. package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/README.md +68 -0
  13. package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/assets/brand/africanies-logo-mini.png +0 -0
  14. package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/assets/brand/africanies-logo.png +0 -0
  15. package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/assets/brand/africanies-logo.svg +5 -0
  16. package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/assets/carriers/dhl.svg +7 -0
  17. package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +19375 -0
  18. package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -0
  19. package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/package.json +35 -0
  20. package/.nx/cache/17499961385238663835/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +5490 -0
  21. package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/README.md +68 -0
  22. package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/assets/brand/africanies-logo-mini.png +0 -0
  23. package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/assets/brand/africanies-logo.png +0 -0
  24. package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/assets/brand/africanies-logo.svg +5 -0
  25. package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/assets/carriers/dhl.svg +7 -0
  26. package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +19291 -0
  27. package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -0
  28. package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/package.json +35 -0
  29. package/.nx/cache/3314955264390318442/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +5483 -0
  30. package/.nx/cache/4082520855419352840/dist/libs/africanies-theme/README.md +46 -0
  31. package/.nx/cache/4082520855419352840/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +221 -0
  32. package/.nx/cache/4082520855419352840/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -0
  33. package/.nx/cache/4082520855419352840/dist/libs/africanies-theme/package.json +35 -0
  34. package/.nx/cache/4082520855419352840/dist/libs/africanies-theme/tailwind-preset.cjs +253 -0
  35. package/.nx/cache/4082520855419352840/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +166 -0
  36. package/.nx/cache/run.json +19 -19
  37. package/.nx/cache/terminalOutputs/12276756491762927325 +21 -0
  38. package/.nx/cache/terminalOutputs/16279119293212733518 +6 -0
  39. package/.nx/cache/terminalOutputs/17491371155400585077 +21 -0
  40. package/.nx/cache/terminalOutputs/17499961385238663835 +21 -0
  41. package/.nx/cache/terminalOutputs/3017748574492080228 +28 -0
  42. package/.nx/cache/terminalOutputs/3314955264390318442 +21 -0
  43. package/.nx/cache/terminalOutputs/4082520855419352840 +21 -0
  44. package/.nx/cache/terminalOutputs/7126777490381568487 +32 -0
  45. package/.nx/cache/terminalOutputs/8648260256613557249 +173 -0
  46. package/.nx/cache/terminalOutputs/9408529484792607601 +6 -0
  47. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db +0 -0
  48. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db-shm +0 -0
  49. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db-wal +0 -0
  50. package/.nx/workspace-data/d/daemon.log +3296 -0
  51. package/.nx/workspace-data/d/server-process.json +2 -2
  52. package/.nx/workspace-data/file-map.json +3422 -3408
  53. package/.nx/workspace-data/nx_files.nxt +0 -0
  54. package/.nx/workspace-data/project-graph.json +5 -5
  55. package/.nx/workspace-data/source-maps.json +0 -80
  56. package/apps/playground/src/app/snippets/action-menu.snippets.ts +1 -0
  57. package/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +1 -1
  58. package/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -1
  59. package/dist/libs/africanies-core/package.json +3 -3
  60. package/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +6 -0
  61. package/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -1
  62. package/dist/libs/africanies-theme/package.json +3 -3
  63. package/dist/libs/africanies-theme/tailwind-preset.cjs +15 -7
  64. package/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +10 -1
  65. package/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +456 -169
  66. package/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -1
  67. package/dist/libs/africanies-ui/package.json +5 -5
  68. package/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +111 -31
  69. package/libs/africanies-core/package.json +3 -3
  70. package/libs/africanies-core/src/lib/payment-method/payment-method.mapper.spec.ts +15 -0
  71. package/libs/africanies-core/src/lib/payment-method/payment-method.mapper.ts +1 -2
  72. package/libs/africanies-theme/package.json +3 -3
  73. package/libs/africanies-theme/src/lib/mode-color.safelist.ts +4 -0
  74. package/libs/africanies-theme/src/lib/mode-color.service.ts +11 -0
  75. package/libs/africanies-theme/tailwind-preset.cjs +15 -7
  76. package/libs/africanies-ui/package.json +5 -5
  77. package/libs/africanies-ui/src/index.ts +6 -0
  78. package/libs/africanies-ui/src/lib/accordion/accordion.component.ts +135 -0
  79. package/libs/africanies-ui/src/lib/accordion/index.ts +7 -0
  80. package/libs/africanies-ui/src/lib/action-menu/action-menu.component.ts +84 -17
  81. package/libs/africanies-ui/src/lib/action-menu/menu-item.ts +19 -2
  82. package/libs/africanies-ui/src/lib/layout/header-weather.spec.ts +111 -6
  83. package/libs/africanies-ui/src/lib/layout/header-weather.ts +104 -8
  84. package/libs/africanies-ui/src/lib/modules/africanies-feedback.module.ts +3 -1
  85. package/libs/africanies-ui/src/lib/table/table.component.ts +67 -44
  86. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"africanies-africanies-ui.mjs","sources":["../../../../libs/africanies-ui/src/lib/button/button.component.ts","../../../../libs/africanies-ui/src/lib/toast/toast.types.ts","../../../../libs/africanies-ui/src/lib/toast/toast-item.component.ts","../../../../libs/africanies-ui/src/lib/toast/toast-host.component.ts","../../../../libs/africanies-ui/src/lib/toast/toast.service.ts","../../../../libs/africanies-ui/src/lib/copy-button/copy-button.component.ts","../../../../libs/africanies-ui/src/lib/copy-button/index.ts","../../../../libs/africanies-ui/src/lib/navigation/nav-router.util.ts","../../../../libs/africanies-ui/src/lib/navigation/navigate-nav-item.ts","../../../../libs/africanies-ui/src/lib/action-menu/action-menu-trigger.directive.ts","../../../../libs/africanies-ui/src/lib/action-menu/action-menu.component.ts","../../../../libs/africanies-ui/src/lib/action-menu/index.ts","../../../../libs/africanies-ui/src/lib/feedback/empty-state.component.ts","../../../../libs/africanies-ui/src/lib/feedback/error-indicator.component.ts","../../../../libs/africanies-ui/src/lib/feedback/error-state.component.ts","../../../../libs/africanies-ui/src/lib/feedback/loading-state.component.ts","../../../../libs/africanies-ui/src/lib/feedback/async-state.component.ts","../../../../libs/africanies-ui/src/lib/feedback/index.ts","../../../../libs/africanies-ui/src/lib/accordion/accordion.component.ts","../../../../libs/africanies-ui/src/lib/accordion/index.ts","../../../../libs/africanies-ui/src/lib/alert/alert.component.ts","../../../../libs/africanies-ui/src/lib/alert/index.ts","../../../../libs/africanies-ui/src/lib/chip/chip.component.ts","../../../../libs/africanies-ui/src/lib/chip/index.ts","../../../../libs/africanies-ui/src/lib/carrier/carrier-logo.component.ts","../../../../libs/africanies-ui/src/lib/carrier/delivery-vendor-select.ts","../../../../libs/africanies-ui/src/lib/content-stack/content-stack.component.ts","../../../../libs/africanies-ui/src/lib/content-stack/index.ts","../../../../libs/africanies-ui/src/lib/toast/provide-africanies-toasts.ts","../../../../libs/africanies-ui/src/lib/toast/index.ts","../../../../libs/africanies-ui/src/lib/tooltip/tooltip-trigger.directive.ts","../../../../libs/africanies-ui/src/lib/tooltip/tooltip.component.ts","../../../../libs/africanies-ui/src/lib/info-popover/info-popover-trigger.directive.ts","../../../../libs/africanies-ui/src/lib/info-popover/info-popover.component.ts","../../../../libs/africanies-ui/src/lib/info-popover/info-popover-content.directive.ts","../../../../libs/africanies-ui/src/lib/forms/form-field.classes.ts","../../../../libs/africanies-ui/src/lib/forms/date-picker/date-picker.component.ts","../../../../libs/africanies-ui/src/lib/forms/radio/radio.component.ts","../../../../libs/africanies-ui/src/lib/overlay/modal-size.ts","../../../../libs/africanies-ui/src/lib/overlay/africanies-overlay-ref.ts","../../../../libs/africanies-ui/src/lib/overlay/overlay-data.token.ts","../../../../libs/africanies-ui/src/lib/overlay/overlay-motion.ts","../../../../libs/africanies-ui/src/lib/overlay/overlay-attach.ts","../../../../libs/africanies-ui/src/lib/overlay/modal.service.ts","../../../../libs/africanies-ui/src/lib/forms/select/select.component.ts","../../../../libs/africanies-ui/src/lib/forms/text-input/text-input.component.ts","../../../../libs/africanies-ui/src/lib/filters/filter-query.service.ts","../../../../libs/africanies-ui/src/lib/filters/filter-drawer.panel.ts","../../../../libs/africanies-ui/src/lib/overlay/drawer.service.ts","../../../../libs/africanies-ui/src/lib/filters/filter-drawer.service.ts","../../../../libs/africanies-ui/src/lib/overlay/confirm-dialog.component.ts","../../../../libs/africanies-ui/src/lib/overlay/confirm.service.ts","../../../../libs/africanies-ui/src/lib/overlay/overlay-frame.component.ts","../../../../libs/africanies-ui/src/lib/overlay/provide-africanies-ui-overlays.ts","../../../../libs/africanies-ui/src/lib/overlay/index.ts","../../../../libs/africanies-ui/src/lib/forms/address-input/google-places.token.ts","../../../../libs/africanies-ui/src/lib/forms/address-input/google-places.service.ts","../../../../libs/africanies-ui/src/lib/forms/address-input/address-input.component.ts","../../../../libs/africanies-ui/src/lib/forms/address-input/provide-google-places.ts","../../../../libs/africanies-ui/src/lib/forms/address-input/index.ts","../../../../libs/africanies-ui/src/lib/forms/checkbox/checkbox.component.ts","../../../../libs/africanies-ui/src/lib/forms/checkbox/index.ts","../../../../libs/africanies-ui/src/lib/forms/date-picker/index.ts","../../../../libs/africanies-ui/src/lib/forms/file-upload/file-accept.ts","../../../../libs/africanies-ui/src/lib/forms/file-upload/camera-capture.dialog.ts","../../../../libs/africanies-ui/src/lib/forms/file-upload/file-preview.dialog.ts","../../../../libs/africanies-ui/src/lib/forms/file-upload/file-upload.component.ts","../../../../libs/africanies-ui/src/lib/forms/file-upload/index.ts","../../../../libs/africanies-ui/src/lib/forms/number-input/number-input.component.ts","../../../../libs/africanies-ui/src/lib/forms/number-input/index.ts","../../../../libs/africanies-ui/src/lib/forms/otp-input/otp-input.component.ts","../../../../libs/africanies-ui/src/lib/forms/radio/index.ts","../../../../libs/africanies-ui/src/lib/forms/search-combobox/search-combobox.component.ts","../../../../libs/africanies-ui/src/lib/forms/select/index.ts","../../../../libs/africanies-ui/src/lib/forms/text-input/index.ts","../../../../libs/africanies-ui/src/lib/forms/textarea/textarea.component.ts","../../../../libs/africanies-ui/src/lib/forms/textarea/index.ts","../../../../libs/africanies-ui/src/lib/forms/toggle/toggle.component.ts","../../../../libs/africanies-ui/src/lib/forms/toggle/index.ts","../../../../libs/africanies-ui/src/lib/forms/index.ts","../../../../libs/africanies-ui/src/lib/navigation/breadcrumb/breadcrumb.component.ts","../../../../libs/africanies-ui/src/lib/navigation/header-back.util.ts","../../../../libs/africanies-ui/src/lib/navigation/segment/segment.component.ts","../../../../libs/africanies-ui/src/lib/navigation/shipping-mode-switch/shipping-mode-switch.component.ts","../../../../libs/africanies-ui/src/lib/navigation/shipping-mode-switch/index.ts","../../../../libs/africanies-ui/src/lib/brand/brand-logo.ts","../../../../libs/africanies-ui/src/lib/brand/brand-logo.component.ts","../../../../libs/africanies-ui/src/lib/navigation/side-nav/africanies-side-nav.component.ts","../../../../libs/africanies-ui/src/lib/navigation/side-nav/africanies-side-nav.component.html","../../../../libs/africanies-ui/src/lib/navigation/side-nav/index.ts","../../../../libs/africanies-ui/src/lib/navigation/tabs/tab-def.directive.ts","../../../../libs/africanies-ui/src/lib/navigation/tabs/tabs.component.ts","../../../../libs/africanies-ui/src/lib/navigation/index.ts","../../../../libs/africanies-ui/src/lib/layout/page-header.component.ts","../../../../libs/africanies-ui/src/lib/layout/app-shell-content-header.component.ts","../../../../libs/africanies-ui/src/lib/avatar/avatar.component.ts","../../../../libs/africanies-ui/src/lib/avatar/avatar-menu.component.ts","../../../../libs/africanies-ui/src/lib/notifications/notification-drawer.panel.ts","../../../../libs/africanies-ui/src/lib/notifications/notification-drawer.service.ts","../../../../libs/africanies-ui/src/lib/layout/header-greeting.util.ts","../../../../libs/africanies-ui/src/lib/layout/header-weather.ts","../../../../libs/africanies-ui/src/lib/layout/app-shell-header.component.ts","../../../../libs/africanies-ui/src/lib/layout/app-shell-header-slot.directive.ts","../../../../libs/africanies-ui/src/lib/layout/app-shell.component.ts","../../../../libs/africanies-ui/src/lib/layout/app-shell.component.html","../../../../libs/africanies-ui/src/lib/layout/index.ts","../../../../libs/africanies-ui/src/lib/image/image.component.ts","../../../../libs/africanies-ui/src/lib/table/cell-def.directive.ts","../../../../libs/africanies-ui/src/lib/table/header-cell-def.directive.ts","../../../../libs/africanies-ui/src/lib/table/row-detail-def.directive.ts","../../../../libs/africanies-ui/src/lib/pagination/pagination.component.ts","../../../../libs/africanies-ui/src/lib/table/table.component.ts","../../../../libs/africanies-ui/src/lib/table/index.ts","../../../../libs/africanies-ui/src/lib/pagination/index.ts","../../../../libs/africanies-ui/src/lib/stepper/step-def.directive.ts","../../../../libs/africanies-ui/src/lib/stepper/stepper.component.ts","../../../../libs/africanies-ui/src/lib/stepper/index.ts","../../../../libs/africanies-ui/src/lib/modules/africanies-actions.module.ts","../../../../libs/africanies-ui/src/lib/modules/africanies-feedback.module.ts","../../../../libs/africanies-ui/src/lib/modules/africanies-forms.module.ts","../../../../libs/africanies-ui/src/lib/modules/africanies-info-popover.module.ts","../../../../libs/africanies-ui/src/lib/modules/africanies-navigation.module.ts","../../../../libs/africanies-ui/src/lib/modules/africanies-stepper.module.ts","../../../../libs/africanies-ui/src/lib/modules/africanies-table.module.ts","../../../../libs/africanies-ui/src/lib/modules/africanies-tooltip.module.ts","../../../../libs/africanies-ui/src/lib/modules/index.ts","../../../../libs/africanies-ui/src/index.ts","../../../../libs/africanies-ui/src/africanies-africanies-ui.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\n/**\n * Visual emphasis for {@link ButtonComponent}.\n *\n * - `primary` — filled mode accent (SFN green / STN orange) for the main action\n * - `secondary` — outlined chrome for secondary actions\n * - `ghost` — neutral text-only for low-emphasis actions (Cancel, tertiary)\n * - `ghost-primary` — text-only mode accent (SFN green / STN orange)\n * - `ghost-danger` — text-only destructive actions (Clear, Remove)\n * - `danger` — destructive confirmations and deletes\n */\nexport type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'ghost'\n | 'ghost-primary'\n | 'ghost-danger'\n | 'underline'\n | 'danger';\n\n/**\n * Control size for {@link ButtonComponent}.\n */\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\n/**\n * Theme-token button used across AFRICANIES surfaces.\n *\n * WHY an attribute selector on native `button` / `a`: keeps semantics and\n * keyboard behavior on the host element (Enter/Space, focus rings) instead of\n * nesting an interactive element inside a custom component host.\n *\n * **Primary** and **ghost-primary** follow {@link ModeColorService} / shipping mode:\n * SFN → export green, STN → import orange.\n *\n * @example\n * ```html\n * <button africanies-button type=\"button\" variant=\"primary\" (click)=\"save()\">\n * Save shipment\n * </button>\n *\n * <button africanies-button type=\"button\" variant=\"ghost-primary\" size=\"sm\">\n * <africanies-icon name=\"plus\" [size]=\"14\" />\n * Add row\n * </button>\n *\n * <button africanies-button type=\"button\" variant=\"primary\" [loading]=\"saving()\">\n * Save shipment\n * </button>\n *\n * <button africanies-button type=\"button\" variant=\"danger\" size=\"sm\" [disabled]=\"busy()\">\n * <africanies-icon name=\"trash\" [size]=\"16\" />\n * Delete\n * </button>\n * ```\n */\n@Component({\n selector: 'button[africanies-button], a[africanies-button]',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent],\n template: `\n <span\n class=\"inline-flex items-center justify-center gap-2\"\n [class.invisible]=\"loading()\"\n [attr.aria-hidden]=\"loading() ? true : null\"\n >\n <ng-content />\n </span>\n @if (loading()) {\n <span\n class=\"pointer-events-none absolute inset-0 inline-flex items-center justify-center\"\n aria-hidden=\"true\"\n >\n <africanies-icon\n name=\"spinner\"\n [size]=\"spinnerSize()\"\n class=\"animate-spin\"\n />\n </span>\n }\n `,\n host: {\n '[class]': 'hostClass()',\n '[attr.aria-disabled]': 'inactive() ? true : null',\n '[attr.disabled]': 'inactive() ? true : null',\n '[attr.aria-busy]': 'loading() ? true : null',\n '[attr.tabindex]': 'inactive() ? -1 : null',\n '(click)': 'blockWhenDisabled($event)',\n },\n})\nexport class ButtonComponent {\n private readonly modeColor = inject(ModeColorService);\n\n /**\n * Visual variant. Defaults to `primary` so a bare `africanies-button` reads as the\n * main CTA without extra attributes.\n */\n readonly variant = input<ButtonVariant>('primary');\n\n /**\n * Padding / type scale. Defaults to `md` for form toolbars and dialogs.\n */\n readonly size = input<ButtonSize>('md');\n\n /**\n * When true, blocks pointer and keyboard activation. Also sets\n * `aria-disabled` for anchors that cannot use the native `disabled` attribute.\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * In-flight mutation. Replaces the label with a circular spinner while\n * keeping the control's width, and treats the host as disabled.\n *\n * Plain boolean (no `booleanAttribute`): confirm/dialog `[loading]=\"signal()\"`\n * bindings must pass through `true` without attribute-string coercion.\n */\n readonly loading = input(false);\n\n protected readonly inactive = computed(\n () => this.disabled() || this.loading(),\n );\n\n protected readonly spinnerSize = computed(() => {\n const size = this.size();\n if (size === 'sm') {\n return 14;\n }\n if (size === 'lg') {\n return 18;\n }\n return 16;\n });\n\n /**\n * Composed Tailwind classes from theme tokens — kept as string literals so\n * the scanner retains utilities in the published UI bundle.\n */\n protected readonly hostClass = computed(() => {\n const base =\n 'relative inline-flex items-center justify-center gap-2 box-border font-sans font-medium rounded-md border transition-colors cursor-pointer ' +\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ' +\n 'disabled:opacity-50 disabled:cursor-not-allowed aria-disabled:opacity-50 aria-disabled:cursor-not-allowed';\n\n const sizes: Record<ButtonSize, string> = {\n sm: 'text-body-sm px-2.5 py-0 h-8',\n md: 'text-body px-3.5 py-0 h-10',\n lg: 'text-body-lg px-4 py-0 h-12',\n };\n\n const variant = this.variant();\n let variantClass: string;\n if (variant === 'primary') {\n variantClass = this.modeColor.classes().primary;\n } else if (variant === 'ghost-primary') {\n variantClass = this.modeColor.classes().ghostPrimary;\n } else if (variant === 'secondary') {\n variantClass =\n 'bg-white dark:bg-ink-950 text-ink dark:text-white border-border dark:border-white/15 hover:bg-background-welcome dark:hover:bg-white/10';\n } else if (variant === 'ghost') {\n variantClass =\n 'bg-transparent text-ink dark:text-white border-transparent hover:bg-background-welcome dark:hover:bg-white/10';\n } else if (variant === 'ghost-danger') {\n variantClass =\n 'bg-transparent text-danger border-transparent hover:bg-danger-subtle dark:hover:bg-danger/10';\n } else if (variant === 'underline') {\n variantClass =\n 'bg-transparent text-ink dark:text-white border-transparent underline underline-offset-2 hover:opacity-80 !px-0 !h-auto !min-h-0';\n } else {\n variantClass =\n 'bg-danger text-white border-transparent hover:bg-danger-dark';\n }\n\n return `${base} ${sizes[this.size()]} ${variantClass}`;\n });\n\n /**\n * Anchors lack native `disabled` — block activation while keeping the cursor.\n *\n * Uses `stopPropagation` (not `stopImmediatePropagation`) so the host click\n * does not swallow the same-element `(click)` that starts confirm work.\n *\n * @param event\n */\n protected blockWhenDisabled(event: Event): void {\n if (this.inactive()) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n}\n","import type { IconName } from '@africanies/africanies-icons';\n\n/**\n * Toast tone — mirrors alert semantics, different surface (transient stack).\n */\nexport type ToastVariant = 'info' | 'success' | 'warning' | 'danger';\n\n/**\n * Input for {@link ToastService.show}.\n */\nexport interface ToastShowOptions {\n /** Body copy (required). */\n message: string;\n /** Optional short heading. */\n title?: string;\n /** Semantic tone. Defaults to `info`. */\n variant?: ToastVariant;\n /**\n * Auto-dismiss delay in ms. `null` = persistent until dismiss.\n * Omit to use the variant default (error → persistent, warning → longer).\n */\n durationMs?: number | null;\n /** Override the default variant icon. */\n icon?: IconName;\n}\n\n/**\n * One entry in the live toast stack.\n */\nexport interface ToastItem {\n id: string;\n message: string;\n title?: string;\n variant: ToastVariant;\n /** `null` means persistent. */\n durationMs: number | null;\n icon?: IconName;\n /** Collapse count when identical toasts merge. */\n count: number;\n /** When true and {@link count} &gt; 1, show every stacked copy. */\n expanded: boolean;\n createdAt: number;\n}\n\n/** Default auto-dismiss timings (ms). `danger` is always persistent. */\nexport const TOAST_DURATION_MS: Record<ToastVariant, number | null> = {\n info: 4500,\n success: 4500,\n warning: 8000,\n danger: null,\n};\n\n/** Default icons per variant. */\nexport const TOAST_ICONS: Record<ToastVariant, IconName> = {\n info: 'info-circle',\n success: 'check-circle',\n warning: 'warning',\n danger: 'warning',\n};\n\n/**\n * Fingerprint used to collapse identical toasts (iOS-style count bump).\n *\n * @param variant - Tone.\n * @param title - Optional heading.\n * @param message - Body.\n * @returns Stable key.\n */\nexport function toastFingerprint(\n variant: ToastVariant,\n title: string | undefined,\n message: string,\n): string {\n return `${variant}|${title ?? ''}|${message}`;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../button/button.component';\nimport {\n TOAST_ICONS,\n type ToastItem,\n type ToastVariant,\n} from './toast.types';\n\n/**\n * Single toast card — dense, token-based, with optional countdown rail.\n * Stacked identical toasts can expand; close peels the outermost copy.\n */\n@Component({\n selector: 'africanies-toast-item',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, ButtonComponent],\n host: {\n class: 'pointer-events-auto block w-full',\n '[class.is-paused]': 'isPaused()',\n '(mouseenter)': 'onPause()',\n '(mouseleave)': 'onResume()',\n '(focusin)': 'onPause()',\n '(focusout)': 'onResume()',\n },\n template: `\n <div class=\"flex w-full flex-col gap-1.5\">\n @if (item().expanded && item().count > 1) {\n @for (copy of copies(); track copy; let i = $index) {\n <div\n [class]=\"shellClass()\"\n [attr.role]=\"i === 0 ? a11yRole() : null\"\n [attr.aria-live]=\"i === 0 ? a11yLive() : null\"\n >\n <div [class]=\"accentClass()\" aria-hidden=\"true\"></div>\n <div class=\"min-w-0 flex-1\">\n <div class=\"flex items-start gap-3 px-3.5 py-3\">\n <africanies-icon\n [name]=\"item().icon ?? defaultIcon()\"\n [size]=\"18\"\n [class]=\"iconClass()\"\n class=\"mt-0.5 shrink-0\"\n />\n <div class=\"min-w-0 flex-1\">\n @if (item().title; as heading) {\n <p [class]=\"titleClass()\">{{ heading }}</p>\n }\n <p\n class=\"m-0 break-words text-body-sm text-neutral-600 dark:text-neutral-300\"\n >\n {{ item().message }}\n </p>\n </div>\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!min-h-0 !px-1.5 !py-1 shrink-0\"\n aria-label=\"Dismiss\"\n (click)=\"dismissOne.emit()\"\n >\n <africanies-icon name=\"close\" [size]=\"14\" />\n </button>\n </div>\n </div>\n </div>\n }\n <div class=\"flex flex-wrap justify-end gap-1 px-0.5\">\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!min-h-0 !px-2 !py-1 !text-caption\"\n (click)=\"collapse.emit()\"\n >\n Collapse\n </button>\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!min-h-0 !px-2 !py-1 !text-caption\"\n (click)=\"dismissAll.emit()\"\n >\n Close all\n </button>\n </div>\n } @else {\n <div\n [class]=\"shellClass()\"\n [attr.role]=\"a11yRole()\"\n [attr.aria-live]=\"a11yLive()\"\n >\n <div [class]=\"accentClass()\" aria-hidden=\"true\"></div>\n <div class=\"min-w-0 flex-1\">\n <div class=\"flex items-start gap-3 px-3.5 pt-3 pb-3\">\n <africanies-icon\n [name]=\"item().icon ?? defaultIcon()\"\n [size]=\"18\"\n [class]=\"iconClass()\"\n class=\"mt-0.5 shrink-0\"\n />\n <div class=\"min-w-0 flex-1\">\n <div class=\"flex items-start gap-2\">\n <div class=\"min-w-0 flex-1\">\n @if (item().title; as heading) {\n <p [class]=\"titleClass()\">{{ heading }}</p>\n }\n <p\n class=\"m-0 break-words text-body-sm text-neutral-600 dark:text-neutral-300\"\n >\n {{ item().message }}\n </p>\n </div>\n @if (item().count > 1) {\n <span\n class=\"shrink-0 rounded-full bg-ink/8 px-1.5 py-0.5 text-caption font-semibold tabular-nums text-ink dark:bg-white/15 dark:text-white\"\n >\n ×{{ item().count }}\n </span>\n }\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!min-h-0 !px-1.5 !py-1 shrink-0\"\n [attr.aria-label]=\"\n item().count > 1 ? 'Dismiss outermost' : 'Dismiss'\n \"\n (click)=\"dismissOne.emit()\"\n >\n <africanies-icon name=\"close\" [size]=\"14\" />\n </button>\n </div>\n @if (item().count > 1) {\n <div class=\"mt-2 flex flex-wrap gap-1\">\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!min-h-0 !px-2 !py-1 !text-caption\"\n (click)=\"expand.emit()\"\n >\n Expand\n </button>\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!min-h-0 !px-2 !py-1 !text-caption\"\n (click)=\"dismissAll.emit()\"\n >\n Close all\n </button>\n </div>\n }\n </div>\n </div>\n @if (item().durationMs) {\n <div\n class=\"h-0.5 w-full overflow-hidden bg-ink/5 dark:bg-white/10\"\n aria-hidden=\"true\"\n >\n <div\n class=\"africanies-toast-rail h-full w-full origin-left\"\n [class]=\"railFillClass()\"\n [style.animation-duration.ms]=\"item().durationMs\"\n ></div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n styles: `\n @keyframes africanies-toast-in {\n from {\n opacity: 0;\n transform: translateX(0.75rem);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n @keyframes africanies-toast-rail {\n from {\n transform: scaleX(1);\n }\n to {\n transform: scaleX(0);\n }\n }\n .africanies-toast-enter {\n animation: africanies-toast-in 220ms ease-out both;\n }\n .africanies-toast-rail {\n animation-name: africanies-toast-rail;\n animation-timing-function: linear;\n animation-fill-mode: forwards;\n }\n :host.is-paused .africanies-toast-rail {\n animation-play-state: paused;\n }\n `,\n})\nexport class ToastItemComponent {\n /** Stack entry to render. */\n readonly item = input.required<ToastItem>();\n\n /** Peel one copy (outermost) from the stack. */\n readonly dismissOne = output<void>();\n /** Remove the whole stack. */\n readonly dismissAll = output<void>();\n /** Show every stacked copy. */\n readonly expand = output<void>();\n /** Fold expanded copies back into one card. */\n readonly collapse = output<void>();\n /** Hover / focus — pause timer. */\n readonly paused = output<void>();\n /** Leave — resume timer. */\n readonly resumed = output<void>();\n\n protected readonly isPaused = signal(false);\n\n protected readonly copies = computed(() =>\n Array.from({ length: Math.max(1, this.item().count) }, (_, i) => i),\n );\n\n protected readonly defaultIcon = computed(\n () => TOAST_ICONS[this.item().variant],\n );\n\n protected readonly a11yRole = computed(() => {\n const v = this.item().variant;\n return v === 'warning' || v === 'danger' ? 'alert' : 'status';\n });\n\n protected readonly a11yLive = computed(() => {\n const v = this.item().variant;\n return v === 'warning' || v === 'danger' ? 'assertive' : 'polite';\n });\n\n protected readonly shellClass = computed(\n () =>\n 'africanies-toast-enter relative flex w-full overflow-hidden rounded-lg border border-border ' +\n 'bg-white/95 text-ink shadow-lg backdrop-blur-md ' +\n 'dark:border-white/15 dark:bg-ink/95 dark:text-white',\n );\n\n protected readonly accentClass = computed(\n () => `w-1 shrink-0 self-stretch ${accentFill(this.item().variant)}`,\n );\n\n protected readonly iconClass = computed(() => {\n switch (this.item().variant) {\n case 'success':\n return 'text-export dark:text-export-light';\n case 'warning':\n return 'text-warning-dark dark:text-warning';\n case 'danger':\n return 'text-danger';\n default:\n return 'text-ink-blue dark:text-neutral-300';\n }\n });\n\n protected readonly titleClass = computed(() => {\n const base = 'm-0 break-words text-body-sm font-semibold';\n switch (this.item().variant) {\n case 'success':\n return `${base} text-export dark:text-export-light`;\n case 'warning':\n return `${base} text-warning-dark dark:text-warning`;\n case 'danger':\n return `${base} text-danger`;\n default:\n return `${base} text-ink dark:text-white`;\n }\n });\n\n protected readonly railFillClass = computed(() =>\n railFill(this.item().variant),\n );\n\n protected onPause(): void {\n this.isPaused.set(true);\n this.paused.emit();\n }\n\n protected onResume(): void {\n this.isPaused.set(false);\n this.resumed.emit();\n }\n}\n\n/**\n * @param variant - Toast tone.\n * @returns Accent bar fill.\n */\nfunction accentFill(variant: ToastVariant): string {\n switch (variant) {\n case 'success':\n return 'bg-export';\n case 'warning':\n return 'bg-warning';\n case 'danger':\n return 'bg-danger';\n default:\n return 'bg-neutral-400';\n }\n}\n\n/**\n * @param variant - Toast tone.\n * @returns Progress rail fill class.\n */\nfunction railFill(variant: ToastVariant): string {\n return accentFill(variant);\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\n\nimport { ButtonComponent } from '../button/button.component';\nimport { ToastService } from './toast.service';\nimport type { ToastItem } from './toast.types';\nimport { ToastItemComponent } from './toast-item.component';\n\n/**\n * Fixed stack host attached once by {@link ToastService.ensureHost}.\n * Caps to the viewport and scrolls when the stack (or an expanded group)\n * would otherwise run off-screen.\n */\n@Component({\n selector: 'africanies-toast-host',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ToastItemComponent, ButtonComponent],\n host: {\n class:\n 'africanies-overlay-scroll pointer-events-auto block min-h-0 w-[min(calc(100%-2rem),24rem)] max-h-[calc(100dvh-2rem)] overflow-y-auto overflow-x-hidden overscroll-contain',\n role: 'region',\n 'aria-label': 'Notifications',\n },\n template: `\n <div class=\"flex w-full flex-col gap-2\">\n @if (toastService.showHostActions()) {\n <div\n class=\"sticky top-0 z-10 flex flex-wrap justify-end gap-2 bg-white/80 pb-1 backdrop-blur-sm dark:bg-ink/80\"\n >\n @if (toastService.hasStacks()) {\n @if (toastService.allStacksExpanded()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n class=\"!min-h-0 !rounded-full !bg-white !px-2.5 !py-1 !text-caption dark:!bg-ink\"\n (click)=\"toastService.collapseAll()\"\n >\n Collapse all\n </button>\n } @else {\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n class=\"!min-h-0 !rounded-full !bg-white !px-2.5 !py-1 !text-caption dark:!bg-ink\"\n (click)=\"toastService.expandAll()\"\n >\n Expand all\n </button>\n }\n }\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n class=\"!min-h-0 !rounded-full !bg-white !px-2.5 !py-1 !text-caption dark:!bg-ink\"\n (click)=\"toastService.clear()\"\n >\n Close all\n </button>\n </div>\n }\n @for (toast of toasts(); track trackToast(toast)) {\n <africanies-toast-item\n [item]=\"toast\"\n (dismissOne)=\"toastService.dismissOne(toast.id)\"\n (dismissAll)=\"toastService.dismiss(toast.id)\"\n (expand)=\"toastService.expand(toast.id)\"\n (collapse)=\"toastService.collapse(toast.id)\"\n (paused)=\"toastService.pause(toast.id)\"\n (resumed)=\"toastService.resume(toast.id)\"\n />\n }\n </div>\n `,\n})\nexport class ToastHostComponent {\n protected readonly toastService = inject(ToastService);\n protected readonly toasts = this.toastService.items;\n\n /**\n * Include createdAt / count / expanded so views remount when the stack changes.\n *\n * @param toast - Stack entry.\n * @returns Track key.\n */\n protected trackToast(toast: ToastItem): string {\n return `${toast.id}:${toast.createdAt}:${toast.count}:${toast.expanded}`;\n }\n}\n","import { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n computed,\n DestroyRef,\n inject,\n Injectable,\n Injector,\n signal,\n} from '@angular/core';\n\nimport type { AfricaniesHttpToastHandler } from '@africanies/africanies-core';\n\nimport {\n TOAST_DURATION_MS,\n toastFingerprint,\n type ToastItem,\n type ToastShowOptions,\n type ToastVariant,\n} from './toast.types';\nimport { ToastHostComponent } from './toast-host.component';\n\n/**\n * Above the CDK overlay default (`z-index: 1000` on container, pane, and\n * backdrop). Only applies when overlays are not in the popover top layer.\n */\nconst TOAST_OVERLAY_Z_INDEX = '1100';\n\n/** Popover API subset — typed locally so older DOM libs still compile. */\ntype PopoverToggles = {\n showPopover?: () => void;\n hidePopover?: () => void;\n};\n\n/**\n * Imperative toast stack for AFRICANIES apps.\n *\n * - **danger** — persistent until the user closes it\n * - **warning** — longer auto-dismiss (8s)\n * - **info / success** — shorter auto-dismiss (4.5s)\n * - Identical toasts collapse with a count; close removes the outermost copy,\n * with Expand / Close all when stacked\n * - The host caps to the viewport and scrolls when the list would overflow\n *\n * Also implements {@link AfricaniesHttpToastHandler} for {@link withToast} HTTP tagging.\n *\n * Prefer {@link provideAfricaniesToasts} at bootstrap so the host overlay mounts once.\n */\n@Injectable()\nexport class ToastService implements AfricaniesHttpToastHandler {\n private readonly overlay = inject(Overlay);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly itemsSignal = signal<ToastItem[]>([]);\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly fingerprints = new Map<string, string>();\n private host: HTMLElement | null = null;\n private hostAttached = false;\n private seq = 0;\n\n /** Live stack (newest first). */\n readonly items = this.itemsSignal.asReadonly();\n\n /** True when any group has more than one collapsed copy. */\n readonly hasStacks = computed(() =>\n this.itemsSignal().some((t) => t.count > 1),\n );\n\n /**\n * Host toolbar (Close all, plus Expand/Collapse all when stacked).\n * Shown for a stacked group or more than one toast in the list.\n */\n readonly showHostActions = computed(() => {\n const items = this.itemsSignal();\n return items.length > 1 || items.some((t) => t.count > 1);\n });\n\n /**\n * True when every stacked group (count &gt; 1) is expanded.\n * Used to swap the host control to “Collapse all”.\n */\n readonly allStacksExpanded = computed(() => {\n const stacks = this.itemsSignal().filter((t) => t.count > 1);\n return stacks.length > 0 && stacks.every((t) => t.expanded);\n });\n\n /**\n * Ensures the fixed toast host is attached (idempotent).\n * Called from {@link provideAfricaniesToasts}.\n */\n ensureHost(): void {\n if (this.hostAttached || typeof document === 'undefined') {\n return;\n }\n const ref = this.overlay.create({\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.noop(),\n positionStrategy: this.overlay\n .position()\n .global()\n .top('1rem')\n .right('1rem'),\n panelClass: [\n 'africanies-toast-panel',\n 'pointer-events-none',\n '!w-[min(calc(100%-2rem),24rem)]',\n 'max-w-[min(calc(100%-2rem),24rem)]',\n '!max-h-[calc(100dvh-2rem)]',\n ],\n });\n // Fallback for overlays outside the popover top layer, where CDK panes and\n // backdrops sit at z-index 1000 inside `@layer cdk-overlay`.\n ref.hostElement.classList.add('africanies-toast-overlay');\n ref.hostElement.style.zIndex = TOAST_OVERLAY_Z_INDEX;\n ref.attach(new ComponentPortal(ToastHostComponent, null, this.injector));\n this.host = ref.hostElement;\n this.hostAttached = true;\n this.watchOverlayStack(ref.hostElement);\n }\n\n /**\n * Push a toast (or bump count if an identical one is already open).\n *\n * @param options - Message + optional variant / duration / title.\n * @returns Toast id (stable across collapse bumps).\n */\n show(options: ToastShowOptions): string {\n this.ensureHost();\n this.raiseToTop();\n const variant: ToastVariant = options.variant ?? 'info';\n const message = options.message.trim();\n if (!message) {\n return '';\n }\n const title = options.title?.trim() || undefined;\n const durationMs =\n options.durationMs === undefined\n ? TOAST_DURATION_MS[variant]\n : options.durationMs;\n\n const fp = toastFingerprint(variant, title, message);\n const existingId = this.fingerprints.get(fp);\n if (existingId) {\n const current = this.itemsSignal();\n const hit = current.find((t) => t.id === existingId);\n if (hit) {\n const bumped: ToastItem = {\n ...hit,\n count: hit.count + 1,\n createdAt: Date.now(),\n durationMs,\n };\n this.itemsSignal.set([\n bumped,\n ...current.filter((t) => t.id !== existingId),\n ]);\n this.armTimer(bumped);\n return existingId;\n }\n }\n\n const id = `africanies-toast-${++this.seq}`;\n const item: ToastItem = {\n id,\n message,\n title,\n variant,\n durationMs,\n icon: options.icon,\n count: 1,\n expanded: false,\n createdAt: Date.now(),\n };\n this.fingerprints.set(fp, id);\n this.itemsSignal.set([item, ...this.itemsSignal()]);\n this.armTimer(item);\n return id;\n }\n\n /**\n * Timed info toast.\n *\n * @param message - Body copy.\n * @param title - Optional heading.\n * @returns Toast id.\n */\n info(message: string, title?: string): string {\n return this.show({ variant: 'info', message, title });\n }\n\n /**\n * Timed success toast.\n *\n * @param message - Body copy.\n * @param title - Optional heading.\n * @returns Toast id.\n */\n success(message: string, title?: string): string {\n return this.show({ variant: 'success', message, title });\n }\n\n /**\n * Longer timed warning toast.\n *\n * @param message - Body copy.\n * @param title - Optional heading.\n * @returns Toast id.\n */\n warning(message: string, title?: string): string {\n return this.show({ variant: 'warning', message, title });\n }\n\n /**\n * Persistent error toast — user must dismiss.\n *\n * @param message - Body copy.\n * @param title - Optional heading.\n * @returns Toast id.\n */\n error(message: string, title?: string): string {\n return this.show({ variant: 'danger', message, title });\n }\n\n /**\n * Close the outermost copy in a stack (decrement count), or remove the toast\n * when only one remains.\n *\n * @param id - From {@link show}.\n */\n dismissOne(id: string): void {\n const item = this.itemsSignal().find((t) => t.id === id);\n if (!item) {\n return;\n }\n if (item.count <= 1) {\n this.teardown(id);\n return;\n }\n const nextCount = item.count - 1;\n const next: ToastItem = {\n ...item,\n count: nextCount,\n expanded: item.expanded && nextCount > 1,\n createdAt: Date.now(),\n };\n this.itemsSignal.update((list) =>\n list.map((t) => (t.id === id ? next : t)),\n );\n this.armTimer(next);\n }\n\n /**\n * Remove an entire toast group (all stacked copies).\n *\n * @param id - From {@link show}.\n */\n dismiss(id: string): void {\n this.teardown(id);\n }\n\n /**\n * Expand a collapsed stack so every copy is visible.\n *\n * @param id - From {@link show}.\n */\n expand(id: string): void {\n this.itemsSignal.update((list) =>\n list.map((t) =>\n t.id === id && t.count > 1 ? { ...t, expanded: true } : t,\n ),\n );\n }\n\n /**\n * Collapse an expanded stack back to a single card with a count.\n *\n * @param id - From {@link show}.\n */\n collapse(id: string): void {\n this.itemsSignal.update((list) =>\n list.map((t) => (t.id === id ? { ...t, expanded: false } : t)),\n );\n }\n\n /** Expand every stacked group (count &gt; 1). */\n expandAll(): void {\n this.itemsSignal.update((list) =>\n list.map((t) => (t.count > 1 ? { ...t, expanded: true } : t)),\n );\n }\n\n /** Collapse every expanded group. */\n collapseAll(): void {\n this.itemsSignal.update((list) =>\n list.map((t) => ({ ...t, expanded: false })),\n );\n }\n\n /** Dismiss every open toast. */\n clear(): void {\n for (const id of [...this.timers.keys()]) {\n this.clearTimer(id);\n }\n this.fingerprints.clear();\n this.itemsSignal.set([]);\n }\n\n /**\n * Pause auto-dismiss while hovered / focused (timed toasts only).\n *\n * @param id - Toast id.\n */\n pause(id: string): void {\n this.clearTimer(id);\n }\n\n /**\n * Resume auto-dismiss after pause (timed toasts only).\n *\n * @param id - Toast id.\n */\n resume(id: string): void {\n const item = this.itemsSignal().find((t) => t.id === id);\n if (item) {\n this.armTimer(item);\n }\n }\n\n /**\n * Move the toast host back to the front of the popover top layer.\n *\n * WHY: CDK opens overlays as `popover=\"manual\"` elements. The top layer\n * ignores z-index and paints in `showPopover()` order, so a dialog opened\n * after the toast host would cover it.\n */\n private raiseToTop(): void {\n const host = this.host as (HTMLElement & PopoverToggles) | null;\n if (!host?.hidePopover || !host.showPopover) {\n return;\n }\n try {\n if (host.matches(':popover-open')) {\n host.hidePopover();\n host.showPopover();\n }\n } catch {\n // Browser refused the toggle — the z-index fallback still applies.\n }\n }\n\n /**\n * Re-raise the toast host whenever another overlay attaches, so an open\n * toast stays visible when a dialog or drawer opens after it.\n *\n * @param host - Toast overlay host element.\n */\n private watchOverlayStack(host: HTMLElement): void {\n const container = host.parentElement;\n if (!container || typeof MutationObserver === 'undefined') {\n return;\n }\n\n const observer = new MutationObserver((records) => {\n const overlayOpened = records.some((record) =>\n Array.from(record.addedNodes).some((node) => node !== host),\n );\n if (overlayOpened) {\n this.raiseToTop();\n }\n });\n\n observer.observe(container, { childList: true });\n this.destroyRef.onDestroy(() => observer.disconnect());\n }\n\n private armTimer(item: ToastItem): void {\n this.clearTimer(item.id);\n if (item.durationMs == null || item.durationMs <= 0) {\n return;\n }\n const ms = item.durationMs;\n // Timed stacks dismiss one copy at a time so the pile peels down.\n this.timers.set(\n item.id,\n setTimeout(() => this.dismissOne(item.id), ms),\n );\n }\n\n private teardown(id: string): void {\n this.clearTimer(id);\n for (const [fp, toastId] of this.fingerprints) {\n if (toastId === id) {\n this.fingerprints.delete(fp);\n break;\n }\n }\n this.itemsSignal.update((list) => list.filter((t) => t.id !== id));\n }\n\n private clearTimer(id: string): void {\n const t = this.timers.get(id);\n if (t) {\n clearTimeout(t);\n this.timers.delete(id);\n }\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\n\nimport { copyToClipboard } from '@africanies/africanies-core';\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport { ButtonComponent, type ButtonSize } from '../button/button.component';\nimport { ToastService } from '../toast/toast.service';\n\n/**\n * Icon button that copies {@link value} to the clipboard.\n *\n * Shows `copy` → `check` while feedback is visible. Optional toast when\n * {@link ToastService} is registered via `provideAfricaniesToasts()`.\n *\n * @example\n * ```html\n * <africanies-copy [value]=\"row.reference\" />\n * <africanies-copy [value]=\"snippet\" label=\"Copy code\" />\n * <africanies-copy [value]=\"ref\" ariaLabel=\"Copy reference\" [announce]=\"true\" />\n * ```\n */\n@Component({\n selector: 'africanies-copy',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ButtonComponent, AfricaniesIconComponent],\n template: `\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n [size]=\"size()\"\n [disabled]=\"busy()\"\n [class]=\"buttonClass()\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n [title]=\"resolvedAriaLabel()\"\n (click)=\"onCopy()\"\n >\n <africanies-icon [name]=\"showCopied() ? 'check' : 'copy'\" [size]=\"iconSize()\" />\n @if (label(); as text) {\n <span>{{ showCopied() ? copiedLabel() : text }}</span>\n }\n </button>\n `,\n})\nexport class CopyButtonComponent {\n private readonly toastService = inject(ToastService, { optional: true });\n\n /** Plain text written to the clipboard. */\n readonly value = input.required<string>();\n\n /**\n * Optional visible label beside the icon. When omitted, the control is\n * icon-only (use {@link ariaLabel} for accessibility).\n */\n readonly label = input<string | undefined>(undefined);\n\n /** Label while the success checkmark is showing. Defaults to `Copied`. */\n readonly copiedLabel = input('Copied');\n\n /**\n * Accessible name. Defaults to `Copy` / `Copied` from the label state, or\n * `Copy to clipboard` when icon-only.\n */\n readonly ariaLabel = input<string | undefined>(undefined);\n\n /** Extra classes on the inner `africanies-button` (e.g. inverted code headers). */\n readonly buttonClass = input('');\n\n /** Button size. Defaults to `sm`. */\n readonly size = input<ButtonSize>('sm');\n\n /** How long the checkmark / “Copied” label stays (ms). Defaults to 1600. */\n readonly feedbackMs = input(1600, { transform: numberAttribute });\n\n /**\n * When true and {@link ToastService} is available, show a success toast with\n * the copied value (truncated when long).\n */\n readonly announce = input(false, { transform: booleanAttribute });\n\n /** Emitted after a successful clipboard write. */\n readonly copied = output<string>();\n\n /** Emitted when the clipboard write fails. */\n readonly failed = output<void>();\n\n protected readonly busy = signal(false);\n protected readonly showCopied = signal(false);\n\n private feedbackTimer: ReturnType<typeof setTimeout> | null = null;\n\n protected readonly iconSize = computed(() => (this.size() === 'lg' ? 18 : 14));\n\n protected readonly resolvedAriaLabel = computed(() => {\n const explicit = this.ariaLabel();\n if (explicit) {\n return this.showCopied() ? 'Copied' : explicit;\n }\n const label = this.label();\n if (label) {\n return this.showCopied() ? this.copiedLabel() : label;\n }\n return this.showCopied() ? 'Copied' : 'Copy to clipboard';\n });\n\n /**\n * Copy {@link value} and flip the icon to a checkmark on success.\n */\n protected async onCopy(): Promise<void> {\n if (this.busy()) {\n return;\n }\n const text = this.value();\n this.busy.set(true);\n try {\n const ok = await copyToClipboard(text);\n if (!ok) {\n this.failed.emit();\n this.toastService?.error('Could not copy to the clipboard.');\n return;\n }\n this.flashCopied();\n this.copied.emit(text);\n if (this.announce() && this.toastService) {\n const preview =\n text.length > 64 ? `${text.slice(0, 61).trimEnd()}…` : text;\n this.toastService.success(`Copied ${preview}`);\n }\n } finally {\n this.busy.set(false);\n }\n }\n\n private flashCopied(): void {\n this.showCopied.set(true);\n if (this.feedbackTimer) {\n clearTimeout(this.feedbackTimer);\n }\n this.feedbackTimer = setTimeout(() => {\n this.showCopied.set(false);\n this.feedbackTimer = null;\n }, this.feedbackMs());\n }\n}\n","/**\n * Clipboard copy control (`africanies-copy`).\n */\nexport { CopyButtonComponent } from './copy-button.component';\n","import type { IsActiveMatchOptions, Router, UrlTree } from '@angular/router';\n\nimport type { AfricaniesNavItem } from './nav-item';\n\n/** Minimal shape needed to build a UrlTree (tabs, segment, side-nav). */\nexport type NavRouteTarget = Pick<\n AfricaniesNavItem,\n 'routerLink' | 'queryParams' | 'fragment'\n>;\n\n/**\n * Builds a {@link UrlTree} for an item’s `routerLink` / query / fragment.\n *\n * @param router - Consumer app router.\n * @param item - Nav item with a `routerLink`.\n * @returns UrlTree, or `null` when the item is not routed.\n */\nexport function navItemUrlTree(\n router: Router,\n item: NavRouteTarget,\n): UrlTree | null {\n if (item.routerLink == null) {\n return null;\n }\n const commands = Array.isArray(item.routerLink)\n ? [...item.routerLink]\n : [item.routerLink];\n return router.createUrlTree(commands, {\n queryParams: item.queryParams,\n fragment: item.fragment,\n });\n}\n\n/**\n * Whether the current router URL matches this item (cold load + navigations).\n *\n * @param router - Consumer app router.\n * @param item - Nav item with a `routerLink`.\n * @param options - Same shape as `RouterLinkActive` options.\n * @returns True when the current URL matches the item.\n */\nexport function isNavItemActive(\n router: Router,\n item: NavRouteTarget,\n options: IsActiveMatchOptions,\n): boolean {\n const tree = navItemUrlTree(router, item);\n if (!tree) {\n return false;\n }\n return router.isActive(tree, options);\n}\n","import type { Router, UrlTree } from '@angular/router';\n\nimport type { NavRouteTarget } from './nav-router.util';\nimport { navItemUrlTree } from './nav-router.util';\n\n/**\n * Whether a click should leave navigation to the browser (new tab, etc.).\n * @param event - Mouse click from a routed nav control.\n * @returns True when the host should not call `preventDefault` / navigate.\n */\nexport function isModifiedClick(event: MouseEvent): boolean {\n return (\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n );\n}\n\n/**\n * Serialized href for a routed nav item (for `<a href>` without RouterLink).\n * @param router - App router.\n * @param item - Nav item with `routerLink`.\n * @returns Path string, or `null` when the item is not routed.\n */\nexport function navItemHref(\n router: Router,\n item: NavRouteTarget,\n): string | null {\n const tree = navItemUrlTree(router, item);\n return tree ? router.serializeUrl(tree) : null;\n}\n\n/**\n * Navigate to a nav item without jumping the viewport to the top.\n *\n * Apps that enable `withInMemoryScrolling({ scrollPositionRestoration:\n * 'enabled' })` scroll to `[0, 0]` on every forward navigation. That is wrong\n * for in-page tabs/segments. Passing `{ scroll: 'manual' }` tells Angular's\n * RouterScroller to skip scrolling for this navigation.\n *\n * @param router - App router.\n * @param item - Nav item with `routerLink`.\n * @param keepScroll - When true (default for tabs/segments), skip router scroll.\n * @returns Navigation promise, or `null` when the item is not routed.\n */\nexport function navigateNavItem(\n router: Router,\n item: NavRouteTarget,\n keepScroll = true,\n): Promise<boolean> | null {\n const tree: UrlTree | null = navItemUrlTree(router, item);\n if (!tree) {\n return null;\n }\n return router.navigateByUrl(\n tree,\n keepScroll ? { scroll: 'manual' } : undefined,\n );\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks projected content as the custom trigger for {@link ActionMenuComponent}.\n *\n * @example\n * ```html\n * <africanies-action-menu [items]=\"items\">\n * <button type=\"button\" africanies-button africaniesActionMenuTrigger variant=\"secondary\" size=\"sm\">\n * More\n * </button>\n * </africanies-action-menu>\n * ```\n */\n@Directive({\n selector: '[africaniesActionMenuTrigger]',\n standalone: true,\n})\nexport class ActionMenuTriggerDirective {}\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n type ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../button/button.component';\nimport {\n isModifiedClick,\n navigateNavItem,\n navItemHref,\n} from '../navigation/navigate-nav-item';\nimport { ActionMenuTriggerDirective } from './action-menu-trigger.directive';\nimport type { AfricaniesMenuItem } from './menu-item';\n\n/** Preferred panel placement — end-aligned under the trigger, then flip. */\nconst MENU_PANEL_POSITIONS: ConnectedPosition[] = [\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 4,\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -4,\n },\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 4,\n },\n];\n\n/**\n * Compact overflow menu for row and toolbar actions.\n *\n * Opens a CDK connected overlay (same pattern as select) so the panel is not\n * clipped by table `overflow`. Default trigger is a ghost ellipsis button;\n * project a custom control with {@link ActionMenuTriggerDirective}.\n *\n * Items with {@link AfricaniesMenuItem.routerLink} render as anchors so users\n * can right-click / modified-click to open in a new tab.\n *\n * @example\n * ```html\n * <!-- Default icon trigger (table row) -->\n * <africanies-action-menu [items]=\"rowActions(row)\" />\n *\n * <!-- Custom trigger -->\n * <africanies-action-menu [items]=\"toolbarActions\">\n * <button type=\"button\" africanies-button africaniesActionMenuTrigger variant=\"secondary\" size=\"sm\">\n * Actions\n * </button>\n * </africanies-action-menu>\n * ```\n * ```ts\n * rowActions(row: Shipment): AfricaniesMenuItem[] {\n * return [\n * {\n * label: 'Open',\n * icon: 'eye',\n * routerLink: ['/shipments', row.id],\n * onClick: () => this.open(row),\n * },\n * { label: 'Edit', icon: 'edit', onClick: () => this.edit(row) },\n * {\n * label: 'Delete',\n * icon: 'trash',\n * danger: true,\n * dividerBefore: true,\n * onClick: () => this.delete(row),\n * },\n * ];\n * }\n * ```\n */\n@Component({\n selector: 'africanies-action-menu',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AfricaniesIconComponent,\n ButtonComponent,\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n ],\n template: `\n <span\n class=\"inline-flex\"\n cdkOverlayOrigin\n #triggerOrigin=\"cdkOverlayOrigin\"\n >\n <!--\n Always project so Angular registers the trigger directive.\n Key/click bubble from the projected control — that child owns focus.\n -->\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n <span\n class=\"inline-flex\"\n [class.hidden]=\"!hasCustomTrigger()\"\n (click)=\"onTriggerClick($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <ng-content select=\"[africaniesActionMenuTrigger]\" />\n </span>\n\n @if (!hasCustomTrigger()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"onTriggerClick($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <africanies-icon name=\"ellipsis-v\" [size]=\"16\" />\n </button>\n }\n </span>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"panelPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n (detach)=\"onOverlayDetach()\"\n >\n <div\n #panel\n class=\"min-w-44 rounded-md border border-border bg-white py-1 shadow-lg outline-none dark:border-white/15 dark:bg-ink-950\"\n role=\"menu\"\n tabindex=\"-1\"\n [attr.aria-label]=\"ariaLabel()\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n @for (item of items(); track $index; let i = $index) {\n @if (item.dividerBefore) {\n <div\n class=\"my-1 border-t border-border dark:border-white/10\"\n role=\"separator\"\n ></div>\n }\n @if (item.routerLink !== null && item.routerLink !== undefined) {\n <a\n role=\"menuitem\"\n [id]=\"itemDomId(i)\"\n [class]=\"itemClass(item, i)\"\n [attr.href]=\"item.disabled ? null : hrefFor(item)\"\n [attr.aria-disabled]=\"item.disabled ? true : null\"\n (click)=\"onRoutedItemClick($event, item)\"\n (mouseenter)=\"activeIndex.set(i)\"\n >\n @if (item.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"16\" class=\"shrink-0\" />\n }\n <span class=\"min-w-0 flex-1 truncate text-left\">{{\n item.label\n }}</span>\n </a>\n } @else {\n <button\n type=\"button\"\n role=\"menuitem\"\n [id]=\"itemDomId(i)\"\n [class]=\"itemClass(item, i)\"\n [disabled]=\"!!item.disabled\"\n (click)=\"selectItem(item)\"\n (mouseenter)=\"activeIndex.set(i)\"\n >\n @if (item.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"16\" class=\"shrink-0\" />\n }\n <span class=\"min-w-0 flex-1 truncate text-left\">{{\n item.label\n }}</span>\n </button>\n }\n }\n </div>\n </ng-template>\n `,\n})\nexport class ActionMenuComponent {\n private readonly router = inject(Router);\n\n protected readonly panelPositions = MENU_PANEL_POSITIONS;\n\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n private readonly projectedTrigger = contentChild(ActionMenuTriggerDirective);\n\n /** Menu options. */\n readonly items = input.required<AfricaniesMenuItem[]>();\n\n /** Accessible name for the trigger / menu. */\n readonly ariaLabel = input('Actions');\n\n /** When true, the default trigger cannot open the menu. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly open = signal(false);\n protected readonly activeIndex = signal(0);\n\n private readonly menuId = `africanies-menu-${++nextMenuId}`;\n\n protected readonly hasCustomTrigger = computed(\n () => this.projectedTrigger() != null,\n );\n\n protected itemDomId(index: number): string {\n return `${this.menuId}-item-${index}`;\n }\n\n protected itemClass(item: AfricaniesMenuItem, index: number): string {\n const active = this.activeIndex() === index;\n const base =\n 'flex w-full cursor-pointer items-center gap-2 px-3 py-2 text-body-sm no-underline transition-colors ' +\n 'disabled:cursor-not-allowed disabled:opacity-50 ' +\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ink';\n if (item.danger) {\n return (\n `${base} text-danger ` +\n (active\n ? 'bg-danger-subtle dark:bg-danger/15'\n : 'hover:bg-danger-subtle dark:hover:bg-danger/15')\n );\n }\n return (\n `${base} text-ink dark:text-white ` +\n (active\n ? 'bg-background-welcome dark:bg-white/10'\n : 'hover:bg-background-welcome dark:hover:bg-white/10')\n );\n }\n\n protected hrefFor(item: AfricaniesMenuItem): string | null {\n return navItemHref(this.router, item);\n }\n\n protected onTriggerClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.disabled()) {\n return;\n }\n this.toggle();\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.disabled()) {\n return;\n }\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openMenu();\n }\n }\n\n protected onPanelKeydown(event: KeyboardEvent): void {\n const enabled = this.enabledIndexes();\n if (!enabled.length) {\n return;\n }\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.moveActive(1, enabled);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveActive(-1, enabled);\n break;\n case 'Home': {\n event.preventDefault();\n const first = enabled[0];\n if (first !== undefined) {\n this.activeIndex.set(first);\n }\n break;\n }\n case 'End': {\n event.preventDefault();\n const last = enabled[enabled.length - 1];\n if (last !== undefined) {\n this.activeIndex.set(last);\n }\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n const item = this.items()[this.activeIndex()];\n if (item && !item.disabled) {\n this.selectItem(item);\n }\n break;\n }\n default:\n break;\n }\n }\n\n protected onOutsideClick(event: MouseEvent): void {\n const target = event.target as Node | null;\n if (target && this.panelRef()?.nativeElement.contains(target)) {\n return;\n }\n this.close();\n }\n\n protected onOverlayDetach(): void {\n this.open.set(false);\n }\n\n /**\n * Primary click on a routed item: in-app activate via {@link onClick} or\n * router. Modified clicks keep native link behaviour (new tab).\n */\n protected onRoutedItemClick(event: MouseEvent, item: AfricaniesMenuItem): void {\n if (item.disabled) {\n event.preventDefault();\n return;\n }\n if (isModifiedClick(event)) {\n this.close();\n return;\n }\n event.preventDefault();\n this.activateItem(item);\n }\n\n protected selectItem(item: AfricaniesMenuItem): void {\n if (item.disabled) {\n return;\n }\n this.activateItem(item);\n }\n\n private activateItem(item: AfricaniesMenuItem): void {\n if (item.onClick) {\n item.onClick();\n } else if (item.routerLink != null) {\n void navigateNavItem(this.router, item, false);\n }\n this.close();\n }\n\n protected toggle(): void {\n if (this.open()) {\n this.close();\n } else {\n this.openMenu();\n }\n }\n\n protected openMenu(): void {\n const enabled = this.enabledIndexes();\n this.activeIndex.set(enabled[0] ?? 0);\n this.open.set(true);\n queueMicrotask(() => this.panelRef()?.nativeElement.focus());\n }\n\n protected close(): void {\n this.open.set(false);\n }\n\n private enabledIndexes(): number[] {\n return this.items()\n .map((item, i) => (item.disabled ? -1 : i))\n .filter((i) => i >= 0);\n }\n\n private moveActive(delta: number, enabled: number[]): void {\n if (enabled.length === 0) {\n return;\n }\n const currentPos = enabled.indexOf(this.activeIndex());\n const start = currentPos < 0 ? 0 : currentPos;\n const next = enabled[(start + delta + enabled.length) % enabled.length];\n if (next !== undefined) {\n this.activeIndex.set(next);\n }\n }\n}\n\nlet nextMenuId = 0;\n","/**\n * Action / overflow menu for row and toolbar actions.\n */\nexport { ActionMenuComponent } from './action-menu.component';\nexport { ActionMenuTriggerDirective } from './action-menu-trigger.directive';\nexport type { AfricaniesMenuItem } from './menu-item';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../button/button.component';\n\n/**\n * Blocking empty state when a fetch succeeded but produced no rows / value.\n *\n * Retry is **always** present because \"no results\" often changes after a\n * filter reset or fresh fetch. Omitting a `(retry)` handler is a misuse of\n * this component, not a supported configuration.\n *\n * @example\n * ```html\n * <africanies-empty-state\n * message=\"No shipments match these filters.\"\n * (retry)=\"resetFilters()\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-empty-state',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, ButtonComponent],\n template: `\n <div\n class=\"flex flex-col items-center justify-center gap-3 py-10 px-4 text-center text-ink dark:text-white\"\n role=\"status\"\n >\n <africanies-icon name=\"inbox\" [size]=\"32\" class=\"text-neutral-400\" />\n <p class=\"m-0 text-body text-neutral-600 dark:text-neutral-400 max-w-md\">{{ message() }}</p>\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"refreshing()\"\n (click)=\"retry.emit()\"\n >\n <africanies-icon\n name=\"refresh\"\n [size]=\"16\"\n [class]=\"refreshing() ? 'animate-spin' : ''\"\n />\n Retry\n </button>\n </div>\n `,\n})\nexport class EmptyStateComponent {\n /**\n * Empty-copy. Defaults to a generic phrase; override for filter-specific help.\n */\n readonly message = input('No results found.');\n\n /**\n * Background refetch in flight — spins the refresh icon and disables Retry.\n */\n readonly refreshing = input(false, { transform: booleanAttribute });\n\n /**\n * Emitted when the user activates Retry.\n *\n * Always wire a handler — omitting `(retry)` is a misuse, not a valid\n * \"static empty illustration\" mode.\n */\n readonly retry = output<void>();\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\n\nimport { ButtonComponent } from '../button/button.component';\n\n/**\n * Compact error pill for non-blocking failures while stale data stays visible —\n * distinct from {@link ErrorStateComponent} (full-section blocking).\n *\n * Parent owns placement — typically a flex row above the content\n * (`class=\"flex justify-end\"` with `max-w-[min(100%,20rem)]` on the indicator).\n * Renders nothing when {@link error} is null, undefined, or whitespace-only.\n *\n * @example\n * ```html\n * <div class=\"flex flex-col gap-3\">\n * <div class=\"flex justify-end\">\n * <africanies-error-indicator\n * class=\"max-w-[min(100%,20rem)]\"\n * error=\"Failed to fetch the most recent data.\"\n * retryText=\"Refresh\"\n * [refreshing]=\"isRefreshing()\"\n * (retry)=\"refetch()\"\n * />\n * </div>\n * <africanies-table [rows]=\"rows()\" />\n * </div>\n * ```\n */\n@Component({\n selector: 'africanies-error-indicator',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ButtonComponent],\n host: {\n class: 'africanies-error-indicator block',\n },\n styles: [\n `\n @keyframes africanies-error-indicator-enter {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n @keyframes africanies-error-indicator-dot-pulse {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 0.7;\n }\n 50% {\n transform: scale(1.3);\n opacity: 1;\n }\n }\n\n @keyframes africanies-error-indicator-dot-ping {\n 0% {\n transform: scale(1);\n opacity: 0.75;\n }\n 70%,\n 100% {\n transform: scale(2);\n opacity: 0;\n }\n }\n\n .africanies-error-indicator-pill {\n animation: africanies-error-indicator-enter 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n .africanies-error-indicator-dot-ping {\n animation: africanies-error-indicator-dot-ping 1.5s cubic-bezier(0, 0, 0.2, 1)\n infinite;\n }\n\n .africanies-error-indicator-dot-core {\n animation: africanies-error-indicator-dot-pulse 1.5s ease-in-out infinite\n alternate;\n }\n\n .africanies-error-indicator-retry:not(:disabled) {\n transition: transform 0.15s ease;\n }\n\n .africanies-error-indicator-retry:not(:disabled):hover {\n transform: scale(1.05);\n }\n\n .africanies-error-indicator-retry:not(:disabled):active {\n transform: scale(0.95);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .africanies-error-indicator-pill,\n .africanies-error-indicator-dot-ping,\n .africanies-error-indicator-dot-core,\n .africanies-error-indicator-retry:not(:disabled) {\n animation: none;\n transition: none;\n }\n\n .africanies-error-indicator-retry:not(:disabled):hover,\n .africanies-error-indicator-retry:not(:disabled):active {\n transform: none;\n }\n }\n `,\n ],\n template: `\n @if (visible()) {\n <div\n class=\"africanies-error-indicator-pill inline-flex max-w-full items-center gap-2 rounded-full bg-danger-subtle px-3 py-1 shadow-sm dark:bg-red-900/20\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n <span\n class=\"relative inline-flex size-3 shrink-0 items-center justify-center\"\n aria-hidden=\"true\"\n >\n <span\n class=\"africanies-error-indicator-dot-ping absolute inset-0 rounded-full bg-red-400 opacity-75\"\n ></span>\n <span\n class=\"africanies-error-indicator-dot-core relative size-3 rounded-full bg-red-500\"\n ></span>\n </span>\n\n <span\n class=\"min-w-0 flex-1 text-caption font-medium leading-snug text-ink dark:text-white\"\n >\n {{ message() }}\n </span>\n\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"africanies-error-indicator-retry shrink-0 !min-h-0 !border-transparent !bg-transparent !px-1.5 !py-0.5 !text-danger hover:!bg-danger/10 dark:hover:!bg-danger/20\"\n [class.opacity-50]=\"disabled()\"\n [disabled]=\"disabled()\"\n (click)=\"onRetry()\"\n >\n {{ actionLabel() }}\n </button>\n </div>\n }\n `,\n})\nexport class ErrorIndicatorComponent {\n /**\n * Error copy. When empty, the indicator is not shown.\n */\n readonly error = input<string | null | undefined>(undefined);\n\n /**\n * Retry button label when not {@link refreshing}.\n */\n readonly retryText = input('Retry');\n\n /**\n * When true, the action label becomes a loading phrase and the button stays\n * enabled unless {@link disabled} is set.\n */\n readonly refreshing = input(false, { transform: booleanAttribute });\n\n /**\n * Loading label while {@link refreshing} is true.\n */\n readonly refreshingText = input('Loading...');\n\n /**\n * Disables the retry control and dims the label.\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Emitted when the user activates the retry control. */\n readonly retry = output<void>();\n\n protected readonly message = computed(() => {\n const text = this.error()?.trim();\n return text ? text : null;\n });\n\n protected readonly visible = computed(() => this.message() !== null);\n\n protected readonly actionLabel = computed(() =>\n this.refreshing() ? this.refreshingText() : this.retryText(),\n );\n\n protected onRetry(): void {\n if (this.disabled()) {\n return;\n }\n this.retry.emit();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../button/button.component';\n\n/**\n * Blocking error state for failed async fetches (not field validation).\n *\n * The retry control is **always** visible — there is no hide-retry toggle.\n * Omitting a `(retry)` handler is a misuse of this component, not a supported\n * configuration: failed fetches that cannot be retried should use different UI.\n *\n * @example\n * ```html\n * <africanies-error-state\n * [message]=\"errorMessage()\"\n * (retry)=\"reload()\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-error-state',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, ButtonComponent],\n template: `\n <div\n class=\"flex flex-col items-center justify-center gap-3 py-10 px-4 text-center text-ink dark:text-white\"\n role=\"alert\"\n >\n <africanies-icon name=\"warning\" [size]=\"32\" class=\"text-danger\" />\n <p class=\"m-0 text-body text-danger max-w-md\">{{ message() }}</p>\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n [disabled]=\"refreshing()\"\n (click)=\"retry.emit()\"\n >\n <africanies-icon\n name=\"refresh\"\n [size]=\"16\"\n [class]=\"refreshing() ? 'animate-spin' : ''\"\n />\n Retry\n </button>\n </div>\n `,\n})\nexport class ErrorStateComponent {\n /**\n * Human-readable failure reason. Required so the alert is never an empty\n * red box without explanation.\n */\n readonly message = input.required<string>();\n\n /**\n * Background refetch in flight — spins the refresh icon and disables Retry.\n */\n readonly refreshing = input(false, { transform: booleanAttribute });\n\n /**\n * Emitted when the user activates Retry.\n *\n * Always wire a handler — omitting `(retry)` is a misuse, not a valid\n * \"read-only error\" mode.\n */\n readonly retry = output<void>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\n/**\n * Layout density for {@link LoadingStateComponent}.\n *\n * - `block` — centered section placeholder (page / panel load)\n * - `inline` — compact row for toolbars and nested slots\n */\nexport type LoadingStateMode = 'inline' | 'block';\n\n/**\n * Blocking / inline loading indicator for async surfaces.\n *\n * Spinner accent follows {@link ModeColorService} (SFN green / STN orange).\n *\n * @example\n * ```html\n * <africanies-loading-state message=\"Loading shipments…\" />\n * <africanies-loading-state mode=\"inline\" message=\"Refreshing…\" />\n * ```\n */\n@Component({\n selector: 'africanies-loading-state',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent],\n template: `\n <div\n [class]=\"\n mode() === 'block'\n ? 'flex flex-col items-center justify-center gap-3 py-10 px-4 text-center text-ink dark:text-white'\n : 'inline-flex items-center gap-2 text-ink dark:text-white'\n \"\n role=\"status\"\n aria-live=\"polite\"\n >\n <africanies-icon\n name=\"spinner\"\n [size]=\"mode() === 'block' ? 32 : 20\"\n [class]=\"'animate-spin ' + modeColor.classes().text\"\n />\n @if (message()) {\n <p\n class=\"m-0 text-neutral-600 dark:text-neutral-400\"\n [class]=\"mode() === 'block' ? 'text-body' : 'text-body-sm'\"\n >\n {{ message() }}\n </p>\n }\n </div>\n `,\n})\nexport class LoadingStateComponent {\n protected readonly modeColor = inject(ModeColorService);\n\n /**\n * Optional status copy. Prefer a short verb phrase (\"Loading…\") so screen\n * readers hear useful context with `aria-live=\"polite\"`.\n */\n readonly message = input<string | undefined>(undefined);\n\n /**\n * Layout mode. Defaults to `block` for section-level placeholders.\n */\n readonly mode = input<LoadingStateMode>('block');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\n\nimport type { AsyncQueryStateModel } from '@africanies/africanies-models';\n\nimport { EmptyStateComponent } from './empty-state.component';\nimport { ErrorIndicatorComponent } from './error-indicator.component';\nimport { ErrorStateComponent } from './error-state.component';\nimport { LoadingStateComponent } from './loading-state.component';\n\n/**\n * View-model branch for {@link AsyncStateComponent} render order.\n *\n * Kept internal — consumers only pass {@link AsyncQueryStateModel}.\n */\ntype AsyncView =\n | { kind: 'loading' }\n | { kind: 'error'; message: string }\n | { kind: 'empty' }\n | { kind: 'content'; staleError: boolean; fetching: boolean };\n\n/**\n * Async query wrapper that maps {@link AsyncQueryStateModel} into loading / error /\n * empty / success with non-blocking badges for background activity.\n *\n * Render order (blocking first):\n * 1. `isLoading` → {@link LoadingStateComponent}\n * 2. `isError && data === undefined` → {@link ErrorStateComponent}\n * 3. empty data (empty array, or null/undefined after load) → {@link EmptyStateComponent}\n * 4. otherwise project content; never block on background refetch (hosts can\n * spin their own control, e.g. table Refresh). Keep a stale-error badge if\n * the last refresh failed.\n *\n * A single `retry` output covers blocking error/empty and the stale-data badge\n * so views wire one handler regardless of which branch fired.\n *\n * @typeParam T - Successful data shape mirrored from the query layer.\n *\n * @example\n * ```ts\n * // Map TanStack Query injectQuery() signals into AsyncQueryStateModel\n * readonly query = injectQuery(() => ({ … }));\n *\n * readonly state = computed<AsyncQueryStateModel<Shipment[]>>(() => ({\n * data: this.query.data(),\n * isLoading: this.query.isLoading(),\n * isFetching: this.query.isFetching(),\n * isError: this.query.isError(),\n * error: this.query.error()?.message ?? null,\n * }));\n * ```\n * ```html\n * <africanies-async-state [state]=\"state()\" (retry)=\"query.refetch()\">\n * <africanies-table [rows]=\"state().data!\" />\n * </africanies-async-state>\n * ```\n */\n@Component({\n selector: 'africanies-async-state',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n EmptyStateComponent,\n ErrorIndicatorComponent,\n ErrorStateComponent,\n LoadingStateComponent,\n ],\n template: `\n @switch (view().kind) {\n @case ('loading') {\n <africanies-loading-state message=\"Loading…\" />\n }\n @case ('error') {\n <africanies-error-state\n [message]=\"errorMessage()\"\n [refreshing]=\"state().isFetching\"\n (retry)=\"retry.emit()\"\n />\n }\n @case ('empty') {\n <africanies-empty-state\n [message]=\"emptyMessage()\"\n [refreshing]=\"state().isFetching\"\n (retry)=\"retry.emit()\"\n />\n }\n @case ('content') {\n <div class=\"flex flex-col gap-3\">\n @if (contentBadges(); as badges) {\n @if (badges.staleError) {\n <div class=\"flex justify-end\">\n <africanies-error-indicator\n class=\"max-w-[min(100%,20rem)]\"\n [error]=\"staleErrorCopy()\"\n retryText=\"Refresh\"\n [refreshingText]=\"staleRefreshingText()\"\n [refreshing]=\"badges.fetching\"\n (retry)=\"retry.emit()\"\n />\n </div>\n }\n }\n <ng-content />\n </div>\n }\n }\n `,\n})\nexport class AsyncStateComponent<T = unknown> {\n /**\n * Snapshot from the app's query layer (e.g. mapped `injectQuery()` signals).\n */\n readonly state = input.required<AsyncQueryStateModel<T>>();\n\n /**\n * Optional override for the blocking empty copy.\n */\n readonly emptyMessage = input('No results found.');\n\n /**\n * Copy for the non-blocking stale-data error pill (data present, refresh failed).\n */\n readonly staleErrorMessage = input(\n 'Failed to fetch the most recent data.',\n );\n\n /**\n * Retry label on the stale pill while a background refetch is in flight.\n */\n readonly staleRefreshingText = input('Refreshing...');\n\n /**\n * Single retry channel for error, empty, and stale-data badge actions.\n *\n * Always wire a handler — omitting `(retry)` is a misuse of the nested\n * error/empty states.\n */\n readonly retry = output<void>();\n\n /** Resolved blocking error message with a safe fallback. */\n protected readonly errorMessage = computed(\n () => this.state().error ?? 'Something went wrong.',\n );\n\n /**\n * Stale pill copy — prefers the query error string, then {@link staleErrorMessage}.\n */\n protected readonly staleErrorCopy = computed(() => {\n const fromState = this.state().error?.trim();\n if (fromState) {\n return fromState;\n }\n return this.staleErrorMessage();\n });\n\n /**\n * Derived branch — computed so OnPush templates only re-evaluate when\n * `state` inputs change.\n */\n protected readonly view = computed((): AsyncView => {\n const s = this.state();\n\n if (s.isLoading) {\n return { kind: 'loading' };\n }\n\n if (s.isError && s.data === undefined) {\n return { kind: 'error', message: s.error ?? 'Something went wrong.' };\n }\n\n if (isEmptyData(s.data)) {\n return { kind: 'empty' };\n }\n\n return {\n kind: 'content',\n // Stale error: we have data, but the latest refetch failed.\n staleError: s.isError,\n // Background fetch only — initial load already returned above.\n fetching: s.isFetching,\n };\n });\n\n /**\n * Badge flags when showing projected content — separate computed so the\n * template can narrow without union-property errors.\n */\n protected readonly contentBadges = computed(() => {\n const v = this.view();\n return v.kind === 'content'\n ? { staleError: v.staleError, fetching: v.fetching }\n : null;\n });\n}\n\n/**\n * Treats missing / null / empty-array payloads as empty UI.\n *\n * WHY include `null`: some APIs use null as \"no entity\"; arrays are the\n * common list empty sentinel. Non-array objects are considered present even\n * when empty `{}` so detail views are not forced into EmptyState.\n * @param data - Payload under consideration.\n * @returns True when the UI should show the empty state.\n */\nfunction isEmptyData(data: unknown): boolean {\n if (data === undefined || data === null) {\n return true;\n }\n if (Array.isArray(data) && data.length === 0) {\n return true;\n }\n return false;\n}\n","/**\n * Page/section-level async feedback states for data fetches.\n *\n * Distinct from form-control validation errors — use these (or\n * {@link AsyncStateComponent}) around tables and resource views.\n */\nexport { AsyncStateComponent } from './async-state.component';\nexport { EmptyStateComponent } from './empty-state.component';\nexport { ErrorIndicatorComponent } from './error-indicator.component';\nexport { ErrorStateComponent } from './error-state.component';\nexport type { LoadingStateMode } from './loading-state.component';\nexport { LoadingStateComponent } from './loading-state.component';\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\n/**\n * Visual density for {@link AccordionComponent}.\n *\n * - `md` — page sections (pay review, top-level cards)\n * - `sm` — nested panels (e.g. export boxes inside a manifest box)\n */\nexport type AccordionSize = 'md' | 'sm';\n\n/**\n * Bordered expandable panel with animated fold — the pattern used on\n * Manifest detail and Make Payment review.\n *\n * Parent owns open state via {@link open} (`model()` / `[(open)]`).\n *\n * @example\n * ```html\n * <africanies-accordion\n * title=\"Customer Information\"\n * [open]=\"isOpen('customer')\"\n * (openChange)=\"onOpenChange('customer', $event)\"\n * >\n * <dl>…</dl>\n * </africanies-accordion>\n * ```\n */\n@Component({\n selector: 'africanies-accordion',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent],\n host: {\n class: 'block',\n },\n styles: `\n .africanies-accordion-fold {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 200ms ease;\n }\n\n .africanies-accordion-fold-open {\n grid-template-rows: 1fr;\n }\n\n .africanies-accordion-fold-body {\n min-height: 0;\n overflow: hidden;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .africanies-accordion-fold {\n transition: none;\n }\n }\n `,\n template: `\n <div [class]=\"shellClass()\">\n <button\n type=\"button\"\n [class]=\"triggerClass()\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n >\n <span class=\"min-w-0 flex-1 font-medium\">\n <ng-content select=\"[africaniesAccordionTitle]\" />\n @if (title()) {\n {{ title() }}\n }\n </span>\n <africanies-icon\n name=\"chevron-down\"\n class=\"shrink-0 transition-transform duration-200\"\n [class.rotate-180]=\"open()\"\n [size]=\"chevronSize()\"\n />\n </button>\n <div\n class=\"africanies-accordion-fold\"\n [class.africanies-accordion-fold-open]=\"open()\"\n >\n <div class=\"africanies-accordion-fold-body\">\n <div [class]=\"bodyClass()\">\n <ng-content />\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class AccordionComponent {\n /** Plain-text header. Prefer projected `[africaniesAccordionTitle]` for rich titles. */\n readonly title = input('');\n\n /** Whether the panel body is expanded. */\n readonly open = model(false);\n\n /** Padding / chevron density. */\n readonly size = input<AccordionSize>('md');\n\n protected readonly chevronSize = computed(() =>\n this.size() === 'sm' ? 14 : 16,\n );\n\n protected readonly shellClass = computed(() =>\n this.size() === 'sm'\n ? 'rounded-lg border border-border dark:border-white/10'\n : 'rounded-xl border border-border dark:border-white/10',\n );\n\n protected readonly triggerClass = computed(() =>\n this.size() === 'sm'\n ? 'flex w-full items-center justify-between gap-3 px-3 py-2 text-left text-ink dark:text-white'\n : 'flex w-full items-center justify-between gap-3 px-4 py-3 text-left text-ink dark:text-white',\n );\n\n protected readonly bodyClass = computed(() =>\n this.size() === 'sm'\n ? 'border-t border-border px-3 py-2 dark:border-white/10'\n : 'border-t border-border px-4 py-3 dark:border-white/10',\n );\n\n protected toggle(): void {\n this.open.update((value) => !value);\n }\n}\n","/**\n * Expandable bordered panels (`africanies-accordion`).\n */\nexport {\n AccordionComponent,\n type AccordionSize,\n} from './accordion.component';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\n\nimport type { IconName } from '@africanies/africanies-icons';\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../button/button.component';\n\n/**\n * Visual tone for {@link AlertComponent}.\n *\n * - `info` — neutral guidance\n * - `success` — positive confirmation (export-green subtle)\n * - `warning` — caution that needs attention\n * - `danger` — blocking / destructive messaging\n */\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'danger';\n\nconst DEFAULT_ICONS: Record<AlertVariant, IconName> = {\n info: 'info-circle',\n success: 'check-circle',\n warning: 'warning',\n danger: 'warning',\n};\n\n/**\n * Inline page/section banner — distinct from {@link ErrorStateComponent}\n * (full-section async failure + Retry).\n *\n * Parent owns visibility (`@if` / signal). When the user dismisses, emit\n * {@link dismissed} and unmount the host — this component does not hide itself.\n *\n * @example\n * ```html\n * @if (showBanner()) {\n * <africanies-alert\n * variant=\"warning\"\n * title=\"Rates outdated\"\n * message=\"Refresh to pull the latest carrier rates.\"\n * (dismissed)=\"showBanner.set(false)\"\n * />\n * }\n * ```\n */\n@Component({\n selector: 'africanies-alert',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, ButtonComponent],\n template: `\n <div\n [class]=\"shellClass()\"\n [attr.role]=\"a11yRole()\"\n [attr.aria-live]=\"a11yLive()\"\n >\n <africanies-icon\n [name]=\"resolvedIcon()\"\n [size]=\"20\"\n [class]=\"iconClass()\"\n class=\"shrink-0\"\n />\n\n <div class=\"min-w-0 flex-1 flex flex-col justify-center gap-1\">\n @if (title(); as heading) {\n <p [class]=\"titleClass()\">{{ heading }}</p>\n }\n <p [class]=\"messageClass()\">{{ message() }}</p>\n <ng-content />\n </div>\n\n @if (dismissible()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"shrink-0 !min-h-0 !px-1.5 !py-1\"\n aria-label=\"Dismiss\"\n (click)=\"onDismiss()\"\n >\n <africanies-icon name=\"close\" [size]=\"16\" />\n </button>\n }\n </div>\n `,\n})\nexport class AlertComponent {\n /** Semantic tone. Defaults to `info`. */\n readonly variant = input<AlertVariant>('info');\n\n /** Optional short heading above the message. */\n readonly title = input<string | undefined>(undefined);\n\n /** Body copy — required so the banner is never an empty colored box. */\n readonly message = input.required<string>();\n\n /**\n * When true (default), shows a dismiss control that emits {@link dismissed}.\n */\n readonly dismissible = input(true, { transform: booleanAttribute });\n\n /** Override the default variant icon. */\n readonly icon = input<IconName | undefined>(undefined);\n\n /** Emitted when the user activates Dismiss — parent should unmount/hide. */\n readonly dismissed = output<void>();\n\n protected readonly resolvedIcon = computed(\n () => this.icon() ?? DEFAULT_ICONS[this.variant()],\n );\n\n protected readonly a11yRole = computed(() => {\n const v = this.variant();\n return v === 'warning' || v === 'danger' ? 'alert' : 'status';\n });\n\n protected readonly a11yLive = computed(() => {\n const v = this.variant();\n return v === 'warning' || v === 'danger' ? 'assertive' : 'polite';\n });\n\n protected readonly shellClass = computed(() => {\n const base =\n 'flex items-center gap-3 rounded-lg border px-4 py-3 text-body ' +\n 'text-ink dark:text-white';\n switch (this.variant()) {\n case 'success':\n return `${base} border-export/30 bg-export-subtle dark:border-export/40 dark:bg-export/15`;\n case 'warning':\n return `${base} border-warning/40 bg-warning-subtle dark:border-warning/50 dark:bg-warning/15`;\n case 'danger':\n return `${base} border-danger/30 bg-danger-subtle dark:border-danger/40 dark:bg-danger/15`;\n default:\n return `${base} border-border bg-background-welcome dark:border-white/15 dark:bg-ink-950`;\n }\n });\n\n protected readonly iconClass = computed(() => {\n switch (this.variant()) {\n case 'success':\n return 'text-export dark:text-export-light';\n case 'warning':\n return 'text-warning-dark dark:text-warning';\n case 'danger':\n return 'text-danger';\n default:\n return 'text-ink-blue dark:text-neutral-300';\n }\n });\n\n protected readonly titleClass = computed(() => {\n const base = 'm-0 text-body font-medium';\n switch (this.variant()) {\n case 'success':\n return `${base} text-export dark:text-export-light`;\n case 'warning':\n return `${base} text-warning-dark dark:text-warning`;\n case 'danger':\n return `${base} text-danger`;\n default:\n return `${base} text-ink dark:text-white`;\n }\n });\n\n protected readonly messageClass = computed(\n () => 'm-0 text-body-sm text-neutral-600 dark:text-neutral-300',\n );\n\n protected onDismiss(): void {\n this.dismissed.emit();\n }\n}\n","/**\n * Inline dismissible page/section banners.\n */\nexport { AlertComponent, type AlertVariant } from './alert.component';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\n\nimport type { IconName } from '@africanies/africanies-icons';\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\n/**\n * Semantic tone for {@link ChipComponent}.\n *\n * - `neutral` — generic label / count\n * - `success` — positive outcome (same green family as export)\n * - `warning` — caution / pending\n * - `danger` — error / exception\n * - `export` — SFN / outbound accent\n * - `import` — STN / inbound accent\n */\nexport type ChipVariant =\n | 'neutral'\n | 'success'\n | 'warning'\n | 'danger'\n | 'export'\n | 'import';\n\n/**\n * Control size for {@link ChipComponent}.\n */\nexport type ChipSize = 'sm' | 'md';\n\n/**\n * Compact status / category label.\n *\n * Soft fills stay readable in dark mode (translucent accent tints, not\n * light-only subtle backgrounds).\n *\n * @example\n * ```html\n * <africanies-chip variant=\"success\">Delivered</africanies-chip>\n * <africanies-chip variant=\"import\" icon=\"truck\">In transit</africanies-chip>\n * <africanies-chip variant=\"warning\" [removable]=\"true\" (removed)=\"clear()\">Pending</africanies-chip>\n * ```\n */\n@Component({\n selector: 'africanies-chip',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent],\n host: {\n '[class]': 'hostClass()',\n role: 'status',\n },\n template: `\n @if (icon(); as iconName) {\n <africanies-icon [name]=\"iconName\" [size]=\"iconSize()\" class=\"shrink-0\" />\n }\n <span class=\"min-w-0 truncate\"><ng-content /></span>\n @if (removable()) {\n <button\n type=\"button\"\n class=\"inline-flex shrink-0 cursor-pointer items-center justify-center rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-ink\"\n [attr.aria-label]=\"removeLabel()\"\n (click)=\"onRemove($event)\"\n >\n <africanies-icon name=\"close\" [size]=\"12\" />\n </button>\n }\n `,\n})\nexport class ChipComponent {\n /** Semantic tone. Defaults to `neutral`. */\n readonly variant = input<ChipVariant>('neutral');\n\n /** Padding / type scale. Defaults to `sm` (table / dense UI). */\n readonly size = input<ChipSize>('sm');\n\n /** Optional leading icon. */\n readonly icon = input<IconName | undefined>(undefined);\n\n /**\n * When true, shows a remove control that emits {@link removed}. Parent owns\n * list state — this component does not unmount itself.\n */\n readonly removable = input(false, { transform: booleanAttribute });\n\n /** Accessible label for the remove control. */\n readonly removeLabel = input('Remove');\n\n /** Emitted when the remove control is activated. */\n readonly removed = output<void>();\n\n protected readonly iconSize = computed(() => (this.size() === 'md' ? 14 : 12));\n\n protected readonly hostClass = computed(() => {\n const base =\n 'inline-flex max-w-full items-center gap-1 rounded-md font-sans font-medium ' +\n 'border border-transparent';\n\n const sizes: Record<ChipSize, string> = {\n sm: 'px-2 py-0.5 text-caption',\n md: 'px-2.5 py-1 text-body-sm',\n };\n\n return `${base} ${sizes[this.size()]} ${this.toneClass()}`;\n });\n\n /**\n * Soft background + text per variant. Dark mode uses translucent accents so\n * chips never wash out as near-white blobs.\n * @returns Tailwind class string for the active variant.\n */\n private toneClass(): string {\n switch (this.variant()) {\n case 'success':\n case 'export':\n return 'bg-export-subtle text-export dark:bg-export/15 dark:text-export-light';\n case 'import':\n return 'bg-import-subtle text-import dark:bg-import/15 dark:text-import-light';\n case 'warning':\n return 'bg-warning-subtle text-warning-dark dark:bg-warning/15 dark:text-warning';\n case 'danger':\n return 'bg-danger-subtle text-danger dark:bg-danger/15 dark:text-danger';\n default:\n return 'bg-border/60 text-ink dark:bg-white/10 dark:text-neutral-200';\n }\n }\n\n /**\n * @param event - Click on the remove control.\n */\n protected onRemove(event: Event): void {\n event.stopPropagation();\n this.removed.emit();\n }\n}\n","/**\n * Compact status / category labels (`africanies-chip`).\n */\nexport {\n ChipComponent,\n type ChipSize,\n type ChipVariant,\n} from './chip.component';\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\n/** Known inbound / last-mile carrier slugs with bundled SVG marks. */\nexport type CarrierLogoSlug = 'dhl';\n\n/**\n *\n */\nexport type CarrierLogoSize = 'sm' | 'md';\n\n/**\n * Normalizes free-text carrier names to a logo slug when recognized.\n *\n * @param value - Raw carrier string from API or form state.\n * @returns Slug when a bundled mark exists, otherwise `null`.\n */\nexport function normalizeCarrierLogoSlug(\n value: string | null | undefined,\n): CarrierLogoSlug | null {\n const normalized = (value ?? '').trim().toLowerCase();\n if (normalized === 'dhl') {\n return 'dhl';\n }\n return null;\n}\n\n/**\n * Inline carrier marks for delivery vendor cells.\n *\n * Falls back to a compact text badge when no SVG is bundled for the slug.\n *\n * @example\n * ```html\n * <africanies-carrier-logo carrier=\"dhl\" />\n * <africanies-carrier-logo [carrier]=\"item.delivery_vendor\" />\n * ```\n */\n@Component({\n selector: 'africanies-carrier-logo',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'inline-flex shrink-0 items-center',\n },\n template: `\n @if (slug(); as key) {\n @switch (key) {\n @case ('dhl') {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n overflow=\"visible\"\n version=\"1.0\"\n viewBox=\"-26.3622 -9.6965 228.4724 58.179\"\n [class]=\"svgClass()\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"img\"\n >\n <path fill=\"#FECC00\" d=\"M0 38.786V0h175.748v38.786z\" />\n <path\n fill=\"#D50029\"\n d=\"M56.665 16.206c-.768 1.04-2.053 2.848-2.835 3.904-.397.537-1.114 1.512 1.263 1.512h12.515s2.017-2.744 3.708-5.039c2.3-3.122.199-9.618-8.024-9.618H30.908l-5.615 7.629h30.603c1.545 0 1.524.588.769 1.612zm-9.194 7.298c-2.377 0-1.66-.977-1.263-1.514.782-1.056 2.088-2.845 2.856-3.885.756-1.024.776-1.612-.771-1.612H34.297L23.02 31.819h27.501c9.083 0 14.14-6.178 15.699-8.314 0-.001-16.235-.001-18.749-.001zm17.89 8.315h16.133l6.116-8.316-16.131.002c-.005-.001-6.118 8.314-6.118 8.314zm41.625-24.854l-6.188 8.405h-7.2l6.185-8.405H83.655l-10.79 14.657h39.46l10.787-14.657zM88.694 31.819h16.127l6.119-8.314H94.813c-.006-.001-6.119 8.314-6.119 8.314zM0 26.784v1.766h22.468l1.298-1.766zm26.181-3.28H0v1.764h24.88zM0 31.819h20.061l1.292-1.756H0zm152.072-3.27h23.676v-1.766h-22.376zm-2.405 3.27h26.081v-1.756h-24.79zm6.116-8.315l-1.297 1.766h21.262v-1.766zm-21.124-1.882l10.789-14.657h-17.081c-.006 0-10.797 14.657-10.797 14.657zm-18.472 1.882s-1.179 1.611-1.752 2.387c-2.025 2.736-.234 5.928 6.376 5.928h25.901l6.119-8.314h-36.644z\"\n />\n </svg>\n }\n }\n } @else if (fallbackLabel(); as label) {\n <span\n class=\"inline-flex items-center rounded-md bg-neutral-100 px-2 py-0.5 text-caption font-semibold text-neutral-700 dark:bg-white/10 dark:text-neutral-200\"\n [attr.aria-label]=\"label + ' carrier'\"\n >\n {{ label }}\n </span>\n }\n `,\n})\nexport class CarrierLogoComponent {\n /** Raw carrier slug or label from the API. */\n readonly carrier = input('');\n\n readonly size = input<CarrierLogoSize>('sm');\n\n protected readonly slug = computed(() =>\n normalizeCarrierLogoSlug(this.carrier()),\n );\n\n protected readonly fallbackLabel = computed(() => {\n if (this.slug()) {\n return '';\n }\n const label = this.carrier().trim();\n if (!label || label.toLowerCase() === 'others') {\n return '';\n }\n return label.replace(/\\b\\w/g, (char) => char.toUpperCase());\n });\n\n protected readonly ariaLabel = computed(() => {\n const slug = this.slug();\n if (slug === 'dhl') {\n return 'DHL';\n }\n return this.fallbackLabel();\n });\n\n protected readonly svgClass = computed(() =>\n this.size() === 'md' ? 'h-6 w-auto' : 'h-5 w-auto',\n );\n}\n","import {\n DELIVERY_VENDORS,\n deliveryVendorLabel,\n EXPORT_DELIVERY_VENDORS,\n isKnownDeliveryVendor,\n normalizeDeliveryVendorForForm,\n} from '@africanies/africanies-models';\n\nimport type { SelectOption } from '../forms/select/select.types';\n\n/**\n *\n * @param includeWalkIn\n */\nexport function deliveryVendorSelectOptions(\n includeWalkIn = false,\n): SelectOption<string>[] {\n const rows = includeWalkIn ? EXPORT_DELIVERY_VENDORS : DELIVERY_VENDORS;\n return rows.map((row) => ({ value: row.id, label: row.name }));\n}\n\n/**\n *\n * @param storedValue\n * @param baseOptions\n */\nexport function deliveryVendorOptionsForStoredValue(\n storedValue: string,\n baseOptions: readonly SelectOption<string>[] = deliveryVendorSelectOptions(),\n): SelectOption<string>[] {\n const normalized = normalizeDeliveryVendorForForm(storedValue);\n if (!normalized || isKnownDeliveryVendor(normalized)) {\n return [...baseOptions];\n }\n return [{ label: 'Others', value: normalized }, ...baseOptions];\n}\n\n/**\n *\n * @param storedValue\n * @param baseOptions\n */\nexport function deliveryVendorSelected(\n storedValue: string,\n baseOptions: readonly SelectOption<string>[] = deliveryVendorSelectOptions(),\n): SelectOption<string> | null {\n const normalized = normalizeDeliveryVendorForForm(storedValue);\n if (!normalized) {\n return null;\n }\n const options = deliveryVendorOptionsForStoredValue(normalized, baseOptions);\n return options.find((row) => row.value === normalized) ?? null;\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Compact stacked text for table cells and detail panels.\n *\n * Typical use: name, email, and a timestamp (Packaged by, Created by, …).\n * Missing lines are omitted so the stack stays tight.\n *\n * @example\n * ```html\n * <africanies-content-stack\n * title=\"Oladotun Adedeji\"\n * subtitle=\"oladotun.a@africanies.com\"\n * extraLine=\"Aug 14, 2026, 2:04:22 PM\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-content-stack',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'block min-w-0',\n },\n template: `\n <div class=\"flex min-w-0 flex-col gap-0.5\">\n @if (title()) {\n <p class=\"m-0 text-body-sm font-medium text-ink dark:text-white\">\n {{ title() }}\n </p>\n }\n @if (subtitle()) {\n <p class=\"m-0 text-caption text-neutral-600 dark:text-neutral-400\">\n {{ subtitle() }}\n </p>\n }\n @if (extraLine()) {\n <p class=\"m-0 text-caption text-neutral-500 dark:text-neutral-400\">\n {{ extraLine() }}\n </p>\n }\n </div>\n `,\n})\nexport class ContentStackComponent {\n /** Primary line — usually a person or entity name. */\n readonly title = input('');\n\n /** Supporting line — usually an email. */\n readonly subtitle = input('');\n\n /** Trailing line — usually a formatted date or other caption. */\n readonly extraLine = input('');\n}\n","/**\n * Stacked text block (`africanies-content-stack`) for table cells and details.\n */\nexport { ContentStackComponent } from './content-stack.component';\n","import {\n type EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n provideAppInitializer,\n} from '@angular/core';\n\nimport { AFRICANIES_HTTP_TOAST } from '@africanies/africanies-core';\n\nimport { ToastService } from './toast.service';\n\n/**\n * Registers {@link ToastService}, mounts the toast host, and bridges HTTP\n * toasts via {@link AFRICANIES_HTTP_TOAST} (used by {@link httpToastInterceptor}).\n *\n * Pair with {@link provideAfricaniesHttpClient} so {@link withToast} works.\n *\n * @returns Environment providers for `app.config.ts`.\n *\n * @example\n * ```ts\n * providers: [\n * provideAfricaniesHttpClient(),\n * provideAfricaniesUiOverlays(),\n * provideAfricaniesToasts(),\n * ]\n * ```\n */\nexport function provideAfricaniesToasts(): EnvironmentProviders {\n return makeEnvironmentProviders([\n ToastService,\n { provide: AFRICANIES_HTTP_TOAST, useExisting: ToastService },\n provideAppInitializer(() => {\n inject(ToastService).ensureHost();\n }),\n ]);\n}\n","/**\n * Transient toast stack — distinct from inline {@link AlertComponent}.\n */\nexport {\n provideAfricaniesToasts,\n} from './provide-africanies-toasts';\nexport { ToastService } from './toast.service';\nexport {\n TOAST_DURATION_MS,\n TOAST_ICONS,\n toastFingerprint,\n type ToastItem,\n type ToastShowOptions,\n type ToastVariant,\n} from './toast.types';\n","import { Directive } from '@angular/core';\n\n/**\n * Marks projected content as the custom trigger for {@link TooltipComponent}.\n *\n * When present, the default info icon is hidden and this element owns open\n * interactions (hover / focus / click bubble to the tooltip host).\n *\n * @example\n * ```html\n * <africanies-tooltip text=\"Required for insured shipments.\">\n * <button type=\"button\" africanies-button africaniesTooltipTrigger variant=\"ghost\" size=\"sm\">\n * Why?\n * </button>\n * </africanies-tooltip>\n * ```\n */\n@Directive({\n selector: '[africaniesTooltipTrigger]',\n standalone: true,\n})\nexport class TooltipTriggerDirective {}\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n type ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n signal,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent, type IconName } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../button/button.component';\nimport { TooltipTriggerDirective } from './tooltip-trigger.directive';\n\n/** Preferred placement for {@link TooltipComponent}. */\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nlet nextTooltipId = 0;\n\nconst PLACEMENT_POSITIONS: Record<TooltipPlacement, ConnectedPosition[]> = {\n top: [\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -8,\n },\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 8,\n },\n ],\n bottom: [\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 8,\n },\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -8,\n },\n ],\n left: [\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -8,\n },\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: 8,\n },\n ],\n right: [\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: 8,\n },\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -8,\n },\n ],\n};\n\n/**\n * Contextual help tip — default info icon or a custom projected trigger.\n *\n * Opens on hover, keyboard focus, and click/tap so it works on desktop and\n * mobile. Same CDK connected-overlay pattern as select / action-menu (not\n * clipped by parent `overflow`).\n *\n * @example\n * ```html\n * <!-- Default info icon -->\n * <africanies-tooltip text=\"Paid means the invoice is settled.\" />\n *\n * <!-- Custom target -->\n * <africanies-tooltip text=\"Required for insured shipments.\" placement=\"bottom\">\n * <button type=\"button\" africanies-button africaniesTooltipTrigger variant=\"ghost\" size=\"sm\">\n * Why is this required?\n * </button>\n * </africanies-tooltip>\n * ```\n */\n@Component({\n selector: 'africanies-tooltip',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AfricaniesIconComponent,\n ButtonComponent,\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n ],\n host: {\n class: 'inline-flex max-w-full align-middle',\n },\n template: `\n <!-- Hover is tracked on the origin; focus/click live on the trigger control. -->\n \n <span\n class=\"inline-flex\"\n cdkOverlayOrigin\n #triggerOrigin=\"cdkOverlayOrigin\"\n (pointerenter)=\"onPointerEnter()\"\n (pointerleave)=\"onPointerLeave()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n >\n <!--\n Custom trigger owns keyboard focus; click bubbles for sticky open.\n -->\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n <span\n class=\"inline-flex\"\n [class.hidden]=\"!hasCustomTrigger()\"\n (click)=\"onTriggerClick($event)\"\n (keydown)=\"onKeydown($event)\"\n >\n <ng-content select=\"[africaniesTooltipTrigger]\" />\n </span>\n\n @if (!hasCustomTrigger()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!min-h-0 !px-1.5 !py-1\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"open() ? tooltipId : null\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"onTriggerClick($event)\"\n (keydown)=\"onKeydown($event)\"\n >\n <africanies-icon [name]=\"icon()\" [size]=\"16\" />\n </button>\n }\n </span>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"panelPositions()\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayHasBackdrop]=\"sticky()\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (overlayOutsideClick)=\"onOutsideClick()\"\n (detach)=\"onOverlayDetach()\"\n >\n <div\n [id]=\"tooltipId\"\n role=\"tooltip\"\n class=\"max-w-xs rounded-md border border-border bg-ink px-3 py-2 text-body-sm text-white shadow-lg dark:border-white/15 dark:bg-ink-950\"\n (pointerenter)=\"onPanelEnter()\"\n (pointerleave)=\"onPointerLeave()\"\n >\n {{ text() }}\n </div>\n </ng-template>\n `,\n})\nexport class TooltipComponent {\n protected readonly tooltipId = `africanies-tooltip-${++nextTooltipId}`;\n\n private readonly customTrigger = contentChild(TooltipTriggerDirective);\n\n /** Tooltip body copy. */\n readonly text = input.required<string>();\n\n /** Preferred side; flips when there is no room. */\n readonly placement = input<TooltipPlacement>('top');\n\n /** Icon for the default trigger (ignored when a custom trigger is projected). */\n readonly icon = input<IconName>('info-circle');\n\n /** Accessible name for the default icon button. */\n readonly ariaLabel = input('More information');\n\n /** When true, the tip never opens. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly open = signal(false);\n /** Click/tap keeps the tip open until dismiss (backdrop / Escape / outside). */\n protected readonly sticky = signal(false);\n\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n\n protected readonly hasCustomTrigger = computed(\n () => !!this.customTrigger(),\n );\n\n protected readonly panelPositions = computed(\n () => PLACEMENT_POSITIONS[this.placement()] ?? PLACEMENT_POSITIONS.top,\n );\n\n protected onPointerEnter(): void {\n if (this.disabled()) {\n return;\n }\n this.clearCloseTimer();\n this.open.set(true);\n }\n\n protected onPointerLeave(): void {\n if (this.sticky()) {\n return;\n }\n this.scheduleClose();\n }\n\n protected onPanelEnter(): void {\n this.clearCloseTimer();\n }\n\n protected onFocusIn(): void {\n if (this.disabled()) {\n return;\n }\n this.clearCloseTimer();\n this.open.set(true);\n }\n\n protected onFocusOut(event: FocusEvent): void {\n if (this.sticky()) {\n return;\n }\n const next = event.relatedTarget as Node | null;\n const host = event.currentTarget as Node | null;\n if (host && next && host.contains(next)) {\n return;\n }\n this.scheduleClose();\n }\n\n protected onTriggerClick(event: MouseEvent): void {\n if (this.disabled()) {\n return;\n }\n event.stopPropagation();\n this.clearCloseTimer();\n if (this.open() && this.sticky()) {\n this.close();\n return;\n }\n this.sticky.set(true);\n this.open.set(true);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.open()) {\n event.preventDefault();\n this.close();\n }\n }\n\n protected onOutsideClick(): void {\n if (this.sticky()) {\n this.close();\n }\n }\n\n protected onOverlayDetach(): void {\n this.open.set(false);\n this.sticky.set(false);\n }\n\n protected close(): void {\n this.clearCloseTimer();\n this.open.set(false);\n this.sticky.set(false);\n }\n\n private scheduleClose(): void {\n this.clearCloseTimer();\n this.closeTimer = setTimeout(() => {\n if (!this.sticky()) {\n this.open.set(false);\n }\n }, 120);\n }\n\n private clearCloseTimer(): void {\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks projected content as the custom trigger for {@link InfoPopoverComponent}.\n *\n * When present, the default info icon is hidden and this element owns open\n * interactions (hover / focus / click bubble to the popover host).\n *\n * @example\n * ```html\n * <africanies-info-popover title=\"Zones\">\n * <button type=\"button\" africaniesInfoPopoverTrigger>Show zones</button>\n * <ul africaniesInfoPopoverContent>…</ul>\n * </africanies-info-popover>\n * ```\n */\n@Directive({\n selector: '[africaniesInfoPopoverTrigger]',\n standalone: true,\n})\nexport class InfoPopoverTriggerDirective {}\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n type ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n signal,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent, type IconName } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../button/button.component';\nimport { InfoPopoverTriggerDirective } from './info-popover-trigger.directive';\n\n/** Preferred placement for {@link InfoPopoverComponent}. */\nexport type InfoPopoverPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nlet nextInfoPopoverId = 0;\n\nconst PLACEMENT_POSITIONS: Record<InfoPopoverPlacement, ConnectedPosition[]> = {\n top: [\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -10,\n },\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 10,\n },\n ],\n bottom: [\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: 10,\n },\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -10,\n },\n ],\n left: [\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -10,\n },\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: 10,\n },\n ],\n right: [\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: 10,\n },\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -10,\n },\n ],\n};\n\n/**\n * Hover / focus / click info panel with a white card, optional title, and\n * fully projected body content (any child component or markup).\n *\n * Use this when the tip needs structured content (lists, actions, custom UI).\n * Prefer {@link TooltipComponent} for short plain-text help.\n *\n * @example\n * ```html\n * <africanies-info-popover title=\"Zones Available\" placement=\"top\">\n * <ul africaniesInfoPopoverContent class=\"space-y-1 text-body-sm text-ink\">\n * @for (zone of zones; track zone) {\n * <li>{{ zone }}</li>\n * }\n * </ul>\n * </africanies-info-popover>\n *\n * <!-- Custom trigger + rich body -->\n * <africanies-info-popover title=\"Details\">\n * <button type=\"button\" africanies-button africaniesInfoPopoverTrigger variant=\"ghost\" size=\"sm\">\n * More\n * </button>\n * <app-zone-list africaniesInfoPopoverContent [zones]=\"zones\" />\n * </africanies-info-popover>\n * ```\n */\n@Component({\n selector: 'africanies-info-popover',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AfricaniesIconComponent,\n ButtonComponent,\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n ],\n host: {\n class: 'inline-flex max-w-full align-middle',\n },\n template: `\n <span\n class=\"inline-flex\"\n cdkOverlayOrigin\n #triggerOrigin=\"cdkOverlayOrigin\"\n (pointerenter)=\"onPointerEnter()\"\n (pointerleave)=\"onPointerLeave()\"\n (focusin)=\"onFocusIn()\"\n (focusout)=\"onFocusOut($event)\"\n >\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n <span\n class=\"inline-flex\"\n [class.hidden]=\"!hasCustomTrigger()\"\n (click)=\"onTriggerClick($event)\"\n (keydown)=\"onKeydown($event)\"\n >\n <ng-content select=\"[africaniesInfoPopoverTrigger]\" />\n </span>\n\n @if (!hasCustomTrigger()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost-primary\"\n size=\"sm\"\n class=\"!min-h-0 !px-1.5 !py-1\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-controls]=\"open() ? panelId : null\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"onTriggerClick($event)\"\n (keydown)=\"onKeydown($event)\"\n >\n <africanies-icon [name]=\"icon()\" [size]=\"16\" />\n </button>\n }\n </span>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"panelPositions()\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayHasBackdrop]=\"sticky()\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (overlayOutsideClick)=\"onOutsideClick()\"\n (detach)=\"onOverlayDetach()\"\n >\n <div\n [id]=\"panelId\"\n role=\"dialog\"\n [attr.aria-label]=\"title() || ariaLabel()\"\n [class]=\"panelArrowClass()\"\n (pointerenter)=\"onPanelEnter()\"\n (pointerleave)=\"onPointerLeave()\"\n >\n @if (title()) {\n <p class=\"text-body-sm font-semibold text-ink dark:text-white\">\n {{ title() }}\n </p>\n <div\n class=\"my-2 border-t border-border dark:border-white/15\"\n aria-hidden=\"true\"\n ></div>\n }\n\n <div class=\"africanies-overlay-scroll max-h-60 overflow-y-auto overscroll-contain\">\n <ng-content select=\"[africaniesInfoPopoverContent]\" />\n </div>\n </div>\n </ng-template>\n `,\n})\nexport class InfoPopoverComponent {\n protected readonly panelId = `africanies-info-popover-${++nextInfoPopoverId}`;\n\n private readonly customTrigger = contentChild(InfoPopoverTriggerDirective);\n\n /** Optional heading above the projected body (with divider). */\n readonly title = input<string | undefined>(undefined);\n\n /** Preferred side; flips when there is no room. */\n readonly placement = input<InfoPopoverPlacement>('top');\n\n /** Icon for the default trigger (ignored when a custom trigger is projected). */\n readonly icon = input<IconName>('info-circle');\n\n /** Accessible name for the default icon button. */\n readonly ariaLabel = input('More information');\n\n /** When true, the popover never opens. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly open = signal(false);\n /** Click/tap keeps the panel open until dismiss (backdrop / Escape / outside). */\n protected readonly sticky = signal(false);\n\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n\n protected readonly hasCustomTrigger = computed(\n () => !!this.customTrigger(),\n );\n\n protected readonly panelPositions = computed(\n () => PLACEMENT_POSITIONS[this.placement()] ?? PLACEMENT_POSITIONS.top,\n );\n\n /**\n * Full panel class list (static card + CSS triangle toward the trigger).\n * Bound via `[class]` so arrow position tracks preferred placement.\n */\n protected readonly panelArrowClass = computed(() => {\n const card =\n 'relative z-10 w-max max-w-xs rounded-lg border border-border bg-white px-4 py-3 text-ink shadow-lg dark:border-white/15 dark:bg-ink-950 dark:text-white';\n const base =\n \"before:pointer-events-none before:absolute before:z-0 before:h-2.5 before:w-2.5 before:rotate-45 before:border before:border-border before:bg-white before:content-[''] dark:before:border-white/15 dark:before:bg-ink-950\";\n switch (this.placement()) {\n case 'bottom':\n return `${card} ${base} before:left-1/2 before:top-0 before:-translate-x-1/2 before:-translate-y-1/2 before:border-b-0 before:border-r-0`;\n case 'left':\n return `${card} ${base} before:right-0 before:top-1/2 before:translate-x-1/2 before:-translate-y-1/2 before:border-b-0 before:border-l-0`;\n case 'right':\n return `${card} ${base} before:left-0 before:top-1/2 before:-translate-x-1/2 before:-translate-y-1/2 before:border-r-0 before:border-t-0`;\n case 'top':\n default:\n return `${card} ${base} before:bottom-0 before:left-1/2 before:-translate-x-1/2 before:translate-y-1/2 before:border-l-0 before:border-t-0`;\n }\n });\n\n protected onPointerEnter(): void {\n if (this.disabled()) {\n return;\n }\n this.clearCloseTimer();\n this.open.set(true);\n }\n\n protected onPointerLeave(): void {\n if (this.sticky()) {\n return;\n }\n this.scheduleClose();\n }\n\n protected onPanelEnter(): void {\n this.clearCloseTimer();\n }\n\n protected onFocusIn(): void {\n if (this.disabled()) {\n return;\n }\n this.clearCloseTimer();\n this.open.set(true);\n }\n\n protected onFocusOut(event: FocusEvent): void {\n if (this.sticky()) {\n return;\n }\n const next = event.relatedTarget as Node | null;\n const host = event.currentTarget as Node | null;\n if (host && next && host.contains(next)) {\n return;\n }\n this.scheduleClose();\n }\n\n protected onTriggerClick(event: MouseEvent): void {\n if (this.disabled()) {\n return;\n }\n event.stopPropagation();\n this.clearCloseTimer();\n if (this.open() && this.sticky()) {\n this.close();\n return;\n }\n this.sticky.set(true);\n this.open.set(true);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.open()) {\n event.preventDefault();\n this.close();\n }\n }\n\n protected onOutsideClick(): void {\n if (this.sticky()) {\n this.close();\n }\n }\n\n protected onOverlayDetach(): void {\n this.open.set(false);\n this.sticky.set(false);\n }\n\n protected close(): void {\n this.clearCloseTimer();\n this.open.set(false);\n this.sticky.set(false);\n }\n\n private scheduleClose(): void {\n this.clearCloseTimer();\n this.closeTimer = setTimeout(() => {\n if (!this.sticky()) {\n this.open.set(false);\n }\n }, 120);\n }\n\n private clearCloseTimer(): void {\n if (this.closeTimer) {\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks projected content as the panel body for {@link InfoPopoverComponent}.\n *\n * Any component or markup can be projected — lists, forms, custom layouts, etc.\n *\n * @example\n * ```html\n * <africanies-info-popover title=\"Zones Available\">\n * <ul africaniesInfoPopoverContent class=\"space-y-1\">\n * @for (zone of zones; track zone) {\n * <li>{{ zone }}</li>\n * }\n * </ul>\n * </africanies-info-popover>\n * ```\n */\n@Directive({\n selector: '[africaniesInfoPopoverContent]',\n standalone: true,\n})\nexport class InfoPopoverContentDirective {}\n","/**\n * Shared Tailwind class fragments for africanies-ui form controls.\n *\n * WHY string literals (not dynamic concatenation of token names): the theme\n * scanner must see full utility names in this package so they survive purge\n * when consumers scan the published UI bundle.\n */\n\n/** Label above the control. Hidden when empty so callers can omit a label. */\nexport const FORM_LABEL_CLASS =\n 'block text-body-sm font-medium text-ink dark:text-white mb-1.5 empty:hidden';\n\n/** Default control shell — `h-10` matches md `africanies-button`. */\nexport const FORM_FIELD_CLASS =\n 'flex items-center w-full h-10 box-border rounded-md border border-neutral-300 bg-white dark:bg-ink-950 text-ink dark:text-white dark:border-white/25 ' +\n 'focus-within:outline focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-ink';\n\n/**\n * Error border — `!` so it wins over shell `border-neutral-300` /\n * `dark:border-white/25` (same specificity; those utilities sort later in the\n * generated CSS and otherwise paint over `border-danger`).\n *\n * Keep these literals static for Tailwind content scanning in consumer apps.\n */\nexport const FORM_FIELD_ERROR_CLASS =\n '!border-danger dark:!border-danger focus-within:!outline-danger';\n\n/** Native input / textarea inside a shell. */\nexport const FORM_CONTROL_INNER_CLASS =\n 'flex-1 min-w-0 min-h-0 h-full w-full bg-transparent border-0 outline-none text-body text-ink dark:text-white px-3 py-0 ' +\n 'placeholder:text-neutral-400 disabled:cursor-not-allowed';\n\n/** Prefix / suffix projection gutters. Hidden when nothing is projected. */\nexport const FORM_AFFIX_CLASS =\n 'inline-flex items-center shrink-0 px-2.5 text-neutral-600 dark:text-neutral-400 empty:hidden';\n\n/**\n * Native date input extras.\n *\n * WHY no Tailwind `scheme-*`: those utilities are not emitted in this build.\n * Document `color-scheme` (ThemeService) + an inline style on the input drive\n * the native calendar chrome. Do **not** invert the indicator once\n * `color-scheme: dark` is set — invert made the glyph disappear again.\n */\nexport const FORM_DATE_INNER_CLASS =\n FORM_CONTROL_INNER_CLASS +\n ' cursor-pointer [&::-webkit-calendar-picker-indicator]:cursor-pointer';\n\n/** Hint under the control (hidden when error is shown). */\nexport const FORM_HINT_CLASS =\n 'mt-1.5 text-caption text-neutral-600 dark:text-neutral-400 m-0';\n\n/** Field-level validation message (not ErrorStateComponent). */\nexport const FORM_ERROR_CLASS = 'mt-1.5 text-caption text-danger m-0';\n\n/** Disabled shell — dimmed with not-allowed cursor over the full field chrome. */\nexport const FORM_DISABLED_CLASS = 'opacity-50 cursor-not-allowed';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport { ThemeService } from '@africanies/africanies-theme';\n\nimport {\n FORM_AFFIX_CLASS,\n FORM_DATE_INNER_CLASS,\n FORM_DISABLED_CLASS,\n FORM_ERROR_CLASS,\n FORM_FIELD_CLASS,\n FORM_FIELD_ERROR_CLASS,\n FORM_HINT_CLASS,\n FORM_LABEL_CLASS,\n} from '../form-field.classes';\n\nlet nextDatePickerId = 0;\n\n/**\n * Date field wrapping native `input[type=date]`, following\n * shared AFRICANIES form field pattern.\n *\n * Value is an ISO calendar date string (`YYYY-MM-DD`) or `null` — matching the\n * native control — not a `Date` object (avoids timezone surprises).\n *\n * Clicking anywhere on the field shell calls `HTMLInputElement.showPicker()`\n * so the calendar opens without hunting for the tiny indicator glyph.\n *\n * Dark calendar chrome follows `color-scheme` from {@link ThemeService}\n * (document + this input). Supports prefix/suffix slots.\n *\n * @example\n * ```html\n * <africanies-date-picker\n * label=\"Pickup date\"\n * [(value)]=\"pickupDate\"\n * >\n * <africanies-icon prefix name=\"calendar\" [size]=\"16\" />\n * </africanies-date-picker>\n * ```\n */\n@Component({\n selector: 'africanies-date-picker',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatePickerComponent),\n multi: true,\n },\n ],\n template: `\n <label [attr.for]=\"controlId\" [class]=\"labelClass\">{{ label() }}</label>\n <div [class]=\"shellClass()\">\n <span [class]=\"affixClass\" data-slot=\"prefix\">\n <ng-content select=\"[prefix]\" />\n </span>\n <input\n #dateInput\n [id]=\"controlId\"\n type=\"date\"\n [class]=\"innerClass\"\n [style.color-scheme]=\"colorScheme()\"\n [value]=\"value() ?? ''\"\n [disabled]=\"disabled()\"\n [attr.min]=\"min() || null\"\n [attr.max]=\"max() || null\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openPicker($event)\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n />\n <span [class]=\"affixClass\" data-slot=\"suffix\">\n <ng-content select=\"[suffix]\" />\n </span>\n </div>\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n `,\n})\nexport class DatePickerComponent implements ControlValueAccessor {\n private readonly theme = inject(ThemeService, { optional: true });\n\n protected readonly controlId = `africanies-date-picker-${++nextDatePickerId}`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n\n protected readonly labelClass = FORM_LABEL_CLASS;\n protected readonly affixClass = FORM_AFFIX_CLASS;\n protected readonly innerClass = FORM_DATE_INNER_CLASS;\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n\n private readonly dateInput =\n viewChild<ElementRef<HTMLInputElement>>('dateInput');\n\n /** Visible field label. */\n readonly label = input('');\n\n /** Helper copy. Hidden while {@link error} is set. */\n readonly hint = input<string | undefined>(undefined);\n\n /** Field-level validation message. Distinct from `ErrorStateComponent`. */\n readonly error = input<string | null>(null);\n\n /** Optional native `min` (`YYYY-MM-DD`). */\n readonly min = input<string | undefined>(undefined);\n\n /** Optional native `max` (`YYYY-MM-DD`). */\n readonly max = input<string | undefined>(undefined);\n\n /** ISO date string or `null` (`[(value)]` + CVA). */\n readonly value = model<string | null>(null);\n\n /** Host disable flag (in addition to CVA). */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n protected readonly cvaDisabled = signal(false);\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n /** Native picker chrome — mirrors app theme when ThemeService is present. */\n protected readonly colorScheme = computed(\n () => this.theme?.theme() ?? 'light',\n );\n\n protected readonly shellClass = computed(() => {\n let classes = FORM_FIELD_CLASS;\n if (this.error()) {\n classes += ` ${FORM_FIELD_ERROR_CLASS}`;\n }\n if (this.disabled()) {\n classes += ` ${FORM_DISABLED_CLASS}`;\n } else {\n classes += ' cursor-pointer';\n }\n return classes;\n });\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n private onChange: (value: string | null) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n /** @param value - ISO date or `null`. */\n writeValue(value: string | null): void {\n this.value.set(value);\n }\n\n /** @param fn - User edit callback. */\n registerOnChange(fn: (value: string | null) => void): void {\n this.onChange = fn;\n }\n\n /** @param fn - Blur callback. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @param isDisabled - Blocks editing when true. */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n /**\n * Opens the native calendar on input click.\n * Uses `showPicker()` when available (Chromium, Safari 16+, Firefox 101+).\n *\n * @param event - Click from the input.\n */\n protected openPicker(event?: Event): void {\n if (this.disabled()) {\n return;\n }\n event?.stopPropagation();\n const el = this.dateInput()?.nativeElement;\n if (!el || typeof el.showPicker !== 'function') {\n return;\n }\n try {\n el.showPicker();\n } catch {\n // showPicker throws if not tied to a user gesture or if the input is not\n // rendered — ignore and leave native indicator behavior as fallback.\n }\n }\n\n protected onInput(event: Event): void {\n const raw = (event.target as HTMLInputElement).value;\n const next = raw === '' ? null : raw;\n this.value.set(next);\n this.onChange(next);\n }\n\n protected onBlur(): void {\n this.onTouched();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport {\n FORM_ERROR_CLASS,\n FORM_HINT_CLASS,\n FORM_LABEL_CLASS,\n} from '../form-field.classes';\n\n/**\n * Option row for {@link RadioComponent}.\n *\n * @typeParam T - Value type bound through CVA / `value`.\n */\nexport interface RadioOption<T = string> {\n /** Visible label for the radio. */\n label: string;\n /** Value written when this option is selected. */\n value: T;\n /** When true, the option cannot be chosen. */\n disabled?: boolean;\n}\n\nlet nextRadioId = 0;\n\n/**\n * Radio group following the shared AFRICANIES form field pattern.\n *\n * **Prefix/suffix slots are omitted** — radios are mutually exclusive options\n * with labels; affix projection does not apply.\n *\n * Selected ring and center disc follow {@link ModeColorService}\n * (SFN green / STN orange).\n *\n * @typeParam T - Option value type.\n *\n * @example\n * ```html\n * <africanies-radio\n * label=\"Shipment mode\"\n * [options]=\"modeOptions\"\n * [(value)]=\"mode\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-radio',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'inline-flex max-w-full',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RadioComponent),\n multi: true,\n },\n ],\n template: `\n <fieldset\n class=\"m-0 p-0 border-0 min-w-0\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n >\n <legend [class]=\"labelClass\">{{ label() }}</legend>\n <div class=\"flex flex-row flex-wrap gap-x-4 gap-y-2\" role=\"radiogroup\">\n @for (opt of options(); track trackOption(opt)) {\n <label\n class=\"inline-flex items-center gap-2.5 text-body text-ink dark:text-white\"\n [class.opacity-50]=\"disabled() || opt.disabled\"\n [class.cursor-pointer]=\"!(disabled() || opt.disabled)\"\n [class.cursor-not-allowed]=\"disabled() || opt.disabled\"\n >\n <span class=\"relative inline-flex size-4 shrink-0\">\n <input\n type=\"radio\"\n class=\"peer absolute inset-0 z-10 m-0 size-full opacity-0\"\n [class.cursor-pointer]=\"!(disabled() || opt.disabled)\"\n [class.cursor-not-allowed]=\"disabled() || opt.disabled\"\n [name]=\"groupName\"\n [checked]=\"isSelected(opt)\"\n [disabled]=\"disabled() || !!opt.disabled\"\n (change)=\"select(opt)\"\n (blur)=\"onBlur()\"\n />\n <span [class]=\"markClass(opt)\" aria-hidden=\"true\">\n @if (isSelected(opt)) {\n <span [class]=\"dotClass()\"></span>\n }\n </span>\n </span>\n <span>{{ opt.label }}</span>\n </label>\n }\n </div>\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n </fieldset>\n `,\n})\nexport class RadioComponent<T = string> implements ControlValueAccessor {\n private readonly modeColor = inject(ModeColorService);\n\n protected readonly groupName = `africanies-radio-${++nextRadioId}`;\n protected readonly hintId = `${this.groupName}-hint`;\n protected readonly errorId = `${this.groupName}-error`;\n\n protected readonly labelClass = FORM_LABEL_CLASS;\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n\n /** Group legend / label. */\n readonly label = input('');\n\n /** Helper copy. Hidden while {@link error} is set. */\n readonly hint = input<string | undefined>(undefined);\n\n /** Field-level validation message. Distinct from `ErrorStateComponent`. */\n readonly error = input<string | null>(null);\n\n /** Options rendered as radios. */\n readonly options = input<RadioOption<T>[]>([]);\n\n /** Selected option value (`[(value)]` + CVA). */\n readonly value = model<T | null>(null);\n\n /** Host disable flag (in addition to CVA). */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n protected readonly cvaDisabled = signal(false);\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n private onChange: (value: T | null) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n protected trackOption(opt: RadioOption<T>): string {\n return String(opt.value);\n }\n\n protected isSelected(opt: RadioOption<T>): boolean {\n return Object.is(this.value(), opt.value);\n }\n\n protected markClass(opt: RadioOption<T>): string {\n const base =\n 'pointer-events-none flex size-4 items-center justify-center rounded-full border-2 bg-transparent transition-colors ' +\n 'peer-focus-visible:outline peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ink';\n const err = this.error() ? ' !border-danger dark:!border-danger' : '';\n if (this.isSelected(opt)) {\n // Ring uses mode accent; fill stays transparent so the center dot reads clearly.\n return `${base} ${this.modeColor.classes().border}${err}`;\n }\n return `${base} border-neutral-400 dark:border-white${err}`;\n }\n\n /** Selected inner disc — SFN green / STN orange. */\n protected readonly dotClass = computed(\n () =>\n `block size-1.5 rounded-full ${this.modeColor.classes().bg}`,\n );\n\n /** @param value - Selected option value or `null`. */\n writeValue(value: T | null): void {\n this.value.set(value);\n }\n\n /** @param fn - Selection change callback. */\n registerOnChange(fn: (value: T | null) => void): void {\n this.onChange = fn;\n }\n\n /** @param fn - Blur callback. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @param isDisabled - Blocks interaction when true. */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected select(opt: RadioOption<T>): void {\n if (this.disabled() || opt.disabled) {\n return;\n }\n this.value.set(opt.value);\n this.onChange(opt.value);\n }\n\n protected onBlur(): void {\n this.onTouched();\n }\n}\n","/**\n * Named modal panel widths for {@link ModalService.open}.\n *\n * - `md` — default (forms, confirms): ~32rem\n * - `lg` — dense create/edit forms: ~42rem\n * - `xl` — media / previews: ~56rem\n */\nexport type ModalSize = 'md' | 'lg' | 'xl';\n\n/**\n * Tailwind panel classes for each {@link ModalSize}.\n *\n * Literals must stay static so the host app’s Tailwind scan (UI bundle path)\n * emits the utilities. Widths use `100%` of the overlay wrapper (not `100vw`)\n * so the panel cannot extend under the viewport scrollbar.\n */\nexport const MODAL_SIZE_PANEL_CLASS: Record<ModalSize, readonly string[]> = {\n md: ['max-w-lg', 'w-[min(calc(100%-2rem),32rem)]'],\n lg: ['max-w-2xl', 'w-[min(calc(100%-2rem),42rem)]'],\n xl: ['max-w-4xl', 'w-[min(calc(100%-2rem),56rem)]'],\n};\n","import type { OverlayRef } from '@angular/cdk/overlay';\n\nimport { Observable, Subject } from 'rxjs';\n\nimport type { OverlayHandle } from '@africanies/africanies-core';\n\n/**\n * Concrete {@link OverlayHandle} bound to a CDK {@link OverlayRef}.\n *\n * Provided into the overlay content injector so opened components can call\n * `close(result)` without importing CDK types. Completing `afterClosed`\n * once keeps route sync and confirm flows from double-firing.\n *\n * @typeParam TResult - Value forwarded to `afterClosed` subscribers.\n */\nexport class AfricaniesOverlayRef<TResult = unknown>\n implements OverlayHandle<TResult>\n{\n private readonly closed$ = new Subject<TResult | undefined>();\n private settled = false;\n\n /**\n * @param overlayRef - CDK overlay hosting the content portal.\n * @param playLeave - Optional leave animation that must finish before dispose.\n */\n constructor(\n private readonly overlayRef: OverlayRef,\n private readonly playLeave?: () => Promise<void>,\n ) {}\n\n /**\n * Disposes the overlay and emits `result` on {@link afterClosed}.\n *\n * Idempotent: later calls are ignored so backdrop + ESC + explicit close\n * cannot emit twice. When a leave animation is configured, dispose waits\n * until it finishes so the panel can blur/slide out.\n *\n * @param result - Optional value for callers awaiting the dialog outcome.\n */\n close(result?: TResult): void {\n if (this.settled) {\n return;\n }\n this.settled = true;\n\n const finish = (): void => {\n this.closed$.next(result);\n this.closed$.complete();\n this.overlayRef.dispose();\n };\n\n if (!this.playLeave) {\n finish();\n return;\n }\n\n void this.playLeave().then(finish, finish);\n }\n\n /**\n * Emits once when the overlay finishes closing, then completes.\n *\n * @returns Observable of the close result (or `undefined` if dismissed).\n */\n afterClosed(): Observable<TResult | undefined> {\n return this.closed$.asObservable();\n }\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * DI token for data passed into an overlay-hosted component via\n * {@link ModalService.open} / {@link DrawerService.open}.\n *\n * WHY a token (not constructor args): CDK `ComponentPortal` instantiates the\n * component through DI, so callers cannot pass constructor parameters. Route\n * overlays also forward sibling query params through this same token.\n *\n * @typeParam T - Shape of `config.data` for the opened component.\n *\n * @example\n * ```ts\n * readonly data = inject<EditShipmentData>(OVERLAY_DATA);\n * ```\n */\nexport const OVERLAY_DATA = new InjectionToken<unknown>('AFRICANIES_OVERLAY_DATA');\n","import type { OverlayRef } from '@angular/cdk/overlay';\n\n/** Surface kind — drives enter/leave transform (center scale vs edge slide). */\nexport type OverlaySurface = 'modal' | 'drawer';\n\nconst EASE_OUT = 'cubic-bezier(0.22, 1, 0.36, 1)';\n\nfunction prefersReducedMotion(): boolean {\n return (\n typeof matchMedia === 'function' &&\n matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\n/**\n * Backdrop + panel enter animations after the portal attaches.\n *\n * Uses the Web Animations API so consumers get motion without shipping a\n * separate CSS bundle. Skipped when the user prefers reduced motion.\n * @param overlayRef\n * @param surface\n */\nexport function playOverlayEnter(\n overlayRef: OverlayRef,\n surface: OverlaySurface,\n): void {\n if (prefersReducedMotion()) {\n return;\n }\n\n overlayRef.backdropElement?.animate([{ opacity: 0 }, { opacity: 1 }], {\n duration: 220,\n easing: 'ease-out',\n fill: 'both',\n });\n\n const pane = overlayRef.overlayElement;\n if (surface === 'modal') {\n pane.animate(\n [\n { opacity: 0, transform: 'scale(0.96) translateY(10px)' },\n { opacity: 1, transform: 'scale(1) translateY(0)' },\n ],\n { duration: 260, easing: EASE_OUT, fill: 'both' },\n );\n return;\n }\n\n pane.animate(\n [\n { opacity: 0, transform: 'translateX(100%)' },\n { opacity: 1, transform: 'translateX(0)' },\n ],\n { duration: 300, easing: EASE_OUT, fill: 'both' },\n );\n}\n\n/**\n * Reverse of {@link playOverlayEnter}. Resolves when leave animations finish\n * (or immediately when reduced-motion is on) so dispose can wait.\n * @param overlayRef - Live CDK overlay whose panel/backdrop animate out.\n * @param surface - Modal vs drawer leave keyframes.\n * @returns Promise that resolves when leave animations complete.\n */\nexport function playOverlayLeave(\n overlayRef: OverlayRef,\n surface: OverlaySurface,\n): Promise<void> {\n if (prefersReducedMotion()) {\n return Promise.resolve();\n }\n\n const animations: Animation[] = [];\n\n const backdropAnim = overlayRef.backdropElement?.animate(\n [{ opacity: 1 }, { opacity: 0 }],\n { duration: 160, easing: 'ease-in', fill: 'both' },\n );\n if (backdropAnim) {\n animations.push(backdropAnim);\n }\n\n const pane = overlayRef.overlayElement;\n const paneAnim =\n surface === 'modal'\n ? pane.animate(\n [\n { opacity: 1, transform: 'scale(1) translateY(0)' },\n { opacity: 0, transform: 'scale(0.98) translateY(6px)' },\n ],\n { duration: 160, easing: 'ease-in', fill: 'both' },\n )\n : pane.animate(\n [\n { opacity: 1, transform: 'translateX(0)' },\n { opacity: 0, transform: 'translateX(100%)' },\n ],\n { duration: 220, easing: 'ease-in', fill: 'both' },\n );\n animations.push(paneAnim);\n\n return Promise.all(animations.map((a) => a.finished)).then(() => undefined);\n}\n","import {\n Overlay,\n type OverlayConfig,\n type OverlayRef,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { Injector, type StaticProvider, type Type } from '@angular/core';\n\nimport type { OverlayHandle } from '@africanies/africanies-core';\n\nimport { AfricaniesOverlayRef } from './africanies-overlay-ref';\nimport { OVERLAY_DATA } from './overlay-data.token';\nimport {\n type OverlaySurface,\n playOverlayEnter,\n playOverlayLeave,\n} from './overlay-motion';\n\n/**\n * Shared open options for modal and drawer surfaces.\n *\n * @typeParam TData - Value injected as {@link OVERLAY_DATA}.\n */\nexport interface OverlayOpenConfig<TData = unknown> {\n /** Arbitrary payload for the hosted component (query-param siblings, form seed, …). */\n data?: TData;\n /**\n * When true, backdrop click and Escape dismiss the overlay.\n * Defaults to `false` — dialogs require an explicit close action.\n */\n dismissible?: boolean;\n /** Extra CDK overlay panel classes appended after surface defaults. */\n panelClass?: string | readonly string[];\n}\n\n/**\n * Attaches a standalone component to a CDK overlay and returns an\n * {@link OverlayHandle}.\n *\n * WHY shared helper: modal and drawer differ only in panel positioning /\n * panel classes; close semantics, data injection, and handle lifecycle stay\n * identical so route overlays behave the same on both surfaces.\n *\n * @param overlay\n * @param parentInjector\n * @param component\n * @param overlayConfig\n * @param surface\n * @param config\n * @typeParam TData - {@link OVERLAY_DATA} shape.\n * @typeParam TResult - `close(result)` / `afterClosed` payload.\n * @returns Handle used to close the overlay and observe the result.\n */\nexport function attachOverlayContent<TData = unknown, TResult = unknown>(\n overlay: Overlay,\n parentInjector: Injector,\n component: Type<unknown>,\n overlayConfig: OverlayConfig,\n surface: OverlaySurface,\n config?: OverlayOpenConfig<TData>,\n): OverlayHandle<TResult> {\n const overlayRef: OverlayRef = overlay.create(overlayConfig);\n const handle = new AfricaniesOverlayRef<TResult>(overlayRef, () =>\n playOverlayLeave(overlayRef, surface),\n );\n\n const providers: StaticProvider[] = [\n { provide: AfricaniesOverlayRef, useValue: handle },\n { provide: OVERLAY_DATA, useValue: config?.data },\n ];\n\n const injector = Injector.create({\n parent: parentInjector,\n providers,\n });\n\n const portal = new ComponentPortal(component, null, injector);\n overlayRef.attach(portal);\n playOverlayEnter(overlayRef, surface);\n\n if (config?.dismissible === true) {\n overlayRef.backdropClick().subscribe(() => handle.close());\n overlayRef.keydownEvents().subscribe((event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n handle.close();\n }\n });\n }\n\n return handle;\n}\n","import { Overlay } from '@angular/cdk/overlay';\nimport { inject, Injectable, Injector, type Type } from '@angular/core';\n\nimport type { OverlayHandle, OverlayOpener } from '@africanies/africanies-core';\n\nimport { MODAL_SIZE_PANEL_CLASS, type ModalSize } from './modal-size';\nimport {\n attachOverlayContent,\n type OverlayOpenConfig,\n} from './overlay-attach';\n\n/**\n * Open options for {@link ModalService} (shared overlay flags + width size).\n *\n * @typeParam TData - Value injected as {@link OVERLAY_DATA}.\n */\nexport interface ModalOpenConfig<TData = unknown>\n extends OverlayOpenConfig<TData> {\n /**\n * Panel width. Defaults to `md`.\n * Use `lg` for dense forms; `xl` for media previews.\n */\n size?: ModalSize;\n}\n\n/**\n * Opens centered modal dialogs via Angular CDK Overlay.\n *\n * Implements {@link OverlayOpener} so {@link RouteOverlayService} can open\n * the same surface through {@link MODAL_SERVICE} without importing this\n * package. Prefer {@link provideAfricaniesUiOverlays} at bootstrap so the token\n * binding is registered once.\n *\n * @example\n * ```ts\n * // app.config.ts\n * providers: [provideAfricaniesUiOverlays()]\n *\n * // Open from a feature\n * @Component({ standalone: true, template: `…` })\n * class EditShipmentModal {\n * readonly data = inject<{ id: string }>(OVERLAY_DATA);\n * private readonly ref = inject(AfricaniesOverlayRef<Shipment>);\n *\n * save(updated: Shipment): void {\n * // WHY close with a result: callers awaiting afterClosed() can apply\n * // the saved entity without a second fetch.\n * this.ref.close(updated);\n * }\n *\n * dismiss(): void {\n * this.ref.close();\n * }\n * }\n *\n * const modal = inject(ModalService);\n * const handle = modal.open< { id: string }, Shipment >(EditShipmentModal, {\n * data: { id: shipmentId },\n * });\n *\n * // Wider form modal:\n * modal.open(CouponFormModal, { data, size: 'lg' });\n *\n * // Opt into backdrop / Escape dismiss:\n * modal.open(QuickLookModal, { dismissible: true });\n *\n * handle.afterClosed().subscribe((result) => {\n * if (result) {\n * // apply saved shipment\n * }\n * });\n * ```\n */\n@Injectable()\nexport class ModalService implements OverlayOpener {\n private readonly overlay = inject(Overlay);\n private readonly injector = inject(Injector);\n\n /**\n * Opens `component` in a centered modal with a dimmed backdrop.\n *\n * Not dismissible by default — backdrop click and Escape do nothing unless\n * `config.dismissible` is `true`. `config.data` is available inside the\n * hosted component via {@link OVERLAY_DATA}; call\n * `inject(AfricaniesOverlayRef).close(result)` to dismiss with a value.\n *\n * Panel height is capped at `90vh`. The pane itself does not scroll — the\n * hosted component does, with a reserved scrollbar gutter so overlay\n * scrollbars cannot cover a top-right close control. Width comes from\n * {@link ModalOpenConfig.size} (`md` default). Prefer `100%` (overlay\n * wrapper) over `100vw` so the panel never sits under the viewport\n * scrollbar.\n *\n * @typeParam TData - Shape injected as {@link OVERLAY_DATA}.\n * @typeParam TResult - Value emitted by `afterClosed` when closed with a result.\n * @param component - Standalone component type to attach via ComponentPortal.\n * @param config - Optional data bag, size, and close-behavior flags.\n * @returns Handle used to close the modal and observe dismissal.\n *\n * @example\n * ```ts\n * // 1) Hosted component reads data and closes with a result\n * @Component({\n * standalone: true,\n * template: `\n * <h2>Edit {{ data.id }}</h2>\n * <button type=\"button\" (click)=\"ref.close({ saved: true })\">Save</button>\n * `,\n * })\n * class EditModal {\n * readonly data = inject<{ id: string }>(OVERLAY_DATA);\n * readonly ref = inject(AfricaniesOverlayRef<{ saved: boolean }>);\n * }\n *\n * // 2) Caller opens and awaits the result\n * const handle = inject(ModalService).open<{ id: string }, { saved: boolean }>(\n * EditModal,\n * { data: { id: 'SHP-1' } },\n * );\n * handle.afterClosed().subscribe((result) => {\n * console.log(result?.saved); // true when Save was clicked; undefined on Cancel\n * });\n * ```\n */\n open<TData = unknown, TResult = unknown>(\n component: Type<unknown>,\n config?: ModalOpenConfig<TData>,\n ): OverlayHandle<TResult> {\n const extraPanelClass =\n config?.panelClass == null\n ? []\n : Array.isArray(config.panelClass)\n ? [...config.panelClass]\n : [config.panelClass];\n const size = config?.size ?? 'md';\n const sizeClasses = MODAL_SIZE_PANEL_CLASS[size];\n\n return attachOverlayContent<TData, TResult>(\n this.overlay,\n this.injector,\n component,\n {\n hasBackdrop: true,\n // Token-named utilities: consumers' Tailwind scan picks these up from\n // the published UI bundle content path (see africanies-theme THEME.md).\n backdropClass: [\n 'africanies-overlay-backdrop',\n 'bg-ink/45',\n 'backdrop-blur-sm',\n 'dark:bg-ink/60',\n ],\n panelClass: [\n 'africanies-modal-panel',\n 'bg-white',\n 'dark:bg-ink-950',\n 'text-ink',\n 'dark:text-white',\n 'rounded-lg',\n 'shadow-xl',\n 'border',\n 'border-border',\n 'dark:border-white/15',\n 'p-6',\n 'box-border',\n // CDK pane is `display: flex` (row). Column + stretch makes hosted\n // content fill the panel so left/right padding stays even.\n 'flex',\n 'flex-col',\n 'items-stretch',\n ...sizeClasses,\n 'min-h-0',\n 'will-change-transform',\n ...extraPanelClass,\n '!overflow-hidden',\n // Always cap viewport usage — after extras so hosts cannot stretch full height.\n '!max-h-[90vh]',\n ],\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay\n .position()\n .global()\n .centerHorizontally()\n .centerVertically(),\n },\n 'modal',\n config,\n );\n }\n}\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n type ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport { ModalService } from '../../overlay/modal.service';\nimport {\n FORM_AFFIX_CLASS,\n FORM_DISABLED_CLASS,\n FORM_ERROR_CLASS,\n FORM_FIELD_CLASS,\n FORM_FIELD_ERROR_CLASS,\n FORM_HINT_CLASS,\n FORM_LABEL_CLASS,\n} from '../form-field.classes';\nimport type { SelectCreateConfig, SelectOption, SelectSize } from './select.types';\n\nlet nextSelectId = 0;\n\n/** Preferred panel placement — flips upward when there is no room below. */\nconst SELECT_PANEL_POSITIONS: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 4,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -4,\n },\n];\n\n/**\n * Option select following the shared AFRICANIES form field pattern.\n *\n * ## Single vs multiple (`selectedChange` shape)\n *\n * - **`multiple=false` (default):** `selected` / CVA / `selectedChange` use\n * `SelectOption<T> | null` — selecting replaces the previous value.\n * - **`multiple=true`:** `selected` / CVA / `selectedChange` use\n * `SelectOption<T>[]` — every change emits the **full** selection array.\n * Switching modes is a breaking type change for consumers; do not assume one\n * output shape works for both.\n *\n * ## Create paths\n *\n * - **`allowFreeText`** (requires `searchable`): inline “Add \\<query\\>” when the\n * search text does not exactly match an option label — for string-only options\n * with no backing entity.\n * - **`create`**: modal via {@link ModalService} + {@link OVERLAY_DATA} — for\n * entities that need a real creation flow. Independent of free-text; both may\n * be enabled together.\n *\n * The dropdown panel is a **CDK overlay** (attached to `body`) so it is not\n * clipped by parent `overflow: hidden` / transform containing blocks.\n * Click-outside (transparent backdrop + `overlayOutsideClick`) and Escape\n * dismiss the panel.\n *\n * ## Prefix / suffix\n *\n * - **Control slots** — project into the shell with `[prefix]` / `[suffix]`\n * (same pattern as TextInput). Used as the empty-state affixes. Set\n * `[showTriggerIcon]=\"false\"` when the suffix replaces the built-in caret.\n * - **Option slots** — set `prefix` / `suffix` on each {@link SelectOption} to\n * an `IconName`. In the list/chips always; in **single-select**, when an\n * option is selected its icons replace the shell prefix/suffix slots.\n *\n * @typeParam T - Option value type.\n *\n * @example\n * ```html\n * <africanies-select\n * label=\"Warehouse\"\n * [options]=\"warehouses()\"\n * [searchable]=\"true\"\n * [(selected)]=\"selectedWarehouse\"\n * [error]=\"loadError()\"\n * [loading]=\"loading()\"\n * [retrying]=\"loading()\"\n * [showRetry]=\"true\"\n * (retry)=\"loadWarehouses()\"\n * >\n * <africanies-icon prefix name=\"warehouse\" [size]=\"16\" />\n * </africanies-select>\n * ```\n * ```ts\n * warehouses = signal<SelectOption[]>([\n * { label: 'Lagos Hub', value: 'los', prefix: 'warehouse', suffix: 'globe' },\n * ]);\n * ```\n */\n@Component({\n selector: 'africanies-select',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, CdkOverlayOrigin, CdkConnectedOverlay],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectComponent),\n multi: true,\n },\n ],\n host: {\n class: 'relative block',\n },\n template: `\n <label [attr.for]=\"controlId\" [class]=\"labelClass\">{{ label() }}</label>\n <!--\n WHY click on the non-focusable shell: prefix/suffix sit outside the\n listbox trigger button. Keyboard users still tab to that inner button.\n This only expands the pointer hit target.\n -->\n <!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n <!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n <div\n cdkOverlayOrigin\n #triggerOrigin=\"cdkOverlayOrigin\"\n [class]=\"shellClass()\"\n (click)=\"onShellClick()\"\n >\n @if (shellPrefix(); as prefixIcon) {\n <span [class]=\"affixClass\" data-slot=\"prefix\">\n <africanies-icon [name]=\"prefixIcon\" [size]=\"16\" class=\"shrink-0\" />\n </span>\n } @else if (shellPrefixImageUrl(); as prefixImageUrl) {\n <span [class]=\"affixClass\" data-slot=\"prefix\">\n <img\n [src]=\"prefixImageUrl\"\n alt=\"\"\n [class]=\"optionPrefixImageClass\"\n loading=\"lazy\"\n aria-hidden=\"true\"\n />\n </span>\n } @else if (shellPrefixText(); as prefixText) {\n <span [class]=\"affixClass\" data-slot=\"prefix\" aria-hidden=\"true\">\n {{ prefixText }}\n </span>\n }\n <!--\n Keep ng-content always mounted so projection is not dropped by @if/@else.\n When the selected option owns the affix, hide this slot; otherwise\n empty:hidden collapses unused gutters.\n -->\n <span\n [class]=\"affixClass\"\n data-slot=\"prefix\"\n [class.hidden]=\"!!shellPrefix() || !!shellPrefixImageUrl() || !!shellPrefixText()\"\n >\n <ng-content select=\"[prefix]\" />\n </span>\n <div\n class=\"flex h-full min-h-0 min-w-0 flex-1 flex-wrap items-center gap-1.5 py-0\"\n [class.px-3]=\"size() !== 'sm'\"\n [class.px-2]=\"size() === 'sm'\"\n >\n @if (multiple() && selectedList().length) {\n @for (chip of selectedList(); track trackOption(chip)) {\n <span\n class=\"inline-flex items-center gap-1 rounded-md border border-neutral-300 bg-background-welcome dark:border-white/20 dark:bg-ink text-body-sm text-ink dark:text-white px-2 py-0.5\"\n >\n @if (chip.prefix; as prefixIcon) {\n <africanies-icon [name]=\"prefixIcon\" [size]=\"14\" class=\"shrink-0\" />\n } @else if (chip.prefixImageUrl) {\n <img\n [src]=\"chip.prefixImageUrl\"\n alt=\"\"\n [class]=\"optionPrefixImageClass\"\n loading=\"lazy\"\n aria-hidden=\"true\"\n />\n } @else if (chip.prefixText) {\n <span class=\"shrink-0\" aria-hidden=\"true\">{{ chip.prefixText }}</span>\n }\n {{ chip.label }}\n @if (chip.suffix; as suffixIcon) {\n <africanies-icon [name]=\"suffixIcon\" [size]=\"14\" class=\"shrink-0\" />\n }\n <button\n type=\"button\"\n class=\"inline-flex cursor-pointer text-neutral-600 dark:text-neutral-400 hover:text-ink dark:hover:text-white disabled:cursor-not-allowed\"\n [attr.aria-label]=\"'Remove ' + chip.label\"\n [disabled]=\"disabled()\"\n (click)=\"removeChip(chip, $event)\"\n >\n <africanies-icon name=\"close-small\" [size]=\"12\" />\n </button>\n </span>\n }\n }\n <button\n [id]=\"controlId\"\n type=\"button\"\n class=\"flex flex-1 cursor-pointer items-center justify-between gap-2 min-w-[6rem] text-left bg-transparent border-0 outline-none disabled:cursor-not-allowed\"\n [class.text-body]=\"size() !== 'sm'\"\n [class.text-body-sm]=\"size() === 'sm'\"\n [disabled]=\"triggerDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-busy]=\"loading() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"onTriggerClick($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (blur)=\"onBlur()\"\n >\n <span\n class=\"min-w-0 truncate\"\n [class.text-neutral-400]=\"\n !loading() && !displayLabel() && !hasMultiSelection()\n \"\n >\n @if (loading() && !displayLabel() && !hasMultiSelection()) {\n {{ loadingLabel() }}\n } @else {\n {{ displayLabel() || triggerText() }}\n }\n </span>\n @if (loading()) {\n <africanies-icon\n name=\"spinner\"\n [size]=\"16\"\n [class]=\"'shrink-0 animate-spin ' + modeColor.classes().text\"\n aria-hidden=\"true\"\n />\n } @else if (showTriggerIcon()) {\n <africanies-icon\n name=\"angle-down\"\n [size]=\"16\"\n class=\"shrink-0 text-neutral-600 dark:text-neutral-400\"\n />\n }\n </button>\n </div>\n @if (shellSuffix(); as suffixIcon) {\n <span [class]=\"affixClass\" data-slot=\"suffix\">\n <africanies-icon [name]=\"suffixIcon\" [size]=\"16\" class=\"shrink-0\" />\n </span>\n }\n <span\n [class]=\"affixClass\"\n data-slot=\"suffix\"\n [class.hidden]=\"!!shellSuffix()\"\n >\n <ng-content select=\"[suffix]\" />\n </span>\n </div>\n <!-- eslint-enable @angular-eslint/template/click-events-have-key-events -->\n <!-- eslint-enable @angular-eslint/template/interactive-supports-focus -->\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"panelPositions\"\n [cdkConnectedOverlayWidth]=\"panelWidth()\"\n [cdkConnectedOverlayMinWidth]=\"panelWidth()\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"closePanel()\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n (detach)=\"onOverlayDetach()\"\n >\n <div\n class=\"w-full rounded-md border border-border dark:border-white/15 bg-white dark:bg-ink-950 shadow-lg max-h-64 overflow-auto africanies-overlay-scroll\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.aria-multiselectable]=\"multiple() || null\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n @if (searchable()) {\n <div\n class=\"sticky top-0 z-[1] bg-white dark:bg-ink-950 border-b border-border dark:border-white/10 p-2\"\n >\n <input\n #searchInput\n type=\"search\"\n class=\"w-full rounded-md border border-neutral-300 dark:border-white/25 bg-transparent text-body text-ink dark:text-white px-2.5 py-1.5 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink\"\n [value]=\"searchQuery()\"\n placeholder=\"Search…\"\n (input)=\"onSearchInput($event)\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n </div>\n }\n\n @if (loading()) {\n <div\n class=\"flex items-center gap-2 px-3 py-2 text-body-sm text-neutral-600 dark:text-neutral-400\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <africanies-icon\n name=\"spinner\"\n [size]=\"16\"\n [class]=\"'shrink-0 animate-spin ' + modeColor.classes().text\"\n />\n {{ loadingLabel() }}\n </div>\n } @else {\n @if (create(); as createCfg) {\n <button\n type=\"button\"\n [class]=\"createRowClass()\"\n (click)=\"onCreateClick($event)\"\n (mouseenter)=\"activeIndex.set(createIndex())\"\n >\n <africanies-icon name=\"file-add\" [size]=\"16\" />\n {{ createCfg.label }}\n </button>\n }\n\n @if (showFreeTextRow()) {\n <button\n type=\"button\"\n [class]=\"freeTextClass()\"\n role=\"option\"\n [attr.aria-selected]=\"false\"\n (click)=\"onFreeTextClick($event)\"\n (mouseenter)=\"activeIndex.set(freeTextIndex())\"\n >\n Add \"{{ searchQuery().trim() }}\"\n </button>\n }\n }\n\n @if (filteredOptions().length === 0 && !showFreeTextRow() && !loading()) {\n <div class=\"px-3 py-2 text-body-sm text-neutral-600 dark:text-neutral-400\">\n No matches\n </div>\n }\n\n @for (opt of filteredOptions(); track trackOption(opt); let i = $index) {\n <button\n type=\"button\"\n [class]=\"optionClass(i)\"\n [disabled]=\"isOptionDisabled(opt)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(opt)\"\n (click)=\"selectOption(opt)\"\n (mouseenter)=\"activeIndex.set(optionIndex(i))\"\n >\n @if (multiple()) {\n <span [class]=\"multiCheckClass(opt)\">\n @if (isSelected(opt)) {\n <africanies-icon name=\"check\" [size]=\"12\" />\n }\n </span>\n }\n @if (opt.prefix; as prefixIcon) {\n <africanies-icon [name]=\"prefixIcon\" [size]=\"16\" class=\"shrink-0\" />\n } @else if (opt.prefixImageUrl) {\n <img\n [src]=\"opt.prefixImageUrl\"\n alt=\"\"\n [class]=\"optionPrefixImageClass\"\n loading=\"lazy\"\n aria-hidden=\"true\"\n />\n } @else if (opt.prefixText) {\n <span class=\"shrink-0\" aria-hidden=\"true\">{{ opt.prefixText }}</span>\n }\n <span class=\"min-w-0 flex-1 truncate text-left\">{{ opt.label }}</span>\n @if (opt.suffix; as suffixIcon) {\n <africanies-icon [name]=\"suffixIcon\" [size]=\"16\" class=\"shrink-0\" />\n }\n </button>\n }\n\n @if (multiple() && maxSelected() !== null && maxSelected() !== undefined) {\n <div\n class=\"px-3 py-1.5 text-caption text-neutral-600 dark:text-neutral-400 border-t border-border dark:border-white/10\"\n >\n Up to {{ maxSelected() }} selected\n </div>\n }\n\n </div>\n </ng-template>\n\n @if (error(); as err) {\n <p\n [id]=\"errorId\"\n [class]=\"errorClass\"\n class=\"flex flex-wrap items-center gap-x-1\"\n role=\"alert\"\n >\n <span>{{ err }}</span>\n @if (showRetry()) {\n <button\n type=\"button\"\n class=\"inline cursor-pointer underline font-medium text-danger hover:text-danger/80 disabled:cursor-not-allowed disabled:no-underline disabled:opacity-50\"\n [disabled]=\"disabled() || retrying()\"\n (click)=\"onRetry($event)\"\n >\n {{ retrying() ? retryingLabel() : retryLabel() }}\n </button>\n }\n </p>\n } @else if (loading()) {\n <p [id]=\"hintId\" [class]=\"hintClass\" role=\"status\" aria-live=\"polite\">\n <span class=\"inline-flex items-center gap-1.5\">\n <africanies-icon\n name=\"spinner\"\n [size]=\"14\"\n [class]=\"'shrink-0 animate-spin ' + modeColor.classes().text\"\n />\n {{ loadingLabel() }}\n </span>\n </p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n `,\n})\nexport class SelectComponent<T = string> implements ControlValueAccessor {\n private readonly modal = inject(ModalService, { optional: true });\n protected readonly modeColor = inject(ModeColorService);\n\n protected readonly controlId = `africanies-select-${++nextSelectId}`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n\n protected readonly labelClass = FORM_LABEL_CLASS;\n protected readonly affixClass = FORM_AFFIX_CLASS;\n /** Leading flag / avatar image in option rows and the single-select shell. */\n protected readonly optionPrefixImageClass =\n 'size-4 shrink-0 rounded-full object-cover';\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n protected readonly panelPositions = SELECT_PANEL_POSITIONS;\n\n /** Floor width for the overlay panel when the trigger width is unknown. */\n protected readonly minPanelWidth = 224;\n\n private readonly searchInput =\n viewChild<ElementRef<HTMLInputElement>>('searchInput');\n private readonly triggerOrigin = viewChild(CdkOverlayOrigin);\n\n /** Visible field label. */\n readonly label = input('');\n\n /** Helper copy. Hidden while {@link error} is set. */\n readonly hint = input<string | undefined>(undefined);\n\n /** Field-level validation or load message. Distinct from `ErrorStateComponent`. */\n readonly error = input<string | null>(null);\n\n /**\n * When true, shows an inline Retry control next to {@link error}.\n * Use for async option load failures with `(retry)`. Leave false for\n * validation messages (e.g. “Type is required.”).\n */\n readonly showRetry = input(false, { transform: booleanAttribute });\n\n /** Retry link label when {@link showRetry} is true. */\n readonly retryLabel = input('Retry');\n\n /** Retry link copy while {@link retrying} is true. */\n readonly retryingLabel = input('Retrying…');\n\n /**\n * When true, the inline retry control is disabled and shows {@link retryingLabel}.\n */\n readonly retrying = input(false, { transform: booleanAttribute });\n\n /**\n * Emitted when the user activates the inline retry control.\n * Pair with {@link showRetry} for async option load failures.\n */\n readonly retry = output<void>();\n\n /**\n * Emitted as the user types in the searchable panel filter.\n * Use for server-side option search; pair with {@link loading}.\n */\n readonly searchChange = output<string>();\n\n /**\n * When true, options are loading — spinner on the trigger, panel, and hint row.\n * Blocks opening the panel until loading completes.\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Copy shown while {@link loading} is true. */\n readonly loadingLabel = input('Loading…');\n\n /** Placeholder when nothing is selected. */\n readonly placeholder = input('');\n\n /**\n * Full option list (`[(options)]` / `(optionsChange)`). Parent usually owns\n * the canonical list — listen to `optionsChange` after create/free-text.\n */\n readonly options = model<SelectOption<T>[]>([]);\n\n /**\n * Current selection (`[(selected)]` / `(selectedChange)`).\n *\n * **Shape depends on {@link multiple}:**\n * - single → `SelectOption<T> | null`\n * - multiple → `SelectOption<T>[]` (full array on every change)\n *\n * Switching modes is a breaking type change for consumers.\n */\n readonly selected = model<SelectOption<T> | SelectOption<T>[] | null>(null);\n\n /**\n * When true, show a search field that filters options by label\n * (case-insensitive substring). Required for {@link allowFreeText}.\n */\n readonly searchable = input(false, { transform: booleanAttribute });\n\n /**\n * When true (and {@link searchable}), show an inline “Add \\<query\\>” row when\n * the query does not exactly match an existing label. Independent of\n * {@link create}.\n */\n readonly allowFreeText = input(false, { transform: booleanAttribute });\n\n /**\n * When true, selection is `SelectOption[]` with chips + checkboxes; the\n * panel stays open after each pick.\n */\n readonly multiple = input(false, { transform: booleanAttribute });\n\n /**\n * Optional cap in multiple mode. Remaining unselected options disable when\n * reached (clicks are not silently ignored without UI feedback).\n */\n readonly maxSelected = input<number | null, unknown>(null, {\n transform: (v) => {\n if (v === null || v === undefined || v === '') {\n return null;\n }\n return numberAttribute(v);\n },\n });\n\n /**\n * Modal-create config. Opens via {@link ModalService}; result is mapped with\n * `mapResult`, appended to options, then selected.\n */\n readonly create = input<SelectCreateConfig<unknown, T> | null>(null);\n\n /** Host disable flag (in addition to CVA). */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n /**\n * When false, hides the built-in `angle-down` on the trigger so callers can\n * supply a chevron via the `[suffix]` slot (e.g. compact page-size selects).\n * Loading still shows the spinner on the trigger.\n */\n readonly showTriggerIcon = input(true, { transform: booleanAttribute });\n\n /**\n * Control height. Defaults to `md` (`h-10`). Use `sm` (`h-8`) next to\n * sm `africanies-button` (pagination size picker).\n */\n readonly size = input<SelectSize>('md');\n\n protected readonly open = signal(false);\n protected readonly searchQuery = signal('');\n protected readonly activeIndex = signal(0);\n protected readonly cvaDisabled = signal(false);\n protected readonly panelWidth = signal<number | string>('auto');\n\n /** Suppresses re-entrant close when CDK emits `detach` after we already closed. */\n private closingFromApi = false;\n\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n /** True while async options are loading or a retry is in flight. */\n protected readonly isBusy = computed(\n () => this.loading() || this.retrying(),\n );\n\n /** Trigger is not interactive while disabled or loading. */\n protected readonly triggerDisabled = computed(\n () => this.disabled() || this.isBusy(),\n );\n\n protected readonly shellClass = computed(() => {\n let classes = FORM_FIELD_CLASS;\n if (this.error()) {\n classes += ` ${FORM_FIELD_ERROR_CLASS}`;\n }\n if (this.size() === 'sm') {\n classes += ' !h-8';\n }\n if (this.multiple() && this.selectedList().length) {\n classes += ' !h-auto min-h-10 items-stretch py-1.5';\n }\n if (this.disabled()) {\n classes += ` ${FORM_DISABLED_CLASS}`;\n } else if (this.loading()) {\n classes += ' cursor-wait';\n } else {\n // Whole shell is the hit target (prefix/suffix affixes sit outside the\n // trigger button); pointer cues that.\n classes += ' cursor-pointer';\n }\n return classes;\n });\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.loading()) {\n return this.hintId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n protected readonly selectedList = computed((): SelectOption<T>[] => {\n const sel = this.selected();\n if (this.multiple()) {\n return Array.isArray(sel) ? sel : [];\n }\n return sel && !Array.isArray(sel) ? [sel] : [];\n });\n\n protected readonly filteredOptions = computed(() => {\n const q = this.searchQuery().trim().toLowerCase();\n const opts = this.options();\n if (!this.searchable() || !q) {\n return opts;\n }\n return opts.filter((o) => o.label.toLowerCase().includes(q));\n });\n\n protected readonly showFreeTextRow = computed(() => {\n if (!this.allowFreeText() || !this.searchable()) {\n return false;\n }\n const q = this.searchQuery().trim();\n if (!q) {\n return false;\n }\n return !this.options().some(\n (o) => o.label.toLowerCase() === q.toLowerCase(),\n );\n });\n\n protected readonly createIndex = computed(() => (this.create() ? 0 : -1));\n\n protected readonly freeTextIndex = computed(() => {\n if (!this.showFreeTextRow()) {\n return -1;\n }\n return this.create() ? 1 : 0;\n });\n\n protected readonly navigableCount = computed(() => {\n const create = this.create() ? 1 : 0;\n const free = this.showFreeTextRow() ? 1 : 0;\n return free + this.filteredOptions().length + create;\n });\n\n protected readonly displayLabel = computed(() => {\n // Multiple mode shows chips; keep the trigger text empty so chips own the labels.\n if (this.multiple()) {\n return '';\n }\n const sel = this.selected();\n return sel && !Array.isArray(sel) ? sel.label : '';\n });\n\n /** True when multiple mode has at least one chip selected. */\n protected readonly hasMultiSelection = computed(\n () => this.multiple() && this.selectedList().length > 0,\n );\n\n /**\n * Placeholder for the trigger — hidden in multiple mode once chips exist.\n */\n protected readonly triggerText = computed(() => {\n if (this.hasMultiSelection()) {\n return '';\n }\n return this.placeholder() || 'Select…';\n });\n\n /**\n * Single-select current option (for shell prefix/suffix icons).\n * `null` in multiple mode or when nothing is selected.\n */\n protected readonly singleSelected = computed((): SelectOption<T> | null => {\n if (this.multiple()) {\n return null;\n }\n const sel = this.selected();\n return sel && !Array.isArray(sel) ? sel : null;\n });\n\n /** Selected option prefix → shell prefix slot (single-select only). */\n protected readonly shellPrefix = computed(\n () => this.singleSelected()?.prefix ?? null,\n );\n\n /** Selected option image prefix → shell prefix slot (single-select only). */\n protected readonly shellPrefixImageUrl = computed(() => {\n if (this.shellPrefix()) {\n return null;\n }\n return this.singleSelected()?.prefixImageUrl ?? null;\n });\n\n /** Selected option text prefix → shell prefix slot (single-select only). */\n protected readonly shellPrefixText = computed(() => {\n if (this.shellPrefix() || this.shellPrefixImageUrl()) {\n return null;\n }\n return this.singleSelected()?.prefixText ?? null;\n });\n\n /** Selected option suffix → shell suffix slot (single-select only). */\n protected readonly shellSuffix = computed(\n () => this.singleSelected()?.suffix ?? null,\n );\n\n private onChange: (\n value: SelectOption<T> | SelectOption<T>[] | null,\n ) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n /**\n * Active/hover option classes — soft mode accent (not near-white\n * `background-welcome`, which made light text illegible in dark mode).\n *\n * @param filteredIndex - Index within {@link filteredOptions}.\n * @returns Tailwind class string for the option button.\n */\n protected optionClass(filteredIndex: number): string {\n const active = this.activeIndex() === this.optionIndex(filteredIndex);\n const colors = this.modeColor.classes();\n const base =\n 'flex w-full cursor-pointer items-center gap-2 px-3 py-2 text-left text-body text-ink dark:text-white disabled:opacity-50 disabled:cursor-not-allowed';\n return active\n ? `${base} ${colors.soft}`\n : `${base} ${colors.softHover}`;\n }\n\n /** @returns Classes for the free-text create row. */\n protected freeTextClass(): string {\n const active = this.activeIndex() === this.freeTextIndex();\n const colors = this.modeColor.classes();\n const base = `flex w-full cursor-pointer items-center gap-2 px-3 py-2 text-left text-body ${colors.text}`;\n return active\n ? `${base} ${colors.soft}`\n : `${base} ${colors.softHover}`;\n }\n\n /** @returns Classes for the modal-create trigger row. */\n protected createRowClass(): string {\n const active = this.activeIndex() === this.createIndex();\n const colors = this.modeColor.classes();\n const base = `flex w-full cursor-pointer items-center gap-2 px-3 py-2 text-left text-body ${colors.text}`;\n return active\n ? `${base} ${colors.soft}`\n : `${base} ${colors.softHover}`;\n }\n\n /**\n * Multi-select checkbox chrome for a list option.\n * @param opt - Option whose selection state drives the mark.\n * @returns Tailwind class string for the checkbox glyph.\n */\n protected multiCheckClass(opt: SelectOption<T>): string {\n const base =\n 'inline-flex size-4 items-center justify-center rounded border shrink-0 text-white dark:border-white/20';\n if (!this.isSelected(opt)) {\n return `${base} border-neutral-400`;\n }\n const c = this.modeColor.classes();\n return `${base} ${c.bg} ${c.border}`;\n }\n\n /**\n * @param value - Selection; shape must match {@link multiple}.\n */\n writeValue(value: SelectOption<T> | SelectOption<T>[] | null): void {\n this.selected.set(value);\n }\n\n /**\n * @param fn - Selection change for Reactive Forms.\n */\n registerOnChange(\n fn: (value: SelectOption<T> | SelectOption<T>[] | null) => void,\n ): void {\n this.onChange = fn;\n }\n\n /** @param fn - Touched callback. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @param isDisabled - Blocks interaction when true. */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected trackOption(opt: SelectOption<T>): string {\n return `${opt.label}:${String(opt.value)}`;\n }\n\n protected optionIndex(filteredIndex: number): number {\n return (\n (this.create() ? 1 : 0) + (this.showFreeTextRow() ? 1 : 0) + filteredIndex\n );\n }\n\n protected isSelected(opt: SelectOption<T>): boolean {\n return this.selectedList().some((s) => Object.is(s.value, opt.value));\n }\n\n protected isOptionDisabled(opt: SelectOption<T>): boolean {\n if (opt.disabled || this.disabled() || this.loading()) {\n return true;\n }\n if (!this.multiple()) {\n return false;\n }\n const max = this.maxSelected();\n if (max == null) {\n return false;\n }\n if (this.isSelected(opt)) {\n return false;\n }\n return this.selectedList().length >= max;\n }\n\n /**\n * Opens/closes when the user clicks the shell chrome (prefix/suffix slots\n * sit outside the trigger button).\n */\n protected onShellClick(): void {\n this.toggleOpen();\n }\n\n /**\n * Trigger button path — stop bubbling so {@link onShellClick} does not\n * double-toggle.\n * @param event - Pointer event from the listbox trigger.\n */\n protected onTriggerClick(event: MouseEvent): void {\n event.stopPropagation();\n this.toggleOpen();\n }\n\n protected toggleOpen(): void {\n if (this.triggerDisabled()) {\n return;\n }\n if (this.open()) {\n this.closePanel();\n return;\n }\n this.openPanel();\n }\n\n /** Sync panel width to the trigger shell (exact match when measurable). */\n protected openPanel(): void {\n const origin = this.triggerOrigin()?.elementRef.nativeElement as\n | HTMLElement\n | undefined;\n const triggerWidth = origin?.getBoundingClientRect().width ?? 0;\n this.panelWidth.set(\n triggerWidth > 0 ? triggerWidth : this.minPanelWidth,\n );\n this.open.set(true);\n this.activeIndex.set(0);\n queueMicrotask(() => this.searchInput()?.nativeElement.focus());\n }\n\n protected closePanel(): void {\n if (!this.open()) {\n return;\n }\n this.closingFromApi = true;\n this.open.set(false);\n this.onTouched();\n queueMicrotask(() => {\n this.closingFromApi = false;\n });\n }\n\n /**\n * Dismiss when the user clicks outside the panel.\n * Clicks on the trigger are ignored so {@link toggleOpen} owns that path\n * (avoids close-then-reopen when the transparent backdrop is not covering).\n * @param event\n */\n protected onOutsideClick(event: MouseEvent): void {\n const origin = this.triggerOrigin()?.elementRef.nativeElement as\n | HTMLElement\n | undefined;\n const target = event.target as Node | null;\n if (origin && target && origin.contains(target)) {\n return;\n }\n this.closePanel();\n }\n\n /** CDK detach (e.g. scroll strategy) — keep `open` in sync without double-touch. */\n protected onOverlayDetach(): void {\n if (this.closingFromApi) {\n return;\n }\n if (this.open()) {\n this.open.set(false);\n this.onTouched();\n }\n }\n\n protected onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchQuery.set(value);\n this.activeIndex.set(0);\n this.searchChange.emit(value);\n }\n\n /**\n * Search sits inside the listbox; without stopping propagation, Enter /\n * arrows run {@link onPanelKeydown} twice (input then listbox) and the\n * second pass toggles the first option — deselecting an existing chip\n * right after a free-text add.\n * @param event\n */\n protected onSearchKeydown(event: KeyboardEvent): void {\n event.stopPropagation();\n this.onPanelKeydown(event);\n }\n\n protected onFreeTextClick(event: MouseEvent): void {\n event.stopPropagation();\n this.commitFreeText();\n }\n\n protected onCreateClick(event: MouseEvent): void {\n event.stopPropagation();\n this.openCreateModal();\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.disabled()) {\n return;\n }\n if (\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp' ||\n event.key === 'Enter' ||\n event.key === ' '\n ) {\n event.preventDefault();\n if (!this.open()) {\n this.openPanel();\n } else if (event.key === 'Enter' || event.key === ' ') {\n this.activateCurrent();\n } else {\n this.moveActive(event.key === 'ArrowDown' ? 1 : -1);\n }\n } else if (event.key === 'Escape') {\n this.closePanel();\n }\n }\n\n protected onPanelKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.moveActive(1);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.moveActive(-1);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n this.activateCurrent();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.closePanel();\n }\n }\n\n protected moveActive(delta: number): void {\n const count = this.navigableCount();\n if (count === 0) {\n return;\n }\n const next = (this.activeIndex() + delta + count) % count;\n this.activeIndex.set(next);\n }\n\n protected activateCurrent(): void {\n const idx = this.activeIndex();\n if (this.showFreeTextRow() && idx === this.freeTextIndex()) {\n this.commitFreeText();\n return;\n }\n if (this.create() && idx === this.createIndex()) {\n this.openCreateModal();\n return;\n }\n const optIdx =\n idx - (this.create() ? 1 : 0) - (this.showFreeTextRow() ? 1 : 0);\n const opt = this.filteredOptions()[optIdx];\n if (opt) {\n this.selectOption(opt);\n }\n }\n\n protected selectOption(opt: SelectOption<T>): void {\n if (this.isOptionDisabled(opt)) {\n return;\n }\n if (this.multiple()) {\n const current = [...this.selectedList()];\n const existing = current.findIndex((s) => Object.is(s.value, opt.value));\n if (existing >= 0) {\n current.splice(existing, 1);\n } else {\n current.push(opt);\n }\n this.commitSelection(current);\n // Stay open so the user can pick several without reopening.\n return;\n }\n this.commitSelection(opt);\n this.closePanel();\n this.searchQuery.set('');\n }\n\n protected removeChip(opt: SelectOption<T>, event: Event): void {\n event.stopPropagation();\n if (this.disabled()) {\n return;\n }\n const next = this.selectedList().filter(\n (s) => !Object.is(s.value, opt.value),\n );\n this.commitSelection(next);\n }\n\n protected commitFreeText(): void {\n const label = this.searchQuery().trim();\n if (!label) {\n return;\n }\n const option = {\n label,\n value: label as T,\n } as SelectOption<T>;\n this.appendCreatedOption(option);\n }\n\n protected openCreateModal(): void {\n const cfg = this.create();\n if (!cfg) {\n return;\n }\n if (!this.modal) {\n // WHY console error: create requires provideAfricaniesUiOverlays() / ModalService.\n console.error(\n '[africanies-select] create requires ModalService — call provideAfricaniesUiOverlays() at bootstrap.',\n );\n return;\n }\n const handle = this.modal.open(cfg.component, { data: cfg.data });\n handle.afterClosed().subscribe((result) => {\n if (result === undefined || result === null) {\n return;\n }\n const option = cfg.mapResult(result);\n this.appendCreatedOption(option);\n });\n }\n\n private appendCreatedOption(option: SelectOption<T>): void {\n // model() emits optionsChange for parents that persist the canonical list.\n this.options.set([...this.options(), option]);\n\n if (this.multiple()) {\n const max = this.maxSelected();\n const list = [...this.selectedList()];\n if (!list.some((s) => Object.is(s.value, option.value))) {\n if (max == null || list.length < max) {\n list.push(option);\n }\n }\n this.commitSelection(list);\n this.searchQuery.set('');\n return;\n }\n\n this.commitSelection(option);\n this.searchQuery.set('');\n this.closePanel();\n }\n\n private commitSelection(\n next: SelectOption<T> | SelectOption<T>[] | null,\n ): void {\n // model() emits selectedChange; CVA still needs onChange for form controls.\n this.selected.set(next);\n this.onChange(next);\n }\n\n protected onBlur(): void {\n this.onTouched();\n }\n\n protected onRetry(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.disabled() || this.retrying()) {\n return;\n }\n this.retry.emit();\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n signal,\n} from '@angular/core';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport {\n FORM_AFFIX_CLASS,\n FORM_CONTROL_INNER_CLASS,\n FORM_DISABLED_CLASS,\n FORM_ERROR_CLASS,\n FORM_FIELD_CLASS,\n FORM_FIELD_ERROR_CLASS,\n FORM_HINT_CLASS,\n FORM_LABEL_CLASS,\n} from '../form-field.classes';\n\nlet nextTextInputId = 0;\n\n/**\n * Native `type` values supported by {@link TextInputComponent}.\n *\n * Keep this list to single-line text controls — multiline is\n * {@link TextareaComponent}, numeric is {@link NumberInputComponent}.\n */\nexport type TextInputType =\n | 'text'\n | 'email'\n | 'password'\n | 'search'\n | 'tel'\n | 'url';\n\n/**\n * Single-line text field — **reference** form control for `@africanies/africanies-ui`.\n *\n * Follows the shared AFRICANIES form field pattern: label, hint, field-level\n * `error` (distinct from `ErrorStateComponent`), prefix/suffix projection\n * slots, and {@link ControlValueAccessor} plus `value` / `valueChange` for\n * template bindings.\n *\n * @example\n * ```html\n * <africanies-text-input\n * label=\"Tracking number\"\n * hint=\"As printed on the airway bill\"\n * [error]=\"errors.tracking\"\n * [(value)]=\"tracking\"\n * >\n * <africanies-icon prefix name=\"search\" [size]=\"16\" />\n * <button suffix type=\"button\" (click)=\"tracking.set('')\">Clear</button>\n * </africanies-text-input>\n *\n * <africanies-text-input label=\"Email\" type=\"email\" formControlName=\"email\" />\n *\n * <africanies-text-input\n * label=\"Password\"\n * [type]=\"showPassword() ? 'text' : 'password'\"\n * autocomplete=\"current-password\"\n * formControlName=\"password\"\n * >\n * <button suffix type=\"button\" (click)=\"showPassword.set(!showPassword())\">\n * <africanies-icon [name]=\"showPassword() ? 'eye-slash' : 'eye'\" [size]=\"16\" />\n * </button>\n * </africanies-text-input>\n * ```\n */\n@Component({\n selector: 'africanies-text-input',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TextInputComponent),\n multi: true,\n },\n ],\n template: `\n <label [attr.for]=\"controlId\" [class]=\"labelClass\">{{ label() }}</label>\n <div [class]=\"shellClass()\">\n <span [class]=\"affixClass\" data-slot=\"prefix\">\n <ng-content select=\"[prefix]\" />\n </span>\n <input\n [id]=\"controlId\"\n [attr.type]=\"type()\"\n [class]=\"innerClass\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.placeholder]=\"placeholder() || null\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n />\n <span [class]=\"affixClass\" data-slot=\"suffix\">\n <ng-content select=\"[suffix]\" />\n </span>\n </div>\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n `,\n})\nexport class TextInputComponent implements ControlValueAccessor {\n /** Stable ids so label / aria-describedby stay paired across re-renders. */\n protected readonly controlId = `africanies-text-input-${++nextTextInputId}`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n\n protected readonly labelClass = FORM_LABEL_CLASS;\n protected readonly affixClass = FORM_AFFIX_CLASS;\n protected readonly innerClass = FORM_CONTROL_INNER_CLASS;\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n\n /**\n * Visible field label.\n */\n readonly label = input('');\n\n /**\n * Helper copy under the field. Hidden while {@link error} is set (error\n * replaces hint visually).\n */\n readonly hint = input<string | undefined>(undefined);\n\n /**\n * Field-level validation message (`string | null`). Not an async page error —\n * use `ErrorStateComponent` for failed fetches.\n */\n readonly error = input<string | null>(null);\n\n /**\n * Native placeholder when the value is empty.\n */\n readonly placeholder = input('');\n\n /**\n * Native input type. Defaults to `text`. Use `password` / `email` for\n * auth fields; toggle visibility by binding `type` between `password` and\n * `text`.\n */\n readonly type = input<TextInputType>('text');\n\n /**\n * Native `autocomplete` hint (e.g. `email`, `current-password`).\n * Omitted from the DOM when empty.\n */\n readonly autocomplete = input('');\n\n /**\n * Current text. Supports `[(value)]` and Reactive Forms via CVA.\n */\n readonly value = model<string>('');\n\n /**\n * Optional host disable (in addition to CVA `setDisabledState`).\n */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n protected readonly cvaDisabled = signal(false);\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n protected readonly shellClass = computed(() => {\n let classes = FORM_FIELD_CLASS;\n if (this.error()) {\n classes += ` ${FORM_FIELD_ERROR_CLASS}`;\n }\n if (this.disabled()) {\n classes += ` ${FORM_DISABLED_CLASS}`;\n }\n return classes;\n });\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n private onChange: (value: string) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n /**\n * @param value - Form model value; `null` becomes `''`.\n */\n writeValue(value: string | null): void {\n this.value.set(value ?? '');\n }\n\n /**\n * @param fn - Called when the user edits the field.\n */\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n /**\n * @param fn - Called on blur.\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /**\n * @param isDisabled - When true, blocks editing.\n */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onInput(event: Event): void {\n const next = (event.target as HTMLInputElement).value;\n this.value.set(next);\n this.onChange(next);\n }\n\n protected onBlur(): void {\n this.onTouched();\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRoute, type ParamMap, Router } from '@angular/router';\n\nimport {\n type FilterQueryBag,\n filterQueryKeys,\n type FilterStateModel,\n fromFilterParams,\n hasFilterParams,\n type ModuleFilterConfigModel,\n toFilterParams,\n} from '@africanies/africanies-models';\n\n/**\n * Bidirectional list-query sync with the browser URL.\n *\n * - {@link read} / {@link hasParams} hydrate {@link FilterStateModel} when\n * `page`, `size`, or filter keys are present.\n * - {@link write} replaces those keys on Apply (keeps overlay / unrelated params).\n * - {@link setPage} / {@link setSize} merge pagination keys (size change resets\n * `page` to 1).\n *\n * No-ops when Angular Router is not in the injector (unit tests without\n * `provideRouter`).\n */\n@Injectable({ providedIn: 'root' })\nexport class FilterQueryService {\n private readonly route = inject(ActivatedRoute, { optional: true });\n private readonly router = inject(Router, { optional: true });\n\n /**\n * True when the current URL has any filter / pagination query this config\n * understands.\n *\n * @param config - Module schema (param names + transport).\n * @returns Whether the URL should seed filter / pager state.\n */\n hasParams(config: ModuleFilterConfigModel): boolean {\n return hasFilterParams(this.snapshotBag(), config);\n }\n\n /**\n * Rebuild filter state from the current URL.\n *\n * Missing keys yield {@link emptyFilterState} defaults (no `page` / `size`\n * unless present).\n *\n * @param config - Module schema.\n * @returns Hydrated state.\n */\n read(config: ModuleFilterConfigModel): FilterStateModel {\n return fromFilterParams(this.snapshotBag(), config);\n }\n\n /**\n * Write the serialized filter bag to the URL.\n *\n * Drops previous keys from this config so cleared filters disappear, then\n * sets the new bag. Sibling params (`modal`, `drawer`, …) are kept.\n *\n * @param state - Committed filter state (include `page` / `size`).\n * @param config - Module schema.\n * @returns Router navigation result, or `false` when Router is unavailable.\n */\n write(\n state: FilterStateModel,\n config: ModuleFilterConfigModel,\n ): Promise<boolean> {\n if (!this.router || !this.route) {\n return Promise.resolve(false);\n }\n const next: Record<string, string | number | null> = {\n ...this.snapshotRecord(),\n };\n for (const key of filterQueryKeys(config)) {\n delete next[key];\n }\n const params = toFilterParams(state, config);\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n next[key] = value;\n }\n }\n return this.router.navigate([], {\n relativeTo: this.route,\n queryParams: next,\n queryParamsHandling: '',\n });\n }\n\n /**\n * Merge `page` into the current query string.\n *\n * @param page - 1-based page index.\n * @param config - Optional schema; defaults to the `page` query key.\n * @returns Router navigation result, or `false` when Router is unavailable.\n */\n setPage(page: number, config?: ModuleFilterConfigModel): Promise<boolean> {\n const pageKey = config?.pagination?.pageParam ?? 'page';\n return this.mergeQuery({ [pageKey]: page });\n }\n\n /**\n * Merge `size` and reset `page` to 1.\n *\n * @param size - Page size.\n * @param config - Optional schema; defaults to `page` / `size` query keys.\n * @returns Router navigation result, or `false` when Router is unavailable.\n */\n setSize(size: number, config?: ModuleFilterConfigModel): Promise<boolean> {\n const pageKey = config?.pagination?.pageParam ?? 'page';\n const sizeKey = config?.pagination?.sizeParam ?? 'size';\n return this.mergeQuery({ [pageKey]: 1, [sizeKey]: size });\n }\n\n private mergeQuery(\n queryParams: Record<string, string | number>,\n ): Promise<boolean> {\n if (!this.router || !this.route) {\n return Promise.resolve(false);\n }\n return this.router.navigate([], {\n relativeTo: this.route,\n queryParams,\n queryParamsHandling: 'merge',\n });\n }\n\n private snapshotBag(): FilterQueryBag {\n return this.snapshotRecord();\n }\n\n private snapshotRecord(): Record<string, string> {\n const map = this.route?.snapshot.queryParamMap;\n if (!map) {\n return {};\n }\n return paramMapToRecord(map);\n }\n}\n\n/**\n * Flatten a {@link ParamMap} to a single-value record (first value wins).\n *\n * @param map - Angular query / matrix param map.\n * @returns Plain string dictionary.\n */\nexport function paramMapToRecord(map: ParamMap): Record<string, string> {\n const record: Record<string, string> = {};\n for (const key of map.keys) {\n const value = map.get(key);\n if (value != null && value !== '') {\n record[key] = value;\n }\n }\n return record;\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { isObservable, type Observable, take } from 'rxjs';\n\nimport { FilterOptionsResolver } from '@africanies/africanies-core';\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport type {\n FilterFieldModel,\n FilterOptionModel,\n FilterStateModel,\n} from '@africanies/africanies-models';\nimport {\n cloneFilterState,\n resetFilterState,\n toFilterParams,\n} from '@africanies/africanies-models';\n\nimport { ButtonComponent } from '../button/button.component';\nimport { DatePickerComponent } from '../forms/date-picker/date-picker.component';\nimport {\n RadioComponent,\n type RadioOption,\n} from '../forms/radio/radio.component';\nimport { SelectComponent } from '../forms/select/select.component';\nimport type { SelectOption } from '../forms/select/select.types';\nimport { TextInputComponent } from '../forms/text-input/text-input.component';\nimport { AfricaniesOverlayRef } from '../overlay/africanies-overlay-ref';\nimport { OVERLAY_DATA } from '../overlay/overlay-data.token';\nimport type {\n FilterDrawerData,\n FilterDrawerResult,\n} from './filter-drawer.types';\nimport { FilterQueryService } from './filter-query.service';\n\n/**\n * Schema-driven filter drawer body.\n *\n * Opened via {@link FilterDrawerService} (or {@link DrawerService} with this\n * component). Edits a cloned {@link FilterStateModel}; Apply serializes with\n * {@link toFilterParams}. When {@link FilterDrawerData.onApply} is set, the\n * drawer stays open until that call succeeds, then closes with\n * {@link FilterDrawerResult}. Successful Apply also writes the query bag to\n * the browser URL via {@link FilterQueryService} (page resets to 1).\n */\n@Component({\n selector: 'africanies-filter-drawer',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'block h-full min-h-0 overflow-hidden',\n },\n imports: [\n AfricaniesIconComponent,\n ButtonComponent,\n DatePickerComponent,\n RadioComponent,\n SelectComponent,\n TextInputComponent,\n ],\n template: `\n <!--\n Cancel drawer panel padding (-m-6) so the footer can sit flush on the\n bottom edge; scroll only the middle region.\n -->\n <div class=\"flex h-full min-h-0 flex-col -mx-6\">\n <div class=\"flex shrink-0 items-start justify-between gap-3 px-6 pb-4 pt-6\">\n <div class=\"min-w-0 flex flex-col gap-1\">\n <p\n class=\"m-0 text-caption font-medium uppercase tracking-wide text-neutral-600 dark:text-neutral-400\"\n >\n Filters\n </p>\n <h2 class=\"m-0 text-heading-3 text-ink dark:text-white\">\n {{ title() }}\n </h2>\n </div>\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Close\"\n (click)=\"ref.close()\"\n >\n <africanies-icon name=\"close\" [size]=\"18\" />\n </button>\n </div>\n\n <div\n class=\"africanies-overlay-scroll flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-6 pb-5\"\n >\n @if (config.search; as search) {\n <africanies-text-input\n [label]=\"search.label\"\n [placeholder]=\"search.placeholder ?? ''\"\n [value]=\"draft().search ?? ''\"\n (valueChange)=\"patchSearch($event)\"\n />\n }\n\n @if (config.date; as dateCfg) {\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex items-center justify-between gap-2\">\n <p class=\"m-0 text-body-sm font-medium text-ink dark:text-white\">\n Date\n </p>\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"clearDateSection()\"\n >\n Clear\n </button>\n </div>\n <africanies-select\n label=\"\"\n [searchable]=\"true\"\n [options]=\"dateFieldOptions()\"\n [selected]=\"selectedDateField()\"\n (selectedChange)=\"onDateFieldChange($event)\"\n />\n <div class=\"grid grid-cols-2 gap-3\">\n <africanies-date-picker\n label=\"From\"\n [value]=\"draft().from ?? null\"\n [max]=\"draft().to || undefined\"\n (valueChange)=\"patchFrom($event)\"\n />\n <africanies-date-picker\n label=\"To\"\n [value]=\"draft().to ?? null\"\n [min]=\"draft().from || undefined\"\n (valueChange)=\"patchTo($event)\"\n />\n </div>\n </div>\n }\n\n @if (config.sort; as sortCfg) {\n <africanies-select\n label=\"Sort\"\n [searchable]=\"sortOptions().length > 6\"\n [options]=\"sortOptions()\"\n [selected]=\"selectedSort()\"\n (selectedChange)=\"onSortChange($event)\"\n />\n }\n\n @if (config.fields.length) {\n <africanies-select\n label=\"Filter by\"\n placeholder=\"Select fields…\"\n [multiple]=\"true\"\n [searchable]=\"true\"\n [options]=\"filterByOptions()\"\n [selected]=\"selectedFilterBy()\"\n (selectedChange)=\"onFilterByChange($event)\"\n />\n\n @for (field of activeFields(); track field.key) {\n <div class=\"flex flex-col gap-2 border-t border-border pt-4 dark:border-white/10\">\n <div class=\"flex items-center justify-between gap-2\">\n <p class=\"m-0 text-body-sm font-medium text-ink dark:text-white\">\n {{ field.label }}\n </p>\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"clearField(field.key)\"\n >\n Clear\n </button>\n </div>\n\n @switch (field.type) {\n @case ('enum') {\n <div class=\"flex flex-wrap gap-2\">\n @for (opt of field.options ?? []; track opt.value) {\n <button\n type=\"button\"\n class=\"cursor-pointer rounded-md border px-2.5 py-1.5 text-body-sm transition-colors\"\n [style.color]=\"\n draft().values[field.key] === opt.value\n ? opt.color ?? null\n : null\n \"\n [style.border-color]=\"\n draft().values[field.key] === opt.value\n ? opt.color ?? null\n : null\n \"\n [style.background-color]=\"\n draft().values[field.key] === opt.value && opt.color\n ? opt.color + '1A'\n : null\n \"\n [class]=\"\n draft().values[field.key] === opt.value\n ? 'font-medium'\n : 'border-neutral-300 text-neutral-600 hover:border-neutral-400 dark:border-white/15 dark:text-neutral-300'\n \"\n (click)=\"setFieldValue(field.key, opt.value)\"\n >\n {{ opt.label }}\n </button>\n }\n </div>\n }\n @case ('boolean') {\n <africanies-radio\n label=\"\"\n [options]=\"toRadioOptions(field.options)\"\n [value]=\"draft().values[field.key] ?? null\"\n (valueChange)=\"onRadioChange(field.key, $event)\"\n />\n }\n @case ('select') {\n <!-- Label already shown in the section header — avoid double label. -->\n <africanies-select\n label=\"\"\n [searchable]=\"true\"\n [placeholder]=\"field.placeholder ?? 'Select…'\"\n [options]=\"selectOptionsFor(field)\"\n [selected]=\"selectedForField(field)\"\n [error]=\"optionErrorFor(field.key)\"\n [loading]=\"optionLoadingFor(field.key)\"\n [retrying]=\"optionLoadingFor(field.key)\"\n [showRetry]=\"true\"\n (retry)=\"retryFieldOptions(field.key)\"\n (selectedChange)=\"onSelectChange(field.key, $event)\"\n />\n }\n @case ('text') {\n <africanies-text-input\n label=\"\"\n [placeholder]=\"field.placeholder ?? ''\"\n [value]=\"draft().values[field.key] ?? ''\"\n (valueChange)=\"setFieldValue(field.key, $event)\"\n />\n }\n }\n </div>\n }\n }\n </div>\n\n <div\n class=\"flex shrink-0 flex-col gap-2 border-t border-border bg-white px-6 pt-3 pb-2 dark:border-white/10 dark:bg-ink-950\"\n >\n @if (applyError(); as err) {\n <div\n class=\"flex items-start gap-2.5 rounded-md border border-danger/20 border-l-[3px] border-l-danger bg-danger-subtle/40 px-3 py-2.5 dark:border-danger/25 dark:bg-danger/10\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n <africanies-icon\n name=\"warning\"\n [size]=\"16\"\n class=\"mt-0.5 shrink-0 text-danger\"\n />\n <div class=\"min-w-0 flex-1 flex flex-col gap-0.5\">\n <p class=\"m-0 text-caption font-medium text-danger\">Apply failed</p>\n <p\n class=\"m-0 text-caption leading-snug text-neutral-700 dark:text-neutral-300\"\n >\n {{ err }}\n </p>\n </div>\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"shrink-0 !min-h-0 self-start !px-1 !py-0 text-neutral-500 hover:text-ink dark:text-neutral-400 dark:hover:text-white\"\n aria-label=\"Dismiss\"\n (click)=\"applyError.set(null)\"\n >\n <africanies-icon name=\"close\" [size]=\"14\" />\n </button>\n </div>\n }\n <div class=\"flex gap-2\">\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n class=\"flex-1\"\n [disabled]=\"applying()\"\n (click)=\"onReset()\"\n >\n Reset\n </button>\n <button\n africanies-button\n type=\"button\"\n variant=\"primary\"\n class=\"flex-1\"\n [disabled]=\"applying()\"\n (click)=\"onApply()\"\n >\n {{ applying() ? 'Applying…' : 'Apply' }}\n </button>\n </div>\n </div>\n </div>\n `,\n})\nexport class FilterDrawerPanel {\n protected readonly data = inject<FilterDrawerData>(OVERLAY_DATA);\n protected readonly ref = inject(AfricaniesOverlayRef<FilterDrawerResult>);\n private readonly destroyRef = inject(DestroyRef);\n private readonly filterOptions = inject(FilterOptionsResolver);\n private readonly filterQuery = inject(FilterQueryService);\n\n protected readonly config = this.data.config;\n protected readonly title = computed(\n () => this.data.title ?? 'Filters',\n );\n\n /** True while {@link FilterDrawerData.onApply} is in flight. */\n protected readonly applying = signal(false);\n /** Last apply failure message (cleared on retry / success). */\n protected readonly applyError = signal<string | null>(null);\n\n /** Local edit buffer — host state only updates on Apply. */\n protected readonly draft = signal<FilterStateModel>(\n cloneFilterState(this.data.state),\n );\n\n /**\n * Fields the user has “opened” for value entry.\n * Seeded from keys that already have values so hydrate restores sections.\n */\n protected readonly selectedKeys = signal<string[]>(\n Object.keys(this.data.state?.values ?? {}).filter(\n (k) => !!this.data.state?.values?.[k],\n ),\n );\n\n /** Loaded async / host option rows keyed by field.key. */\n protected readonly optionLists = signal<\n Record<string, FilterOptionModel[]>\n >(this.seedOptionLists());\n\n /** Field-level catalog fetch errors (select error slot). */\n protected readonly optionErrors = signal<Record<string, string | null>>({});\n\n /** Fields currently loading SDK catalogs. */\n protected readonly optionLoading = signal<Record<string, boolean>>({});\n\n private readonly optionLoadsStarted = new Set<string>();\n\n constructor() {\n for (const key of this.selectedKeys()) {\n this.ensureFieldOptionsByKey(key);\n }\n }\n\n protected readonly activeFields = computed(() => {\n const keys = new Set(this.selectedKeys());\n return this.config.fields.filter((f) => keys.has(f.key));\n });\n\n protected readonly filterByOptions = computed((): SelectOption<string>[] =>\n this.config.fields.map((f) => ({\n label: f.label,\n value: f.key,\n })),\n );\n\n protected readonly dateFieldOptions = computed((): SelectOption<string>[] =>\n (this.config.date?.fields ?? []).map((o) => ({\n label: o.label,\n value: o.value,\n })),\n );\n\n protected readonly sortOptions = computed((): SelectOption<string>[] =>\n (this.config.sort?.options ?? []).map((o) => ({\n label: o.label,\n value: o.value,\n })),\n );\n\n protected selectedFilterBy(): SelectOption<string>[] {\n const keys = new Set(this.selectedKeys());\n return this.filterByOptions().filter((o) => keys.has(o.value));\n }\n\n protected selectedDateField(): SelectOption<string> | null {\n const value = this.draft().date;\n if (!value) {\n return null;\n }\n return this.dateFieldOptions().find((o) => o.value === value) ?? {\n label: value,\n value,\n };\n }\n\n protected selectedSort(): SelectOption<string> | null {\n const value = this.draft().order;\n if (!value) {\n return null;\n }\n return this.sortOptions().find((o) => o.value === value) ?? {\n label: value,\n value,\n };\n }\n\n protected onFilterByChange(\n selected: SelectOption<string> | SelectOption<string>[] | null,\n ): void {\n const next = Array.isArray(selected)\n ? selected.map((o) => o.value)\n : selected\n ? [selected.value]\n : [];\n const prev = new Set(this.selectedKeys());\n const nextSet = new Set(next);\n\n for (const key of prev) {\n if (!nextSet.has(key)) {\n this.clearField(key);\n }\n }\n\n this.selectedKeys.set(next);\n\n for (const key of next) {\n this.ensureFieldOptionsByKey(key);\n }\n }\n\n protected clearField(key: string): void {\n this.draft.update((s) => {\n const values = { ...s.values };\n delete values[key];\n return { ...s, values };\n });\n }\n\n protected setFieldValue(key: string, value: string): void {\n this.draft.update((s) => ({\n ...s,\n values: { ...s.values, [key]: value },\n }));\n }\n\n protected patchSearch(value: string): void {\n this.draft.update((s) => ({ ...s, search: value || undefined }));\n }\n\n protected patchFrom(value: string | null): void {\n this.draft.update((s) => {\n const from = value ?? undefined;\n // Keep range valid: To cannot precede From.\n const to = from && s.to && s.to < from ? undefined : s.to;\n return { ...s, from, to };\n });\n }\n\n protected patchTo(value: string | null): void {\n this.draft.update((s) => {\n const to = value ?? undefined;\n // Keep range valid: From cannot follow To.\n const from = to && s.from && s.from > to ? undefined : s.from;\n return { ...s, from, to };\n });\n }\n\n /** Clears date field + range without touching other filters. */\n protected clearDateSection(): void {\n this.draft.update((s) => ({\n ...s,\n date: undefined,\n from: undefined,\n to: undefined,\n }));\n }\n\n protected onDateFieldChange(\n selected: SelectOption<string> | SelectOption<string>[] | null,\n ): void {\n const opt = Array.isArray(selected) ? selected[0] : selected;\n this.draft.update((s) => ({ ...s, date: opt?.value }));\n }\n\n protected onSortChange(\n selected: SelectOption<string> | SelectOption<string>[] | null,\n ): void {\n const opt = Array.isArray(selected) ? selected[0] : selected;\n this.draft.update((s) => ({ ...s, order: opt?.value }));\n }\n\n protected onRadioChange(key: string, value: string | null): void {\n if (value == null) {\n this.clearField(key);\n return;\n }\n this.setFieldValue(key, value);\n }\n\n protected onSelectChange(\n key: string,\n selected: SelectOption<string> | SelectOption<string>[] | null,\n ): void {\n const opt = Array.isArray(selected) ? selected[0] : selected;\n if (!opt) {\n this.clearField(key);\n return;\n }\n this.setFieldValue(key, String(opt.value));\n }\n\n protected selectOptionsFor(field: FilterFieldModel): SelectOption<string>[] {\n const fromLoaded = this.optionLists()[field.key];\n const source: FilterOptionModel[] =\n fromLoaded ?? field.options ?? [];\n return source.map((o) => ({\n label: o.label,\n value: o.value,\n ...(o.prefixText ? { prefixText: o.prefixText } : {}),\n ...(o.prefixImageUrl ? { prefixImageUrl: o.prefixImageUrl } : {}),\n }));\n }\n\n protected optionErrorFor(key: string): string | null {\n return this.optionErrors()[key] ?? null;\n }\n\n protected optionLoadingFor(key: string): boolean {\n return this.optionLoading()[key] ?? false;\n }\n\n protected retryFieldOptions(key: string): void {\n const field = this.config.fields.find((f) => f.key === key);\n if (!field) {\n return;\n }\n this.optionLoadsStarted.delete(key);\n this.optionLists.update((lists) => {\n const next = { ...lists };\n delete next[key];\n return next;\n });\n this.optionErrors.update((errors) => ({ ...errors, [key]: null }));\n this.ensureFieldOptions(field);\n }\n\n private seedOptionLists(): Record<string, FilterOptionModel[]> {\n const lists: Record<string, FilterOptionModel[]> = {};\n for (const [key, rows] of Object.entries(this.data.optionLists ?? {})) {\n lists[key] = rows.map((row) => ({\n value: row.value,\n label: row.label,\n ...(row.prefixText ? { prefixText: row.prefixText } : {}),\n ...(row.prefixImageUrl ? { prefixImageUrl: row.prefixImageUrl } : {}),\n }));\n }\n return lists;\n }\n\n private ensureFieldOptionsByKey(key: string): void {\n const field = this.config.fields.find((f) => f.key === key);\n if (!field) {\n return;\n }\n this.ensureFieldOptions(field);\n }\n\n private ensureFieldOptions(field: FilterFieldModel): void {\n if (field.type !== 'select') {\n return;\n }\n if (field.options?.length) {\n return;\n }\n if (this.data.optionLists?.[field.key] !== undefined) {\n return;\n }\n if (\n field.optionsSource == null ||\n field.optionsSource === 'static' ||\n field.optionsSource === 'shipmentManifests'\n ) {\n return;\n }\n\n const key = field.key;\n if (this.optionLoadsStarted.has(key)) {\n return;\n }\n if (this.optionLists()[key] !== undefined && !this.optionErrors()[key]) {\n return;\n }\n\n this.optionLoadsStarted.add(key);\n this.optionLoading.update((m) => ({ ...m, [key]: true }));\n this.optionErrors.update((m) => ({ ...m, [key]: null }));\n\n this.filterOptions\n .resolveField(field)\n .pipe(take(1), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (options) => {\n this.optionLists.update((m) => ({\n ...m,\n [key]: options.map((o) => ({\n value: o.value,\n label: o.label,\n })),\n }));\n this.optionLoading.update((m) => ({ ...m, [key]: false }));\n },\n error: (err) => {\n this.optionLoadsStarted.delete(key);\n this.optionErrors.update((m) => ({\n ...m,\n [key]: this.catalogErrorMessage(err),\n }));\n this.optionLoading.update((m) => ({ ...m, [key]: false }));\n },\n });\n }\n\n private catalogErrorMessage(err: unknown): string {\n if (err instanceof HttpErrorResponse) {\n const body = err.error as { message?: unknown } | string | null;\n if (body && typeof body === 'object' && typeof body.message === 'string') {\n return body.message;\n }\n if (typeof body === 'string' && body.trim()) {\n return body.trim();\n }\n if (err.status === 401 || err.status === 403) {\n return 'Authentication failed. Check your access token.';\n }\n }\n if (typeof err === 'string' && err.trim()) {\n return err.trim();\n }\n if (err && typeof err === 'object' && 'message' in err) {\n const msg = (err as { message?: unknown }).message;\n if (typeof msg === 'string' && msg.trim()) {\n return msg.trim();\n }\n }\n return 'Could not load options. Try again.';\n }\n\n protected selectedForField(\n field: FilterFieldModel,\n ): SelectOption<string> | null {\n const value = this.draft().values[field.key];\n if (value == null || value === '') {\n return null;\n }\n return (\n this.selectOptionsFor(field).find((o) => o.value === value) ?? {\n label: value,\n value,\n }\n );\n }\n\n protected toRadioOptions(\n options: FilterOptionModel[] | undefined,\n ): RadioOption<string>[] {\n return (options ?? []).map((o) => ({\n label: o.label,\n value: o.value,\n }));\n }\n\n protected onReset(): void {\n const next = resetFilterState(true, this.draft());\n this.draft.set(next);\n this.selectedKeys.set([]);\n }\n\n protected onApply(): void {\n if (this.applying()) {\n return;\n }\n\n const state = cloneFilterState(this.draft());\n state.page = 1;\n if (state.size == null) {\n state.size = this.filterQuery.read(this.config).size;\n }\n const params = toFilterParams(state, this.config);\n const result: FilterDrawerResult = { applied: true, state, params };\n const hook = this.data.onApply;\n\n if (!hook) {\n this.commitApply(result);\n return;\n }\n\n let pending: Observable<unknown> | Promise<unknown> | void;\n try {\n pending = hook({ state, params });\n } catch (err) {\n this.applyError.set(this.errorMessage(err));\n return;\n }\n\n if (pending == null) {\n this.commitApply(result);\n return;\n }\n\n this.applying.set(true);\n this.applyError.set(null);\n\n const succeed = (): void => {\n this.applying.set(false);\n this.commitApply(result);\n };\n const fail = (err: unknown): void => {\n this.applying.set(false);\n this.applyError.set(this.errorMessage(err));\n };\n\n if (isObservable(pending)) {\n pending.pipe(take(1), takeUntilDestroyed(this.destroyRef)).subscribe({\n next: () => succeed(),\n error: fail,\n });\n return;\n }\n\n void Promise.resolve(pending).then(succeed, fail);\n }\n\n /**\n * Persist the applied bag to the URL, then close.\n *\n * @param result - Applied state + params.\n */\n private commitApply(result: FilterDrawerResult): void {\n void this.filterQuery.write(result.state, this.config);\n this.ref.close(result);\n }\n\n private errorMessage(err: unknown): string {\n if (err instanceof HttpErrorResponse) {\n const body = err.error as { message?: unknown } | string | null;\n if (body && typeof body === 'object' && typeof body.message === 'string') {\n return body.message;\n }\n if (typeof body === 'string' && body.trim()) {\n return body.trim();\n }\n if (err.status === 0) {\n return 'Network error. Check your connection and try again.';\n }\n if (err.status === 401 || err.status === 403) {\n return 'Authentication failed. Check your access token and try again.';\n }\n if (err.status >= 500) {\n return 'Server error. Try again in a moment.';\n }\n return err.message || `Request failed (${err.status}).`;\n }\n if (typeof err === 'string' && err.trim()) {\n return err.trim();\n }\n if (err && typeof err === 'object' && 'message' in err) {\n const msg = (err as { message?: unknown }).message;\n if (typeof msg === 'string' && msg.trim()) {\n return msg.trim();\n }\n }\n return 'Could not apply filters. Try again.';\n }\n}\n","import { Overlay } from '@angular/cdk/overlay';\nimport { inject,Injectable, Injector, type Type } from '@angular/core';\n\nimport type { OverlayHandle, OverlayOpener } from '@africanies/africanies-core';\n\nimport {\n attachOverlayContent,\n type OverlayOpenConfig,\n} from './overlay-attach';\n\n/**\n * Opens edge-anchored drawer panels via Angular CDK Overlay.\n *\n * Same {@link OverlayOpener} contract as {@link ModalService} so route-driven\n * overlays can target either surface through {@link DRAWER_SERVICE}.\n *\n * @example\n * ```ts\n * const drawer = inject(DrawerService);\n * drawer.open(FiltersPanel, { data: { facet: 'status' } });\n * ```\n */\n@Injectable()\nexport class DrawerService implements OverlayOpener {\n private readonly overlay = inject(Overlay);\n private readonly injector = inject(Injector);\n\n /**\n * Opens `component` in a right-side drawer panel with a dimmed backdrop.\n *\n * Not dismissible by default — set `dismissible: true` for backdrop / Escape\n * close. Inject {@link OVERLAY_DATA} and {@link AfricaniesOverlayRef} inside the\n * hosted component the same way as modals.\n *\n * @typeParam TData - Shape injected as {@link OVERLAY_DATA}.\n * @typeParam TResult - Value emitted by `afterClosed` when closed with a result.\n * @param component - Standalone component type to attach via ComponentPortal.\n * @param config - Optional data bag and close-behavior flags.\n * @returns Handle used to close the drawer and observe dismissal.\n */\n open<TData = unknown, TResult = unknown>(\n component: Type<unknown>,\n config?: OverlayOpenConfig<TData>,\n ): OverlayHandle<TResult> {\n const extraPanelClass =\n config?.panelClass == null\n ? []\n : Array.isArray(config.panelClass)\n ? [...config.panelClass]\n : [config.panelClass];\n\n return attachOverlayContent<TData, TResult>(\n this.overlay,\n this.injector,\n component,\n {\n hasBackdrop: true,\n backdropClass: [\n 'africanies-overlay-backdrop',\n 'bg-ink/45',\n 'backdrop-blur-sm',\n 'dark:bg-ink/60',\n ],\n panelClass: [\n 'africanies-drawer-panel',\n 'bg-white',\n 'dark:bg-ink-950',\n 'text-ink',\n 'dark:text-white',\n 'shadow-xl',\n 'border-l',\n 'border-border',\n 'dark:border-white/15',\n 'flex',\n 'flex-col',\n 'items-stretch',\n 'h-full',\n 'min-h-0',\n 'w-[min(100%,24rem)]',\n 'p-6',\n 'will-change-transform',\n ...extraPanelClass,\n '!overflow-hidden',\n ],\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay\n .position()\n .global()\n .right('0')\n .top('0')\n .bottom('0'),\n },\n 'drawer',\n config,\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport type { OverlayHandle } from '@africanies/africanies-core';\n\nimport { DrawerService } from '../overlay/drawer.service';\nimport { FilterDrawerPanel } from './filter-drawer.panel';\nimport type {\n FilterDrawerData,\n FilterDrawerResult,\n} from './filter-drawer.types';\nimport { FilterQueryService } from './filter-query.service';\n\n/**\n * Opens the schema-driven {@link FilterDrawerPanel} via {@link DrawerService}.\n *\n * Requires {@link provideAfricaniesUiOverlays} at bootstrap (same as other overlays).\n *\n * When the current URL already has filter / pagination query params for the\n * given config, those values seed the drawer (overriding a stale host `state`).\n * Successful Apply writes the bag back through {@link FilterQueryService}.\n *\n * @example\n * ```ts\n * const filters = inject(FilterDrawerService);\n * const query = inject(FilterQueryService);\n * const config = trackShipmentsFilterConfig;\n * const state = signal(\n * query.hasParams(config) ? query.read(config) : emptyFilterState(),\n * );\n *\n * filters\n * .open({\n * config,\n * state: state(),\n * onApply: ({ params }) => this.shipments.load(params),\n * })\n * .afterClosed()\n * .subscribe((result) => {\n * if (result?.applied) {\n * this.state.set(result.state);\n * }\n * });\n * ```\n */\n@Injectable()\nexport class FilterDrawerService {\n private readonly drawer = inject(DrawerService);\n private readonly filterQuery = inject(FilterQueryService);\n\n /**\n * Opens the filter drawer (dismissible by default — backdrop / Escape cancel).\n *\n * Pass {@link FilterDrawerData.onApply} to keep the drawer open until your\n * API call succeeds; omit it to close immediately on Apply.\n *\n * @param data - Module config, optional prior state, and host option lists.\n * @returns Overlay handle; `afterClosed` emits {@link FilterDrawerResult} on Apply.\n */\n open(data: FilterDrawerData): OverlayHandle<FilterDrawerResult> {\n const payload = this.filterQuery.hasParams(data.config)\n ? { ...data, state: this.filterQuery.read(data.config) }\n : data;\n return this.drawer.open<FilterDrawerData, FilterDrawerResult>(\n FilterDrawerPanel,\n { data: payload, dismissible: true },\n );\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\n\nimport {\n defer,\n from,\n type Observable,\n of,\n type Subscription,\n take,\n throwError,\n} from 'rxjs';\n\nimport { AfricaniesIconComponent, type IconName } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../button/button.component';\nimport { AfricaniesOverlayRef } from './africanies-overlay-ref';\nimport type { ConfirmOptions, ConfirmWork } from './confirm-options';\nimport { OVERLAY_DATA } from './overlay-data.token';\n\n/**\n * Built-in confirm dialog hosted by {@link ConfirmService} / {@link ModalService}.\n *\n * WHY a dedicated component: most apps need the same title/message/two-button\n * pattern; shipping it here avoids every feature reinventing confirm UI while\n * still allowing custom modals via {@link ModalService.open}.\n *\n * When {@link ConfirmOptions.onConfirm} is set, Confirm stays open and the\n * primary button shows {@link ButtonComponent} loading until the work\n * settles. Errors leave the dialog open.\n */\n@Component({\n selector: 'africanies-confirm-dialog',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, ButtonComponent],\n host: {\n class: 'block w-full min-w-0',\n },\n template: `\n <div\n class=\"flex flex-col gap-5\"\n role=\"alertdialog\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"messageId\"\n [attr.aria-busy]=\"loading() ? true : null\"\n >\n <div class=\"flex flex-col gap-3\">\n <div [class]=\"iconWellClass()\" aria-hidden=\"true\">\n <africanies-icon [name]=\"iconName()\" [size]=\"32\" />\n </div>\n <div class=\"flex min-w-0 flex-col gap-1.5\">\n <h2\n [id]=\"titleId\"\n class=\"m-0 text-heading-3 font-semibold text-ink dark:text-white\"\n >\n {{ title() }}\n </h2>\n <p\n [id]=\"messageId\"\n class=\"m-0 text-body text-neutral-600 dark:text-neutral-400\"\n >\n {{ options.message }}\n </p>\n </div>\n </div>\n\n <div class=\"flex flex-wrap justify-end gap-2\">\n @if (emphasizeCancel()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n [disabled]=\"loading()\"\n (click)=\"confirm()\"\n >\n {{ confirmLabel() }}\n </button>\n <button\n africanies-button\n type=\"button\"\n variant=\"primary\"\n [disabled]=\"loading()\"\n (click)=\"cancel()\"\n >\n {{ cancelLabel() }}\n </button>\n } @else {\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n [disabled]=\"loading()\"\n (click)=\"cancel()\"\n >\n {{ cancelLabel() }}\n </button>\n <button\n africanies-button\n type=\"button\"\n [variant]=\"options.danger ? 'danger' : 'primary'\"\n [loading]=\"loading()\"\n (click)=\"confirm()\"\n >\n {{ confirmLabel() }}\n </button>\n }\n </div>\n </div>\n `,\n})\nexport class ConfirmDialogComponent {\n /** Stable ids so aria-labelledby / aria-describedby stay unique per instance. */\n protected readonly titleId = `africanies-confirm-title-${cryptoRandom()}`;\n protected readonly messageId = `africanies-confirm-message-${cryptoRandom()}`;\n\n /** Options injected by {@link ConfirmService}. */\n protected readonly options = inject(OVERLAY_DATA) as ConfirmOptions;\n\n private readonly ref = inject(AfricaniesOverlayRef<boolean>);\n private readonly destroyRef = inject(DestroyRef);\n private workSub: Subscription | null = null;\n\n /** True while {@link ConfirmOptions.onConfirm} is in flight. */\n protected readonly loading = signal(false);\n\n /** Resolved heading with a sensible default when callers omit `title`. */\n protected readonly title = computed(() => this.options.title ?? 'Confirm');\n\n /** Resolved confirm CTA label. */\n protected readonly confirmLabel = computed(\n () => this.options.confirmLabel ?? 'Confirm',\n );\n\n /** Resolved cancel CTA label. */\n protected readonly cancelLabel = computed(\n () => this.options.cancelLabel ?? 'Cancel',\n );\n\n /** When true, cancel is primary and listed after confirm (safe choice last). */\n protected readonly emphasizeCancel = computed(\n () => this.options.emphasizeCancel === true,\n );\n\n /** Warning for destructive confirms; question mark otherwise. */\n protected readonly iconName = computed(\n (): IconName => (this.options.danger ? 'warning' : 'question'),\n );\n\n /**\n * Tinted well so the icon reads as a status, not a thin glyph beside the\n * heading. Danger uses the red subtle token; default uses export green.\n */\n protected readonly iconWellClass = computed(() => {\n const well =\n 'inline-flex size-14 shrink-0 items-center justify-center rounded-2xl';\n return this.options.danger\n ? `${well} bg-danger-subtle text-danger dark:bg-danger/20 dark:text-danger`\n : `${well} bg-export-subtle text-export dark:bg-export/20 dark:text-export-light`;\n });\n\n constructor() {\n this.destroyRef.onDestroy(() => this.workSub?.unsubscribe());\n }\n\n /**\n * Affirms the action. When `onConfirm` is set, waits for it before closing\n * with `true`; failures keep the dialog open.\n */\n protected confirm(): void {\n if (this.loading()) {\n return;\n }\n\n const action = this.options.onConfirm;\n if (!action) {\n this.ref.close(true);\n return;\n }\n\n this.loading.set(true);\n // Let the spinner paint before starting work so a fast request still\n // shows loading, and avoid takeUntilDestroyed in this click handler\n // (it can complete EMPTY and close without subscribing).\n setTimeout(() => this.runConfirmWork(action), 0);\n }\n\n /** Dismisses without affirming — emits `false`. */\n protected cancel(): void {\n if (this.loading()) {\n return;\n }\n this.ref.close(false);\n }\n\n /**\n * Subscribe to confirm work after loading is visible.\n *\n * @param action - Callback from {@link ConfirmOptions.onConfirm}.\n */\n private runConfirmWork(action: ConfirmWork): void {\n if (this.destroyRef.destroyed || !this.loading()) {\n return;\n }\n\n this.workSub?.unsubscribe();\n this.workSub = defer(() => confirmWork(action))\n .pipe(take(1))\n .subscribe({\n next: () => this.ref.close(true),\n error: () => this.loading.set(false),\n });\n }\n}\n\n/**\n * Normalize {@link ConfirmWork} into a single-emission Observable.\n *\n * Uses `subscribe` duck-typing so a second RxJS copy still starts the HTTP\n * call (`isObservable` is false across duplicate `rxjs` instances).\n *\n * @param action - Confirm callback from dialog options.\n * @returns Observable that completes on success or errors on failure.\n */\nfunction confirmWork(action: ConfirmWork): Observable<unknown> {\n let result: ReturnType<ConfirmWork>;\n try {\n result = action();\n } catch (err: unknown) {\n return throwError(() =>\n err instanceof Error ? err : new Error('Confirm action failed.'),\n );\n }\n\n if (result == null) {\n return of(undefined);\n }\n if (typeof (result as { subscribe?: unknown }).subscribe === 'function') {\n return result as Observable<unknown>;\n }\n return from(result);\n}\n\n/**\n * Tiny unique suffix without pulling in a uuid dependency.\n *\n * @returns Short alphanumeric id fragment.\n */\nfunction cryptoRandom(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport { ConfirmDialogComponent } from './confirm-dialog.component';\nimport type { ConfirmOptions } from './confirm-options';\nimport { ModalService } from './modal.service';\n\n/**\n * One-line confirm flow built on {@link ModalService}.\n *\n * WHY a service (not only a component): callers need an Observable&lt;boolean&gt;\n * they can subscribe to in event handlers without scaffolding modal open /\n * afterClosed plumbing every time.\n *\n * @example\n * ```ts\n * const confirm = inject(ConfirmService);\n *\n * confirm\n * .confirm({\n * title: 'Delete shipment?',\n * message: 'This cannot be undone.',\n * confirmLabel: 'Delete',\n * danger: true,\n * onConfirm: () => this.shipments.delete(id),\n * })\n * .subscribe((ok) => {\n * if (ok) {\n * this.refreshList();\n * }\n * });\n * ```\n */\n@Injectable()\nexport class ConfirmService {\n private readonly modal = inject(ModalService);\n\n /**\n * Opens {@link ConfirmDialogComponent} and resolves to whether the user\n * confirmed.\n *\n * Not dismissible by default. When `options.dismissible` is true, backdrop /\n * Escape map to `false` (same as Cancel) so callers only branch on an\n * affirmative click.\n *\n * When `options.onConfirm` is set, Confirm stays open with a loading primary\n * button until that work settles. Success emits `true`; errors leave the\n * dialog open (this Observable does not emit until close).\n *\n * @param options - Title, message, button labels, and optional confirm work.\n * @returns Observable that emits once with `true` / `false`, then completes.\n */\n confirm(options: ConfirmOptions): Observable<boolean> {\n return this.modal\n .open<ConfirmOptions, boolean>(ConfirmDialogComponent, {\n data: options,\n dismissible: options.dismissible === true,\n })\n .afterClosed()\n .pipe(map((result) => result === true));\n }\n}\n","import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';\n\n/**\n * Marks projected chrome as the non-scrolling overlay header (title + close).\n *\n * @example\n * ```html\n * <africanies-overlay-frame>\n * <div africaniesOverlayHeader class=\"flex items-start justify-between gap-3 pb-4\">\n * <h2>Edit shipment</h2>\n * <button type=\"button\" africanies-button variant=\"ghost\" size=\"sm\" aria-label=\"Close\">…</button>\n * </div>\n * …\n * </africanies-overlay-frame>\n * ```\n */\n@Directive({\n selector: '[africaniesOverlayHeader]',\n standalone: true,\n})\nexport class OverlayHeaderDirective {}\n\n/**\n * Marks projected chrome as the non-scrolling overlay footer (actions).\n *\n * @example\n * ```html\n * <africanies-overlay-frame>\n * …\n * <div africaniesOverlayFooter class=\"flex justify-end gap-2 pt-4\">\n * <button type=\"button\" africanies-button variant=\"ghost\">Cancel</button>\n * <button type=\"button\" africanies-button variant=\"primary\">Save</button>\n * </div>\n * </africanies-overlay-frame>\n * ```\n */\n@Directive({\n selector: '[africaniesOverlayFooter]',\n standalone: true,\n})\nexport class OverlayFooterDirective {}\n\n/**\n * Header / scroll body / footer shell for {@link ModalService} and\n * {@link DrawerService} panels.\n *\n * WHY: the pane must not scroll. Overlay scrollbars sit on the right edge and\n * cover a top-right close control or bottom-right actions. This frame keeps\n * header and footer outside the scrollport; only the default slot scrolls,\n * with `.africanies-overlay-scroll` reserving a scrollbar gutter.\n *\n * Put `overflow-hidden` on the hosted component host so the pane child\n * does not become a second scroller (a Tailwind utility wins the base rule\n * on `.africanies-modal-panel > *`).\n *\n * @example\n * ```ts\n * @Component({\n * selector: 'app-edit-modal',\n * standalone: true,\n * imports: [OverlayFrameComponent, OverlayHeaderDirective, OverlayFooterDirective],\n * host: { class: 'flex min-h-0 w-full flex-col overflow-hidden' },\n * template: `\n * <africanies-overlay-frame>\n * <div africaniesOverlayHeader>…title + close…</div>\n * …form fields…\n * <div africaniesOverlayFooter>…Cancel / Save…</div>\n * </africanies-overlay-frame>\n * `,\n * })\n * export class EditModal {}\n * ```\n */\n@Component({\n selector: 'africanies-overlay-frame',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'flex min-h-0 w-full flex-1 flex-col overflow-hidden',\n },\n template: `\n <div class=\"shrink-0\">\n <ng-content select=\"[africaniesOverlayHeader]\" />\n </div>\n <div\n class=\"africanies-overlay-scroll min-h-0 flex-1 overflow-x-clip overflow-y-auto px-[2px] -mx-[2px]\"\n >\n <ng-content />\n </div>\n <div class=\"shrink-0\">\n <ng-content select=\"[africaniesOverlayFooter]\" />\n </div>\n `,\n})\nexport class OverlayFrameComponent {}\n","import {\n type EnvironmentProviders,\n makeEnvironmentProviders,\n} from '@angular/core';\n\nimport { DRAWER_SERVICE, MODAL_SERVICE } from '@africanies/africanies-core';\n\nimport { FilterDrawerService } from '../filters/filter-drawer.service';\nimport { ConfirmService } from './confirm.service';\nimport { DrawerService } from './drawer.service';\nimport { ModalService } from './modal.service';\n\n/**\n * Registers programmatic overlay openers and binds core DI tokens.\n *\n * Call beside {@link provideOverlayRoutes} so route-driven overlays can\n * resolve {@link MODAL_SERVICE} / {@link DRAWER_SERVICE}. Also registers\n * {@link ConfirmService} and {@link FilterDrawerService} (both need overlay openers).\n *\n * @returns Environment providers for `app.config.ts`.\n *\n * @example\n * ```ts\n * import { provideOverlayRoutes } from '@africanies/africanies-core';\n * import { provideAfricaniesUiOverlays } from '@africanies/africanies-ui';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideAfricaniesUiOverlays(),\n * provideOverlayRoutes([\n * {\n * paramKey: 'modal',\n * routes: {\n * 'edit-shipment': { component: EditShipmentModal, overlay: 'modal' },\n * },\n * },\n * ]),\n * ],\n * };\n * ```\n */\nexport function provideAfricaniesUiOverlays(): EnvironmentProviders {\n return makeEnvironmentProviders([\n ModalService,\n DrawerService,\n ConfirmService,\n FilterDrawerService,\n { provide: MODAL_SERVICE, useExisting: ModalService },\n { provide: DRAWER_SERVICE, useExisting: DrawerService },\n ]);\n}\n","/**\n * Programmatic overlay system (modal, drawer, confirm).\n *\n * Openers implement `@africanies/africanies-core` {@link OverlayOpener} and are bound to\n * {@link MODAL_SERVICE} / {@link DRAWER_SERVICE} via {@link provideAfricaniesUiOverlays}.\n */\nexport { AfricaniesOverlayRef } from './africanies-overlay-ref';\nexport { ConfirmService } from './confirm.service';\nexport { ConfirmDialogComponent } from './confirm-dialog.component';\nexport type { ConfirmOptions, ConfirmWork } from './confirm-options';\nexport { DrawerService } from './drawer.service';\nexport { type ModalOpenConfig,ModalService } from './modal.service';\nexport { MODAL_SIZE_PANEL_CLASS,type ModalSize } from './modal-size';\nexport type { OverlayOpenConfig } from './overlay-attach';\nexport { OVERLAY_DATA } from './overlay-data.token';\nexport {\n OverlayFooterDirective,\n OverlayFrameComponent,\n OverlayHeaderDirective,\n} from './overlay-frame.component';\nexport { provideAfricaniesUiOverlays } from './provide-africanies-ui-overlays';\n","import { InjectionToken } from '@angular/core';\n\nimport type { GooglePlacesConfig } from './address-input.types';\n\n/**\n * Optional Places API (New) config. When absent, {@link AddressInputComponent}\n * still renders but predictions stay empty.\n */\nexport const GOOGLE_PLACES_CONFIG = new InjectionToken<GooglePlacesConfig>(\n 'AFRICANIES_GOOGLE_PLACES_CONFIG',\n);\n","import { inject, Injectable } from '@angular/core';\n\nimport type {\n AddressComponent,\n AddressPlace,\n AddressPrediction,\n} from './address-input.types';\nimport { GOOGLE_PLACES_CONFIG } from './google-places.token';\n\nconst AUTOCOMPLETE_URL = 'https://places.googleapis.com/v1/places:autocomplete';\n\nconst AUTOCOMPLETE_FIELD_MASK = [\n 'suggestions.placePrediction.placeId',\n 'suggestions.placePrediction.text',\n 'suggestions.placePrediction.structuredFormat',\n 'suggestions.placePrediction.types',\n].join(',');\n\nconst PLACE_DETAILS_FIELD_MASK =\n 'id,displayName,formattedAddress,addressComponents,location';\n\ninterface AutocompleteApiResponse {\n suggestions?: Array<{\n placePrediction?: {\n placeId?: string;\n text?: { text?: string };\n structuredFormat?: {\n mainText?: { text?: string };\n secondaryText?: { text?: string };\n };\n };\n }>;\n}\n\ninterface PlaceDetailsApiResponse {\n id?: string;\n displayName?: { text?: string };\n formattedAddress?: string;\n addressComponents?: Array<{\n longText?: string;\n shortText?: string;\n types?: string[];\n }>;\n location?: {\n latitude?: number;\n longitude?: number;\n };\n}\n\n/**\n * Places API (New) over REST — same contract as the working React\n * autocomplete (`POST …/places:autocomplete`, `GET …/places/{id}`).\n *\n * No Maps JavaScript widget, AutocompleteService, or PlacesService.\n * Register {@link provideGooglePlaces} with a key that has Places API (New).\n */\n@Injectable({ providedIn: 'root' })\nexport class GooglePlacesService {\n private readonly config = inject(GOOGLE_PLACES_CONFIG, { optional: true });\n\n /**\n * @param query - Free-text search.\n * @param countries - Optional ISO-3166-1 alpha-2 codes (`includedRegionCodes`).\n * @returns Autocomplete predictions (may be empty).\n */\n async getPredictions(\n query: string,\n countries?: string[],\n ): Promise<AddressPrediction[]> {\n const apiKey = this.apiKey();\n const trimmed = query.trim();\n if (!trimmed || !apiKey) {\n return [];\n }\n\n const body: Record<string, unknown> = { input: trimmed };\n const regionCodes = (countries ?? [])\n .map((code) => code.trim().toLowerCase())\n .filter(Boolean);\n if (regionCodes.length) {\n body['includedRegionCodes'] = regionCodes;\n } else if (this.config?.region?.trim()) {\n body['includedRegionCodes'] = [this.config.region.trim().toLowerCase()];\n }\n if (this.config?.language?.trim()) {\n body['languageCode'] = this.config.language.trim();\n }\n\n const data = await placesFetch<AutocompleteApiResponse>(\n AUTOCOMPLETE_URL,\n apiKey,\n {\n method: 'POST',\n fieldMask: AUTOCOMPLETE_FIELD_MASK,\n body: JSON.stringify(body),\n },\n );\n\n const predictions: AddressPrediction[] = [];\n for (const item of data.suggestions ?? []) {\n const prediction = item.placePrediction;\n const placeId = prediction?.placeId?.trim();\n if (!prediction || !placeId) {\n continue;\n }\n const description =\n prediction.text?.text?.trim() ||\n prediction.structuredFormat?.mainText?.text?.trim() ||\n '';\n if (!description) {\n continue;\n }\n const mapped: AddressPrediction = { placeId, description };\n const mainText = prediction.structuredFormat?.mainText?.text?.trim();\n const secondaryText =\n prediction.structuredFormat?.secondaryText?.text?.trim();\n if (mainText) {\n mapped.mainText = mainText;\n }\n if (secondaryText) {\n mapped.secondaryText = secondaryText;\n }\n predictions.push(mapped);\n }\n return predictions;\n }\n\n /**\n * @param placeId - Place id from a prediction (`ChIJ…` or `places/ChIJ…`).\n * @returns Structured place details, or `null` on failure.\n */\n async getPlaceDetails(placeId: string): Promise<AddressPlace | null> {\n const apiKey = this.apiKey();\n const id = normalizePlaceId(placeId);\n if (!id || !apiKey) {\n return null;\n }\n\n const details = await placesFetch<PlaceDetailsApiResponse>(\n `https://places.googleapis.com/v1/places/${encodeURIComponent(id)}`,\n apiKey,\n {\n method: 'GET',\n fieldMask: PLACE_DETAILS_FIELD_MASK,\n },\n );\n\n return mapPlaceDetails(details, id);\n }\n\n private apiKey(): string {\n return this.config?.apiKey?.trim() ?? '';\n }\n}\n\nasync function placesFetch<T>(\n url: string,\n apiKey: string,\n init: RequestInit & { fieldMask: string },\n): Promise<T> {\n const { fieldMask, ...requestInit } = init;\n const response = await fetch(url, {\n ...requestInit,\n headers: {\n 'Content-Type': 'application/json',\n 'X-Goog-Api-Key': apiKey,\n 'X-Goog-FieldMask': fieldMask,\n ...requestInit.headers,\n },\n });\n\n if (!response.ok) {\n throw new Error(await placesErrorMessage(response));\n }\n\n return response.json() as Promise<T>;\n}\n\nasync function placesErrorMessage(response: Response): Promise<string> {\n try {\n const body = (await response.json()) as { error?: { message?: string } };\n if (body.error?.message?.trim()) {\n return body.error.message.trim();\n }\n } catch {\n // ignore non-JSON error bodies\n }\n switch (response.status) {\n case 401:\n return 'Authentication failed. Please check your API key.';\n case 403:\n return 'Access denied. Enable Places API (New) for this key.';\n case 429:\n return 'Too many requests. Please try again in a moment.';\n default:\n return `Places API request failed (${response.status}).`;\n }\n}\n\nfunction normalizePlaceId(placeId: string): string {\n const trimmed = placeId.trim();\n return trimmed.startsWith('places/') ? trimmed.slice('places/'.length) : trimmed;\n}\n\nfunction mapPlaceDetails(\n details: PlaceDetailsApiResponse,\n fallbackId: string,\n): AddressPlace {\n const components: AddressComponent[] = (details.addressComponents ?? []).map(\n (component) => ({\n longName: component.longText ?? '',\n shortName: component.shortText ?? '',\n types: component.types ?? [],\n }),\n );\n const find = (type: string): AddressComponent | undefined =>\n components.find((component) => component.types.includes(type));\n\n const locality =\n find('locality') ??\n find('postal_town') ??\n find('sublocality') ??\n find('neighborhood') ??\n find('administrative_area_level_2');\n const country = find('country');\n const landmark =\n find('landmark') ??\n find('neighborhood') ??\n find('sublocality') ??\n find('premise') ??\n find('point_of_interest');\n\n return {\n placeId: details.id || fallbackId,\n formattedAddress: details.formattedAddress ?? '',\n name: details.displayName?.text?.trim() || undefined,\n lat: details.location?.latitude,\n lng: details.location?.longitude,\n streetNumber: find('street_number')?.longName,\n route: find('route')?.longName,\n locality: locality?.longName,\n administrativeAreaLevel1: find('administrative_area_level_1')?.longName,\n administrativeAreaLevel1Code: find('administrative_area_level_1')?.shortName,\n country: country?.longName,\n countryCode: country?.shortName,\n postalCode: find('postal_code')?.longName,\n landmark: landmark?.longName || undefined,\n addressComponents: components.length ? components : undefined,\n };\n}\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n type ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n forwardRef,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport { Subject, timer } from 'rxjs';\nimport { debounce, switchMap } from 'rxjs/operators';\n\nimport {\n FORM_AFFIX_CLASS,\n FORM_CONTROL_INNER_CLASS,\n FORM_DISABLED_CLASS,\n FORM_ERROR_CLASS,\n FORM_FIELD_CLASS,\n FORM_FIELD_ERROR_CLASS,\n FORM_HINT_CLASS,\n FORM_LABEL_CLASS,\n} from '../form-field.classes';\nimport type {\n AddressPlace,\n AddressPrediction,\n} from './address-input.types';\nimport { GooglePlacesService } from './google-places.service';\n\nlet nextAddressInputId = 0;\n\n/** Preferred panel placement — flips upward when there is no room below. */\nconst ADDRESS_PANEL_POSITIONS: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 4,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -4,\n },\n];\n\n/**\n * Google Places address field with suggestion dropdown.\n *\n * Requires {@link provideGooglePlaces} at bootstrap. Predictions come from\n * Places API (New) REST (`places.googleapis.com`). Form value is a structured\n * {@link AddressPlace} (or `null`). Selecting a suggestion also emits\n * {@link placeSelected}. Typing emits {@link queryChange} with the visible text.\n *\n * @example\n * ```html\n * <africanies-address-input\n * label=\"Pickup address\"\n * [countries]=\"['ng', 'gh']\"\n * [(value)]=\"pickup\"\n * (placeSelected)=\"onPlace($event)\"\n * >\n * <africanies-icon prefix name=\"map-marker\" [size]=\"16\" />\n * </africanies-address-input>\n * ```\n */\n@Component({\n selector: 'africanies-address-input',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CdkOverlayOrigin, CdkConnectedOverlay],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AddressInputComponent),\n multi: true,\n },\n ],\n host: {\n class: 'relative block',\n },\n template: `\n <label [attr.for]=\"controlId\" [class]=\"labelClass\">{{ label() }}</label>\n <div\n cdkOverlayOrigin\n #triggerOrigin=\"cdkOverlayOrigin\"\n [class]=\"shellClass()\"\n >\n <span [class]=\"affixClass\" data-slot=\"prefix\">\n <ng-content select=\"[prefix]\" />\n </span>\n <input\n [id]=\"controlId\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [class]=\"innerClass\"\n [value]=\"query()\"\n [disabled]=\"disabled()\"\n [attr.placeholder]=\"placeholder() || null\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-autocomplete]=\"'list'\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n <span [class]=\"affixClass\" data-slot=\"suffix\">\n <ng-content select=\"[suffix]\" />\n </span>\n </div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"panelPositions\"\n [cdkConnectedOverlayWidth]=\"panelWidth()\"\n [cdkConnectedOverlayMinWidth]=\"panelWidth()\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"closePanel()\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n (detach)=\"onOverlayDetach()\"\n >\n <div\n [id]=\"listboxId\"\n class=\"w-full rounded-md border border-border bg-white shadow-lg dark:border-white/15 dark:bg-ink-950 max-h-64 overflow-auto africanies-overlay-scroll\"\n role=\"listbox\"\n tabindex=\"-1\"\n >\n @if (loading()) {\n <div\n class=\"px-3 py-2 text-body-sm text-neutral-600 dark:text-neutral-400\"\n >\n Searching…\n </div>\n } @else if (apiError(); as err) {\n <div\n class=\"px-3 py-2 text-body-sm text-neutral-600 dark:text-neutral-400\"\n >\n {{ err }}\n </div>\n } @else if (predictions().length === 0) {\n <div\n class=\"px-3 py-2 text-body-sm text-neutral-600 dark:text-neutral-400\"\n >\n No matches\n </div>\n } @else {\n @for (prediction of predictions(); track prediction.placeId; let i = $index) {\n <button\n type=\"button\"\n [id]=\"optionId(i)\"\n role=\"option\"\n class=\"flex w-full flex-col gap-0.5 px-3 py-2 text-left text-body text-ink outline-none cursor-pointer hover:bg-background-welcome focus-visible:bg-background-welcome dark:text-white dark:hover:bg-white/5 dark:focus-visible:bg-white/5\"\n [class.bg-background-welcome]=\"activeIndex() === i\"\n [class.dark:bg-white/5]=\"activeIndex() === i\"\n [attr.aria-selected]=\"activeIndex() === i\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectPrediction(prediction)\"\n (mouseenter)=\"activeIndex.set(i)\"\n >\n <span class=\"min-w-0 truncate font-medium\">\n {{ prediction.mainText || prediction.description }}\n </span>\n @if (prediction.secondaryText; as secondary) {\n <span\n class=\"min-w-0 truncate text-caption text-neutral-600 dark:text-neutral-400\"\n >\n {{ secondary }}\n </span>\n }\n </button>\n }\n }\n </div>\n </ng-template>\n\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n `,\n})\nexport class AddressInputComponent implements ControlValueAccessor {\n private readonly places = inject(GooglePlacesService);\n private readonly destroyRef = inject(DestroyRef);\n\n protected readonly controlId = `africanies-address-input-${++nextAddressInputId}`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n protected readonly listboxId = `${this.controlId}-listbox`;\n\n protected readonly labelClass = FORM_LABEL_CLASS;\n protected readonly affixClass = FORM_AFFIX_CLASS;\n protected readonly innerClass = FORM_CONTROL_INNER_CLASS;\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n protected readonly panelPositions = ADDRESS_PANEL_POSITIONS;\n protected readonly minPanelWidth = 224;\n\n private readonly triggerOrigin = viewChild(CdkOverlayOrigin);\n\n private readonly querySubject = new Subject<string>();\n\n /**\n * Visible field label.\n */\n readonly label = input('');\n\n /**\n * Helper copy under the field. Hidden while {@link error} is set.\n */\n readonly hint = input<string | undefined>(undefined);\n\n /**\n * Field-level validation message.\n */\n readonly error = input<string | null>(null);\n\n /**\n * Native placeholder when the query is empty.\n */\n readonly placeholder = input('');\n\n /**\n * ISO-3166-1 alpha-2 country codes to restrict predictions (e.g. `['ng']`).\n */\n readonly countries = input<string[] | undefined>(undefined);\n\n /**\n * Debounce for prediction requests (ms).\n */\n readonly debounceMs = input(300, { transform: numberAttribute });\n\n /**\n * Selected place. Supports `[(value)]` and Reactive Forms via CVA.\n */\n readonly value = model<AddressPlace | null>(null);\n\n /**\n * Emits when the user picks a suggestion (after place details resolve).\n */\n readonly placeSelected = output<AddressPlace>();\n\n /**\n * Emits the visible query as the user types (including after a selection).\n */\n readonly queryChange = output<string>();\n\n /**\n * Optional host disable (in addition to CVA `setDisabledState`).\n */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n protected readonly cvaDisabled = signal(false);\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n protected readonly query = signal('');\n protected readonly open = signal(false);\n protected readonly loading = signal(false);\n protected readonly predictions = signal<AddressPrediction[]>([]);\n protected readonly apiError = signal<string | null>(null);\n protected readonly activeIndex = signal(-1);\n protected readonly panelWidth = signal(this.minPanelWidth);\n\n protected readonly shellClass = computed(() => {\n let classes = FORM_FIELD_CLASS;\n if (this.error()) {\n classes += ` ${FORM_FIELD_ERROR_CLASS}`;\n }\n if (this.disabled()) {\n classes += ` ${FORM_DISABLED_CLASS}`;\n }\n return classes;\n });\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n protected readonly activeOptionId = computed(() => {\n const index = this.activeIndex();\n if (index < 0 || !this.open()) {\n return null;\n }\n return this.optionId(index);\n });\n\n private onChange: (value: AddressPlace | null) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n constructor() {\n effect(() => {\n const formatted = this.value()?.formattedAddress?.trim() ?? '';\n if (formatted) {\n this.query.set(formatted);\n }\n });\n\n this.querySubject\n .pipe(\n debounce(() => timer(Math.max(0, Number(this.debounceMs()) || 0))),\n switchMap(async (text) => {\n const trimmed = text.trim();\n if (!trimmed) {\n this.predictions.set([]);\n this.apiError.set(null);\n this.loading.set(false);\n this.open.set(false);\n return [] as AddressPrediction[];\n }\n this.loading.set(true);\n this.open.set(true);\n try {\n const results = await this.places.getPredictions(\n trimmed,\n this.countries(),\n );\n this.apiError.set(null);\n return results;\n } catch (err) {\n this.apiError.set(\n err instanceof Error\n ? err.message\n : 'Could not load address suggestions.',\n );\n return [] as AddressPrediction[];\n } finally {\n this.loading.set(false);\n }\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((results) => {\n this.predictions.set(results);\n this.activeIndex.set(results.length ? 0 : -1);\n if (this.query().trim().length > 0) {\n this.open.set(true);\n }\n });\n }\n\n /**\n * @param value - Form model value.\n */\n writeValue(value: AddressPlace | null): void {\n this.value.set(value);\n this.query.set(value?.formattedAddress ?? '');\n }\n\n /**\n * @param fn - Called when the selected place changes.\n */\n registerOnChange(fn: (value: AddressPlace | null) => void): void {\n this.onChange = fn;\n }\n\n /**\n * @param fn - Called on blur.\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /**\n * @param isDisabled - When true, blocks editing.\n */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected optionId(index: number): string {\n return `${this.controlId}-option-${index}`;\n }\n\n protected onInput(event: Event): void {\n const next = (event.target as HTMLInputElement).value;\n this.query.set(next);\n this.queryChange.emit(next);\n\n if (this.value() !== null) {\n this.value.set(null);\n this.onChange(null);\n }\n\n this.syncPanelWidth();\n this.querySubject.next(next);\n }\n\n protected onFocus(): void {\n this.syncPanelWidth();\n if (this.query().trim() && this.predictions().length) {\n this.open.set(true);\n }\n }\n\n protected onBlur(): void {\n this.onTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (!this.open() && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {\n if (this.predictions().length) {\n this.open.set(true);\n event.preventDefault();\n }\n return;\n }\n\n if (!this.open()) {\n if (event.key === 'Escape') {\n (event.target as HTMLInputElement).blur();\n }\n return;\n }\n\n const count = this.predictions().length;\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (!count) {\n return;\n }\n this.activeIndex.set((this.activeIndex() + 1) % count);\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (!count) {\n return;\n }\n this.activeIndex.set((this.activeIndex() - 1 + count) % count);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n const index = this.activeIndex();\n const prediction = this.predictions()[index];\n if (prediction) {\n void this.selectPrediction(prediction);\n }\n break;\n }\n case 'Escape': {\n event.preventDefault();\n this.closePanel();\n break;\n }\n default:\n break;\n }\n }\n\n protected async selectPrediction(prediction: AddressPrediction): Promise<void> {\n this.loading.set(true);\n try {\n const place = await this.places.getPlaceDetails(prediction.placeId);\n if (!place) {\n return;\n }\n this.query.set(place.formattedAddress);\n this.queryChange.emit(place.formattedAddress);\n this.value.set(place);\n this.onChange(place);\n this.placeSelected.emit(place);\n this.closePanel();\n this.predictions.set([]);\n } finally {\n this.loading.set(false);\n }\n }\n\n protected closePanel(): void {\n this.open.set(false);\n this.activeIndex.set(-1);\n }\n\n protected onOutsideClick(event: MouseEvent): void {\n const origin = this.triggerOrigin()?.elementRef.nativeElement as\n | HTMLElement\n | undefined;\n if (origin?.contains(event.target as Node)) {\n return;\n }\n this.closePanel();\n }\n\n protected onOverlayDetach(): void {\n this.open.set(false);\n }\n\n private syncPanelWidth(): void {\n const origin = this.triggerOrigin()?.elementRef.nativeElement as\n | HTMLElement\n | undefined;\n const width = origin?.getBoundingClientRect().width ?? this.minPanelWidth;\n this.panelWidth.set(Math.max(width, this.minPanelWidth));\n }\n}\n","import {\n type EnvironmentProviders,\n makeEnvironmentProviders,\n} from '@angular/core';\n\nimport type { GooglePlacesConfig } from './address-input.types';\nimport { GOOGLE_PLACES_CONFIG } from './google-places.token';\n\n/**\n * Registers Places API (New) for {@link AddressInputComponent}.\n *\n * Provide once at bootstrap. Requires an API key with Places API (New)\n * enabled (REST `places.googleapis.com`, not the Maps JavaScript widget).\n *\n * @param config - API key and optional language / region.\n * @returns Environment providers for `app.config.ts`.\n *\n * @example\n * ```ts\n * import { provideGooglePlaces } from '@africanies/africanies-ui';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGooglePlaces({ apiKey: import.meta.env['NG_APP_GOOGLE_MAPS_KEY'] }),\n * ],\n * };\n * ```\n */\nexport function provideGooglePlaces(\n config: GooglePlacesConfig,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: GOOGLE_PLACES_CONFIG, useValue: config },\n ]);\n}\n","/**\n * Google Places address input form control exports.\n */\n\nexport { AddressInputComponent } from './address-input.component';\nexport type {\n AddressComponent,\n AddressPlace,\n AddressPrediction,\n GooglePlacesConfig,\n} from './address-input.types';\nexport { GooglePlacesService } from './google-places.service';\nexport { GOOGLE_PLACES_CONFIG } from './google-places.token';\nexport { provideGooglePlaces } from './provide-google-places';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport {\n FORM_ERROR_CLASS,\n FORM_HINT_CLASS,\n} from '../form-field.classes';\n\nlet nextCheckboxId = 0;\n\n/**\n * Boolean checkbox following the shared AFRICANIES form field pattern.\n *\n * **Prefix/suffix slots are omitted** — a checkbox is a binary control with a\n * label; affix projection does not apply.\n *\n * Custom painted control so the check glyph stays **white** on the mode\n * primary fill (SFN green / STN orange).\n *\n * @example\n * ```html\n * <africanies-checkbox\n * label=\"I agree to the terms\"\n * hint=\"Required to continue\"\n * [(value)]=\"accepted\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-checkbox',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'inline-flex max-w-full',\n },\n imports: [AfricaniesIconComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CheckboxComponent),\n multi: true,\n },\n ],\n template: `\n <div class=\"inline-flex max-w-full flex-col gap-1.5\">\n <label\n [attr.for]=\"controlId\"\n class=\"inline-flex items-center gap-2.5 text-body text-ink dark:text-white\"\n [class.opacity-50]=\"disabled()\"\n [class.cursor-pointer]=\"!disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n >\n <span class=\"relative inline-flex size-4 shrink-0\">\n <input\n [id]=\"controlId\"\n type=\"checkbox\"\n class=\"peer absolute inset-0 z-10 m-0 size-full opacity-0\"\n [class.cursor-pointer]=\"!disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [checked]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (change)=\"onChangeEvent($event)\"\n (blur)=\"onBlur()\"\n />\n <span [class]=\"markClass()\" aria-hidden=\"true\">\n @if (value()) {\n <africanies-icon name=\"check\" [size]=\"12\" class=\"text-white\" />\n }\n </span>\n </span>\n <span class=\"text-body leading-5\">{{ label() }}</span>\n </label>\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n </div>\n `,\n})\nexport class CheckboxComponent implements ControlValueAccessor {\n private readonly modeColor = inject(ModeColorService);\n\n protected readonly controlId = `africanies-checkbox-${++nextCheckboxId}`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n\n /** Visible label beside the checkbox. */\n readonly label = input('');\n\n /** Helper copy. Hidden while {@link error} is set. */\n readonly hint = input<string | undefined>(undefined);\n\n /** Field-level validation message. Distinct from `ErrorStateComponent`. */\n readonly error = input<string | null>(null);\n\n /** Checked state (`[(value)]` + CVA). */\n readonly value = model(false);\n\n /** Host disable flag (in addition to CVA). */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n protected readonly cvaDisabled = signal(false);\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n protected readonly markClass = computed(() => {\n const base =\n 'pointer-events-none flex size-4 items-center justify-center rounded border text-white transition-colors ' +\n 'peer-focus-visible:outline peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-ink';\n const err = this.error() ? ' !border-danger dark:!border-danger' : '';\n if (this.value()) {\n const c = this.modeColor.classes();\n return `${base} ${c.bg} ${c.border}${err}`;\n }\n return `${base} border-neutral-400 bg-white dark:border-white/40 dark:bg-ink-950${err}`;\n });\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n private onChange: (value: boolean) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n /** @param value - Form model; non-boolean coerces via `!!`. */\n writeValue(value: boolean | null): void {\n this.value.set(!!value);\n }\n\n /** @param fn - User change callback. */\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n /** @param fn - Blur callback. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @param isDisabled - Blocks interaction when true. */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onChangeEvent(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.value.set(checked);\n this.onChange(checked);\n }\n\n protected onBlur(): void {\n this.onTouched();\n }\n}\n","/**\n * Checkbox form control exports.\n */\nexport { CheckboxComponent } from './checkbox.component';\n","/**\n * Date picker form control exports.\n */\nexport { DatePickerComponent } from './date-picker.component';\n","/**\n * Helpers for the native `accept` attribute (MIME types + extensions).\n */\n\n/**\n * Whether `file` matches a comma-separated `accept` string.\n * Empty `accept` allows every file.\n *\n * @param file - Candidate from picker / drop / camera.\n * @param accept - Native accept value (e.g. `image/*,.pdf`).\n * @returns True when the file is allowed.\n */\nexport function fileMatchesAccept(file: File, accept: string): boolean {\n const tokens = parseAcceptTokens(accept);\n if (!tokens.length) {\n return true;\n }\n const name = file.name.toLowerCase();\n const type = (file.type || '').toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith('.')) {\n return name.endsWith(token);\n }\n if (token.endsWith('/*')) {\n return type.startsWith(token.slice(0, -1));\n }\n return type === token;\n });\n}\n\n/**\n * Human-readable chips for the dropzone (e.g. `Images`, `PDF`).\n *\n * @param accept - Native accept value.\n * @returns Deduped short labels; empty when accept is unrestricted.\n */\nexport function acceptLabels(accept: string): string[] {\n const tokens = parseAcceptTokens(accept);\n const labels: string[] = [];\n const seen = new Set<string>();\n for (const token of tokens) {\n const label = labelForAcceptToken(token);\n if (!seen.has(label)) {\n seen.add(label);\n labels.push(label);\n }\n }\n return labels;\n}\n\n/**\n * @param accept - Native accept value.\n * @returns Lowercased trimmed tokens.\n */\nfunction parseAcceptTokens(accept: string): string[] {\n return accept\n .split(',')\n .map((t) => t.trim().toLowerCase())\n .filter(Boolean);\n}\n\n/**\n * @param token - One accept token.\n * @returns Short UI label.\n */\nfunction labelForAcceptToken(token: string): string {\n if (token === 'image/*') {\n return 'Images';\n }\n if (token === 'video/*') {\n return 'Video';\n }\n if (token === 'audio/*') {\n return 'Audio';\n }\n if (token === 'application/pdf' || token === '.pdf') {\n return 'PDF';\n }\n if (\n token ===\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||\n token === '.xlsx' ||\n token === '.xls' ||\n token === 'application/vnd.ms-excel'\n ) {\n return 'Excel';\n }\n if (\n token ===\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ||\n token === '.docx' ||\n token === '.doc' ||\n token === 'application/msword'\n ) {\n return 'Word';\n }\n if (token === 'application/zip' || token === '.zip') {\n return 'ZIP';\n }\n if (token.startsWith('.')) {\n return token.slice(1).toUpperCase();\n }\n if (token.endsWith('/*')) {\n return `${token.slice(0, -2)} files`;\n }\n const subtype = token.includes('/') ? token.split('/')[1] : token;\n return subtype.toUpperCase();\n}\n\n/**\n * File-name extension without the leading dot (uppercased), or empty.\n *\n * @param fileName - Original file name.\n * @returns Extension label for non-image tiles.\n */\nexport function fileExtensionLabel(fileName: string): string {\n const i = fileName.lastIndexOf('.');\n if (i < 0 || i === fileName.length - 1) {\n return '';\n }\n return fileName.slice(i + 1).toUpperCase().slice(0, 5);\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../../button/button.component';\nimport { AfricaniesOverlayRef } from '../../overlay/africanies-overlay-ref';\n\ntype CameraFacing = 'environment' | 'user';\n\n/**\n * Live webcam capture dialog for {@link FileUploadComponent}.\n *\n * Uses `navigator.mediaDevices.getUserMedia` so desktop playgrounds and\n * HTTPS apps can take a photo without relying on the mobile-only\n * `<input capture>` attribute. Closes with a JPEG {@link File}, or\n * `undefined` when dismissed.\n *\n * Prefer opening via {@link ModalService} so the stream is owned by this\n * dialog and torn down on close / destroy.\n */\n@Component({\n selector: 'africanies-camera-capture-dialog',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, ButtonComponent],\n template: `\n <div\n class=\"flex w-full flex-col gap-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"error() ? errorId : hintId\"\n >\n <div class=\"flex items-start justify-between gap-3\">\n <div class=\"min-w-0\">\n <h2\n [id]=\"titleId\"\n class=\"m-0 text-heading-3 font-semibold text-ink dark:text-white\"\n >\n Take a photo\n </h2>\n <p\n [id]=\"hintId\"\n class=\"m-0 mt-1 text-body-sm text-neutral-600 dark:text-neutral-400\"\n >\n Allow camera access, then capture when ready.\n </p>\n </div>\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!px-2\"\n [disabled]=\"!streamActive()\"\n [attr.aria-label]=\"'Switch camera'\"\n (click)=\"switchFacing()\"\n >\n <africanies-icon name=\"refresh\" [size]=\"16\" />\n </button>\n </div>\n\n @if (error(); as err) {\n <p [id]=\"errorId\" class=\"m-0 text-body-sm text-danger\" role=\"alert\">\n {{ err }}\n </p>\n } @else {\n <div\n class=\"relative aspect-video w-full min-h-[12rem] overflow-hidden rounded-md bg-ink-950 ring-1 ring-border dark:ring-white/15\"\n >\n <video\n #preview\n class=\"size-full object-cover\"\n autoplay\n playsinline\n muted\n ></video>\n @if (starting()) {\n <p\n class=\"absolute inset-0 m-0 flex items-center justify-center bg-ink/50 text-body-sm text-white\"\n >\n Starting camera…\n </p>\n }\n </div>\n }\n\n <div class=\"flex flex-wrap justify-end gap-2\">\n <button africanies-button type=\"button\" variant=\"ghost\" (click)=\"cancel()\">\n Cancel\n </button>\n <button\n africanies-button\n type=\"button\"\n variant=\"primary\"\n [disabled]=\"!streamActive() || capturing()\"\n (click)=\"capture()\"\n >\n <africanies-icon name=\"camera\" [size]=\"16\" />\n Capture\n </button>\n </div>\n\n <canvas #snapshot class=\"sr-only\" aria-hidden=\"true\"></canvas>\n </div>\n `,\n})\nexport class CameraCaptureDialogComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly ref = inject(AfricaniesOverlayRef<File>);\n\n private readonly preview =\n viewChild<ElementRef<HTMLVideoElement>>('preview');\n private readonly snapshot =\n viewChild<ElementRef<HTMLCanvasElement>>('snapshot');\n\n protected readonly titleId = `africanies-camera-title-${Math.random().toString(36).slice(2, 10)}`;\n protected readonly hintId = `${this.titleId}-hint`;\n protected readonly errorId = `${this.titleId}-error`;\n\n protected readonly starting = signal(true);\n protected readonly capturing = signal(false);\n protected readonly streamActive = signal(false);\n protected readonly error = signal<string | null>(null);\n\n private stream: MediaStream | null = null;\n private facing: CameraFacing = 'environment';\n\n constructor() {\n this.destroyRef.onDestroy(() => this.stopStream());\n afterNextRender(() => {\n void this.startStream();\n });\n }\n\n /** Dismiss without a file. */\n protected cancel(): void {\n this.stopStream();\n this.ref.close();\n }\n\n /** Flip between rear and front cameras when the device exposes both. */\n protected switchFacing(): void {\n this.facing = this.facing === 'environment' ? 'user' : 'environment';\n void this.startStream();\n }\n\n /** Freeze the current frame into a JPEG {@link File} and close. */\n protected capture(): void {\n const video = this.preview()?.nativeElement;\n const canvas = this.snapshot()?.nativeElement;\n if (!video || !canvas || !this.streamActive() || this.capturing()) {\n return;\n }\n\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (!width || !height) {\n this.error.set('Camera is not ready yet. Try again in a moment.');\n return;\n }\n\n this.capturing.set(true);\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n this.capturing.set(false);\n this.error.set('Could not capture this frame. Try another browser.');\n return;\n }\n ctx.drawImage(video, 0, 0, width, height);\n\n canvas.toBlob(\n (blob) => {\n this.capturing.set(false);\n if (!blob) {\n this.error.set('Could not create the photo. Try again.');\n return;\n }\n const file = new File([blob], `camera-${Date.now()}.jpg`, {\n type: 'image/jpeg',\n lastModified: Date.now(),\n });\n this.stopStream();\n this.ref.close(file);\n },\n 'image/jpeg',\n 0.92,\n );\n }\n\n private async startStream(): Promise<void> {\n this.starting.set(true);\n this.error.set(null);\n this.streamActive.set(false);\n this.stopStream();\n\n if (\n typeof navigator === 'undefined' ||\n !navigator.mediaDevices?.getUserMedia\n ) {\n this.starting.set(false);\n this.error.set(\n 'Camera capture is not available in this browser. Use Choose files instead.',\n );\n return;\n }\n\n try {\n this.stream = await navigator.mediaDevices.getUserMedia({\n audio: false,\n video: {\n facingMode: { ideal: this.facing },\n width: { ideal: 1280 },\n height: { ideal: 720 },\n },\n });\n const video = this.preview()?.nativeElement;\n if (!video) {\n this.stopStream();\n this.starting.set(false);\n this.error.set('Camera preview failed to start.');\n return;\n }\n video.srcObject = this.stream;\n await video.play().catch(() => undefined);\n this.streamActive.set(true);\n this.starting.set(false);\n } catch {\n this.starting.set(false);\n this.streamActive.set(false);\n this.error.set(\n 'Could not access the camera. Check permissions and try again.',\n );\n }\n }\n\n private stopStream(): void {\n const video = this.preview()?.nativeElement;\n if (video) {\n video.srcObject = null;\n }\n if (this.stream) {\n for (const track of this.stream.getTracks()) {\n track.stop();\n }\n this.stream = null;\n }\n this.streamActive.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../../button/button.component';\nimport { AfricaniesOverlayRef } from '../../overlay/africanies-overlay-ref';\nimport { OVERLAY_DATA } from '../../overlay/overlay-data.token';\n\n/** Payload for {@link FilePreviewDialogComponent}. */\nexport interface FilePreviewData {\n file: File;\n previewUrl: string | null;\n isImage: boolean;\n}\n\ntype PreviewKind = 'image' | 'unavailable';\n\n/**\n * Large-file preview modal for {@link FileUploadComponent}.\n *\n * Local image picks render inline. Other local file types (PDF, etc.) show a\n * clear “can’t view” message — server-hosted previews use other modals.\n * Object URLs created here are revoked on destroy; the list’s image\n * `previewUrl` is left alone.\n */\n@Component({\n selector: 'africanies-file-preview-dialog',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, ButtonComponent],\n host: {\n class: 'flex min-h-0 w-full flex-col overflow-hidden',\n },\n template: `\n <div\n class=\"flex min-h-0 w-full flex-1 flex-col\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"titleId\"\n >\n <div class=\"flex shrink-0 items-start justify-between gap-3 pb-4\">\n <div class=\"min-w-0\">\n <h2\n [id]=\"titleId\"\n class=\"m-0 truncate text-heading-3 font-semibold text-ink dark:text-white\"\n >\n {{ data.file.name }}\n </h2>\n <p class=\"m-0 mt-1 text-body-sm text-neutral-600 dark:text-neutral-400\">\n {{ sizeLabel() }}\n @if (data.file.type) {\n <span> · {{ data.file.type }}</span>\n }\n </p>\n </div>\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!px-2\"\n aria-label=\"Close preview\"\n (click)=\"close()\"\n >\n <africanies-icon name=\"close\" [size]=\"16\" />\n </button>\n </div>\n\n <div class=\"africanies-overlay-scroll min-h-0 flex-1 overflow-y-auto\">\n @if (kind() === 'image') {\n <img\n [src]=\"src()\"\n [alt]=\"data.file.name\"\n class=\"max-h-[min(70vh,40rem)] w-full rounded-md object-contain bg-background-welcome ring-1 ring-border dark:bg-ink dark:ring-white/15\"\n />\n } @else {\n <div\n class=\"flex flex-col items-center gap-3 rounded-md bg-background-welcome px-6 py-10 text-center ring-1 ring-border dark:bg-white/5 dark:ring-white/15\"\n >\n <africanies-icon name=\"eye-slash\" [size]=\"32\" class=\"text-neutral-500\" />\n <p class=\"m-0 text-body font-medium text-ink dark:text-white\">\n Preview not available\n </p>\n <p class=\"m-0 max-w-sm text-body-sm text-neutral-600 dark:text-neutral-400\">\n You can’t view this file here. Only images can be previewed before\n upload.\n </p>\n </div>\n }\n </div>\n </div>\n `,\n})\nexport class FilePreviewDialogComponent {\n protected readonly data = inject<FilePreviewData>(OVERLAY_DATA);\n private readonly ref = inject(AfricaniesOverlayRef<void>);\n private readonly destroyRef = inject(DestroyRef);\n\n protected readonly titleId = `africanies-file-preview-${Math.random().toString(36).slice(2, 10)}`;\n\n private readonly ownedUrl: string | null;\n\n constructor() {\n this.ownedUrl =\n this.data.isImage && !this.data.previewUrl\n ? URL.createObjectURL(this.data.file)\n : null;\n this.destroyRef.onDestroy(() => {\n if (this.ownedUrl) {\n URL.revokeObjectURL(this.ownedUrl);\n }\n });\n }\n\n protected readonly src = computed(\n () => this.data.previewUrl ?? this.ownedUrl ?? '',\n );\n\n protected readonly kind = computed((): PreviewKind => {\n const type = (this.data.file.type || '').toLowerCase();\n if (this.data.isImage || type.startsWith('image/')) {\n return 'image';\n }\n return 'unavailable';\n });\n\n protected sizeLabel(): string {\n const bytes = this.data.file.size;\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n protected close(): void {\n this.ref.close();\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n forwardRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport { AfricaniesIconComponent, type IconName } from '@africanies/africanies-icons';\n\nimport { ButtonComponent } from '../../button/button.component';\nimport { ModalService } from '../../overlay/modal.service';\nimport {\n FORM_ERROR_CLASS,\n FORM_HINT_CLASS,\n FORM_LABEL_CLASS,\n} from '../form-field.classes';\nimport { CameraCaptureDialogComponent } from './camera-capture.dialog';\nimport {\n acceptLabels,\n fileExtensionLabel,\n fileMatchesAccept,\n} from './file-accept';\nimport { FilePreviewDialogComponent } from './file-preview.dialog';\n\n/**\n * Visual layout for {@link FileUploadComponent}.\n *\n * - `dropzone` — large drag target with icon, copy, and accept chips (default)\n * - `button` — compact trigger buttons inside a bordered panel\n * - `compact` — single-row inline control for dense forms\n */\nexport type FileUploadVariant = 'dropzone' | 'button' | 'compact';\n\n/**\n * One selected file with optional image preview metadata.\n */\nexport interface FileUploadResult {\n /** Original {@link File} from the picker / camera / drop. */\n file: File;\n /**\n * Object URL for image previews only (`URL.createObjectURL`).\n * Non-images use `null` — revoke on destroy via the component.\n */\n previewUrl: string | null;\n /** True when `file.type` starts with `image/`. */\n isImage: boolean;\n}\n\nlet nextFileUploadId = 0;\n\n/**\n * File / camera / drag-and-drop picker following the shared AFRICANIES form field pattern.\n *\n * **Prefix/suffix slots are N/A** — drop zone / trigger set, not a text field.\n *\n * Allowed types come from the native `accept` attribute (e.g. `image/*,.pdf`).\n * Invalid picks are skipped and a short reject message is shown. Object URLs\n * are revoked in `ngOnDestroy` and when items are removed. Each added file\n * has an underlined **View** action that opens a larger preview.\n *\n * **Camera** opens a live `getUserMedia` modal when overlays are registered;\n * otherwise falls back to `<input capture=\"environment\">`.\n *\n * @example\n * ```html\n * <africanies-file-upload\n * variant=\"dropzone\"\n * label=\"Identity document\"\n * accept=\"image/*,.pdf\"\n * [allowCamera]=\"true\"\n * [multiple]=\"true\"\n * (filesSelected)=\"onFiles($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-file-upload',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, ButtonComponent, NgTemplateOutlet],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FileUploadComponent),\n multi: true,\n },\n ],\n host: {\n class: 'block',\n },\n template: `\n <div class=\"flex flex-col gap-2\">\n @if (label()) {\n <span [class]=\"labelClass\">{{ label() }}</span>\n }\n\n @switch (variant()) {\n @case ('button') {\n <div\n [class]=\"panelClass()\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div class=\"flex flex-wrap items-center gap-2\">\n @if (allowFileSelect()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [disabled]=\"disabled()\"\n (click)=\"openFilePicker()\"\n >\n <africanies-icon name=\"upload\" [size]=\"16\" />\n {{ chooseLabel() }}\n </button>\n }\n @if (allowCamera()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [disabled]=\"disabled()\"\n (click)=\"openCamera()\"\n >\n <africanies-icon name=\"camera\" [size]=\"16\" />\n Camera\n </button>\n }\n @if (acceptChips().length) {\n <div class=\"flex flex-wrap gap-1.5\">\n @for (chip of acceptChips(); track chip) {\n <span [class]=\"chipClass\">{{ chip }}</span>\n }\n </div>\n }\n </div>\n <p class=\"m-0 mt-2 text-caption text-neutral-600 dark:text-neutral-400\">\n {{ dropHint() }}\n </p>\n <ng-container [ngTemplateOutlet]=\"fileList\" />\n </div>\n }\n @case ('compact') {\n <div\n [class]=\"compactClass()\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <africanies-icon\n name=\"cloud-upload\"\n [size]=\"20\"\n class=\"shrink-0 text-neutral-600 dark:text-neutral-400\"\n />\n <div class=\"min-w-0 flex-1\">\n <p class=\"m-0 text-body-sm text-ink dark:text-white\">\n {{ dropTitle() }}\n </p>\n @if (acceptChips().length) {\n <div class=\"mt-1 flex flex-wrap gap-1\">\n @for (chip of acceptChips(); track chip) {\n <span [class]=\"chipClass\">{{ chip }}</span>\n }\n </div>\n }\n </div>\n <div class=\"flex shrink-0 flex-wrap gap-1.5\">\n @if (allowFileSelect()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [disabled]=\"disabled()\"\n (click)=\"openFilePicker()\"\n >\n Browse\n </button>\n }\n @if (allowCamera()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n [disabled]=\"disabled()\"\n (click)=\"openCamera()\"\n >\n <africanies-icon name=\"camera\" [size]=\"16\" />\n </button>\n }\n </div>\n </div>\n <ng-container [ngTemplateOutlet]=\"fileList\" />\n }\n @default {\n <div\n [class]=\"dropzoneClass()\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-disabled]=\"disabled() ? true : null\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"onDropzoneActivate($event)\"\n (keydown.enter)=\"onDropzoneActivate($event)\"\n (keydown.space)=\"onDropzoneActivate($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div\n class=\"pointer-events-none flex flex-col items-center gap-3 text-center\"\n >\n <span\n class=\"inline-flex size-12 items-center justify-center rounded-full bg-background-welcome text-ink shadow-sm ring-1 ring-border dark:bg-white/10 dark:text-white dark:ring-white/15\"\n >\n <africanies-icon name=\"cloud-upload\" [size]=\"24\" />\n </span>\n <div class=\"flex flex-col gap-1\">\n <p class=\"m-0 text-body font-medium text-ink dark:text-white\">\n {{ dropTitle() }}\n </p>\n <p class=\"m-0 text-body-sm text-neutral-600 dark:text-neutral-400\">\n {{ dropHint() }}\n </p>\n </div>\n @if (acceptChips().length) {\n <div class=\"flex flex-wrap justify-center gap-1.5\">\n @for (chip of acceptChips(); track chip) {\n <span [class]=\"chipClass\">{{ chip }}</span>\n }\n </div>\n }\n </div>\n <div class=\"pointer-events-auto mt-4 flex flex-wrap justify-center gap-2\">\n @if (allowFileSelect()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [disabled]=\"disabled()\"\n (click)=\"openFilePicker(); $event.stopPropagation()\"\n >\n <africanies-icon name=\"upload\" [size]=\"16\" />\n {{ chooseLabel() }}\n </button>\n }\n @if (allowCamera()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n [disabled]=\"disabled()\"\n (click)=\"openCamera(); $event.stopPropagation()\"\n >\n <africanies-icon name=\"camera\" [size]=\"16\" />\n Camera\n </button>\n }\n </div>\n </div>\n <ng-container [ngTemplateOutlet]=\"fileList\" />\n }\n }\n\n @if (rejectMessage(); as reject) {\n <p class=\"m-0 text-body-sm text-danger\" role=\"status\">{{ reject }}</p>\n }\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n </div>\n\n <ng-template #fileList>\n @if (results().length) {\n <ul\n class=\"m-0 flex list-none flex-col gap-2 p-0\"\n [class.mt-3]=\"variant() !== 'compact'\"\n [class.mt-2]=\"variant() === 'compact'\"\n >\n @for (item of results(); track trackResult(item); let i = $index) {\n <li [class]=\"fileRowClass()\">\n @if (item.isImage && item.previewUrl) {\n <img\n [src]=\"item.previewUrl\"\n [alt]=\"item.file.name\"\n class=\"size-12 shrink-0 rounded-md object-cover ring-1 ring-border dark:ring-white/15\"\n />\n } @else {\n <div\n class=\"relative flex size-12 shrink-0 items-center justify-center rounded-md bg-background-welcome text-neutral-600 ring-1 ring-border dark:bg-white/10 dark:text-neutral-300 dark:ring-white/15\"\n >\n <africanies-icon [name]=\"nonImageIcon(item.file)\" [size]=\"22\" />\n @if (extensionOf(item.file); as ext) {\n <span\n class=\"absolute -bottom-1 left-1/2 -translate-x-1/2 rounded bg-ink px-1 py-px text-[10px] font-semibold uppercase leading-none tracking-wide text-white dark:bg-white/20 dark:text-white\"\n >\n {{ ext }}\n </span>\n }\n </div>\n }\n <div class=\"min-w-0 flex-1\">\n <p class=\"m-0 truncate text-body-sm font-medium text-ink dark:text-white\">\n {{ item.file.name }}\n </p>\n <p class=\"m-0 text-caption text-neutral-600 dark:text-neutral-400\">\n {{ formatSize(item.file.size) }}\n @if (!item.isImage) {\n <span> · {{ kindLabel(item.file) }}</span>\n }\n <span> · </span>\n <button\n type=\"button\"\n class=\"cursor-pointer bg-transparent p-0 text-caption font-medium text-ink underline underline-offset-2 hover:text-neutral-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink dark:text-white dark:hover:text-neutral-200\"\n (click)=\"openPreview(item); $event.stopPropagation()\"\n >\n View\n </button>\n </p>\n </div>\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!px-2\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'Remove ' + item.file.name\"\n (click)=\"removeAt(i)\"\n >\n <africanies-icon name=\"close\" [size]=\"16\" />\n </button>\n </li>\n }\n </ul>\n }\n </ng-template>\n\n <input\n #fileInput\n class=\"sr-only\"\n type=\"file\"\n [attr.accept]=\"accept() || null\"\n [attr.multiple]=\"multiple() ? true : null\"\n [disabled]=\"disabled()\"\n (change)=\"onNativeChange($event)\"\n />\n <input\n #cameraInput\n class=\"sr-only\"\n type=\"file\"\n accept=\"image/*\"\n capture=\"environment\"\n [disabled]=\"disabled()\"\n (change)=\"onNativeChange($event)\"\n />\n `,\n})\nexport class FileUploadComponent implements ControlValueAccessor, OnDestroy {\n private readonly destroyRef = inject(DestroyRef);\n /** Optional so the control still works when overlays are not registered. */\n private readonly modal = inject(ModalService, { optional: true });\n\n private readonly fileInput =\n viewChild<ElementRef<HTMLInputElement>>('fileInput');\n private readonly cameraInput =\n viewChild<ElementRef<HTMLInputElement>>('cameraInput');\n\n protected readonly controlId = `africanies-file-upload-${++nextFileUploadId}`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n\n protected readonly labelClass = FORM_LABEL_CLASS;\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n protected readonly chipClass =\n 'inline-flex items-center rounded-full border border-neutral-300 bg-background-welcome px-2 py-0.5 text-caption font-medium text-neutral-600 dark:border-white/20 dark:bg-white/10 dark:text-neutral-300';\n\n /** Visible field label. */\n readonly label = input('');\n\n /** Helper copy. Hidden while {@link error} is set. */\n readonly hint = input<string | undefined>(undefined);\n\n /** Field-level validation message. Distinct from `ErrorStateComponent`. */\n readonly error = input<string | null>(null);\n\n /**\n * Layout variant. Defaults to `dropzone`.\n */\n readonly variant = input<FileUploadVariant>('dropzone');\n\n /**\n * Passed to the native file input `accept` (e.g. `image/*,.pdf`).\n * Also drives accept chips and drop/picker filtering.\n */\n readonly accept = input('');\n\n /** Show the file-picker trigger. Defaults to true. */\n readonly allowFileSelect = input(true, { transform: booleanAttribute });\n\n /**\n * Show a camera trigger. Opens a live `getUserMedia` modal when\n * {@link ModalService} is available; otherwise falls back to a hidden\n * `<input type=\"file\" capture=\"environment\">`. Defaults to true.\n */\n readonly allowCamera = input(true, { transform: booleanAttribute });\n\n /** Allow selecting more than one file. Defaults to false. */\n readonly multiple = input(false, { transform: booleanAttribute });\n\n /**\n * Emitted whenever the selection changes (after object URLs are created for\n * images).\n */\n readonly filesSelected = output<FileUploadResult[]>();\n\n /** Host disable flag (in addition to CVA). */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n protected readonly results = signal<FileUploadResult[]>([]);\n protected readonly cvaDisabled = signal(false);\n protected readonly dragDepth = signal(0);\n protected readonly rejectMessage = signal<string | null>(null);\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n protected readonly dragging = computed(() => this.dragDepth() > 0);\n\n protected readonly acceptChips = computed(() => acceptLabels(this.accept()));\n\n protected readonly chooseLabel = computed(() =>\n this.multiple() ? 'Choose files' : 'Choose file',\n );\n\n protected readonly dropTitle = computed(() =>\n this.multiple()\n ? 'Drag & drop files here'\n : 'Drag & drop a file here',\n );\n\n protected readonly dropHint = computed(() =>\n this.multiple()\n ? 'or click to browse — multiple files allowed'\n : 'or click to browse — one file only',\n );\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n protected readonly panelClass = computed(() => {\n let classes =\n 'rounded-md border border-dashed border-neutral-400 bg-background-welcome p-4 transition-colors dark:border-white/20 dark:bg-white/[0.03]';\n if (this.dragging()) {\n classes +=\n ' border-ink bg-white dark:border-white dark:bg-white/10 ring-2 ring-ink/10 dark:ring-white/20';\n }\n if (this.error()) {\n classes += ' !border-danger dark:!border-danger';\n }\n if (this.disabled()) {\n classes += ' cursor-not-allowed opacity-50';\n }\n return classes;\n });\n\n protected readonly dropzoneClass = computed(() => {\n let classes =\n 'rounded-lg border-2 border-dashed border-neutral-400 bg-background-welcome px-4 py-8 transition-colors dark:border-white/20 dark:bg-white/[0.03]';\n if (!this.disabled()) {\n classes += ' cursor-pointer hover:border-neutral-600 dark:hover:border-white/40';\n }\n if (this.dragging()) {\n classes +=\n ' border-ink bg-white dark:border-white dark:bg-white/10 ring-2 ring-ink/10 dark:ring-white/20';\n }\n if (this.error()) {\n classes += ' !border-danger dark:!border-danger';\n }\n if (this.disabled()) {\n classes += ' cursor-not-allowed opacity-50';\n }\n return classes;\n });\n\n protected readonly compactClass = computed(() => {\n let classes =\n 'flex items-center gap-3 rounded-md border border-dashed border-neutral-400 bg-background-welcome px-3 py-2.5 transition-colors dark:border-white/20 dark:bg-white/[0.03]';\n if (this.dragging()) {\n classes +=\n ' border-ink bg-white dark:border-white dark:bg-white/10 ring-2 ring-ink/10 dark:ring-white/20';\n }\n if (this.error()) {\n classes += ' !border-danger dark:!border-danger';\n }\n if (this.disabled()) {\n classes += ' cursor-not-allowed opacity-50';\n }\n return classes;\n });\n\n protected readonly fileRowClass = computed(\n () =>\n 'flex items-center gap-3 rounded-md border border-border bg-white p-2 dark:border-white/15 dark:bg-white/[0.04]',\n );\n\n private onChange: (value: FileUploadResult[]) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n private rejectClearTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => this.clearRejectTimer());\n }\n\n /**\n * Revokes any outstanding image object URLs to avoid leaks when this control\n * handles many files over its lifetime.\n */\n ngOnDestroy(): void {\n this.revokeAll(this.results());\n this.clearRejectTimer();\n }\n\n /** @param value - Prior results from the form model (URLs should already exist). */\n writeValue(value: FileUploadResult[] | null): void {\n this.revokeAll(this.results());\n this.results.set(value ?? []);\n }\n\n /** @param fn - Files change callback. */\n registerOnChange(fn: (value: FileUploadResult[]) => void): void {\n this.onChange = fn;\n }\n\n /** @param fn - Touched callback. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @param isDisabled - Blocks picking when true. */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected openFilePicker(): void {\n if (this.disabled()) {\n return;\n }\n this.fileInput()?.nativeElement.click();\n }\n\n protected openCamera(): void {\n if (this.disabled()) {\n return;\n }\n\n const canUseLiveCamera =\n !!this.modal &&\n typeof navigator !== 'undefined' &&\n !!navigator.mediaDevices?.getUserMedia;\n\n if (!canUseLiveCamera || !this.modal) {\n this.cameraInput()?.nativeElement.click();\n return;\n }\n\n this.modal\n .open<void, File>(CameraCaptureDialogComponent, { dismissible: true })\n .afterClosed()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((file) => {\n if (file) {\n this.commitFiles([file]);\n }\n });\n }\n\n protected onDropzoneActivate(event: Event): void {\n if (this.disabled() || !this.allowFileSelect()) {\n return;\n }\n event.preventDefault();\n this.openFilePicker();\n }\n\n protected onDragEnter(event: DragEvent): void {\n if (this.disabled() || !this.hasFilePayload(event)) {\n return;\n }\n event.preventDefault();\n this.dragDepth.update((n) => n + 1);\n }\n\n protected onDragOver(event: DragEvent): void {\n if (this.disabled() || !this.hasFilePayload(event)) {\n return;\n }\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n }\n\n protected onDragLeave(event: DragEvent): void {\n if (this.disabled()) {\n return;\n }\n event.preventDefault();\n this.dragDepth.update((n) => Math.max(0, n - 1));\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragDepth.set(0);\n if (this.disabled()) {\n return;\n }\n const files = Array.from(event.dataTransfer?.files ?? []);\n if (!files.length) {\n return;\n }\n this.commitFiles(files);\n }\n\n protected onNativeChange(event: Event): void {\n const inputEl = event.target as HTMLInputElement;\n const files = Array.from(inputEl.files ?? []);\n inputEl.value = '';\n if (!files.length) {\n return;\n }\n this.commitFiles(files);\n }\n\n protected openPreview(item: FileUploadResult): void {\n if (this.modal) {\n this.modal.open(FilePreviewDialogComponent, {\n dismissible: true,\n data: item,\n size: 'xl',\n });\n return;\n }\n\n // Without a modal host, only images can be shown (object URL in a new tab).\n if (!item.isImage && !item.file.type.startsWith('image/')) {\n return;\n }\n\n const url = item.previewUrl ?? URL.createObjectURL(item.file);\n window.open(url, '_blank', 'noopener');\n if (!item.previewUrl) {\n window.setTimeout(() => URL.revokeObjectURL(url), 60_000);\n }\n }\n\n protected removeAt(index: number): void {\n if (this.disabled()) {\n return;\n }\n const current = this.results();\n const target = current[index];\n if (!target) {\n return;\n }\n if (target.previewUrl) {\n URL.revokeObjectURL(target.previewUrl);\n }\n const next = current.filter((_, i) => i !== index);\n this.results.set(next);\n this.filesSelected.emit(next);\n this.onChange(next);\n this.onTouched();\n }\n\n protected trackResult(item: FileUploadResult): string {\n return `${item.file.name}:${item.file.size}:${item.file.lastModified}`;\n }\n\n protected formatSize(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n protected extensionOf(file: File): string {\n return fileExtensionLabel(file.name);\n }\n\n protected nonImageIcon(file: File): IconName {\n const type = (file.type || '').toLowerCase();\n const name = file.name.toLowerCase();\n if (type === 'application/pdf' || name.endsWith('.pdf')) {\n return 'file-text';\n }\n if (\n type.includes('zip') ||\n name.endsWith('.zip') ||\n name.endsWith('.rar')\n ) {\n return 'file-zip';\n }\n if (type.startsWith('video/') || name.match(/\\.(mp4|mov|webm)$/)) {\n return 'file-movie';\n }\n if (type.startsWith('audio/') || name.match(/\\.(mp3|wav|ogg)$/)) {\n return 'file-sound';\n }\n if (\n type.includes('sheet') ||\n type.includes('excel') ||\n name.match(/\\.(xlsx|xls|csv)$/)\n ) {\n return 'file-table';\n }\n if (type.startsWith('text/') || name.match(/\\.(txt|md|csv)$/)) {\n return 'file-text-o';\n }\n if (name.match(/\\.(js|ts|json|html|css|xml)$/)) {\n return 'file-code';\n }\n return 'file';\n }\n\n protected kindLabel(file: File): string {\n const ext = fileExtensionLabel(file.name);\n if (ext) {\n return `${ext} file`;\n }\n if (file.type) {\n return file.type;\n }\n return 'File';\n }\n\n private commitFiles(files: File[]): void {\n const accept = this.accept();\n const accepted = files.filter((f) => fileMatchesAccept(f, accept));\n const rejectedCount = files.length - accepted.length;\n\n if (rejectedCount > 0) {\n const chips = acceptLabels(accept);\n const allowed = chips.length ? chips.join(', ') : 'the allowed types';\n this.showReject(\n rejectedCount === 1\n ? `1 file was skipped. Only ${allowed} allowed.`\n : `${rejectedCount} files were skipped. Only ${allowed} allowed.`,\n );\n } else {\n this.rejectMessage.set(null);\n }\n\n if (!accepted.length) {\n this.onTouched();\n return;\n }\n\n let incoming = accepted;\n if (!this.multiple()) {\n incoming = accepted.slice(0, 1);\n }\n\n const mapped = incoming.map((file) => this.toResult(file));\n const next = this.multiple() ? [...this.results(), ...mapped] : mapped;\n\n if (!this.multiple()) {\n this.revokeAll(this.results());\n }\n\n this.results.set(next);\n this.filesSelected.emit(next);\n this.onChange(next);\n this.onTouched();\n }\n\n private showReject(message: string): void {\n this.rejectMessage.set(message);\n this.clearRejectTimer();\n this.rejectClearTimer = setTimeout(() => {\n this.rejectMessage.set(null);\n this.rejectClearTimer = null;\n }, 6000);\n }\n\n private clearRejectTimer(): void {\n if (this.rejectClearTimer) {\n clearTimeout(this.rejectClearTimer);\n this.rejectClearTimer = null;\n }\n }\n\n private hasFilePayload(event: DragEvent): boolean {\n const types = event.dataTransfer?.types;\n if (!types) {\n return false;\n }\n return Array.from(types).includes('Files');\n }\n\n private toResult(file: File): FileUploadResult {\n const isImage = file.type.startsWith('image/');\n return {\n file,\n isImage,\n previewUrl: isImage ? URL.createObjectURL(file) : null,\n };\n }\n\n private revokeAll(items: FileUploadResult[]): void {\n for (const item of items) {\n if (item.previewUrl) {\n URL.revokeObjectURL(item.previewUrl);\n }\n }\n }\n}\n","/**\n * File upload form control exports.\n */\nexport {\n acceptLabels,\n fileExtensionLabel,\n fileMatchesAccept,\n} from './file-accept';\nexport {\n FileUploadComponent,\n type FileUploadResult,\n type FileUploadVariant,\n} from './file-upload.component';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport {\n FORM_AFFIX_CLASS,\n FORM_CONTROL_INNER_CLASS,\n FORM_DISABLED_CLASS,\n FORM_ERROR_CLASS,\n FORM_FIELD_CLASS,\n FORM_FIELD_ERROR_CLASS,\n FORM_HINT_CLASS,\n FORM_LABEL_CLASS,\n} from '../form-field.classes';\n\nlet nextNumberInputId = 0;\n\nconst numberFormatter = new Intl.NumberFormat('en-US');\n\n/**\n * Formats a raw field string with grouping commas while preserving a trailing\n * decimal point / partial fraction so mid-typing stays natural.\n *\n * @param raw - Whatever is currently in the input (may already contain commas).\n * @returns Display text plus a parseable number (or `null` / `undefined` when\n * the draft is not yet a complete number — `undefined` means \"do not emit\").\n */\nfunction formatWhileTyping(raw: string): {\n display: string;\n numeric: number | null | undefined;\n} {\n const trimmed = raw.trim();\n if (trimmed === '' || trimmed === '-') {\n return { display: trimmed === '-' ? '-' : '', numeric: null };\n }\n\n const negative = trimmed.startsWith('-');\n const unsigned = negative ? trimmed.slice(1) : trimmed;\n const dotIndex = unsigned.indexOf('.');\n const hasDot = dotIndex !== -1;\n const intRaw = hasDot ? unsigned.slice(0, dotIndex) : unsigned;\n const fracRaw = hasDot ? unsigned.slice(dotIndex + 1).replace(/[^\\d]/g, '') : '';\n const intDigits = intRaw.replace(/[^\\d]/g, '');\n\n // Leading \".\" → treat as \"0.\"\n const intFormatted =\n intDigits === ''\n ? hasDot\n ? '0'\n : ''\n : numberFormatter.format(Number(intDigits));\n\n let display = `${negative ? '-' : ''}${intFormatted}`;\n if (hasDot) {\n display += `.${fracRaw}`;\n }\n\n if (intDigits === '' && !hasDot) {\n return { display, numeric: null };\n }\n\n // Trailing \".\" alone is partial — keep display, skip emit until more digits.\n if (hasDot && fracRaw === '' && unsigned.endsWith('.')) {\n return { display, numeric: undefined };\n }\n\n const parsed = Number(`${negative ? '-' : ''}${intDigits || '0'}${hasDot ? `.${fracRaw}` : ''}`);\n if (Number.isNaN(parsed)) {\n return { display, numeric: undefined };\n }\n return { display, numeric: parsed };\n}\n\n/**\n * Numeric field following the shared AFRICANIES form field pattern.\n *\n * The public contract is always a plain `number | null` — comma grouping is\n * **display-only** via `Intl.NumberFormat('en-US')`, applied **as the user types**\n * (caret is restored by digit-count so commas do not jump the cursor).\n *\n * @example\n * ```html\n * <!-- Consumers always bind a number, never a formatted string -->\n * <africanies-number-input\n * label=\"Declared value\"\n * [(value)]=\"amount\"\n * >\n * <span prefix>$</span>\n * </africanies-number-input>\n * ```\n * ```ts\n * amount = signal<number | null>(1250); // UI shows \"1,250\"\n * ```\n */\n@Component({\n selector: 'africanies-number-input',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NumberInputComponent),\n multi: true,\n },\n ],\n template: `\n <label [attr.for]=\"controlId\" [class]=\"labelClass\">{{ label() }}</label>\n <div [class]=\"shellClass()\">\n <span [class]=\"affixClass\" data-slot=\"prefix\">\n <ng-content select=\"[prefix]\" />\n </span>\n <input\n #inputEl\n [id]=\"controlId\"\n type=\"text\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [class]=\"innerClass\"\n [value]=\"displayText()\"\n [disabled]=\"disabled()\"\n [attr.placeholder]=\"placeholder() || null\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n />\n <span [class]=\"affixClass\" data-slot=\"suffix\">\n <ng-content select=\"[suffix]\" />\n </span>\n </div>\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n `,\n})\nexport class NumberInputComponent implements ControlValueAccessor {\n protected readonly controlId = `africanies-number-input-${++nextNumberInputId}`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n\n protected readonly labelClass = FORM_LABEL_CLASS;\n protected readonly affixClass = FORM_AFFIX_CLASS;\n protected readonly innerClass = FORM_CONTROL_INNER_CLASS;\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('inputEl');\n\n /** Visible field label. */\n readonly label = input('');\n\n /** Helper copy. Hidden while {@link error} is set. */\n readonly hint = input<string | undefined>(undefined);\n\n /** Field-level validation message. Distinct from `ErrorStateComponent`. */\n readonly error = input<string | null>(null);\n\n /** Native placeholder when empty. */\n readonly placeholder = input('');\n\n /**\n * Plain number (or `null`). Never a comma-formatted string.\n */\n readonly value = model<number | null>(null);\n\n /** Host disable flag (in addition to CVA). */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n /**\n * WHY a separate draft: while typing we may show \"1,\" / \"1,250.\" before the\n * model can round-trip through `Intl.NumberFormat` without fighting the caret.\n */\n private readonly draftText = signal<string | null>(null);\n\n protected readonly cvaDisabled = signal(false);\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n protected readonly displayText = computed(() => {\n const draft = this.draftText();\n if (draft !== null) {\n return draft;\n }\n const v = this.value();\n if (v === null || v === undefined) {\n return '';\n }\n return numberFormatter.format(v);\n });\n\n protected readonly shellClass = computed(() => {\n let classes = FORM_FIELD_CLASS;\n if (this.error()) {\n classes += ` ${FORM_FIELD_ERROR_CLASS}`;\n }\n if (this.disabled()) {\n classes += ` ${FORM_DISABLED_CLASS}`;\n }\n return classes;\n });\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n private onChange: (value: number | null) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n /** @param value - Plain number or `null` (never a formatted string). */\n writeValue(value: number | null): void {\n this.draftText.set(null);\n this.value.set(value);\n }\n\n /** @param fn - Numeric change callback. */\n registerOnChange(fn: (value: number | null) => void): void {\n this.onChange = fn;\n }\n\n /** @param fn - Blur callback. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @param isDisabled - Blocks editing when true. */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onInput(event: Event): void {\n const el = event.target as HTMLInputElement;\n const raw = el.value;\n const caret = el.selectionStart ?? raw.length;\n const digitsBeforeCaret = countDigits(raw.slice(0, caret));\n const caretAfterDecimal =\n raw.indexOf('.') !== -1 && caret > raw.indexOf('.');\n const fracDigitsBeforeCaret = caretAfterDecimal\n ? countDigits(raw.slice(raw.indexOf('.') + 1, caret))\n : 0;\n\n const { display, numeric } = formatWhileTyping(raw);\n this.draftText.set(display);\n // Native value must be written — `[value]` does not reliably overwrite mid-input.\n el.value = display;\n\n if (numeric !== undefined) {\n this.value.set(numeric);\n this.onChange(numeric);\n }\n\n // Restore caret by digit identity so inserting commas does not jump the cursor.\n const caretPos = caretFromDigitCount(\n display,\n digitsBeforeCaret,\n caretAfterDecimal,\n fracDigitsBeforeCaret,\n );\n queueMicrotask(() => {\n const input = this.inputEl()?.nativeElement ?? el;\n input.setSelectionRange(caretPos, caretPos);\n });\n }\n\n protected onBlur(): void {\n this.draftText.set(null);\n this.onTouched();\n }\n}\n\n/**\n * @param text - Source string.\n * @returns Count of digit characters.\n */\nfunction countDigits(text: string): number {\n return (text.match(/\\d/g) ?? []).length;\n}\n\n/**\n * Maps a digit-based caret intent back onto a comma-formatted string.\n *\n * @param display - Formatted field text.\n * @param intDigitsWanted - Digits left of caret in the integer portion (or total when no decimal).\n * @param afterDecimal - Whether the caret sits in the fraction.\n * @param fracDigitsWanted - Digits left of caret in the fraction.\n * @returns Caret index into `display`.\n */\nfunction caretFromDigitCount(\n display: string,\n intDigitsWanted: number,\n afterDecimal: boolean,\n fracDigitsWanted: number,\n): number {\n const dot = display.indexOf('.');\n if (!afterDecimal || dot === -1) {\n let seen = 0;\n for (let i = 0; i < display.length; i++) {\n const ch = display[i];\n if (ch !== undefined && /\\d/.test(ch)) {\n seen++;\n if (seen >= intDigitsWanted) {\n return i + 1;\n }\n }\n }\n return dot === -1 ? display.length : dot;\n }\n\n let seen = 0;\n for (let i = dot + 1; i < display.length; i++) {\n const ch = display[i];\n if (ch !== undefined && /\\d/.test(ch)) {\n seen++;\n if (seen >= fracDigitsWanted) {\n return i + 1;\n }\n }\n }\n return display.length;\n}\n","/**\n * Number input form control exports.\n */\nexport { NumberInputComponent } from './number-input.component';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n numberAttribute,\n OnDestroy,\n output,\n signal,\n viewChildren,\n} from '@angular/core';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport { ButtonComponent } from '../../button/button.component';\nimport {\n FORM_ERROR_CLASS,\n FORM_FIELD_ERROR_CLASS,\n FORM_HINT_CLASS,\n FORM_LABEL_CLASS,\n} from '../form-field.classes';\n\nlet nextOtpId = 0;\n\n/** Visual treatment for OTP cells. */\nexport type OtpInputVariant = 'default' | 'masked';\n\n/**\n * One-time-passcode field — discrete digit cells, single string model.\n *\n * **Prefix/suffix slots are omitted** — OTP is a fixed-length code entry, not\n * a free-text field with affixes.\n *\n * Digits only (`inputmode=\"numeric\"`). Paste fills multiple cells. When the\n * value reaches {@link length}, {@link completed} emits so the host can submit.\n *\n * {@link variant} `masked` hides each digit (PIN-style). The model is still\n * the real digit string.\n *\n * Built-in **resend** row with cooldown — host listens to {@link resend} to\n * call the API; the control only manages UI + timer.\n *\n * @example\n * ```html\n * <africanies-otp-input\n * label=\"Verification code\"\n * hint=\"Enter the 6-digit code we sent\"\n * [length]=\"6\"\n * [resendCooldown]=\"60\"\n * [(value)]=\"code\"\n * (completed)=\"verify($event)\"\n * (resend)=\"sendCodeAgain()\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-otp-input',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ButtonComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OtpInputComponent),\n multi: true,\n },\n ],\n host: {\n class: 'block',\n },\n styleUrl: './otp-input.component.css',\n template: `\n <div\n role=\"group\"\n [attr.aria-labelledby]=\"label() ? labelId : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-disabled]=\"disabled() ? true : null\"\n >\n @if (label()) {\n <p [id]=\"labelId\" [class]=\"labelClass\">{{ label() }}</p>\n }\n <div\n class=\"flex flex-wrap gap-2\"\n [class.opacity-50]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n >\n @for (digit of cells(); track $index; let i = $index) {\n <input\n #cellInput\n [type]=\"cellType()\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n maxlength=\"1\"\n [class]=\"cellClass()\"\n [id]=\"i === 0 ? controlId : null\"\n [value]=\"digit\"\n [disabled]=\"disabled()\"\n [attr.autocomplete]=\"i === 0 ? 'one-time-code' : 'off'\"\n [attr.aria-label]=\"'Digit ' + (i + 1) + ' of ' + length()\"\n [attr.aria-invalid]=\"error() ? true : null\"\n (input)=\"onCellInput(i, $event)\"\n (keydown)=\"onCellKeydown(i, $event)\"\n (paste)=\"onPaste(i, $event)\"\n (focus)=\"onCellFocus(i)\"\n (blur)=\"onBlur()\"\n />\n }\n </div>\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n\n @if (showResend()) {\n <div\n class=\"mt-3 flex flex-wrap items-center gap-x-1.5 gap-y-1 text-body-sm text-neutral-600 dark:text-neutral-400\"\n >\n <span>{{ resendPrompt() }}</span>\n @if (cooldownRemaining() > 0) {\n <span class=\"tabular-nums\" aria-live=\"polite\">\n Resend in {{ cooldownRemaining() }}s\n </span>\n } @else {\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"!min-h-0 !px-1.5 !py-0.5 !text-body-sm\"\n [disabled]=\"disabled()\"\n (click)=\"onResendClick()\"\n >\n {{ resendLabel() }}\n </button>\n }\n </div>\n }\n </div>\n `,\n})\nexport class OtpInputComponent implements ControlValueAccessor, OnDestroy {\n private readonly destroyRef = inject(DestroyRef);\n private readonly cellInputs =\n viewChildren<ElementRef<HTMLInputElement>>('cellInput');\n\n protected readonly controlId = `africanies-otp-input-${++nextOtpId}`;\n protected readonly labelId = `${this.controlId}-label`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n\n protected readonly labelClass = FORM_LABEL_CLASS;\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n\n protected readonly cellClass = computed(() => {\n let classes =\n 'size-10 shrink-0 rounded-md border border-neutral-300 bg-white text-center text-body font-medium text-ink outline-none transition-colors ' +\n 'dark:border-white/25 dark:bg-ink-950 dark:text-white ' +\n 'focus:outline focus:outline-2 focus:outline-offset-2 focus:outline-ink disabled:cursor-not-allowed';\n if (this.masked()) {\n classes += ' africanies-otp-cell-masked text-body-lg';\n }\n if (this.error()) {\n classes += ` ${FORM_FIELD_ERROR_CLASS}`;\n }\n return classes;\n });\n\n protected readonly masked = computed(() => this.variant() === 'masked');\n\n protected readonly cellType = computed(() =>\n this.masked() ? 'password' : 'text',\n );\n\n /** Visible group label. */\n readonly label = input('');\n\n /** Helper copy. Hidden while {@link error} is set. */\n readonly hint = input<string | undefined>(undefined);\n\n /** Field-level validation message. */\n readonly error = input<string | null>(null);\n\n /** Number of digit cells (default 6). */\n readonly length = input(6, { transform: numberAttribute });\n\n /**\n * `masked` hides each digit (PIN-style). The bound value is still the\n * real digits.\n */\n readonly variant = input<OtpInputVariant>('default');\n\n /** Concatenated digit string (`[(value)]` + CVA). */\n readonly value = model('');\n\n /** Host disable flag (in addition to CVA). */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n /** Show the “Didn’t get a code? / Resend” row (default true). */\n readonly showResend = input(true, { transform: booleanAttribute });\n\n /** Copy before the resend action. */\n readonly resendPrompt = input(\"Didn't get a code?\");\n\n /** Label on the resend button when cooldown is idle. */\n readonly resendLabel = input('Resend');\n\n /**\n * Cooldown seconds after mount and after each resend click (default 60).\n * Set to `0` to allow resend immediately with no timer.\n */\n readonly resendCooldown = input(60, { transform: numberAttribute });\n\n /**\n * Emits the full code when every cell is filled (typing or paste).\n * Host owns submit / verify — this control does not call APIs.\n */\n readonly completed = output<string>();\n\n /**\n * Emits when the user requests another code. Host should call the resend API;\n * the control restarts the cooldown automatically.\n */\n readonly resend = output<void>();\n\n protected readonly cvaDisabled = signal(false);\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n /** Seconds left before Resend is enabled. */\n protected readonly cooldownRemaining = signal(0);\n\n /** Per-cell digits derived from {@link value}, padded to {@link length}. */\n protected readonly cells = computed(() => {\n const len = Math.max(1, Math.floor(this.length()) || 6);\n const digits = this.digitsOnly(this.value()).slice(0, len);\n return Array.from({ length: len }, (_, i) => digits[i] ?? '');\n });\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n private onChange: (value: string) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n private lastCompleted = '';\n private cooldownTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => this.clearCooldownTimer());\n // Assume the host already sent the first code — start cooldown on mount.\n queueMicrotask(() => this.startCooldown());\n }\n\n ngOnDestroy(): void {\n this.clearCooldownTimer();\n }\n\n /** @param value - Form model; non-digits stripped, truncated to length. */\n writeValue(value: string | null): void {\n this.applyValue(this.digitsOnly(value ?? ''), false);\n }\n\n /** @param fn - User change callback. */\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n /** @param fn - Blur callback. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @param isDisabled - Blocks editing when true. */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onResendClick(): void {\n if (this.disabled() || this.cooldownRemaining() > 0) {\n return;\n }\n this.resend.emit();\n this.startCooldown();\n }\n\n /**\n * Restart the cooldown from outside (e.g. after a successful resend API call\n * that the host triggered some other way). Usually unnecessary — click already\n * starts the timer.\n */\n restartCooldown(): void {\n this.startCooldown();\n }\n\n protected onCellInput(index: number, event: Event): void {\n const inputEl = event.target as HTMLInputElement;\n const raw = this.digitsOnly(inputEl.value);\n const digit = raw.slice(-1);\n inputEl.value = digit;\n\n const next = [...this.cells()];\n next[index] = digit;\n this.commitCells(next);\n\n if (digit && index < next.length - 1) {\n this.focusCell(index + 1);\n }\n }\n\n protected onCellKeydown(index: number, event: KeyboardEvent): void {\n const key = event.key;\n if (key === 'Backspace') {\n event.preventDefault();\n const next = [...this.cells()];\n if (next[index]) {\n next[index] = '';\n this.commitCells(next);\n } else if (index > 0) {\n next[index - 1] = '';\n this.commitCells(next);\n this.focusCell(index - 1);\n }\n return;\n }\n if (key === 'ArrowLeft' && index > 0) {\n event.preventDefault();\n this.focusCell(index - 1);\n return;\n }\n if (key === 'ArrowRight' && index < this.cells().length - 1) {\n event.preventDefault();\n this.focusCell(index + 1);\n return;\n }\n if (\n key.length === 1 &&\n !/[0-9]/.test(key) &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey\n ) {\n event.preventDefault();\n }\n }\n\n protected onPaste(index: number, event: ClipboardEvent): void {\n event.preventDefault();\n const pasted = this.digitsOnly(event.clipboardData?.getData('text') ?? '');\n if (!pasted) {\n return;\n }\n const next = [...this.cells()];\n let cursor = index;\n for (const ch of pasted) {\n if (cursor >= next.length) {\n break;\n }\n next[cursor] = ch;\n cursor += 1;\n }\n this.commitCells(next);\n const focusAt = Math.min(cursor, next.length - 1);\n this.focusCell(focusAt);\n }\n\n protected onCellFocus(index: number): void {\n const el = this.cellInputs()[index]?.nativeElement;\n el?.select();\n }\n\n protected onBlur(): void {\n this.onTouched();\n }\n\n private startCooldown(): void {\n const seconds = Math.max(0, Math.floor(this.resendCooldown()) || 0);\n this.clearCooldownTimer();\n if (seconds <= 0) {\n this.cooldownRemaining.set(0);\n return;\n }\n this.cooldownRemaining.set(seconds);\n this.cooldownTimer = setInterval(() => {\n const left = this.cooldownRemaining() - 1;\n if (left <= 0) {\n this.cooldownRemaining.set(0);\n this.clearCooldownTimer();\n return;\n }\n this.cooldownRemaining.set(left);\n }, 1000);\n }\n\n private clearCooldownTimer(): void {\n if (this.cooldownTimer) {\n clearInterval(this.cooldownTimer);\n this.cooldownTimer = null;\n }\n }\n\n private commitCells(cells: string[]): void {\n this.applyValue(cells.join(''), true);\n }\n\n private applyValue(digits: string, emit: boolean): void {\n const len = Math.max(1, Math.floor(this.length()) || 6);\n const next = digits.slice(0, len);\n this.value.set(next);\n if (emit) {\n this.onChange(next);\n }\n if (next.length === len && next !== this.lastCompleted) {\n this.lastCompleted = next;\n this.completed.emit(next);\n }\n if (next.length < len) {\n this.lastCompleted = '';\n }\n }\n\n private digitsOnly(value: string): string {\n return value.replace(/\\D/g, '');\n }\n\n private focusCell(index: number): void {\n queueMicrotask(() => {\n const el = this.cellInputs()[index]?.nativeElement;\n el?.focus();\n el?.select();\n });\n }\n}\n","/**\n * Radio form control exports.\n */\nexport { RadioComponent, type RadioOption } from './radio.component';\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n type ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n forwardRef,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport { of, Subject, timer } from 'rxjs';\nimport {\n catchError,\n debounce,\n distinctUntilChanged,\n switchMap,\n tap,\n} from 'rxjs/operators';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport { ChipComponent } from '../../chip/chip.component';\nimport {\n TooltipComponent,\n TooltipTriggerDirective,\n} from '../../tooltip';\nimport {\n FORM_AFFIX_CLASS,\n FORM_CONTROL_INNER_CLASS,\n FORM_DISABLED_CLASS,\n FORM_ERROR_CLASS,\n FORM_FIELD_CLASS,\n FORM_FIELD_ERROR_CLASS,\n FORM_HINT_CLASS,\n FORM_LABEL_CLASS,\n} from '../form-field.classes';\nimport type {\n SearchComboboxBadgeFn,\n SearchComboboxLabelFn,\n SearchComboboxMarkFn,\n SearchComboboxSearchFn,\n SearchComboboxSubtitleFn,\n SearchComboboxTrackFn,\n} from './search-combobox.types';\n\nlet nextSearchComboboxId = 0;\n\nconst PANEL_POSITIONS: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 4,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -4,\n },\n];\n\n/**\n * Generic type-as-you-search combobox with a debounced async lookup and\n * overlay result list.\n *\n * Pass {@link search} plus {@link optionLabel} (and optional\n * {@link optionSubtitle}) so the same control works for customers, staff,\n * partners, etc. Emits the selected entity via `[(selected)]` / CVA.\n *\n * @typeParam T - Entity type returned by {@link search} and held in\n * {@link selected}.\n *\n * @example\n * ```html\n * <africanies-search-combobox\n * label=\"Customer\"\n * [search]=\"searchCustomers\"\n * [optionLabel]=\"customerLabel\"\n * [optionSubtitle]=\"customerSubtitle\"\n * [(selected)]=\"customer\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-search-combobox',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AfricaniesIconComponent,\n ChipComponent,\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n TooltipComponent,\n TooltipTriggerDirective,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SearchComboboxComponent),\n multi: true,\n },\n ],\n host: {\n class: 'relative block',\n },\n template: `\n <label [attr.for]=\"controlId\" [class]=\"labelClass\">{{ label() }}</label>\n <div\n cdkOverlayOrigin\n #triggerOrigin=\"cdkOverlayOrigin\"\n [class]=\"shellClass()\"\n >\n <span [class]=\"affixClass\" data-slot=\"prefix\">\n <ng-content select=\"[prefix]\" />\n </span>\n <input\n [id]=\"controlId\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [class]=\"innerClass\"\n [value]=\"query()\"\n [disabled]=\"disabled()\"\n [attr.placeholder]=\"placeholder() || null\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-autocomplete]=\"'list'\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n <span [class]=\"affixClass\" data-slot=\"suffix\">\n @if (loading()) {\n <africanies-icon name=\"spinner\" [size]=\"16\" class=\"animate-spin\" />\n } @else if (selectedMark()) {\n <africanies-tooltip [text]=\"markTooltip()\" placement=\"top\">\n <span\n africaniesTooltipTrigger\n class=\"inline-flex h-5 w-5 items-center justify-center\"\n role=\"img\"\n [attr.aria-label]=\"markTooltip()\"\n >\n <africanies-icon name=\"star\" [size]=\"14\" class=\"text-[#D4AF37]\" />\n </span>\n </africanies-tooltip>\n } @else {\n <ng-content select=\"[suffix]\" />\n }\n </span>\n </div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"panelPositions\"\n [cdkConnectedOverlayWidth]=\"panelWidth()\"\n [cdkConnectedOverlayMinWidth]=\"panelWidth()\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"closePanel()\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n (detach)=\"onOverlayDetach()\"\n >\n <div\n [id]=\"listboxId\"\n class=\"africanies-overlay-scroll max-h-64 w-full overflow-auto rounded-md border border-border bg-white shadow-lg dark:border-white/15 dark:bg-ink-950\"\n role=\"listbox\"\n tabindex=\"-1\"\n >\n @if (loading()) {\n <div\n class=\"px-3 py-2 text-body-sm text-neutral-600 dark:text-neutral-400\"\n >\n Searching…\n </div>\n } @else if (searchError(); as err) {\n <div\n class=\"px-3 py-2 text-body-sm text-neutral-600 dark:text-neutral-400\"\n >\n {{ err }}\n </div>\n } @else if (options().length === 0) {\n <div\n class=\"px-3 py-2 text-body-sm text-neutral-600 dark:text-neutral-400\"\n >\n {{ emptyMessage() }}\n </div>\n } @else {\n @for (item of options(); track trackKey(item); let i = $index) {\n <button\n type=\"button\"\n [id]=\"optionId(i)\"\n role=\"option\"\n class=\"flex w-full cursor-pointer flex-col gap-0.5 px-3 py-2 text-left text-body text-ink outline-none hover:bg-background-welcome focus-visible:bg-background-welcome dark:text-white dark:hover:bg-white/5 dark:focus-visible:bg-white/5\"\n [class.bg-background-welcome]=\"activeIndex() === i\"\n [class.dark:bg-white/5]=\"activeIndex() === i\"\n [attr.aria-selected]=\"activeIndex() === i\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"selectItem(item)\"\n (mouseenter)=\"activeIndex.set(i)\"\n >\n <div class=\"flex min-w-0 items-center justify-between gap-2\">\n <div class=\"flex min-w-0 items-center gap-1.5\">\n @if (markFor(item)) {\n <africanies-icon\n name=\"star\"\n [size]=\"14\"\n class=\"shrink-0 text-[#D4AF37]\"\n [title]=\"markTooltip()\"\n />\n }\n <span class=\"min-w-0 truncate font-medium\">\n {{ optionLabel()(item) }}\n </span>\n </div>\n @if (badgeFor(item); as badge) {\n <africanies-chip\n class=\"shrink-0\"\n [variant]=\"badge.variant ?? 'neutral'\"\n [icon]=\"badge.icon\"\n >\n {{ badge.label }}\n </africanies-chip>\n }\n </div>\n @if (subtitleFor(item); as subtitle) {\n <span\n class=\"min-w-0 truncate text-caption text-neutral-600 dark:text-neutral-400\"\n >\n {{ subtitle }}\n </span>\n }\n </button>\n }\n }\n </div>\n </ng-template>\n\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n `,\n})\nexport class SearchComboboxComponent<T> implements ControlValueAccessor {\n private readonly destroyRef = inject(DestroyRef);\n\n protected readonly controlId = `africanies-search-combobox-${++nextSearchComboboxId}`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n protected readonly listboxId = `${this.controlId}-listbox`;\n\n protected readonly labelClass = FORM_LABEL_CLASS;\n protected readonly affixClass = FORM_AFFIX_CLASS;\n protected readonly innerClass = FORM_CONTROL_INNER_CLASS;\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n protected readonly panelPositions = PANEL_POSITIONS;\n protected readonly minPanelWidth = 224;\n\n private readonly triggerOrigin = viewChild(CdkOverlayOrigin);\n private readonly querySubject = new Subject<string>();\n private onChange: (value: T | null) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n /** Visible field label. */\n readonly label = input('');\n\n /** Helper copy under the field. Hidden while {@link error} is set. */\n readonly hint = input<string | undefined>(undefined);\n\n /** Field-level validation message. */\n readonly error = input<string | null>(null);\n\n readonly placeholder = input('');\n\n /** Debounce before calling {@link search} (ms). Default 500. */\n readonly debounceMs = input(500, { transform: numberAttribute });\n\n /** Minimum trimmed query length before search runs. Default 2. */\n readonly minQueryLength = input(2, { transform: numberAttribute });\n\n readonly emptyMessage = input('No matches');\n\n /** Async lookup — parent owns HTTP / filtering. */\n readonly search = input.required<SearchComboboxSearchFn<T>>();\n\n readonly optionLabel = input.required<SearchComboboxLabelFn<T>>();\n\n readonly optionSubtitle = input<SearchComboboxSubtitleFn<T> | undefined>(\n undefined,\n );\n\n readonly optionBadge = input<SearchComboboxBadgeFn<T> | undefined>(\n undefined,\n );\n\n readonly optionMark = input<SearchComboboxMarkFn<T> | undefined>(undefined);\n\n readonly markTooltip = input('Professional Business Plan');\n\n readonly trackBy = input<SearchComboboxTrackFn<T>>(\n (item: T) => this.optionLabel()(item),\n );\n\n readonly selected = model<T | null>(null);\n\n readonly queryChange = output<string>();\n\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n protected readonly cvaDisabled = signal(false);\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n protected readonly query = signal('');\n protected readonly open = signal(false);\n protected readonly loading = signal(false);\n protected readonly options = signal<T[]>([]);\n protected readonly searchError = signal<string | null>(null);\n protected readonly activeIndex = signal(-1);\n protected readonly panelWidth = signal(this.minPanelWidth);\n\n protected readonly shellClass = computed(() => {\n let classes = FORM_FIELD_CLASS;\n if (this.error()) {\n classes += ` ${FORM_FIELD_ERROR_CLASS}`;\n }\n if (this.disabled()) {\n classes += ` ${FORM_DISABLED_CLASS}`;\n }\n return classes;\n });\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n protected readonly activeOptionId = computed(() => {\n const index = this.activeIndex();\n if (index < 0 || !this.open()) {\n return null;\n }\n return this.optionId(index);\n });\n\n protected readonly selectedMark = computed(() => {\n const sel = this.selected();\n const fn = this.optionMark();\n return !!sel && !!fn && fn(sel);\n });\n\n constructor() {\n effect(() => {\n const sel = this.selected();\n const labelFn = this.optionLabel();\n if (sel) {\n this.query.set(labelFn(sel));\n }\n });\n\n this.querySubject\n .pipe(\n debounce(() => timer(Math.max(0, Number(this.debounceMs()) || 0))),\n distinctUntilChanged(),\n switchMap((text) => {\n const trimmed = text.trim();\n const min = Math.max(0, Number(this.minQueryLength()) || 0);\n if (trimmed.length < min) {\n this.options.set([]);\n this.searchError.set(null);\n this.loading.set(false);\n this.open.set(false);\n return of([] as T[]);\n }\n this.loading.set(true);\n this.open.set(true);\n return this.search()(trimmed).pipe(\n tap(() => this.searchError.set(null)),\n catchError((err) => {\n this.searchError.set(\n err instanceof Error\n ? err.message\n : 'Could not load results.',\n );\n return of([] as T[]);\n }),\n );\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((results) => {\n this.loading.set(false);\n this.options.set(results);\n this.activeIndex.set(results.length ? 0 : -1);\n if (this.query().trim().length > 0) {\n this.open.set(true);\n }\n });\n }\n\n writeValue(value: T | null): void {\n this.selected.set(value);\n this.query.set(value ? this.optionLabel()(value) : '');\n }\n\n registerOnChange(fn: (value: T | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n /** Clear selection and query text. */\n clear(): void {\n this.query.set('');\n this.commit(null);\n this.options.set([]);\n this.open.set(false);\n }\n\n protected trackKey(item: T): string | number {\n return this.trackBy()(item);\n }\n\n protected subtitleFor(item: T): string | undefined {\n const fn = this.optionSubtitle();\n return fn ? fn(item)?.trim() || undefined : undefined;\n }\n\n protected badgeFor(item: T) {\n const fn = this.optionBadge();\n return fn ? fn(item) ?? undefined : undefined;\n }\n\n protected markFor(item: T): boolean {\n const fn = this.optionMark();\n return fn ? fn(item) : false;\n }\n\n protected optionId(index: number): string {\n return `${this.controlId}-option-${index}`;\n }\n\n protected onInput(event: Event): void {\n const next = (event.target as HTMLInputElement).value;\n this.query.set(next);\n this.queryChange.emit(next);\n\n if (this.selected() !== null) {\n this.commit(null);\n }\n\n this.syncPanelWidth();\n this.querySubject.next(next);\n }\n\n protected onFocus(): void {\n this.syncPanelWidth();\n if (this.query().trim() && this.options().length) {\n this.open.set(true);\n }\n }\n\n protected onBlur(): void {\n this.onTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (\n !this.open() &&\n (event.key === 'ArrowDown' || event.key === 'ArrowUp')\n ) {\n if (this.options().length) {\n this.open.set(true);\n event.preventDefault();\n }\n return;\n }\n\n if (!this.open()) {\n if (event.key === 'Escape') {\n (event.target as HTMLInputElement).blur();\n }\n return;\n }\n\n const count = this.options().length;\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n if (!count) {\n return;\n }\n this.activeIndex.set((this.activeIndex() + 1) % count);\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (!count) {\n return;\n }\n this.activeIndex.set((this.activeIndex() - 1 + count) % count);\n break;\n }\n case 'Enter': {\n event.preventDefault();\n const item = this.options()[this.activeIndex()];\n if (item) {\n this.selectItem(item);\n }\n break;\n }\n case 'Escape': {\n event.preventDefault();\n this.closePanel();\n break;\n }\n default:\n break;\n }\n }\n\n protected selectItem(item: T): void {\n this.query.set(this.optionLabel()(item));\n this.commit(item);\n this.closePanel();\n }\n\n protected closePanel(): void {\n this.open.set(false);\n this.activeIndex.set(-1);\n }\n\n protected onOutsideClick(event: MouseEvent): void {\n const origin = this.triggerOrigin()?.elementRef.nativeElement as\n | HTMLElement\n | undefined;\n if (origin?.contains(event.target as Node)) {\n return;\n }\n this.closePanel();\n }\n\n protected onOverlayDetach(): void {\n this.open.set(false);\n }\n\n private commit(item: T | null): void {\n this.selected.set(item);\n this.onChange(item);\n }\n\n private syncPanelWidth(): void {\n const origin = this.triggerOrigin()?.elementRef.nativeElement as\n | HTMLElement\n | undefined;\n const width = origin?.getBoundingClientRect().width ?? this.minPanelWidth;\n this.panelWidth.set(Math.max(this.minPanelWidth, Math.round(width)));\n }\n}\n","/**\n * Select form control exports.\n */\nexport { SelectComponent } from './select.component';\nexport type { SelectCreateConfig, SelectOption, SelectSize } from './select.types';\n","/**\n * Text input form control exports.\n */\nexport { TextInputComponent, type TextInputType } from './text-input.component';\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n numberAttribute,\n signal,\n} from '@angular/core';\nimport {\n type ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n} from '@angular/forms';\n\nimport {\n FORM_AFFIX_CLASS,\n FORM_CONTROL_INNER_CLASS,\n FORM_DISABLED_CLASS,\n FORM_ERROR_CLASS,\n FORM_FIELD_CLASS,\n FORM_FIELD_ERROR_CLASS,\n FORM_HINT_CLASS,\n FORM_LABEL_CLASS,\n} from '../form-field.classes';\n\nlet nextTextareaId = 0;\n\n/**\n * Multi-line text field following the shared form-control pattern\n * (`shared AFRICANIES form field pattern`). Supports prefix/suffix slots,\n * field-level `error`, and {@link ControlValueAccessor}.\n *\n * @example\n * ```html\n * <africanies-textarea\n * label=\"Notes\"\n * hint=\"Visible to the warehouse\"\n * [rows]=\"4\"\n * [(value)]=\"notes\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-textarea',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TextareaComponent),\n multi: true,\n },\n ],\n template: `\n <label [attr.for]=\"controlId\" [class]=\"labelClass\">{{ label() }}</label>\n <div [class]=\"shellClass()\">\n <span [class]=\"affixClass\" data-slot=\"prefix\">\n <ng-content select=\"[prefix]\" />\n </span>\n <textarea\n [id]=\"controlId\"\n [class]=\"innerClass\"\n [rows]=\"rows()\"\n [value]=\"value()\"\n [disabled]=\"disabled()\"\n [attr.placeholder]=\"placeholder() || null\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n ></textarea>\n <span [class]=\"affixClass\" data-slot=\"suffix\">\n <ng-content select=\"[suffix]\" />\n </span>\n </div>\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n `,\n})\nexport class TextareaComponent implements ControlValueAccessor {\n protected readonly controlId = `africanies-textarea-${++nextTextareaId}`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n\n protected readonly labelClass = FORM_LABEL_CLASS;\n protected readonly affixClass = FORM_AFFIX_CLASS;\n protected readonly innerClass = `${FORM_CONTROL_INNER_CLASS} resize-y min-h-20 h-auto py-2`;\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n\n /** Visible field label. */\n readonly label = input('');\n\n /**\n * Helper copy under the field. Hidden while {@link error} is set.\n */\n readonly hint = input<string | undefined>(undefined);\n\n /**\n * Field-level validation message. Distinct from `ErrorStateComponent`.\n */\n readonly error = input<string | null>(null);\n\n /** Native placeholder. */\n readonly placeholder = input('');\n\n /** Visible row count for the native textarea. */\n readonly rows = input(3, { transform: numberAttribute });\n\n /** Current text (`[(value)]` + CVA). */\n readonly value = model<string>('');\n\n /** Host disable flag (in addition to CVA). */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n protected readonly cvaDisabled = signal(false);\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n\n protected readonly shellClass = computed(() => {\n let classes = `${FORM_FIELD_CLASS} !h-auto min-h-10 items-stretch`;\n if (this.error()) {\n classes += ` ${FORM_FIELD_ERROR_CLASS}`;\n }\n if (this.disabled()) {\n classes += ` ${FORM_DISABLED_CLASS}`;\n }\n return classes;\n });\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n private onChange: (value: string) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n /** @param value - Form model; `null` becomes `''`. */\n writeValue(value: string | null): void {\n this.value.set(value ?? '');\n }\n\n /** @param fn - User edit callback. */\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n /** @param fn - Blur callback. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @param isDisabled - Blocks editing when true. */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected onInput(event: Event): void {\n const next = (event.target as HTMLTextAreaElement).value;\n this.value.set(next);\n this.onChange(next);\n }\n\n protected onBlur(): void {\n this.onTouched();\n }\n}\n","/**\n * Textarea form control exports.\n */\nexport { TextareaComponent } from './textarea.component';\n","import { NgClass } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport { FORM_ERROR_CLASS, FORM_HINT_CLASS } from '../form-field.classes';\n\nlet nextToggleId = 0;\n\n/**\n * Boolean switch following the shared AFRICANIES form field pattern.\n *\n * **Prefix/suffix slots are omitted** — a toggle is a binary control; affix\n * projection does not apply.\n *\n * On-state fill follows {@link ModeColorService} (SFN green / STN orange).\n *\n * The thumb follows {@link value} (or the CVA model). A click emits the next\n * boolean and does not flip locally — so `[(value)]` stays instant while\n * one-way `[value]` + `(valueChange)` waits for the parent to commit. Bind\n * {@link loading} for API-backed switches: the control stays on the last\n * committed value, shows a spinner, and ignores further clicks.\n *\n * @example\n * ```html\n * <africanies-toggle label=\"Notify on arrival\" [(value)]=\"notify\" />\n *\n * <africanies-toggle\n * label=\"Active\"\n * [value]=\"row.active\"\n * [loading]=\"savingId() === row.id\"\n * (valueChange)=\"saveActive(row, $event)\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-toggle',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, NgClass],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ToggleComponent),\n multi: true,\n },\n ],\n template: `\n <div class=\"flex flex-col gap-1.5\">\n <label\n [attr.for]=\"controlId\"\n class=\"inline-flex items-center gap-3 text-body text-ink dark:text-white\"\n [class.opacity-50]=\"disabled() && !loading()\"\n [class.cursor-pointer]=\"!inactive()\"\n [class.cursor-not-allowed]=\"disabled() && !loading()\"\n [class.cursor-wait]=\"loading()\"\n >\n <button\n [id]=\"controlId\"\n type=\"button\"\n role=\"switch\"\n class=\"relative inline-flex h-5 w-9 shrink-0 items-center rounded-full border border-border p-0.5 box-border transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink dark:border-white/15\"\n [ngClass]=\"trackClass()\"\n [attr.aria-checked]=\"on()\"\n [attr.aria-busy]=\"loading() ? true : null\"\n [attr.aria-invalid]=\"error() ? true : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [disabled]=\"inactive()\"\n (click)=\"toggle()\"\n (blur)=\"onBlur()\"\n >\n <span\n class=\"pointer-events-none relative block size-3.5 shrink-0 rounded-full bg-white shadow transition-transform duration-200 ease-out\"\n [ngClass]=\"on() ? 'translate-x-4' : 'translate-x-0'\"\n >\n @if (loading()) {\n <africanies-icon\n name=\"spinner\"\n [size]=\"12\"\n class=\"absolute inset-0 m-auto animate-spin text-ink\"\n aria-hidden=\"true\"\n />\n }\n </span>\n </button>\n <span class=\"text-body leading-5\">{{ label() }}</span>\n </label>\n @if (error(); as err) {\n <p [id]=\"errorId\" [class]=\"errorClass\" role=\"alert\">{{ err }}</p>\n } @else if (hint(); as h) {\n <p [id]=\"hintId\" [class]=\"hintClass\">{{ h }}</p>\n }\n </div>\n `,\n})\nexport class ToggleComponent implements ControlValueAccessor {\n private readonly modeColor = inject(ModeColorService);\n\n protected readonly controlId = `africanies-toggle-${++nextToggleId}`;\n protected readonly hintId = `${this.controlId}-hint`;\n protected readonly errorId = `${this.controlId}-error`;\n\n protected readonly hintClass = FORM_HINT_CLASS;\n protected readonly errorClass = FORM_ERROR_CLASS;\n\n /** Visible label beside the switch. */\n readonly label = input('');\n\n /** Helper copy. Hidden while {@link error} is set. */\n readonly hint = input<string | undefined>(undefined);\n\n /** Field-level validation message. Distinct from `ErrorStateComponent`. */\n readonly error = input<string | null>(null);\n\n /** On/off state (`[(value)]` + CVA). */\n readonly value = input(false);\n\n /** Emitted with the intended next state. The thumb flips when {@link value} changes. */\n readonly valueChange = output<boolean>();\n\n /**\n * In-flight mutation. Keeps the last committed {@link value}, shows a\n * spinner on the thumb, and treats the switch as non-interactive.\n *\n * Plain boolean (no `booleanAttribute`): `[loading]=\"saving()\"` bindings\n * must pass through `true` without attribute-string coercion.\n */\n readonly loading = input(false);\n\n /** Host disable flag (in addition to CVA). */\n readonly disabledInput = input(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n\n protected readonly cvaDisabled = signal(false);\n /**\n * Form-attached value. `undefined` until {@link writeValue} runs so\n * template `[value]` stays the source of truth outside reactive forms.\n */\n private readonly cvaValue = signal<boolean | undefined>(undefined);\n\n protected readonly disabled = computed(\n () => this.disabledInput() || this.cvaDisabled(),\n );\n protected readonly inactive = computed(\n () => this.disabled() || this.loading(),\n );\n protected readonly on = computed(() => {\n const fromCva = this.cvaValue();\n return fromCva !== undefined ? fromCva : this.value();\n });\n\n /** On → mode primary fill; off → neutral track. */\n protected readonly trackClass = computed(() =>\n this.on()\n ? this.modeColor.classes().bg\n : 'bg-neutral-300 dark:bg-neutral-600',\n );\n\n protected readonly describedBy = computed(() => {\n if (this.error()) {\n return this.errorId;\n }\n if (this.hint()) {\n return this.hintId;\n }\n return null;\n });\n\n private onChange: (value: boolean) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n /** @param value - Form model; non-boolean coerces via `!!`. */\n writeValue(value: boolean | null): void {\n this.cvaValue.set(!!value);\n }\n\n /** @param fn - User toggle callback. */\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n /** @param fn - Blur callback. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @param isDisabled - Blocks interaction when true. */\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n protected toggle(): void {\n if (this.inactive()) {\n return;\n }\n const next = !this.on();\n this.onChange(next);\n this.valueChange.emit(next);\n // Forms do not writeValue back after onChange — keep the thumb in sync.\n if (this.cvaValue() !== undefined) {\n this.cvaValue.set(next);\n }\n }\n\n protected onBlur(): void {\n this.onTouched();\n }\n}\n","/**\n * Toggle form control exports.\n */\nexport { ToggleComponent } from './toggle.component';\n","/**\n * Form control barrel for `@africanies/africanies-ui`.\n *\n * Shared AFRICANIES form field pattern (label, hint, error, ControlValueAccessor).\n */\n\nexport {\n type AddressComponent,\n AddressInputComponent,\n type AddressPlace,\n type AddressPrediction,\n GOOGLE_PLACES_CONFIG,\n type GooglePlacesConfig,\n GooglePlacesService,\n provideGooglePlaces,\n} from './address-input';\nexport { CheckboxComponent } from './checkbox';\nexport { DatePickerComponent } from './date-picker';\nexport {\n acceptLabels,\n fileExtensionLabel,\n fileMatchesAccept,\n FileUploadComponent,\n type FileUploadResult,\n type FileUploadVariant,\n} from './file-upload';\nexport { NumberInputComponent } from './number-input';\nexport { OtpInputComponent, type OtpInputVariant } from './otp-input';\nexport { RadioComponent, type RadioOption } from './radio';\nexport {\n type SearchComboboxBadge,\n type SearchComboboxBadgeFn,\n SearchComboboxComponent,\n type SearchComboboxLabelFn,\n type SearchComboboxMarkFn,\n type SearchComboboxSearchFn,\n type SearchComboboxSubtitleFn,\n type SearchComboboxTrackFn,\n} from './search-combobox';\nexport {\n SelectComponent,\n type SelectCreateConfig,\n type SelectOption,\n type SelectSize,\n} from './select';\nexport { TextInputComponent, type TextInputType } from './text-input';\nexport { TextareaComponent } from './textarea';\nexport { ToggleComponent } from './toggle';\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport type { AfricaniesNavItem } from '../nav-item';\n\n/**\n * Breadcrumb trail for hierarchical navigation.\n *\n * Items may set {@link AfricaniesNavItem.routerLink} so crumbs navigate via the\n * consumer’s Angular Router. The **last** item is always the current page\n * (`aria-current=\"page\"`) and is not interactive.\n *\n * @example\n * ```html\n * <!-- Router-aware -->\n * <africanies-breadcrumb [items]=\"[\n * { id: 'home', label: 'Home', routerLink: '/overview' },\n * { id: 'shipments', label: 'Shipments', routerLink: '/shipments' },\n * { id: 'detail', label: 'SFN-1001' }\n * ]\" />\n *\n * <!-- Static labels only -->\n * <africanies-breadcrumb [items]=\"staticCrumbs\" />\n * ```\n */\n@Component({\n selector: 'africanies-breadcrumb',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, RouterLink, NgClass],\n template: `\n <nav aria-label=\"Breadcrumb\" class=\"text-body-sm\">\n <ol class=\"m-0 flex list-none flex-wrap items-center gap-1 p-0\">\n @for (item of items(); track item.id; let last = $last; let i = $index) {\n <li class=\"inline-flex items-center gap-1 min-w-0\">\n @if (i > 0) {\n <africanies-icon\n name=\"angle-right\"\n [size]=\"12\"\n class=\"shrink-0 text-neutral-400\"\n aria-hidden=\"true\"\n />\n }\n @if (last) {\n <span\n class=\"truncate font-medium text-ink dark:text-white\"\n aria-current=\"page\"\n >\n @if (item.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"14\" class=\"mr-1 inline-block align-text-bottom\" />\n }\n {{ item.label }}\n </span>\n } @else if (item.routerLink !== null && item.routerLink !== undefined && !item.disabled) {\n <a\n class=\"inline-flex cursor-pointer items-center gap-1 truncate transition-colors hover:underline\"\n [ngClass]=\"modeColor.classes().text\"\n [routerLink]=\"item.routerLink\"\n [queryParams]=\"item.queryParams\"\n [fragment]=\"item.fragment\"\n >\n @if (item.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"14\" class=\"shrink-0\" />\n }\n {{ item.label }}\n </a>\n } @else {\n <span\n class=\"truncate\"\n [ngClass]=\"\n item.breadcrumbMuted === false\n ? 'text-ink dark:text-white'\n : 'text-neutral-600 dark:text-neutral-400'\n \"\n [class.opacity-50]=\"item.disabled\"\n >\n @if (item.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"14\" class=\"mr-1 inline-block align-text-bottom\" />\n }\n {{ item.label }}\n </span>\n }\n </li>\n }\n </ol>\n </nav>\n `,\n})\nexport class BreadcrumbComponent {\n protected readonly modeColor = inject(ModeColorService);\n\n /** Ordered crumbs; the last entry is the current page. */\n readonly items = input.required<AfricaniesNavItem[]>();\n}\n","import type { ActivatedRouteSnapshot } from '@angular/router';\n\nimport type { AfricaniesNavItem } from './nav-item';\nimport type { AfricaniesSideNavItem } from './side-nav';\n\n/** Router target for the app-shell header back control. */\nexport interface HeaderBackTarget {\n routerLink: string | readonly unknown[];\n queryParams?: Record<string, unknown>;\n fragment?: string;\n}\n\n/** Back target for the app-shell content chrome. */\nexport type ContentBackTarget = HeaderBackTarget;\n\n/**\n * Resolve the parent route for the header Back button.\n *\n * Walks breadcrumbs from the current page toward root and uses the nearest\n * ancestor with a `routerLink`, unless {@link backLink} is set explicitly.\n *\n * @param breadcrumbs - Trail with the current page last.\n * @param backLink - Optional explicit destination.\n * @returns Parent router target, or `null` when there is none.\n */\nexport function resolveHeaderBackTarget(\n breadcrumbs: AfricaniesNavItem[],\n backLink?: string | readonly unknown[] | null,\n): HeaderBackTarget | null {\n if (backLink != null) {\n return { routerLink: backLink };\n }\n\n for (let index = breadcrumbs.length - 2; index >= 0; index -= 1) {\n const candidate = breadcrumbs[index];\n if (candidate.routerLink == null || candidate.disabled) {\n continue;\n }\n return {\n routerLink: candidate.routerLink,\n queryParams: candidate.queryParams,\n fragment: candidate.fragment,\n };\n }\n\n return null;\n}\n\n/**\n * Resolve the content-area Back control.\n *\n * Back is shown only when the activated route has a real parent (so a pasted\n * deep link like `/components/navigation/documents` still returns to\n * `/components/navigation`). Catalog pages with no parent route never get Back.\n *\n * When a side-nav item maps the parent to an overview URL, that link is\n * preferred so the redirect hop is skipped. Query params on the current URL\n * (list `page` / filters) are forwarded so Back restores the parent list.\n *\n * @param parentPath - Parent URL from the activated route tree.\n * @param currentUrl - Current router URL.\n * @param catalogRootLink - Optional side-nav root link for the parent.\n * @param backLink - Optional explicit destination.\n * @returns Back router target, or `null` when Back should stay hidden.\n */\nexport function resolveContentBackTarget(\n parentPath: string | null,\n currentUrl: string,\n catalogRootLink?: string | null,\n backLink?: string | readonly unknown[] | null,\n): ContentBackTarget | null {\n if (backLink != null) {\n return { routerLink: backLink };\n }\n\n if (!parentPath) {\n return null;\n }\n\n const current = normalizePath(currentUrl);\n const parent = normalizePath(parentPath);\n const catalog = catalogRootLink ? normalizePath(catalogRootLink) : '';\n\n const target =\n catalog && catalog !== parent && catalog.startsWith(`${parent}/`)\n ? catalog\n : parent;\n\n if (!target || target === current) {\n return null;\n }\n\n const queryParams = queryParamsFromUrl(currentUrl);\n return queryParams\n ? { routerLink: target, queryParams }\n : { routerLink: target };\n}\n\n/**\n * Parent URL of the deepest activated route, or `null` when the leaf sits at\n * the app root (no parent route).\n *\n * Derived from the route tree, so it works after reload or a pasted URL.\n *\n * @param root - Router state root snapshot.\n * @returns Parent path, or `null` at the app root.\n */\nexport function resolveParentPathFromRootSnapshot(\n root: ActivatedRouteSnapshot,\n): string | null {\n const levels: string[][] = [];\n let node: ActivatedRouteSnapshot | null = root;\n while (node) {\n levels.push(node.url.map((segment) => segment.path));\n node = node.firstChild;\n }\n\n return resolveParentPathFromLevels(levels);\n}\n\n/**\n * Parent path from route-tree URL levels (root first, leaf last).\n *\n * Empty-path nodes (the app root, nameless wrappers) are skipped.\n *\n * @param levels - URL segments per route node, root first.\n * @returns Parent path, or `null` when the leaf has no parent route.\n */\nexport function resolveParentPathFromLevels(\n levels: readonly (readonly string[])[],\n): string | null {\n if (levels.length < 2) {\n return null;\n }\n\n const current = joinRouteLevels(levels);\n for (let index = levels.length - 2; index >= 0; index -= 1) {\n const parent = joinRouteLevels(levels.slice(0, index + 1));\n if (parent !== '/' && parent !== current) {\n return parent;\n }\n }\n\n return null;\n}\n\nfunction joinRouteLevels(levels: readonly (readonly string[])[]): string {\n const segments = levels.flat().filter(Boolean);\n return segments.length ? `/${segments.join('/')}` : '/';\n}\n\n/**\n * Parse `?a=1&b=2` from a router URL into a query map.\n *\n * @param url - Router URL, possibly with query or hash.\n * @returns Query record, or `undefined` when none.\n */\nfunction queryParamsFromUrl(url: string): Record<string, string> | undefined {\n const query = url.split('#')[0]?.split('?')[1];\n if (!query) {\n return undefined;\n }\n const params = new URLSearchParams(query);\n const record: Record<string, string> = {};\n params.forEach((value, key) => {\n record[key] = value;\n });\n return Object.keys(record).length ? record : undefined;\n}\n\n/**\n * Normalizes a router URL to a comparable path (no query, hash, or trailing slash).\n *\n * @param url - Router URL, possibly with query or hash.\n * @returns Path without query, hash, or trailing slash.\n */\nexport function normalizeNavPath(url: string): string {\n return normalizePath(url);\n}\n\n/**\n * True when the URL is deeper than the matched side-nav item's root link.\n *\n * @param url - Current router URL.\n * @param navItems - Side-nav catalog.\n * @returns Whether the URL is a nested child of a catalog item.\n */\nexport function isNestedChildRoute(\n url: string,\n navItems: AfricaniesSideNavItem[],\n): boolean {\n const path = normalizePath(url);\n const match = findSideNavMatch(path, navItems);\n if (!match) {\n return false;\n }\n\n const itemLink = normalizePath(asStringLink(match.item.routerLink));\n return path !== itemLink && path.startsWith(match.basePath);\n}\n\n/**\n * True when the URL matches a side-nav catalog link (or home).\n *\n * @param url - Current router URL.\n * @param navItems - Side-nav catalog.\n * @returns Whether the URL is a catalog root route.\n */\nexport function isCatalogRootRoute(\n url: string,\n navItems: AfricaniesSideNavItem[],\n): boolean {\n const path = normalizePath(url);\n if (isAppRoot(path, navItems)) {\n return true;\n }\n\n const match = findSideNavMatch(path, navItems);\n if (!match) {\n return false;\n }\n\n return normalizePath(asStringLink(match.item.routerLink)) === path;\n}\n\n/**\n * Side-nav root link for a URL under a catalog item.\n *\n * @param url - Current router URL.\n * @param navItems - Side-nav catalog.\n * @returns Catalog item `routerLink`, or `null` when unmatched.\n */\nexport function resolveCatalogRootLink(\n url: string,\n navItems: AfricaniesSideNavItem[],\n): string | null {\n const match = findSideNavMatch(normalizePath(url), navItems);\n if (!match) {\n return null;\n }\n\n const link = asStringLink(match.item.routerLink);\n return link || null;\n}\n\n/**\n * Side-nav item that owns the current URL — longest catalog prefix match.\n *\n * Matches nested child routes on cold load (same rules as\n * {@link buildBreadcrumbsFromSideNav}), e.g. App Settings stays active on\n * `/settings/app/shipment-methods/...`.\n *\n * @param url - Current router URL.\n * @param navItems - Side-nav catalog.\n * @returns Matched leaf item, or `null` when the URL is outside the catalog.\n */\nexport function resolveActiveSideNavItem(\n url: string,\n navItems: AfricaniesSideNavItem[],\n): AfricaniesSideNavItem | null {\n return findSideNavMatch(normalizePath(url), navItems)?.item ?? null;\n}\n\n/**\n * Build a breadcrumb trail from the current URL and a side-nav catalog.\n *\n * Supports nested child routes under a matched nav item (e.g.\n * `/components/navigation/documents` under Navigation).\n *\n * @param url - Current router URL.\n * @param navItems - Side-nav catalog.\n * @returns Breadcrumb trail with the current page last.\n */\nexport function buildBreadcrumbsFromSideNav(\n url: string,\n navItems: AfricaniesSideNavItem[],\n): AfricaniesNavItem[] {\n const path = normalizePath(url);\n const homeLink = resolveHomeRouterLink(navItems);\n const crumbs: AfricaniesNavItem[] = [\n { id: 'home', label: 'Home', routerLink: homeLink, icon: 'home' },\n ];\n\n if (isAppRoot(path, navItems)) {\n crumbs.push({ id: 'overview', label: 'Overview' });\n return crumbs;\n }\n\n const match = findSideNavMatch(path, navItems);\n if (!match) {\n appendPathSegments(crumbs, path, '');\n return finalizeLeaf(crumbs, path);\n }\n\n if (match.group) {\n crumbs.push({\n id: match.group.id,\n label: match.group.label,\n icon: match.group.icon,\n });\n }\n\n const itemLink = asStringLink(match.item.routerLink);\n crumbs.push({\n id: match.item.id,\n label: match.item.label,\n routerLink: itemLink,\n });\n\n if (path !== itemLink) {\n appendPathSegments(crumbs, path, match.basePath);\n }\n\n return finalizeLeaf(crumbs, path);\n}\n\nfunction normalizePath(url: string): string {\n const path = url.split('?')[0]?.split('#')[0] ?? '/';\n if (path === '/') {\n return '/';\n }\n return path.replace(/\\/+$/, '');\n}\n\nfunction resolveHomeRouterLink(navItems: AfricaniesSideNavItem[]): string {\n for (const item of navItems) {\n const link = asStringLink(item.routerLink);\n if (link) {\n return link;\n }\n }\n\n return '/overview';\n}\n\nfunction isAppRoot(path: string, navItems: AfricaniesSideNavItem[]): boolean {\n if (path === '/') {\n return true;\n }\n\n return path === normalizePath(resolveHomeRouterLink(navItems));\n}\n\nfunction asStringLink(link: string | readonly unknown[] | undefined): string {\n return typeof link === 'string' ? link : '';\n}\n\nfunction routeBase(link: string): string {\n return link.replace(/\\/overview$/, '').replace(/\\/+$/, '') || link;\n}\n\nfunction findSideNavMatch(path: string, navItems: AfricaniesSideNavItem[]) {\n let best:\n | {\n group?: Pick<AfricaniesSideNavItem, 'id' | 'label' | 'icon'>;\n item: AfricaniesSideNavItem;\n basePath: string;\n }\n | null = null;\n\n for (const node of navItems) {\n if (node.children?.length) {\n for (const child of node.children) {\n const link = asStringLink(child.routerLink);\n if (!link) {\n continue;\n }\n const basePath = routeBase(link);\n if (!path.startsWith(basePath)) {\n continue;\n }\n if (!best || basePath.length > best.basePath.length) {\n best = {\n group: { id: node.id, label: node.label, icon: node.icon },\n item: child,\n basePath,\n };\n }\n }\n continue;\n }\n\n const link = asStringLink(node.routerLink);\n if (!link) {\n continue;\n }\n const basePath = routeBase(link);\n if (!path.startsWith(basePath)) {\n continue;\n }\n if (!best || basePath.length > best.basePath.length) {\n best = { item: node, basePath };\n }\n }\n\n return best;\n}\n\nfunction appendPathSegments(\n crumbs: AfricaniesNavItem[],\n path: string,\n basePath: string,\n): void {\n const remainder = basePath ? path.slice(basePath.length) : path;\n const segments = remainder.split('/').filter(Boolean);\n if (!segments.length) {\n return;\n }\n\n let acc = basePath;\n for (const segment of segments) {\n acc = `${acc}/${segment}`;\n crumbs.push({\n id: `segment-${segment}`,\n label: titleCaseSegment(segment),\n routerLink: acc,\n });\n }\n}\n\nfunction titleCaseSegment(segment: string): string {\n return segment\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n\nfunction finalizeLeaf(crumbs: AfricaniesNavItem[], path: string): AfricaniesNavItem[] {\n if (crumbs.length < 2) {\n return crumbs;\n }\n\n const last = crumbs[crumbs.length - 1];\n const lastLink = asStringLink(last.routerLink);\n if (lastLink && normalizePath(lastLink) === path) {\n crumbs[crumbs.length - 1] = {\n id: last.id,\n label: last.label,\n icon: last.icon,\n };\n }\n\n return crumbs;\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n type IsActiveMatchOptions,\n NavigationEnd,\n Router,\n} from '@angular/router';\n\nimport { filter, map, startWith } from 'rxjs';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport type { AfricaniesNavItem } from '../nav-item';\nimport { isNavItemActive } from '../nav-router.util';\nimport {\n isModifiedClick,\n navigateNavItem,\n navItemHref,\n} from '../navigate-nav-item';\n\nconst DEFAULT_LINK_ACTIVE: IsActiveMatchOptions = {\n paths: 'exact',\n queryParams: 'exact',\n fragment: 'ignored',\n matrixParams: 'ignored',\n};\n\n/**\n * Compact segmented control for view modes and filters.\n *\n * ## Router mode (URL is source of truth)\n *\n * Set `routerLink` (and optional `queryParams`) on items. The selected pill\n * follows `Router.isActive` — including **cold loads**. Defaults to exact\n * path + query matching (sibling routes / density query params).\n *\n * Routed segments navigate with `{ scroll: 'manual' }` by default so the page\n * does not jump to the top. Pass `[keepScroll]=\"false\"` to use the app’s\n * normal router scroll behaviour.\n *\n * ## Local mode\n *\n * Omit `routerLink` and bind `[(activeId)]`.\n *\n * @example\n * ```html\n * <africanies-segment [items]=\"[\n * { id: 'list', label: 'List', routerLink: '/shipments', queryParams: { view: 'list' } },\n * { id: 'map', label: 'Map', routerLink: '/shipments', queryParams: { view: 'map' } }\n * ]\" />\n * ```\n */\n@Component({\n selector: 'africanies-segment',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent],\n template: `\n <div\n class=\"inline-flex max-w-full flex-wrap gap-1 rounded-lg bg-background-welcome p-1 dark:bg-ink-950\"\n role=\"group\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n @for (item of items(); track item.id) {\n @if (item.routerLink !== null && item.routerLink !== undefined) {\n <a\n [class]=\"\n segmentChrome() +\n ' ' +\n (isItemActive(item) ? selectedClass() : idleClass())\n \"\n [class.cursor-pointer]=\"!item.disabled\"\n [class.cursor-not-allowed]=\"item.disabled\"\n [class.opacity-50]=\"item.disabled\"\n [attr.href]=\"item.disabled ? null : hrefFor(item)\"\n [attr.aria-current]=\"isItemActive(item) ? 'true' : null\"\n [attr.aria-disabled]=\"item.disabled ? true : null\"\n (click)=\"onRoutedClick($event, item)\"\n >\n @if (item.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"14\" class=\"shrink-0\" />\n }\n {{ item.label }}\n </a>\n } @else {\n <button\n type=\"button\"\n [class]=\"\n segmentChrome() +\n ' ' +\n (isItemActive(item) ? selectedClass() : idleClass())\n \"\n [disabled]=\"!!item.disabled\"\n [class.cursor-pointer]=\"!item.disabled\"\n [class.cursor-not-allowed]=\"item.disabled\"\n [attr.aria-pressed]=\"isItemActive(item)\"\n (click)=\"selectLocal(item)\"\n >\n @if (item.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"14\" class=\"shrink-0\" />\n }\n {{ item.label }}\n </button>\n }\n }\n </div>\n `,\n})\nexport class SegmentComponent {\n private readonly router = inject(Router);\n protected readonly modeColor = inject(ModeColorService);\n\n /** Segment options. */\n readonly items = input.required<AfricaniesNavItem[]>();\n\n /**\n * Selected id. For routed items this is **synced from the Router**\n * (including cold URL loads). For local items, bind `[(activeId)]`.\n */\n readonly activeId = model<string | null>(null);\n\n /** Accessible name for the group. */\n readonly ariaLabel = input('Segments');\n\n /**\n * Match options for routed items. Defaults to exact path + query params.\n */\n readonly linkActiveOptions =\n input<IsActiveMatchOptions>(DEFAULT_LINK_ACTIVE);\n\n /**\n * Keep the viewport where it is when a routed segment navigates (default).\n * Uses Angular’s `{ scroll: 'manual' }` so app-wide scroll restoration does\n * not jump to the top. Set false to use normal router scrolling.\n */\n readonly keepScroll = input(true, { transform: booleanAttribute });\n\n private readonly url = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map(() => this.router.url),\n startWith(this.router.url),\n ),\n { initialValue: this.router.url },\n );\n\n protected readonly segmentChrome = computed(\n () =>\n 'inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-body-sm transition-colors duration-150 no-underline',\n );\n\n protected readonly selectedClass = computed(() => {\n const colors = this.modeColor.classes();\n return `${colors.soft} ${colors.text} shadow-sm font-semibold`;\n });\n\n protected readonly idleClass = computed(\n () =>\n 'font-medium text-neutral-600 hover:text-ink dark:text-neutral-400 dark:hover:text-white',\n );\n\n constructor() {\n effect(() => {\n this.url();\n const options = this.linkActiveOptions();\n const routed = this.items().filter((i) => i.routerLink != null);\n if (routed.length === 0) {\n return;\n }\n const match = routed.find((i) =>\n isNavItemActive(this.router, i, options),\n );\n if (match && this.activeId() !== match.id) {\n this.activeId.set(match.id);\n }\n });\n }\n\n protected hrefFor(item: AfricaniesNavItem): string | null {\n return navItemHref(this.router, item);\n }\n\n protected isItemActive(item: AfricaniesNavItem): boolean {\n if (item.routerLink != null) {\n this.url();\n return isNavItemActive(this.router, item, this.linkActiveOptions());\n }\n return this.activeId() === item.id;\n }\n\n protected selectLocal(item: AfricaniesNavItem): void {\n if (item.disabled || item.routerLink != null) {\n return;\n }\n this.activeId.set(item.id);\n }\n\n /**\n * Primary click navigates in-app without scrolling to top. Modified clicks\n * keep the native link behaviour for new tabs.\n * @param event\n * @param item\n */\n protected onRoutedClick(event: MouseEvent, item: AfricaniesNavItem): void {\n if (item.disabled) {\n event.preventDefault();\n return;\n }\n if (isModifiedClick(event)) {\n return;\n }\n event.preventDefault();\n void navigateNavItem(this.router, item, this.keepScroll());\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\n\nimport { ShippingModeService } from '@africanies/africanies-core';\nimport type { ShippingMode } from '@africanies/africanies-models';\n\n/**\n * Shared globe + plane glyph for STN / SFN. STN paints it rotated 180°.\n *\n * WHY inline (not the icon sprite): unique viewBox and a product-specific\n * mark, not a 24×24 kit icon.\n */\nconst SHIPPING_MODE_GLYPH = `M88.42,68.75a48.8,48.8,0,0,1-4.74,11.1h9.89a7.67,7.67,0,0,0,1.35.65h0a7,7,0,0,0,6.68-1l2.72-1.85a53.3,53.3,0,0,1-4.25,7.66,50.16,50.16,0,0,1-13.6,13.59,52,52,0,0,1-8.6,4.67,49.29,49.29,0,0,1-9.57,3,52.37,52.37,0,0,1-20.27,0,49,49,0,0,1-9.41-2.91l-.16-.06a52.41,52.41,0,0,1-8.6-4.67,49.81,49.81,0,0,1-7.46-6.14c-1-1-1.94-2-2.85-3.1a48.57,48.57,0,0,1,4.54-3.46q1.13,1.31,2.34,2.52h0a43.34,43.34,0,0,0,6.59,5.43,47.51,47.51,0,0,0,7.69,4.16l.13.06a42.89,42.89,0,0,0,8.3,2.55c.71.14,1.44.27,2.17.37a90.25,90.25,0,0,1-16-17.24h-8c3-1.9,6.34-3.75,9.65-5.49.25.43.51.85.78,1.27H56V69.62l1.4-.59a6.73,6.73,0,0,0,3,2.93v7.89H78.57c4.34-6.81,6.68-13.67,7-20.57l2.88,9.47ZM51.35,52.45c.68-2.17,2.57-3.91,5.31-5.67L47.3,35.84c-.63-.55-.47-1,.12-1.39l3.11-1.33a1.82,1.82,0,0,1,1.51.19l13.59,6.85,16-9.25L59.51,3.41c-.57-.63-.49-1.12.4-1.44l5-2L98.15,21.46l12-5.83c4.57-2,8.51-2.32,11-.83a2.9,2.9,0,0,1,1.78,3c.05,3-2.46,6.24-6.89,9l-12.47,4.86-1,39.53-4.46,3c-.77.55-1.22.35-1.42-.48L86.37,40l-16.64,8L67.73,63A1.85,1.85,0,0,1,67,64.38L64.17,66.2c-.65.26-1.11.14-1.2-.69l-3.76-13.9c-3,1.28-5.52,1.86-7.7,1.18-.2-.06-.22-.15-.16-.34Zm-4.2-6.93c-13.22,7-30.9,18.37-37.4,25C-11.51,92.41,5.08,109.47,29.92,102c-7.78-1.15-13.87-2.72-17.25-4.94-14.43-9.48,32-29.94,42.86-34.42l-.85-3.15a13.18,13.18,0,0,1-5.07-.53L49,58.69a6.05,6.05,0,0,1-3.55-3.51l-.13-.35a6.08,6.08,0,0,1-.07-4.26,13.1,13.1,0,0,1,2.41-4.47l-.49-.58ZM8,63.11A53.31,53.31,0,0,1,7.66,57a51.43,51.43,0,0,1,1-10.14,48.27,48.27,0,0,1,2.9-9.41l.06-.15a53.32,53.32,0,0,1,4.68-8.61,49.17,49.17,0,0,1,6.13-7.45,49.81,49.81,0,0,1,7.46-6.14,52.41,52.41,0,0,1,8.6-4.67,49.51,49.51,0,0,1,9.57-3,51.5,51.5,0,0,1,5.87-.82,9.24,9.24,0,0,0,.74,1l5.72,7.13V29.86H70.61l-5.19,3L56,28.12V14.71A104.13,104.13,0,0,0,41.56,29.86h1.33a6.85,6.85,0,0,0-2.17,3.5,5.42,5.42,0,0,0-.17.8l0,.09H38.48A51.72,51.72,0,0,0,32.74,46c-1.81,1.09-3.63,2.2-5.43,3.34a50.67,50.67,0,0,1,6-15.13H19.54a48.92,48.92,0,0,0-2.67,5.32l-.06.13A42.11,42.11,0,0,0,14.26,48a44.76,44.76,0,0,0-.82,6.82H19a130.39,130.39,0,0,0-11,8.3Zm77.51-3.9H74.7l.59-4.4h8.9l1.33,4.4ZM81,84.07a90.83,90.83,0,0,1-16,17.25c.73-.11,1.45-.24,2.17-.38a43.49,43.49,0,0,0,8.42-2.61,47.09,47.09,0,0,0,7.69-4.16,43.34,43.34,0,0,0,6.59-5.43h0A42.75,42.75,0,0,0,94,84.07ZM60.38,99.5A93.83,93.83,0,0,0,75.62,84.07H60.38V99.5ZM56,84.07H40.75A94.23,94.23,0,0,0,56,99.5V84.07ZM36.16,29.86A100.58,100.58,0,0,1,51.72,12.65c-.86.12-1.71.26-2.55.43a42,42,0,0,0-8.43,2.61,47.51,47.51,0,0,0-7.69,4.16,43.34,43.34,0,0,0-6.59,5.43h0a43.24,43.24,0,0,0-4,4.57Z`;\n\n/**\n * Two-up shipping mode switcher for app-shell side navs.\n *\n * Reads / writes {@link ShippingModeService}. Selected **to Nigeria** uses\n * import orange; **from Nigeria** uses export green. Both tiles keep equal\n * chrome so unselected does not look like floating text.\n *\n * Project into `<africanies-side-nav>` with the `footer` attribute.\n *\n * @example\n * ```html\n * <africanies-side-nav [items]=\"nav\" [(collapsed)]=\"collapsed\">\n * <africanies-shipping-mode-switch footer [collapsed]=\"collapsed()\" />\n * </africanies-side-nav>\n * ```\n */\n@Component({\n selector: 'africanies-shipping-mode-switch',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClass()',\n },\n template: `\n @if (!collapsed()) {\n <p\n class=\"m-0 mb-2 px-1 text-caption font-semibold uppercase tracking-wide text-neutral-600 dark:text-neutral-400\"\n >\n Shipping mode\n </p>\n }\n <div\n class=\"grid gap-1.5\"\n [class.grid-cols-1]=\"collapsed()\"\n [class.grid-cols-2]=\"!collapsed()\"\n role=\"radiogroup\"\n aria-label=\"Shipping mode\"\n >\n <button\n type=\"button\"\n role=\"radio\"\n [attr.aria-checked]=\"mode() === 'stn'\"\n aria-label=\"Shipping to Nigeria\"\n [class]=\"cardClass('stn')\"\n (click)=\"select('stn')\"\n >\n <svg\n viewBox=\"0 0 122.88 107.54\"\n class=\"h-6 w-6 shrink-0 rotate-180\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path [attr.d]=\"glyphPath()\" fill=\"currentColor\" />\n </svg>\n @if (!collapsed()) {\n <span class=\"flex flex-col leading-tight\">\n <span>Shipping</span>\n <span>to Nigeria</span>\n </span>\n }\n </button>\n <button\n type=\"button\"\n role=\"radio\"\n [attr.aria-checked]=\"mode() === 'sfn'\"\n aria-label=\"Shipping from Nigeria\"\n [class]=\"cardClass('sfn')\"\n (click)=\"select('sfn')\"\n >\n <svg\n viewBox=\"0 0 122.88 107.54\"\n class=\"h-6 w-6 shrink-0\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path [attr.d]=\"glyphPath()\" fill=\"currentColor\" />\n </svg>\n @if (!collapsed()) {\n <span class=\"flex flex-col leading-tight\">\n <span>Shipping</span>\n <span>from Nigeria</span>\n </span>\n }\n </button>\n </div>\n `,\n})\nexport class ShippingModeSwitchComponent {\n private readonly shipping = inject(ShippingModeService);\n\n /**\n * Path data for the shared shipping-mode glyph.\n *\n * Kept as a method so ng-packagr does not inline the long SVG path into\n * the public `.d.ts` (that broke language-service parsing of this module).\n *\n * @returns SVG path `d` attribute.\n */\n protected glyphPath(): string {\n return SHIPPING_MODE_GLYPH;\n }\n\n /**\n * Icon-only stacked tiles when the side nav rail is collapsed.\n */\n readonly collapsed = input(false, { transform: booleanAttribute });\n\n /** Active mode from {@link ShippingModeService}. */\n protected readonly mode = this.shipping.mode;\n\n /** Host padding / divider — tighter when the rail is collapsed. */\n protected readonly hostClass = computed(() =>\n this.collapsed()\n ? 'block shrink-0 border-t border-border px-1.5 py-3 dark:border-white/10'\n : 'block shrink-0 border-t border-border px-2 py-3 dark:border-white/10',\n );\n\n /**\n * Requests a mode change through {@link ShippingModeService.requestModeChange}\n * so feature guards (e.g. Create Shipment confirm) can run first.\n *\n * @param next - `'stn'` (to Nigeria) or `'sfn'` (from Nigeria).\n */\n protected select(next: ShippingMode): void {\n this.shipping.requestModeChange(next).subscribe();\n }\n\n /**\n * Equal card chrome. Selected uses that mode’s own color so direction\n * stays visible independently of the active theme accent.\n *\n * Class names are full literals so Tailwind keeps them.\n *\n * @param option - Tile being rendered.\n * @returns Host classes for the radio card.\n */\n protected cardClass(option: ShippingMode): string {\n const selected = this.mode() === option;\n const compact = this.collapsed();\n const base =\n 'flex w-full cursor-pointer flex-col items-center justify-center gap-1 rounded-lg border text-center text-caption font-medium transition-colors ' +\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ' +\n (compact ? 'min-h-9 px-1 py-1.5' : 'min-h-[4.5rem] px-1.5 py-2');\n const idle =\n 'border-border bg-white text-ink hover:bg-background-welcome dark:border-white/15 dark:bg-ink-950 dark:text-white dark:hover:bg-white/10';\n\n if (option === 'stn') {\n return selected\n ? `${base} border-import bg-import text-white`\n : `${base} ${idle}`;\n }\n return selected\n ? `${base} border-export bg-export text-white`\n : `${base} ${idle}`;\n }\n}\n","/**\n * Side-nav shipping mode switcher (`africanies-shipping-mode-switch`).\n */\nexport { ShippingModeSwitchComponent } from './shipping-mode-switch.component';\n","import { InjectionToken } from '@angular/core';\n\n/**\n * URL of the full Africanies wordmark served from the package assets folder.\n *\n * Map `node_modules/@africanies/africanies-ui/assets/brand/africanies-logo.png` into your\n * app assets (see package README) or override this token.\n *\n * Default is root-absolute (`/assets/…`) so Angular property bindings and\n * `fetch()` do not resolve against the current route (e.g. `/login`).\n */\nexport const AFRICANIES_BRAND_LOGO_URL = new InjectionToken<string>(\n 'AFRICANIES_BRAND_LOGO_URL',\n {\n providedIn: 'root',\n factory: () => '/assets/africanies-ui/brand/africanies-logo.png',\n },\n);\n\n/**\n * Compact globe mark for collapsed rails and other tight placements.\n *\n * Map `node_modules/@africanies/africanies-ui/assets/brand/africanies-logo-mini.png` into\n * your app assets or override this token. Default is root-absolute (`/assets/…`)\n * for the same route-resolution reason as {@link AFRICANIES_BRAND_LOGO_URL}.\n */\nexport const AFRICANIES_BRAND_LOGO_MINI_URL = new InjectionToken<string>(\n 'AFRICANIES_BRAND_LOGO_MINI_URL',\n {\n providedIn: 'root',\n factory: () => '/assets/africanies-ui/brand/africanies-logo-mini.png',\n },\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\n\n/**\n *\n */\nexport type BrandLogoSize = 'sm' | 'md' | 'lg';\n\n/**\n * Default AFRICANIES wordmark — inlined so it works without copying static assets.\n *\n * Override with a custom `logoSrc` on {@link SideNavComponent} when the host\n * ships its own mark.\n */\n@Component({\n selector: 'africanies-brand-logo',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'inline-flex shrink-0 items-center',\n role: 'img',\n 'aria-label': 'Africanies',\n },\n template: `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 88 24\"\n [class]=\"svgClass()\"\n aria-hidden=\"true\"\n >\n <rect\n x=\"0\"\n y=\"2\"\n width=\"20\"\n height=\"20\"\n rx=\"5\"\n class=\"fill-export\"\n />\n <path\n d=\"M6.2 16.5 10 7.5h1.6l3.8 9h-1.9l-.8-2H8.9l-.8 2H6.2Zm2.5-3.6h2.6l-1.3-3.4-1.3 3.4Z\"\n class=\"fill-white\"\n />\n <text\n x=\"26\"\n y=\"17\"\n font-family=\"system-ui, -apple-system, sans-serif\"\n font-size=\"15\"\n font-weight=\"700\"\n class=\"fill-ink dark:fill-white\"\n >\n Africanies\n </text>\n </svg>\n `,\n})\nexport class BrandLogoComponent {\n readonly size = input<BrandLogoSize>('md');\n\n protected readonly svgClass = computed(() => {\n switch (this.size()) {\n case 'sm':\n return 'h-5 w-auto';\n case 'lg':\n return 'h-8 w-auto';\n default:\n return 'h-6 w-auto';\n }\n });\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n type IsActiveMatchOptions,\n NavigationEnd,\n Router,\n RouterLink,\n} from '@angular/router';\n\nimport { filter, map, startWith } from 'rxjs';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport { AFRICANIES_BRAND_LOGO_MINI_URL, AFRICANIES_BRAND_LOGO_URL } from '../../brand';\nimport { resolveActiveSideNavItem } from '../header-back.util';\nimport { navItemUrlTree } from '../nav-router.util';\nimport type { AfricaniesSideNavItem } from './side-nav-item';\n\nconst DEFAULT_LINK_ACTIVE: IsActiveMatchOptions = {\n paths: 'subset',\n queryParams: 'subset',\n fragment: 'ignored',\n matrixParams: 'ignored',\n};\n\n/**\n * App shell side navigation with icons, nested items, and a collapsible rail.\n *\n * **Design - ink spine:** a continuous mode-accent edge with soft active\n * highlights. Collapsed mode keeps icons; hover opens a floating label blade\n * (name + children) instead of a plain tooltip.\n *\n * ## Parent items with children\n * **Expanded rail:** branches start open by default (`expandBranchesByDefault`).\n * Clicking a parent only opens/closes the branch (no route change). When any\n * branch is open, a collapse-all control sits above the list (top right).\n * **Collapsed rail:** clicking a parent expands the rail, opens the\n * branch, and activates the first enabled child (router or `activeId`).\n *\n * ## Router mode\n * Set `routerLink` on items. Active state follows the consumer's Router\n * (including cold loads).\n *\n * ## Local mode\n * Omit `routerLink` and bind `[(activeId)]`.\n *\n * @example\n * ```html\n * <africanies-side-nav\n * [items]=\"nav\"\n * [(collapsed)]=\"collapsed\"\n * [(activeId)]=\"activeId\"\n * ariaLabel=\"Main\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-side-nav',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, RouterLink, NgTemplateOutlet],\n host: {\n class: 'relative z-20 block h-full',\n },\n styleUrl: './africanies-side-nav.component.css',\n templateUrl: './africanies-side-nav.component.html',\n})\nexport class SideNavComponent {\n protected readonly modeColor = inject(ModeColorService);\n private readonly defaultLogoUrl = inject(AFRICANIES_BRAND_LOGO_URL);\n private readonly defaultLogoMiniUrl = inject(AFRICANIES_BRAND_LOGO_MINI_URL);\n private readonly router = inject(Router);\n\n /** Navigation tree. */\n readonly items = input.required<AfricaniesSideNavItem[]>();\n\n /** When true, the rail collapses to icons only. Two-way bindable. */\n readonly collapsed = model(false);\n\n /**\n * Active item id for local (non-routed) trees. Synced from the router when\n * items use `routerLink`.\n */\n readonly activeId = model<string | null>(null);\n\n /** Accessible label for the `<aside>`. */\n readonly ariaLabel = input('Side navigation');\n\n /**\n * When true (default), nested branches expand when a descendant is active or\n * when the parent row is clicked.\n */\n readonly expandParents = input(true, { transform: booleanAttribute });\n\n /**\n * When true (default), every parent with children starts expanded on first\n * render. Users can still collapse branches manually.\n */\n readonly expandBranchesByDefault = input(true, {\n transform: booleanAttribute,\n });\n\n /**\n * Reserved for API compatibility. Active highlighting uses longest-prefix\n * catalog matching ({@link resolveActiveSideNavItem}), same as breadcrumbs.\n */\n readonly linkActiveOptions = input<IsActiveMatchOptions>(\n DEFAULT_LINK_ACTIVE,\n );\n\n /** When true (default), show the packaged Africanies logo in the brand row. */\n readonly showLogo = input(true, { transform: booleanAttribute });\n\n /** Optional custom full wordmark URL (expanded rail). */\n readonly logoSrc = input<string | null>(null);\n\n /** Optional custom compact mark URL (collapsed rail). Defaults to mini logo. */\n readonly logoMiniSrc = input<string | null>(null);\n\n protected readonly resolvedFullLogo = computed(\n () => this.logoSrc() ?? this.defaultLogoUrl,\n );\n\n protected readonly resolvedMiniLogo = computed(\n () => this.logoMiniSrc() ?? this.defaultLogoMiniUrl,\n );\n\n private readonly openBranches = signal<ReadonlySet<string>>(new Set());\n protected readonly hoverId = signal<string | null>(null);\n\n protected readonly hasOpenBranches = computed(\n () => this.openBranches().size > 0,\n );\n\n /** Longest-prefix catalog match for the current URL (incl. nested child routes). */\n protected readonly matchedRoutedItem = computed(() =>\n resolveActiveSideNavItem(this.url(), this.items()),\n );\n\n /** Ensures default-expanded seeding runs once per mount (after items arrive). */\n private branchesSeeded = false;\n\n private readonly url = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map(() => this.router.url),\n startWith(this.router.url),\n ),\n { initialValue: this.router.url },\n );\n\n constructor() {\n effect(() => {\n const parents = this.collectParentIds(this.items());\n if (\n !this.expandBranchesByDefault() ||\n this.branchesSeeded ||\n parents.length === 0\n ) {\n return;\n }\n this.openBranches.set(new Set(parents));\n this.branchesSeeded = true;\n });\n\n effect(() => {\n const id = this.activeId();\n if (id) {\n this.ensureAncestorsOpen(id);\n }\n });\n\n effect(() => {\n const match = this.matchedRoutedItem();\n if (match && this.activeId() !== match.id) {\n this.activeId.set(match.id);\n }\n });\n }\n\n protected toggleCollapsed(): void {\n this.collapsed.update((v) => !v);\n this.hoverId.set(null);\n }\n\n /** Fold every parent branch on the expanded rail. */\n protected collapseAllBranches(): void {\n this.openBranches.set(new Set());\n }\n\n protected onItemEnter(id: string): void {\n if (this.collapsed()) {\n this.hoverId.set(id);\n }\n }\n\n protected onItemLeave(id: string): void {\n if (this.hoverId() === id) {\n this.hoverId.set(null);\n }\n }\n\n protected isBranchOpen(id: string): boolean {\n return this.openBranches().has(id);\n }\n\n /**\n * Exact active leaf (or local id match) - not parent-of-active.\n * @param item - Side nav entry to test.\n * @returns Whether this leaf matches the current route or `activeId`.\n */\n protected isLeafActive(item: AfricaniesSideNavItem): boolean {\n if (item.routerLink != null) {\n return this.matchedRoutedItem()?.id === item.id;\n }\n return this.activeId() === item.id;\n }\n\n protected isItemActive(item: AfricaniesSideNavItem): boolean {\n if (this.isLeafActive(item)) {\n return true;\n }\n return (item.children ?? []).some((c) => this.isItemActive(c));\n }\n\n protected rowClass(item: AfricaniesSideNavItem): string {\n const base =\n 'group relative flex w-full items-center gap-2 rounded-lg text-body-sm no-underline transition-colors ' +\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ' +\n (this.collapsed() ? 'justify-center px-1.5 py-2' : 'px-3 py-2') +\n (item.disabled ? ' cursor-not-allowed opacity-50' : ' cursor-pointer');\n\n const leaf = this.isLeafActive(item);\n const ancestor = !leaf && this.isItemActive(item);\n\n if (leaf) {\n return `${base} ${this.modeColor.classes().soft} ${this.modeColor.classes().text} font-semibold`;\n }\n if (ancestor) {\n return `${base} ${this.modeColor.classes().soft} ${this.modeColor.classes().text} font-semibold`;\n }\n return (\n `${base} font-medium text-neutral-600 hover:bg-background-welcome hover:text-ink ` +\n 'dark:text-neutral-400 dark:hover:bg-white/10 dark:hover:text-white'\n );\n }\n\n protected childRowClass(item: AfricaniesSideNavItem): string {\n const base =\n 'relative flex w-full items-center gap-2 rounded-lg px-3 py-1.5 text-body-sm no-underline transition-colors ' +\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink ' +\n (item.disabled ? 'cursor-not-allowed opacity-50 ' : 'cursor-pointer ');\n\n if (this.isLeafActive(item)) {\n return `${base} ${this.modeColor.classes().soft} ${this.modeColor.classes().text} font-semibold`;\n }\n return (\n `${base} font-medium text-neutral-600 hover:bg-background-welcome hover:text-ink ` +\n 'dark:text-neutral-400 dark:hover:bg-white/10 dark:hover:text-white'\n );\n }\n\n /**\n * @param item - Clicked entry.\n * @param event - Click event.\n */\n protected onActivate(item: AfricaniesSideNavItem, event: Event): void {\n if (item.disabled) {\n event.preventDefault();\n return;\n }\n\n const children = item.children ?? [];\n const hasChildren = children.length > 0;\n\n if (hasChildren) {\n this.onParentActivate(item, children, event);\n return;\n }\n\n if (item.routerLink == null) {\n this.activeId.set(item.id);\n }\n\n if (this.collapsed()) {\n this.hoverId.set(null);\n }\n }\n\n /**\n * Toggle the branch when expanded; when collapsed, expand the rail and\n * activate the index child.\n * @param item - Parent entry with children.\n * @param children - Non-empty child list.\n * @param event - Click event.\n */\n private onParentActivate(\n item: AfricaniesSideNavItem,\n children: AfricaniesSideNavItem[],\n event: Event,\n ): void {\n const wasCollapsed = this.collapsed();\n const wasOpen = this.isBranchOpen(item.id);\n\n // Expanded rail -> accordion only (never route to the index child).\n if (!wasCollapsed) {\n if (item.routerLink != null) {\n event.preventDefault();\n }\n if (!this.expandParents()) {\n return;\n }\n this.openBranches.update((set) => {\n const next = new Set(set);\n if (wasOpen) {\n next.delete(item.id);\n } else {\n next.add(item.id);\n }\n return next;\n });\n return;\n }\n\n // Collapsed rail -> expand, open branch, select first enabled child.\n this.collapsed.set(false);\n this.hoverId.set(null);\n\n if (this.expandParents()) {\n this.openBranches.update((set) => {\n const next = new Set(set);\n next.add(item.id);\n return next;\n });\n }\n\n const indexChild = children.find((child) => !child.disabled);\n if (!indexChild) {\n return;\n }\n\n if (item.routerLink != null) {\n event.preventDefault();\n }\n this.activateLeaf(indexChild);\n }\n\n /**\n * Selects a leaf via router or local `activeId`.\n * @param item - Enabled leaf to activate.\n */\n private activateLeaf(item: AfricaniesSideNavItem): void {\n if (item.routerLink != null) {\n const tree = navItemUrlTree(this.router, item);\n if (tree) {\n void this.router.navigateByUrl(tree);\n }\n return;\n }\n this.activeId.set(item.id);\n }\n\n private flatten(items: AfricaniesSideNavItem[]): AfricaniesSideNavItem[] {\n const out: AfricaniesSideNavItem[] = [];\n for (const item of items) {\n out.push(item);\n if (item.children?.length) {\n out.push(...this.flatten(item.children));\n }\n }\n return out;\n }\n\n /**\n * Ids of every node that has nested children (any depth).\n *\n * @param items - Side-nav nodes to walk.\n * @returns Parent item ids, including nested groups.\n */\n private collectParentIds(items: AfricaniesSideNavItem[]): string[] {\n const ids: string[] = [];\n for (const item of items) {\n if (item.children?.length) {\n ids.push(item.id);\n ids.push(...this.collectParentIds(item.children));\n }\n }\n return ids;\n }\n\n private ensureAncestorsOpen(activeId: string): void {\n const path = this.findPath(this.items(), activeId);\n if (!path || path.length < 2) {\n return;\n }\n this.openBranches.update((set) => {\n const next = new Set(set);\n for (const id of path.slice(0, -1)) {\n next.add(id);\n }\n return next;\n });\n }\n\n private findPath(\n items: AfricaniesSideNavItem[],\n id: string,\n trail: string[] = [],\n ): string[] | null {\n for (const item of items) {\n const next = [...trail, item.id];\n if (item.id === id) {\n return next;\n }\n if (item.children?.length) {\n const found = this.findPath(item.children, id, next);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n}\n"," <aside\n class=\"relative flex h-full flex-col overflow-visible border-r border-border bg-white transition-[width] duration-200 ease-out dark:border-white/10 dark:bg-ink\"\n [style.width]=\"collapsed() ? '3.75rem' : '15rem'\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <div\n class=\"pointer-events-none absolute inset-y-0 left-0 w-[3px] transition-colors\"\n [class]=\"modeColor.classes().bg\"\n aria-hidden=\"true\"\n ></div>\n\n <div\n class=\"flex shrink-0 items-center gap-2 border-b border-border py-3 dark:border-white/10\"\n [class.flex-col]=\"collapsed()\"\n [class.px-3]=\"collapsed()\"\n [class.pl-4]=\"!collapsed()\"\n [class.pr-2]=\"!collapsed()\"\n >\n @if (collapsed()) {\n @if (showLogo()) {\n <img\n [src]=\"resolvedMiniLogo()\"\n alt=\"African Import Export Solutions\"\n class=\"size-8 shrink-0 object-contain\"\n />\n }\n } @else {\n @if (showLogo()) {\n <div class=\"min-w-0 flex-1\">\n <img\n [src]=\"resolvedFullLogo()\"\n alt=\"African Import Export Solutions\"\n class=\"h-9 max-w-full object-contain object-left\"\n />\n </div>\n } @else {\n <div\n class=\"min-w-0 flex-1 truncate text-body-sm font-semibold text-ink dark:text-white\"\n >\n <ng-content select=\"[brand]\" />\n </div>\n }\n }\n <button\n type=\"button\"\n class=\"inline-flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-md text-neutral-600 transition-colors hover:bg-background-welcome hover:text-ink focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink dark:text-neutral-400 dark:hover:bg-white/10 dark:hover:text-white\"\n [attr.aria-label]=\"\n collapsed() ? 'Expand navigation' : 'Collapse navigation'\n \"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"toggleCollapsed()\"\n >\n <africanies-icon\n [name]=\"collapsed() ? 'angle-double-right' : 'angle-double-left'\"\n [size]=\"16\"\n />\n </button>\n </div>\n\n <nav class=\"africanies-overlay-scroll relative flex-1 overflow-y-auto overflow-x-visible px-3 py-3\">\n @if (!collapsed() && expandParents() && hasOpenBranches()) {\n <button\n type=\"button\"\n class=\"absolute right-1.5 top-1.5 z-10 inline-flex size-7 cursor-pointer items-center justify-center rounded-md bg-white text-neutral-500 shadow-sm ring-1 ring-border/80 transition-colors hover:bg-background-welcome hover:text-ink focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink dark:bg-ink dark:text-neutral-400 dark:ring-white/15 dark:hover:bg-white/10 dark:hover:text-white\"\n aria-label=\"Collapse all\"\n (click)=\"collapseAllBranches()\"\n >\n <africanies-icon name=\"compress\" [size]=\"14\" />\n </button>\n }\n <ul class=\"m-0 flex list-none flex-col gap-0.5 p-0\">\n @for (item of items(); track item.id) {\n <li\n class=\"relative overflow-visible\"\n (mouseenter)=\"onItemEnter(item.id)\"\n (mouseleave)=\"onItemLeave(item.id)\"\n >\n @if (item.routerLink !== null && item.routerLink !== undefined) {\n <a\n [routerLink]=\"item.disabled ? null : item.routerLink\"\n [queryParams]=\"item.queryParams\"\n [fragment]=\"item.fragment\"\n [class]=\"rowClass(item)\"\n [attr.aria-current]=\"isLeafActive(item) ? 'page' : null\"\n [attr.aria-expanded]=\"\n item.children?.length ? isBranchOpen(item.id) : null\n \"\n [attr.aria-disabled]=\"item.disabled ? true : null\"\n (click)=\"onActivate(item, $event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"rowInner\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n [class]=\"rowClass(item)\"\n [disabled]=\"!!item.disabled\"\n [attr.aria-current]=\"isLeafActive(item) ? 'page' : null\"\n [attr.aria-expanded]=\"\n item.children?.length ? isBranchOpen(item.id) : null\n \"\n (click)=\"onActivate(item, $event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"rowInner\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n />\n </button>\n }\n\n @if (!collapsed() && item.children?.length) {\n <div\n class=\"grid transition-[grid-template-rows] duration-200 ease-out\"\n [style.grid-template-rows]=\"\n isBranchOpen(item.id) ? '1fr' : '0fr'\n \"\n [attr.aria-hidden]=\"!isBranchOpen(item.id)\"\n [class.pointer-events-none]=\"!isBranchOpen(item.id)\"\n >\n <ul\n class=\"relative m-0 mt-0.5 min-h-0 list-none space-y-0.5 overflow-hidden py-1 pl-4 before:absolute before:bottom-1 before:left-[1.35rem] before:top-0 before:w-px before:bg-border dark:before:bg-white/15\"\n >\n @for (child of item.children; track child.id) {\n <li\n class=\"transition-opacity duration-200 ease-out\"\n [class.opacity-0]=\"!isBranchOpen(item.id)\"\n [class.opacity-100]=\"isBranchOpen(item.id)\"\n >\n @if (\n child.routerLink !== null &&\n child.routerLink !== undefined\n ) {\n <a\n [routerLink]=\"child.disabled ? null : child.routerLink\"\n [queryParams]=\"child.queryParams\"\n [fragment]=\"child.fragment\"\n [class]=\"childRowClass(child)\"\n [attr.aria-current]=\"\n isLeafActive(child) ? 'page' : null\n \"\n (click)=\"onActivate(child, $event)\"\n >\n @if (child.icon; as icon) {\n <africanies-icon\n [name]=\"icon\"\n [size]=\"14\"\n class=\"shrink-0 opacity-80\"\n />\n }\n <span class=\"truncate\">{{ child.label }}</span>\n <ng-container\n [ngTemplateOutlet]=\"navBadge\"\n [ngTemplateOutletContext]=\"{\n visible: child.badge,\n compact: false,\n }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n [class]=\"childRowClass(child)\"\n [disabled]=\"!!child.disabled\"\n [attr.aria-current]=\"\n isLeafActive(child) ? 'page' : null\n \"\n (click)=\"onActivate(child, $event)\"\n >\n @if (child.icon; as icon) {\n <africanies-icon\n [name]=\"icon\"\n [size]=\"14\"\n class=\"shrink-0 opacity-80\"\n />\n }\n <span class=\"truncate\">{{ child.label }}</span>\n <ng-container\n [ngTemplateOutlet]=\"navBadge\"\n [ngTemplateOutletContext]=\"{\n visible: child.badge,\n compact: false,\n }\"\n />\n </button>\n }\n </li>\n }\n </ul>\n </div>\n }\n\n @if (collapsed() && hoverId() === item.id) {\n <div\n class=\"absolute left-full top-0 z-50 ml-2 min-w-[11rem] overflow-hidden rounded-md border border-border bg-ink text-white shadow-lg dark:border-white/15\"\n role=\"tooltip\"\n >\n <div\n class=\"absolute inset-y-0 left-0 w-1\"\n [class]=\"modeColor.classes().bg\"\n aria-hidden=\"true\"\n ></div>\n <div class=\"border-b border-white/10 px-3 py-2 pl-4\">\n <p class=\"m-0 text-body-sm font-semibold\">{{ item.label }}</p>\n </div>\n @if (item.children?.length) {\n <ul class=\"m-0 list-none space-y-0.5 p-1.5\">\n @for (child of item.children; track child.id) {\n <li>\n @if (\n child.routerLink !== null &&\n child.routerLink !== undefined\n ) {\n <a\n [routerLink]=\"\n child.disabled ? null : child.routerLink\n \"\n [queryParams]=\"child.queryParams\"\n [fragment]=\"child.fragment\"\n class=\"relative flex items-center gap-2 rounded px-2.5 py-1.5 text-body-sm text-white/85 no-underline transition-colors hover:bg-white/10 hover:text-white\"\n [class.opacity-50]=\"child.disabled\"\n (click)=\"onActivate(child, $event)\"\n >\n @if (child.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"14\" />\n }\n {{ child.label }}\n <ng-container\n [ngTemplateOutlet]=\"navBadge\"\n [ngTemplateOutletContext]=\"{\n visible: child.badge,\n compact: true,\n }\"\n />\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"relative flex w-full items-center gap-2 rounded px-2.5 py-1.5 text-left text-body-sm text-white/85 transition-colors hover:bg-white/10 hover:text-white\"\n [disabled]=\"!!child.disabled\"\n (click)=\"onActivate(child, $event)\"\n >\n @if (child.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"14\" />\n }\n {{ child.label }}\n <ng-container\n [ngTemplateOutlet]=\"navBadge\"\n [ngTemplateOutletContext]=\"{\n visible: child.badge,\n compact: true,\n }\"\n />\n </button>\n }\n </li>\n }\n </ul>\n }\n </div>\n }\n </li>\n }\n </ul>\n </nav>\n\n <ng-content select=\"[footer]\" />\n </aside>\n\n <ng-template #rowInner let-item>\n <span class=\"inline-flex size-5 shrink-0 items-center justify-center\">\n @if (item.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"16\" />\n } @else {\n <span\n class=\"size-1.5 rounded-full bg-current opacity-70\"\n aria-hidden=\"true\"\n ></span>\n }\n </span>\n @if (!collapsed()) {\n <span class=\"min-w-0 flex-1 truncate text-left\">{{ item.label }}</span>\n @if (item.children?.length) {\n <africanies-icon\n name=\"chevron-down\"\n [size]=\"14\"\n class=\"shrink-0 opacity-70 transition-transform duration-200 ease-out\"\n [class.rotate-180]=\"isBranchOpen(item.id)\"\n />\n }\n }\n <ng-container\n [ngTemplateOutlet]=\"navBadge\"\n [ngTemplateOutletContext]=\"{\n visible: item.badge,\n compact: collapsed(),\n }\"\n />\n </ng-template>\n\n <ng-template #navBadge let-visible=\"visible\" let-compact=\"compact\">\n @if (visible) {\n <span\n class=\"pointer-events-none absolute z-10 overflow-visible\"\n [class]=\"compact ? 'right-0.5 top-0.5 h-2 w-2' : 'right-1.5 top-1 h-2 w-2'\"\n aria-hidden=\"true\"\n >\n <span\n class=\"africanies-side-nav-badge-ping absolute left-1/2 top-1/2 size-2 rounded-full bg-danger\"\n ></span>\n <span\n class=\"absolute left-1/2 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-danger ring-2 ring-white dark:ring-ink\"\n ></span>\n </span>\n }\n </ng-template>","/**\n * Collapsible app-shell side navigation (`africanies-side-nav`).\n */\nexport { SideNavComponent } from './africanies-side-nav.component';\nexport type { AfricaniesSideNavItem } from './side-nav-item';\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n/**\n * Implicit context for templates registered with {@link TabDefDirective}.\n */\nexport interface TabDefContext {\n /** Tab id matching {@link AfricaniesNavItem.id}. */\n $implicit: string;\n}\n\n/**\n * Registers projected tab panel content against a tab id for\n * {@link TabsComponent} (local / non-router mode).\n *\n * @example\n * ```html\n * <ng-template africaniesTabDef=\"details\">\n * <app-shipment-details />\n * </ng-template>\n * ```\n */\n@Directive({\n selector: '[africaniesTabDef]',\n standalone: true,\n})\nexport class TabDefDirective {\n /** Template projected as the active tab panel. */\n readonly template = inject(TemplateRef<TabDefContext>);\n\n /**\n * Tab id this template binds to — must match an {@link AfricaniesNavItem.id}.\n */\n readonly africaniesTabDef = input.required<string>();\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n effect,\n ElementRef,\n inject,\n input,\n model,\n viewChildren,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n type IsActiveMatchOptions,\n NavigationEnd,\n Router,\n} from '@angular/router';\n\nimport { filter, map, startWith } from 'rxjs';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport type { AfricaniesNavItem } from '../nav-item';\nimport { isNavItemActive } from '../nav-router.util';\nimport {\n isModifiedClick,\n navigateNavItem,\n navItemHref,\n} from '../navigate-nav-item';\nimport { TabDefDirective } from './tab-def.directive';\n\nconst DEFAULT_LINK_ACTIVE: IsActiveMatchOptions = {\n paths: 'subset',\n queryParams: 'ignored',\n fragment: 'ignored',\n matrixParams: 'ignored',\n};\n\n/**\n * Tab list for page / section navigation.\n *\n * ## Router mode (URL is source of truth)\n *\n * Set `routerLink` on items. Active styling and `activeId` follow the\n * consumer’s Router — including **cold loads** (`/shipments/docs` highlights\n * Docs). Pair with a `<router-outlet>` for panel content.\n *\n * Routed tabs navigate with `{ scroll: 'manual' }` by default so the page\n * does not jump to the top when only a child panel changes. Pass\n * `[keepScroll]=\"false\"` to use the app’s normal router scroll behaviour.\n *\n * ## Local mode\n *\n * Omit `routerLink` and bind `[(activeId)]`. Project panels with\n * `<ng-template africaniesTabDef=\"id\">`.\n *\n * @example\n * ```html\n * <!-- URL-driven (child routes) -->\n * <africanies-tabs [items]=\"[\n * { id: 'overview', label: 'Overview', routerLink: '/shipments/1/overview' },\n * { id: 'docs', label: 'Docs', routerLink: '/shipments/1/docs' }\n * ]\" />\n * <router-outlet />\n * ```\n */\n@Component({\n selector: 'africanies-tabs',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, NgTemplateOutlet],\n template: `\n <div class=\"flex flex-col gap-4\">\n <div\n class=\"flex flex-wrap gap-1 border-b border-border dark:border-white/10\"\n role=\"tablist\"\n tabindex=\"-1\"\n [attr.aria-label]=\"ariaLabel()\"\n (keydown)=\"onTablistKeydown($event)\"\n >\n @for (item of items(); track item.id) {\n @if (item.routerLink !== null && item.routerLink !== undefined) {\n <a\n #tabEl\n role=\"tab\"\n [class]=\"\n tabChrome() +\n ' ' +\n (isItemActive(item) ? activeTabClass() : inactiveTabClass())\n \"\n [class.cursor-pointer]=\"!item.disabled\"\n [class.cursor-not-allowed]=\"item.disabled\"\n [class.opacity-50]=\"item.disabled\"\n [attr.href]=\"item.disabled ? null : hrefFor(item)\"\n [attr.aria-selected]=\"isItemActive(item)\"\n [attr.tabindex]=\"isItemActive(item) ? 0 : -1\"\n [attr.aria-disabled]=\"item.disabled ? true : null\"\n [attr.id]=\"'africanies-tab-' + item.id\"\n (click)=\"onRoutedClick($event, item)\"\n >\n @if (item.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"16\" class=\"shrink-0\" />\n }\n {{ item.label }}\n </a>\n } @else {\n <button\n #tabEl\n type=\"button\"\n role=\"tab\"\n [class]=\"\n tabChrome() +\n ' ' +\n (isItemActive(item) ? activeTabClass() : inactiveTabClass())\n \"\n [disabled]=\"!!item.disabled\"\n [class.cursor-pointer]=\"!item.disabled\"\n [class.cursor-not-allowed]=\"item.disabled\"\n [attr.aria-selected]=\"isItemActive(item)\"\n [attr.tabindex]=\"isItemActive(item) ? 0 : -1\"\n [attr.id]=\"'africanies-tab-' + item.id\"\n [attr.aria-controls]=\"\n hasPanels() ? 'africanies-tab-panel-' + item.id : null\n \"\n (click)=\"selectLocal(item)\"\n >\n @if (item.icon; as icon) {\n <africanies-icon [name]=\"icon\" [size]=\"16\" class=\"shrink-0\" />\n }\n {{ item.label }}\n </button>\n }\n }\n </div>\n\n @if (hasPanels()) {\n @if (activePanel(); as panel) {\n <div\n role=\"tabpanel\"\n class=\"min-w-0 text-ink dark:text-white\"\n [attr.id]=\"'africanies-tab-panel-' + activeId()\"\n [attr.aria-labelledby]=\"'africanies-tab-' + activeId()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"panel\"\n [ngTemplateOutletContext]=\"{ $implicit: activeId() }\"\n />\n </div>\n }\n }\n </div>\n `,\n})\nexport class TabsComponent {\n private readonly router = inject(Router);\n protected readonly modeColor = inject(ModeColorService);\n\n private readonly tabDefs = contentChildren(TabDefDirective);\n private readonly tabEls = viewChildren<ElementRef<HTMLElement>>('tabEl');\n\n /** Tab definitions. */\n readonly items = input.required<AfricaniesNavItem[]>();\n\n /**\n * Selected tab id. For routed items this is **synced from the Router**\n * (including cold URL loads). For local items, bind `[(activeId)]`.\n */\n readonly activeId = model<string | null>(null);\n\n /** Accessible name for the tablist. */\n readonly ariaLabel = input('Tabs');\n\n /**\n * Match options for routed items (same contract as `Router.isActive`).\n * Defaults to subset path matching, ignoring query/fragment.\n */\n readonly linkActiveOptions =\n input<IsActiveMatchOptions>(DEFAULT_LINK_ACTIVE);\n\n /**\n * Keep the viewport where it is when a routed tab navigates (default).\n * Uses Angular’s `{ scroll: 'manual' }` so app-wide scroll restoration does\n * not jump to the top. Set false to use normal router scrolling.\n */\n readonly keepScroll = input(true, { transform: booleanAttribute });\n\n /** Re-evaluate active state on every successful navigation (and initial URL). */\n private readonly url = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n map(() => this.router.url),\n startWith(this.router.url),\n ),\n { initialValue: this.router.url },\n );\n\n private readonly panelMap = computed(() => {\n const map = new Map<string, TabDefDirective['template']>();\n for (const def of this.tabDefs()) {\n map.set(def.africaniesTabDef(), def.template);\n }\n return map;\n });\n\n protected readonly hasPanels = computed(() => this.panelMap().size > 0);\n\n protected readonly activePanel = computed(() => {\n const id = this.activeId();\n if (!id) {\n return null;\n }\n return this.panelMap().get(id) ?? null;\n });\n\n protected readonly tabChrome = computed(\n () =>\n 'inline-flex items-center gap-1.5 border-b-2 px-3 py-2 text-body-sm transition-colors -mb-px no-underline',\n );\n\n protected readonly activeTabClass = computed(() => {\n const colors = this.modeColor.classes();\n return `${colors.text} border-current font-semibold`;\n });\n\n protected readonly inactiveTabClass = computed(\n () =>\n 'border-transparent font-medium text-neutral-600 hover:text-ink dark:text-neutral-400 dark:hover:text-white',\n );\n\n constructor() {\n // Keep activeId aligned with the URL whenever any item is router-backed.\n effect(() => {\n this.url();\n const options = this.linkActiveOptions();\n const routed = this.items().filter((i) => i.routerLink != null);\n if (routed.length === 0) {\n return;\n }\n const match = routed.find((i) =>\n isNavItemActive(this.router, i, options),\n );\n if (match && this.activeId() !== match.id) {\n this.activeId.set(match.id);\n }\n });\n }\n\n protected hrefFor(item: AfricaniesNavItem): string | null {\n return navItemHref(this.router, item);\n }\n\n protected isItemActive(item: AfricaniesNavItem): boolean {\n if (item.routerLink != null) {\n this.url();\n return isNavItemActive(this.router, item, this.linkActiveOptions());\n }\n return this.activeId() === item.id;\n }\n\n protected selectLocal(item: AfricaniesNavItem): void {\n if (item.disabled || item.routerLink != null) {\n return;\n }\n this.activeId.set(item.id);\n }\n\n /**\n * Primary click navigates in-app without scrolling to top. Modified clicks\n * (cmd/ctrl/middle) keep the native link behaviour for new tabs.\n * @param event\n * @param item\n */\n protected onRoutedClick(event: MouseEvent, item: AfricaniesNavItem): void {\n if (item.disabled) {\n event.preventDefault();\n return;\n }\n if (isModifiedClick(event)) {\n return;\n }\n event.preventDefault();\n void navigateNavItem(this.router, item, this.keepScroll());\n }\n\n /**\n * Arrow-key navigation for the tablist. Local buttons also change selection\n * (ARIA tabs); routed links only move focus.\n * @param event\n */\n protected onTablistKeydown(event: KeyboardEvent): void {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') {\n return;\n }\n const els = this.tabEls()\n .map((r) => r.nativeElement)\n .filter(\n (el) =>\n !el.hasAttribute('disabled') &&\n el.getAttribute('aria-disabled') !== 'true',\n );\n if (els.length === 0) {\n return;\n }\n const current = document.activeElement as HTMLElement | null;\n const idx = els.findIndex((el) => el === current);\n if (idx < 0) {\n return;\n }\n event.preventDefault();\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n const next = (idx + delta + els.length) % els.length;\n const nextEl = els[next];\n if (!nextEl) {\n return;\n }\n nextEl.focus();\n\n if (nextEl.tagName === 'BUTTON') {\n const id = nextEl.id.replace(/^africanies-tab-/, '');\n const item = this.items().find((t) => t.id === id);\n if (item) {\n this.selectLocal(item);\n }\n }\n }\n}\n","/**\n * Navigation chrome: breadcrumb, tabs, segment, side nav, and shipping mode.\n *\n * Items share {@link AfricaniesNavItem} (tabs / segment / breadcrumb). Side nav uses\n * {@link AfricaniesSideNavItem} (icons + nested children). Optional `routerLink`\n * hooks into the consumer’s Angular Router; otherwise selection is local via\n * `activeId`.\n */\n\nexport { BreadcrumbComponent } from './breadcrumb';\nexport {\n buildBreadcrumbsFromSideNav,\n type ContentBackTarget,\n type HeaderBackTarget,\n isCatalogRootRoute,\n isNestedChildRoute,\n normalizeNavPath,\n resolveActiveSideNavItem,\n resolveCatalogRootLink,\n resolveContentBackTarget,\n resolveHeaderBackTarget,\n resolveParentPathFromRootSnapshot,\n} from './header-back.util';\nexport type { AfricaniesNavItem } from './nav-item';\nexport { isNavItemActive, navItemUrlTree } from './nav-router.util';\nexport {\n isModifiedClick,\n navigateNavItem,\n navItemHref,\n} from './navigate-nav-item';\nexport { SegmentComponent } from './segment';\nexport { ShippingModeSwitchComponent } from './shipping-mode-switch';\nexport {\n type AfricaniesSideNavItem,\n SideNavComponent,\n} from './side-nav';\nexport {\n type TabDefContext,\n TabDefDirective,\n TabsComponent,\n} from './tabs';\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Page title + subtitle for product screens.\n *\n * Sit this **below** app-shell breadcrumbs (the shell content header does\n * that automatically via `headerTitle` / `headerSubtitle`). Pages outside\n * the shell can use the component directly.\n *\n * Optional `[actions]` slot for a toolbar on the right (filters, primary CTA).\n *\n * @example\n * ```html\n * <africanies-page-header\n * title=\"App Settings\"\n * subtitle=\"Company control panel for shipping, money, warehouses, staff, and partners.\"\n * />\n *\n * <africanies-page-header title=\"Deliveries\" subtitle=\"Inbound freight for this mode.\">\n * <button actions africanies-button type=\"button\" variant=\"primary\">New</button>\n * </africanies-page-header>\n * ```\n */\n@Component({\n selector: 'africanies-page-header',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'block',\n },\n template: `\n @if (title() || subtitle()) {\n <header\n class=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\"\n >\n <div class=\"flex min-w-0 max-w-3xl flex-col gap-1\">\n @if (title()) {\n <h1\n class=\"m-0 text-heading-3 font-bold text-ink dark:text-white\"\n >\n {{ title() }}\n </h1>\n }\n @if (subtitle()) {\n <p class=\"m-0 text-body text-neutral-600 dark:text-neutral-400\">\n {{ subtitle() }}\n </p>\n }\n </div>\n <div class=\"flex shrink-0 flex-wrap items-center gap-2 empty:hidden\">\n <ng-content select=\"[actions]\" />\n </div>\n </header>\n }\n `,\n})\nexport class PageHeaderComponent {\n /** Page heading. Omit when the shell already rendered a title. */\n readonly title = input('');\n\n /** One-line explanation of what this screen is for. */\n readonly subtitle = input('');\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterLink } from '@angular/router';\n\nimport { filter, map, startWith } from 'rxjs';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport { BreadcrumbComponent } from '../navigation/breadcrumb';\nimport {\n resolveCatalogRootLink,\n resolveContentBackTarget,\n resolveParentPathFromRootSnapshot,\n} from '../navigation/header-back.util';\nimport type { AfricaniesNavItem } from '../navigation/nav-item';\nimport type { AfricaniesSideNavItem } from '../navigation/side-nav';\nimport { PageHeaderComponent } from './page-header.component';\n\n/**\n * Content chrome above the app-shell body: Back, breadcrumbs, then the page\n * title and optional subtitle.\n */\n@Component({\n selector: 'africanies-app-shell-content-header',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, BreadcrumbComponent, PageHeaderComponent, RouterLink],\n template: `\n @if (showBackButton() || breadcrumbs().length || title() || subtitle()) {\n <div class=\"mb-6 flex flex-col gap-4\">\n @if (showBackButton() || breadcrumbs().length) {\n <div class=\"flex min-w-0 items-center gap-2 sm:gap-3\">\n @if (showBackButton()) {\n <a\n class=\"inline-flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-lg text-neutral-600 transition-colors hover:bg-background-welcome hover:text-ink focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink dark:text-neutral-400 dark:hover:bg-white/10 dark:hover:text-white\"\n [attr.aria-label]=\"backLabel()\"\n [routerLink]=\"backTarget()!.routerLink\"\n [queryParams]=\"backTarget()!.queryParams\"\n [fragment]=\"backTarget()!.fragment\"\n >\n <africanies-icon name=\"chevron-left\" [size]=\"18\" aria-hidden=\"true\" />\n </a>\n }\n\n @if (breadcrumbs().length) {\n <div\n class=\"min-w-0 flex-1\"\n [class.border-l]=\"showBackButton()\"\n [class.pl-2]=\"showBackButton()\"\n [class.sm:pl-3]=\"showBackButton()\"\n [class.border-border]=\"showBackButton()\"\n [class.dark:border-white/10]=\"showBackButton()\"\n >\n <africanies-breadcrumb [items]=\"breadcrumbs()\" />\n </div>\n }\n </div>\n }\n\n @if (title() || subtitle()) {\n <africanies-page-header [title]=\"title()\" [subtitle]=\"subtitle()\" />\n }\n </div>\n }\n `,\n})\nexport class AppShellContentHeaderComponent {\n private readonly router = inject(Router);\n\n readonly breadcrumbs = input<AfricaniesNavItem[]>([]);\n readonly title = input('');\n /** Supporting line under the title (what this page is for). */\n readonly subtitle = input('');\n readonly url = input('');\n readonly catalogNav = input<AfricaniesSideNavItem[]>([]);\n readonly showBack = input(true, { transform: booleanAttribute });\n readonly backLink = input<string | readonly unknown[] | null>(null);\n readonly backLabel = input('Back');\n\n private readonly routeUrl = toSignal(\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map((event) => event.urlAfterRedirects),\n startWith(this.router.url),\n ),\n { initialValue: this.router.url },\n );\n\n protected readonly backTarget = computed(() => {\n const url = this.routeUrl() || this.url();\n return resolveContentBackTarget(\n resolveParentPathFromRootSnapshot(this.router.routerState.snapshot.root),\n url,\n resolveCatalogRootLink(url, this.catalogNav()),\n this.backLink(),\n );\n });\n\n protected readonly showBackButton = computed(\n () => this.showBack() && this.backTarget() != null,\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n signal,\n} from '@angular/core';\n\n/** Control size for {@link AvatarComponent}. */\nexport type AvatarSize = 'sm' | 'md' | 'lg';\n\n/**\n * Circular avatar with image or initials fallback.\n *\n * @example\n * ```html\n * <africanies-avatar name=\"Jane Doe\" src=\"/avatars/jane.jpg\" size=\"md\" />\n * <africanies-avatar name=\"Ops Team\" />\n * ```\n */\n@Component({\n selector: 'africanies-avatar',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'inline-flex shrink-0',\n },\n template: `\n <span\n [class]=\"shellClass()\"\n [attr.aria-label]=\"name() || alt() || 'Avatar'\"\n role=\"img\"\n >\n @if (src() && !imageFailed()) {\n <img\n [src]=\"src()\"\n [alt]=\"alt() || name() || ''\"\n class=\"size-full rounded-full object-cover\"\n (error)=\"imageFailed.set(true)\"\n />\n } @else {\n <span [class]=\"initialsClass()\">{{ initials() }}</span>\n }\n </span>\n `,\n})\nexport class AvatarComponent {\n /** Display name — used for initials when no image loads. */\n readonly name = input('');\n\n /** Optional image URL. */\n readonly src = input<string | null>(null);\n\n /** Image alt text; falls back to {@link name}. */\n readonly alt = input('');\n\n readonly size = input<AvatarSize>('md');\n\n protected readonly imageFailed = signal(false);\n\n protected readonly initials = computed(() => initialsFromName(this.name()));\n\n protected readonly shellClass = computed(() => {\n const base =\n 'inline-flex items-center justify-center overflow-hidden rounded-full ' +\n 'bg-background-welcome font-semibold text-ink ring-1 ring-border ' +\n 'dark:bg-white/10 dark:text-white dark:ring-white/15';\n switch (this.size()) {\n case 'sm':\n return `${base} size-7 text-caption`;\n case 'lg':\n return `${base} size-10 text-body-sm`;\n default:\n return `${base} size-8 text-caption`;\n }\n });\n\n protected readonly initialsClass = computed(() => 'uppercase tracking-wide');\n}\n\nfunction initialsFromName(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) {\n return '?';\n }\n const first = parts[0] ?? '';\n if (parts.length === 1) {\n return first.slice(0, 2).toUpperCase();\n }\n const last = parts[parts.length - 1] ?? '';\n return `${first[0] ?? ''}${last[0] ?? ''}`.toUpperCase();\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport {\n ActionMenuComponent,\n ActionMenuTriggerDirective,\n} from '../action-menu';\nimport type { AfricaniesMenuItem } from '../action-menu/menu-item';\nimport { AvatarComponent, type AvatarSize } from './avatar.component';\n\n/**\n * Avatar trigger with an attached overflow menu — profile / account actions.\n *\n * @example\n * ```html\n * <africanies-avatar-menu\n * name=\"Jane Doe\"\n * src=\"/avatars/jane.jpg\"\n * [menuItems]=\"accountMenu\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-avatar-menu',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AvatarComponent,\n ActionMenuComponent,\n ActionMenuTriggerDirective,\n AfricaniesIconComponent,\n ],\n template: `\n <africanies-action-menu\n [items]=\"menuItems()\"\n [ariaLabel]=\"ariaLabel()\"\n [disabled]=\"disabled()\"\n >\n <button\n type=\"button\"\n africaniesActionMenuTrigger\n class=\"inline-flex cursor-pointer items-center gap-1 rounded-lg p-0.5 pr-1 transition-colors hover:bg-background-welcome focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink disabled:cursor-not-allowed disabled:opacity-50 dark:hover:bg-white/10\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <africanies-avatar [name]=\"name()\" [src]=\"src()\" [size]=\"size()\" />\n @if (showCaret()) {\n <africanies-icon\n name=\"chevron-down\"\n [size]=\"14\"\n class=\"shrink-0 text-neutral-500 dark:text-neutral-400\"\n aria-hidden=\"true\"\n />\n }\n </button>\n </africanies-action-menu>\n `,\n})\nexport class AvatarMenuComponent {\n readonly name = input.required<string>();\n readonly src = input<string | null>(null);\n readonly menuItems = input.required<AfricaniesMenuItem[]>();\n readonly size = input<AvatarSize>('md');\n readonly ariaLabel = input('Account menu');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** When true (default), show a chevron beside the avatar. */\n readonly showCaret = input(true, { transform: booleanAttribute });\n}\n","import { DatePipe } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n Injector,\n runInInjectionContext,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { isObservable, type Observable, take } from 'rxjs';\n\nimport { resolveNotificationLinkForMode, ShippingModeService } from '@africanies/africanies-core';\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport type { PaginationMetaModel } from '@africanies/africanies-models';\n\nimport { ButtonComponent } from '../button/button.component';\nimport { AfricaniesOverlayRef } from '../overlay/africanies-overlay-ref';\nimport { OVERLAY_DATA } from '../overlay/overlay-data.token';\nimport type {\n AfricaniesNotification,\n NotificationDrawerData,\n NotificationDrawerResult,\n NotificationPageResult,\n} from './notification.types';\n\n/** Pixels before the list end to prefetch the next page. */\nconst SCROLL_PREFETCH_PX = 120;\n\n/** How long the “click again to confirm” arm stays active. */\nconst MARK_ALL_CONFIRM_MS = 4000;\n\n/**\n * Right-edge drawer listing in-app notifications.\n *\n * Opened via {@link NotificationDrawerService}.\n */\n@Component({\n selector: 'africanies-notification-drawer',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'block h-full w-full min-w-0 overflow-hidden',\n },\n imports: [AfricaniesIconComponent, ButtonComponent],\n template: `\n <div class=\"flex h-full min-h-0 w-full flex-col\">\n <div\n class=\"flex shrink-0 items-start justify-between gap-3 border-b border-border pb-4 dark:border-white/10\"\n >\n <div class=\"min-w-0 flex flex-col gap-1\">\n <p\n class=\"m-0 text-caption font-medium uppercase tracking-wide text-neutral-600 dark:text-neutral-400\"\n >\n Inbox\n </p>\n <h2 class=\"m-0 text-heading-3 font-bold text-ink dark:text-white\">\n {{ title() }}\n </h2>\n @if (hasUnread()) {\n <p class=\"m-0 text-caption text-neutral-500 dark:text-neutral-400\">\n {{ unreadCount() }} unread\n </p>\n }\n </div>\n <div class=\"flex shrink-0 items-center gap-1\">\n @if (hasUnread() && canMarkAllRead()) {\n <button\n africanies-button\n type=\"button\"\n [variant]=\"confirmingMarkAll() ? 'secondary' : 'ghost'\"\n size=\"sm\"\n class=\"whitespace-nowrap\"\n [disabled]=\"markingAll()\"\n [attr.aria-label]=\"markAllReadAria()\"\n (click)=\"markAllRead()\"\n >\n {{ markAllReadLabel() }}\n </button>\n }\n <button\n africanies-button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Close notifications\"\n (click)=\"ref.close()\"\n >\n <africanies-icon name=\"close\" [size]=\"18\" />\n </button>\n </div>\n </div>\n\n <div\n #scrollHost\n class=\"africanies-overlay-scroll flex min-h-0 flex-1 w-full flex-col overflow-y-auto py-3\"\n >\n @if (loadingInitial()) {\n <div\n class=\"flex flex-1 flex-col items-center justify-center gap-2 py-12\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <africanies-icon\n name=\"spinner\"\n [size]=\"24\"\n class=\"animate-spin text-neutral-500 dark:text-neutral-400\"\n />\n <p class=\"m-0 text-body-sm text-neutral-600 dark:text-neutral-400\">\n Loading notifications…\n </p>\n </div>\n } @else if (loadError()) {\n <div class=\"flex flex-1 flex-col items-center justify-center gap-3 px-4 py-12 text-center\">\n <p class=\"m-0 text-body-sm text-neutral-700 dark:text-neutral-300\">\n {{ loadError() }}\n </p>\n @if (usesPagination()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n (click)=\"retryInitialLoad()\"\n >\n Try again\n </button>\n }\n </div>\n } @else if (items().length === 0) {\n <div\n class=\"flex flex-1 flex-col items-center justify-center gap-3 py-12 text-center\"\n >\n <africanies-icon\n name=\"bell-o\"\n [size]=\"32\"\n class=\"text-neutral-400 dark:text-neutral-500\"\n />\n <p class=\"m-0 max-w-xs text-body leading-relaxed text-neutral-600 dark:text-neutral-300\">\n You're all caught up.\n </p>\n </div>\n } @else {\n <ul class=\"m-0 flex w-full list-none flex-col gap-3 p-0\">\n @for (item of items(); track item.id) {\n <li>\n <article\n class=\"flex w-full gap-2.5 rounded-xl border px-3 py-2.5 transition-colors\"\n [class]=\"itemCardClass(item)\"\n >\n <span\n class=\"mt-1.5 size-1.5 shrink-0 rounded-full\"\n [class.bg-ink-blue]=\"!item.read\"\n [class.dark:bg-export-light]=\"!item.read\"\n [class.bg-transparent]=\"item.read\"\n aria-hidden=\"true\"\n ></span>\n\n <div class=\"min-w-0 flex-1 flex flex-col gap-1.5\">\n <div class=\"flex items-start justify-between gap-2\">\n <h3\n class=\"m-0 min-w-0 flex-1 text-body-sm leading-snug\"\n [class.font-bold]=\"!item.read\"\n [class.text-ink]=\"!item.read\"\n [class.dark:text-white]=\"!item.read\"\n [class.font-medium]=\"item.read\"\n [class.text-neutral-600]=\"item.read\"\n [class.dark:text-neutral-300]=\"item.read\"\n >\n {{ item.title }}\n </h3>\n @if (item.timestamp) {\n <time\n class=\"shrink-0 whitespace-nowrap text-[11px] tabular-nums text-neutral-500 dark:text-neutral-400\"\n [dateTime]=\"item.timestamp\"\n >\n {{ formatTimestamp(item.timestamp) }}\n </time>\n }\n </div>\n\n @if (item.body) {\n <p\n class=\"m-0 text-caption leading-relaxed\"\n [class.text-neutral-800]=\"!item.read\"\n [class.dark:text-neutral-100]=\"!item.read\"\n [class.text-neutral-600]=\"item.read\"\n [class.dark:text-neutral-400]=\"item.read\"\n >\n {{ item.body }}\n </p>\n }\n\n @if (!item.read && canMarkRead()) {\n <div class=\"flex flex-wrap items-center justify-end gap-x-3 gap-y-1\">\n @if (item.link) {\n <a\n [href]=\"viewHref(item)\"\n [class]=\"viewLinkClass()\"\n [class.pointer-events-none]=\"markingId() === item.id\"\n [class.opacity-50]=\"markingId() === item.id\"\n [attr.target]=\"item.externalLink ? '_blank' : null\"\n [attr.rel]=\"item.externalLink ? 'noopener noreferrer' : null\"\n (click)=\"onViewClick($event, item)\"\n >\n {{ markingId() === item.id ? 'Opening…' : 'View' }}\n @if (item.externalLink) {\n <africanies-icon name=\"external-link\" [size]=\"12\" />\n }\n </a>\n }\n <button\n type=\"button\"\n class=\"inline-flex cursor-pointer self-start rounded-md text-caption font-medium text-neutral-600 transition-colors hover:text-ink disabled:cursor-not-allowed disabled:opacity-50 dark:text-neutral-400 dark:hover:text-white\"\n [disabled]=\"markingId() === item.id\"\n (click)=\"markRead(item)\"\n >\n {{ markingId() === item.id ? 'Marking…' : 'Mark read' }}\n </button>\n </div>\n } @else if (item.link) {\n <div class=\"flex items-center justify-end\">\n <a\n [href]=\"viewHref(item)\"\n [class]=\"viewLinkClass()\"\n [class.pointer-events-none]=\"markingId() === item.id\"\n [class.opacity-50]=\"markingId() === item.id\"\n [attr.target]=\"item.externalLink ? '_blank' : null\"\n [attr.rel]=\"item.externalLink ? 'noopener noreferrer' : null\"\n (click)=\"onViewClick($event, item)\"\n >\n {{ markingId() === item.id ? 'Opening…' : 'View' }}\n @if (item.externalLink) {\n <africanies-icon name=\"external-link\" [size]=\"12\" />\n }\n </a>\n </div>\n }\n </div>\n </article>\n </li>\n }\n </ul>\n\n @if (usesPagination()) {\n <div\n #loadSentinel\n class=\"flex min-h-10 items-center justify-center py-2\"\n aria-hidden=\"true\"\n >\n @if (loadingMore()) {\n <span\n class=\"inline-flex items-center gap-2 text-caption text-neutral-500 dark:text-neutral-400\"\n aria-live=\"polite\"\n >\n <africanies-icon name=\"spinner\" [size]=\"14\" class=\"animate-spin\" />\n Loading more…\n </span>\n }\n </div>\n }\n }\n </div>\n </div>\n `,\n})\nexport class NotificationDrawerPanel {\n protected readonly ref =\n inject<AfricaniesOverlayRef<NotificationDrawerResult>>(AfricaniesOverlayRef);\n private readonly data = inject<NotificationDrawerData>(OVERLAY_DATA);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n private readonly shipping = inject(ShippingModeService);\n\n private readonly scrollHost = viewChild<ElementRef<HTMLElement>>('scrollHost');\n private readonly loadSentinel =\n viewChild<ElementRef<HTMLElement>>('loadSentinel');\n\n private observer: IntersectionObserver | null = null;\n\n protected readonly viewLinkClass = computed(() => {\n const base =\n 'inline-flex cursor-pointer items-center gap-1 self-start text-caption font-semibold underline underline-offset-[3px] transition-colors';\n if (this.shipping.mode() === 'stn') {\n return `${base} text-import decoration-import/35 hover:decoration-import dark:text-import-light dark:decoration-import-light/40 dark:hover:decoration-import-light`;\n }\n return `${base} text-export decoration-export/35 hover:decoration-export dark:text-export-light dark:decoration-export-light/40 dark:hover:decoration-export-light`;\n });\n\n protected readonly title = computed(() => this.data.title ?? 'Notifications');\n protected readonly items = signal<AfricaniesNotification[]>(\n this.data.onLoadPage ? [] : (this.data.notifications ?? []),\n );\n protected readonly markingId = signal<string | null>(null);\n protected readonly markingAll = signal(false);\n protected readonly confirmingMarkAll = signal(false);\n protected readonly loadingInitial = signal(!!this.data.onLoadPage);\n protected readonly loadingMore = signal(false);\n protected readonly loadError = signal<string | null>(null);\n protected readonly hasMore = signal(false);\n protected readonly currentPage = signal(0);\n\n protected readonly unreadCount = computed(\n () => (this.items() ?? []).filter((item) => !item.read).length,\n );\n protected readonly hasUnread = computed(() => this.unreadCount() > 0);\n\n protected readonly markAllReadLabel = computed(() => {\n if (this.markingAll()) {\n return 'Marking…';\n }\n if (this.confirmingMarkAll()) {\n return 'Click again to confirm';\n }\n return 'Mark all as read';\n });\n\n protected readonly markAllReadAria = computed(() => {\n if (this.confirmingMarkAll()) {\n return 'Click again to confirm mark all as read';\n }\n return 'Mark all as read';\n });\n\n private markAllConfirmTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n if (this.data.onLoadPage) {\n this.fetchPage(1, 'replace');\n }\n\n effect(() => {\n if (\n this.loadingInitial() ||\n !this.data.onLoadPage ||\n !this.hasMore() ||\n this.items().length === 0 ||\n !this.loadSentinel()\n ) {\n return;\n }\n\n untracked(() => this.scheduleInfiniteScrollSetup());\n });\n\n this.destroyRef.onDestroy(() => {\n this.observer?.disconnect();\n this.observer = null;\n this.clearMarkAllConfirm();\n });\n }\n\n protected usesPagination(): boolean {\n return typeof this.data.onLoadPage === 'function';\n }\n\n protected canMarkAllRead(): boolean {\n return typeof this.data.onMarkAllRead === 'function';\n }\n\n protected canMarkRead(): boolean {\n return typeof this.data.onMarkRead === 'function';\n }\n\n protected retryInitialLoad(): void {\n if (!this.data.onLoadPage) {\n return;\n }\n this.loadError.set(null);\n this.fetchPage(1, 'replace');\n }\n\n protected itemCardClass(item: AfricaniesNotification): string {\n if (item.read) {\n return 'border-border bg-transparent dark:border-white/10';\n }\n return 'border-ink-blue/20 bg-background-welcome dark:border-export-light/20 dark:bg-white/[0.04]';\n }\n\n protected viewHref(item: AfricaniesNotification): string {\n const link = item.link?.trim();\n if (!link) {\n return '';\n }\n return resolveNotificationLinkForMode(link, this.shipping.mode());\n }\n\n protected onViewClick(event: MouseEvent, item: AfricaniesNotification): void {\n if (this.markingId() || this.markingAll()) {\n event.preventDefault();\n return;\n }\n\n const closeDrawer = (): void => {\n this.ref.close({\n selectedId: item.id,\n markedReadId: item.read ? undefined : item.id,\n });\n };\n\n const navigate = (): void => {\n const link = this.viewHref(item);\n if (link) {\n if (item.externalLink) {\n window.open(link, '_blank', 'noopener,noreferrer');\n } else {\n window.location.assign(link);\n }\n }\n closeDrawer();\n };\n\n if (item.read || !this.data.onMarkRead) {\n closeDrawer();\n return;\n }\n\n event.preventDefault();\n this.markingId.set(item.id);\n this.runHook(\n () => this.data.onMarkRead?.(item.id),\n () => {\n this.patchRead(item.id);\n this.markingId.set(null);\n navigate();\n },\n () => this.markingId.set(null),\n );\n }\n\n protected markRead(item: AfricaniesNotification): void {\n if (item.read || this.markingId() || this.markingAll() || !this.data.onMarkRead) {\n return;\n }\n\n this.markingId.set(item.id);\n this.runHook(\n () => this.data.onMarkRead?.(item.id),\n () => {\n this.patchRead(item.id);\n this.markingId.set(null);\n },\n () => this.markingId.set(null),\n );\n }\n\n /**\n * First click arms a short confirm (Cursor Undo-style). Second click\n * marks every notification read.\n */\n protected markAllRead(): void {\n if (this.markingAll() || !this.data.onMarkAllRead) {\n return;\n }\n\n if (!this.confirmingMarkAll()) {\n this.armMarkAllConfirm();\n return;\n }\n\n this.clearMarkAllConfirm();\n this.markingAll.set(true);\n this.runHook(\n () => this.data.onMarkAllRead?.(),\n () => {\n this.items.update((rows) =>\n (rows ?? []).map((row) => ({ ...row, read: true })),\n );\n this.markingAll.set(false);\n this.ref.close({ markedAllRead: true });\n },\n () => this.markingAll.set(false),\n );\n }\n\n private armMarkAllConfirm(): void {\n this.confirmingMarkAll.set(true);\n this.clearMarkAllConfirmTimer();\n this.markAllConfirmTimer = setTimeout(() => {\n this.confirmingMarkAll.set(false);\n this.markAllConfirmTimer = null;\n }, MARK_ALL_CONFIRM_MS);\n }\n\n private clearMarkAllConfirm(): void {\n this.confirmingMarkAll.set(false);\n this.clearMarkAllConfirmTimer();\n }\n\n private clearMarkAllConfirmTimer(): void {\n if (this.markAllConfirmTimer != null) {\n clearTimeout(this.markAllConfirmTimer);\n this.markAllConfirmTimer = null;\n }\n }\n\n protected formatTimestamp(value: string): string {\n const parsed = Date.parse(value);\n if (Number.isNaN(parsed)) {\n return value;\n }\n return new DatePipe('en-US').transform(parsed, 'MMM d, h:mm a') ?? value;\n }\n\n private scheduleInfiniteScrollSetup(): void {\n runInInjectionContext(this.injector, () => {\n afterNextRender(() => this.setupInfiniteScroll());\n });\n }\n\n private setupInfiniteScroll(): void {\n this.observer?.disconnect();\n\n const root = this.scrollHost()?.nativeElement;\n const sentinel = this.loadSentinel()?.nativeElement;\n if (!root || !sentinel || !this.data.onLoadPage) {\n return;\n }\n\n this.observer = new IntersectionObserver(\n (entries) => {\n if (!entries.some((entry) => entry.isIntersecting)) {\n return;\n }\n this.loadNextPage();\n },\n {\n root,\n rootMargin: `0px 0px ${SCROLL_PREFETCH_PX}px 0px`,\n threshold: 0,\n },\n );\n\n this.observer.observe(sentinel);\n }\n\n private resolveHasMore(\n pagination: PaginationMetaModel | null,\n itemCount: number,\n ): boolean {\n if (itemCount === 0) {\n return false;\n }\n\n if (pagination == null) {\n return false;\n }\n\n if (pagination.has_next_page) {\n return true;\n }\n\n if (pagination.total_pages > 0) {\n return pagination.current_page < pagination.total_pages;\n }\n\n return false;\n }\n\n private loadNextPage(): void {\n if (\n !this.data.onLoadPage ||\n !this.hasMore() ||\n this.loadingMore() ||\n this.loadingInitial()\n ) {\n return;\n }\n\n this.fetchPage(this.currentPage() + 1, 'append');\n }\n\n private fetchPage(page: number, mode: 'replace' | 'append'): void {\n const loadPage = this.data.onLoadPage;\n if (!loadPage) {\n return;\n }\n\n if (mode === 'replace') {\n this.loadingInitial.set(true);\n this.loadError.set(null);\n } else {\n this.loadingMore.set(true);\n }\n\n this.runPageLoad(\n () => loadPage(page),\n (result) => {\n if (mode === 'replace') {\n this.items.set(result.items ?? []);\n } else {\n this.appendItems(result.items ?? []);\n }\n\n this.currentPage.set(page);\n this.hasMore.set(\n this.resolveHasMore(\n result.pagination,\n (result.items ?? []).length,\n ),\n );\n this.loadingInitial.set(false);\n this.loadingMore.set(false);\n },\n () => {\n if (mode === 'replace') {\n this.loadError.set('Could not load notifications. Try again.');\n this.loadingInitial.set(false);\n }\n this.loadingMore.set(false);\n },\n );\n }\n\n private appendItems(incoming: AfricaniesNotification[] | null | undefined): void {\n const rows = incoming ?? [];\n if (!rows.length) {\n return;\n }\n\n this.items.update((existing) => {\n const seen = new Set((existing ?? []).map((item) => item.id));\n const next = rows.filter((item) => !seen.has(item.id));\n return next.length ? [...existing, ...next] : existing;\n });\n }\n\n private patchRead(id: string): void {\n this.items.update((rows) =>\n (rows ?? []).map((row) => (row.id === id ? { ...row, read: true } : row)),\n );\n }\n\n private runPageLoad(\n invoke: () => Observable<NotificationPageResult> | Promise<NotificationPageResult>,\n succeed: (result: NotificationPageResult) => void,\n fail: () => void,\n ): void {\n let pending: Observable<NotificationPageResult> | Promise<NotificationPageResult>;\n try {\n pending = invoke();\n } catch {\n fail();\n return;\n }\n\n if (isObservable(pending)) {\n pending.pipe(take(1), takeUntilDestroyed(this.destroyRef)).subscribe({\n next: (result) => succeed(result),\n error: () => fail(),\n });\n return;\n }\n\n void Promise.resolve(pending).then(succeed, fail);\n }\n\n private runHook(\n invoke: () => Observable<unknown> | Promise<unknown> | void | undefined,\n succeed: () => void,\n fail: () => void,\n ): void {\n let pending: Observable<unknown> | Promise<unknown> | void;\n try {\n pending = invoke();\n } catch {\n fail();\n return;\n }\n\n if (pending == null) {\n succeed();\n return;\n }\n\n if (isObservable(pending)) {\n pending.pipe(take(1), takeUntilDestroyed(this.destroyRef)).subscribe({\n next: () => succeed(),\n error: () => fail(),\n });\n return;\n }\n\n void Promise.resolve(pending).then(succeed, fail);\n }\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport type { OverlayHandle } from '@africanies/africanies-core';\n\nimport { DrawerService } from '../overlay/drawer.service';\nimport type {\n NotificationDrawerData,\n NotificationDrawerResult,\n} from './notification.types';\nimport { NotificationDrawerPanel } from './notification-drawer.panel';\n\n/**\n * Opens {@link NotificationDrawerPanel} via {@link DrawerService}.\n *\n * Requires {@link provideAfricaniesUiOverlays} at bootstrap.\n */\n@Injectable({ providedIn: 'root' })\nexport class NotificationDrawerService {\n private readonly drawer = inject(DrawerService);\n\n /**\n * @param data - Notification list and optional drawer title.\n * @returns Overlay handle; `afterClosed` emits when an item is chosen or dismissed.\n */\n open(\n data: NotificationDrawerData,\n ): OverlayHandle<NotificationDrawerResult> {\n return this.drawer.open<NotificationDrawerData, NotificationDrawerResult>(\n NotificationDrawerPanel,\n {\n data,\n dismissible: true,\n panelClass: [\n '!w-[min(100%,28rem)]',\n '!p-4',\n '!overflow-hidden',\n 'sm:!p-5',\n ],\n },\n );\n }\n}\n","/** Daily header greeting: a short kicker plus the given name. */\nexport interface HeaderGreeting {\n /** Time-of-day or weather line, shown above the name. */\n kicker: string;\n /** Given name — the visual focus of the header. */\n name: string;\n}\n\n/** Local-hour slices, finer than morning / afternoon / evening. */\nexport type HeaderGreetingPeriod =\n | 'wee-hours'\n | 'dawn'\n | 'early-morning'\n | 'morning'\n | 'midday'\n | 'afternoon'\n | 'dusk'\n | 'evening'\n | 'late-night';\n\n/** Coarse weather used to flavour the kicker when a forecast is available. */\nexport type HeaderWeatherKind =\n | 'clear'\n | 'cloudy'\n | 'fog'\n | 'drizzle'\n | 'rain'\n | 'snow'\n | 'storm';\n\n/** Optional forecast snapshot for {@link pickHeaderGreeting}. */\nexport interface HeaderWeather {\n kind: HeaderWeatherKind;\n /** Celsius, when the forecast includes it. */\n temperatureC?: number;\n /** City from IP geolocation, when known. */\n city?: string;\n}\n\nconst PERIOD_KICKERS: Record<HeaderGreetingPeriod, readonly string[]> = {\n 'wee-hours': [\n 'Moonlit chat?',\n 'Still here?',\n 'Quiet hours.',\n 'Night-owl desk.',\n \"The city's asleep.\",\n 'Burning the midnight oil?',\n 'Late-night glow.',\n 'Stars are out.',\n 'Hushed shift.',\n 'After midnight.',\n 'Just us and the dark.',\n 'Owl hours.',\n ],\n dawn: [\n 'First light.',\n 'Dawn patrol.',\n 'Before the rush.',\n \"The sky's waking up.\",\n 'Early bird.',\n 'Sunrise shift.',\n \"Coffee's brewing.\",\n 'Soft morning.',\n 'Ahead of the day.',\n 'Pale gold hour.',\n 'World still yawning.',\n 'Catch the quiet.',\n ],\n 'early-morning': [\n 'Rise and shine.',\n \"Let's ease in.\",\n 'Bright and early.',\n 'Warm-up lap.',\n \"Day's just starting.\",\n 'Stretch and go.',\n 'Morning pages.',\n 'Good hour to begin.',\n 'Easy does it.',\n 'First coffee?',\n 'Laces tied.',\n 'Fresh notebook energy.',\n ],\n morning: [\n 'Morning momentum.',\n 'Ready to ship?',\n \"Let's make it count.\",\n 'Onward.',\n 'Full steam.',\n \"Let's clear the decks.\",\n 'Good hour for it.',\n 'Inbox awaits.',\n \"Let's get into it.\",\n 'Lights are on.',\n 'Plotting the day?',\n 'Open the windows.',\n ],\n midday: [\n 'Midday check-in.',\n \"Sun's high.\",\n 'Halfway there.',\n 'Peak hours.',\n 'Lunch-adjacent.',\n 'Keep the pace.',\n 'Quick reset?',\n 'Still rolling.',\n 'High noon.',\n 'Midday desk.',\n 'Second act.',\n 'Refill and resume.',\n ],\n afternoon: [\n 'Afternoon stretch.',\n 'Second wind?',\n 'Back at it.',\n 'Steady on.',\n 'Still plenty of day.',\n 'Carry it forward.',\n 'Afternoon light.',\n 'Keep going.',\n 'Golden grind.',\n 'Long-shadow hours.',\n 'Push the next tile.',\n 'Not done yet.',\n ],\n dusk: [\n 'Golden hour.',\n 'Evening glow.',\n 'Last daylight.',\n 'Wrapping the day?',\n 'Soft landing.',\n 'Dusk desk.',\n 'Sunset shift.',\n 'Almost there.',\n \"Light's going gold.\",\n 'Close of play?',\n 'Sky on fire.',\n 'Blue hour soon.',\n ],\n evening: [\n 'Evening session.',\n \"Night's coming in.\",\n 'After hours?',\n 'Evening quiet.',\n 'One more round?',\n 'Lights are low.',\n 'Evening desk.',\n 'Unwind or push?',\n 'Settling in.',\n 'Lamp-light hours.',\n 'City lights on.',\n 'Slow the tempo?',\n ],\n 'late-night': [\n 'Moonlit chat?',\n 'Late shift.',\n 'Quiet tonight.',\n 'Still glowing?',\n 'Night desk.',\n 'Hushed hours.',\n 'Wrap it gently?',\n 'Starside.',\n 'Last lap?',\n 'Soft landing tonight.',\n 'The moon is clocked in.',\n 'Dim the noise.',\n ],\n};\n\nconst WEATHER_KICKERS: Record<HeaderWeatherKind, readonly string[]> = {\n clear: ['Clear skies.', \"Sun's out.\", 'Bright out there.', 'Blue overhead.'],\n cloudy: ['Soft grey day.', 'Cloud cover.', 'Overcast calm.', 'Grey but going.'],\n fog: ['Foggy out.', 'Misty hours.', 'Wrapped in fog.', 'Low and quiet.'],\n drizzle: ['Light drizzle.', 'Soft rain.', 'Grey and gentle.', 'A little wet out.'],\n rain: ['Rainy round?', 'Wet out there.', 'Cozy weather for it.', 'Rain on the glass.'],\n snow: ['Snow in the air.', 'Flurries out.', 'Cold sparkle.', 'Winter at the window.'],\n storm: ['Stormy out.', 'Wild skies.', 'Hold tight.', 'Thunder weather.'],\n};\n\nconst NOTABLE_WEATHER: ReadonlySet<HeaderWeatherKind> = new Set([\n 'rain',\n 'snow',\n 'storm',\n 'fog',\n]);\n\n/**\n * First given name from a display name or `first_name` field.\n *\n * @param value - Full name or given name.\n * @returns First token, or empty string when missing.\n */\nexport function headerGreetingFirstName(value: string | null | undefined): string {\n const trimmed = value?.trim() ?? '';\n if (!trimmed) {\n return '';\n }\n\n return trimmed.split(/\\s+/)[0] ?? '';\n}\n\n/**\n * Greeting window for a local clock hour.\n *\n * @param now - Clock used to read the hour.\n * @returns Slice of the day used to pick a kicker list.\n */\nexport function headerGreetingPeriod(now: Date): HeaderGreetingPeriod {\n const hour = now.getHours();\n if (hour < 5) {\n return 'wee-hours';\n }\n if (hour < 7) {\n return 'dawn';\n }\n if (hour < 9) {\n return 'early-morning';\n }\n if (hour < 12) {\n return 'morning';\n }\n if (hour < 14) {\n return 'midday';\n }\n if (hour < 17) {\n return 'afternoon';\n }\n if (hour < 19) {\n return 'dusk';\n }\n if (hour < 22) {\n return 'evening';\n }\n return 'late-night';\n}\n\n/**\n * Candidate kickers for a period, with optional weather flavor mixed in.\n *\n * @param period - Time-of-day window.\n * @param weather - Forecast snapshot, when available.\n * @returns Lines the header may show for this moment.\n */\nexport function headerGreetingPool(\n period: HeaderGreetingPeriod,\n weather: HeaderWeather | null = null,\n): readonly string[] {\n const periodLines = PERIOD_KICKERS[period];\n if (!weather) {\n return periodLines;\n }\n\n const weatherLines = [\n ...WEATHER_KICKERS[weather.kind],\n ...temperatureKickers(weather.temperatureC),\n ];\n\n if (NOTABLE_WEATHER.has(weather.kind)) {\n return [...weatherLines, ...weatherLines, ...periodLines];\n }\n\n return [...periodLines, ...weatherLines];\n}\n\n/**\n * Claude-style header greeting, stable for a name + calendar day + period.\n *\n * Kickers are drawn from a list for the current slice of the day (dawn, dusk,\n * moonlit hours, and so on). When weather is passed in, a few forecast lines\n * join the pool. The name is always returned separately so the header can set\n * it in larger type.\n *\n * @param name - Given name or full display name.\n * @param now - Clock used for the period and the daily pick.\n * @param weather - Optional forecast; omit when the lookup has not finished.\n * @returns Greeting parts, or `null` when no name is available.\n */\nexport function pickHeaderGreeting(\n name: string | null | undefined,\n now: Date = new Date(),\n weather: HeaderWeather | null = null,\n): HeaderGreeting | null {\n const first = headerGreetingFirstName(name);\n if (!first) {\n return null;\n }\n\n const period = headerGreetingPeriod(now);\n const pool = headerGreetingPool(period, weather);\n const weatherKey = weather?.kind ?? 'none';\n const key = `${first.toLowerCase()}|${now.getFullYear()}-${now.getMonth()}-${now.getDate()}|${period}|${weatherKey}`;\n const kicker = pool[hashString(key) % pool.length] ?? pool[0];\n\n return { kicker, name: first };\n}\n\nfunction temperatureKickers(temperatureC: number | undefined): readonly string[] {\n if (temperatureC === undefined || !Number.isFinite(temperatureC)) {\n return [];\n }\n if (temperatureC >= 32) {\n return [\"Heat's on.\", 'Warm one.'];\n }\n if (temperatureC <= 12) {\n return ['Chilly out.', 'Crisp air.'];\n }\n return [];\n}\n\nfunction hashString(value: string): number {\n let hash = 0;\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash * 31 + value.charCodeAt(index)) >>> 0;\n }\n return hash;\n}\n","import type { IconName } from '@africanies/africanies-icons';\n\nimport type { HeaderWeather, HeaderWeatherKind } from './header-greeting.util';\n\nconst CACHE_KEY = 'africanies-header-weather-v3';\nconst FETCH_MS = 4_000;\nconst GEO_URL = 'https://get.geojs.io/v1/ip/geo.json';\n\nconst WEATHER_LABELS: Record<HeaderWeatherKind, string> = {\n clear: 'Clear',\n cloudy: 'Cloudy',\n fog: 'Fog',\n drizzle: 'Drizzle',\n rain: 'Rain',\n snow: 'Snow',\n storm: 'Storm',\n};\n\ninterface CachedWeather {\n hour: string;\n kind: HeaderWeatherKind;\n temperatureC?: number;\n city?: string;\n}\n\ninterface GeoJsPayload {\n city?: string;\n latitude?: string | number;\n longitude?: string | number;\n}\n\ninterface OpenMeteoPayload {\n current?: {\n weather_code?: number;\n temperature_2m?: number;\n };\n}\n\n/**\n * Map Open-Meteo / WMO weather codes to a greeting flavor.\n *\n * @param code - WMO weather interpretation code.\n * @returns Coarse kind, or `null` when the code is unknown.\n */\nexport function mapWmoWeatherCode(code: number): HeaderWeatherKind | null {\n if (code === 0 || code === 1) {\n return 'clear';\n }\n if (code === 2 || code === 3) {\n return 'cloudy';\n }\n if (code === 45 || code === 48) {\n return 'fog';\n }\n if (code >= 51 && code <= 57) {\n return 'drizzle';\n }\n if ((code >= 61 && code <= 67) || (code >= 80 && code <= 82)) {\n return 'rain';\n }\n if ((code >= 71 && code <= 77) || code === 85 || code === 86) {\n return 'snow';\n }\n if (code === 95 || code === 96 || code === 99) {\n return 'storm';\n }\n return null;\n}\n\n/**\n * Short condition label for the header weather chip.\n *\n * @param kind - Coarse forecast kind.\n * @returns Display label such as `Rain` or `Clear`.\n */\nexport function headerWeatherLabel(kind: HeaderWeatherKind): string {\n return WEATHER_LABELS[kind];\n}\n\n/**\n * Icon for the header weather chip.\n *\n * @param kind - Coarse forecast kind.\n * @param hour - Local hour, used to pick sun vs moon when it is clear.\n * @returns Icon name from the product sprite.\n */\nexport function headerWeatherIcon(kind: HeaderWeatherKind, hour: number): IconName {\n if (kind === 'clear') {\n return hour >= 19 || hour < 6 ? 'moon-o' : 'sun-o';\n }\n if (kind === 'rain' || kind === 'drizzle' || kind === 'storm') {\n return 'cloud';\n }\n return 'cloud-o';\n}\n\n/**\n * City-level forecast via IP geolocation + Open-Meteo (no API key).\n *\n * Fails closed: missing browser APIs, timeouts, and HTTP errors all return\n * `null` so the greeting can stay time-of-day only. Cached per local hour\n * in `sessionStorage`.\n *\n * @param fetchFn - Injected `fetch` for tests.\n * @returns Forecast snapshot, or `null` when lookup fails.\n */\nexport async function loadHeaderWeather(\n fetchFn?: typeof fetch,\n): Promise<HeaderWeather | null> {\n const run = fetchFn ?? defaultFetch();\n if (typeof run !== 'function' || typeof window === 'undefined') {\n return null;\n }\n\n const hour = calendarHourKey();\n const cached = readCache(hour);\n if (cached) {\n return cached;\n }\n\n try {\n const geo = (await fetchJson(run, GEO_URL)) as GeoJsPayload | null;\n const latitude = asNumber(geo?.latitude);\n const longitude = asNumber(geo?.longitude);\n if (latitude === null || longitude === null) {\n return null;\n }\n\n const forecastUrl =\n `https://api.open-meteo.com/v1/forecast` +\n `?latitude=${latitude}&longitude=${longitude}` +\n `&current=weather_code,temperature_2m`;\n const forecast = (await fetchJson(run, forecastUrl)) as OpenMeteoPayload | null;\n const code = asNumber(forecast?.current?.weather_code);\n if (code === null) {\n return null;\n }\n\n const kind = mapWmoWeatherCode(code);\n if (!kind) {\n return null;\n }\n\n const temperatureC = asNumber(forecast?.current?.temperature_2m) ?? undefined;\n const city = asCity(geo?.city);\n const weather: HeaderWeather = { kind, temperatureC, city };\n writeCache({ hour, kind, temperatureC, city });\n return weather;\n } catch {\n return null;\n }\n}\n\nfunction defaultFetch(): typeof fetch | undefined {\n return typeof fetch === 'function' ? fetch.bind(globalThis) : undefined;\n}\n\nfunction calendarHourKey(now = new Date()): string {\n return `${now.getFullYear()}-${now.getMonth()}-${now.getDate()}-${now.getHours()}`;\n}\n\nfunction readCache(hour: string): HeaderWeather | null {\n try {\n const raw = sessionStorage.getItem(CACHE_KEY);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as CachedWeather;\n if (parsed.hour !== hour || !parsed.kind) {\n return null;\n }\n return {\n kind: parsed.kind,\n temperatureC: parsed.temperatureC,\n city: parsed.city,\n };\n } catch {\n return null;\n }\n}\n\nfunction writeCache(value: CachedWeather): void {\n try {\n sessionStorage.setItem(CACHE_KEY, JSON.stringify(value));\n } catch {\n // Private mode / quota — greeting still works without cache.\n }\n}\n\nfunction asNumber(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction asCity(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n if (!trimmed || trimmed.toLowerCase() === 'n/a') {\n return undefined;\n }\n return trimmed;\n}\n\nasync function fetchJson(\n fetchFn: typeof fetch,\n url: string,\n): Promise<unknown | null> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_MS);\n try {\n const response = await fetchFn(url, { signal: controller.signal });\n if (!response.ok) {\n return null;\n }\n return await response.json();\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { DatePipe } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n Directive,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport type { Observable } from 'rxjs';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\nimport type { AfricaniesMenuItem } from '../action-menu/menu-item';\nimport { AvatarMenuComponent } from '../avatar';\nimport type { AfricaniesNotification, NotificationPageResult } from '../notifications';\nimport { NotificationDrawerService } from '../notifications';\nimport type { HeaderWeather } from './header-greeting.util';\nimport { pickHeaderGreeting } from './header-greeting.util';\nimport {\n headerWeatherIcon,\n headerWeatherLabel,\n loadHeaderWeather,\n} from './header-weather';\n\n/** Header density — affects clock visibility in narrow layouts. */\nexport type AppShellHeaderDensity = 'mobile' | 'tablet' | 'desktop';\n\n/**\n * Marks projected content as extra leading chrome in {@link AppShellHeaderComponent}.\n */\n@Directive({\n selector: '[africaniesAppShellHeaderStart]',\n standalone: true,\n})\nexport class AppShellHeaderStartDirective {}\n\n/**\n * Marks projected content as extra trailing chrome in {@link AppShellHeaderComponent}.\n */\n@Directive({\n selector: '[africaniesAppShellHeaderEnd]',\n standalone: true,\n})\nexport class AppShellHeaderEndDirective {}\n\n/**\n * Product header bar for {@link AppShellComponent}: a short time-of-day kicker\n * plus the given name, local weather, live clock, notification inbox drawer,\n * and avatar menu.\n * Breadcrumbs and Back belong in the content column via\n * {@link AppShellContentHeaderComponent}.\n *\n * @example\n * ```html\n * <africanies-app-shell-header\n * greetingName=\"Jane\"\n * userName=\"Jane Doe\"\n * [userMenuItems]=\"accountMenu\"\n * [notifications]=\"notifications\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-app-shell-header',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, AvatarMenuComponent, DatePipe],\n template: `\n <div\n class=\"flex min-w-0 items-center gap-2 px-3 py-2.5 sm:gap-4 sm:px-6 sm:py-3\"\n >\n <div class=\"flex min-w-0 flex-1 items-center gap-2 sm:gap-3\">\n <ng-content select=\"[africaniesAppShellHeaderStart]\" />\n\n @if (greeting(); as hello) {\n <div class=\"min-w-0 overflow-hidden\">\n <p\n class=\"m-0 truncate text-caption leading-none text-neutral-500 dark:text-neutral-400\"\n >\n {{ hello.kicker }}\n </p>\n <p\n class=\"m-0 mt-1 truncate text-body font-semibold leading-none tracking-tight text-ink sm:text-body-lg dark:text-white\"\n >\n {{ hello.name }}\n </p>\n </div>\n }\n </div>\n\n <div class=\"flex shrink-0 items-center gap-1.5 sm:gap-3\">\n @if (weather() || showClock()) {\n <div\n class=\"hidden items-center gap-3 pr-2 sm:flex sm:border-r sm:border-border sm:pr-4 dark:sm:border-white/15\"\n >\n @if (weather()) {\n <div\n class=\"flex items-center gap-1.5\"\n [attr.aria-label]=\"weatherAriaLabel()\"\n >\n <africanies-icon\n [name]=\"weatherIcon()\"\n [size]=\"18\"\n class=\"text-neutral-500 dark:text-neutral-400\"\n />\n @if (weatherTemp(); as temp) {\n <span\n class=\"text-body-sm font-medium tabular-nums tracking-tight text-ink dark:text-white\"\n >\n {{ temp }}°\n </span>\n }\n <span\n class=\"hidden text-caption text-neutral-500 md:inline dark:text-neutral-400\"\n >\n {{ weatherPlace() }}\n </span>\n </div>\n }\n\n @if (showClock()) {\n <div class=\"flex items-baseline gap-2\" aria-live=\"polite\">\n <time\n class=\"hidden text-caption text-neutral-500 md:inline dark:text-neutral-400\"\n [dateTime]=\"nowIso()\"\n >\n {{ now() | date: clockDateFormat() }}\n </time>\n <time\n class=\"text-body-sm font-medium tabular-nums tracking-tight text-ink dark:text-white\"\n [dateTime]=\"nowIso()\"\n >\n {{ now() | date: clockFormat() }}\n </time>\n </div>\n }\n </div>\n }\n\n <ng-content select=\"[africaniesAppShellHeaderEnd]\" />\n\n @if (showNotifications() || userName()) {\n <div\n class=\"flex items-center gap-1.5 sm:gap-3\"\n [class.border-l]=\"!(weather() || showClock())\"\n [class.border-border]=\"!(weather() || showClock())\"\n [class.pl-2]=\"!(weather() || showClock())\"\n [class.sm:pl-3]=\"!(weather() || showClock())\"\n [class.dark:border-white/15]=\"!(weather() || showClock())\"\n >\n @if (showNotifications()) {\n <button\n type=\"button\"\n class=\"relative inline-flex size-9 cursor-pointer items-center justify-center rounded-lg text-neutral-600 transition-colors hover:bg-background-welcome hover:text-ink focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink dark:text-neutral-400 dark:hover:bg-white/10 dark:hover:text-white\"\n [attr.aria-label]=\"notificationAriaLabel()\"\n (click)=\"openNotifications()\"\n >\n <africanies-icon\n name=\"bell-o\"\n [size]=\"24\"\n class=\"block translate-x-[-1px] translate-y-0.5\"\n />\n @if (unreadCount() > 0) {\n <span\n class=\"pointer-events-none absolute -right-0.5 -top-0.5 flex size-4 items-center justify-center rounded-full bg-danger text-[10px] font-semibold leading-none text-white ring-2 ring-white dark:ring-ink-950\"\n aria-hidden=\"true\"\n >\n {{ unreadBadge() }}\n </span>\n }\n </button>\n }\n\n @if (userName()) {\n <africanies-avatar-menu\n [name]=\"userName()!\"\n [src]=\"userAvatarSrc()\"\n [menuItems]=\"userMenuItems()\"\n [size]=\"'md'\"\n />\n }\n </div>\n }\n </div>\n </div>\n `,\n})\nexport class AppShellHeaderComponent {\n private readonly notificationsDrawer = inject(NotificationDrawerService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Account display name for the avatar menu. */\n readonly userName = input<string | null>(null);\n\n /**\n * Given or full name used to pick a time-of-day greeting.\n */\n readonly greetingName = input<string | null>(null);\n\n /** Optional avatar image URL. */\n readonly userAvatarSrc = input<string | null>(null);\n\n /** Menu entries for the avatar overflow menu. */\n readonly userMenuItems = input<AfricaniesMenuItem[]>([]);\n\n /** Notifications listed in the drawer. */\n readonly notifications = input<AfricaniesNotification[]>([]);\n\n /** Drawer heading override. */\n readonly notificationsTitle = input('Notifications');\n\n /** Marks one notification read when the user taps View. */\n readonly onNotificationMarkRead = input<\n ((id: string) => Observable<unknown> | Promise<unknown> | void) | undefined\n >(undefined);\n\n /** Marks every notification read from the drawer header. */\n readonly onNotificationMarkAllRead = input<\n (() => Observable<unknown> | Promise<unknown> | void) | undefined\n >(undefined);\n\n /** Paginated inbox fetch for infinite scroll inside the drawer. */\n readonly onNotificationLoadPage = input<\n | ((\n page: number,\n ) => Observable<NotificationPageResult> | Promise<NotificationPageResult>)\n | undefined\n >(undefined);\n\n /** When false, hides the live clock. */\n readonly showClock = input(true, { transform: booleanAttribute });\n\n /** When false, hides the bell control. */\n readonly showNotifications = input(true, { transform: booleanAttribute });\n\n /**\n * Layout density — reserved for compact header previews.\n * Defaults to `desktop`.\n */\n readonly density = input<AppShellHeaderDensity>('desktop');\n\n /** Angular DatePipe format for the clock date line. */\n readonly clockDateFormat = input('EEE, MMM d, y');\n\n /** Angular DatePipe format for the clock time (minutes, no seconds). */\n readonly clockFormat = input('h:mm a');\n\n protected readonly now = signal(new Date());\n\n protected readonly weather = signal<HeaderWeather | null>(null);\n\n protected readonly nowIso = computed(() => this.now().toISOString());\n\n protected readonly greeting = computed(() =>\n pickHeaderGreeting(this.greetingName(), this.now(), this.weather()),\n );\n\n protected readonly weatherIcon = computed(() => {\n const forecast = this.weather();\n if (!forecast) {\n return 'cloud-o';\n }\n return headerWeatherIcon(forecast.kind, this.now().getHours());\n });\n\n protected readonly weatherTemp = computed(() => {\n const temp = this.weather()?.temperatureC;\n if (temp === undefined || !Number.isFinite(temp)) {\n return null;\n }\n return temp.toFixed(1);\n });\n\n protected readonly weatherPlace = computed(() => {\n const forecast = this.weather();\n if (!forecast) {\n return '';\n }\n return forecast.city?.trim() || headerWeatherLabel(forecast.kind);\n });\n\n protected readonly weatherAriaLabel = computed(() => {\n const forecast = this.weather();\n if (!forecast) {\n return 'Weather';\n }\n const condition = headerWeatherLabel(forecast.kind).toLowerCase();\n const temp = this.weatherTemp();\n const city = forecast.city?.trim();\n const degrees = temp === null ? condition : `${temp} degrees, ${condition}`;\n return city ? `Weather in ${city}: ${degrees}` : `Weather: ${degrees}`;\n });\n\n protected readonly unreadCount = computed(\n () => (this.notifications() ?? []).filter((n) => !n.read).length,\n );\n\n protected readonly unreadBadge = computed(() => {\n const count = this.unreadCount();\n return count > 9 ? '9+' : `${count}`;\n });\n\n protected readonly notificationAriaLabel = computed(() => {\n const unread = this.unreadCount();\n if (unread === 0) {\n return 'Open notifications';\n }\n return `Open notifications, ${unread} unread`;\n });\n\n constructor() {\n let active = true;\n const refreshWeather = (): void => {\n void loadHeaderWeather().then((forecast) => {\n if (active && forecast) {\n this.weather.set(forecast);\n }\n });\n };\n\n refreshWeather();\n const tick = setInterval(() => {\n const next = new Date();\n const hourChanged =\n next.getHours() !== this.now().getHours() ||\n next.getDate() !== this.now().getDate();\n this.now.set(next);\n if (hourChanged) {\n refreshWeather();\n }\n }, 1_000);\n this.destroyRef.onDestroy(() => {\n active = false;\n clearInterval(tick);\n });\n }\n\n protected openNotifications(): void {\n const onMarkRead = this.onNotificationMarkRead();\n const onMarkAllRead = this.onNotificationMarkAllRead();\n const onLoadPage = this.onNotificationLoadPage();\n\n this.notificationsDrawer\n .open({\n title: this.notificationsTitle(),\n notifications: onLoadPage ? undefined : this.notifications(),\n onLoadPage,\n onMarkRead,\n onMarkAllRead,\n })\n .afterClosed()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe();\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks projected content as the custom header for {@link AppShellComponent}.\n *\n * When present, the built-in {@link AppShellHeaderComponent} is skipped.\n */\n@Directive({\n selector: '[africaniesAppShellHeader]',\n standalone: true,\n})\nexport class AppShellHeaderSlotDirective {}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\n\nimport { filter, map, startWith } from 'rxjs';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport type { AfricaniesMenuItem } from '../action-menu/menu-item';\nimport { AFRICANIES_BRAND_LOGO_MINI_URL } from '../brand';\nimport type { AfricaniesNavItem } from '../navigation/nav-item';\nimport type { AfricaniesSideNavItem } from '../navigation/side-nav';\nimport type { AfricaniesNotification } from '../notifications';\nimport { AppShellContentHeaderComponent } from './app-shell-content-header.component';\nimport { AppShellHeaderComponent } from './app-shell-header.component';\nimport { AppShellHeaderSlotDirective } from './app-shell-header-slot.directive';\n\n/**\n * Content column max-width for {@link AppShellComponent}.\n *\n * Matches common product reading widths; `90` is 90% of the main column;\n * `full` drops the centered constraint.\n */\nexport type AppShellContentWidth =\n | '3xl'\n | '4xl'\n | '5xl'\n | '6xl'\n | '7xl'\n | '90'\n | 'full';\n\n/**\n * Forces a layout breakpoint for embeds and playground previews (ignores viewport).\n * Omit in production apps to follow Tailwind `lg` (1024px).\n */\nexport type AppShellLayoutPreview = 'mobile' | 'tablet' | 'desktop';\n\n/**\n * Application chrome scaffold: side nav + sticky header + constrained content.\n *\n * Projection slots:\n * - `[sidenav]` — typically `<africanies-side-nav>` (sticky full-height rail)\n * - `[africaniesAppShellHeader]` — optional custom top bar (replaces built-in chrome header)\n * - default — page body inside a centered max-width column (playground-style)\n *\n * When no `[africaniesAppShellHeader]` is projected, a dedicated product header renders with\n * live clock, notification drawer, and avatar menu. Breadcrumbs, page title,\n * subtitle, and Back live in the content column\n * (see {@link AppShellContentHeaderComponent} / {@link PageHeaderComponent}).\n *\n * Below `lg`, the rail hides and a host-owned mobile drawer opens from the\n * menu button (or set {@link layoutPreview} in demos).\n *\n * @example\n * ```html\n * <africanies-app-shell\n * userName=\"Jane Doe\"\n * [userMenuItems]=\"accountMenu\"\n * [notifications]=\"notifications\"\n * [breadcrumbs]=\"crumbs\"\n * >\n * <africanies-side-nav sidenav [items]=\"nav\" [(collapsed)]=\"collapsed\" />\n * <router-outlet />\n * </africanies-app-shell>\n * ```\n */\n@Component({\n selector: 'africanies-app-shell',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, AppShellContentHeaderComponent, AppShellHeaderComponent],\n host: {\n '[class]': 'hostClass()',\n },\n templateUrl: './app-shell.component.html',\n})\nexport class AppShellComponent {\n protected readonly modeColor = inject(ModeColorService);\n protected readonly logoMiniUrl = inject(AFRICANIES_BRAND_LOGO_MINI_URL);\n\n private readonly router = inject(Router);\n private readonly customHeader = contentChild(AppShellHeaderSlotDirective);\n\n protected readonly mobileNavOpen = signal(false);\n\n /**\n * Max width of the content column. Defaults to `5xl` (same as the playground).\n * Use `90` for 90% of the main column, or `full` for edge-to-edge dashboards.\n */\n readonly contentWidth = input<AppShellContentWidth>('5xl');\n\n /**\n * When true (default), draw a mode-accent hairline under the header.\n */\n readonly showAccent = input(true, { transform: booleanAttribute });\n\n /**\n * When true (default), render the built-in product header when no `[africaniesAppShellHeader]`\n * slot is projected.\n */\n readonly showHeaderChrome = input(true, { transform: booleanAttribute });\n\n /**\n * Pin layout for demos/embeds. Production apps should omit this and rely on\n * viewport breakpoints.\n */\n readonly layoutPreview = input<AppShellLayoutPreview | null>(null);\n\n /** Page title rendered above the content column. */\n readonly headerTitle = input('');\n\n /** Supporting line under the page title (what this screen is for). */\n readonly headerSubtitle = input('');\n\n /** Breadcrumb trail rendered above the content column. */\n readonly breadcrumbs = input<AfricaniesNavItem[]>([]);\n\n /**\n * Side-nav catalog used to detect nested child routes for the content Back control.\n * Pass the same items as `[sidenav]`.\n */\n readonly catalogNav = input<AfricaniesSideNavItem[]>([]);\n\n /** When true (default), show the content Back control when a target exists. */\n readonly showContentBack = input(true, { transform: booleanAttribute });\n\n /** Optional explicit Back destination in the content chrome. */\n readonly contentBackLink = input<string | readonly unknown[] | null>(null);\n\n /** Content Back label. */\n readonly contentBackLabel = input('Back');\n\n /** Built-in header account name. */\n readonly userName = input<string | null>(null);\n\n /** Given or full name for the built-in header greeting. */\n readonly greetingName = input<string | null>(null);\n\n /** Built-in header avatar image. */\n readonly userAvatarSrc = input<string | null>(null);\n\n /** Built-in header avatar menu entries. */\n readonly userMenuItems = input<AfricaniesMenuItem[]>([]);\n\n /** Built-in header notification list. */\n readonly notifications = input<AfricaniesNotification[]>([]);\n\n /** Built-in notification drawer title. */\n readonly notificationsTitle = input('Notifications');\n\n /** Built-in header clock visibility. */\n readonly showClock = input(true, { transform: booleanAttribute });\n\n /** Built-in header notification bell visibility. */\n readonly showNotifications = input(true, { transform: booleanAttribute });\n\n /** Built-in header clock date line format. */\n readonly clockDateFormat = input('EEE, MMM d, y');\n\n /** Built-in header clock time line format (seconds included by default). */\n readonly clockFormat = input('h:mm:ss a');\n\n protected readonly hasCustomHeader = computed(\n () => this.customHeader() != null,\n );\n\n protected readonly currentUrl = toSignal(\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map(() => this.router.url),\n startWith(this.router.url),\n ),\n { initialValue: this.router.url },\n );\n\n protected readonly showContentChrome = computed(\n () =>\n this.breadcrumbs().length > 0 ||\n this.headerTitle().length > 0 ||\n this.headerSubtitle().length > 0 ||\n this.showContentBack(),\n );\n\n /** Full height in preview embeds so absolute drawers stay inside the frame. */\n protected readonly hostClass = computed(() =>\n this.layoutPreview() ? 'block h-full' : 'block min-h-full',\n );\n\n protected readonly shellRootClass = computed(() =>\n this.layoutPreview()\n ? 'relative flex h-full min-h-0'\n : 'relative flex min-h-full',\n );\n\n protected readonly headerDensity = computed((): 'mobile' | 'tablet' | 'desktop' => {\n const preview = this.layoutPreview();\n if (preview === 'mobile') {\n return 'mobile';\n }\n if (preview === 'tablet') {\n return 'tablet';\n }\n return 'desktop';\n });\n\n protected readonly showMobileBar = computed(() => {\n const preview = this.layoutPreview();\n if (preview === 'mobile' || preview === 'tablet') {\n return true;\n }\n return preview !== 'desktop';\n });\n\n protected readonly sidenavHostClass = computed(() => {\n const preview = this.layoutPreview();\n const open = this.mobileNavOpen();\n\n // Preview embeds: absolute/h-full so the drawer stays inside the frame.\n // Production: h-dvh so the rail fills the viewport (h-full only matches parent).\n if (preview === 'desktop') {\n return 'z-50 shrink-0 self-start sticky top-0 block h-full';\n }\n\n if (preview === 'mobile' || preview === 'tablet') {\n return open\n ? 'z-50 shrink-0 self-start absolute inset-y-0 left-0 h-full shadow-xl'\n : 'hidden';\n }\n\n const base = 'z-50 shrink-0 self-start h-dvh';\n if (open) {\n return `${base} fixed inset-y-0 left-0 shadow-xl lg:sticky lg:top-0 lg:block`;\n }\n\n return `${base} hidden lg:sticky lg:top-0 lg:block`;\n });\n\n protected readonly mainClass = computed(() => {\n const width = this.contentWidth();\n const preview = this.layoutPreview();\n const pad =\n preview === 'mobile'\n ? 'flex-1 px-3 py-5'\n : 'flex-1 px-4 py-8 sm:px-6 sm:py-10';\n if (width === 'full') {\n return `w-full ${pad}`;\n }\n if (width === '90') {\n return `mx-auto w-[90%] ${pad}`;\n }\n const max: Record<Exclude<AppShellContentWidth, 'full' | '90'>, string> = {\n '3xl': 'max-w-3xl',\n '4xl': 'max-w-4xl',\n '5xl': 'max-w-5xl',\n '6xl': 'max-w-6xl',\n '7xl': 'max-w-7xl',\n };\n return `mx-auto w-full ${max[width]} ${pad}`;\n });\n\n protected toggleMobileNav(): void {\n this.mobileNavOpen.update((open) => !open);\n }\n\n protected closeMobileNav(): void {\n this.mobileNavOpen.set(false);\n }\n}\n"," <div [class]=\"shellRootClass()\">\n @if (mobileNavOpen()) {\n <button\n type=\"button\"\n class=\"absolute inset-0 z-40 cursor-pointer bg-ink/40\"\n [class.lg:hidden]=\"!layoutPreview()\"\n aria-label=\"Close navigation\"\n (click)=\"closeMobileNav()\"\n ></button>\n }\n\n <div [class]=\"sidenavHostClass()\">\n <ng-content select=\"[sidenav]\" />\n </div>\n\n <div class=\"flex min-w-0 flex-1 flex-col\">\n @if (showMobileBar()) {\n <div\n class=\"flex shrink-0 items-center gap-2 border-b border-border px-3 py-2 dark:border-white/10\"\n [class.lg:hidden]=\"!layoutPreview()\"\n >\n <button\n type=\"button\"\n class=\"inline-flex size-9 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-border text-ink transition-colors hover:bg-background-welcome dark:border-white/15 dark:text-white dark:hover:bg-white/10\"\n [attr.aria-label]=\"mobileNavOpen() ? 'Close navigation' : 'Open navigation'\"\n [attr.aria-expanded]=\"mobileNavOpen()\"\n (click)=\"toggleMobileNav()\"\n >\n <africanies-icon name=\"align-justify\" [size]=\"18\" />\n </button>\n <img\n [src]=\"logoMiniUrl\"\n alt=\"African Import Export Solutions\"\n class=\"h-7 w-auto object-contain\"\n />\n </div>\n }\n\n <div\n class=\"sticky top-0 z-30 border-b border-border bg-white/90 backdrop-blur-md dark:border-white/10 dark:bg-ink-950/90\"\n >\n @if (hasCustomHeader()) {\n <ng-content select=\"[africaniesAppShellHeader]\" />\n } @else if (showHeaderChrome()) {\n <africanies-app-shell-header\n [userName]=\"userName()\"\n [greetingName]=\"greetingName()\"\n [userAvatarSrc]=\"userAvatarSrc()\"\n [userMenuItems]=\"userMenuItems()\"\n [notifications]=\"notifications()\"\n [notificationsTitle]=\"notificationsTitle()\"\n [showClock]=\"showClock()\"\n [showNotifications]=\"showNotifications()\"\n [clockDateFormat]=\"clockDateFormat()\"\n [clockFormat]=\"clockFormat()\"\n [density]=\"headerDensity()\"\n />\n }\n @if (showAccent()) {\n <div\n class=\"h-0.5 w-full transition-colors duration-300\"\n [class]=\"modeColor.classes().bg\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n\n <main [class]=\"mainClass()\">\n @if (showContentChrome()) {\n <africanies-app-shell-content-header\n [breadcrumbs]=\"breadcrumbs()\"\n [title]=\"headerTitle()\"\n [subtitle]=\"headerSubtitle()\"\n [url]=\"currentUrl()\"\n [catalogNav]=\"catalogNav()\"\n [showBack]=\"showContentBack()\"\n [backLink]=\"contentBackLink()\"\n [backLabel]=\"contentBackLabel()\"\n />\n }\n <ng-content />\n </main>\n </div>\n </div>","/**\n * Layout scaffolds for host apps.\n */\nexport {\n AppShellComponent,\n type AppShellContentWidth,\n type AppShellLayoutPreview,\n} from './app-shell.component';\nexport { AppShellContentHeaderComponent } from './app-shell-content-header.component';\nexport {\n AppShellHeaderComponent,\n type AppShellHeaderDensity,\n AppShellHeaderEndDirective,\n AppShellHeaderStartDirective,\n} from './app-shell-header.component';\nexport { AppShellHeaderSlotDirective } from './app-shell-header-slot.directive';\nexport {\n type HeaderGreeting,\n headerGreetingFirstName,\n type HeaderGreetingPeriod,\n headerGreetingPeriod,\n type HeaderWeather,\n type HeaderWeatherKind,\n pickHeaderGreeting,\n} from './header-greeting.util';\nexport { PageHeaderComponent } from './page-header.component';\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from '@angular/core';\n\nimport type { IconName } from '@africanies/africanies-icons';\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\n\n/** Corner treatment for {@link ImageComponent}. */\nexport type ImageShape = 'circle' | 'rounded' | 'square';\n\n/** How the image fills its frame. */\nexport type ImageFit = 'cover' | 'contain';\n\n/**\n * Image with a shaped loading frame and fallback while the asset fetches or if\n * it fails to render.\n *\n * @example\n * ```html\n * <africanies-image\n * [src]=\"photoUrl\"\n * alt=\"Passport photo\"\n * frameClass=\"h-40 w-40\"\n * shape=\"rounded\"\n * />\n *\n * <africanies-image\n * [src]=\"avatarUrl\"\n * frameClass=\"h-16 w-16\"\n * shape=\"circle\"\n * [fallback]=\"initials\"\n * placeholderIcon=\"user\"\n * />\n * ```\n */\n@Component({\n selector: 'africanies-image',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent],\n host: {\n class: 'inline-block',\n },\n template: `\n <div\n class=\"relative overflow-hidden\"\n [class]=\"frameShellClass()\"\n >\n @if (src(); as url) {\n <img\n #img\n [src]=\"url\"\n [alt]=\"alt()\"\n class=\"block size-full transition-opacity duration-200\"\n [class]=\"fitClass()\"\n [class.opacity-0]=\"pending()\"\n [class.opacity-100]=\"loaded()\"\n (load)=\"onLoad()\"\n (error)=\"onError()\"\n />\n }\n\n @if (showPlaceholder()) {\n <div\n class=\"absolute inset-0 flex items-center justify-center bg-neutral-200 text-neutral-500 dark:bg-white/10 dark:text-neutral-400\"\n [class.animate-pulse]=\"pending()\"\n aria-hidden=\"true\"\n >\n @if (pending()) {\n <africanies-icon\n name=\"spinner\"\n [size]=\"iconSize()\"\n class=\"animate-spin\"\n />\n } @else if (fallback(); as label) {\n <span\n class=\"px-2 text-center font-semibold text-neutral-600 dark:text-neutral-300\"\n [class]=\"fallbackClass()\"\n >\n {{ label }}\n </span>\n } @else {\n <africanies-icon [name]=\"placeholderIcon()\" [size]=\"iconSize()\" />\n }\n </div>\n }\n </div>\n `,\n})\nexport class ImageComponent {\n private readonly imgRef = viewChild<ElementRef<HTMLImageElement>>('img');\n\n /** Image URL. When empty, the fallback or placeholder icon is shown. */\n readonly src = input<string | null>(null);\n\n readonly alt = input('');\n\n /** Frame size and layout classes, e.g. `h-16 w-16 shrink-0`. */\n readonly frameClass = input('h-40 w-40');\n\n readonly shape = input<ImageShape>('rounded');\n\n readonly fit = input<ImageFit>('cover');\n\n /** Short fallback label — initials, file type, etc. */\n readonly fallback = input<string | undefined>(undefined);\n\n readonly fallbackClass = input('text-body-sm');\n\n readonly placeholderIcon = input<IconName>('picture');\n\n readonly iconSize = input(20, { transform: numberAttribute });\n\n protected readonly loaded = signal(false);\n protected readonly failed = signal(false);\n\n protected readonly pending = computed(() => {\n const url = this.src()?.trim();\n if (!url) {\n return false;\n }\n return !this.loaded() && !this.failed();\n });\n\n protected readonly showPlaceholder = computed(() => {\n const url = this.src()?.trim();\n if (!url) {\n return true;\n }\n return this.pending() || this.failed();\n });\n\n protected readonly frameShellClass = computed(() => {\n const shape = this.shape();\n const rounded =\n shape === 'circle'\n ? 'rounded-full'\n : shape === 'rounded'\n ? 'rounded-lg'\n : '';\n return `${this.frameClass()} ${rounded}`.trim();\n });\n\n protected readonly fitClass = computed(() =>\n this.fit() === 'contain' ? 'object-contain' : 'object-cover',\n );\n\n constructor() {\n effect(() => {\n this.src();\n this.loaded.set(false);\n this.failed.set(false);\n queueMicrotask(() => this.syncIfAlreadyLoaded());\n });\n }\n\n protected onLoad(): void {\n this.loaded.set(true);\n this.failed.set(false);\n }\n\n protected onError(): void {\n this.failed.set(true);\n this.loaded.set(false);\n }\n\n private syncIfAlreadyLoaded(): void {\n const el = this.imgRef()?.nativeElement;\n if (el?.complete && el.naturalWidth > 0) {\n this.onLoad();\n }\n }\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n/**\n * Implicit context passed to templates registered with {@link CellDefDirective}.\n *\n * @typeParam T - Row record type mirrored from {@link TableComponent}.\n */\nexport interface CellDefContext<T = unknown> {\n /** Current row — available as `let-row` on the projected template. */\n $implicit: T;\n}\n\n/**\n * Registers a projected cell template against a column key for\n * {@link TableComponent}.\n *\n * WHY a structural-style directive: mirrors Angular CDK Table's split between\n * column *definition* (`columns` input) and cell *content* (projected\n * templates) so a cell can host badges, buttons, nested components — not just\n * text — without TableComponent knowing about those UIs.\n *\n * @example\n * ```html\n * <ng-template africaniesCellDef=\"status\" let-row>\n * <africanies-chip [variant]=\"statusVariant(row.status)\">{{ row.status }}</africanies-chip>\n * </ng-template>\n * ```\n */\n@Directive({\n selector: '[africaniesCellDef]',\n standalone: true,\n})\nexport class CellDefDirective {\n /** Template projected into matching column body cells. */\n readonly template = inject(TemplateRef<CellDefContext>);\n\n /**\n * Column key this template binds to — must match a {@link TableColumn.key}.\n */\n readonly africaniesCellDef = input.required<string>();\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n/**\n * Registers a projected header cell template against a column key for\n * {@link TableComponent}.\n *\n * When present, the table renders the template instead of the plain\n * `col.header` text for the matching column.\n *\n * @example\n * ```html\n * <ng-template africaniesHeaderCellDef=\"checkbox\">\n * <africanies-checkbox label=\"\" [value]=\"allChecked()\" (valueChange)=\"toggleAll($event)\" />\n * </ng-template>\n * ```\n */\n@Directive({\n selector: '[africaniesHeaderCellDef]',\n standalone: true,\n})\nexport class HeaderCellDefDirective {\n /** Template projected into the matching column header cell. */\n readonly template = inject(TemplateRef);\n\n /**\n * Column key this template binds to — must match a {@link TableColumn.key}.\n */\n readonly africaniesHeaderCellDef = input.required<string>();\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\nimport type { CellDefContext } from './cell-def.directive';\n\n/**\n * Implicit context for {@link RowDetailDefDirective} templates — same shape as\n * {@link CellDefContext} (`let-row` on the projected template).\n */\nexport type RowDetailDefContext<T = unknown> = CellDefContext<T>;\n\n/**\n * Registers a label / value pair inside an expanded table row.\n *\n * The attribute value is the visible label; the template body is the value\n * and may host any component (chips, links, nested controls, …).\n *\n * @example\n * ```html\n * <ng-template africaniesRowDetail=\"Carrier\" let-row>\n * <africanies-chip variant=\"neutral\">{{ row.carrier }}</africanies-chip>\n * </ng-template>\n * ```\n */\n@Directive({\n selector: '[africaniesRowDetail]',\n standalone: true,\n})\nexport class RowDetailDefDirective {\n /** Template rendered as the detail value. */\n readonly template = inject(TemplateRef<RowDetailDefContext>);\n\n /** Visible label in the expanded detail grid. */\n readonly label = input.required<string>({ alias: 'africaniesRowDetail' });\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport {\n DEFAULT_PAGE_SIZE,\n PAGINATION_PAGE_SIZES,\n type PaginationMetaModel,\n type PaginationPageSize,\n} from '@africanies/africanies-models';\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport { ButtonComponent } from '../button/button.component';\nimport { FilterQueryService } from '../filters/filter-query.service';\nimport { SelectComponent, type SelectOption } from '../forms/select';\n\n/** Page number or a gap marker for windowed pagination. */\ntype PageItem = number | 'ellipsis';\n\n/**\n * Page-size select, numbered pager, and prev/next — driven by\n * {@link PaginationMetaModel} from the API envelope.\n *\n * WHY reuse `PaginationMetaModel` instead of a UI-specific type: list endpoints\n * already return this shape on {@link ApiResponseModel.pagination}, so the\n * component wires straight to `response().pagination` with no mapping layer.\n *\n * Prev/next disable via `has_previous_page` / `has_next_page` rather than\n * recomputing bounds from `current_page` / `total_pages`. Page number buttons\n * use a windowed list (first / last / current ±1 with ellipsis) so long lists\n * stay compact.\n *\n * Size options are {@link PAGINATION_PAGE_SIZES} (`5`, `15`, `30`). Changing\n * size emits {@link sizeChange}; the host should refetch at page 1.\n *\n * When Angular Router is present, page / size also sync to the URL (`page`,\n * `size`) via {@link FilterQueryService} — same keys the filter drawer writes.\n *\n * @example\n * ```ts\n * readonly page = signal(1);\n * readonly size = signal(DEFAULT_PAGE_SIZE);\n * readonly response = signal<ApiResponseModel<Shipment[]> | null>(null);\n *\n * load(page: number, size = this.size()): void {\n * this.api\n * .getResource<Shipment>('shipments', null, { page, size })\n * .subscribe((res) => {\n * this.page.set(page);\n * this.size.set(size);\n * this.response.set(res);\n * });\n * }\n *\n * onPageChange(next: number): void {\n * this.load(next);\n * }\n *\n * onSizeChange(next: number): void {\n * this.load(1, next);\n * }\n * ```\n * ```html\n * @if (response(); as res) {\n * <africanies-table [columns]=\"columns\" [rows]=\"res.data ?? []\" />\n * @if (res.pagination; as meta) {\n * <africanies-pagination\n * [meta]=\"meta\"\n * (pageChange)=\"onPageChange($event)\"\n * (sizeChange)=\"onSizeChange($event)\"\n * />\n * }\n * }\n * ```\n *\n * Page controls for server-style lists (bind to {@link PaginationMetaModel}).\n */\n@Component({\n selector: 'africanies-pagination',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AfricaniesIconComponent, ButtonComponent, SelectComponent],\n template: `\n <nav\n class=\"flex flex-wrap items-center justify-between gap-3 py-2 text-body text-ink dark:text-white\"\n aria-label=\"Pagination\"\n [attr.aria-busy]=\"controlsDisabled() || null\"\n >\n <p class=\"m-0 text-body-sm text-neutral-600 dark:text-neutral-400\">\n Page {{ meta().current_page }} of {{ meta().total_pages }}\n <span class=\"text-neutral-400 dark:text-neutral-500\">\n ({{ meta().total_items }} items)\n </span>\n </p>\n <div class=\"inline-flex flex-wrap items-center gap-2\">\n @if (loading()) {\n <span\n class=\"inline-flex size-8 shrink-0 items-center justify-center\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <africanies-icon\n name=\"spinner\"\n [size]=\"20\"\n [class]=\"'animate-spin ' + modeColor.classes().text\"\n aria-hidden=\"true\"\n />\n <span class=\"sr-only\">Loading page</span>\n </span>\n }\n <africanies-select\n class=\"w-20 [&_button[aria-haspopup]]:min-w-0\"\n size=\"sm\"\n [showTriggerIcon]=\"false\"\n [disabled]=\"controlsDisabled()\"\n [options]=\"sizeOptions()\"\n [selected]=\"selectedSizeOption()\"\n (selectedChange)=\"onSizeSelect($event)\"\n >\n <africanies-icon\n suffix\n name=\"chevron-down\"\n [size]=\"16\"\n aria-hidden=\"true\"\n />\n </africanies-select>\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [disabled]=\"controlsDisabled() || !meta().has_previous_page\"\n (click)=\"emitPage(meta().current_page - 1)\"\n >\n Previous\n </button>\n @for (item of pageItems(); track trackPageItem(item, $index)) {\n @if (item === 'ellipsis') {\n <span\n class=\"inline-flex min-w-8 items-center justify-center text-body-sm text-neutral-500 dark:text-neutral-400\"\n aria-hidden=\"true\"\n >\n …\n </span>\n } @else {\n <button\n africanies-button\n type=\"button\"\n size=\"sm\"\n class=\"min-w-8\"\n [variant]=\"item === meta().current_page ? 'primary' : 'secondary'\"\n [disabled]=\"controlsDisabled()\"\n [attr.aria-label]=\"'Page ' + item\"\n [attr.aria-current]=\"\n item === meta().current_page ? 'page' : null\n \"\n (click)=\"emitPage(item)\"\n >\n {{ item }}\n </button>\n }\n }\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [disabled]=\"controlsDisabled() || !meta().has_next_page\"\n (click)=\"emitPage(meta().current_page + 1)\"\n >\n Next\n </button>\n </div>\n </nav>\n `,\n})\nexport class PaginationComponent {\n private readonly filterQuery = inject(FilterQueryService);\n protected readonly modeColor = inject(ModeColorService);\n /**\n * Pagination slice from the latest list response.\n *\n * Prefer binding `response().pagination` directly when non-null.\n */\n readonly meta = input.required<PaginationMetaModel>();\n\n /**\n * When true, disables size and page controls (e.g. while the table is\n * loading a new page).\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * When true, shows a circular spinner beside the page controls and disables\n * them. Use while fetching the next page so rows can stay on screen.\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /**\n * Allowed row counts. Defaults to {@link PAGINATION_PAGE_SIZES}.\n */\n readonly pageSizes = input<readonly PaginationPageSize[]>(PAGINATION_PAGE_SIZES);\n\n /**\n * Target 1-based page number after a prev/next/number activation.\n *\n * Consumers should call `getResource(..., { page })` again — this component\n * does not fetch.\n */\n readonly pageChange = output<number>();\n\n /**\n * New page size after the size dropdown changes.\n *\n * Consumers should refetch at page 1 with this `size`.\n */\n readonly sizeChange = output<number>();\n\n protected readonly controlsDisabled = computed(\n () => this.disabled() || this.loading(),\n );\n\n protected readonly sizeOptions = computed((): SelectOption<number>[] =>\n this.pageSizes().map((value) => ({ label: String(value), value })),\n );\n\n protected readonly selectedSize = computed(() => {\n const perPage = this.meta().per_page;\n const sizes = this.pageSizes();\n if (sizes.includes(perPage as PaginationPageSize)) {\n return perPage;\n }\n return DEFAULT_PAGE_SIZE;\n });\n\n protected readonly selectedSizeOption = computed(\n (): SelectOption<number> | null =>\n this.sizeOptions().find((option) => option.value === this.selectedSize()) ??\n null,\n );\n\n /**\n * Windowed page list: all pages when `total_pages ≤ 7`, otherwise first /\n * last / current ±1 with ellipsis gaps.\n */\n protected readonly pageItems = computed((): PageItem[] => {\n const total = this.meta().total_pages;\n const current = this.meta().current_page;\n if (total <= 0) {\n return [];\n }\n if (total <= 7) {\n return Array.from({ length: total }, (_, index) => index + 1);\n }\n\n const items: PageItem[] = [1];\n const showLeftEllipsis = current > 3;\n const showRightEllipsis = current < total - 2;\n const start = Math.max(2, current - 1);\n const end = Math.min(total - 1, current + 1);\n\n if (showLeftEllipsis) {\n items.push('ellipsis');\n }\n\n for (let page = start; page <= end; page += 1) {\n items.push(page);\n }\n\n if (showRightEllipsis) {\n items.push('ellipsis');\n }\n\n items.push(total);\n return items;\n });\n\n protected trackPageItem(item: PageItem, index: number): string {\n return item === 'ellipsis' ? `ellipsis-${index}` : `page-${item}`;\n }\n\n /**\n * Emits only when the requested page differs from `current_page`.\n *\n * @param page - Candidate page index (already clamped by disabled buttons\n * in the common case; still guard against no-ops).\n */\n protected emitPage(page: number): void {\n if (this.controlsDisabled() || page === this.meta().current_page) {\n return;\n }\n void this.filterQuery.setPage(page);\n this.pageChange.emit(page);\n }\n\n /**\n * @param next - Selection from {@link SelectComponent} (single option).\n */\n protected onSizeSelect(\n next: SelectOption<number> | SelectOption<number>[] | null,\n ): void {\n if (this.controlsDisabled() || next == null || Array.isArray(next)) {\n return;\n }\n if (next.value === this.meta().per_page) {\n return;\n }\n void this.filterQuery.setSize(next.value);\n this.sizeChange.emit(next.value);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n input,\n numberAttribute,\n output,\n signal,\n TemplateRef,\n} from '@angular/core';\n\nimport { AfricaniesIconComponent } from '@africanies/africanies-icons';\nimport type { PaginationMetaModel } from '@africanies/africanies-models';\n\nimport { ButtonComponent } from '../button/button.component';\nimport { EmptyStateComponent } from '../feedback/empty-state.component';\nimport { ErrorIndicatorComponent } from '../feedback/error-indicator.component';\nimport { ErrorStateComponent } from '../feedback/error-state.component';\nimport { LoadingStateComponent } from '../feedback/loading-state.component';\nimport { PaginationComponent } from '../pagination/pagination.component';\nimport { CellDefDirective } from './cell-def.directive';\nimport { HeaderCellDefDirective } from './header-cell-def.directive';\nimport { RowDetailDefDirective } from './row-detail-def.directive';\nimport { TableColumn, TableSortChange } from './table-column';\n\n/**\n * Presentational data table with template-based cells.\n *\n * Columns come from the `columns` input; cell bodies come from projected\n * `<ng-template africaniesCellDef=\"key\">` templates. Columns without a matching\n * template fall back to rendering `row[key]` as plain text.\n *\n * Optional toolbar: top-left **Refresh** (`showRefresh` → {@link refreshClick}).\n * Hidden while the body shows empty or error — those states expose Retry instead.\n * While {@link refreshing} is true the rows stay on screen — the refresh icon\n * spins (do not swap to a blocking loader). Use {@link loading} when the page\n * of data is changing (pagination / size): rows stay on screen and the built-in\n * pager shows a circular spinner beside the page controls; the body loader\n * appears only when there are no rows yet (first load) or the host cleared\n * rows for a shipping-mode switch (STN ↔ SFN). Toolbar and column headers stay\n * mounted.\n * top-right **Filters** then **Export** (`showFilter` / `showExport`). The table\n * does not own fetch, filter, or export logic — the host handles those events.\n *\n * Optional footer pager: pass {@link meta} to embed {@link PaginationComponent};\n * the host still owns refetch via {@link pageChange} / {@link sizeChange}. The\n * pager also writes `page` / `size` to the URL (same keys as filters). Rows\n * are never sliced client-side. While {@link loading} or {@link refreshing} is\n * true and rows are on screen, the pager shows a circular spinner and is\n * disabled — so a page change is visible when the toolbar is scrolled away.\n *\n * **Async body:** first load, empty results, and hard errors render inside the\n * grid (headers + toolbar stay). Bind {@link loading}, {@link error}, and\n * {@link emptyMessage}. Empty/error Retry emits {@link refreshClick}. A stale\n * error (rows still on screen) shows {@link ErrorIndicatorComponent} above the\n * grid. Do not wrap list tables in {@link AsyncStateComponent} — that tears\n * down Filters / Export / pager.\n *\n * Sorting is server-driven — sortable headers emit {@link TableSortChange}\n * and never reorder local rows.\n *\n * **Expandable rows:** project `<ng-template africaniesRowDetail=\"Label\" let-row>`\n * templates. A leading chevron column appears; the expanded panel renders each\n * label with its template value in a responsive grid.\n *\n * @typeParam T - Row record shape.\n *\n * @example\n * ```html\n * <africanies-table\n * [columns]=\"columns\"\n * [rows]=\"state().data!\"\n * [meta]=\"meta()\"\n * [showRefresh]=\"true\"\n * [refreshing]=\"softFetching()\"\n * [loading]=\"pageLoading()\"\n * [error]=\"listError()\"\n * emptyMessage=\"No shipments match these filters.\"\n * [showFilter]=\"true\"\n * [showExport]=\"true\"\n * [filterCount]=\"activeFilterCount()\"\n * (refreshClick)=\"refetch()\"\n * (filterClick)=\"openFilters()\"\n * (exportClick)=\"exportCsv()\"\n * (pageChange)=\"onPageChange($event)\"\n * (sizeChange)=\"onSizeChange($event)\"\n * [sort]=\"sort()\"\n * (sortChange)=\"onSort($event)\"\n * >\n * <ng-template africaniesCellDef=\"status\" let-row>…</ng-template>\n * <ng-template africaniesRowDetail=\"Carrier\" let-row>…</ng-template>\n * </africanies-table>\n * ```\n *\n * **Sticky columns:** a column with `key: 'actions'` stays pinned to the\n * right while the grid scrolls horizontally. The expand trigger column pins\n * to the left when rows are expandable. Override with\n * {@link TableColumn.sticky}.\n */\n@Component({\n selector: 'africanies-table',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n ButtonComponent,\n AfricaniesIconComponent,\n EmptyStateComponent,\n ErrorIndicatorComponent,\n ErrorStateComponent,\n LoadingStateComponent,\n PaginationComponent,\n ],\n host: {\n class: 'block w-full min-w-0',\n },\n styles: `\n /* Full-row hover: sticky action cells use an opaque fill that would\n otherwise mask a <tr> background. Paint every cell the same way. */\n :host tr.africanies-table-row:hover > td {\n background-color: #eef2f6;\n }\n :host-context(.dark) tr.africanies-table-row:hover > td {\n background-color: #272729;\n }\n `,\n template: `\n <div\n class=\"flex w-full min-w-0 flex-col gap-3\"\n [attr.aria-busy]=\"loading() || refreshing() || null\"\n >\n @if (showRefresh() || showFilter() || showExport()) {\n <div class=\"flex items-center justify-between gap-2\">\n <div class=\"flex items-center gap-2\">\n @if (showToolbarRefresh()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [disabled]=\"loading() || refreshing()\"\n [attr.aria-label]=\"refreshLabel()\"\n (click)=\"refreshClick.emit()\"\n >\n <africanies-icon\n name=\"refresh\"\n [size]=\"16\"\n [class]=\"refreshing() ? 'animate-spin' : ''\"\n />\n {{ refreshLabel() }}\n </button>\n }\n </div>\n <div class=\"flex items-center gap-2\">\n @if (showFilter()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [attr.aria-label]=\"filterLabel()\"\n (click)=\"filterClick.emit()\"\n >\n <africanies-icon name=\"filter\" [size]=\"16\" />\n {{ filterLabel() }}\n @if (filterCount() > 0) {\n <span\n class=\"inline-flex min-w-5 items-center justify-center rounded-full bg-ink px-1.5 py-0.5 text-caption font-semibold tabular-nums text-white dark:bg-white dark:text-ink\"\n >\n {{ filterCount() }}\n </span>\n }\n </button>\n }\n @if (showExport()) {\n <button\n africanies-button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n [attr.aria-label]=\"exportLabel()\"\n (click)=\"exportClick.emit()\"\n >\n <africanies-icon name=\"download\" [size]=\"16\" />\n {{ exportLabel() }}\n </button>\n }\n </div>\n </div>\n }\n\n @if (staleError(); as staleMessage) {\n <div class=\"flex justify-end\">\n <africanies-error-indicator\n class=\"max-w-[min(100%,20rem)]\"\n [error]=\"staleMessage\"\n retryText=\"Refresh\"\n [refreshing]=\"refreshing()\"\n (retry)=\"refreshClick.emit()\"\n />\n </div>\n }\n\n <div\n class=\"min-w-0 w-full overflow-x-auto rounded-md border border-border bg-white dark:border-white/10 dark:bg-ink\"\n >\n <table\n class=\"w-max min-w-full table-auto border-separate border-spacing-0 bg-inherit text-left text-body text-ink dark:text-white\"\n >\n <thead\n class=\"border-b border-border bg-background-welcome dark:border-white/10 dark:bg-ink-950\"\n >\n <tr>\n @if (isExpandable()) {\n <th\n scope=\"col\"\n [class]=\"expandHeaderClass()\"\n >\n @if (someRowsExpanded()) {\n <button\n type=\"button\"\n class=\"inline-flex size-8 cursor-pointer items-center justify-center rounded-md text-neutral-600 transition-colors hover:bg-white hover:text-ink focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink dark:text-neutral-400 dark:hover:bg-white/10 dark:hover:text-white\"\n aria-label=\"Collapse all\"\n (click)=\"collapseAllRows()\"\n >\n <africanies-icon name=\"minus\" [size]=\"16\" />\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"inline-flex size-8 cursor-pointer items-center justify-center rounded-md text-neutral-600 transition-colors hover:bg-white hover:text-ink focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink disabled:cursor-not-allowed disabled:opacity-40 dark:text-neutral-400 dark:hover:bg-white/10 dark:hover:text-white\"\n aria-label=\"Expand all\"\n [disabled]=\"rowList().length === 0\"\n (click)=\"expandAllRows()\"\n >\n <africanies-icon name=\"plus\" [size]=\"16\" />\n </button>\n }\n </th>\n }\n @for (col of columns(); track col.key) {\n <th\n scope=\"col\"\n [class]=\"headerCellClass(col)\"\n [style.width]=\"col.width ?? null\"\n >\n @if (headerTemplateFor(col.key); as headerTpl) {\n <ng-container\n [ngTemplateOutlet]=\"headerTpl\"\n />\n } @else if (col.sortable) {\n <button\n type=\"button\"\n class=\"inline-flex cursor-pointer items-center gap-1 rounded-sm font-medium text-neutral-600 hover:text-ink focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink dark:text-neutral-400 dark:hover:text-white\"\n (click)=\"onSortHeaderClick(col.key)\"\n >\n <span>{{ col.header }}</span>\n <span\n class=\"text-caption text-neutral-400\"\n aria-hidden=\"true\"\n >\n {{ sortIndicator(col.key) }}\n </span>\n </button>\n } @else {\n {{ col.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @switch (bodyKind()) {\n @case ('loading') {\n <tr>\n <td class=\"px-3 py-6\" [attr.colspan]=\"colSpan()\">\n <africanies-loading-state [message]=\"loadingLabel()\" />\n </td>\n </tr>\n }\n @case ('error') {\n <tr>\n <td class=\"px-3 py-6\" [attr.colspan]=\"colSpan()\">\n <africanies-error-state\n [message]=\"errorMessage()\"\n [refreshing]=\"refreshing()\"\n (retry)=\"refreshClick.emit()\"\n />\n </td>\n </tr>\n }\n @case ('empty') {\n <tr>\n <td class=\"px-3 py-6\" [attr.colspan]=\"colSpan()\">\n <africanies-empty-state\n [message]=\"emptyMessage()\"\n [refreshing]=\"refreshing()\"\n (retry)=\"refreshClick.emit()\"\n />\n </td>\n </tr>\n }\n @default {\n @for (row of rowList(); track rowId(row, $index); let i = $index) {\n <tr [class]=\"bodyRowClass(row, i)\">\n @if (isExpandable()) {\n <td [class]=\"expandBodyClass(i)\">\n <button\n type=\"button\"\n class=\"inline-flex size-8 cursor-pointer items-center justify-center rounded-md text-neutral-600 transition-colors hover:bg-background-welcome hover:text-ink focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink dark:text-neutral-400 dark:hover:bg-white/10 dark:hover:text-white\"\n [attr.aria-label]=\"\n isRowExpanded(row, i)\n ? 'Collapse row details'\n : 'Expand row details'\n \"\n [attr.aria-expanded]=\"isRowExpanded(row, i)\"\n (click)=\"toggleRowExpanded(row, i)\"\n >\n <africanies-icon\n [name]=\"isRowExpanded(row, i) ? 'minus' : 'plus'\"\n [size]=\"16\"\n />\n </button>\n </td>\n }\n @for (col of columns(); track col.key) {\n <td\n [class]=\"bodyCellClass(col, i)\"\n [style.width]=\"col.width ?? null\"\n >\n @if (templateFor(col.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"cellContext(row)\"\n />\n } @else {\n {{ defaultCellText(row, col.key) }}\n }\n </td>\n }\n </tr>\n @if (isExpandable()) {\n <tr\n class=\"last:border-b-0\"\n [class.border-b]=\"isRowExpanded(row, i)\"\n [class.border-border]=\"isRowExpanded(row, i)\"\n [class.dark:border-white/10]=\"isRowExpanded(row, i)\"\n >\n <td class=\"p-0 align-top\" [attr.colspan]=\"columns().length + 1\">\n <div\n class=\"grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none\"\n [style.grid-template-rows]=\"\n isRowExpanded(row, i) ? '1fr' : '0fr'\n \"\n [attr.aria-hidden]=\"!isRowExpanded(row, i)\"\n [class.pointer-events-none]=\"!isRowExpanded(row, i)\"\n >\n <div\n class=\"min-h-0 overflow-hidden border-t border-border/70 bg-neutral-50 dark:border-white/10 dark:bg-white/[0.05]\"\n >\n <dl\n class=\"m-0 grid gap-x-6 gap-y-3 px-3 py-3 transition-opacity duration-200 ease-out motion-reduce:transition-none sm:grid-cols-2 lg:grid-cols-3\"\n [class.opacity-0]=\"!isRowExpanded(row, i)\"\n [class.opacity-100]=\"isRowExpanded(row, i)\"\n >\n @for (detail of rowDetailDefs(); track detail.label()) {\n <div class=\"min-w-0\">\n <dt\n class=\"m-0 text-caption font-medium text-neutral-500 dark:text-neutral-400\"\n >\n {{ detail.label() }}\n </dt>\n <dd\n class=\"m-0 mt-0.5 text-body-sm text-ink dark:text-white\"\n >\n <ng-container\n [ngTemplateOutlet]=\"detail.template\"\n [ngTemplateOutletContext]=\"cellContext(row)\"\n />\n </dd>\n </div>\n }\n </dl>\n </div>\n </div>\n </td>\n </tr>\n }\n }\n }\n }\n </tbody>\n </table>\n </div>\n\n @if (meta(); as pager) {\n <africanies-pagination\n [meta]=\"pager\"\n [loading]=\"paginationLoading()\"\n [disabled]=\"loading() && !paginationLoading()\"\n (pageChange)=\"pageChange.emit($event)\"\n (sizeChange)=\"sizeChange.emit($event)\"\n />\n }\n </div>\n `,\n})\nexport class TableComponent<T = unknown> {\n /**\n * When false, hides row expansion even if {@link RowDetailDefDirective}\n * templates are projected. Defaults to true.\n */\n readonly expandable = input(true, { transform: booleanAttribute });\n\n /**\n * Stable row id for expansion state. Defaults to the row index in `rows`.\n */\n readonly rowTrackBy = input<(row: T, index: number) => string | number>(\n (_row, index) => index,\n );\n\n /** Emitted when a row is expanded or collapsed. */\n readonly rowExpandChange = output<{ row: T; expanded: boolean }>();\n\n /** Column definitions (header chrome + keys). */\n readonly columns = input.required<TableColumn<T>[]>();\n\n /**\n * Row records to render. Empty arrays show {@link EmptyStateComponent} in\n * the body unless {@link loading} or {@link error} is set. Missing `data`\n * during load is treated as `[]`.\n */\n readonly rows = input.required<T[]>();\n\n /**\n * Optional current sort so header indicators stay in sync with the\n * server-side `order` param. Omitted / null means no column is active.\n */\n readonly sort = input<TableSortChange | null>(null);\n\n /**\n * Show a Refresh button above the table (top-left) once rows are on screen.\n * Hidden during in-grid empty/error — those use Retry in the body. Host refetches\n * from {@link refreshClick}.\n */\n readonly showRefresh = input(false, { transform: booleanAttribute });\n\n /** Label on the refresh trigger. Defaults to `Refresh`. */\n readonly refreshLabel = input('Refresh');\n\n /**\n * Background refetch in flight. Rows stay visible; the refresh icon spins.\n * Bind to a soft refetch flag (e.g. refresh button) — not page changes.\n * Prefer {@link loading} when the page of rows is changing.\n */\n readonly refreshing = input(false, { transform: booleanAttribute });\n\n /**\n * Page of data is loading (first load, shipping-mode switch, pagination,\n * page size). When rows are already on screen, the pager shows a spinner\n * and rows stay visible; when there are no rows (first load or the host\n * dropped STN/SFN rows after a mode switch), the body shows\n * {@link LoadingStateComponent}. Distinct from {@link refreshing}.\n */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Copy under the loading spinner. Defaults to `Loading…`. */\n readonly loadingLabel = input('Loading…');\n\n /**\n * Hard fetch failure. Empty rows → {@link ErrorStateComponent} in the body.\n * Rows still present → {@link ErrorIndicatorComponent} above the grid.\n * Retry emits {@link refreshClick}.\n */\n readonly error = input<string | null>(null);\n\n /**\n * Copy for the in-grid empty state when there are no rows and no error.\n */\n readonly emptyMessage = input('No results found.');\n\n /**\n * Show a Filters button above the table (top-right). Host should open\n * {@link FilterDrawerService} from {@link filterClick}.\n */\n readonly showFilter = input(false, { transform: booleanAttribute });\n\n /** Label on the filter trigger. Defaults to `Filters`. */\n readonly filterLabel = input('Filters');\n\n /**\n * Optional badge count on the filter trigger (active filters). Hidden when 0.\n */\n readonly filterCount = input(0, { transform: numberAttribute });\n\n /**\n * Show an Export button to the right of Filters. Host handles the download\n * from {@link exportClick}.\n */\n readonly showExport = input(false, { transform: booleanAttribute });\n\n /** Label on the export trigger. Defaults to `Export`. */\n readonly exportLabel = input('Export');\n\n /**\n * When set, embeds {@link PaginationComponent} under the grid. Host still\n * owns refetch via {@link pageChange} / {@link sizeChange} — rows are never\n * sliced here.\n */\n readonly meta = input<PaginationMetaModel | null>(null);\n\n /**\n * Emitted when a sortable header is activated. Consumers must refetch;\n * this component never sorts `rows` locally.\n */\n readonly sortChange = output<TableSortChange>();\n\n /** Emitted when the top-left Refresh control is clicked. */\n readonly refreshClick = output<void>();\n\n /** Emitted when the top-right Filters control is clicked. */\n readonly filterClick = output<void>();\n\n /** Emitted when the Export control is clicked. */\n readonly exportClick = output<void>();\n\n /**\n * Target 1-based page after prev/next. Host should refetch; this component\n * does not change `rows`.\n */\n readonly pageChange = output<number>();\n\n /**\n * New page size from the size dropdown. Host should refetch at page 1;\n * this component does not change `rows`.\n */\n readonly sizeChange = output<number>();\n\n /** Projected cell templates keyed by column. */\n private readonly cellDefs = contentChildren(CellDefDirective);\n\n /** Projected header cell templates keyed by column. */\n private readonly headerCellDefs = contentChildren(HeaderCellDefDirective);\n\n /** Projected label / value templates for expanded rows. */\n protected readonly rowDetailDefs = contentChildren(RowDetailDefDirective);\n\n private readonly expandedRowIds = signal<ReadonlySet<string>>(new Set());\n\n protected readonly rowList = computed(() => this.rows() ?? []);\n\n protected readonly isExpandable = computed(\n () => this.expandable() && this.rowDetailDefs().length > 0,\n );\n\n protected readonly colSpan = computed(\n () => this.columns().length + (this.isExpandable() ? 1 : 0),\n );\n\n protected readonly errorMessage = computed(\n () => this.error()?.trim() || 'Something went wrong.',\n );\n\n protected readonly staleError = computed(() => {\n const message = this.error()?.trim();\n if (!message || this.loading() || this.rowList().length === 0) {\n return null;\n }\n return message;\n });\n\n protected readonly bodyKind = computed(\n (): 'loading' | 'error' | 'empty' | 'rows' => {\n if (this.loading() && this.rowList().length === 0) {\n return 'loading';\n }\n if (this.error()?.trim() && this.rowList().length === 0) {\n return 'error';\n }\n if (this.rowList().length === 0) {\n return 'empty';\n }\n return 'rows';\n },\n );\n\n protected readonly paginationLoading = computed(\n () =>\n (this.loading() || this.refreshing()) && this.rowList().length > 0,\n );\n\n /** Top-left Refresh — only when rows are on screen (empty/error use in-body Retry). */\n protected readonly showToolbarRefresh = computed(\n () => this.showRefresh() && this.bodyKind() === 'rows',\n );\n\n protected readonly visibleRowIds = computed(() =>\n this.rowList().map((row, index) => this.rowId(row, index)),\n );\n\n protected readonly someRowsExpanded = computed(() => {\n const open = this.expandedRowIds();\n return this.visibleRowIds().some((id) => open.has(id));\n });\n\n /** Lookup map rebuilt when projected cell defs change. */\n private readonly cellTemplateMap = computed(() => {\n const map = new Map<string, TemplateRef<unknown>>();\n for (const def of this.cellDefs()) {\n map.set(def.africaniesCellDef(), def.template);\n }\n return map;\n });\n\n /** Lookup map rebuilt when projected header cell defs change. */\n private readonly headerCellTemplateMap = computed(() => {\n const map = new Map<string, TemplateRef<unknown>>();\n for (const def of this.headerCellDefs()) {\n map.set(def.africaniesHeaderCellDef(), def.template);\n }\n return map;\n });\n\n /**\n * Resolves the projected template for a column key, if any.\n *\n * @param key - {@link TableColumn.key} to look up.\n * @returns Matching template, or `null` for the plain-text fallback.\n */\n protected templateFor(key: string): TemplateRef<unknown> | null {\n return this.cellTemplateMap().get(key) ?? null;\n }\n\n /**\n * Resolves the projected header template for a column key, if any.\n * @param key\n */\n protected headerTemplateFor(key: string): TemplateRef<unknown> | null {\n return this.headerCellTemplateMap().get(key) ?? null;\n }\n\n /**\n * Builds the `let-row` context for a projected cell template.\n *\n * @param row - Current row record.\n * @returns NgTemplateOutlet context with `$implicit` set to `row`.\n */\n protected cellContext(row: T): { $implicit: T } {\n return { $implicit: row };\n }\n\n /**\n * Body row classes — row marker for hover styles, plus hide cell borders on\n * the last / expanded row.\n * @param row - Current row.\n * @param index - Index within {@link rows}.\n * @returns Tailwind class list.\n */\n protected bodyRowClass(row: T, index: number): string {\n if (this.isExpandable() && this.isRowExpanded(row, index)) {\n // Only the bottom edge — keep the top divider so the row still\n // separates from the row above.\n return 'africanies-table-row group [&>td]:border-b-0';\n }\n return 'africanies-table-row group last:[&>td]:border-b-0';\n }\n\n /**\n * Horizontal pin edge for a column. `key: 'actions'` sticks right unless\n * {@link TableColumn.sticky} opts out.\n *\n * @param col - Column definition.\n * @returns `'left'` / `'right'`, or `null` when the column scrolls with the grid.\n */\n protected stickyEdge(col: TableColumn<T>): 'left' | 'right' | null {\n if (col.sticky === false) {\n return null;\n }\n if (col.sticky === 'left' || col.sticky === 'right') {\n return col.sticky;\n }\n return col.key === 'actions' ? 'right' : null;\n }\n\n /**\n * Header classes for the expand/collapse trigger column (pinned left).\n * @returns Header class list.\n */\n protected expandHeaderClass(): string {\n return (\n 'w-10 border-b border-border px-2 py-3.5 dark:border-white/10 ' +\n this.stickyPinClass('left', 'head')\n );\n }\n\n /**\n * Body classes for the expand/collapse trigger column (pinned left).\n * Omits `border-b` like other sticky cells so the opaque fill does not\n * double-paint the row divider.\n * @param index - Index within {@link rows}.\n * @returns Body cell class list.\n */\n protected expandBodyClass(index: number): string {\n const prev = index > 0 ? this.rowList()[index - 1] : undefined;\n const afterExpanded =\n prev !== undefined && this.isRowExpanded(prev, index - 1);\n return (\n 'w-10 px-2 py-3.5 align-middle ' +\n this.stickyPinClass('left', 'body', index, afterExpanded)\n );\n }\n\n /**\n * Header cell classes, including sticky pin when set.\n * @param col - Column definition.\n * @returns Header class list.\n */\n protected headerCellClass(col: TableColumn<T>): string {\n return (\n 'border-b border-border whitespace-normal wrap-break-word px-3 py-3.5 font-medium text-neutral-600 dark:border-white/10 dark:text-neutral-400 ' +\n this.stickySurfaceClass(col, 'head')\n );\n }\n\n /**\n * Body cell classes, including sticky pin when set.\n * Sticky cells omit `border-b`: their opaque fill sits in a higher stacking\n * context, so a bottom border plus the next row's top shadow paint on the\n * same pixel and read brighter (especially in dark mode).\n * @param col - Column definition.\n * @param index - Index within {@link rows}.\n * @returns Body cell class list.\n */\n protected bodyCellClass(col: TableColumn<T>, index: number): string {\n const rowLine = this.stickyEdge(col)\n ? ''\n : 'border-b border-border dark:border-white/10 ';\n const prev = index > 0 ? this.rowList()[index - 1] : undefined;\n const afterExpanded =\n prev !== undefined && this.isRowExpanded(prev, index - 1);\n const wrap =\n col.key === 'actions'\n ? 'whitespace-nowrap '\n : 'whitespace-normal wrap-break-word ';\n return (\n rowLine +\n 'px-3 py-3.5 align-middle ' +\n wrap +\n this.stickySurfaceClass(col, 'body', index, afterExpanded)\n );\n }\n\n /**\n * Sticky pin utilities for a known edge (expand column or data column).\n * @param edge - Left or right pin.\n * @param surface - Header vs body fill tokens.\n * @param index - Body row index; unused for the header.\n * @param afterExpanded - Previous row is expanded — skip the top shadow\n * divider so the sticky column stays flush under the detail panel.\n * @returns Sticky utilities.\n */\n protected stickyPinClass(\n edge: 'left' | 'right',\n surface: 'head' | 'body',\n index = 0,\n afterExpanded = false,\n ): string {\n // Expand (left) sits above scrolling cells; actions (right) match.\n // Header needs a higher z so it stays above sticky body cells.\n const side =\n edge === 'right' ? 'sticky right-0 z-[1]' : 'sticky left-0 z-[1]';\n if (surface === 'head') {\n return `${side} z-[2] bg-background-welcome dark:bg-ink-950`;\n }\n const rowDivider =\n !afterExpanded && index > 0\n ? 'shadow-[0_-1px_0_0_#c9d5e1] dark:shadow-[0_-1px_0_0_rgba(255,255,255,0.1)]'\n : '';\n const fill = 'bg-white dark:bg-ink';\n return `${side} ${fill} ${rowDivider}`;\n }\n\n /**\n * Sticky pin plus an opaque fill matching the table surface, so scrolled\n * cells do not show through.\n * @param col - Column definition.\n * @param surface - Header vs body fill tokens.\n * @param index - Body row index; unused for the header.\n * @param afterExpanded - Previous row is expanded — skip the top shadow.\n * @returns Sticky utilities, or empty when the column scrolls.\n */\n protected stickySurfaceClass(\n col: TableColumn<T>,\n surface: 'head' | 'body',\n index = 0,\n afterExpanded = false,\n ): string {\n const edge = this.stickyEdge(col);\n if (!edge) {\n return '';\n }\n return this.stickyPinClass(edge, surface, index, afterExpanded);\n }\n\n /**\n * Stable id for a row — used for expand/collapse state.\n *\n * @param row - Current row.\n * @param index - Index within {@link rows}.\n * @returns String form of {@link rowTrackBy} for this row.\n */\n protected rowId(row: T, index: number): string {\n return String(this.rowTrackBy()(row, index));\n }\n\n /**\n * Whether a row's detail panel is open.\n * @param row - Current row.\n * @param index - Index within {@link rows}.\n * @returns True when this row's detail panel is expanded.\n */\n protected isRowExpanded(row: T, index: number): boolean {\n return this.expandedRowIds().has(this.rowId(row, index));\n }\n\n /**\n * Toggle expanded state for a row.\n * @param row\n * @param index\n */\n protected toggleRowExpanded(row: T, index: number): void {\n const id = this.rowId(row, index);\n const expanded = this.expandedRowIds().has(id);\n this.expandedRowIds.update((set) => {\n const next = new Set(set);\n if (expanded) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n this.rowExpandChange.emit({ row, expanded: !expanded });\n }\n\n /** Expand every visible row. */\n protected expandAllRows(): void {\n this.expandedRowIds.set(new Set(this.visibleRowIds()));\n }\n\n /** Collapse every visible row. */\n protected collapseAllRows(): void {\n this.expandedRowIds.set(new Set());\n }\n\n /**\n * Default cell text when no `africaniesCellDef` template is registered.\n *\n * WHY stringify via `String(...)`: keeps null/undefined visible as empty\n * rather than the literal words \"null\"/\"undefined\", while still showing\n * numbers and booleans without forcing consumers to template every column.\n *\n * @param row - Current row.\n * @param key - Column key into the row.\n * @returns Display string for the cell.\n */\n protected defaultCellText(row: T, key: string): string {\n const value = (row as Record<string, unknown>)[key];\n if (value === null || value === undefined) {\n return '';\n }\n return String(value);\n }\n\n /**\n * Glyph for the active sort column; empty for inactive sortable headers.\n *\n * @param key - Column key under the header button.\n * @returns Sort direction glyph (`↑` / `↓` / `↕`).\n */\n protected sortIndicator(key: string): string {\n const current = this.sort();\n if (!current || current.key !== key) {\n return '↕';\n }\n return current.direction === 'asc' ? '↑' : '↓';\n }\n\n /**\n * Toggles or starts sort for a column and emits {@link sortChange}.\n *\n * @param key - Sortable column key that was clicked.\n */\n protected onSortHeaderClick(key: string): void {\n const current = this.sort();\n const direction: TableSortChange['direction'] =\n current?.key === key && current.direction === 'asc' ? 'desc' : 'asc';\n this.sortChange.emit({ key, direction });\n }\n}\n","/**\n * Presentational table with template-based cells.\n */\nexport { type CellDefContext, CellDefDirective } from './cell-def.directive';\nexport { HeaderCellDefDirective } from './header-cell-def.directive';\nexport {\n type RowDetailDefContext,\n RowDetailDefDirective,\n} from './row-detail-def.directive';\nexport { TableComponent } from './table.component';\nexport { type TableColumn, type TableSortChange } from './table-column';\n","/**\n * Pagination control bound to API {@link PaginationMetaModel}.\n */\nexport { PaginationComponent } from './pagination.component';\nexport {\n DEFAULT_PAGE_SIZE,\n NOTIFICATION_PAGE_SIZE,\n PAGINATION_PAGE_SIZES,\n type PaginationPageSize,\n} from '@africanies/africanies-models';\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n/**\n * Implicit context for templates registered with {@link StepDefDirective}.\n *\n * Reserved for future step-local helpers; bodies typically ignore it and\n * bind parent component fields directly.\n */\nexport interface StepDefContext {\n /** Step key matching {@link StepDefinition.key}. */\n $implicit: string;\n}\n\n/**\n * Registers projected step body content against a step key for\n * {@link StepperComponent}.\n *\n * WHY the same pattern as {@link CellDefDirective}: the stepper owns header\n * navigation chrome, while each step's form/content stays fully\n * consumer-defined with no coupling into StepperComponent.\n *\n * @example\n * ```html\n * <ng-template africaniesStepDef=\"cargo\">\n * <app-cargo-form [(value)]=\"cargo\" />\n * </ng-template>\n * ```\n */\n@Directive({\n selector: '[africaniesStepDef]',\n standalone: true,\n})\nexport class StepDefDirective {\n /** Template projected as the active step body. */\n readonly template = inject(TemplateRef<StepDefContext>);\n\n /**\n * Step key this template binds to — must match a {@link StepDefinition.key}.\n */\n readonly africaniesStepDef = input.required<string>();\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n ElementRef,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\n\nimport { ModeColorService } from '@africanies/africanies-theme';\n\nimport { StepDefDirective } from './step-def.directive';\nimport { StepDefinition } from './step-definition';\n\nfunction prefersReducedMotion(): boolean {\n return (\n typeof matchMedia === 'function' &&\n matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\n/**\n * Multi-step wizard for form flows (e.g. shipment creation).\n *\n * Distinct from a status *timeline*: this component navigates wizard steps,\n * it does not display shipment delivery progress.\n *\n * Inputs: `steps`, `activeIndex`, and `linear` (default `true`). In linear\n * mode, header clicks only activate the current or a previous step; advance\n * with Next. Non-linear mode allows jumping to any step via its header.\n *\n * When `animateSteps` is true (default), the step body fades/slides via the\n * Web Animations API (skipped when the user prefers reduced motion).\n */\n@Component({\n selector: 'africanies-stepper',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: { class: 'block min-w-0' },\n styles: `\n .africanies-step-rail {\n scrollbar-width: thin;\n }\n .africanies-step-body {\n min-width: 0;\n overflow-x: clip;\n /* 2 px breathing room so focus-outline rings on edge fields are not clipped */\n padding-inline: 2px;\n margin-inline: -2px;\n }\n .africanies-step-pane {\n min-width: 0;\n will-change: opacity, transform;\n }\n `,\n template: `\n <div class=\"flex flex-col gap-5 text-ink dark:text-white\">\n <div class=\"flex flex-col gap-2\">\n <p\n class=\"m-0 text-caption font-medium uppercase tracking-wide text-neutral-500 dark:text-neutral-400\"\n >\n Step {{ activeIndex() + 1 }} of {{ steps().length }}\n <span\n class=\"normal-case tracking-normal text-neutral-400 dark:text-neutral-500\"\n >\n · {{ steps()[activeIndex()]?.label }}\n </span>\n </p>\n\n <div\n class=\"h-1 w-full overflow-hidden rounded-full bg-background-welcome dark:bg-white/10\"\n aria-hidden=\"true\"\n >\n <div\n class=\"h-full rounded-full transition-[width] duration-300 ease-out\"\n [class]=\"modeColor.classes().bg\"\n [style.width.%]=\"progressPercent()\"\n ></div>\n </div>\n\n <ol\n class=\"africanies-step-rail m-0 flex list-none items-start gap-1 overflow-x-auto p-0 pb-1\"\n role=\"list\"\n >\n @for (step of steps(); track step.key; let i = $index) {\n <li class=\"flex min-w-0 shrink-0 items-center gap-1\">\n <button\n type=\"button\"\n class=\"inline-flex max-w-38 items-center gap-2 rounded-lg px-2 py-1.5 text-left transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ink disabled:cursor-not-allowed\"\n [class]=\"headerButtonClass(i)\"\n [attr.aria-current]=\"i === activeIndex() ? 'step' : null\"\n [disabled]=\"!canActivate(i)\"\n (click)=\"onHeaderClick(i)\"\n >\n <span [class]=\"stepBadgeClass(i)\" aria-hidden=\"true\">\n @if (i < activeIndex()) {\n ✓\n } @else {\n {{ i + 1 }}\n }\n </span>\n <span class=\"truncate text-body-sm font-medium\">{{\n step.label\n }}</span>\n </button>\n @if (i < steps().length - 1) {\n <span\n class=\"hidden h-px w-4 shrink-0 bg-border sm:block dark:bg-white/15\"\n aria-hidden=\"true\"\n ></span>\n }\n </li>\n }\n </ol>\n </div>\n\n <div class=\"africanies-step-body\">\n @if (activeTemplate(); as tpl) {\n <div #stepPane class=\"africanies-step-pane\">\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"stepContext()\"\n />\n </div>\n }\n </div>\n </div>\n `,\n})\nexport class StepperComponent {\n protected readonly modeColor = inject(ModeColorService);\n\n readonly steps = input.required<StepDefinition[]>();\n readonly activeIndex = input.required<number>();\n readonly linear = input(true, { transform: booleanAttribute });\n readonly animateSteps = input(true, { transform: booleanAttribute });\n readonly activeIndexChange = output<number>();\n\n private readonly stepDefs = contentChildren(StepDefDirective);\n private readonly stepPane = viewChild<ElementRef<HTMLElement>>('stepPane');\n private readonly animatedIndex = signal<number | null>(null);\n\n private readonly stepTemplateMap = computed(() => {\n const map = new Map<string, TemplateRef<unknown>>();\n for (const def of this.stepDefs()) {\n map.set(def.africaniesStepDef(), def.template);\n }\n return map;\n });\n\n protected readonly activeTemplate = computed(() => {\n const step = this.steps()[this.activeIndex()];\n if (!step) {\n return null;\n }\n return this.stepTemplateMap().get(step.key) ?? null;\n });\n\n protected readonly stepContext = computed(() => {\n const step = this.steps()[this.activeIndex()];\n return { $implicit: step?.key ?? '' };\n });\n\n protected readonly progressPercent = computed(() => {\n const total = this.steps().length;\n if (total <= 0) {\n return 0;\n }\n return ((this.activeIndex() + 1) / total) * 100;\n });\n\n constructor() {\n afterRenderEffect(() => {\n if (!this.animateSteps()) {\n return;\n }\n const index = this.activeIndex();\n const el = this.stepPane()?.nativeElement;\n if (!el) {\n return;\n }\n const previous = this.animatedIndex();\n if (previous === index) {\n return;\n }\n this.animatedIndex.set(index);\n if (previous === null || prefersReducedMotion()) {\n return;\n }\n const forward = index > previous;\n el.animate(\n [\n {\n opacity: 0,\n transform: `translateX(${forward ? '1rem' : '-1rem'})`,\n },\n { opacity: 1, transform: 'translateX(0)' },\n ],\n {\n duration: 280,\n easing: 'cubic-bezier(0.22, 1, 0.36, 1)',\n fill: 'both',\n },\n );\n });\n }\n\n protected headerButtonClass(index: number): string {\n const active = index === this.activeIndex();\n const past = index < this.activeIndex();\n if (active) {\n return 'bg-background-welcome text-ink dark:bg-white/10 dark:text-white';\n }\n if (past) {\n return 'cursor-pointer text-ink hover:bg-background-welcome dark:text-white dark:hover:bg-white/10';\n }\n return 'opacity-40 text-neutral-500 dark:text-neutral-400';\n }\n\n protected stepBadgeClass(index: number): string {\n const base =\n 'inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full border text-body-sm font-medium';\n if (index <= this.activeIndex()) {\n const c = this.modeColor.classes();\n return `${base} ${c.border} ${c.bg} text-white`;\n }\n return `${base} border-border bg-white text-neutral-500 dark:border-white/20 dark:bg-ink-950 dark:text-neutral-400`;\n }\n\n protected canActivate(index: number): boolean {\n if (index === this.activeIndex()) {\n return true;\n }\n if (!this.linear()) {\n return true;\n }\n return index < this.activeIndex();\n }\n\n protected onHeaderClick(index: number): void {\n if (index === this.activeIndex()) {\n return;\n }\n if (!this.canActivate(index)) {\n return;\n }\n this.activeIndexChange.emit(index);\n }\n}\n","/**\n * Multi-step wizard for form / creation flows.\n */\nexport { type StepDefContext,StepDefDirective } from './step-def.directive';\nexport { type StepDefinition } from './step-definition';\nexport { StepperComponent } from './stepper.component';\n","import { NgModule } from '@angular/core';\n\nimport {\n ActionMenuComponent,\n ActionMenuTriggerDirective,\n} from '../action-menu';\nimport { AvatarComponent, AvatarMenuComponent } from '../avatar';\nimport { ButtonComponent } from '../button';\nimport { CopyButtonComponent } from '../copy-button';\n\nconst ACTIONS = [\n ButtonComponent,\n CopyButtonComponent,\n ActionMenuComponent,\n ActionMenuTriggerDirective,\n AvatarComponent,\n AvatarMenuComponent,\n] as const;\n\n/**\n * Button, copy-to-clipboard control, overflow action menu, and avatar menu.\n *\n * @example\n * ```ts\n * @NgModule({\n * imports: [AfricaniesActionsModule],\n * })\n * export class ToolbarModule {}\n * ```\n */\n@NgModule({\n imports: [...ACTIONS],\n exports: [...ACTIONS],\n})\nexport class AfricaniesActionsModule {}\n","import { NgModule } from '@angular/core';\n\nimport { AccordionComponent } from '../accordion';\nimport { AlertComponent } from '../alert';\nimport { ChipComponent } from '../chip';\nimport {\n AsyncStateComponent,\n EmptyStateComponent,\n ErrorIndicatorComponent,\n ErrorStateComponent,\n LoadingStateComponent,\n} from '../feedback';\n\nconst FEEDBACK = [\n AccordionComponent,\n LoadingStateComponent,\n ErrorStateComponent,\n ErrorIndicatorComponent,\n EmptyStateComponent,\n AsyncStateComponent,\n AlertComponent,\n ChipComponent,\n] as const;\n\n/**\n * Async feedback states, accordion panels, inline alert, and status chips.\n *\n * Toast stays out of this module — register {@link provideAfricaniesToasts} instead.\n *\n * @example\n * ```ts\n * @NgModule({\n * imports: [AfricaniesFeedbackModule],\n * })\n * export class ListPageModule {}\n * ```\n */\n@NgModule({\n imports: [...FEEDBACK],\n exports: [...FEEDBACK],\n})\nexport class AfricaniesFeedbackModule {}\n","import { NgModule } from '@angular/core';\n\nimport { AddressInputComponent } from '../forms/address-input';\nimport { CheckboxComponent } from '../forms/checkbox';\nimport { DatePickerComponent } from '../forms/date-picker';\nimport { FileUploadComponent } from '../forms/file-upload';\nimport { NumberInputComponent } from '../forms/number-input';\nimport { OtpInputComponent } from '../forms/otp-input';\nimport { RadioComponent } from '../forms/radio';\nimport { SelectComponent } from '../forms/select';\nimport { TextInputComponent } from '../forms/text-input';\nimport { TextareaComponent } from '../forms/textarea';\nimport { ToggleComponent } from '../forms/toggle';\n\nconst FORM_CONTROLS = [\n TextInputComponent,\n TextareaComponent,\n NumberInputComponent,\n SelectComponent,\n AddressInputComponent,\n CheckboxComponent,\n RadioComponent,\n ToggleComponent,\n DatePickerComponent,\n FileUploadComponent,\n OtpInputComponent,\n] as const;\n\n/**\n * All form controls in one import for apps that prefer NgModules.\n *\n * Components stay standalone — this module only re-exports them.\n *\n * @example\n * ```ts\n * @NgModule({\n * imports: [AfricaniesFormsModule],\n * })\n * export class ShipmentFormsModule {}\n * ```\n */\n@NgModule({\n imports: [...FORM_CONTROLS],\n exports: [...FORM_CONTROLS],\n})\nexport class AfricaniesFormsModule {}\n","import { NgModule } from '@angular/core';\n\nimport {\n InfoPopoverComponent,\n InfoPopoverContentDirective,\n InfoPopoverTriggerDirective,\n} from '../info-popover';\n\n/**\n * NgModule facade for {@link InfoPopoverComponent} and its trigger/content markers.\n *\n * Prefer importing the standalone pieces directly in modern apps:\n * ```ts\n * imports: [InfoPopoverComponent, InfoPopoverContentDirective, InfoPopoverTriggerDirective],\n * ```\n */\n@NgModule({\n imports: [\n InfoPopoverComponent,\n InfoPopoverContentDirective,\n InfoPopoverTriggerDirective,\n ],\n exports: [\n InfoPopoverComponent,\n InfoPopoverContentDirective,\n InfoPopoverTriggerDirective,\n ],\n})\nexport class AfricaniesInfoPopoverModule {}\n","import { NgModule } from '@angular/core';\n\nimport { AvatarComponent, AvatarMenuComponent } from '../avatar';\nimport { BrandLogoComponent } from '../brand';\nimport {\n AppShellComponent,\n AppShellHeaderComponent,\n AppShellHeaderEndDirective,\n AppShellHeaderSlotDirective,\n AppShellHeaderStartDirective,\n} from '../layout';\nimport { BreadcrumbComponent } from '../navigation/breadcrumb';\nimport { SegmentComponent } from '../navigation/segment';\nimport { ShippingModeSwitchComponent } from '../navigation/shipping-mode-switch';\nimport { SideNavComponent } from '../navigation/side-nav';\nimport { TabDefDirective, TabsComponent } from '../navigation/tabs';\n\nconst NAV = [\n AppShellComponent,\n AppShellHeaderComponent,\n AppShellHeaderEndDirective,\n AppShellHeaderSlotDirective,\n AppShellHeaderStartDirective,\n BrandLogoComponent,\n AvatarComponent,\n AvatarMenuComponent,\n BreadcrumbComponent,\n TabsComponent,\n TabDefDirective,\n SegmentComponent,\n ShippingModeSwitchComponent,\n SideNavComponent,\n] as const;\n\n/**\n * App shell, breadcrumb, tabs (+ `africaniesTabDef`), segment, side nav, shipping\n * mode switch, brand logo, avatar menu, and shell header chrome.\n *\n * @example\n * ```ts\n * @NgModule({\n * imports: [AfricaniesNavigationModule],\n * })\n * export class ShellModule {}\n * ```\n */\n@NgModule({\n imports: [...NAV],\n exports: [...NAV],\n})\nexport class AfricaniesNavigationModule {}\n","import { NgModule } from '@angular/core';\n\nimport { StepDefDirective, StepperComponent } from '../stepper';\n\nconst STEPPER = [StepperComponent, StepDefDirective] as const;\n\n/**\n * Stepper (+ `africaniesStepDef`).\n *\n * @example\n * ```ts\n * @NgModule({\n * imports: [AfricaniesStepperModule],\n * })\n * export class WizardModule {}\n * ```\n */\n@NgModule({\n imports: [...STEPPER],\n exports: [...STEPPER],\n})\nexport class AfricaniesStepperModule {}\n","import { NgModule } from '@angular/core';\n\nimport { PaginationComponent } from '../pagination';\nimport { CellDefDirective, RowDetailDefDirective, TableComponent } from '../table';\n\nconst DATA = [\n TableComponent,\n CellDefDirective,\n RowDetailDefDirective,\n PaginationComponent,\n] as const;\n\n/**\n * Table (+ `africaniesCellDef`) and pagination.\n *\n * @example\n * ```ts\n * @NgModule({\n * imports: [AfricaniesTableModule],\n * })\n * export class ShipmentsListModule {}\n * ```\n */\n@NgModule({\n imports: [...DATA],\n exports: [...DATA],\n})\nexport class AfricaniesTableModule {}\n","import { NgModule } from '@angular/core';\n\nimport {\n TooltipComponent,\n TooltipTriggerDirective,\n} from '../tooltip';\n\nconst TOOLTIP = [TooltipComponent, TooltipTriggerDirective] as const;\n\n/**\n * Tooltip (+ `africaniesTooltipTrigger`).\n *\n * @example\n * ```ts\n * @NgModule({\n * imports: [AfricaniesTooltipModule],\n * })\n * export class FormHintsModule {}\n * ```\n */\n@NgModule({\n imports: [...TOOLTIP],\n exports: [...TOOLTIP],\n})\nexport class AfricaniesTooltipModule {}\n","/**\n * NgModule facades that re-export related standalone components.\n *\n * Prefer importing individual standalones when tree-shaking matters; use these\n * modules when a feature area wants one import for a whole family.\n */\nexport { AfricaniesActionsModule } from './africanies-actions.module';\nexport { AfricaniesFeedbackModule } from './africanies-feedback.module';\nexport { AfricaniesFormsModule } from './africanies-forms.module';\nexport { AfricaniesInfoPopoverModule } from './africanies-info-popover.module';\nexport { AfricaniesNavigationModule } from './africanies-navigation.module';\nexport { AfricaniesStepperModule } from './africanies-stepper.module';\nexport { AfricaniesTableModule } from './africanies-table.module';\nexport { AfricaniesTooltipModule } from './africanies-tooltip.module';\n","/**\n * Public API for `@africanies/africanies-ui`.\n *\n * Overlay openers, async feedback states, form controls, navigation chrome,\n * table/pagination, stepper, and the button primitive.\n */\n\n// Button\nexport {\n ButtonComponent,\n type ButtonSize,\n type ButtonVariant,\n} from './lib/button';\n\n// Copy to clipboard\nexport { CopyButtonComponent } from './lib/copy-button';\n\n// Action menu (overflow / row actions)\nexport {\n ActionMenuComponent,\n ActionMenuTriggerDirective,\n type AfricaniesMenuItem,\n} from './lib/action-menu';\n\n// Feedback\nexport {\n AsyncStateComponent,\n EmptyStateComponent,\n ErrorIndicatorComponent,\n ErrorStateComponent,\n LoadingStateComponent,\n type LoadingStateMode,\n} from './lib/feedback';\n\n// Accordion (expandable bordered panels)\nexport {\n AccordionComponent,\n type AccordionSize,\n} from './lib/accordion';\n\n// Alert (inline banners — distinct from ErrorState / Toast)\nexport { AlertComponent, type AlertVariant } from './lib/alert';\n\n// Chip (compact status labels)\nexport {\n ChipComponent,\n type ChipSize,\n type ChipVariant,\n} from './lib/chip';\n\n// Carrier marks (delivery vendor logos)\nexport {\n CarrierLogoComponent,\n type CarrierLogoSize,\n type CarrierLogoSlug,\n deliveryVendorOptionsForStoredValue,\n deliveryVendorSelected,\n deliveryVendorSelectOptions,\n normalizeCarrierLogoSlug,\n} from './lib/carrier';\n\n// Content stack (title / subtitle / extra line)\nexport { ContentStackComponent } from './lib/content-stack';\n\n// Toast (transient stack — timed / persistent / HTTP-tagged)\nexport {\n provideAfricaniesToasts,\n TOAST_DURATION_MS,\n TOAST_ICONS,\n toastFingerprint,\n type ToastItem,\n ToastService,\n type ToastShowOptions,\n type ToastVariant,\n} from './lib/toast';\n\n// Tooltip (contextual help — default icon or custom trigger)\nexport {\n TooltipComponent,\n type TooltipPlacement,\n TooltipTriggerDirective,\n} from './lib/tooltip';\n\n// Info popover (hover card — optional title + projected body of any kind)\nexport {\n InfoPopoverComponent,\n InfoPopoverContentDirective,\n type InfoPopoverPlacement,\n InfoPopoverTriggerDirective,\n} from './lib/info-popover';\n\n// Filters (schema-driven list filter drawer)\nexport {\n type FilterDrawerData,\n FilterDrawerPanel,\n type FilterDrawerResult,\n FilterDrawerService,\n FilterQueryService,\n} from './lib/filters';\n\n/**\n * Re-export for consumers wiring `<africanies-async-state>` without a separate\n * `@africanies/africanies-models` import for this one type.\n */\nexport type { AsyncQueryStateModel } from '@africanies/africanies-models';\n\n/**\n * Filter schema / serialize helpers — re-exported so UI consumers can wire\n * drawers without a separate models import for the common path.\n */\nexport {\n clearFilterField,\n cloneFilterState,\n DEFAULT_FILTER_TRANSPORT,\n emptyFilterState,\n FILTER_CONFIGS,\n type FilterConfigId,\n type FilterFieldModel,\n type FilterFieldType,\n type FilterOptionModel,\n type FilterOptionsSource,\n type FilterParamsModel,\n type FilterQueryBag,\n filterQueryKeys,\n type FilterStateModel,\n FilterTransport,\n fromFilterParams,\n hasFilterParams,\n type ModuleFilterConfigModel,\n resetFilterState,\n resolveFilterTransport,\n shipmentTrackingItemFilterConfig,\n toFilterParams,\n trackShipmentsFilterConfig,\n updateShipmentsFilterConfig,\n usersFilterConfig,\n} from '@africanies/africanies-models';\n\n// Overlay\nexport {\n AfricaniesOverlayRef,\n ConfirmDialogComponent,\n type ConfirmOptions,\n ConfirmService,\n type ConfirmWork,\n DrawerService,\n MODAL_SIZE_PANEL_CLASS,\n type ModalOpenConfig,\n ModalService,\n type ModalSize,\n OVERLAY_DATA,\n OverlayFooterDirective,\n OverlayFrameComponent,\n OverlayHeaderDirective,\n type OverlayOpenConfig,\n provideAfricaniesUiOverlays,\n} from './lib/overlay';\n\n// Form controls\nexport {\n acceptLabels,\n type AddressComponent,\n AddressInputComponent,\n type AddressPlace,\n type AddressPrediction,\n CheckboxComponent,\n DatePickerComponent,\n fileExtensionLabel,\n fileMatchesAccept,\n FileUploadComponent,\n type FileUploadResult,\n type FileUploadVariant,\n GOOGLE_PLACES_CONFIG,\n type GooglePlacesConfig,\n GooglePlacesService,\n NumberInputComponent,\n OtpInputComponent,\n type OtpInputVariant,\n provideGooglePlaces,\n RadioComponent,\n type RadioOption,\n type SearchComboboxBadge,\n type SearchComboboxBadgeFn,\n SearchComboboxComponent,\n type SearchComboboxLabelFn,\n type SearchComboboxMarkFn,\n type SearchComboboxSearchFn,\n type SearchComboboxSubtitleFn,\n type SearchComboboxTrackFn,\n SelectComponent,\n type SelectCreateConfig,\n type SelectOption,\n type SelectSize,\n TextareaComponent,\n TextInputComponent,\n type TextInputType,\n ToggleComponent,\n} from './lib/forms';\n\n// Navigation (breadcrumb, tabs, segment, side-nav — optional RouterLink)\nexport {\n type AfricaniesNavItem,\n type AfricaniesSideNavItem,\n BreadcrumbComponent,\n buildBreadcrumbsFromSideNav,\n type ContentBackTarget,\n type HeaderBackTarget,\n isCatalogRootRoute,\n isNavItemActive,\n isNestedChildRoute,\n navItemUrlTree,\n normalizeNavPath,\n resolveCatalogRootLink,\n resolveContentBackTarget,\n resolveHeaderBackTarget,\n resolveParentPathFromRootSnapshot,\n SegmentComponent,\n ShippingModeSwitchComponent,\n SideNavComponent,\n type TabDefContext,\n TabDefDirective,\n TabsComponent,\n} from './lib/navigation';\n\n// Layout (app shell scaffold)\nexport {\n AppShellComponent,\n AppShellContentHeaderComponent,\n type AppShellContentWidth,\n AppShellHeaderComponent,\n type AppShellHeaderDensity,\n AppShellHeaderEndDirective,\n AppShellHeaderSlotDirective,\n AppShellHeaderStartDirective,\n type AppShellLayoutPreview,\n type HeaderGreeting,\n headerGreetingFirstName,\n type HeaderGreetingPeriod,\n headerGreetingPeriod,\n type HeaderWeather,\n type HeaderWeatherKind,\n PageHeaderComponent,\n pickHeaderGreeting,\n} from './lib/layout';\n\n// Brand\nexport {\n AFRICANIES_BRAND_LOGO_MINI_URL,\n AFRICANIES_BRAND_LOGO_URL,\n BrandLogoComponent,\n type BrandLogoSize,\n} from './lib/brand';\n\n// Avatar\nexport {\n AvatarComponent,\n AvatarMenuComponent,\n type AvatarSize,\n} from './lib/avatar';\n\n// Image (loading / fallback frame)\nexport {\n ImageComponent,\n type ImageFit,\n type ImageShape,\n} from './lib/image';\n\n// Notifications drawer\nexport {\n type AfricaniesNotification,\n type NotificationDrawerData,\n NotificationDrawerPanel,\n type NotificationDrawerResult,\n NotificationDrawerService,\n type NotificationPageResult,\n} from './lib/notifications';\n\n// Table\nexport {\n type CellDefContext,\n CellDefDirective,\n HeaderCellDefDirective,\n type RowDetailDefContext,\n RowDetailDefDirective,\n type TableColumn,\n TableComponent,\n type TableSortChange,\n} from './lib/table';\n\n// Pagination\nexport {\n DEFAULT_PAGE_SIZE,\n NOTIFICATION_PAGE_SIZE,\n PAGINATION_PAGE_SIZES,\n PaginationComponent,\n type PaginationPageSize,\n} from './lib/pagination';\n\n/**\n * Re-export so pagination consumers can type `meta` without a separate\n * `@africanies/africanies-models` import for this one type.\n */\nexport type { PaginationMetaModel } from '@africanies/africanies-models';\n\n// Stepper\nexport {\n type StepDefContext,\n StepDefDirective,\n type StepDefinition,\n StepperComponent,\n} from './lib/stepper';\n\n// Shared NgModules (re-export related standalones)\nexport {\n AfricaniesActionsModule,\n AfricaniesFeedbackModule,\n AfricaniesFormsModule,\n AfricaniesInfoPopoverModule,\n AfricaniesNavigationModule,\n AfricaniesStepperModule,\n AfricaniesTableModule,\n AfricaniesTooltipModule,\n} from './lib/modules';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["PLACEMENT_POSITIONS","prefersReducedMotion","DEFAULT_LINK_ACTIVE"],"mappings":"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"}