@africanies/angular-web-sdk 0.1.4 → 0.1.6

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 (101) hide show
  1. package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +456 -169
  2. package/.nx/cache/14876618240301288353/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -0
  3. package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/package.json +5 -5
  4. package/.nx/cache/{5741611231803799383 → 14876618240301288353}/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +100 -20
  5. package/.nx/cache/{1275815545780424169 → 17626862048742598274}/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +6 -0
  6. package/.nx/cache/17626862048742598274/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -0
  7. package/.nx/cache/{14153928176747262656 → 17626862048742598274}/dist/libs/africanies-theme/package.json +3 -3
  8. package/.nx/cache/{1275815545780424169 → 17626862048742598274}/dist/libs/africanies-theme/tailwind-preset.cjs +15 -7
  9. package/.nx/cache/{14153928176747262656 → 17626862048742598274}/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +10 -1
  10. package/.nx/cache/{13524438527920092277 → 9040451482998546630}/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +9 -44
  11. package/.nx/cache/9040451482998546630/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -0
  12. package/.nx/cache/{13524438527920092277 → 9040451482998546630}/dist/libs/africanies-core/package.json +3 -3
  13. package/.nx/cache/{13524438527920092277 → 9040451482998546630}/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +6 -5
  14. package/.nx/cache/run.json +19 -19
  15. package/.nx/cache/terminalOutputs/13555699813138069787 +6 -0
  16. package/.nx/cache/terminalOutputs/{12148417737220755248 → 14061940909886036014} +172 -174
  17. package/.nx/cache/terminalOutputs/{3064561615116090625 → 14876618240301288353} +7 -7
  18. package/.nx/cache/terminalOutputs/{1275815545780424169 → 17626862048742598274} +2 -2
  19. package/.nx/cache/terminalOutputs/7978448102466861029 +32 -0
  20. package/.nx/cache/terminalOutputs/{4011892767661954819 → 9040451482998546630} +1 -1
  21. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db +0 -0
  22. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db-shm +0 -0
  23. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db-wal +0 -0
  24. package/.nx/workspace-data/d/daemon.log +2370 -0
  25. package/.nx/workspace-data/d/server-process.json +2 -2
  26. package/.nx/workspace-data/file-map.json +3177 -3177
  27. package/.nx/workspace-data/nx_files.nxt +0 -0
  28. package/.nx/workspace-data/project-graph.json +2 -2
  29. package/apps/playground/src/app/app.routes.ts +15 -4
  30. package/apps/playground/src/app/app.ts +2 -2
  31. package/apps/playground/src/app/pages/home-page.ts +14 -14
  32. package/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +8 -43
  33. package/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -1
  34. package/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +6 -5
  35. package/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +11 -11
  36. package/libs/africanies-core/src/lib/http/api-client.ts +4 -18
  37. package/libs/africanies-core/src/lib/http/is-retryable-get-error.ts +8 -4
  38. package/libs/africanies-core/src/lib/query/provide-africanies-query-defaults.ts +5 -6
  39. package/package.json +1 -1
  40. package/.nx/cache/1275815545780424169/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +0 -1
  41. package/.nx/cache/1275815545780424169/dist/libs/africanies-theme/package.json +0 -36
  42. package/.nx/cache/1275815545780424169/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +0 -157
  43. package/.nx/cache/13524438527920092277/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +0 -1
  44. package/.nx/cache/14153928176747262656/dist/libs/africanies-theme/README.md +0 -46
  45. package/.nx/cache/14153928176747262656/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +0 -215
  46. package/.nx/cache/14153928176747262656/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +0 -1
  47. package/.nx/cache/14153928176747262656/dist/libs/africanies-theme/tailwind-preset.cjs +0 -245
  48. package/.nx/cache/18132311043100376919/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +0 -1
  49. package/.nx/cache/18132311043100376919/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +0 -5410
  50. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/README.md +0 -69
  51. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/assets/icons.sprite.svg +0 -1844
  52. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs +0 -832
  53. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs.map +0 -1
  54. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/package.json +0 -31
  55. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/types/africanies-africanies-icons.d.ts +0 -108
  56. package/.nx/cache/3064561615116090625/dist/libs/africanies-storage/README.md +0 -31
  57. package/.nx/cache/3064561615116090625/dist/libs/africanies-storage/fesm2022/africanies-africanies-storage.mjs +0 -243
  58. package/.nx/cache/3064561615116090625/dist/libs/africanies-storage/fesm2022/africanies-africanies-storage.mjs.map +0 -1
  59. package/.nx/cache/3064561615116090625/dist/libs/africanies-storage/package.json +0 -27
  60. package/.nx/cache/3064561615116090625/dist/libs/africanies-storage/types/africanies-africanies-storage.d.ts +0 -210
  61. package/.nx/cache/4011892767661954819/dist/libs/africanies-core/README.md +0 -85
  62. package/.nx/cache/4011892767661954819/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +0 -4546
  63. package/.nx/cache/4011892767661954819/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +0 -1
  64. package/.nx/cache/4011892767661954819/dist/libs/africanies-core/package.json +0 -32
  65. package/.nx/cache/4011892767661954819/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +0 -2740
  66. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/README.md +0 -68
  67. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/assets/brand/africanies-logo-mini.png +0 -0
  68. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/assets/brand/africanies-logo.png +0 -0
  69. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/assets/brand/africanies-logo.svg +0 -5
  70. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/assets/carriers/dhl.svg +0 -7
  71. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +0 -19088
  72. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +0 -1
  73. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/package.json +0 -36
  74. package/.nx/cache/6372470950255467653/dist/libs/africanies-models/README.md +0 -60
  75. package/.nx/cache/6372470950255467653/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs +0 -599
  76. package/.nx/cache/6372470950255467653/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs.map +0 -1
  77. package/.nx/cache/6372470950255467653/dist/libs/africanies-models/package.json +0 -24
  78. package/.nx/cache/6372470950255467653/dist/libs/africanies-models/types/africanies-africanies-models.d.ts +0 -1452
  79. package/.nx/cache/terminalOutputs/11768036696192889608 +0 -8
  80. package/.nx/cache/terminalOutputs/1227201614544602906 +0 -23
  81. package/.nx/cache/terminalOutputs/12538607787148205787 +0 -19
  82. package/.nx/cache/terminalOutputs/13524438527920092277 +0 -196
  83. package/.nx/cache/terminalOutputs/14153928176747262656 +0 -45
  84. package/.nx/cache/terminalOutputs/17404566492103808557 +0 -8
  85. package/.nx/cache/terminalOutputs/18132311043100376919 +0 -315
  86. package/.nx/cache/terminalOutputs/2436781291243085315 +0 -8
  87. package/.nx/cache/terminalOutputs/2782605790118376385 +0 -21
  88. package/.nx/cache/terminalOutputs/3681975492957101833 +0 -8
  89. package/.nx/cache/terminalOutputs/5741611231803799383 +0 -21
  90. package/.nx/cache/terminalOutputs/6037166070823946880 +0 -8
  91. package/.nx/cache/terminalOutputs/6372470950255467653 +0 -21
  92. package/.nx/cache/terminalOutputs/665190206482526466 +0 -175
  93. package/.nx/cache/terminalOutputs/7756595539965457927 +0 -23
  94. package/.nx/cache/terminalOutputs/9200013119269230075 +0 -8
  95. /package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/README.md +0 -0
  96. /package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/assets/brand/africanies-logo-mini.png +0 -0
  97. /package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/assets/brand/africanies-logo.png +0 -0
  98. /package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/assets/brand/africanies-logo.svg +0 -0
  99. /package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/assets/carriers/dhl.svg +0 -0
  100. /package/.nx/cache/{1275815545780424169 → 17626862048742598274}/dist/libs/africanies-theme/README.md +0 -0
  101. /package/.nx/cache/{13524438527920092277 → 9040451482998546630}/dist/libs/africanies-core/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@africanies/africanies-ui",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^22.0.0",
6
6
  "@angular/core": "^22.0.0",
@@ -8,10 +8,10 @@
8
8
  "@angular/forms": "^22.0.0",
9
9
  "@angular/router": "^22.0.0",
10
10
  "rxjs": "^7.8.0",
11
- "@africanies/africanies-models": "^0.0.2",
12
- "@africanies/africanies-icons": "^0.0.1",
13
- "@africanies/africanies-core": "^0.0.2",
14
- "@africanies/africanies-theme": "^0.0.1"
11
+ "@africanies/africanies-models": ">=0.0.2 <0.1.0",
12
+ "@africanies/africanies-icons": ">=0.0.1 <0.1.0",
13
+ "@africanies/africanies-core": ">=0.0.2 <0.1.0",
14
+ "@africanies/africanies-theme": ">=0.0.1 <0.1.0"
15
15
  },
16
16
  "sideEffects": false,
17
17
  "publishConfig": {
@@ -163,14 +163,31 @@ declare class CopyButtonComponent {
163
163
 
164
164
  /**
165
165
  * Option row for {@link ActionMenuComponent}.
166
+ *
167
+ * Set optional {@link routerLink} (and `queryParams` / `fragment`) so the row
168
+ * renders as an `<a href>` — right-click / ⌘-click can open in a new tab.
169
+ * Primary click still runs {@link onClick} when provided; otherwise the menu
170
+ * navigates via the router (same pattern as tabs / segment).
166
171
  */
167
172
  interface AfricaniesMenuItem {
168
173
  /** Visible label. */
169
174
  label: string;
170
- /** Invoked when the user activates this row (then the menu closes). */
171
- onClick: () => void;
175
+ /**
176
+ * Invoked on primary activation (then the menu closes).
177
+ * Optional when {@link routerLink} is set — the menu navigates instead.
178
+ */
179
+ onClick?: () => void;
172
180
  /** Optional leading icon from `@africanies/africanies-icons`. */
173
181
  icon?: IconName;
182
+ /**
183
+ * Optional Angular router link (`string` or commands array).
184
+ * When set, the row is an `<a>` with a real `href` for open-in-new-tab.
185
+ */
186
+ routerLink?: string | readonly unknown[];
187
+ /** Optional query params passed with {@link routerLink}. */
188
+ queryParams?: Record<string, unknown>;
189
+ /** Optional URL fragment with {@link routerLink}. */
190
+ fragment?: string;
174
191
  /** When true, the item cannot be activated. */
175
192
  disabled?: boolean;
176
193
  /** Destructive styling (e.g. Delete). */
@@ -186,6 +203,9 @@ interface AfricaniesMenuItem {
186
203
  * clipped by table `overflow`. Default trigger is a ghost ellipsis button;
187
204
  * project a custom control with {@link ActionMenuTriggerDirective}.
188
205
  *
206
+ * Items with {@link AfricaniesMenuItem.routerLink} render as anchors so users
207
+ * can right-click / modified-click to open in a new tab.
208
+ *
189
209
  * @example
190
210
  * ```html
191
211
  * <!-- Default icon trigger (table row) -->
@@ -201,7 +221,12 @@ interface AfricaniesMenuItem {
201
221
  * ```ts
202
222
  * rowActions(row: Shipment): AfricaniesMenuItem[] {
203
223
  * return [
204
- * { label: 'Open', icon: 'eye', onClick: () => this.open(row) },
224
+ * {
225
+ * label: 'Open',
226
+ * icon: 'eye',
227
+ * routerLink: ['/shipments', row.id],
228
+ * onClick: () => this.open(row),
229
+ * },
205
230
  * { label: 'Edit', icon: 'edit', onClick: () => this.edit(row) },
206
231
  * {
207
232
  * label: 'Delete',
@@ -215,6 +240,7 @@ interface AfricaniesMenuItem {
215
240
  * ```
216
241
  */
217
242
  declare class ActionMenuComponent {
243
+ private readonly router;
218
244
  protected readonly panelPositions: ConnectedPosition[];
219
245
  private readonly panelRef;
220
246
  private readonly projectedTrigger;
@@ -230,12 +256,19 @@ declare class ActionMenuComponent {
230
256
  protected readonly hasCustomTrigger: _angular_core.Signal<boolean>;
231
257
  protected itemDomId(index: number): string;
232
258
  protected itemClass(item: AfricaniesMenuItem, index: number): string;
259
+ protected hrefFor(item: AfricaniesMenuItem): string | null;
233
260
  protected onTriggerClick(event: MouseEvent): void;
234
261
  protected onTriggerKeydown(event: KeyboardEvent): void;
235
262
  protected onPanelKeydown(event: KeyboardEvent): void;
236
263
  protected onOutsideClick(event: MouseEvent): void;
237
264
  protected onOverlayDetach(): void;
265
+ /**
266
+ * Primary click on a routed item: in-app activate via {@link onClick} or
267
+ * router. Modified clicks keep native link behaviour (new tab).
268
+ */
269
+ protected onRoutedItemClick(event: MouseEvent, item: AfricaniesMenuItem): void;
238
270
  protected selectItem(item: AfricaniesMenuItem): void;
271
+ private activateItem;
239
272
  protected toggle(): void;
240
273
  protected openMenu(): void;
241
274
  protected close(): void;
@@ -522,6 +555,46 @@ declare class LoadingStateComponent {
522
555
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoadingStateComponent, "africanies-loading-state", never, { "message": { "alias": "message"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
523
556
  }
524
557
 
558
+ /**
559
+ * Visual density for {@link AccordionComponent}.
560
+ *
561
+ * - `md` — page sections (pay review, top-level cards)
562
+ * - `sm` — nested panels (e.g. export boxes inside a manifest box)
563
+ */
564
+ type AccordionSize = 'md' | 'sm';
565
+ /**
566
+ * Bordered expandable panel with animated fold — the pattern used on
567
+ * Manifest detail and Make Payment review.
568
+ *
569
+ * Parent owns open state via {@link open} (`model()` / `[(open)]`).
570
+ *
571
+ * @example
572
+ * ```html
573
+ * <africanies-accordion
574
+ * title="Customer Information"
575
+ * [open]="isOpen('customer')"
576
+ * (openChange)="onOpenChange('customer', $event)"
577
+ * >
578
+ * <dl>…</dl>
579
+ * </africanies-accordion>
580
+ * ```
581
+ */
582
+ declare class AccordionComponent {
583
+ /** Plain-text header. Prefer projected `[africaniesAccordionTitle]` for rich titles. */
584
+ readonly title: _angular_core.InputSignal<string>;
585
+ /** Whether the panel body is expanded. */
586
+ readonly open: _angular_core.ModelSignal<boolean>;
587
+ /** Padding / chevron density. */
588
+ readonly size: _angular_core.InputSignal<AccordionSize>;
589
+ protected readonly chevronSize: _angular_core.Signal<14 | 16>;
590
+ protected readonly shellClass: _angular_core.Signal<"rounded-lg border border-border dark:border-white/10" | "rounded-xl border border-border dark:border-white/10">;
591
+ protected readonly triggerClass: _angular_core.Signal<"flex w-full items-center justify-between gap-3 px-3 py-2 text-left text-ink dark:text-white" | "flex w-full items-center justify-between gap-3 px-4 py-3 text-left text-ink dark:text-white">;
592
+ protected readonly bodyClass: _angular_core.Signal<"border-t border-border px-3 py-2 dark:border-white/10" | "border-t border-border px-4 py-3 dark:border-white/10">;
593
+ protected toggle(): void;
594
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionComponent, never>;
595
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AccordionComponent, "africanies-accordion", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["[africaniesAccordionTitle]", "*"], true, never>;
596
+ }
597
+
525
598
  /**
526
599
  * Visual tone for {@link AlertComponent}.
527
600
  *
@@ -4780,9 +4853,11 @@ interface TableSortChange {
4780
4853
  * **Sticky columns:** a column with `key: 'actions'` stays pinned to the
4781
4854
  * right while the grid scrolls horizontally. The expand trigger column pins
4782
4855
  * to the left when rows are expandable. Override with
4783
- * {@link TableColumn.sticky}.
4856
+ * {@link TableColumn.sticky}. Sticky columns use a slightly thicker bottom
4857
+ * border (and opaque fill) so dividers stay visible while scrolling.
4784
4858
  */
4785
4859
  declare class TableComponent<T = unknown> {
4860
+ protected readonly modeColor: ModeColorService;
4786
4861
  /**
4787
4862
  * When false, hides row expansion even if {@link RowDetailDefDirective}
4788
4863
  * templates are projected. Defaults to true.
@@ -4932,6 +5007,17 @@ declare class TableComponent<T = unknown> {
4932
5007
  protected cellContext(row: T): {
4933
5008
  $implicit: T;
4934
5009
  };
5010
+ /**
5011
+ * Header row chrome. Soft fill lives on each `th` ({@link headerSoftClass})
5012
+ * so sticky columns do not double-tint and paint over neighbor labels.
5013
+ * @returns Header row class list.
5014
+ */
5015
+ protected headerRowClass(): string;
5016
+ /**
5017
+ * Opaque mode soft fill for header cells (sticky-safe in dark mode).
5018
+ * @returns Soft solid background utilities.
5019
+ */
5020
+ protected headerSoftClass(): string;
4935
5021
  /**
4936
5022
  * Body row classes — row marker for hover styles, plus hide cell borders on
4937
5023
  * the last / expanded row.
@@ -4955,8 +5041,8 @@ declare class TableComponent<T = unknown> {
4955
5041
  protected expandHeaderClass(): string;
4956
5042
  /**
4957
5043
  * Body classes for the expand/collapse trigger column (pinned left).
4958
- * Omits `border-b` like other sticky cells so the opaque fill does not
4959
- * double-paint the row divider.
5044
+ * Uses a slightly thicker bottom border than scrolling cells so the
5045
+ * sticky fill still reads a clear divider (no top-shadow fallback).
4960
5046
  * @param index - Index within {@link rows}.
4961
5047
  * @returns Body cell class list.
4962
5048
  */
@@ -4969,9 +5055,8 @@ declare class TableComponent<T = unknown> {
4969
5055
  protected headerCellClass(col: TableColumn<T>): string;
4970
5056
  /**
4971
5057
  * Body cell classes, including sticky pin when set.
4972
- * Sticky cells omit `border-b`: their opaque fill sits in a higher stacking
4973
- * context, so a bottom border plus the next row's top shadow paint on the
4974
- * same pixel and read brighter (especially in dark mode).
5058
+ * Sticky expand/actions columns use a 1.5px bottom border; scrolling cells
5059
+ * stay at 1px. Expanded rows drop the bottom border (see {@link bodyRowClass}).
4975
5060
  * @param col - Column definition.
4976
5061
  * @param index - Index within {@link rows}.
4977
5062
  * @returns Body cell class list.
@@ -4981,22 +5066,17 @@ declare class TableComponent<T = unknown> {
4981
5066
  * Sticky pin utilities for a known edge (expand column or data column).
4982
5067
  * @param edge - Left or right pin.
4983
5068
  * @param surface - Header vs body fill tokens.
4984
- * @param index - Body row index; unused for the header.
4985
- * @param afterExpanded - Previous row is expanded — skip the top shadow
4986
- * divider so the sticky column stays flush under the detail panel.
4987
5069
  * @returns Sticky utilities.
4988
5070
  */
4989
- protected stickyPinClass(edge: 'left' | 'right', surface: 'head' | 'body', index?: number, afterExpanded?: boolean): string;
5071
+ protected stickyPinClass(edge: 'left' | 'right', surface: 'head' | 'body'): string;
4990
5072
  /**
4991
5073
  * Sticky pin plus an opaque fill matching the table surface, so scrolled
4992
5074
  * cells do not show through.
4993
5075
  * @param col - Column definition.
4994
5076
  * @param surface - Header vs body fill tokens.
4995
- * @param index - Body row index; unused for the header.
4996
- * @param afterExpanded - Previous row is expanded — skip the top shadow.
4997
5077
  * @returns Sticky utilities, or empty when the column scrolls.
4998
5078
  */
4999
- protected stickySurfaceClass(col: TableColumn<T>, surface: 'head' | 'body', index?: number, afterExpanded?: boolean): string;
5079
+ protected stickySurfaceClass(col: TableColumn<T>, surface: 'head' | 'body'): string;
5000
5080
  /**
5001
5081
  * Stable id for a row — used for expand/collapse state.
5002
5082
  *
@@ -5286,7 +5366,7 @@ declare class AfricaniesActionsModule {
5286
5366
  }
5287
5367
 
5288
5368
  /**
5289
- * Async feedback states, inline alert, and status chips.
5369
+ * Async feedback states, accordion panels, inline alert, and status chips.
5290
5370
  *
5291
5371
  * Toast stays out of this module — register {@link provideAfricaniesToasts} instead.
5292
5372
  *
@@ -5300,7 +5380,7 @@ declare class AfricaniesActionsModule {
5300
5380
  */
5301
5381
  declare class AfricaniesFeedbackModule {
5302
5382
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AfricaniesFeedbackModule, never>;
5303
- static ɵmod: _angular_core.ɵɵNgModuleDeclaration<AfricaniesFeedbackModule, never, [typeof LoadingStateComponent, typeof ErrorStateComponent, typeof ErrorIndicatorComponent, typeof EmptyStateComponent, typeof AsyncStateComponent, typeof AlertComponent, typeof ChipComponent], [typeof LoadingStateComponent, typeof ErrorStateComponent, typeof ErrorIndicatorComponent, typeof EmptyStateComponent, typeof AsyncStateComponent, typeof AlertComponent, typeof ChipComponent]>;
5383
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<AfricaniesFeedbackModule, never, [typeof AccordionComponent, typeof LoadingStateComponent, typeof ErrorStateComponent, typeof ErrorIndicatorComponent, typeof EmptyStateComponent, typeof AsyncStateComponent, typeof AlertComponent, typeof ChipComponent], [typeof AccordionComponent, typeof LoadingStateComponent, typeof ErrorStateComponent, typeof ErrorIndicatorComponent, typeof EmptyStateComponent, typeof AsyncStateComponent, typeof AlertComponent, typeof ChipComponent]>;
5304
5384
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<AfricaniesFeedbackModule>;
5305
5385
  }
5306
5386
 
@@ -5406,5 +5486,5 @@ declare class AfricaniesTooltipModule {
5406
5486
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<AfricaniesTooltipModule>;
5407
5487
  }
5408
5488
 
5409
- export { AFRICANIES_BRAND_LOGO_MINI_URL, AFRICANIES_BRAND_LOGO_URL, ActionMenuComponent, ActionMenuTriggerDirective, AddressInputComponent, AfricaniesActionsModule, AfricaniesFeedbackModule, AfricaniesFormsModule, AfricaniesInfoPopoverModule, AfricaniesNavigationModule, AfricaniesOverlayRef, AfricaniesStepperModule, AfricaniesTableModule, AfricaniesTooltipModule, AlertComponent, AppShellComponent, AppShellContentHeaderComponent, AppShellHeaderComponent, AppShellHeaderEndDirective, AppShellHeaderSlotDirective, AppShellHeaderStartDirective, AsyncStateComponent, AvatarComponent, AvatarMenuComponent, BrandLogoComponent, BreadcrumbComponent, ButtonComponent, CarrierLogoComponent, CellDefDirective, CheckboxComponent, ChipComponent, ConfirmDialogComponent, ConfirmService, ContentStackComponent, CopyButtonComponent, DatePickerComponent, DrawerService, EmptyStateComponent, ErrorIndicatorComponent, ErrorStateComponent, FileUploadComponent, FilterDrawerPanel, FilterDrawerService, FilterQueryService, GOOGLE_PLACES_CONFIG, GooglePlacesService, HeaderCellDefDirective, ImageComponent, InfoPopoverComponent, InfoPopoverContentDirective, InfoPopoverTriggerDirective, LoadingStateComponent, MODAL_SIZE_PANEL_CLASS, ModalService, NotificationDrawerPanel, NotificationDrawerService, NumberInputComponent, OVERLAY_DATA, OtpInputComponent, OverlayFooterDirective, OverlayFrameComponent, OverlayHeaderDirective, PageHeaderComponent, PaginationComponent, RadioComponent, RowDetailDefDirective, SearchComboboxComponent, SegmentComponent, SelectComponent, ShippingModeSwitchComponent, SideNavComponent, StepDefDirective, StepperComponent, TOAST_DURATION_MS, TOAST_ICONS, TabDefDirective, TableComponent, TabsComponent, TextInputComponent, TextareaComponent, ToastService, ToggleComponent, TooltipComponent, TooltipTriggerDirective, acceptLabels, buildBreadcrumbsFromSideNav, deliveryVendorOptionsForStoredValue, deliveryVendorSelectOptions, deliveryVendorSelected, fileExtensionLabel, fileMatchesAccept, headerGreetingFirstName, headerGreetingPeriod, isCatalogRootRoute, isNavItemActive, isNestedChildRoute, navItemUrlTree, normalizeCarrierLogoSlug, normalizeNavPath, pickHeaderGreeting, provideAfricaniesToasts, provideAfricaniesUiOverlays, provideGooglePlaces, resolveCatalogRootLink, resolveContentBackTarget, resolveHeaderBackTarget, resolveParentPathFromRootSnapshot, toastFingerprint };
5410
- export type { AddressComponent, AddressPlace, AddressPrediction, AfricaniesMenuItem, AfricaniesNavItem, AfricaniesNotification, AfricaniesSideNavItem, AlertVariant, AppShellContentWidth, AppShellHeaderDensity, AppShellLayoutPreview, AvatarSize, BrandLogoSize, ButtonSize, ButtonVariant, CarrierLogoSize, CarrierLogoSlug, CellDefContext, ChipSize, ChipVariant, ConfirmOptions, ConfirmWork, ContentBackTarget, FileUploadResult, FileUploadVariant, FilterDrawerData, FilterDrawerResult, GooglePlacesConfig, HeaderBackTarget, HeaderGreeting, HeaderGreetingPeriod, HeaderWeather, HeaderWeatherKind, ImageFit, ImageShape, InfoPopoverPlacement, LoadingStateMode, ModalOpenConfig, ModalSize, NotificationDrawerData, NotificationDrawerResult, NotificationPageResult, OtpInputVariant, OverlayOpenConfig, RadioOption, RowDetailDefContext, SearchComboboxBadge, SearchComboboxBadgeFn, SearchComboboxLabelFn, SearchComboboxMarkFn, SearchComboboxSearchFn, SearchComboboxSubtitleFn, SearchComboboxTrackFn, SelectCreateConfig, SelectOption, SelectSize, StepDefContext, StepDefinition, TabDefContext, TableColumn, TableSortChange, TextInputType, ToastItem, ToastShowOptions, ToastVariant, TooltipPlacement };
5489
+ export { AFRICANIES_BRAND_LOGO_MINI_URL, AFRICANIES_BRAND_LOGO_URL, AccordionComponent, ActionMenuComponent, ActionMenuTriggerDirective, AddressInputComponent, AfricaniesActionsModule, AfricaniesFeedbackModule, AfricaniesFormsModule, AfricaniesInfoPopoverModule, AfricaniesNavigationModule, AfricaniesOverlayRef, AfricaniesStepperModule, AfricaniesTableModule, AfricaniesTooltipModule, AlertComponent, AppShellComponent, AppShellContentHeaderComponent, AppShellHeaderComponent, AppShellHeaderEndDirective, AppShellHeaderSlotDirective, AppShellHeaderStartDirective, AsyncStateComponent, AvatarComponent, AvatarMenuComponent, BrandLogoComponent, BreadcrumbComponent, ButtonComponent, CarrierLogoComponent, CellDefDirective, CheckboxComponent, ChipComponent, ConfirmDialogComponent, ConfirmService, ContentStackComponent, CopyButtonComponent, DatePickerComponent, DrawerService, EmptyStateComponent, ErrorIndicatorComponent, ErrorStateComponent, FileUploadComponent, FilterDrawerPanel, FilterDrawerService, FilterQueryService, GOOGLE_PLACES_CONFIG, GooglePlacesService, HeaderCellDefDirective, ImageComponent, InfoPopoverComponent, InfoPopoverContentDirective, InfoPopoverTriggerDirective, LoadingStateComponent, MODAL_SIZE_PANEL_CLASS, ModalService, NotificationDrawerPanel, NotificationDrawerService, NumberInputComponent, OVERLAY_DATA, OtpInputComponent, OverlayFooterDirective, OverlayFrameComponent, OverlayHeaderDirective, PageHeaderComponent, PaginationComponent, RadioComponent, RowDetailDefDirective, SearchComboboxComponent, SegmentComponent, SelectComponent, ShippingModeSwitchComponent, SideNavComponent, StepDefDirective, StepperComponent, TOAST_DURATION_MS, TOAST_ICONS, TabDefDirective, TableComponent, TabsComponent, TextInputComponent, TextareaComponent, ToastService, ToggleComponent, TooltipComponent, TooltipTriggerDirective, acceptLabels, buildBreadcrumbsFromSideNav, deliveryVendorOptionsForStoredValue, deliveryVendorSelectOptions, deliveryVendorSelected, fileExtensionLabel, fileMatchesAccept, headerGreetingFirstName, headerGreetingPeriod, isCatalogRootRoute, isNavItemActive, isNestedChildRoute, navItemUrlTree, normalizeCarrierLogoSlug, normalizeNavPath, pickHeaderGreeting, provideAfricaniesToasts, provideAfricaniesUiOverlays, provideGooglePlaces, resolveCatalogRootLink, resolveContentBackTarget, resolveHeaderBackTarget, resolveParentPathFromRootSnapshot, toastFingerprint };
5490
+ export type { AccordionSize, AddressComponent, AddressPlace, AddressPrediction, AfricaniesMenuItem, AfricaniesNavItem, AfricaniesNotification, AfricaniesSideNavItem, AlertVariant, AppShellContentWidth, AppShellHeaderDensity, AppShellLayoutPreview, AvatarSize, BrandLogoSize, ButtonSize, ButtonVariant, CarrierLogoSize, CarrierLogoSlug, CellDefContext, ChipSize, ChipVariant, ConfirmOptions, ConfirmWork, ContentBackTarget, FileUploadResult, FileUploadVariant, FilterDrawerData, FilterDrawerResult, GooglePlacesConfig, HeaderBackTarget, HeaderGreeting, HeaderGreetingPeriod, HeaderWeather, HeaderWeatherKind, ImageFit, ImageShape, InfoPopoverPlacement, LoadingStateMode, ModalOpenConfig, ModalSize, NotificationDrawerData, NotificationDrawerResult, NotificationPageResult, OtpInputVariant, OverlayOpenConfig, RadioOption, RowDetailDefContext, SearchComboboxBadge, SearchComboboxBadgeFn, SearchComboboxLabelFn, SearchComboboxMarkFn, SearchComboboxSearchFn, SearchComboboxSubtitleFn, SearchComboboxTrackFn, SelectCreateConfig, SelectOption, SelectSize, StepDefContext, StepDefinition, TabDefContext, TableColumn, TableSortChange, TextInputType, ToastItem, ToastShowOptions, ToastVariant, TooltipPlacement };
@@ -17,10 +17,12 @@ import { STORAGE_TOKEN, AFRICANIES_THEME_KEY } from '@africanies/africanies-stor
17
17
  * SFN (export / green):
18
18
  * text-export bg-export bg-export-subtle bg-export-light border-export
19
19
  * hover:bg-export-light hover:bg-export-subtle dark:bg-export/15 dark:hover:bg-export/15
20
+ * dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]
20
21
  *
21
22
  * STN (import / orange):
22
23
  * text-import bg-import bg-import-subtle bg-import-light border-import
23
24
  * hover:bg-import-light hover:bg-import-subtle dark:bg-import/15 dark:hover:bg-import/15
25
+ * dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]
24
26
  */
25
27
  const MODE_COLOR_SAFELIST = [
26
28
  'text-export',
@@ -32,6 +34,7 @@ const MODE_COLOR_SAFELIST = [
32
34
  'hover:bg-export-subtle',
33
35
  'dark:bg-export/15',
34
36
  'dark:hover:bg-export/15',
37
+ 'dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]',
35
38
  'text-import',
36
39
  'bg-import',
37
40
  'bg-import-subtle',
@@ -41,6 +44,7 @@ const MODE_COLOR_SAFELIST = [
41
44
  'hover:bg-import-subtle',
42
45
  'dark:bg-import/15',
43
46
  'dark:hover:bg-import/15',
47
+ 'dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]',
44
48
  ];
45
49
 
46
50
  /**
@@ -76,6 +80,7 @@ class ModeColorService {
76
80
  primary: 'bg-export text-white border-transparent hover:bg-export-light',
77
81
  ghostPrimary: 'bg-transparent text-export border-transparent hover:bg-export-subtle dark:hover:bg-export/15',
78
82
  soft: 'bg-export-subtle dark:bg-export/15',
83
+ softSolid: 'bg-export-subtle dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]',
79
84
  softHover: 'hover:bg-export-subtle dark:hover:bg-export/15',
80
85
  };
81
86
  }
@@ -87,6 +92,7 @@ class ModeColorService {
87
92
  primary: 'bg-import text-white border-transparent hover:bg-import-light',
88
93
  ghostPrimary: 'bg-transparent text-import border-transparent hover:bg-import-subtle dark:hover:bg-import/15',
89
94
  soft: 'bg-import-subtle dark:bg-import/15',
95
+ softSolid: 'bg-import-subtle dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]',
90
96
  softHover: 'hover:bg-import-subtle dark:hover:bg-import/15',
91
97
  };
92
98
  }, /* @ts-ignore */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"africanies-africanies-theme.mjs","sources":["../../../../libs/africanies-theme/src/lib/mode-color.safelist.ts","../../../../libs/africanies-theme/src/lib/mode-color.service.ts","../../../../libs/africanies-theme/src/lib/theme.service.ts","../../../../libs/africanies-theme/src/africanies-africanies-theme.ts"],"sourcesContent":["/**\n * Tailwind safelist side-effect for shipping-mode color utilities.\n *\n * WHY this file exists: JIT/content scanning only keeps class names that appear\n * as *literal strings* in scanned sources. {@link ModeColorService} already\n * returns these literals, but keeping a dedicated comment list makes the\n * contract obvious for consumers who configure `safelist` or purge plugins.\n *\n * Do not rename these strings without updating ModeColorService and THEME.md.\n *\n * SFN (export / green):\n * text-export bg-export bg-export-subtle bg-export-light border-export\n * hover:bg-export-light hover:bg-export-subtle dark:bg-export/15 dark:hover:bg-export/15\n * dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]\n *\n * STN (import / orange):\n * text-import bg-import bg-import-subtle bg-import-light border-import\n * hover:bg-import-light hover:bg-import-subtle dark:bg-import/15 dark:hover:bg-import/15\n * dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]\n */\nexport const MODE_COLOR_SAFELIST = [\n 'text-export',\n 'bg-export',\n 'bg-export-subtle',\n 'bg-export-light',\n 'border-export',\n 'hover:bg-export-light',\n 'hover:bg-export-subtle',\n 'dark:bg-export/15',\n 'dark:hover:bg-export/15',\n 'dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]',\n 'text-import',\n 'bg-import',\n 'bg-import-subtle',\n 'bg-import-light',\n 'border-import',\n 'hover:bg-import-light',\n 'hover:bg-import-subtle',\n 'dark:bg-import/15',\n 'dark:hover:bg-import/15',\n 'dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]',\n] as const;\n","import { computed, inject, Injectable } from '@angular/core';\n\nimport { ShippingModeService } from '@africanies/africanies-core';\n\n/**\n * Tailwind class bundle for the active shipping mode (SFN export / STN import).\n *\n * Use these for **primary** product chrome: CTAs, selected controls, progress,\n * and accent text. Semantic colors (danger / warning) stay mode-independent.\n */\nexport interface ModeColorClasses {\n /** Text color utility, e.g. `text-export`. */\n text: string;\n /** Solid background utility, e.g. `bg-export`. */\n bg: string;\n /** Soft background utility, e.g. `bg-export-subtle`. */\n bgSubtle: string;\n /** Border matching the mode accent, e.g. `border-export`. */\n border: string;\n /**\n * Filled primary CTA — `variant=\"primary\"` on buttons.\n * Includes hover utility as a literal so Tailwind keeps it.\n */\n primary: string;\n /**\n * Transparent / text-only CTA — `variant=\"ghost-primary\"` on buttons.\n * Mode accent text + soft hover fill.\n */\n ghostPrimary: string;\n /**\n * Soft highlight for selected / active rows (works in dark mode).\n * Dark uses a translucent tint — fine over solid surfaces, not for\n * sticky overlays (see {@link softSolid}).\n */\n soft: string;\n /**\n * Opaque soft fill — same tint as {@link soft}, but dark mode mixes into\n * ink so scrolled content cannot show through (sticky table headers/cells).\n */\n softSolid: string;\n /**\n * Soft hover highlight for menus and lists.\n */\n softHover: string;\n}\n\n/**\n * Maps {@link ShippingModeService} to mode-accent Tailwind classes.\n *\n * - **SFN** → export green is primary\n * - **STN** → import orange is primary\n *\n * WHY literal class strings: Tailwind's scanner cannot see dynamically built\n * names like `` `text-${token}` ``. Returning full literals (`text-export`, …)\n * keeps utilities in the compiled CSS. See {@link MODE_COLOR_SAFELIST}.\n *\n * @example\n * ```html\n * @let colors = modeColor.classes();\n * <button type=\"button\" [class]=\"colors.primary\">Save</button>\n * <span [class]=\"colors.text\">Mode accent</span>\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ModeColorService {\n private readonly shippingMode = inject(ShippingModeService);\n\n /**\n * Mode-dependent utility classes. Recomputes when shipping mode changes.\n */\n readonly classes = computed<ModeColorClasses>(() => {\n // Literal strings required for Tailwind content detection — do not interpolate.\n if (this.shippingMode.mode() === 'sfn') {\n return {\n text: 'text-export',\n bg: 'bg-export',\n bgSubtle: 'bg-export-subtle',\n border: 'border-export',\n primary:\n 'bg-export text-white border-transparent hover:bg-export-light',\n ghostPrimary:\n 'bg-transparent text-export border-transparent hover:bg-export-subtle dark:hover:bg-export/15',\n soft: 'bg-export-subtle dark:bg-export/15',\n softSolid:\n 'bg-export-subtle dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]',\n softHover: 'hover:bg-export-subtle dark:hover:bg-export/15',\n };\n }\n return {\n text: 'text-import',\n bg: 'bg-import',\n bgSubtle: 'bg-import-subtle',\n border: 'border-import',\n primary:\n 'bg-import text-white border-transparent hover:bg-import-light',\n ghostPrimary:\n 'bg-transparent text-import border-transparent hover:bg-import-subtle dark:hover:bg-import/15',\n soft: 'bg-import-subtle dark:bg-import/15',\n softSolid:\n 'bg-import-subtle dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]',\n softHover: 'hover:bg-import-subtle dark:hover:bg-import/15',\n };\n });\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable, signal } from '@angular/core';\n\nimport { AFRICANIES_THEME_KEY, STORAGE_TOKEN } from '@africanies/africanies-storage';\n\nimport type { Theme } from './theme.types';\n\n/**\n * Application light/dark theme preference.\n *\n * WHY signals (not BehaviorSubject): theme is synchronous UI state read from\n * templates and other services; a signal avoids RxJS subscription boilerplate\n * and matches Angular 22 change detection. Persistence goes through\n * {@link STORAGE_TOKEN} so tests can swap storage without touching `localStorage`.\n *\n * Applies the Tailwind `darkMode: 'class'` contract by toggling `dark` on\n * `document.documentElement`, and sets `color-scheme` so native UI (date\n * pickers, scrollbars, form controls) matches the app theme — class-based\n * dark mode alone does not restyle browser chrome.\n *\n * @example\n * ```ts\n * // app.config.ts\n * import { inject, provideAppInitializer } from '@angular/core';\n * import { ThemeService } from '@africanies/africanies-theme';\n *\n * export const appConfig = {\n * providers: [\n * provideAppInitializer(() => {\n * inject(ThemeService); // applies stored / system theme once\n * }),\n * ],\n * };\n *\n * // In a component\n * const theme = inject(ThemeService);\n * theme.toggle();\n * theme.setTheme('dark');\n * const current = theme.theme(); // 'light' | 'dark'\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly storage = inject(STORAGE_TOKEN);\n private readonly document = inject(DOCUMENT);\n\n /**\n * Current theme. Prefer reading via `theme()` in templates / computed values\n * rather than caching the string, so dark-class consumers stay in sync.\n */\n readonly theme = signal<Theme>(this.resolveInitialTheme());\n\n constructor() {\n this.applyToDocument(this.theme());\n }\n\n /**\n * Sets and persists the theme, updating the `dark` class and `color-scheme`\n * on `<html>`.\n *\n * @param theme - Absolute preference to store.\n */\n setTheme(theme: Theme): void {\n this.theme.set(theme);\n this.applyToDocument(theme);\n try {\n this.storage.set(AFRICANIES_THEME_KEY, theme);\n } catch {\n // Persistence failure must not block the in-session visual toggle —\n // private browsing / quota issues are transient for theme preference.\n }\n }\n\n /**\n * Flips between light and dark.\n *\n * @returns The theme after the toggle.\n */\n toggle(): Theme {\n const next: Theme = this.theme() === 'light' ? 'dark' : 'light';\n this.setTheme(next);\n return next;\n }\n\n private resolveInitialTheme(): Theme {\n try {\n const stored = this.storage.get<Theme>(AFRICANIES_THEME_KEY);\n if (stored === 'light' || stored === 'dark') {\n return stored;\n }\n } catch {\n // Fall through to system preference when storage is unavailable.\n }\n return this.prefersDark() ? 'dark' : 'light';\n }\n\n private prefersDark(): boolean {\n const win = this.document.defaultView;\n return !!win?.matchMedia?.('(prefers-color-scheme: dark)').matches;\n }\n\n private applyToDocument(theme: Theme): void {\n const root = this.document.documentElement;\n if (theme === 'dark') {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n // Native date/time pickers follow `color-scheme`, not Tailwind's `dark` class.\n root.style.colorScheme = theme;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@africanies/africanies-theme",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^22.0.0",
6
6
  "@angular/core": "^22.0.0",
7
- "@africanies/africanies-core": "^0.0.2",
8
- "@africanies/africanies-storage": "^0.0.1"
7
+ "@africanies/africanies-core": ">=0.0.2 <0.1.0",
8
+ "@africanies/africanies-storage": ">=0.0.1 <0.1.0"
9
9
  },
10
10
  "sideEffects": false,
11
11
  "publishConfig": {
@@ -69,6 +69,11 @@ function africaniesInteractiveCursorPlugin({ addBase }) {
69
69
  * (`white` / `ink-950`) and `-webkit-text-fill-color` keeps body text on
70
70
  * `ink` / white. `.dark` matches `ThemeService` (`class` on `<html>`).
71
71
  *
72
+ * WHY one selector per `addBase` key: joining autofill selectors with commas
73
+ * under a single `.dark ${list}` key only scopes the first selector — the rest
74
+ * leak into light mode. WHY no `color` in the long transition: delaying color
75
+ * freezes text when the user toggles light/dark.
76
+ *
72
77
  * @param {import('tailwindcss/types/config').PluginAPI} api
73
78
  */
74
79
  function africaniesAutofillPlugin({ addBase }) {
@@ -81,21 +86,24 @@ function africaniesAutofillPlugin({ addBase }) {
81
86
  'textarea:-webkit-autofill:hover',
82
87
  'textarea:-webkit-autofill:focus',
83
88
  'textarea:-webkit-autofill:active',
84
- ].join(', ');
89
+ ];
85
90
 
86
- addBase({
87
- [autofillSelectors]: {
91
+ /** @type {Record<string, Record<string, string>>} */
92
+ const rules = {};
93
+ for (const selector of autofillSelectors) {
94
+ rules[selector] = {
88
95
  WebkitTextFillColor: '#212529',
89
96
  caretColor: '#212529',
90
97
  boxShadow: '0 0 0 1000px #ffffff inset',
91
98
  transition: 'background-color 99999s ease-in-out 0s',
92
- },
93
- [`.dark ${autofillSelectors}`]: {
99
+ };
100
+ rules[`.dark ${selector}`] = {
94
101
  WebkitTextFillColor: '#ffffff',
95
102
  caretColor: '#ffffff',
96
103
  boxShadow: '0 0 0 1000px #272729 inset',
97
- },
98
- });
104
+ };
105
+ }
106
+ addBase(rules);
99
107
  }
100
108
 
101
109
  /**
@@ -13,12 +13,14 @@ import * as i0 from '@angular/core';
13
13
  * SFN (export / green):
14
14
  * text-export bg-export bg-export-subtle bg-export-light border-export
15
15
  * hover:bg-export-light hover:bg-export-subtle dark:bg-export/15 dark:hover:bg-export/15
16
+ * dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]
16
17
  *
17
18
  * STN (import / orange):
18
19
  * text-import bg-import bg-import-subtle bg-import-light border-import
19
20
  * hover:bg-import-light hover:bg-import-subtle dark:bg-import/15 dark:hover:bg-import/15
21
+ * dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]
20
22
  */
21
- declare const MODE_COLOR_SAFELIST: readonly ["text-export", "bg-export", "bg-export-subtle", "bg-export-light", "border-export", "hover:bg-export-light", "hover:bg-export-subtle", "dark:bg-export/15", "dark:hover:bg-export/15", "text-import", "bg-import", "bg-import-subtle", "bg-import-light", "border-import", "hover:bg-import-light", "hover:bg-import-subtle", "dark:bg-import/15", "dark:hover:bg-import/15"];
23
+ declare const MODE_COLOR_SAFELIST: readonly ["text-export", "bg-export", "bg-export-subtle", "bg-export-light", "border-export", "hover:bg-export-light", "hover:bg-export-subtle", "dark:bg-export/15", "dark:hover:bg-export/15", "dark:bg-[color-mix(in_srgb,#1cbd5d_15%,#212529)]", "text-import", "bg-import", "bg-import-subtle", "bg-import-light", "border-import", "hover:bg-import-light", "hover:bg-import-subtle", "dark:bg-import/15", "dark:hover:bg-import/15", "dark:bg-[color-mix(in_srgb,#f08829_15%,#212529)]"];
22
24
 
23
25
  /**
24
26
  * Tailwind class bundle for the active shipping mode (SFN export / STN import).
@@ -47,8 +49,15 @@ interface ModeColorClasses {
47
49
  ghostPrimary: string;
48
50
  /**
49
51
  * Soft highlight for selected / active rows (works in dark mode).
52
+ * Dark uses a translucent tint — fine over solid surfaces, not for
53
+ * sticky overlays (see {@link softSolid}).
50
54
  */
51
55
  soft: string;
56
+ /**
57
+ * Opaque soft fill — same tint as {@link soft}, but dark mode mixes into
58
+ * ink so scrolled content cannot show through (sticky table headers/cells).
59
+ */
60
+ softSolid: string;
52
61
  /**
53
62
  * Soft hover highlight for menus and lists.
54
63
  */
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, Injector, signal, Injectable, makeEnvironmentProviders, provideAppInitializer } from '@angular/core';
3
3
  import { SessionStorageService, AFRICANIES_SHIPPING_MODE_KEY, STORAGE_TOKEN, AFRICANIES_MODE_CONFIG_KEY, provideLocalStorage, AFRICANIES_ACCESS_TOKEN_KEY } from '@africanies/africanies-storage';
4
- import { of, retry, throwError, timer, timeout, map as map$1, tap as tap$1, catchError, finalize, firstValueFrom, forkJoin } from 'rxjs';
4
+ import { of, timeout, throwError, map as map$1, tap as tap$1, catchError, finalize, firstValueFrom, forkJoin } from 'rxjs';
5
5
  import { HttpErrorResponse, HttpContextToken, HttpContext, HttpClient, HttpHeaders, HttpParams, provideHttpClient, withInterceptors } from '@angular/common/http';
6
6
  import { DEFAULT_PAGE_SIZE, NOTIFICATION_PAGE_SIZE } from '@africanies/africanies-models';
7
7
  import { take, tap, map } from 'rxjs/operators';
@@ -687,31 +687,6 @@ class HttpResponseCache {
687
687
  }
688
688
  }
689
689
 
690
- /**
691
- * Whether a failed GET should be retried by {@link ApiClient}.
692
- *
693
- * Retries transient failures only (network blips, timeouts, 408/429, 5xx).
694
- * Auth and other 4xx errors fail fast — retrying 401 does not help and causes
695
- * duplicate requests + toasts.
696
- * @param err
697
- */
698
- function isRetryableGetError(err) {
699
- if (err instanceof HttpErrorResponse) {
700
- if (err.status === 0) {
701
- return true;
702
- }
703
- if (err.status === 408 || err.status === 429) {
704
- return true;
705
- }
706
- if (err.status >= 500) {
707
- return true;
708
- }
709
- return false;
710
- }
711
- // Non-HTTP failures (e.g. timeout operator) may still be transient.
712
- return true;
713
- }
714
-
715
690
  /**
716
691
  * Per-request shipping-mode override for {@link shipmentModeInterceptor}.
717
692
  *
@@ -979,7 +954,8 @@ function mapResourcePayload(id, raw, mapOne, mapMany) {
979
954
  * - HTTP failures rethrown as `Error` whose `.message` is already
980
955
  * user-facing ({@link formatApiErrorMessage}) — consumers do not need to
981
956
  * parse `HttpErrorResponse` bodies
982
- * - Exponential-backoff retry (max 1) for **GET only**
957
+ * - **No automatic retry** fail fast so UIs can show Select / table /
958
+ * error-state Retry instead of a stuck loading spinner
983
959
  * - Optional per-GET TTL cache via `cacheTtlMs`
984
960
  *
985
961
  * @example
@@ -1121,18 +1097,8 @@ class ApiClient {
1121
1097
  req$ = this.http.delete(url, hasBody ? { ...httpOpts, body } : httpOpts);
1122
1098
  break;
1123
1099
  }
1124
- // Retry only idempotent GETs on transient failures never replay 401/404 etc.
1125
- if (method === 'GET') {
1126
- req$ = req$.pipe(retry({
1127
- count: 1,
1128
- delay: (err, retryCount) => {
1129
- if (!isRetryableGetError(err)) {
1130
- return throwError(() => err);
1131
- }
1132
- return timer(2 ** (retryCount - 1) * 1000);
1133
- },
1134
- }));
1135
- }
1100
+ // No automatic GET retry admin shells own Retry via UI
1101
+ // (`africanies-select` showRetry, table error→refreshClick, error-state).
1136
1102
  if (this.config.timeout != null) {
1137
1103
  req$ = req$.pipe(timeout({
1138
1104
  each: this.config.timeout,
@@ -1808,8 +1774,8 @@ function listFetchKind(options) {
1808
1774
  * (no caret/tilde): TanStack marks the Angular adapter experimental and
1809
1775
  * breaking changes land without major bumps.
1810
1776
  *
1811
- * Retry/backoff here mirrors {@link ApiClient}'s GET retry (max 3,
1812
- * exponential) so HTTP-layer and query-layer behavior stay aligned.
1777
+ * Query retries default to **0** to match {@link ApiClient} (fail fast;
1778
+ * screens use manual Retry). Apps can override per `QueryClient` if needed.
1813
1779
  */
1814
1780
  /**
1815
1781
  * Factory for TanStack `QueryClient` `defaultOptions`.
@@ -1859,8 +1825,7 @@ function createAfricaniesQueryClientDefaults() {
1859
1825
  queries: {
1860
1826
  staleTime: 60_000,
1861
1827
  gcTime: 5 * 60_000,
1862
- retry: 3,
1863
- // attemptIndex is 0-based in TanStack; match 1s, 2s, 4s style backoff.
1828
+ retry: 0,
1864
1829
  retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30_000),
1865
1830
  },
1866
1831
  mutations: {
@@ -2725,7 +2690,7 @@ function mapPaymentMethod(raw) {
2725
2690
  deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),
2726
2691
  created_at: asNullableString(record['created_at'] ?? record['createdAt']),
2727
2692
  updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),
2728
- currencies: mapArray(record['currencies'], mapPaymentMethodCurrency),
2693
+ currencies: mapList(record['currencies'], mapPaymentMethodCurrency),
2729
2694
  };
2730
2695
  }
2731
2696
  /**